From fdfe8d1f4112e1b5fbfdda848350b29abfd4959d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Fri, 2 Aug 2024 19:32:38 +0530 Subject: [PATCH 001/147] feat(app): add password auth for settings --- sample.config.toml | 4 ++ src/config.ts | 13 ++++++ src/routes/config.ts | 40 ++++++++++++++++- src/routes/models.ts | 31 +++++++++++-- src/websocket/messageHandler.ts | 77 ++++++++++++++++++--------------- ui/app/library/layout.tsx | 26 ++++++++++- ui/app/library/page.tsx | 2 +- 7 files changed, 152 insertions(+), 41 deletions(-) diff --git a/sample.config.toml b/sample.config.toml index f6c6943..781761a 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -1,6 +1,10 @@ [GENERAL] PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" +CONFIG_PASSWORD = "lorem_ipsum" # Password to access config +DISCOVER_ENABLED = true +LIBRARY_ENABLED = true +COPILOT_ENABLED = true [API_KEYS] OPENAI = "" # OpenAI API key - sk-1234567890abcdef1234567890abcdef diff --git a/src/config.ts b/src/config.ts index 9ebc182..c343d69 100644 --- a/src/config.ts +++ b/src/config.ts @@ -8,6 +8,10 @@ interface Config { GENERAL: { PORT: number; SIMILARITY_MEASURE: string; + CONFIG_PASSWORD: string; + DISCOVER_ENABLED: boolean; + LIBRARY_ENABLED: boolean; + COPILOT_ENABLED: boolean; }; API_KEYS: { OPENAI: string; @@ -34,6 +38,14 @@ export const getPort = () => loadConfig().GENERAL.PORT; export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; +export const getConfigPassword = () => loadConfig().GENERAL.CONFIG_PASSWORD; + +export const isDiscoverEnabled = () => loadConfig().GENERAL.DISCOVER_ENABLED; + +export const isLibraryEnabled = () => loadConfig().GENERAL.LIBRARY_ENABLED; + +export const isCopilotEnabled = () => loadConfig().GENERAL.COPILOT_ENABLED; + export const getOpenaiApiKey = () => loadConfig().API_KEYS.OPENAI; export const getGroqApiKey = () => loadConfig().API_KEYS.GROQ; @@ -53,6 +65,7 @@ export const updateConfig = (config: RecursivePartial) => { if (typeof currentConfig[key] === 'object' && currentConfig[key] !== null) { for (const nestedKey in currentConfig[key]) { if ( + typeof config[key][nestedKey] !== 'boolean' && !config[key][nestedKey] && currentConfig[key][nestedKey] && config[key][nestedKey] !== '' diff --git a/src/routes/config.ts b/src/routes/config.ts index f255560..8993715 100644 --- a/src/routes/config.ts +++ b/src/routes/config.ts @@ -9,11 +9,23 @@ import { getAnthropicApiKey, getOpenaiApiKey, updateConfig, + getConfigPassword, + isLibraryEnabled, + isCopilotEnabled, + isDiscoverEnabled, } from '../config'; const router = express.Router(); -router.get('/', async (_, res) => { +router.get('/', async (req, res) => { + const authHeader = req.headers['authorization']?.split(' ')[1]; + const password = getConfigPassword(); + + if (authHeader !== password) { + res.status(401).json({ message: 'Unauthorized' }); + return; + } + const config = {}; const [chatModelProviders, embeddingModelProviders] = await Promise.all([ @@ -40,14 +52,30 @@ router.get('/', async (_, res) => { config['ollamaApiUrl'] = getOllamaApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); + config['isLibraryEnabled'] = isLibraryEnabled(); + config['isCopilotEnabled'] = isCopilotEnabled(); + config['isDiscoverEnabled'] = isDiscoverEnabled(); res.status(200).json(config); }); router.post('/', async (req, res) => { + const authHeader = req.headers['authorization']?.split(' ')[1]; + const password = getConfigPassword(); + + if (authHeader !== password) { + res.status(401).json({ message: 'Unauthorized' }); + return; + } + const config = req.body; const updatedConfig = { + GENERAL: { + DISCOVER_ENABLED: config.isDiscoverEnabled, + LIBRARY_ENABLED: config.isLibraryEnabled, + COPILOT_ENABLED: config.isCopilotEnabled, + }, API_KEYS: { OPENAI: config.openaiApiKey, GROQ: config.groqApiKey, @@ -63,4 +91,14 @@ router.post('/', async (req, res) => { res.status(200).json({ message: 'Config updated' }); }); +router.get('/preferences', (_, res) => { + const preferences = { + isLibraryEnabled: isLibraryEnabled(), + isCopilotEnabled: isCopilotEnabled(), + isDiscoverEnabled: isDiscoverEnabled(), + }; + + res.status(200).json(preferences); +}); + export default router; diff --git a/src/routes/models.ts b/src/routes/models.ts index 36df25a..17b9629 100644 --- a/src/routes/models.ts +++ b/src/routes/models.ts @@ -9,10 +9,33 @@ const router = express.Router(); router.get('/', async (req, res) => { try { - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); + const [chatModelProvidersRaw, embeddingModelProvidersRaw] = + await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + const chatModelProviders = {}; + + const chatModelProvidersKeys = Object.keys(chatModelProvidersRaw); + chatModelProvidersKeys.forEach((provider) => { + chatModelProviders[provider] = {}; + const models = Object.keys(chatModelProvidersRaw[provider]); + models.forEach((model) => { + chatModelProviders[provider][model] = {}; + }); + }); + + const embeddingModelProviders = {}; + + const embeddingModelProvidersKeys = Object.keys(embeddingModelProvidersRaw); + embeddingModelProvidersKeys.forEach((provider) => { + embeddingModelProviders[provider] = {}; + const models = Object.keys(embeddingModelProvidersRaw[provider]); + models.forEach((model) => { + embeddingModelProviders[provider][model] = {}; + }); + }); res.status(200).json({ chatModelProviders, embeddingModelProviders }); } catch (err) { diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts index 0afda9f..b0b2d4d 100644 --- a/src/websocket/messageHandler.ts +++ b/src/websocket/messageHandler.ts @@ -13,6 +13,7 @@ import db from '../db'; import { chats, messages } from '../db/schema'; import { eq } from 'drizzle-orm'; import crypto from 'crypto'; +import { isLibraryEnabled } from '../config'; type Message = { messageId: string; @@ -46,6 +47,8 @@ const handleEmitterEvents = ( let recievedMessage = ''; let sources = []; + const libraryEnabled = isLibraryEnabled(); + emitter.on('data', (data) => { const parsedData = JSON.parse(data); if (parsedData.type === 'response') { @@ -71,18 +74,20 @@ const handleEmitterEvents = ( emitter.on('end', () => { ws.send(JSON.stringify({ type: 'messageEnd', messageId: messageId })); - db.insert(messages) - .values({ - content: recievedMessage, - chatId: chatId, - messageId: messageId, - role: 'assistant', - metadata: JSON.stringify({ - createdAt: new Date(), - ...(sources && sources.length > 0 && { sources }), - }), - }) - .execute(); + if (libraryEnabled) { + db.insert(messages) + .values({ + content: recievedMessage, + chatId: chatId, + messageId: messageId, + role: 'assistant', + metadata: JSON.stringify({ + createdAt: new Date(), + ...(sources && sources.length > 0 && { sources }), + }), + }) + .execute(); + } }); emitter.on('error', (data) => { const parsedData = JSON.parse(data); @@ -132,6 +137,8 @@ export const handleMessage = async ( if (parsedWSMessage.type === 'message') { const handler = searchHandlers[parsedWSMessage.focusMode]; + const libraryEnabled = isLibraryEnabled(); + if (handler) { const emitter = handler( parsedMessage.content, @@ -142,34 +149,36 @@ export const handleMessage = async ( handleEmitterEvents(emitter, ws, id, parsedMessage.chatId); - const chat = await db.query.chats.findFirst({ - where: eq(chats.id, parsedMessage.chatId), - }); + if (libraryEnabled) { + const chat = await db.query.chats.findFirst({ + where: eq(chats.id, parsedMessage.chatId), + }); + + if (!chat) { + await db + .insert(chats) + .values({ + id: parsedMessage.chatId, + title: parsedMessage.content, + createdAt: new Date().toString(), + focusMode: parsedWSMessage.focusMode, + }) + .execute(); + } - if (!chat) { await db - .insert(chats) + .insert(messages) .values({ - id: parsedMessage.chatId, - title: parsedMessage.content, - createdAt: new Date().toString(), - focusMode: parsedWSMessage.focusMode, + content: parsedMessage.content, + chatId: parsedMessage.chatId, + messageId: id, + role: 'user', + metadata: JSON.stringify({ + createdAt: new Date(), + }), }) .execute(); } - - await db - .insert(messages) - .values({ - content: parsedMessage.content, - chatId: parsedMessage.chatId, - messageId: id, - role: 'user', - metadata: JSON.stringify({ - createdAt: new Date(), - }), - }) - .execute(); } else { ws.send( JSON.stringify({ diff --git a/ui/app/library/layout.tsx b/ui/app/library/layout.tsx index 00d4a3b..d1a1cf6 100644 --- a/ui/app/library/layout.tsx +++ b/ui/app/library/layout.tsx @@ -5,7 +5,31 @@ export const metadata: Metadata = { title: 'Library - Perplexica', }; -const Layout = ({ children }: { children: React.ReactNode }) => { +const Layout = async ({ children }: { children: React.ReactNode }) => { + const res = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/config/preferences`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const data = await res.json(); + + const { isLibraryEnabled } = data; + + if (!isLibraryEnabled) { + return ( +
+

+ Library is disabled +

+
+ ); + } + return
{children}
; }; diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 8294fc1..586765d 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -2,7 +2,7 @@ import DeleteChat from '@/components/DeleteChat'; import { formatTimeDifference } from '@/lib/utils'; -import { BookOpenText, ClockIcon, Delete, ScanEye } from 'lucide-react'; +import { BookOpenText, ClockIcon } from 'lucide-react'; import Link from 'next/link'; import { useEffect, useState } from 'react'; From 5779701b7d3f30649c7babc0df9b21a43d8b4db4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Fri, 2 Aug 2024 19:35:57 +0530 Subject: [PATCH 002/147] feat(sidebar): respect preferences --- ui/components/Sidebar.tsx | 94 +++++++++++++++++++++++++++++++-------- 1 file changed, 75 insertions(+), 19 deletions(-) diff --git a/ui/components/Sidebar.tsx b/ui/components/Sidebar.tsx index cc2097d..546e2fd 100644 --- a/ui/components/Sidebar.tsx +++ b/ui/components/Sidebar.tsx @@ -4,10 +4,16 @@ import { cn } from '@/lib/utils'; import { BookOpenText, Home, Search, SquarePen, Settings } from 'lucide-react'; import Link from 'next/link'; import { useSelectedLayoutSegments } from 'next/navigation'; -import React, { useState, type ReactNode } from 'react'; +import React, { useEffect, useMemo, useState, type ReactNode } from 'react'; import Layout from './Layout'; import SettingsDialog from './SettingsDialog'; +export type Preferences = { + isLibraryEnabled: boolean; + isDiscoverEnabled: boolean; + isCopilotEnabled: boolean; +}; + const VerticalIconContainer = ({ children }: { children: ReactNode }) => { return (
{children}
@@ -18,6 +24,31 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { const segments = useSelectedLayoutSegments(); const [isSettingsOpen, setIsSettingsOpen] = useState(false); + const [preferences, setPreferences] = useState(null); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const fetchPreferences = async () => { + setLoading(true); + + const res = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/config/preferences`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const data = await res.json(); + + setPreferences(data); + setLoading(false); + }; + + fetchPreferences(); + }, []); const navLinks = [ { @@ -25,22 +56,44 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { href: '/', active: segments.length === 0 || segments.includes('c'), label: 'Home', + show: true, }, { icon: Search, href: '/discover', active: segments.includes('discover'), label: 'Discover', + show: preferences?.isDiscoverEnabled, }, { icon: BookOpenText, href: '/library', active: segments.includes('library'), label: 'Library', + show: preferences?.isLibraryEnabled, }, ]; - return ( + return loading ? ( +
+ +
+ ) : (
@@ -48,23 +101,26 @@ const Sidebar = ({ children }: { children: React.ReactNode }) => { - {navLinks.map((link, i) => ( - - - {link.active && ( -
- )} - - ))} + {navLinks.map( + (link, i) => + link.show === true && ( + + + {link.active && ( +
+ )} + + ), + )} Date: Fri, 2 Aug 2024 19:36:39 +0530 Subject: [PATCH 003/147] feat(settings): add preferences --- ui/components/SettingsDialog.tsx | 765 ++++++++++++++++++------------- 1 file changed, 449 insertions(+), 316 deletions(-) diff --git a/ui/components/SettingsDialog.tsx b/ui/components/SettingsDialog.tsx index 171e812..37879e4 100644 --- a/ui/components/SettingsDialog.tsx +++ b/ui/components/SettingsDialog.tsx @@ -1,5 +1,5 @@ import { cn } from '@/lib/utils'; -import { Dialog, Transition } from '@headlessui/react'; +import { Dialog, Switch, Transition } from '@headlessui/react'; import { CloudUpload, RefreshCcw, RefreshCw } from 'lucide-react'; import React, { Fragment, @@ -8,6 +8,7 @@ import React, { type SelectHTMLAttributes, } from 'react'; import ThemeSwitcher from './theme/Switcher'; +import { toast } from 'sonner'; interface InputProps extends React.InputHTMLAttributes {} @@ -58,6 +59,9 @@ interface SettingsType { groqApiKey: string; anthropicApiKey: string; ollamaApiUrl: string; + isCopilotEnabled: boolean; + isDiscoverEnabled: boolean; + isLibraryEnabled: boolean; } const SettingsDialog = ({ @@ -84,78 +88,91 @@ const SettingsDialog = ({ const [isLoading, setIsLoading] = useState(false); const [isUpdating, setIsUpdating] = useState(false); - useEffect(() => { - if (isOpen) { - const fetchConfig = async () => { - setIsLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { - headers: { - 'Content-Type': 'application/json', - }, - }); + const [password, setPassword] = useState(''); + const [passwordSubmitted, setPasswordSubmitted] = useState(false); + const [isPasswordValid, setIsPasswordValid] = useState(true); - const data = (await res.json()) as SettingsType; - setConfig(data); + const handlePasswordSubmit = async () => { + setIsLoading(true); + setPasswordSubmitted(true); - const chatModelProvidersKeys = Object.keys( - data.chatModelProviders || {}, - ); - const embeddingModelProvidersKeys = Object.keys( - data.embeddingModelProviders || {}, - ); + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${password}`, + }, + }); - const defaultChatModelProvider = - chatModelProvidersKeys.length > 0 ? chatModelProvidersKeys[0] : ''; - const defaultEmbeddingModelProvider = - embeddingModelProvidersKeys.length > 0 - ? embeddingModelProvidersKeys[0] - : ''; - - const chatModelProvider = - localStorage.getItem('chatModelProvider') || - defaultChatModelProvider || - ''; - const chatModel = - localStorage.getItem('chatModel') || - (data.chatModelProviders && - data.chatModelProviders[chatModelProvider]?.[0]) || - ''; - const embeddingModelProvider = - localStorage.getItem('embeddingModelProvider') || - defaultEmbeddingModelProvider || - ''; - const embeddingModel = - localStorage.getItem('embeddingModel') || - (data.embeddingModelProviders && - data.embeddingModelProviders[embeddingModelProvider]?.[0]) || - ''; - - setSelectedChatModelProvider(chatModelProvider); - setSelectedChatModel(chatModel); - setSelectedEmbeddingModelProvider(embeddingModelProvider); - setSelectedEmbeddingModel(embeddingModel); - setCustomOpenAIApiKey(localStorage.getItem('openAIApiKey') || ''); - setCustomOpenAIBaseURL(localStorage.getItem('openAIBaseURL') || ''); - setIsLoading(false); - }; - - fetchConfig(); + if (res.status === 401) { + setIsPasswordValid(false); + setPasswordSubmitted(false); + setIsLoading(false); + return; + } else { + setIsPasswordValid(true); } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isOpen]); + + const data = (await res.json()) as SettingsType; + setConfig(data); + + const chatModelProvidersKeys = Object.keys(data.chatModelProviders || {}); + const embeddingModelProvidersKeys = Object.keys( + data.embeddingModelProviders || {}, + ); + + const defaultChatModelProvider = + chatModelProvidersKeys.length > 0 ? chatModelProvidersKeys[0] : ''; + const defaultEmbeddingModelProvider = + embeddingModelProvidersKeys.length > 0 + ? embeddingModelProvidersKeys[0] + : ''; + + const chatModelProvider = + localStorage.getItem('chatModelProvider') || + defaultChatModelProvider || + ''; + const chatModel = + localStorage.getItem('chatModel') || + (data.chatModelProviders && + data.chatModelProviders[chatModelProvider]?.[0]) || + ''; + const embeddingModelProvider = + localStorage.getItem('embeddingModelProvider') || + defaultEmbeddingModelProvider || + ''; + const embeddingModel = + localStorage.getItem('embeddingModel') || + (data.embeddingModelProviders && + data.embeddingModelProviders[embeddingModelProvider]?.[0]) || + ''; + + setSelectedChatModelProvider(chatModelProvider); + setSelectedChatModel(chatModel); + setSelectedEmbeddingModelProvider(embeddingModelProvider); + setSelectedEmbeddingModel(embeddingModel); + setCustomOpenAIApiKey(localStorage.getItem('openAIApiKey') || ''); + setCustomOpenAIBaseURL(localStorage.getItem('openAIBaseURL') || ''); + setIsLoading(false); + }; const handleSubmit = async () => { setIsUpdating(true); try { - await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { method: 'POST', headers: { 'Content-Type': 'application/json', + Authorization: `Bearer ${password}`, }, body: JSON.stringify(config), }); + if (res.status === 401) { + toast.error('Unauthorized'); + return; + } + localStorage.setItem('chatModelProvider', selectedChatModelProvider!); localStorage.setItem('chatModel', selectedChatModel!); localStorage.setItem( @@ -205,284 +222,400 @@ const SettingsDialog = ({ leaveTo="opacity-0 scale-95" > - - Settings - - {config && !isLoading && ( -
-
-

- Theme -

- -
- {config.chatModelProviders && ( -
-

- Chat model Provider -

- - setSelectedChatModel(e.target.value) - } - options={(() => { - const chatModelProvider = - config.chatModelProviders[ - selectedChatModelProvider - ]; + +
+
+

+ Copilot enabled +

+ { + setConfig({ + ...config, + isCopilotEnabled: checked, + }); + }} + className="bg-light-secondary dark:bg-dark-secondary border border-light-200/70 dark:border-dark-200 relative inline-flex h-5 w-10 sm:h-6 sm:w-11 items-center rounded-full active:scale-95 duration-200 transition cursor-pointer" + > + Copilot + + +
+
+

+ Discover enabled +

+ { + setConfig({ + ...config, + isDiscoverEnabled: checked, + }); + }} + className="bg-light-secondary dark:bg-dark-secondary border border-light-200/70 dark:border-dark-200 relative inline-flex h-5 w-10 sm:h-6 sm:w-11 items-center rounded-full active:scale-95 duration-200 transition cursor-pointer" + > + Discover + + +
+
+

+ Library enabled +

+ { + setConfig({ + ...config, + isLibraryEnabled: checked, + }); + }} + className="bg-light-secondary dark:bg-dark-secondary border border-light-200/70 dark:border-dark-200 relative inline-flex h-5 w-10 sm:h-6 sm:w-11 items-center rounded-full active:scale-95 duration-200 transition cursor-pointer" + > + Library + + +
+ {config.chatModelProviders && ( +
+

+ Chat model Provider +

+ + setSelectedChatModel(e.target.value) + } + options={(() => { + const chatModelProvider = + config.chatModelProviders[ + selectedChatModelProvider + ]; - return chatModelProvider - ? chatModelProvider.length > 0 - ? chatModelProvider.map((model) => ({ - value: model, - label: model, - })) + return chatModelProvider + ? chatModelProvider.length > 0 + ? chatModelProvider.map((model) => ({ + value: model, + label: model, + })) + : [ + { + value: '', + label: 'No models available', + disabled: true, + }, + ] + : [ + { + value: '', + label: + 'Invalid provider, please check backend logs', + disabled: true, + }, + ]; + })()} + /> +
+ )} + {selectedChatModelProvider && + selectedChatModelProvider === 'custom_openai' && ( + <> +
+

+ Model name +

+ + setSelectedChatModel(e.target.value) + } + /> +
+
+

+ Custom OpenAI API Key +

+ + setCustomOpenAIApiKey(e.target.value) + } + /> +
+
+

+ Custom OpenAI Base URL +

+ + setCustomOpenAIBaseURL(e.target.value) + } + /> +
+ + )} + {/* Embedding models */} + {config.embeddingModelProviders && ( +
+

+ Embedding model Provider +

+ + setSelectedEmbeddingModel(e.target.value) + } + options={(() => { + const embeddingModelProvider = + config.embeddingModelProviders[ + selectedEmbeddingModelProvider + ]; + + return embeddingModelProvider + ? embeddingModelProvider.length > 0 + ? embeddingModelProvider.map((model) => ({ + label: model, + value: model, + })) + : [ + { + label: + 'No embedding models available', + value: '', + disabled: true, + }, + ] : [ { + label: + 'Invalid provider, please check backend logs', value: '', - label: 'No models available', disabled: true, }, - ] - : [ - { - value: '', - label: - 'Invalid provider, please check backend logs', - disabled: true, - }, - ]; - })()} + ]; + })()} + /> +
+ )} +
+

+ OpenAI API Key +

+ + setConfig({ + ...config, + openaiApiKey: e.target.value, + }) + } + /> +
+
+

+ Ollama API URL +

+ + setConfig({ + ...config, + ollamaApiUrl: e.target.value, + }) + } + /> +
+
+

+ GROQ API Key +

+ + setConfig({ + ...config, + groqApiKey: e.target.value, + }) + } + /> +
+
+

+ Anthropic API Key +

+ + setConfig({ + ...config, + anthropicApiKey: e.target.value, + }) + } />
- )} - {selectedChatModelProvider && - selectedChatModelProvider === 'custom_openai' && ( - <> -
-

- Model name -

- - setSelectedChatModel(e.target.value) - } - /> -
-
-

- Custom OpenAI API Key -

- - setCustomOpenAIApiKey(e.target.value) - } - /> -
-
-

- Custom OpenAI Base URL -

- - setCustomOpenAIBaseURL(e.target.value) - } - /> -
- - )} - {/* Embedding models */} - {config.embeddingModelProviders && ( -
-

- Embedding model Provider -

- - setSelectedEmbeddingModel(e.target.value) - } - options={(() => { - const embeddingModelProvider = - config.embeddingModelProviders[ - selectedEmbeddingModelProvider - ]; - - return embeddingModelProvider - ? embeddingModelProvider.length > 0 - ? embeddingModelProvider.map((model) => ({ - label: model, - value: model, - })) - : [ - { - label: 'No embedding models available', - value: '', - disabled: true, - }, - ] - : [ - { - label: - 'Invalid provider, please check backend logs', - value: '', - disabled: true, - }, - ]; - })()} - /> + {isLoading && ( +
+
)} -
-

- OpenAI API Key +

+

+ We'll refresh the page after updating the settings.

- - setConfig({ - ...config, - openaiApiKey: e.target.value, - }) - } - /> +
-
-

- Ollama API URL -

- - setConfig({ - ...config, - ollamaApiUrl: e.target.value, - }) - } - /> -
-
-

- GROQ API Key -

- - setConfig({ - ...config, - groqApiKey: e.target.value, - }) - } - /> -
-
-

- Anthropic API Key -

- - setConfig({ - ...config, - anthropicApiKey: e.target.value, - }) - } - /> -
-
+ )} - {isLoading && ( -
- -
- )} -
-

- We'll refresh the page after updating the settings. -

- -
+ + + )}
From a88104434d0b9adc859dd92f09a3b6a80f28aa21 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Fri, 2 Aug 2024 19:36:50 +0530 Subject: [PATCH 004/147] feat(copilot): respect preferences --- ui/components/MessageInputActions/Copilot.tsx | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ui/components/MessageInputActions/Copilot.tsx b/ui/components/MessageInputActions/Copilot.tsx index 5a3e476..63f0607 100644 --- a/ui/components/MessageInputActions/Copilot.tsx +++ b/ui/components/MessageInputActions/Copilot.tsx @@ -1,5 +1,6 @@ import { cn } from '@/lib/utils'; import { Switch } from '@headlessui/react'; +import { useEffect } from 'react'; const CopilotToggle = ({ copilotEnabled, @@ -8,11 +9,33 @@ const CopilotToggle = ({ copilotEnabled: boolean; setCopilotEnabled: (enabled: boolean) => void; }) => { + const fetchAndSetCopilotEnabled = async () => { + const res = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/config/preferences`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const preferences = await res.json(); + + setCopilotEnabled(preferences.isCopilotEnabled); + }; + + useEffect(() => { + fetchAndSetCopilotEnabled(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + return (
Copilot From 639fbd7a15b28654e61309a9f0dc9993b2000fad Mon Sep 17 00:00:00 2001 From: ItzCrazyKns Date: Fri, 2 Aug 2024 19:37:20 +0530 Subject: [PATCH 005/147] feat(chat-window): lint & beautify --- ui/components/ChatWindow.tsx | 85 ++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 48 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index ea9a93d..5e6d382 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -38,53 +38,54 @@ const useSocket = ( 'embeddingModelProvider', ); + const providers = await fetch( + `${process.env.NEXT_PUBLIC_API_URL}/models`, + { + headers: { + 'Content-Type': 'application/json', + }, + }, + ).then(async (res) => await res.json()); + if ( !chatModel || !chatModelProvider || !embeddingModel || !embeddingModelProvider ) { - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'application/json', - }, - }, - ).then(async (res) => await res.json()); + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; - const chatModelProviders = providers.chatModelProviders; + chatModelProvider = Object.keys(chatModelProviders)[0]; - chatModelProvider = Object.keys(chatModelProviders)[0]; - - if (chatModelProvider === 'custom_openai') { - toast.error( - 'Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL', - ); - setError(true); - return; - } else { - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) - return toast.error('No chat models available'); + if (chatModelProvider === 'custom_openai') { + toast.error('Seems like you are using the custom OpenAI provider, please open the settings and configure the API key and base URL'); + setError(true); + return; + } else { + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + if ( + !chatModelProviders || + Object.keys(chatModelProviders).length === 0 + ) + return toast.error('No chat models available'); + } } - const embeddingModelProviders = providers.embeddingModelProviders; + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); + if ( + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + } localStorage.setItem('chatModel', chatModel!); localStorage.setItem('chatModelProvider', chatModelProvider); @@ -94,15 +95,6 @@ const useSocket = ( embeddingModelProvider, ); } else { - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'app lication/json', - }, - }, - ).then(async (res) => await res.json()); - const chatModelProviders = providers.chatModelProviders; const embeddingModelProviders = providers.embeddingModelProviders; @@ -171,8 +163,6 @@ const useSocket = ( const timeoutId = setTimeout(() => { if (ws.readyState !== 1) { - ws.close(); - setError(true); toast.error( 'Failed to connect to the server. Please try again later.', ); @@ -182,7 +172,6 @@ const useSocket = ( ws.onopen = () => { console.log('[DEBUG] open'); clearTimeout(timeoutId); - setError(false); setIsWSReady(true); }; @@ -203,7 +192,7 @@ const useSocket = ( if (data.type === 'error') { toast.error(data.data); } - }); + }) setWs(ws); }; From 8aaee2c40ca8d4f983c2cc15e668b0a64d95b0d6 Mon Sep 17 00:00:00 2001 From: wellCh4n Date: Sat, 15 Feb 2025 16:48:21 +0800 Subject: [PATCH 006/147] feat(app): support complex title --- src/utils/documents.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/documents.ts b/src/utils/documents.ts index 5cd0366..3656689 100644 --- a/src/utils/documents.ts +++ b/src/utils/documents.ts @@ -65,7 +65,7 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splittedText = await splitter.splitText(parsedText); const title = res.data .toString('utf8') - .match(/(.*?)<\/title>/)?.[1]; + .match(/<title.*>(.*?)<\/title>/)?.[1]; const linkDocs = splittedText.map((text) => { return new Document({ From d95849e538b978e7487bf2ae626bd7a631514b7b Mon Sep 17 00:00:00 2001 From: AnotiaWang <anotia0202@gmail.com> Date: Fri, 7 Mar 2025 23:54:53 +0800 Subject: [PATCH 007/147] fix: missing `MODEL_NAME` in config sample --- sample.config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/sample.config.toml b/sample.config.toml index 356c50a..9e3a06f 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -22,6 +22,7 @@ API_KEY = "" [MODELS.CUSTOM_OPENAI] API_KEY = "" API_URL = "" +MODEL_NAME = "" [MODELS.OLLAMA] API_URL = "" # Ollama API URL - http://host.docker.internal:11434 From e6b87f89ec478a74911ffde0d5c5f02e43c01cdb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 8 Mar 2025 20:08:27 +0530 Subject: [PATCH 008/147] feat(sample-config): add custom openai model name --- sample.config.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/sample.config.toml b/sample.config.toml index 7b09d67..cddb19d 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -18,6 +18,7 @@ API_KEY = "" [MODELS.CUSTOM_OPENAI] API_KEY = "" API_URL = "" +MODEL_NAME = "" [MODELS.OLLAMA] API_URL = "" # Ollama API URL - http://host.docker.internal:11434 From 060c68a90079317256b9f17a6a51a5997c6dfa2c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:05:07 +0530 Subject: [PATCH 009/147] feat(message-box): lint & beautify --- ui/components/MessageBox.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index a7942d1..61f4f05 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -68,7 +68,13 @@ const MessageBox = ({ return ( <div> {message.role === 'user' && ( - <div className={cn('w-full', messageIndex === 0 ? 'pt-16' : 'pt-8', 'break-words')}> + <div + className={cn( + 'w-full', + messageIndex === 0 ? 'pt-16' : 'pt-8', + 'break-words', + )} + > <h2 className="text-black dark:text-white font-medium text-3xl lg:w-9/12"> {message.content} </h2> From 9a2c4fe3b68a4165acbaa35645e93a7eb820e83f Mon Sep 17 00:00:00 2001 From: sjiampojamarn <18257803+sjiampojamarn@users.noreply.github.com> Date: Sun, 16 Mar 2025 09:23:22 -0700 Subject: [PATCH 010/147] Only set scrollIntoView for user msg. --- ui/components/Chat.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/Chat.tsx b/ui/components/Chat.tsx index 81aa32f..0cf125b 100644 --- a/ui/components/Chat.tsx +++ b/ui/components/Chat.tsx @@ -48,11 +48,17 @@ const Chat = ({ }); useEffect(() => { - messageEnd.current?.scrollIntoView({ behavior: 'smooth' }); + const scroll = () => { + messageEnd.current?.scrollIntoView({ behavior: 'smooth' }); + }; if (messages.length === 1) { document.title = `${messages[0].content.substring(0, 30)} - Perplexica`; } + + if (messages[messages.length - 1]?.role == 'user') { + scroll(); + } }, [messages]); return ( From 6b5bd9d79bd5e875a51b9aa392901a2f14c1d959 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:23:21 +0530 Subject: [PATCH 011/147] feat(prompts): move to UI --- ui/lib/prompts/academicSearch.ts | 65 ++++++++++++++++++ ui/lib/prompts/index.ts | 32 +++++++++ ui/lib/prompts/redditSearch.ts | 65 ++++++++++++++++++ ui/lib/prompts/webSearch.ts | 106 +++++++++++++++++++++++++++++ ui/lib/prompts/wolframAlpha.ts | 65 ++++++++++++++++++ ui/lib/prompts/writingAssistant.ts | 13 ++++ ui/lib/prompts/youtubeSearch.ts | 65 ++++++++++++++++++ 7 files changed, 411 insertions(+) create mode 100644 ui/lib/prompts/academicSearch.ts create mode 100644 ui/lib/prompts/index.ts create mode 100644 ui/lib/prompts/redditSearch.ts create mode 100644 ui/lib/prompts/webSearch.ts create mode 100644 ui/lib/prompts/wolframAlpha.ts create mode 100644 ui/lib/prompts/writingAssistant.ts create mode 100644 ui/lib/prompts/youtubeSearch.ts diff --git a/ui/lib/prompts/academicSearch.ts b/ui/lib/prompts/academicSearch.ts new file mode 100644 index 0000000..c2946ff --- /dev/null +++ b/ui/lib/prompts/academicSearch.ts @@ -0,0 +1,65 @@ +export const academicSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does stable diffusion work? +Rephrased: Stable diffusion working + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const academicSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/index.ts b/ui/lib/prompts/index.ts new file mode 100644 index 0000000..f479185 --- /dev/null +++ b/ui/lib/prompts/index.ts @@ -0,0 +1,32 @@ +import { + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, +} from './academicSearch'; +import { + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, +} from './redditSearch'; +import { webSearchResponsePrompt, webSearchRetrieverPrompt } from './webSearch'; +import { + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, +} from './wolframAlpha'; +import { writingAssistantPrompt } from './writingAssistant'; +import { + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +} from './youtubeSearch'; + +export default { + webSearchResponsePrompt, + webSearchRetrieverPrompt, + academicSearchResponsePrompt, + academicSearchRetrieverPrompt, + redditSearchResponsePrompt, + redditSearchRetrieverPrompt, + wolframAlphaSearchResponsePrompt, + wolframAlphaSearchRetrieverPrompt, + writingAssistantPrompt, + youtubeSearchResponsePrompt, + youtubeSearchRetrieverPrompt, +}; diff --git a/ui/lib/prompts/redditSearch.ts b/ui/lib/prompts/redditSearch.ts new file mode 100644 index 0000000..fc71957 --- /dev/null +++ b/ui/lib/prompts/redditSearch.ts @@ -0,0 +1,65 @@ +export const redditSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: Which company is most likely to create an AGI +Rephrased: Which company is most likely to create an AGI + +2. Follow up question: Is Earth flat? +Rephrased: Is Earth flat? + +3. Follow up question: Is there life on Mars? +Rephrased: Is there life on Mars? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const redditSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/webSearch.ts b/ui/lib/prompts/webSearch.ts new file mode 100644 index 0000000..d8269c8 --- /dev/null +++ b/ui/lib/prompts/webSearch.ts @@ -0,0 +1,106 @@ +export const webSearchRetrieverPrompt = ` +You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. +If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. +You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. + +There are several examples attached for your reference inside the below \`examples\` XML block + +<examples> +1. Follow up question: What is the capital of France +Rephrased question:\` +<question> +Capital of france +</question> +\` + +2. Hi, how are you? +Rephrased question\` +<question> +not_needed +</question> +\` + +3. Follow up question: What is Docker? +Rephrased question: \` +<question> +What is Docker +</question> +\` + +4. Follow up question: Can you tell me what is X from https://example.com +Rephrased question: \` +<question> +Can you tell me what is X? +</question> + +<links> +https://example.com +</links> +\` + +5. Follow up question: Summarize the content from https://example.com +Rephrased question: \` +<question> +summarize +</question> + +<links> +https://example.com +</links> +\` +</examples> + +Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. + +<conversation> +{chat_history} +</conversation> + +Follow up question: {query} +Rephrased question: +`; + +export const webSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/wolframAlpha.ts b/ui/lib/prompts/wolframAlpha.ts new file mode 100644 index 0000000..40410c1 --- /dev/null +++ b/ui/lib/prompts/wolframAlpha.ts @@ -0,0 +1,65 @@ +export const wolframAlphaSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: What is the atomic radius of S? +Rephrased: Atomic radius of S + +2. Follow up question: What is linear algebra? +Rephrased: Linear algebra + +3. Follow up question: What is the third law of thermodynamics? +Rephrased: Third law of thermodynamics + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const wolframAlphaSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; diff --git a/ui/lib/prompts/writingAssistant.ts b/ui/lib/prompts/writingAssistant.ts new file mode 100644 index 0000000..f56bf47 --- /dev/null +++ b/ui/lib/prompts/writingAssistant.ts @@ -0,0 +1,13 @@ +export const writingAssistantPrompt = ` +You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. +Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. +You will be shared a context that can contain information from files user has uploaded to get answers from. You will have to generate answers upon that. + +You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. +Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. +However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. + +<context> +{context} +</context> +`; diff --git a/ui/lib/prompts/youtubeSearch.ts b/ui/lib/prompts/youtubeSearch.ts new file mode 100644 index 0000000..5805b54 --- /dev/null +++ b/ui/lib/prompts/youtubeSearch.ts @@ -0,0 +1,65 @@ +export const youtubeSearchRetrieverPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. +If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. + +Example: +1. Follow up question: How does an A.C work? +Rephrased: A.C working + +2. Follow up question: Linear algebra explanation video +Rephrased: What is linear algebra? + +3. Follow up question: What is theory of relativity? +Rephrased: What is theory of relativity? + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +export const youtubeSearchResponsePrompt = ` + You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. + + Your task is to provide answers that are: + - **Informative and relevant**: Thoroughly address the user's query using the given context. + - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. + - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. + - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. + - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. + + ### Formatting Instructions + - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. + - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. + - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. + - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. + - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. + - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. + + ### Citation Requirements + - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. + - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." + - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. + - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." + - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. + - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. + + ### Special Instructions + - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. + - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. + - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip + + ### Example Output + - Begin with a brief introduction summarizing the event or query topic. + - Follow with detailed sections under clear headings, covering all aspects of the query if possible. + - Provide explanations or historical context as needed to enhance understanding. + - End with a conclusion or overall perspective if relevant. + + <context> + {context} + </context> + + Current date & time in ISO format (UTC timezone) is: {date}. +`; From 5c313e9bed47b7ee7fe7576780b1c71ac0507f44 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:23:59 +0530 Subject: [PATCH 012/147] feat(ui): update packages, add config, add searxng --- ui/lib/config.ts | 117 ++++++++ ui/lib/searxng.ts | 48 ++++ ui/next.config.mjs | 1 + ui/package.json | 11 +- ui/tsconfig.json | 24 +- ui/yarn.lock | 693 +++++++++++++++++++++++++++++++++++++++------ 6 files changed, 809 insertions(+), 85 deletions(-) create mode 100644 ui/lib/config.ts create mode 100644 ui/lib/searxng.ts diff --git a/ui/lib/config.ts b/ui/lib/config.ts new file mode 100644 index 0000000..1e5148d --- /dev/null +++ b/ui/lib/config.ts @@ -0,0 +1,117 @@ +import fs from 'fs'; +import path from 'path'; +import toml from '@iarna/toml'; + +const configFileName = 'config.toml'; + +interface Config { + GENERAL: { + PORT: number; + SIMILARITY_MEASURE: string; + KEEP_ALIVE: string; + }; + MODELS: { + OPENAI: { + API_KEY: string; + }; + GROQ: { + API_KEY: string; + }; + ANTHROPIC: { + API_KEY: string; + }; + GEMINI: { + API_KEY: string; + }; + OLLAMA: { + API_URL: string; + }; + CUSTOM_OPENAI: { + API_URL: string; + API_KEY: string; + MODEL_NAME: string; + }; + }; + API_ENDPOINTS: { + SEARXNG: string; + }; +} + +type RecursivePartial<T> = { + [P in keyof T]?: RecursivePartial<T[P]>; +}; + +const loadConfig = () => + toml.parse( + fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), + ) as any as Config; + +export const getPort = () => loadConfig().GENERAL.PORT; + +export const getSimilarityMeasure = () => + loadConfig().GENERAL.SIMILARITY_MEASURE; + +export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; + +export const getOpenaiApiKey = () => loadConfig().MODELS.OPENAI.API_KEY; + +export const getGroqApiKey = () => loadConfig().MODELS.GROQ.API_KEY; + +export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; + +export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; + +export const getSearxngApiEndpoint = () => + process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; + +export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; + +export const getCustomOpenaiApiKey = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; + +export const getCustomOpenaiApiUrl = () => + loadConfig().MODELS.CUSTOM_OPENAI.API_URL; + +export const getCustomOpenaiModelName = () => + loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; + +const mergeConfigs = (current: any, update: any): any => { + if (update === null || update === undefined) { + return current; + } + + if (typeof current !== 'object' || current === null) { + return update; + } + + const result = { ...current }; + + for (const key in update) { + if (Object.prototype.hasOwnProperty.call(update, key)) { + const updateValue = update[key]; + + if ( + typeof updateValue === 'object' && + updateValue !== null && + typeof result[key] === 'object' && + result[key] !== null + ) { + result[key] = mergeConfigs(result[key], updateValue); + } else if (updateValue !== undefined) { + result[key] = updateValue; + } + } + } + + return result; +}; + +export const updateConfig = (config: RecursivePartial<Config>) => { + const currentConfig = loadConfig(); + const mergedConfig = mergeConfigs(currentConfig, config); + + fs.writeFileSync( + path.join(__dirname, `../${configFileName}`), + toml.stringify(mergedConfig), + ); +}; \ No newline at end of file diff --git a/ui/lib/searxng.ts b/ui/lib/searxng.ts new file mode 100644 index 0000000..ae19db2 --- /dev/null +++ b/ui/lib/searxng.ts @@ -0,0 +1,48 @@ +import axios from 'axios'; +import { getSearxngApiEndpoint } from './config'; + +interface SearxngSearchOptions { + categories?: string[]; + engines?: string[]; + language?: string; + pageno?: number; +} + +interface SearxngSearchResult { + title: string; + url: string; + img_src?: string; + thumbnail_src?: string; + thumbnail?: string; + content?: string; + author?: string; + iframe_src?: string; +} + +export const searchSearxng = async ( + query: string, + opts?: SearxngSearchOptions, +) => { + const searxngURL = getSearxngApiEndpoint(); + + const url = new URL(`${searxngURL}/search?format=json`); + url.searchParams.append('q', query); + + if (opts) { + Object.keys(opts).forEach((key) => { + const value = opts[key as keyof SearxngSearchOptions]; + if (Array.isArray(value)) { + url.searchParams.append(key, value.join(',')); + return; + } + url.searchParams.append(key, value as string); + }); + } + + const res = await axios.get(url.toString()); + + const results: SearxngSearchResult[] = res.data.results; + const suggestions: string[] = res.data.suggestions; + + return { results, suggestions }; +}; diff --git a/ui/next.config.mjs b/ui/next.config.mjs index c3f2e1a..a5db257 100644 --- a/ui/next.config.mjs +++ b/ui/next.config.mjs @@ -7,6 +7,7 @@ const nextConfig = { }, ], }, + serverExternalPackages: ['pdf-parse'] }; export default nextConfig; diff --git a/ui/package.json b/ui/package.json index e299391..c9a7a94 100644 --- a/ui/package.json +++ b/ui/package.json @@ -12,26 +12,35 @@ }, "dependencies": { "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^9.4.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", + "axios": "^1.8.3", "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "html-to-text": "^9.0.5", "langchain": "^0.1.30", "lucide-react": "^0.363.0", "markdown-to-jsx": "^7.7.2", - "next": "14.1.4", + "next": "^15.2.2", "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", "react": "^18", "react-dom": "^18", "react-text-to-speech": "^0.14.5", "react-textarea-autosize": "^8.5.3", "sonner": "^1.4.41", "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", "yet-another-react-lightbox": "^3.17.2", "zod": "^3.22.4" }, "devDependencies": { + "@types/html-to-text": "^9.0.4", "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", diff --git a/ui/tsconfig.json b/ui/tsconfig.json index e7ff90f..d81d4ee 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -18,9 +22,19 @@ } ], "paths": { - "@/*": ["./*"] - } + "@/*": [ + "./*" + ] + }, + "target": "ES2017" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } diff --git a/ui/yarn.lock b/ui/yarn.lock index 7eb109f..427693e 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -34,6 +34,27 @@ dependencies: regenerator-runtime "^0.14.0" +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -131,11 +152,129 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@iarna/toml@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" + integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== + "@icons-pack/react-simple-icons@^9.4.0": version "9.4.0" resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-9.4.0.tgz#37871d830f9ec9cfa1d1aab186036df2ab075f26" integrity sha512-fZtC4Zv53hE+IQE2dJlFt3EB6UOifwTrUNMuEu4hSXemtqMahd05Dpvj2K0j2ewVc+j/ibavud3xjfaMB2Nj7g== +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -233,10 +372,10 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@next/env@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.1.4.tgz#432e80651733fbd67230bf262aee28be65252674" - integrity sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ== +"@next/env@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" + integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== "@next/eslint-plugin-next@14.1.4": version "14.1.4" @@ -245,50 +384,45 @@ dependencies: glob "10.3.10" -"@next/swc-darwin-arm64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz#a3bca0dc4393ac4cf3169bbf24df63441de66bb7" - integrity sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg== +"@next/swc-darwin-arm64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" + integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== -"@next/swc-darwin-x64@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz#ba3683d4e2d30099f3f2864dd7349a4d9f440140" - integrity sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ== +"@next/swc-darwin-x64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" + integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== -"@next/swc-linux-arm64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz#3519969293f16379954b7e196deb0c1eecbb2f8b" - integrity sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA== +"@next/swc-linux-arm64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" + integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== -"@next/swc-linux-arm64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz#4bb3196bd402b3f84cf5373ff1021f547264d62f" - integrity sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g== +"@next/swc-linux-arm64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" + integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== -"@next/swc-linux-x64-gnu@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz#1b3372c98c83dcdab946cdb4ee06e068b8139ba3" - integrity sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw== +"@next/swc-linux-x64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" + integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== -"@next/swc-linux-x64-musl@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz#8459088bdc872648ff78f121db596f2533df5808" - integrity sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg== +"@next/swc-linux-x64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" + integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== -"@next/swc-win32-arm64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz#84280a08c00cc3be24ddd3a12f4617b108e6dea6" - integrity sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag== +"@next/swc-win32-arm64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" + integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== -"@next/swc-win32-ia32-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz#23ff7f4bd0a27177428669ef6fa5c3923c738031" - integrity sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw== - -"@next/swc-win32-x64-msvc@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz#bccf5beccfde66d6c66fa4e2509118c796385eda" - integrity sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w== +"@next/swc-win32-x64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" + integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -372,14 +506,20 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== +"@selderee/plugin-htmlparser2@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" + integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== dependencies: - tslib "^2.4.0" + domhandler "^5.0.3" + selderee "^0.11.0" -"@swc/helpers@^0.5.0": +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": version "0.5.15" resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== @@ -408,6 +548,11 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== +"@types/html-to-text@^9.0.4": + version "9.0.4" + resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" + integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -435,6 +580,11 @@ dependencies: undici-types "~5.26.4" +"@types/pdf-parse@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" + integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== + "@types/prop-types@*": version "15.7.12" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" @@ -460,6 +610,11 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" @@ -716,6 +871,11 @@ ast-types-flow@^0.0.8: resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== +async@^3.2.3: + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -745,6 +905,15 @@ axe-core@=4.7.0: resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axios@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -842,7 +1011,12 @@ camelcase@6: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: +caniuse-lite@^1.0.30001579: + version "1.0.30001705" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" + integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== + +caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001606" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== @@ -890,6 +1064,13 @@ clsx@^2.1.0: resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== +color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -897,11 +1078,48 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.6.0, color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -919,6 +1137,32 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +compute-cosine-similarity@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" + integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== + dependencies: + compute-dot "^1.1.0" + compute-l2norm "^1.1.0" + validate.io-array "^1.0.5" + validate.io-function "^1.0.2" + +compute-dot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" + integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + +compute-l2norm@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" + integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== + dependencies: + validate.io-array "^1.0.3" + validate.io-function "^1.0.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -980,7 +1224,7 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@^3.2.7: +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -1004,6 +1248,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +deepmerge@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" @@ -1032,6 +1281,11 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== +detect-libc@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" + integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== + didyoumean@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" @@ -1071,6 +1325,36 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -1091,6 +1375,11 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + enhanced-resolve@^5.12.0: version "5.16.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" @@ -1099,6 +1388,11 @@ enhanced-resolve@^5.12.0: graceful-fs "^4.2.4" tapable "^2.2.0" +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -1481,6 +1775,11 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -1522,6 +1821,16 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + for-each@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" @@ -1702,7 +2011,7 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -graceful-fs@^4.2.11, graceful-fs@^4.2.4: +graceful-fs@^4.2.4: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== @@ -1753,6 +2062,27 @@ hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: dependencies: function-bind "^1.1.2" +html-to-text@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" + integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== + dependencies: + "@selderee/plugin-htmlparser2" "^0.11.0" + deepmerge "^4.3.1" + dom-serializer "^2.0.0" + htmlparser2 "^8.0.2" + selderee "^0.11.0" + +htmlparser2@^8.0.2: + version "8.0.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" + integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + entities "^4.4.0" + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -1786,7 +2116,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1813,6 +2143,11 @@ is-array-buffer@^3.0.4: call-bind "^1.0.2" get-intrinsic "^1.2.1" +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -1951,6 +2286,11 @@ is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: dependencies: call-bind "^1.0.7" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" @@ -2090,6 +2430,11 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + langchain@^0.1.30: version "0.1.31" resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" @@ -2141,6 +2486,11 @@ language-tags@^1.0.9: dependencies: language-subtag-registry "^0.3.20" +leac@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" + integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== + levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -2186,6 +2536,18 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -2335,7 +2697,12 @@ mz@^2.7.0: object-assign "^4.0.1" thenify-all "^1.0.0" -nanoid@^3.3.6, nanoid@^3.3.7: +nanoid@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" + integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== + +nanoid@^3.3.7: version "3.3.7" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== @@ -2350,34 +2717,39 @@ next-themes@^0.3.0: resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== -next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/next/-/next-14.1.4.tgz#203310f7310578563fd5c961f0db4729ce7a502d" - integrity sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ== +next@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" + integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== dependencies: - "@next/env" "14.1.4" - "@swc/helpers" "0.5.2" + "@next/env" "15.2.2" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" busboy "1.6.0" caniuse-lite "^1.0.30001579" - graceful-fs "^4.2.11" postcss "8.4.31" - styled-jsx "5.1.1" + styled-jsx "5.1.6" optionalDependencies: - "@next/swc-darwin-arm64" "14.1.4" - "@next/swc-darwin-x64" "14.1.4" - "@next/swc-linux-arm64-gnu" "14.1.4" - "@next/swc-linux-arm64-musl" "14.1.4" - "@next/swc-linux-x64-gnu" "14.1.4" - "@next/swc-linux-x64-musl" "14.1.4" - "@next/swc-win32-arm64-msvc" "14.1.4" - "@next/swc-win32-ia32-msvc" "14.1.4" - "@next/swc-win32-x64-msvc" "14.1.4" + "@next/swc-darwin-arm64" "15.2.2" + "@next/swc-darwin-x64" "15.2.2" + "@next/swc-linux-arm64-gnu" "15.2.2" + "@next/swc-linux-arm64-musl" "15.2.2" + "@next/swc-linux-x64-gnu" "15.2.2" + "@next/swc-linux-x64-musl" "15.2.2" + "@next/swc-win32-arm64-msvc" "15.2.2" + "@next/swc-win32-x64-msvc" "15.2.2" + sharp "^0.33.5" node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== +node-ensure@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" + integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== + node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" @@ -2488,6 +2860,13 @@ once@^1.3.0: dependencies: wrappy "1" +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + openai@^4.26.0, openai@^4.32.1: version "4.33.0" resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" @@ -2568,6 +2947,14 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parseley@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" + integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== + dependencies: + leac "^0.6.0" + peberminta "^0.9.0" + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" @@ -2601,10 +2988,23 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pdf-parse@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" + integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== + dependencies: + debug "^3.1.0" + node-ensure "^0.0.0" + +peberminta@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" + integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== + picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -2715,6 +3115,11 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -2766,6 +3171,15 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^3.4.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -2863,6 +3277,11 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -2872,6 +3291,11 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" @@ -2879,6 +3303,13 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +selderee@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" + integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== + dependencies: + parseley "^0.12.0" + semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" @@ -2891,6 +3322,11 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" +semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -2913,6 +3349,35 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== + dependencies: + color "^4.2.3" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -2940,6 +3405,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -2950,11 +3422,21 @@ sonner@^1.4.41: resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== -source-map-js@^1.0.2, source-map-js@^1.2.0: +source-map-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -3033,6 +3515,13 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -3064,10 +3553,10 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== dependencies: client-only "0.0.1" @@ -3141,6 +3630,11 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -3172,6 +3666,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + ts-api-utils@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" @@ -3305,7 +3804,7 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -3315,6 +3814,16 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== +validate.io-array@^1.0.3, validate.io-array@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== + +validate.io-function@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" + integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== + web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" @@ -3395,6 +3904,32 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" From e29a08dc46c9ed3374c6dab7706df29329659d2d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:16 +0530 Subject: [PATCH 013/147] feat(ui): add necessary utils --- ui/lib/types/compute-dot.d.ts | 5 ++ ui/lib/utils/computeSimilarity.ts | 17 ++++++ ui/lib/utils/documents.ts | 97 +++++++++++++++++++++++++++++++ ui/lib/utils/formatHistory.ts | 9 +++ ui/lib/utils/logger.ts | 22 +++++++ 5 files changed, 150 insertions(+) create mode 100644 ui/lib/types/compute-dot.d.ts create mode 100644 ui/lib/utils/computeSimilarity.ts create mode 100644 ui/lib/utils/documents.ts create mode 100644 ui/lib/utils/formatHistory.ts create mode 100644 ui/lib/utils/logger.ts diff --git a/ui/lib/types/compute-dot.d.ts b/ui/lib/types/compute-dot.d.ts new file mode 100644 index 0000000..6bcd481 --- /dev/null +++ b/ui/lib/types/compute-dot.d.ts @@ -0,0 +1,5 @@ +declare function computeDot(vectorA: number[], vectorB: number[]): number; + +declare module "compute-dot" { + export default computeDot; +} diff --git a/ui/lib/utils/computeSimilarity.ts b/ui/lib/utils/computeSimilarity.ts new file mode 100644 index 0000000..a635577 --- /dev/null +++ b/ui/lib/utils/computeSimilarity.ts @@ -0,0 +1,17 @@ +import dot from 'compute-dot'; +import cosineSimilarity from 'compute-cosine-similarity'; +import { getSimilarityMeasure } from '../config'; + +const computeSimilarity = (x: number[], y: number[]): number => { + const similarityMeasure = getSimilarityMeasure(); + + if (similarityMeasure === 'cosine') { + return cosineSimilarity(x, y) as number; + } else if (similarityMeasure === 'dot') { + return dot(x, y); + } + + throw new Error('Invalid similarity measure'); +}; + +export default computeSimilarity; diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts new file mode 100644 index 0000000..07b8bef --- /dev/null +++ b/ui/lib/utils/documents.ts @@ -0,0 +1,97 @@ +import axios from 'axios'; +import { htmlToText } from 'html-to-text'; +import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; +import { Document } from '@langchain/core/documents'; +import pdfParse from 'pdf-parse'; +import logger from './logger'; + +export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { + const splitter = new RecursiveCharacterTextSplitter(); + + let docs: Document[] = []; + + await Promise.all( + links.map(async (link) => { + link = + link.startsWith('http://') || link.startsWith('https://') + ? link + : `https://${link}`; + + try { + const res = await axios.get(link, { + responseType: 'arraybuffer', + }); + + const isPdf = res.headers['content-type'] === 'application/pdf'; + + if (isPdf) { + const pdfText = await pdfParse(res.data); + const parsedText = pdfText.text + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = 'PDF Document'; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + return; + } + + const parsedText = htmlToText(res.data.toString('utf8'), { + selectors: [ + { + selector: 'a', + options: { + ignoreHref: true, + }, + }, + ], + }) + .replace(/(\r\n|\n|\r)/gm, ' ') + .replace(/\s+/g, ' ') + .trim(); + + const splittedText = await splitter.splitText(parsedText); + const title = res.data + .toString('utf8') + .match(/<title>(.*?)<\/title>/)?.[1]; + + const linkDocs = splittedText.map((text) => { + return new Document({ + pageContent: text, + metadata: { + title: title || link, + url: link, + }, + }); + }); + + docs.push(...linkDocs); + } catch (err) { + console.error("An error occurred while getting documents from links: ", err); + docs.push( + new Document({ + pageContent: `Failed to retrieve content from the link: ${err}`, + metadata: { + title: 'Failed to retrieve content', + url: link, + }, + }), + ); + } + }), + ); + + return docs; +}; diff --git a/ui/lib/utils/formatHistory.ts b/ui/lib/utils/formatHistory.ts new file mode 100644 index 0000000..6d0d309 --- /dev/null +++ b/ui/lib/utils/formatHistory.ts @@ -0,0 +1,9 @@ +import { BaseMessage } from '@langchain/core/messages'; + +const formatChatHistoryAsString = (history: BaseMessage[]) => { + return history + .map((message) => `${message._getType()}: ${message.content}`) + .join('\n'); +}; + +export default formatChatHistoryAsString; diff --git a/ui/lib/utils/logger.ts b/ui/lib/utils/logger.ts new file mode 100644 index 0000000..1c81eb9 --- /dev/null +++ b/ui/lib/utils/logger.ts @@ -0,0 +1,22 @@ +import winston from 'winston'; + +const logger = winston.createLogger({ + level: 'info', + transports: [ + new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.simple(), + ), + }), + new winston.transports.File({ + filename: 'app.log', + format: winston.format.combine( + winston.format.timestamp(), + winston.format.json(), + ), + }), + ], +}); + +export default logger; From e9e34ddff973268de14ab847e57825afc107be71 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:33 +0530 Subject: [PATCH 014/147] feat(ui): add meta search agent --- ui/lib/outputParsers/lineOutputParser.ts | 48 ++ ui/lib/outputParsers/listLineOutputParser.ts | 50 ++ ui/lib/search/metaSearchAgent.ts | 495 +++++++++++++++++++ 3 files changed, 593 insertions(+) create mode 100644 ui/lib/outputParsers/lineOutputParser.ts create mode 100644 ui/lib/outputParsers/listLineOutputParser.ts create mode 100644 ui/lib/search/metaSearchAgent.ts diff --git a/ui/lib/outputParsers/lineOutputParser.ts b/ui/lib/outputParsers/lineOutputParser.ts new file mode 100644 index 0000000..fcd69ef --- /dev/null +++ b/ui/lib/outputParsers/lineOutputParser.ts @@ -0,0 +1,48 @@ +import { BaseOutputParser } from '@langchain/core/output_parsers'; + +interface LineOutputParserArgs { + key?: string; +} + +class LineOutputParser extends BaseOutputParser<string> { + private key = 'questions'; + + constructor(args?: LineOutputParserArgs) { + super(); + this.key = args?.key ?? this.key; + } + + static lc_name() { + return 'LineOutputParser'; + } + + lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; + + async parse(text: string): Promise<string> { + text = text.trim() || ''; + + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; + const startKeyIndex = text.indexOf(`<${this.key}>`); + const endKeyIndex = text.indexOf(`</${this.key}>`); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return ''; + } + + const questionsStartIndex = + startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; + const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; + const line = text + .slice(questionsStartIndex, questionsEndIndex) + .trim() + .replace(regex, ''); + + return line; + } + + getFormatInstructions(): string { + throw new Error('Not implemented.'); + } +} + +export default LineOutputParser; diff --git a/ui/lib/outputParsers/listLineOutputParser.ts b/ui/lib/outputParsers/listLineOutputParser.ts new file mode 100644 index 0000000..6409db9 --- /dev/null +++ b/ui/lib/outputParsers/listLineOutputParser.ts @@ -0,0 +1,50 @@ +import { BaseOutputParser } from '@langchain/core/output_parsers'; + +interface LineListOutputParserArgs { + key?: string; +} + +class LineListOutputParser extends BaseOutputParser<string[]> { + private key = 'questions'; + + constructor(args?: LineListOutputParserArgs) { + super(); + this.key = args?.key ?? this.key; + } + + static lc_name() { + return 'LineListOutputParser'; + } + + lc_namespace = ['langchain', 'output_parsers', 'line_list_output_parser']; + + async parse(text: string): Promise<string[]> { + text = text.trim() || ''; + + const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; + const startKeyIndex = text.indexOf(`<${this.key}>`); + const endKeyIndex = text.indexOf(`</${this.key}>`); + + if (startKeyIndex === -1 || endKeyIndex === -1) { + return []; + } + + const questionsStartIndex = + startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; + const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; + const lines = text + .slice(questionsStartIndex, questionsEndIndex) + .trim() + .split('\n') + .filter((line) => line.trim() !== '') + .map((line) => line.replace(regex, '')); + + return lines; + } + + getFormatInstructions(): string { + throw new Error('Not implemented.'); + } +} + +export default LineListOutputParser; diff --git a/ui/lib/search/metaSearchAgent.ts b/ui/lib/search/metaSearchAgent.ts new file mode 100644 index 0000000..a878ab8 --- /dev/null +++ b/ui/lib/search/metaSearchAgent.ts @@ -0,0 +1,495 @@ +import { ChatOpenAI } from '@langchain/openai'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; +import { + ChatPromptTemplate, + MessagesPlaceholder, + PromptTemplate, +} from '@langchain/core/prompts'; +import { + RunnableLambda, + RunnableMap, + RunnableSequence, +} from '@langchain/core/runnables'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import LineListOutputParser from '../outputParsers/listLineOutputParser'; +import LineOutputParser from '../outputParsers/lineOutputParser'; +import { getDocumentsFromLinks } from '../utils/documents'; +import { Document } from 'langchain/document'; +import { searchSearxng } from '../searxng'; +import path from 'node:path'; +import fs from 'node:fs'; +import computeSimilarity from '../utils/computeSimilarity'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import eventEmitter from 'events'; +import { StreamEvent } from '@langchain/core/tracers/log_stream'; + +export interface MetaSearchAgentType { + searchAndAnswer: ( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) => Promise<eventEmitter>; +} + +interface Config { + searchWeb: boolean; + rerank: boolean; + summarizer: boolean; + rerankThreshold: number; + queryGeneratorPrompt: string; + responsePrompt: string; + activeEngines: string[]; +} + +type BasicChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +class MetaSearchAgent implements MetaSearchAgentType { + private config: Config; + private strParser = new StringOutputParser(); + + constructor(config: Config) { + this.config = config; + } + + private async createSearchRetrieverChain(llm: BaseChatModel) { + (llm as unknown as ChatOpenAI).temperature = 0; + + return RunnableSequence.from([ + PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt), + llm, + this.strParser, + RunnableLambda.from(async (input: string) => { + const linksOutputParser = new LineListOutputParser({ + key: 'links', + }); + + const questionOutputParser = new LineOutputParser({ + key: 'question', + }); + + const links = await linksOutputParser.parse(input); + let question = this.config.summarizer + ? await questionOutputParser.parse(input) + : input; + + if (question === 'not_needed') { + return { query: '', docs: [] }; + } + + if (links.length > 0) { + if (question.length === 0) { + question = 'summarize'; + } + + let docs: Document[] = []; + + const linkDocs = await getDocumentsFromLinks({ links }); + + const docGroups: Document[] = []; + + linkDocs.map((doc) => { + const URLDocExists = docGroups.find( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (!URLDocExists) { + docGroups.push({ + ...doc, + metadata: { + ...doc.metadata, + totalDocs: 1, + }, + }); + } + + const docIndex = docGroups.findIndex( + (d) => + d.metadata.url === doc.metadata.url && + d.metadata.totalDocs < 10, + ); + + if (docIndex !== -1) { + docGroups[docIndex].pageContent = + docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; + docGroups[docIndex].metadata.totalDocs += 1; + } + }); + + await Promise.all( + docGroups.map(async (doc) => { + const res = await llm.invoke(` + You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the + text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. + If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. + + - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. + - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. + - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. + + The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. + + <example> + 1. \`<text> + Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. + It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications + by using containers. + </text> + + <query> + What is Docker and how does it work? + </query> + + Response: + Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application + deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in + any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. + \` + 2. \`<text> + The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general + relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based + on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by + Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. + General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical + realm, including astronomy. + </text> + + <query> + summarize + </query> + + Response: + The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special + relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its + relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in + 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. + \` + </example> + + Everything below is the actual data you will be working with. Good luck! + + <query> + ${question} + </query> + + <text> + ${doc.pageContent} + </text> + + Make sure to answer the query in the summary. + `); + + const document = new Document({ + pageContent: res.content as string, + metadata: { + title: doc.metadata.title, + url: doc.metadata.url, + }, + }); + + docs.push(document); + }), + ); + + return { query: question, docs: docs }; + } else { + const res = await searchSearxng(question, { + language: 'en', + engines: this.config.activeEngines, + }); + + const documents = res.results.map( + (result) => + new Document({ + pageContent: + result.content || + (this.config.activeEngines.includes('youtube') + ? result.title + : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, + metadata: { + title: result.title, + url: result.url, + ...(result.img_src && { img_src: result.img_src }), + }, + }), + ); + + return { query: question, docs: documents }; + } + }), + ]); + } + + private async createAnsweringChain( + llm: BaseChatModel, + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + return RunnableSequence.from([ + RunnableMap.from({ + query: (input: BasicChainInput) => input.query, + chat_history: (input: BasicChainInput) => input.chat_history, + date: () => new Date().toISOString(), + context: RunnableLambda.from(async (input: BasicChainInput) => { + const processedHistory = formatChatHistoryAsString( + input.chat_history, + ); + + let docs: Document[] | null = null; + let query = input.query; + + if (this.config.searchWeb) { + const searchRetrieverChain = + await this.createSearchRetrieverChain(llm); + + const searchRetrieverResult = await searchRetrieverChain.invoke({ + chat_history: processedHistory, + query, + }); + + query = searchRetrieverResult.query; + docs = searchRetrieverResult.docs; + } + + const sortedDocs = await this.rerankDocs( + query, + docs ?? [], + fileIds, + embeddings, + optimizationMode, + ); + + return sortedDocs; + }) + .withConfig({ + runName: 'FinalSourceRetriever', + }) + .pipe(this.processDocs), + }), + ChatPromptTemplate.fromMessages([ + ['system', this.config.responsePrompt], + new MessagesPlaceholder('chat_history'), + ['user', '{query}'], + ]), + llm, + this.strParser, + ]).withConfig({ + runName: 'FinalResponseGenerator', + }); + } + + private async rerankDocs( + query: string, + docs: Document[], + fileIds: string[], + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + ) { + if (docs.length === 0 && fileIds.length === 0) { + return docs; + } + + const filesData = fileIds + .map((file) => { + const filePath = path.join(process.cwd(), 'uploads', file); + + const contentPath = filePath + '-extracted.json'; + const embeddingsPath = filePath + '-embeddings.json'; + + const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); + const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); + + const fileSimilaritySearchObject = content.contents.map( + (c: string, i: number) => { + return { + fileName: content.title, + content: c, + embeddings: embeddings.embeddings[i], + }; + }, + ); + + return fileSimilaritySearchObject; + }) + .flat(); + + if (query.toLocaleLowerCase() === 'summarize') { + return docs.slice(0, 15); + } + + const docsWithContent = docs.filter( + (doc) => doc.pageContent && doc.pageContent.length > 0, + ); + + if (optimizationMode === 'speed' || this.config.rerank === false) { + if (filesData.length > 0) { + const [queryEmbedding] = await Promise.all([ + embeddings.embedQuery(query), + ]); + + const fileDocs = filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }); + + const similarity = filesData.map((fileData, i) => { + const sim = computeSimilarity(queryEmbedding, fileData.embeddings); + + return { + index: i, + similarity: sim, + }; + }); + + let sortedDocs = similarity + .filter( + (sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3), + ) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => fileDocs[sim.index]); + + sortedDocs = + docsWithContent.length > 0 ? sortedDocs.slice(0, 8) : sortedDocs; + + return [ + ...sortedDocs, + ...docsWithContent.slice(0, 15 - sortedDocs.length), + ]; + } else { + return docsWithContent.slice(0, 15); + } + } else if (optimizationMode === 'balanced') { + const [docEmbeddings, queryEmbedding] = await Promise.all([ + embeddings.embedDocuments( + docsWithContent.map((doc) => doc.pageContent), + ), + embeddings.embedQuery(query), + ]); + + docsWithContent.push( + ...filesData.map((fileData) => { + return new Document({ + pageContent: fileData.content, + metadata: { + title: fileData.fileName, + url: `File`, + }, + }); + }), + ); + + docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); + + const similarity = docEmbeddings.map((docEmbedding, i) => { + const sim = computeSimilarity(queryEmbedding, docEmbedding); + + return { + index: i, + similarity: sim, + }; + }); + + const sortedDocs = similarity + .filter((sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3)) + .sort((a, b) => b.similarity - a.similarity) + .slice(0, 15) + .map((sim) => docsWithContent[sim.index]); + + return sortedDocs; + } + + return [] + } + + private processDocs(docs: Document[]) { + return docs + .map( + (_, index) => + `${index + 1}. ${docs[index].metadata.title} ${docs[index].pageContent}`, + ) + .join('\n'); + } + + private async handleStream( + stream: AsyncGenerator<StreamEvent, any, any>, + emitter: eventEmitter, + ) { + for await (const event of stream) { + if ( + event.event === 'on_chain_end' && + event.name === 'FinalSourceRetriever' + ) { + ``; + emitter.emit( + 'data', + JSON.stringify({ type: 'sources', data: event.data.output }), + ); + } + if ( + event.event === 'on_chain_stream' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit( + 'data', + JSON.stringify({ type: 'response', data: event.data.chunk }), + ); + } + if ( + event.event === 'on_chain_end' && + event.name === 'FinalResponseGenerator' + ) { + emitter.emit('end'); + } + } + } + + async searchAndAnswer( + message: string, + history: BaseMessage[], + llm: BaseChatModel, + embeddings: Embeddings, + optimizationMode: 'speed' | 'balanced' | 'quality', + fileIds: string[], + ) { + const emitter = new eventEmitter(); + + const answeringChain = await this.createAnsweringChain( + llm, + fileIds, + embeddings, + optimizationMode, + ); + + const stream = answeringChain.streamEvents( + { + chat_history: history, + query: message, + }, + { + version: 'v1', + }, + ); + + this.handleStream(stream, emitter); + + return emitter; + } +} + +export default MetaSearchAgent; From 6c227cab6fd973135bc51ce9d0f4efc12e5d29d9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:24:51 +0530 Subject: [PATCH 015/147] feat(providers): move providers to UI --- ui/lib/providers/index.ts | 72 +++++++++++++++++++++++++++++++ ui/lib/providers/openai.ts | 88 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 ui/lib/providers/index.ts create mode 100644 ui/lib/providers/openai.ts diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts new file mode 100644 index 0000000..cbb1677 --- /dev/null +++ b/ui/lib/providers/index.ts @@ -0,0 +1,72 @@ +import { Embeddings } from '@langchain/core/embeddings'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; +import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName } from '../config'; +import { ChatOpenAI } from '@langchain/openai'; + +export interface ChatModelProvider { + displayName: string + model: BaseChatModel +} + +export interface EmbeddingModelProvider { + displayName: string + model: Embeddings +} + +const chatModelProviders: Record<string, () => Promise<Record<string, ChatModelProvider>>> = { + openai: loadOpenAIChatModels +} + +const embeddingModelProviders: Record<string, () => Promise<Record<string, EmbeddingModelProvider>>> = { + openai: loadOpenAIEmbeddingModels +} + +export const getAvailableChatModelProviders = async () => { + const models: Record<string, Record<string, ChatModelProvider>> = {}; + + for (const provider in chatModelProviders) { + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; + + return models; +}; + +export const getAvailableEmbeddingModelProviders = async () => { + const models: Record<string, Record<string, EmbeddingModelProvider>> = {}; + + for (const provider in embeddingModelProviders) { + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; + } + } + + return models; + }; + \ No newline at end of file diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts new file mode 100644 index 0000000..9726957 --- /dev/null +++ b/ui/lib/providers/openai.ts @@ -0,0 +1,88 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' +import { getOpenaiApiKey } from '../config' +import { ChatModelProvider, EmbeddingModelProvider } from '.' + +const openaiChatModels: Record<string, string>[] = [ + { + displayName: 'GPT-3.5 Turbo', + key: 'gpt-3.5-turbo', + }, + { + displayName: 'GPT-4', + key: 'gpt-4', + }, + { + displayName: 'GPT-4 turbo', + key: 'gpt-4-turbo', + }, + { + displayName: 'GPT-4 omni', + key: 'gpt-4o', + }, + { + displayName: 'GPT-4 omni mini', + key: 'gpt-4o-mini', + } +] + +const openaiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + } +] + +export const loadOpenAIChatModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const chatModels: Record<string, ChatModelProvider> = {} + + openaiChatModels.forEach(model => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: openaiApiKey, + modelName: model.key, + temperature: 0.7 + }) + } + }) + + return chatModels + } catch(err) { + console.error(`Error loading OpenAI models: ${err}`) + return {} + } +} + +export const loadOpenAIEmbeddingModels = async () => { + const openaiApiKey = getOpenaiApiKey() + + if (!openaiApiKey) return {} + + try { + const embeddingModels: Record<string, EmbeddingModelProvider> = {} + + openaiEmbeddingModels.forEach(model => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: openaiApiKey, + modelName: model.key, + }) + } + }) + + return embeddingModels + } catch(err) { + console.error(`Error loading OpenAI embeddings models: ${err}`) + return {} + } +} \ No newline at end of file From 97f6196d9b16f4ba95d68e799c54ae96ee8e1524 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:25:09 +0530 Subject: [PATCH 016/147] feat(app): add GET config route --- ui/app/api/config/route.ts | 55 ++++++++++++++++++++++++++++++++++++++ ui/app/settings/page.tsx | 4 +-- 2 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 ui/app/api/config/route.ts diff --git a/ui/app/api/config/route.ts b/ui/app/api/config/route.ts new file mode 100644 index 0000000..7bd188e --- /dev/null +++ b/ui/app/api/config/route.ts @@ -0,0 +1,55 @@ +import { getAnthropicApiKey, getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, getGeminiApiKey, getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey } from "@/lib/config" +import { getAvailableChatModelProviders, getAvailableEmbeddingModelProviders } from "@/lib/providers" + +export const GET = async (req: Request) => { + try { + const config: Record<string, any> = {} + + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]) + + config['chatModelProviders'] = {} + config['embeddingModelProviders'] = {} + + for (const provider in chatModelProviders) { + config['chatModelProviders'][provider] = Object.keys( + chatModelProviders[provider], + ).map(model => { + return { + name: model, + displayName: chatModelProviders[provider][model].displayName, + } + }) + } + + for (const provider in embeddingModelProviders) { + config['embeddingModelProviders'][provider] = Object.keys( + embeddingModelProviders[provider], + ).map(model => { + return { + name: model, + displayName: embeddingModelProviders[provider][model].displayName, + } + }) + } + + config['openaiApiKey'] = getOpenaiApiKey() + config['ollamaApiUrl'] = getOllamaApiEndpoint() + config['anthropicApiKey'] = getAnthropicApiKey() + config['groqApiKey'] = getGroqApiKey() + config['geminiApiKey'] = getGeminiApiKey() + config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl() + config['customOpenaiApiKey'] = getCustomOpenaiApiKey() + config['customOpenaiModelName'] = getCustomOpenaiModelName() + + return Response.json({ ...config }, { status: 200 }) + } catch (err) { + console.error('An error ocurred while getting config:', err) + return Response.json( + { message: 'An error ocurred while getting config' }, + { status: 500 }, + ) + } +} diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 6aff1b0..3bd1f2d 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -116,7 +116,7 @@ const Page = () => { useEffect(() => { const fetchConfig = async () => { setIsLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', }, @@ -208,7 +208,7 @@ const Page = () => { key.toLowerCase().includes('api') || key.toLowerCase().includes('url') ) { - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/config`, { + const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', }, From 4cb20542a5db99e1220a5b3bea9ff6439af8e9d1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:33:32 +0530 Subject: [PATCH 017/147] feat(config): update file path, add post endpoint --- ui/app/api/config/route.ts | 102 ++++++++++++++++++++++++++++--------- ui/app/settings/page.tsx | 2 +- ui/lib/config.ts | 6 +-- 3 files changed, 82 insertions(+), 28 deletions(-) diff --git a/ui/app/api/config/route.ts b/ui/app/api/config/route.ts index 7bd188e..46c71f5 100644 --- a/ui/app/api/config/route.ts +++ b/ui/app/api/config/route.ts @@ -1,55 +1,109 @@ -import { getAnthropicApiKey, getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, getGeminiApiKey, getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey } from "@/lib/config" -import { getAvailableChatModelProviders, getAvailableEmbeddingModelProviders } from "@/lib/providers" +import { + getAnthropicApiKey, + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, + getGeminiApiKey, + getGroqApiKey, + getOllamaApiEndpoint, + getOpenaiApiKey, + updateConfig, +} from '@/lib/config'; +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; export const GET = async (req: Request) => { try { - const config: Record<string, any> = {} + const config: Record<string, any> = {}; const [chatModelProviders, embeddingModelProviders] = await Promise.all([ getAvailableChatModelProviders(), getAvailableEmbeddingModelProviders(), - ]) + ]); - config['chatModelProviders'] = {} - config['embeddingModelProviders'] = {} + config['chatModelProviders'] = {}; + config['embeddingModelProviders'] = {}; for (const provider in chatModelProviders) { config['chatModelProviders'][provider] = Object.keys( chatModelProviders[provider], - ).map(model => { + ).map((model) => { return { name: model, displayName: chatModelProviders[provider][model].displayName, - } - }) + }; + }); } for (const provider in embeddingModelProviders) { config['embeddingModelProviders'][provider] = Object.keys( embeddingModelProviders[provider], - ).map(model => { + ).map((model) => { return { name: model, displayName: embeddingModelProviders[provider][model].displayName, - } - }) + }; + }); } - config['openaiApiKey'] = getOpenaiApiKey() - config['ollamaApiUrl'] = getOllamaApiEndpoint() - config['anthropicApiKey'] = getAnthropicApiKey() - config['groqApiKey'] = getGroqApiKey() - config['geminiApiKey'] = getGeminiApiKey() - config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl() - config['customOpenaiApiKey'] = getCustomOpenaiApiKey() - config['customOpenaiModelName'] = getCustomOpenaiModelName() + config['openaiApiKey'] = getOpenaiApiKey(); + config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['anthropicApiKey'] = getAnthropicApiKey(); + config['groqApiKey'] = getGroqApiKey(); + config['geminiApiKey'] = getGeminiApiKey(); + config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); + config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); + config['customOpenaiModelName'] = getCustomOpenaiModelName(); - return Response.json({ ...config }, { status: 200 }) + return Response.json({ ...config }, { status: 200 }); } catch (err) { - console.error('An error ocurred while getting config:', err) + console.error('An error ocurred while getting config:', err); return Response.json( { message: 'An error ocurred while getting config' }, { status: 500 }, - ) + ); } -} +}; + +export const POST = async (req: Request) => { + try { + const config = await req.json(); + + const updatedConfig = { + MODELS: { + OPENAI: { + API_KEY: config.openaiApiKey, + }, + GROQ: { + API_KEY: config.groqApiKey, + }, + ANTHROPIC: { + API_KEY: config.anthropicApiKey, + }, + GEMINI: { + API_KEY: config.geminiApiKey, + }, + OLLAMA: { + API_URL: config.ollamaApiUrl, + }, + CUSTOM_OPENAI: { + API_URL: config.customOpenaiApiUrl, + API_KEY: config.customOpenaiApiKey, + MODEL_NAME: config.customOpenaiModelName, + }, + }, + }; + + updateConfig(updatedConfig); + + return Response.json({ message: 'Config updated' }, { status: 200 }); + } catch (err) { + console.error('An error ocurred while updating config:', err); + return Response.json( + { message: 'An error ocurred while updating config' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index 3bd1f2d..bcb9b2b 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -188,7 +188,7 @@ const Page = () => { } as SettingsType; const response = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/config`, + `/api/config`, { method: 'POST', headers: { diff --git a/ui/lib/config.ts b/ui/lib/config.ts index 1e5148d..0a314cf 100644 --- a/ui/lib/config.ts +++ b/ui/lib/config.ts @@ -109,9 +109,9 @@ const mergeConfigs = (current: any, update: any): any => { export const updateConfig = (config: RecursivePartial<Config>) => { const currentConfig = loadConfig(); const mergedConfig = mergeConfigs(currentConfig, config); - + console.log(mergedConfig); fs.writeFileSync( - path.join(__dirname, `../${configFileName}`), + path.join(path.join(process.cwd(), `${configFileName}`)), toml.stringify(mergedConfig), ); -}; \ No newline at end of file +}; From 32f26bb4e83fe372f5e645e3b44901bc849777da Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:28:47 +0530 Subject: [PATCH 018/147] feat(app): add groq, gemini & anthropic provider --- ui/lib/providers/anthropic.ts | 63 +++++++++++++++++ ui/lib/providers/gemini.ts | 94 +++++++++++++++++++++++++ ui/lib/providers/groq.ts | 107 ++++++++++++++++++++++++++++ ui/lib/providers/index.ts | 129 +++++++++++++++++++--------------- ui/lib/providers/ollama.ts | 73 +++++++++++++++++++ 5 files changed, 411 insertions(+), 55 deletions(-) create mode 100644 ui/lib/providers/anthropic.ts create mode 100644 ui/lib/providers/gemini.ts create mode 100644 ui/lib/providers/groq.ts create mode 100644 ui/lib/providers/ollama.ts diff --git a/ui/lib/providers/anthropic.ts b/ui/lib/providers/anthropic.ts new file mode 100644 index 0000000..894fda5 --- /dev/null +++ b/ui/lib/providers/anthropic.ts @@ -0,0 +1,63 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { ChatModel } from '.'; +import { getAnthropicApiKey } from '../config'; + +const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 3.7 Sonnet', + key: 'claude-3-7-sonnet-20250219', + }, + { + displayName: 'Claude 3.5 Haiku', + key: 'claude-3-5-haiku-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet v2', + key: 'claude-3-5-sonnet-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet', + key: 'claude-3-5-sonnet-20240620', + }, + { + displayName: 'Claude 3 Opus', + key: 'claude-3-opus-20240229', + }, + { + displayName: 'Claude 3 Sonnet', + key: 'claude-3-sonnet-20240229', + }, + { + displayName: 'Claude 3 Haiku', + key: 'claude-3-haiku-20240307', + }, +]; + +export const loadAnthropicChatModels = async () => { + const anthropicApiKey = getAnthropicApiKey(); + + if (!anthropicApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + anthropicChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: anthropicApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.anthropic.com/v1/', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Anthropic models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/gemini.ts b/ui/lib/providers/gemini.ts new file mode 100644 index 0000000..28a31cf --- /dev/null +++ b/ui/lib/providers/gemini.ts @@ -0,0 +1,94 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getGeminiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; + +const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.0 Flash', + key: 'gemini-2.0-flash', + }, + { + displayName: 'Gemini 2.0 Flash-Lite', + key: 'gemini-2.0-flash-lite', + }, + { + displayName: 'Gemini 2.0 Pro Experimental', + key: 'gemini-2.0-pro-exp-02-05', + }, + { + displayName: 'Gemini 1.5 Flash', + key: 'gemini-1.5-flash', + }, + { + displayName: 'Gemini 1.5 Flash-8B', + key: 'gemini-1.5-flash-8b', + }, + { + displayName: 'Gemini 1.5 Pro', + key: 'gemini-1.5-pro', + }, +]; + +const geminiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Gemini Embedding', + key: 'gemini-embedding-exp', + }, +]; + +export const loadGeminiChatModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + geminiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: geminiApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Gemini models: ${err}`); + return {}; + } +}; + +export const loadGeminiEmbeddingModels = async () => { + const geminiApiKey = getGeminiApiKey(); + + if (!geminiApiKey) return {}; + + try { + const embeddingModels: Record<string, EmbeddingModel> = {}; + + geminiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: geminiApiKey, + modelName: model.key, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }), + }; + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading OpenAI embeddings models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/groq.ts b/ui/lib/providers/groq.ts new file mode 100644 index 0000000..05947fb --- /dev/null +++ b/ui/lib/providers/groq.ts @@ -0,0 +1,107 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { getGroqApiKey } from '../config'; +import { ChatModel } from '.'; + +const groqChatModels: Record<string, string>[] = [ + { + displayName: 'Gemma2 9B IT', + key: 'gemma2-9b-it', + }, + { + displayName: 'Llama 3.3 70B Versatile', + key: 'llama-3.3-70b-versatile', + }, + { + displayName: 'Llama 3.1 8B Instant', + key: 'llama-3.1-8b-instant', + }, + { + displayName: 'Llama3 70B 8192', + key: 'llama3-70b-8192', + }, + { + displayName: 'Llama3 8B 8192', + key: 'llama3-8b-8192', + }, + { + displayName: 'Mixtral 8x7B 32768', + key: 'mixtral-8x7b-32768', + }, + { + displayName: 'Qwen QWQ 32B (Preview)', + key: 'qwen-qwq-32b', + }, + { + displayName: 'Mistral Saba 24B (Preview)', + key: 'mistral-saba-24b', + }, + { + displayName: 'Qwen 2.5 Coder 32B (Preview)', + key: 'qwen-2.5-coder-32b', + }, + { + displayName: 'Qwen 2.5 32B (Preview)', + key: 'qwen-2.5-32b', + }, + { + displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', + key: 'deepseek-r1-distill-qwen-32b', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', + key: 'deepseek-r1-distill-llama-70b-specdec', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', + key: 'deepseek-r1-distill-llama-70b', + }, + { + displayName: 'Llama 3.3 70B SpecDec (Preview)', + key: 'llama-3.3-70b-specdec', + }, + { + displayName: 'Llama 3.2 1B Preview (Preview)', + key: 'llama-3.2-1b-preview', + }, + { + displayName: 'Llama 3.2 3B Preview (Preview)', + key: 'llama-3.2-3b-preview', + }, + { + displayName: 'Llama 3.2 11B Vision Preview (Preview)', + key: 'llama-3.2-11b-vision-preview', + }, + { + displayName: 'Llama 3.2 90B Vision Preview (Preview)', + key: 'llama-3.2-90b-vision-preview', + }, +]; + +export const loadGroqChatModels = async () => { + const groqApiKey = getGroqApiKey(); + + if (!groqApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + groqChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: groqApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.groq.com/openai/v1', + }, + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Groq models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts index cbb1677..caa8074 100644 --- a/ui/lib/providers/index.ts +++ b/ui/lib/providers/index.ts @@ -1,72 +1,91 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; -import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName } from '../config'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '../config'; import { ChatOpenAI } from '@langchain/openai'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; +import { loadGroqChatModels } from './groq'; +import { loadAnthropicChatModels } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -export interface ChatModelProvider { - displayName: string - model: BaseChatModel +export interface ChatModel { + displayName: string; + model: BaseChatModel; } -export interface EmbeddingModelProvider { - displayName: string - model: Embeddings +export interface EmbeddingModel { + displayName: string; + model: Embeddings; } -const chatModelProviders: Record<string, () => Promise<Record<string, ChatModelProvider>>> = { - openai: loadOpenAIChatModels -} +const chatModelProviders: Record< + string, + () => Promise<Record<string, ChatModel>> +> = { + openai: loadOpenAIChatModels, + ollama: loadOllamaChatModels, + groq: loadGroqChatModels, + anthropic: loadAnthropicChatModels, + gemini: loadGeminiChatModels +}; -const embeddingModelProviders: Record<string, () => Promise<Record<string, EmbeddingModelProvider>>> = { - openai: loadOpenAIEmbeddingModels -} +const embeddingModelProviders: Record< + string, + () => Promise<Record<string, EmbeddingModel>> +> = { + openai: loadOpenAIEmbeddingModels, + ollama: loadOllamaEmbeddingModels, + gemini: loadGeminiEmbeddingModels +}; export const getAvailableChatModelProviders = async () => { - const models: Record<string, Record<string, ChatModelProvider>> = {}; - - for (const provider in chatModelProviders) { - const providerModels = await chatModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } + const models: Record<string, Record<string, ChatModel>> = {}; + + for (const provider in chatModelProviders) { + const providerModels = await chatModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; } - - const customOpenAiApiKey = getCustomOpenaiApiKey(); - const customOpenAiApiUrl = getCustomOpenaiApiUrl(); - const customOpenAiModelName = getCustomOpenaiModelName(); - - models['custom_openai'] = { - ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName - ? { - [customOpenAiModelName]: { - displayName: customOpenAiModelName, - model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, - modelName: customOpenAiModelName, - temperature: 0.7, - configuration: { - baseURL: customOpenAiApiUrl, - }, - }), - }, - } - : {}), - }; - - return models; + } + + const customOpenAiApiKey = getCustomOpenaiApiKey(); + const customOpenAiApiUrl = getCustomOpenaiApiUrl(); + const customOpenAiModelName = getCustomOpenaiModelName(); + + models['custom_openai'] = { + ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName + ? { + [customOpenAiModelName]: { + displayName: customOpenAiModelName, + model: new ChatOpenAI({ + openAIApiKey: customOpenAiApiKey, + modelName: customOpenAiModelName, + temperature: 0.7, + configuration: { + baseURL: customOpenAiApiUrl, + }, + }), + }, + } + : {}), + }; + + return models; }; export const getAvailableEmbeddingModelProviders = async () => { - const models: Record<string, Record<string, EmbeddingModelProvider>> = {}; - - for (const provider in embeddingModelProviders) { - const providerModels = await embeddingModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } + const models: Record<string, Record<string, EmbeddingModel>> = {}; + + for (const provider in embeddingModelProviders) { + const providerModels = await embeddingModelProviders[provider](); + if (Object.keys(providerModels).length > 0) { + models[provider] = providerModels; } - - return models; - }; - \ No newline at end of file + } + + return models; +}; diff --git a/ui/lib/providers/ollama.ts b/ui/lib/providers/ollama.ts new file mode 100644 index 0000000..92e98e4 --- /dev/null +++ b/ui/lib/providers/ollama.ts @@ -0,0 +1,73 @@ +import axios from 'axios'; +import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOllama } from '@langchain/community/chat_models/ollama'; +import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; + +export const loadOllamaChatModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); + + if (!ollamaApiEndpoint) return {}; + + try { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const { models } = res.data; + + const chatModels: Record<string, ChatModel> = {}; + + models.forEach((model: any) => { + chatModels[model.model] = { + displayName: model.name, + model: new ChatOllama({ + baseUrl: ollamaApiEndpoint, + model: model.model, + temperature: 0.7, + keepAlive: getKeepAlive(), + }), + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Ollama models: ${err}`); + return {}; + } +}; + +export const loadOllamaEmbeddingModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); + + if (!ollamaApiEndpoint) return {}; + + try { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { + headers: { + 'Content-Type': 'application/json', + }, + }); + + const { models } = res.data; + + const embeddingModels: Record<string, EmbeddingModel> = {}; + + models.forEach((model: any) => { + embeddingModels[model.model] = { + displayName: model.name, + model: new OllamaEmbeddings({ + baseUrl: ollamaApiEndpoint, + model: model.model, + }), + }; + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading Ollama embeddings models: ${err}`); + return {}; + } +}; From ee6e197ec034323d5ef34382c26ab919ecd4942e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 18 Mar 2025 11:29:04 +0530 Subject: [PATCH 019/147] feat(app): lint & beautify --- ui/app/settings/page.tsx | 15 ++--- ui/lib/providers/openai.ts | 106 +++++++++++++++---------------- ui/lib/search/metaSearchAgent.ts | 2 +- ui/lib/types/compute-dot.d.ts | 2 +- ui/lib/utils/documents.ts | 5 +- ui/next.config.mjs | 2 +- 6 files changed, 66 insertions(+), 66 deletions(-) diff --git a/ui/app/settings/page.tsx b/ui/app/settings/page.tsx index bcb9b2b..efe54d5 100644 --- a/ui/app/settings/page.tsx +++ b/ui/app/settings/page.tsx @@ -187,16 +187,13 @@ const Page = () => { [key]: value, } as SettingsType; - const response = await fetch( - `/api/config`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(updatedConfig), + const response = await fetch(`/api/config`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify(updatedConfig), + }); if (!response.ok) { throw new Error('Failed to update config'); diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts index 9726957..c6b938d 100644 --- a/ui/lib/providers/openai.ts +++ b/ui/lib/providers/openai.ts @@ -1,6 +1,6 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai' -import { getOpenaiApiKey } from '../config' -import { ChatModelProvider, EmbeddingModelProvider } from '.' +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getOpenaiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; const openaiChatModels: Record<string, string>[] = [ { @@ -22,67 +22,67 @@ const openaiChatModels: Record<string, string>[] = [ { displayName: 'GPT-4 omni mini', key: 'gpt-4o-mini', - } -] + }, +]; const openaiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Text Embedding 3 Small', - key: 'text-embedding-3-small', - }, - { - displayName: 'Text Embedding 3 Large', - key: 'text-embedding-3-large', - } -] + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + }, +]; export const loadOpenAIChatModels = async () => { - const openaiApiKey = getOpenaiApiKey() + const openaiApiKey = getOpenaiApiKey(); - if (!openaiApiKey) return {} + if (!openaiApiKey) return {}; - try { - const chatModels: Record<string, ChatModelProvider> = {} + try { + const chatModels: Record<string, ChatModel> = {}; - openaiChatModels.forEach(model => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, - modelName: model.key, - temperature: 0.7 - }) - } - }) + openaiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: openaiApiKey, + modelName: model.key, + temperature: 0.7, + }), + }; + }); - return chatModels - } catch(err) { - console.error(`Error loading OpenAI models: ${err}`) - return {} - } -} + return chatModels; + } catch (err) { + console.error(`Error loading OpenAI models: ${err}`); + return {}; + } +}; export const loadOpenAIEmbeddingModels = async () => { - const openaiApiKey = getOpenaiApiKey() + const openaiApiKey = getOpenaiApiKey(); - if (!openaiApiKey) return {} + if (!openaiApiKey) return {}; - try { - const embeddingModels: Record<string, EmbeddingModelProvider> = {} + try { + const embeddingModels: Record<string, EmbeddingModel> = {}; - openaiEmbeddingModels.forEach(model => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, - modelName: model.key, - }) - } - }) + openaiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: openaiApiKey, + modelName: model.key, + }), + }; + }); - return embeddingModels - } catch(err) { - console.error(`Error loading OpenAI embeddings models: ${err}`) - return {} - } -} \ No newline at end of file + return embeddingModels; + } catch (err) { + console.error(`Error loading OpenAI embeddings models: ${err}`); + return {}; + } +}; diff --git a/ui/lib/search/metaSearchAgent.ts b/ui/lib/search/metaSearchAgent.ts index a878ab8..38ea2a0 100644 --- a/ui/lib/search/metaSearchAgent.ts +++ b/ui/lib/search/metaSearchAgent.ts @@ -414,7 +414,7 @@ class MetaSearchAgent implements MetaSearchAgentType { return sortedDocs; } - return [] + return []; } private processDocs(docs: Document[]) { diff --git a/ui/lib/types/compute-dot.d.ts b/ui/lib/types/compute-dot.d.ts index 6bcd481..b671c64 100644 --- a/ui/lib/types/compute-dot.d.ts +++ b/ui/lib/types/compute-dot.d.ts @@ -1,5 +1,5 @@ declare function computeDot(vectorA: number[], vectorB: number[]): number; -declare module "compute-dot" { +declare module 'compute-dot' { export default computeDot; } diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts index 07b8bef..900d6b0 100644 --- a/ui/lib/utils/documents.ts +++ b/ui/lib/utils/documents.ts @@ -79,7 +79,10 @@ export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { docs.push(...linkDocs); } catch (err) { - console.error("An error occurred while getting documents from links: ", err); + console.error( + 'An error occurred while getting documents from links: ', + err, + ); docs.push( new Document({ pageContent: `Failed to retrieve content from the link: ${err}`, diff --git a/ui/next.config.mjs b/ui/next.config.mjs index a5db257..74156d1 100644 --- a/ui/next.config.mjs +++ b/ui/next.config.mjs @@ -7,7 +7,7 @@ const nextConfig = { }, ], }, - serverExternalPackages: ['pdf-parse'] + serverExternalPackages: ['pdf-parse'], }; export default nextConfig; From 3bf2337697985c18a674571f30947d41f9bd4e57 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:37:01 +0530 Subject: [PATCH 020/147] feat(app): add db & schema --- ui/drizzle.config.ts | 10 + ui/lib/db/index.ts | 11 + ui/lib/db/schema.ts | 28 ++ ui/package.json | 9 +- ui/tsconfig.json | 21 +- ui/yarn.lock | 620 +++++++++++++++++++++++++++++++++++++++++-- 6 files changed, 664 insertions(+), 35 deletions(-) create mode 100644 ui/drizzle.config.ts create mode 100644 ui/lib/db/index.ts create mode 100644 ui/lib/db/schema.ts diff --git a/ui/drizzle.config.ts b/ui/drizzle.config.ts new file mode 100644 index 0000000..76b84a9 --- /dev/null +++ b/ui/drizzle.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from 'drizzle-kit'; + +export default defineConfig({ + dialect: 'sqlite', + schema: './lib/db/schema.ts', + out: './drizzle', + dbCredentials: { + url: './data/db.sqlite', + }, +}); diff --git a/ui/lib/db/index.ts b/ui/lib/db/index.ts new file mode 100644 index 0000000..9b761d4 --- /dev/null +++ b/ui/lib/db/index.ts @@ -0,0 +1,11 @@ +import { drizzle } from 'drizzle-orm/better-sqlite3'; +import Database from 'better-sqlite3'; +import * as schema from './schema'; +import path from 'path'; + +const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite')); +const db = drizzle(sqlite, { + schema: schema, +}); + +export default db; diff --git a/ui/lib/db/schema.ts b/ui/lib/db/schema.ts new file mode 100644 index 0000000..cee9660 --- /dev/null +++ b/ui/lib/db/schema.ts @@ -0,0 +1,28 @@ +import { sql } from 'drizzle-orm'; +import { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core'; + +export const messages = sqliteTable('messages', { + id: integer('id').primaryKey(), + content: text('content').notNull(), + chatId: text('chatId').notNull(), + messageId: text('messageId').notNull(), + role: text('type', { enum: ['assistant', 'user'] }), + metadata: text('metadata', { + mode: 'json', + }), +}); + +interface File { + name: string; + fileId: string; +} + +export const chats = sqliteTable('chats', { + id: text('id').primaryKey(), + title: text('title').notNull(), + createdAt: text('createdAt').notNull(), + focusMode: text('focusMode').notNull(), + files: text('files', { mode: 'json' }) + .$type<File[]>() + .default(sql`'[]'`), +}); diff --git a/ui/package.json b/ui/package.json index c9a7a94..9be9447 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,18 +8,21 @@ "build": "next build", "start": "next start", "lint": "next lint", - "format:write": "prettier . --write" + "format:write": "prettier . --write", + "db:push": "drizzle-kit push sqlite" }, "dependencies": { "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^9.4.0", + "@icons-pack/react-simple-icons": "^12.3.0", "@langchain/openai": "^0.0.25", "@tailwindcss/typography": "^0.5.12", "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", "clsx": "^2.1.0", "compute-cosine-similarity": "^1.1.0", "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "langchain": "^0.1.30", "lucide-react": "^0.363.0", @@ -38,12 +41,14 @@ "zod": "^3.22.4" }, "devDependencies": { + "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", "@types/react-dom": "^18", "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", "eslint": "^8", "eslint-config-next": "14.1.4", "postcss": "^8", diff --git a/ui/tsconfig.json b/ui/tsconfig.json index d81d4ee..64c2104 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -1,10 +1,6 @@ { "compilerOptions": { - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -22,19 +18,10 @@ } ], "paths": { - "@/*": [ - "./*" - ] + "@/*": ["./*"] }, "target": "ES2017" }, - "include": [ - "next-env.d.ts", - "**/*.ts", - "**/*.tsx", - ".next/types/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/ui/yarn.lock b/ui/yarn.lock index 427693e..259436c 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -48,6 +48,11 @@ enabled "2.0.x" kuler "^2.0.0" +"@drizzle-team/brocli@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" + integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== + "@emnapi/runtime@^1.2.0": version "1.3.1" resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" @@ -55,6 +60,247 @@ dependencies: tslib "^2.4.0" +"@esbuild-kit/core-utils@^3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" + integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== + dependencies: + esbuild "~0.18.20" + source-map-support "^0.5.21" + +"@esbuild-kit/esm-loader@^2.5.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" + integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== + dependencies: + "@esbuild-kit/core-utils" "^3.3.2" + get-tsconfig "^4.7.0" + +"@esbuild/aix-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" + integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== + +"@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + +"@esbuild/android-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" + integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== + +"@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + +"@esbuild/android-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" + integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== + +"@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + +"@esbuild/android-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" + integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== + +"@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + +"@esbuild/darwin-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" + integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== + +"@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + +"@esbuild/darwin-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" + integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== + +"@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + +"@esbuild/freebsd-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" + integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== + +"@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + +"@esbuild/freebsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" + integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== + +"@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + +"@esbuild/linux-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" + integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== + +"@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + +"@esbuild/linux-arm@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" + integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== + +"@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + +"@esbuild/linux-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" + integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== + +"@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + +"@esbuild/linux-loong64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" + integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== + +"@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + +"@esbuild/linux-mips64el@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" + integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== + +"@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + +"@esbuild/linux-ppc64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" + integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== + +"@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + +"@esbuild/linux-riscv64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" + integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== + +"@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + +"@esbuild/linux-s390x@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" + integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== + +"@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + +"@esbuild/linux-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" + integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== + +"@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + +"@esbuild/netbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" + integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== + +"@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + +"@esbuild/openbsd-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" + integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== + +"@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + +"@esbuild/sunos-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" + integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== + +"@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + +"@esbuild/win32-arm64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" + integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== + +"@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + +"@esbuild/win32-ia32@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" + integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== + +"@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + +"@esbuild/win32-x64@0.19.12": + version "0.19.12" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" + integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -157,10 +403,10 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@icons-pack/react-simple-icons@^9.4.0": - version "9.4.0" - resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-9.4.0.tgz#37871d830f9ec9cfa1d1aab186036df2ab075f26" - integrity sha512-fZtC4Zv53hE+IQE2dJlFt3EB6UOifwTrUNMuEu4hSXemtqMahd05Dpvj2K0j2ewVc+j/ibavud3xjfaMB2Nj7g== +"@icons-pack/react-simple-icons@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" + integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== "@img/sharp-darwin-arm64@0.33.5": version "0.33.5" @@ -445,6 +691,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@petamoriken/float16@^3.8.7": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" + integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -548,6 +799,13 @@ resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== +"@types/better-sqlite3@^7.6.12": + version "7.6.12" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" + integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== + dependencies: + "@types/node" "*" + "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" @@ -931,11 +1189,19 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== -base64-js@^1.5.1: +base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +better-sqlite3@^11.9.1: + version "11.9.1" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" + integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== + dependencies: + bindings "^1.5.0" + prebuild-install "^7.1.1" + binary-extensions@^2.0.0, binary-extensions@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" @@ -946,6 +1212,22 @@ binary-search@^1.3.5: resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -978,6 +1260,19 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" @@ -1049,6 +1344,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -1243,6 +1543,18 @@ decamelize@1.2.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1281,7 +1593,7 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.3: +detect-libc@^2.0.0, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== @@ -1355,6 +1667,22 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.3" +drizzle-kit@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" + integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== + dependencies: + "@drizzle-team/brocli" "^0.10.2" + "@esbuild-kit/esm-loader" "^2.5.5" + esbuild "^0.19.7" + esbuild-register "^3.5.0" + gel "^2.0.0" + +drizzle-orm@^0.40.1: + version "0.40.1" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" + integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -1380,6 +1708,13 @@ enabled@2.0.x: resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + enhanced-resolve@^5.12.0: version "5.16.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" @@ -1393,6 +1728,11 @@ entities@^4.2.0, entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" @@ -1509,6 +1849,70 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +esbuild-register@^3.5.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== + dependencies: + debug "^4.3.4" + +esbuild@^0.19.7: + version "0.19.12" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" + integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.19.12" + "@esbuild/android-arm" "0.19.12" + "@esbuild/android-arm64" "0.19.12" + "@esbuild/android-x64" "0.19.12" + "@esbuild/darwin-arm64" "0.19.12" + "@esbuild/darwin-x64" "0.19.12" + "@esbuild/freebsd-arm64" "0.19.12" + "@esbuild/freebsd-x64" "0.19.12" + "@esbuild/linux-arm" "0.19.12" + "@esbuild/linux-arm64" "0.19.12" + "@esbuild/linux-ia32" "0.19.12" + "@esbuild/linux-loong64" "0.19.12" + "@esbuild/linux-mips64el" "0.19.12" + "@esbuild/linux-ppc64" "0.19.12" + "@esbuild/linux-riscv64" "0.19.12" + "@esbuild/linux-s390x" "0.19.12" + "@esbuild/linux-x64" "0.19.12" + "@esbuild/netbsd-x64" "0.19.12" + "@esbuild/openbsd-x64" "0.19.12" + "@esbuild/sunos-x64" "0.19.12" + "@esbuild/win32-arm64" "0.19.12" + "@esbuild/win32-ia32" "0.19.12" + "@esbuild/win32-x64" "0.19.12" + +esbuild@~0.18.20: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + escalade@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" @@ -1737,6 +2141,11 @@ eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + expr-eval@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" @@ -1787,6 +2196,11 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1873,6 +2287,11 @@ fraction.js@^4.3.7: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1903,6 +2322,18 @@ functions-have-names@^1.2.3: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +gel@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" + integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== + dependencies: + "@petamoriken/float16" "^3.8.7" + debug "^4.3.4" + env-paths "^3.0.0" + semver "^7.6.2" + shell-quote "^1.8.1" + which "^4.0.0" + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -1930,6 +2361,18 @@ get-tsconfig@^4.5.0: dependencies: resolve-pkg-maps "^1.0.0" +get-tsconfig@^4.7.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== + dependencies: + resolve-pkg-maps "^1.0.0" + +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -2090,6 +2533,11 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0: version "5.3.1" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" @@ -2116,11 +2564,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@~1.3.0: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" @@ -2342,6 +2795,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + iterator.prototype@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" @@ -2611,6 +3069,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + minimatch@9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" @@ -2632,7 +3095,7 @@ minimatch@^9.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -2642,6 +3105,11 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -2707,6 +3175,11 @@ nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -2740,6 +3213,13 @@ next@^15.2.2: "@next/swc-win32-x64-msvc" "15.2.2" sharp "^0.33.5" +node-abi@^3.3.0: + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== + dependencies: + semver "^7.3.5" + node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -2853,7 +3333,7 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -once@^1.3.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -3096,6 +3576,24 @@ postcss@^8, postcss@^8.4.23: picocolors "^1.0.0" source-map-js "^1.2.0" +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -3120,6 +3618,14 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -3130,6 +3636,16 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + react-dom@^18: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -3171,7 +3687,7 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" -readable-stream@^3.4.0, readable-stream@^3.6.2: +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -3277,7 +3793,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -3315,6 +3831,11 @@ semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" @@ -3322,11 +3843,6 @@ semver@^7.5.4: dependencies: lru-cache "^6.0.0" -semver@^7.6.3: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -3390,6 +3906,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" @@ -3405,6 +3926,20 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -3432,6 +3967,19 @@ source-map-js@^1.2.0: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -3553,6 +4101,11 @@ strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -3630,6 +4183,27 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar-fs@^2.0.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -3696,6 +4270,13 @@ tslib@^2.4.0, tslib@^2.8.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -3904,6 +4485,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + winston-transport@^4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" From d1e93616659224ad94e14368583d43b6a2a37e89 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:37:54 +0530 Subject: [PATCH 021/147] feat(routes): add discover route --- ui/app/api/discover/route.ts | 61 ++++++++++++++++++++++++++++++++++++ ui/app/discover/page.tsx | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 ui/app/api/discover/route.ts diff --git a/ui/app/api/discover/route.ts b/ui/app/api/discover/route.ts new file mode 100644 index 0000000..0c95498 --- /dev/null +++ b/ui/app/api/discover/route.ts @@ -0,0 +1,61 @@ +import { searchSearxng } from '@/lib/searxng'; + +const articleWebsites = [ + 'yahoo.com', + 'www.exchangewire.com', + 'businessinsider.com', + /* 'wired.com', + 'mashable.com', + 'theverge.com', + 'gizmodo.com', + 'cnet.com', + 'venturebeat.com', */ +]; + +const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ + +export const GET = async (req: Request) => { + try { + const data = ( + await Promise.all([ + ...new Array(articleWebsites.length * topics.length) + .fill(0) + .map(async (_, i) => { + return ( + await searchSearxng( + `site:${articleWebsites[i % articleWebsites.length]} ${ + topics[i % topics.length] + }`, + { + engines: ['bing news'], + pageno: 1, + }, + ) + ).results; + }), + ]) + ) + .map((result) => result) + .flat() + .sort(() => Math.random() - 0.5); + + return Response.json( + { + blogs: data, + }, + { + status: 200, + }, + ); + } catch (err) { + console.error(`An error ocurred in discover route: ${err}`); + return Response.json( + { + message: 'An error has occurred', + }, + { + status: 500, + }, + ); + } +}; diff --git a/ui/app/discover/page.tsx b/ui/app/discover/page.tsx index eb94040..eb7de7f 100644 --- a/ui/app/discover/page.tsx +++ b/ui/app/discover/page.tsx @@ -19,7 +19,7 @@ const Page = () => { useEffect(() => { const fetchData = async () => { try { - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/discover`, { + const res = await fetch(`/api/discover`, { method: 'GET', headers: { 'Content-Type': 'application/json', From 1130746f5de0b04f7fd03bf0340d24c3012ee863 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:38:40 +0530 Subject: [PATCH 022/147] feat(app): add image & video search functionality --- ui/app/api/images/route.ts | 83 ++++++++++++++++++++++++++ ui/app/api/videos/route.ts | 83 ++++++++++++++++++++++++++ ui/components/SearchImages.tsx | 41 +++++++------ ui/components/SearchVideos.tsx | 41 +++++++------ ui/lib/chains/imageSearchAgent.ts | 90 ++++++++++++++++++++++++++++ ui/lib/chains/videoSearchAgent.ts | 97 +++++++++++++++++++++++++++++++ 6 files changed, 393 insertions(+), 42 deletions(-) create mode 100644 ui/app/api/images/route.ts create mode 100644 ui/app/api/videos/route.ts create mode 100644 ui/lib/chains/imageSearchAgent.ts create mode 100644 ui/lib/chains/videoSearchAgent.ts diff --git a/ui/app/api/images/route.ts b/ui/app/api/images/route.ts new file mode 100644 index 0000000..4114cbd --- /dev/null +++ b/ui/app/api/images/route.ts @@ -0,0 +1,83 @@ +import handleImageSearch from '@/lib/chains/imageSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface ImageSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: ImageSearchBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const images = await handleImageSearch( + { + chat_history: chatHistory, + query: body.query, + }, + llm, + ); + + return Response.json({ images }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while searching images: ${err}`); + return Response.json( + { message: 'An error ocurred while searching images' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/videos/route.ts b/ui/app/api/videos/route.ts new file mode 100644 index 0000000..9b4bf9f --- /dev/null +++ b/ui/app/api/videos/route.ts @@ -0,0 +1,83 @@ +import handleVideoSearch from '@/lib/chains/videoSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface VideoSearchBody { + query: string; + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: VideoSearchBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const videos = await handleVideoSearch( + { + chat_history: chatHistory, + query: body.query, + }, + llm, + ); + + return Response.json({ videos }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while searching videos: ${err}`); + return Response.json( + { message: 'An error ocurred while searching videos' }, + { status: 500 }, + ); + } +}; diff --git a/ui/components/SearchImages.tsx b/ui/components/SearchImages.tsx index 383f780..08c16ee 100644 --- a/ui/components/SearchImages.tsx +++ b/ui/components/SearchImages.tsx @@ -14,9 +14,11 @@ type Image = { const SearchImages = ({ query, chatHistory, + messageId, }: { query: string; chatHistory: Message[]; + messageId: string; }) => { const [images, setImages] = useState<Image[] | null>(null); const [loading, setLoading] = useState(false); @@ -27,7 +29,7 @@ const SearchImages = ({ <> {!loading && images === null && ( <button - id="search-images" + id={`search-images-${messageId}`} onClick={async () => { setLoading(true); @@ -37,27 +39,24 @@ const SearchImages = ({ const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); const customOpenAIKey = localStorage.getItem('openAIApiKey'); - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/images`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query: query, - chatHistory: chatHistory, - chatModel: { - provider: chatModelProvider, - model: chatModel, - ...(chatModelProvider === 'custom_openai' && { - customOpenAIBaseURL: customOpenAIBaseURL, - customOpenAIKey: customOpenAIKey, - }), - }, - }), + const res = await fetch(`/api/images`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ + query: query, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, + }), + }); const data = await res.json(); diff --git a/ui/components/SearchVideos.tsx b/ui/components/SearchVideos.tsx index c284dc2..a09a0d2 100644 --- a/ui/components/SearchVideos.tsx +++ b/ui/components/SearchVideos.tsx @@ -27,9 +27,11 @@ declare module 'yet-another-react-lightbox' { const Searchvideos = ({ query, chatHistory, + messageId, }: { query: string; chatHistory: Message[]; + messageId: string; }) => { const [videos, setVideos] = useState<Video[] | null>(null); const [loading, setLoading] = useState(false); @@ -42,7 +44,7 @@ const Searchvideos = ({ <> {!loading && videos === null && ( <button - id="search-videos" + id={`search-videos-${messageId}`} onClick={async () => { setLoading(true); @@ -52,27 +54,24 @@ const Searchvideos = ({ const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); const customOpenAIKey = localStorage.getItem('openAIApiKey'); - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/videos`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - query: query, - chatHistory: chatHistory, - chatModel: { - provider: chatModelProvider, - model: chatModel, - ...(chatModelProvider === 'custom_openai' && { - customOpenAIBaseURL: customOpenAIBaseURL, - customOpenAIKey: customOpenAIKey, - }), - }, - }), + const res = await fetch(`/api/videos`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', }, - ); + body: JSON.stringify({ + query: query, + chatHistory: chatHistory, + chatModel: { + provider: chatModelProvider, + model: chatModel, + ...(chatModelProvider === 'custom_openai' && { + customOpenAIBaseURL: customOpenAIBaseURL, + customOpenAIKey: customOpenAIKey, + }), + }, + }), + }); const data = await res.json(); diff --git a/ui/lib/chains/imageSearchAgent.ts b/ui/lib/chains/imageSearchAgent.ts new file mode 100644 index 0000000..d194612 --- /dev/null +++ b/ui/lib/chains/imageSearchAgent.ts @@ -0,0 +1,90 @@ +import { + RunnableSequence, + RunnableMap, + RunnableLambda, +} from '@langchain/core/runnables'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import { searchSearxng } from '../searxng'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const imageSearchChainPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. +You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. + +Example: +1. Follow up question: What is a cat? +Rephrased: A cat + +2. Follow up question: What is a car? How does it works? +Rephrased: Car working + +3. Follow up question: How does an AC work? +Rephrased: AC working + +Conversation: +{chat_history} + +Follow up question: {query} +Rephrased question: +`; + +type ImageSearchChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +interface ImageSearchResult { + img_src: string; + url: string; + title: string; +} + +const strParser = new StringOutputParser(); + +const createImageSearchChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: ImageSearchChainInput) => { + return formatChatHistoryAsString(input.chat_history); + }, + query: (input: ImageSearchChainInput) => { + return input.query; + }, + }), + PromptTemplate.fromTemplate(imageSearchChainPrompt), + llm, + strParser, + RunnableLambda.from(async (input: string) => { + const res = await searchSearxng(input, { + engines: ['bing images', 'google images'], + }); + + const images: ImageSearchResult[] = []; + + res.results.forEach((result) => { + if (result.img_src && result.url && result.title) { + images.push({ + img_src: result.img_src, + url: result.url, + title: result.title, + }); + } + }); + + return images.slice(0, 10); + }), + ]); +}; + +const handleImageSearch = ( + input: ImageSearchChainInput, + llm: BaseChatModel, +) => { + const imageSearchChain = createImageSearchChain(llm); + return imageSearchChain.invoke(input); +}; + +export default handleImageSearch; diff --git a/ui/lib/chains/videoSearchAgent.ts b/ui/lib/chains/videoSearchAgent.ts new file mode 100644 index 0000000..e1051f6 --- /dev/null +++ b/ui/lib/chains/videoSearchAgent.ts @@ -0,0 +1,97 @@ +import { + RunnableSequence, + RunnableMap, + RunnableLambda, +} from '@langchain/core/runnables'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { StringOutputParser } from '@langchain/core/output_parsers'; +import { searchSearxng } from '../searxng'; +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const VideoSearchChainPrompt = ` + You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. + You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. + + Example: + 1. Follow up question: How does a car work? + Rephrased: How does a car work? + + 2. Follow up question: What is the theory of relativity? + Rephrased: What is theory of relativity + + 3. Follow up question: How does an AC work? + Rephrased: How does an AC work + + Conversation: + {chat_history} + + Follow up question: {query} + Rephrased question: + `; + +type VideoSearchChainInput = { + chat_history: BaseMessage[]; + query: string; +}; + +interface VideoSearchResult { + img_src: string; + url: string; + title: string; + iframe_src: string; +} + +const strParser = new StringOutputParser(); + +const createVideoSearchChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: VideoSearchChainInput) => { + return formatChatHistoryAsString(input.chat_history); + }, + query: (input: VideoSearchChainInput) => { + return input.query; + }, + }), + PromptTemplate.fromTemplate(VideoSearchChainPrompt), + llm, + strParser, + RunnableLambda.from(async (input: string) => { + const res = await searchSearxng(input, { + engines: ['youtube'], + }); + + const videos: VideoSearchResult[] = []; + + res.results.forEach((result) => { + if ( + result.thumbnail && + result.url && + result.title && + result.iframe_src + ) { + videos.push({ + img_src: result.thumbnail, + url: result.url, + title: result.title, + iframe_src: result.iframe_src, + }); + } + }); + + return videos.slice(0, 10); + }), + ]); +}; + +const handleVideoSearch = ( + input: VideoSearchChainInput, + llm: BaseChatModel, +) => { + const VideoSearchChain = createVideoSearchChain(llm); + return VideoSearchChain.invoke(input); +}; + +export default handleVideoSearch; From bab32e8d70013351ef76294e1fe3eddaf126f13d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:40:10 +0530 Subject: [PATCH 023/147] feat(app): add suggestions route --- ui/app/api/suggestions/route.ts | 81 +++++++++++++++++++++++ ui/lib/chains/suggestionGeneratorAgent.ts | 55 +++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 ui/app/api/suggestions/route.ts create mode 100644 ui/lib/chains/suggestionGeneratorAgent.ts diff --git a/ui/app/api/suggestions/route.ts b/ui/app/api/suggestions/route.ts new file mode 100644 index 0000000..f28092e --- /dev/null +++ b/ui/app/api/suggestions/route.ts @@ -0,0 +1,81 @@ +import generateSuggestions from '@/lib/chains/suggestionGeneratorAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { getAvailableChatModelProviders } from '@/lib/providers'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { ChatOpenAI } from '@langchain/openai'; + +interface ChatModel { + provider: string; + model: string; +} + +interface SuggestionsGenerationBody { + chatHistory: any[]; + chatModel?: ChatModel; +} + +export const POST = async (req: Request) => { + try { + const body: SuggestionsGenerationBody = await req.json(); + + const chatHistory = body.chatHistory + .map((msg: any) => { + if (msg.role === 'user') { + return new HumanMessage(msg.content); + } else if (msg.role === 'assistant') { + return new AIMessage(msg.content); + } + }) + .filter((msg) => msg !== undefined); + + const chatModelProviders = await getAvailableChatModelProviders(); + + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.model || Object.keys(chatModelProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), + }, + }); + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; + } + + if (!llm) { + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); + } + + const suggestions = await generateSuggestions( + { + chat_history: chatHistory, + }, + llm, + ); + + return Response.json({ suggestions }, { status: 200 }); + } catch (err) { + console.error(`An error ocurred while generating suggestions: ${err}`); + return Response.json( + { message: 'An error ocurred while generating suggestions' }, + { status: 500 }, + ); + } +}; diff --git a/ui/lib/chains/suggestionGeneratorAgent.ts b/ui/lib/chains/suggestionGeneratorAgent.ts new file mode 100644 index 0000000..9129059 --- /dev/null +++ b/ui/lib/chains/suggestionGeneratorAgent.ts @@ -0,0 +1,55 @@ +import { RunnableSequence, RunnableMap } from '@langchain/core/runnables'; +import ListLineOutputParser from '../outputParsers/listLineOutputParser'; +import { PromptTemplate } from '@langchain/core/prompts'; +import formatChatHistoryAsString from '../utils/formatHistory'; +import { BaseMessage } from '@langchain/core/messages'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { ChatOpenAI } from '@langchain/openai'; + +const suggestionGeneratorPrompt = ` +You are an AI suggestion generator for an AI powered search engine. You will be given a conversation below. You need to generate 4-5 suggestions based on the conversation. The suggestion should be relevant to the conversation that can be used by the user to ask the chat model for more information. +You need to make sure the suggestions are relevant to the conversation and are helpful to the user. Keep a note that the user might use these suggestions to ask a chat model for more information. +Make sure the suggestions are medium in length and are informative and relevant to the conversation. + +Provide these suggestions separated by newlines between the XML tags <suggestions> and </suggestions>. For example: + +<suggestions> +Tell me more about SpaceX and their recent projects +What is the latest news on SpaceX? +Who is the CEO of SpaceX? +</suggestions> + +Conversation: +{chat_history} +`; + +type SuggestionGeneratorInput = { + chat_history: BaseMessage[]; +}; + +const outputParser = new ListLineOutputParser({ + key: 'suggestions', +}); + +const createSuggestionGeneratorChain = (llm: BaseChatModel) => { + return RunnableSequence.from([ + RunnableMap.from({ + chat_history: (input: SuggestionGeneratorInput) => + formatChatHistoryAsString(input.chat_history), + }), + PromptTemplate.fromTemplate(suggestionGeneratorPrompt), + llm, + outputParser, + ]); +}; + +const generateSuggestions = ( + input: SuggestionGeneratorInput, + llm: BaseChatModel, +) => { + (llm as unknown as ChatOpenAI).temperature = 0; + const suggestionGeneratorChain = createSuggestionGeneratorChain(llm); + return suggestionGeneratorChain.invoke(input); +}; + +export default generateSuggestions; From c46fd7a9c8836356eb934d3be9b82ffdc0ca81d7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:40:35 +0530 Subject: [PATCH 024/147] feat(utils): add files utils, remove logger, fix API url --- ui/lib/actions.ts | 2 +- ui/lib/config.ts | 1 - ui/lib/utils/documents.ts | 1 - ui/lib/utils/files.ts | 17 +++++++++++++++++ ui/lib/utils/logger.ts | 22 ---------------------- 5 files changed, 18 insertions(+), 25 deletions(-) create mode 100644 ui/lib/utils/files.ts delete mode 100644 ui/lib/utils/logger.ts diff --git a/ui/lib/actions.ts b/ui/lib/actions.ts index a4409b0..0f4c0f0 100644 --- a/ui/lib/actions.ts +++ b/ui/lib/actions.ts @@ -7,7 +7,7 @@ export const getSuggestions = async (chatHisory: Message[]) => { const customOpenAIKey = localStorage.getItem('openAIApiKey'); const customOpenAIBaseURL = localStorage.getItem('openAIBaseURL'); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/suggestions`, { + const res = await fetch(`/api/suggestions`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/ui/lib/config.ts b/ui/lib/config.ts index 0a314cf..489fec3 100644 --- a/ui/lib/config.ts +++ b/ui/lib/config.ts @@ -109,7 +109,6 @@ const mergeConfigs = (current: any, update: any): any => { export const updateConfig = (config: RecursivePartial<Config>) => { const currentConfig = loadConfig(); const mergedConfig = mergeConfigs(currentConfig, config); - console.log(mergedConfig); fs.writeFileSync( path.join(path.join(process.cwd(), `${configFileName}`)), toml.stringify(mergedConfig), diff --git a/ui/lib/utils/documents.ts b/ui/lib/utils/documents.ts index 900d6b0..ad64180 100644 --- a/ui/lib/utils/documents.ts +++ b/ui/lib/utils/documents.ts @@ -3,7 +3,6 @@ import { htmlToText } from 'html-to-text'; import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; import { Document } from '@langchain/core/documents'; import pdfParse from 'pdf-parse'; -import logger from './logger'; export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { const splitter = new RecursiveCharacterTextSplitter(); diff --git a/ui/lib/utils/files.ts b/ui/lib/utils/files.ts new file mode 100644 index 0000000..e6e91df --- /dev/null +++ b/ui/lib/utils/files.ts @@ -0,0 +1,17 @@ +import path from 'path'; +import fs from 'fs'; + +export const getFileDetails = (fileId: string) => { + const fileLoc = path.join( + process.cwd(), + './uploads', + fileId + '-extracted.json', + ); + + const parsedFile = JSON.parse(fs.readFileSync(fileLoc, 'utf8')); + + return { + name: parsedFile.title, + fileId: fileId, + }; +}; diff --git a/ui/lib/utils/logger.ts b/ui/lib/utils/logger.ts deleted file mode 100644 index 1c81eb9..0000000 --- a/ui/lib/utils/logger.ts +++ /dev/null @@ -1,22 +0,0 @@ -import winston from 'winston'; - -const logger = winston.createLogger({ - level: 'info', - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.colorize(), - winston.format.simple(), - ), - }), - new winston.transports.File({ - filename: 'app.log', - format: winston.format.combine( - winston.format.timestamp(), - winston.format.json(), - ), - }), - ], -}); - -export default logger; From 3150c21f176ed0416fe7e795d72d2f6c3af04c96 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:41:01 +0530 Subject: [PATCH 025/147] feat(icons): fix type errors --- ui/components/MessageInputActions/Focus.tsx | 16 ++-------------- ui/data/.gitignore | 2 ++ 2 files changed, 4 insertions(+), 14 deletions(-) create mode 100644 ui/data/.gitignore diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 613078b..875dbf7 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -45,25 +45,13 @@ const focusModes = [ key: 'youtubeSearch', title: 'Youtube', description: 'Search and watch videos', - icon: ( - <SiYoutube - className="h-5 w-auto mr-0.5" - onPointerEnterCapture={undefined} - onPointerLeaveCapture={undefined} - /> - ), + icon: <SiYoutube className="h-5 w-auto mr-0.5" />, }, { key: 'redditSearch', title: 'Reddit', description: 'Search for discussions and opinions', - icon: ( - <SiReddit - className="h-5 w-auto mr-0.5" - onPointerEnterCapture={undefined} - onPointerLeaveCapture={undefined} - /> - ), + icon: <SiReddit className="h-5 w-auto mr-0.5" />, }, ]; diff --git a/ui/data/.gitignore b/ui/data/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/ui/data/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From c24edac16da9e8c720eb4cbc5f599e0b51b88ecc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:41:52 +0530 Subject: [PATCH 026/147] feat(app): add chat functionality --- ui/app/api/chat/route.ts | 346 +++++++++++++++++++++++++++++++++++ ui/app/api/models/route.ts | 47 +++++ ui/components/ChatWindow.tsx | 320 ++++++++++++++------------------ ui/lib/providers/index.ts | 8 +- 4 files changed, 535 insertions(+), 186 deletions(-) create mode 100644 ui/app/api/chat/route.ts create mode 100644 ui/app/api/models/route.ts diff --git a/ui/app/api/chat/route.ts b/ui/app/api/chat/route.ts new file mode 100644 index 0000000..0b130de --- /dev/null +++ b/ui/app/api/chat/route.ts @@ -0,0 +1,346 @@ +import prompts from '@/lib/prompts'; +import MetaSearchAgent from '@/lib/search/metaSearchAgent'; +import crypto from 'crypto'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; +import { EventEmitter } from 'stream'; +import { chatModelProviders, embeddingModelProviders } from '@/lib/providers'; +import db from '@/lib/db'; +import { chats, messages as messagesSchema } from '@/lib/db/schema'; +import { and, eq, gt } from 'drizzle-orm'; +import { getFileDetails } from '@/lib/utils/files'; + +export const runtime = 'nodejs'; +export const dynamic = 'force-dynamic'; + +export const searchHandlers: Record<string, MetaSearchAgent> = { + webSearch: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, + responsePrompt: prompts.webSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: true, + }), + academicSearch: new MetaSearchAgent({ + activeEngines: ['arxiv', 'google scholar', 'pubmed'], + queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, + responsePrompt: prompts.academicSearchResponsePrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + writingAssistant: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: '', + responsePrompt: prompts.writingAssistantPrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: false, + summarizer: false, + }), + wolframAlphaSearch: new MetaSearchAgent({ + activeEngines: ['wolframalpha'], + queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, + responsePrompt: prompts.wolframAlphaSearchResponsePrompt, + rerank: false, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + youtubeSearch: new MetaSearchAgent({ + activeEngines: ['youtube'], + queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, + responsePrompt: prompts.youtubeSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), + redditSearch: new MetaSearchAgent({ + activeEngines: ['reddit'], + queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, + responsePrompt: prompts.redditSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), +}; + +type Message = { + messageId: string; + chatId: string; + content: string; +}; + +type ChatModel = { + provider: string; + name: string; +}; + +type EmbeddingModel = { + provider: string; + name: string; +}; + +type Body = { + message: Message; + optimizationMode: 'speed' | 'balanced' | 'quality'; + focusMode: string; + history: Array<[string, string]>; + files: Array<string>; + chatModel: ChatModel; + embeddingModel: EmbeddingModel; +}; + +const handleEmitterEvents = async ( + stream: EventEmitter, + writer: WritableStreamDefaultWriter, + encoder: TextEncoder, + aiMessageId: string, + chatId: string, +) => { + let recievedMessage = ''; + let sources: any[] = []; + + stream.on('data', (data) => { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'message', + data: parsedData.data, + messageId: aiMessageId, + }) + '\n', + ), + ); + + recievedMessage += parsedData.data; + } else if (parsedData.type === 'sources') { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'sources', + data: parsedData.data, + messageId: aiMessageId, + }) + '\n', + ), + ); + + sources = parsedData.data; + } + }); + stream.on('end', () => { + writer.write( + encoder.encode( + JSON.stringify({ + type: 'messageEnd', + messageId: aiMessageId, + }) + '\n', + ), + ); + writer.close(); + + db.insert(messagesSchema) + .values({ + content: recievedMessage, + chatId: chatId, + messageId: aiMessageId, + role: 'assistant', + metadata: JSON.stringify({ + createdAt: new Date(), + ...(sources && sources.length > 0 && { sources }), + }), + }) + .execute(); + }); + stream.on('error', (data) => { + const parsedData = JSON.parse(data); + writer.write( + encoder.encode( + JSON.stringify({ + type: 'error', + data: parsedData.data, + }), + ), + ); + writer.close(); + }); +}; + +const handleHistorySave = async ( + message: Message, + humanMessageId: string, + focusMode: string, + files: string[], +) => { + const chat = await db.query.chats.findFirst({ + where: eq(chats.id, message.chatId), + }); + + if (!chat) { + await db + .insert(chats) + .values({ + id: message.chatId, + title: message.content, + createdAt: new Date().toString(), + focusMode: focusMode, + files: files.map(getFileDetails), + }) + .execute(); + } + + const messageExists = await db.query.messages.findFirst({ + where: eq(messagesSchema.messageId, humanMessageId), + }); + + if (!messageExists) { + await db + .insert(messagesSchema) + .values({ + content: message.content, + chatId: message.chatId, + messageId: humanMessageId, + role: 'user', + metadata: JSON.stringify({ + createdAt: new Date(), + }), + }) + .execute(); + } else { + await db + .delete(messagesSchema) + .where( + and( + gt(messagesSchema.id, messageExists.id), + eq(messagesSchema.chatId, message.chatId), + ), + ) + .execute(); + } +}; + +export const POST = async (req: Request) => { + try { + const body = (await req.json()) as Body; + const { message, chatModel, embeddingModel } = body; + + if (message.content === '') { + return Response.json( + { + message: 'Please provide a message to process', + }, + { status: 400 }, + ); + } + + const getProviderChatModels = chatModelProviders[chatModel.provider]; + + if (!getProviderChatModels) { + return Response.json( + { + message: 'Invalid chat model provider', + }, + { status: 400 }, + ); + } + + const chatModels = await getProviderChatModels(); + + const llm = chatModels[chatModel.name].model; + + if (!llm) { + return Response.json( + { + message: 'Invalid chat model', + }, + { status: 400 }, + ); + } + + const getProviderEmbeddingModels = + embeddingModelProviders[embeddingModel.provider]; + + if (!getProviderEmbeddingModels) { + return Response.json( + { + message: 'Invalid embedding model provider', + }, + { status: 400 }, + ); + } + + const embeddingModels = await getProviderEmbeddingModels(); + const embedding = embeddingModels[embeddingModel.name].model; + + if (!embedding) { + return Response.json( + { + message: 'Invalid embedding model', + }, + { status: 400 }, + ); + } + + const humanMessageId = + message.messageId ?? crypto.randomBytes(7).toString('hex'); + const aiMessageId = crypto.randomBytes(7).toString('hex'); + + const history: BaseMessage[] = body.history.map((msg) => { + if (msg[0] === 'human') { + return new HumanMessage({ + content: msg[1], + }); + } else { + return new AIMessage({ + content: msg[1], + }); + } + }); + + const handler = searchHandlers[body.focusMode]; + + if (!handler) { + return Response.json( + { + message: 'Invalid focus mode', + }, + { status: 400 }, + ); + } + + const stream = await handler.searchAndAnswer( + message.content, + history, + llm, + embedding, + body.optimizationMode, + body.files, + ); + + const responseStream = new TransformStream(); + const writer = responseStream.writable.getWriter(); + const encoder = new TextEncoder(); + + handleEmitterEvents(stream, writer, encoder, aiMessageId, message.chatId); + handleHistorySave(message, humanMessageId, body.focusMode, body.files); + + return new Response(responseStream.readable, { + headers: { + 'Content-Type': 'text/event-stream', + Connection: 'keep-alive', + 'Cache-Control': 'no-cache, no-transform', + }, + }); + } catch (err) { + console.error('An error ocurred while processing chat request:', err); + return Response.json( + { message: 'An error ocurred while processing chat request' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/models/route.ts b/ui/app/api/models/route.ts new file mode 100644 index 0000000..a5e5b43 --- /dev/null +++ b/ui/app/api/models/route.ts @@ -0,0 +1,47 @@ +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; + +export const GET = async (req: Request) => { + try { + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + Object.keys(chatModelProviders).forEach((provider) => { + Object.keys(chatModelProviders[provider]).forEach((model) => { + delete (chatModelProviders[provider][model] as { model?: unknown }) + .model; + }); + }); + + Object.keys(embeddingModelProviders).forEach((provider) => { + Object.keys(embeddingModelProviders[provider]).forEach((model) => { + delete (embeddingModelProviders[provider][model] as { model?: unknown }) + .model; + }); + }); + + return Response.json( + { + chatModelProviders, + embeddingModelProviders, + }, + { + status: 200, + }, + ); + } catch (err) { + console.error('An error ocurred while fetching models', err); + return Response.json( + { + message: 'An error has occurred.', + }, + { + status: 500, + }, + ); + } +}; diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 1940f42..f642525 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -29,29 +29,24 @@ export interface File { fileId: string; } -const useSocket = ( - url: string, - setIsWSReady: (ready: boolean) => void, - setError: (error: boolean) => void, +interface ChatModelProvider { + name: string; + provider: string; +} + +interface EmbeddingModelProvider { + name: string; + provider: string; +} + +const checkConfig = async ( + setChatModelProvider: (provider: ChatModelProvider) => void, + setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, + setIsConfigReady: (ready: boolean) => void, + setHasError: (hasError: boolean) => void, ) => { - const wsRef = useRef<WebSocket | null>(null); - const reconnectTimeoutRef = useRef<NodeJS.Timeout>(); - const retryCountRef = useRef(0); - const isCleaningUpRef = useRef(false); - const MAX_RETRIES = 3; - const INITIAL_BACKOFF = 1000; // 1 second - const isConnectionErrorRef = useRef(false); - - const getBackoffDelay = (retryCount: number) => { - return Math.min(INITIAL_BACKOFF * Math.pow(2, retryCount), 10000); // Cap at 10 seconds - }; - useEffect(() => { - const connectWs = async () => { - if (wsRef.current?.readyState === WebSocket.OPEN) { - wsRef.current.close(); - } - + const checkConfig = async () => { try { let chatModel = localStorage.getItem('chatModel'); let chatModelProvider = localStorage.getItem('chatModelProvider'); @@ -71,14 +66,11 @@ const useSocket = ( localStorage.setItem('autoVideoSearch', 'false'); } - const providers = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/models`, - { - headers: { - 'Content-Type': 'application/json', - }, + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', }, - ).then(async (res) => { + }).then(async (res) => { if (!res.ok) throw new Error( `Failed to fetch models: ${res.status} ${res.statusText}`, @@ -182,127 +174,30 @@ const useSocket = ( } } - const wsURL = new URL(url); - const searchParams = new URLSearchParams({}); - - searchParams.append('chatModel', chatModel!); - searchParams.append('chatModelProvider', chatModelProvider); - - if (chatModelProvider === 'custom_openai') { - searchParams.append( - 'openAIApiKey', - localStorage.getItem('openAIApiKey')!, - ); - searchParams.append( - 'openAIBaseURL', - localStorage.getItem('openAIBaseURL')!, - ); - } - - searchParams.append('embeddingModel', embeddingModel!); - searchParams.append('embeddingModelProvider', embeddingModelProvider); - - wsURL.search = searchParams.toString(); - - const ws = new WebSocket(wsURL.toString()); - wsRef.current = ws; - - const timeoutId = setTimeout(() => { - if (ws.readyState !== 1) { - toast.error( - 'Failed to connect to the server. Please try again later.', - ); - } - }, 10000); - - ws.addEventListener('message', (e) => { - const data = JSON.parse(e.data); - if (data.type === 'signal' && data.data === 'open') { - const interval = setInterval(() => { - if (ws.readyState === 1) { - setIsWSReady(true); - setError(false); - if (retryCountRef.current > 0) { - toast.success('Connection restored.'); - } - retryCountRef.current = 0; - clearInterval(interval); - } - }, 5); - clearTimeout(timeoutId); - console.debug(new Date(), 'ws:connected'); - } - if (data.type === 'error') { - isConnectionErrorRef.current = true; - setError(true); - toast.error(data.data); - } + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, }); - ws.onerror = () => { - clearTimeout(timeoutId); - setIsWSReady(false); - toast.error('WebSocket connection error.'); - }; + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); - ws.onclose = () => { - clearTimeout(timeoutId); - setIsWSReady(false); - console.debug(new Date(), 'ws:disconnected'); - if (!isCleaningUpRef.current && !isConnectionErrorRef.current) { - toast.error('Connection lost. Attempting to reconnect...'); - attemptReconnect(); - } - }; - } catch (error) { - console.debug(new Date(), 'ws:error', error); - setIsWSReady(false); - attemptReconnect(); - } - }; - - const attemptReconnect = () => { - retryCountRef.current += 1; - - if (retryCountRef.current > MAX_RETRIES) { - console.debug(new Date(), 'ws:max_retries'); - setError(true); - toast.error( - 'Unable to connect to server after multiple attempts. Please refresh the page to try again.', + setIsConfigReady(true); + } catch (err) { + console.error( + 'An error occurred while checking the configuration:', + err, ); - return; - } - - const backoffDelay = getBackoffDelay(retryCountRef.current); - console.debug( - new Date(), - `ws:retry attempt=${retryCountRef.current}/${MAX_RETRIES} delay=${backoffDelay}ms`, - ); - - if (reconnectTimeoutRef.current) { - clearTimeout(reconnectTimeoutRef.current); - } - - reconnectTimeoutRef.current = setTimeout(() => { - connectWs(); - }, backoffDelay); - }; - - connectWs(); - - return () => { - if (reconnectTimeoutRef.current) { - clearTimeout(reconnectTimeoutRef.current); - } - if (wsRef.current?.readyState === WebSocket.OPEN) { - wsRef.current.close(); - isCleaningUpRef.current = true; - console.debug(new Date(), 'ws:cleanup'); + setIsConfigReady(false); + setHasError(true); } }; - }, [url, setIsWSReady, setError]); - return wsRef.current; + checkConfig(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); }; const loadMessages = async ( @@ -315,15 +210,12 @@ const loadMessages = async ( setFiles: (files: File[]) => void, setFileIds: (fileIds: string[]) => void, ) => { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, - { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, + const res = await fetch(`/api/chats/${chatId}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', }, - ); + }); if (res.status === 404) { setNotFound(true); @@ -373,13 +265,27 @@ const ChatWindow = ({ id }: { id?: string }) => { const [chatId, setChatId] = useState<string | undefined>(id); const [newChatCreated, setNewChatCreated] = useState(false); + const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( + { + name: '', + provider: '', + }, + ); + + const [embeddingModelProvider, setEmbeddingModelProvider] = + useState<EmbeddingModelProvider>({ + name: '', + provider: '', + }); + + const [isConfigReady, setIsConfigReady] = useState(false); const [hasError, setHasError] = useState(false); const [isReady, setIsReady] = useState(false); - const [isWSReady, setIsWSReady] = useState(false); - const ws = useSocket( - process.env.NEXT_PUBLIC_WS_URL!, - setIsWSReady, + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, setHasError, ); @@ -399,8 +305,6 @@ const ChatWindow = ({ id }: { id?: string }) => { const [notFound, setNotFound] = useState(false); - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - useEffect(() => { if ( chatId && @@ -426,16 +330,6 @@ const ChatWindow = ({ id }: { id?: string }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useEffect(() => { - return () => { - if (ws?.readyState === 1) { - ws.close(); - console.debug(new Date(), 'ws:cleanup'); - } - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - const messagesRef = useRef<Message[]>([]); useEffect(() => { @@ -443,18 +337,18 @@ const ChatWindow = ({ id }: { id?: string }) => { }, [messages]); useEffect(() => { - if (isMessagesLoaded && isWSReady) { + if (isMessagesLoaded && isConfigReady) { setIsReady(true); console.debug(new Date(), 'app:ready'); } else { setIsReady(false); } - }, [isMessagesLoaded, isWSReady]); + }, [isMessagesLoaded, isConfigReady]); const sendMessage = async (message: string, messageId?: string) => { if (loading) return; - if (!ws || ws.readyState !== WebSocket.OPEN) { - toast.error('Cannot send message while disconnected'); + if (!isConfigReady) { + toast.error('Cannot send message before the configuration is ready'); return; } @@ -467,18 +361,27 @@ const ChatWindow = ({ id }: { id?: string }) => { messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - ws.send( + console.log( JSON.stringify({ - type: 'message', + content: message, message: { messageId: messageId, chatId: chatId!, content: message, }, + chatId: chatId!, files: fileIds, focusMode: focusMode, optimizationMode: optimizationMode, - history: [...chatHistory, ['human', message]], + history: chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, }), ); @@ -493,9 +396,7 @@ const ChatWindow = ({ id }: { id?: string }) => { }, ]); - const messageHandler = async (e: MessageEvent) => { - const data = JSON.parse(e.data); - + const messageHandler = async (data: any) => { if (data.type === 'error') { toast.error(data.data); setLoading(false); @@ -558,7 +459,6 @@ const ChatWindow = ({ id }: { id?: string }) => { ['assistant', recievedMessage], ]); - ws?.removeEventListener('message', messageHandler); setLoading(false); const lastMsg = messagesRef.current[messagesRef.current.length - 1]; @@ -584,16 +484,72 @@ const ChatWindow = ({ id }: { id?: string }) => { const autoVideoSearch = localStorage.getItem('autoVideoSearch'); if (autoImageSearch === 'true') { - document.getElementById('search-images')?.click(); + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); } if (autoVideoSearch === 'true') { - document.getElementById('search-videos')?.click(); + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); } } }; - ws?.addEventListener('message', messageHandler); + const res = await fetch('/api/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: message, + message: { + messageId: messageId, + chatId: chatId!, + content: message, + }, + chatId: chatId!, + files: fileIds, + focusMode: focusMode, + optimizationMode: optimizationMode, + history: chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, + }), + }); + + if (!res.body) throw new Error('No response body'); + + const reader = res.body?.getReader(); + const decoder = new TextDecoder('utf-8'); + + let partialChunk = ''; + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + partialChunk += decoder.decode(value, { stream: true }); + + try { + const messages = partialChunk.split('\n'); + for (const msg of messages) { + if (!msg.trim()) continue; + const json = JSON.parse(msg); + messageHandler(json); + } + partialChunk = ''; + } catch (error) { + console.warn('Incomplete JSON, waiting for next chunk...'); + } + } }; const rewrite = (messageId: string) => { @@ -614,11 +570,11 @@ const ChatWindow = ({ id }: { id?: string }) => { }; useEffect(() => { - if (isReady && initialMessage && ws?.readyState === 1) { + if (isReady && initialMessage && isConfigReady) { sendMessage(initialMessage); } // eslint-disable-next-line react-hooks/exhaustive-deps - }, [ws?.readyState, isReady, initialMessage, isWSReady]); + }, [isConfigReady, isReady, initialMessage]); if (hasError) { return ( diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts index caa8074..e45c09d 100644 --- a/ui/lib/providers/index.ts +++ b/ui/lib/providers/index.ts @@ -22,7 +22,7 @@ export interface EmbeddingModel { model: Embeddings; } -const chatModelProviders: Record< +export const chatModelProviders: Record< string, () => Promise<Record<string, ChatModel>> > = { @@ -30,16 +30,16 @@ const chatModelProviders: Record< ollama: loadOllamaChatModels, groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, - gemini: loadGeminiChatModels + gemini: loadGeminiChatModels, }; -const embeddingModelProviders: Record< +export const embeddingModelProviders: Record< string, () => Promise<Record<string, EmbeddingModel>> > = { openai: loadOpenAIEmbeddingModels, ollama: loadOllamaEmbeddingModels, - gemini: loadGeminiEmbeddingModels + gemini: loadGeminiEmbeddingModels, }; export const getAvailableChatModelProviders = async () => { From bab5dba6e1800d6f54aa660a75861479111fabbc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:42:15 +0530 Subject: [PATCH 027/147] feat(app): port history saving features --- ui/app/api/chats/[id]/route.ts | 69 ++++++++++++++++++++++++++++++++++ ui/app/api/chats/route.ts | 15 ++++++++ ui/app/c/[chatId]/page.tsx | 6 ++- ui/app/library/page.tsx | 2 +- ui/components/DeleteChat.tsx | 13 +++---- 5 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 ui/app/api/chats/[id]/route.ts create mode 100644 ui/app/api/chats/route.ts diff --git a/ui/app/api/chats/[id]/route.ts b/ui/app/api/chats/[id]/route.ts new file mode 100644 index 0000000..6891454 --- /dev/null +++ b/ui/app/api/chats/[id]/route.ts @@ -0,0 +1,69 @@ +import db from '@/lib/db'; +import { chats, messages } from '@/lib/db/schema'; +import { eq } from 'drizzle-orm'; + +export const GET = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + const chatMessages = await db.query.messages.findMany({ + where: eq(messages.chatId, id), + }); + + return Response.json( + { + chat: chatExists, + messages: chatMessages, + }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in getting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; + +export const DELETE = async ( + req: Request, + { params }: { params: Promise<{ id: string }> }, +) => { + try { + const { id } = await params; + + const chatExists = await db.query.chats.findFirst({ + where: eq(chats.id, id), + }); + + if (!chatExists) { + return Response.json({ message: 'Chat not found' }, { status: 404 }); + } + + await db.delete(chats).where(eq(chats.id, id)).execute(); + await db.delete(messages).where(eq(messages.chatId, id)).execute(); + + return Response.json( + { message: 'Chat deleted successfully' }, + { status: 200 }, + ); + } catch (err) { + console.error('Error in deleting chat by id: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/api/chats/route.ts b/ui/app/api/chats/route.ts new file mode 100644 index 0000000..986a192 --- /dev/null +++ b/ui/app/api/chats/route.ts @@ -0,0 +1,15 @@ +import db from '@/lib/db'; + +export const GET = async (req: Request) => { + try { + let chats = await db.query.chats.findMany(); + chats = chats.reverse(); + return Response.json({ chats: chats }, { status: 200 }); + } catch (err) { + console.error('Error in getting chats: ', err); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/ui/app/c/[chatId]/page.tsx b/ui/app/c/[chatId]/page.tsx index dc3c92a..aac125a 100644 --- a/ui/app/c/[chatId]/page.tsx +++ b/ui/app/c/[chatId]/page.tsx @@ -1,7 +1,9 @@ import ChatWindow from '@/components/ChatWindow'; +import React from 'react'; -const Page = ({ params }: { params: { chatId: string } }) => { - return <ChatWindow id={params.chatId} />; +const Page = ({ params }: { params: Promise<{ chatId: string }> }) => { + const { chatId } = React.use(params); + return <ChatWindow id={chatId} />; }; export default Page; diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 379596c..9c40b2b 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -21,7 +21,7 @@ const Page = () => { const fetchChats = async () => { setLoading(true); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/chats`, { + const res = await fetch(`/api/chats`, { method: 'GET', headers: { 'Content-Type': 'application/json', diff --git a/ui/components/DeleteChat.tsx b/ui/components/DeleteChat.tsx index 2857fc8..3acc9fc 100644 --- a/ui/components/DeleteChat.tsx +++ b/ui/components/DeleteChat.tsx @@ -29,15 +29,12 @@ const DeleteChat = ({ const handleDelete = async () => { setLoading(true); try { - const res = await fetch( - `${process.env.NEXT_PUBLIC_API_URL}/chats/${chatId}`, - { - method: 'DELETE', - headers: { - 'Content-Type': 'application/json', - }, + const res = await fetch(`/api/chats/${chatId}`, { + method: 'DELETE', + headers: { + 'Content-Type': 'application/json', }, - ); + }); if (res.status != 200) { throw new Error('Failed to delete chat'); From 649c68f2920f34c5cd461fc7ab221dcc59f5ed0f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:42:28 +0530 Subject: [PATCH 028/147] feat(ui): fix type errors --- ui/components/MessageBox.tsx | 2 ++ ui/components/MessageSources.tsx | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index 61f4f05..499c3d6 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -193,10 +193,12 @@ const MessageBox = ({ <SearchImages query={history[messageIndex - 1].content} chatHistory={history.slice(0, messageIndex - 1)} + messageId={message.messageId} /> <SearchVideos chatHistory={history.slice(0, messageIndex - 1)} query={history[messageIndex - 1].content} + messageId={message.messageId} /> </div> </div> diff --git a/ui/components/MessageSources.tsx b/ui/components/MessageSources.tsx index c7ee945..fb2b5bb 100644 --- a/ui/components/MessageSources.tsx +++ b/ui/components/MessageSources.tsx @@ -69,11 +69,15 @@ const MessageSources = ({ sources }: { sources: Document[] }) => { <div className="flex flex-row items-center space-x-1"> {sources.slice(3, 6).map((source, i) => { return source.metadata.url === 'File' ? ( - <div className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full"> + <div + key={i} + className="bg-dark-200 hover:bg-dark-100 transition duration-200 flex items-center justify-center w-6 h-6 rounded-full" + > <File size={12} className="text-white/70" /> </div> ) : ( <img + key={i} src={`https://s2.googleusercontent.com/s2/favicons?domain_url=${source.metadata.url}`} width={16} height={16} From 8a24572cd28570d8e8b5f61933a213f164b32ed2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:32:32 +0530 Subject: [PATCH 029/147] feat(app): add upload functionality --- ui/.prettierignore | 41 +++ ui/app/api/uploads/route.ts | 134 ++++++++ ui/components/MessageInputActions/Attach.tsx | 2 +- .../MessageInputActions/AttachSmall.tsx | 2 +- ui/package.json | 3 + ui/uploads/.gitignore | 2 + ui/yarn.lock | 321 +++++++++++++++++- 7 files changed, 498 insertions(+), 7 deletions(-) create mode 100644 ui/.prettierignore create mode 100644 ui/app/api/uploads/route.ts create mode 100644 ui/uploads/.gitignore diff --git a/ui/.prettierignore b/ui/.prettierignore new file mode 100644 index 0000000..55d3c7c --- /dev/null +++ b/ui/.prettierignore @@ -0,0 +1,41 @@ +# Ignore all files in the node_modules directory +node_modules + +# Ignore all files in the .next directory (Next.js build output) +.next + +# Ignore all files in the .out directory (TypeScript build output) +.out + +# Ignore all files in the .cache directory (Prettier cache) +.cache + +# Ignore all files in the .vscode directory (Visual Studio Code settings) +.vscode + +# Ignore all files in the .idea directory (IntelliJ IDEA settings) +.idea + +# Ignore all files in the dist directory (build output) +dist + +# Ignore all files in the build directory (build output) +build + +# Ignore all files in the coverage directory (test coverage reports) +coverage + +# Ignore all files with the .log extension +*.log + +# Ignore all files with the .tmp extension +*.tmp + +# Ignore all files with the .swp extension +*.swp + +# Ignore all files with the .DS_Store extension (macOS specific) +.DS_Store + +# Ignore all files in uploads directory +uploads \ No newline at end of file diff --git a/ui/app/api/uploads/route.ts b/ui/app/api/uploads/route.ts new file mode 100644 index 0000000..9fbaf2d --- /dev/null +++ b/ui/app/api/uploads/route.ts @@ -0,0 +1,134 @@ +import { NextResponse } from 'next/server'; +import fs from 'fs'; +import path from 'path'; +import crypto from 'crypto'; +import { getAvailableEmbeddingModelProviders } from '@/lib/providers'; +import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; +import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; +import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; +import { Document } from 'langchain/document'; + +interface FileRes { + fileName: string; + fileExtension: string; + fileId: string; +} + +const uploadDir = path.join(process.cwd(), 'uploads'); + +if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); +} + +const splitter = new RecursiveCharacterTextSplitter({ + chunkSize: 500, + chunkOverlap: 100, +}); + +export async function POST(req: Request) { + try { + const formData = await req.formData(); + + const files = formData.getAll('files') as File[]; + const embedding_model = formData.get('embedding_model'); + const embedding_model_provider = formData.get('embedding_model_provider'); + + if (!embedding_model || !embedding_model_provider) { + return NextResponse.json( + { message: 'Missing embedding model or provider' }, + { status: 400 }, + ); + } + + const embeddingModels = await getAvailableEmbeddingModelProviders(); + const provider = + embedding_model_provider ?? Object.keys(embeddingModels)[0]; + const embeddingModel = + embedding_model ?? Object.keys(embeddingModels[provider as string])[0]; + + let embeddingsModel = + embeddingModels[provider as string]?.[embeddingModel as string]?.model; + if (!embeddingsModel) { + return NextResponse.json( + { message: 'Invalid embedding model selected' }, + { status: 400 }, + ); + } + + const processedFiles: FileRes[] = []; + + await Promise.all( + files.map(async (file: any) => { + const fileExtension = file.name.split('.').pop(); + if (!['pdf', 'docx', 'txt'].includes(fileExtension!)) { + return NextResponse.json( + { message: 'File type not supported' }, + { status: 400 }, + ); + } + + const uniqueFileName = `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`; + const filePath = path.join(uploadDir, uniqueFileName); + + const buffer = Buffer.from(await file.arrayBuffer()); + fs.writeFileSync(filePath, new Uint8Array(buffer)); + + let docs: any[] = []; + if (fileExtension === 'pdf') { + const loader = new PDFLoader(filePath); + docs = await loader.load(); + } else if (fileExtension === 'docx') { + const loader = new DocxLoader(filePath); + docs = await loader.load(); + } else if (fileExtension === 'txt') { + const text = fs.readFileSync(filePath, 'utf-8'); + docs = [ + new Document({ pageContent: text, metadata: { title: file.name } }), + ]; + } + + const splitted = await splitter.splitDocuments(docs); + + const extractedDataPath = filePath.replace(/\.\w+$/, '-extracted.json'); + fs.writeFileSync( + extractedDataPath, + JSON.stringify({ + title: file.name, + contents: splitted.map((doc) => doc.pageContent), + }), + ); + + const embeddings = await embeddingsModel.embedDocuments( + splitted.map((doc) => doc.pageContent), + ); + const embeddingsDataPath = filePath.replace( + /\.\w+$/, + '-embeddings.json', + ); + fs.writeFileSync( + embeddingsDataPath, + JSON.stringify({ + title: file.name, + embeddings, + }), + ); + + processedFiles.push({ + fileName: file.name, + fileExtension: fileExtension, + fileId: uniqueFileName.replace(/\.\w+$/, ''), + }); + }), + ); + + return NextResponse.json({ + files: processedFiles, + }); + } catch (error) { + console.error('Error uploading file:', error); + return NextResponse.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +} diff --git a/ui/components/MessageInputActions/Attach.tsx b/ui/components/MessageInputActions/Attach.tsx index d5c1448..7e2f7f2 100644 --- a/ui/components/MessageInputActions/Attach.tsx +++ b/ui/components/MessageInputActions/Attach.tsx @@ -41,7 +41,7 @@ const Attach = ({ data.append('embedding_model_provider', embeddingModelProvider!); data.append('embedding_model', embeddingModel!); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + const res = await fetch(`/api/uploads`, { method: 'POST', body: data, }); diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx index a0d4b45..044b652 100644 --- a/ui/components/MessageInputActions/AttachSmall.tsx +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -39,7 +39,7 @@ const AttachSmall = ({ data.append('embedding_model_provider', embeddingModelProvider!); data.append('embedding_model', embeddingModel!); - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/uploads`, { + const res = await fetch(`/api/uploads`, { method: 'POST', body: data, }); diff --git a/ui/package.json b/ui/package.json index 9be9447..c9314b4 100644 --- a/ui/package.json +++ b/ui/package.json @@ -15,7 +15,10 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", "axios": "^1.8.3", "better-sqlite3": "^11.9.1", diff --git a/ui/uploads/.gitignore b/ui/uploads/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/ui/uploads/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/ui/yarn.lock b/ui/yarn.lock index 259436c..31abdb3 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -34,6 +34,11 @@ dependencies: regenerator-runtime "^0.14.0" +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" @@ -565,6 +570,22 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@langchain/community@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" + integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== + dependencies: + "@langchain/openai" ">=0.2.0 <0.5.0" + binary-extensions "^2.2.0" + expr-eval "^2.0.2" + flat "^5.0.2" + js-yaml "^4.1.0" + langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" + langsmith ">=0.2.8 <0.4.0" + uuid "^10.0.0" + zod "^3.22.3" + zod-to-json-schema "^3.22.5" + "@langchain/community@~0.0.41": version "0.0.44" resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" @@ -579,6 +600,24 @@ zod "^3.22.3" zod-to-json-schema "^3.22.5" +"@langchain/core@^0.3.42": + version "0.3.42" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" + integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== + dependencies: + "@cfworker/json-schema" "^4.0.2" + ansi-styles "^5.0.0" + camelcase "6" + decamelize "1.2.0" + js-tiktoken "^1.0.12" + langsmith ">=0.2.8 <0.4.0" + mustache "^4.2.0" + p-queue "^6.6.2" + p-retry "4" + uuid "^10.0.0" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": version "0.1.54" resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" @@ -596,6 +635,16 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" + integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== + dependencies: + js-tiktoken "^1.0.12" + openai "^4.87.3" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + "@langchain/openai@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" @@ -618,6 +667,13 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" + integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== + dependencies: + js-tiktoken "^1.0.12" + "@next/env@15.2.2": version "15.2.2" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" @@ -806,16 +862,68 @@ dependencies: "@types/node" "*" +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/express-serve-static-core@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" + integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/multer@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== + dependencies: + "@types/express" "*" + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -848,6 +956,16 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/qs@*": + version "6.9.18" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" + integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -868,11 +986,33 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/send@*": + version "0.17.4" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/uuid@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" + integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== + "@types/uuid@^9.0.1": version "9.0.8" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" @@ -1003,6 +1143,11 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== + arg@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -1273,7 +1418,7 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@1.6.0: +busboy@1.6.0, busboy@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== @@ -1316,7 +1461,7 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1468,6 +1613,28 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-table-printer@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + dependencies: + simple-wcswidth "^1.0.1" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -2564,7 +2731,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2790,6 +2957,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2825,6 +2997,13 @@ jiti@^1.21.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +js-tiktoken@^1.0.12: + version "1.0.19" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" + integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== + dependencies: + base64-js "^1.5.1" + js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" @@ -2893,6 +3072,24 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": + version "0.3.19" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" + integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== + dependencies: + "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/textsplitters" ">=0.0.0 <0.2.0" + js-tiktoken "^1.0.12" + js-yaml "^4.1.0" + jsonpointer "^5.0.1" + langsmith ">=0.2.8 <0.4.0" + openapi-types "^12.1.3" + p-retry "4" + uuid "^10.0.0" + yaml "^2.2.1" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" + langchain@^0.1.30: version "0.1.31" resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" @@ -2921,6 +3118,19 @@ langchainhub@~0.0.8: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== +"langsmith@>=0.2.8 <0.4.0": + version "0.3.14" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" + integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== + dependencies: + "@types/uuid" "^10.0.0" + chalk "^4.1.2" + console-table-printer "^2.12.1" + p-queue "^6.6.2" + p-retry "4" + semver "^7.6.3" + uuid "^10.0.0" + langsmith@~0.1.1, langsmith@~0.1.7: version "0.1.14" resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" @@ -3044,6 +3254,11 @@ md5@^2.3.0: crypt "0.0.2" is-buffer "~1.1.6" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -3062,7 +3277,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@~2.1.24: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -3110,6 +3325,13 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -3156,6 +3378,24 @@ ms@^2.0.0, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multer@^1.4.5-lts.1: + version "1.4.5-lts.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" + integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + dependencies: + append-field "^1.0.0" + busboy "^1.0.0" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + type-is "^1.6.4" + xtend "^4.0.0" + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -3361,6 +3601,19 @@ openai@^4.26.0, openai@^4.32.1: node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +openai@^4.87.3: + version "4.87.4" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" + integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + openapi-types@^12.1.3: version "12.1.3" resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" @@ -3604,6 +3857,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -3687,6 +3945,19 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" @@ -3798,6 +4069,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -3947,6 +4223,11 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -4070,6 +4351,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4289,6 +4577,14 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-is@^1.6.4: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" @@ -4333,6 +4629,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@^5: version "5.4.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" @@ -4385,11 +4686,16 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" + integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== + uuid@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" @@ -4541,6 +4847,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From 217736d05afeb5b10bb61827203f189b55b2c6cc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:23:27 +0530 Subject: [PATCH 030/147] feat(app): remove backend --- ui/.eslintrc.json => .eslintrc.json | 0 .gitignore | 6 +- .prettierrc.js | 1 - app.dockerfile | 19 +- backend.dockerfile | 17 - docker-compose.yaml | 35 +- drizzle.config.ts | 2 +- next-env.d.ts | 5 + ui/next.config.mjs => next.config.mjs | 0 package.json | 81 +- ui/postcss.config.js => postcss.config.js | 0 {ui/public => public}/next.svg | 0 {ui/public => public}/vercel.svg | 0 sample.config.toml | 2 +- src/app.ts | 38 - {ui => src}/app/api/chat/route.ts | 90 +- {ui => src}/app/api/chats/[id]/route.ts | 0 {ui => src}/app/api/chats/route.ts | 0 {ui => src}/app/api/config/route.ts | 0 {ui => src}/app/api/discover/route.ts | 0 {ui => src}/app/api/images/route.ts | 6 +- {ui => src}/app/api/models/route.ts | 0 {ui => src}/app/api/suggestions/route.ts | 6 +- {ui => src}/app/api/uploads/route.ts | 0 {ui => src}/app/api/videos/route.ts | 6 +- {ui => src}/app/c/[chatId]/page.tsx | 0 {ui => src}/app/discover/page.tsx | 0 {ui => src}/app/favicon.ico | Bin {ui => src}/app/globals.css | 0 {ui => src}/app/layout.tsx | 0 {ui => src}/app/library/layout.tsx | 0 {ui => src}/app/library/page.tsx | 0 {ui => src}/app/page.tsx | 0 {ui => src}/app/settings/page.tsx | 0 src/chains/imageSearchAgent.ts | 84 - src/chains/suggestionGeneratorAgent.ts | 55 - src/chains/videoSearchAgent.ts | 90 - {ui => src}/components/Chat.tsx | 0 {ui => src}/components/ChatWindow.tsx | 280 +- {ui => src}/components/DeleteChat.tsx | 0 {ui => src}/components/EmptyChat.tsx | 0 .../components/EmptyChatMessageInput.tsx | 0 {ui => src}/components/Layout.tsx | 0 .../components/MessageActions/Copy.tsx | 0 .../components/MessageActions/Rewrite.tsx | 0 {ui => src}/components/MessageBox.tsx | 0 {ui => src}/components/MessageBoxLoading.tsx | 0 {ui => src}/components/MessageInput.tsx | 0 .../components/MessageInputActions/Attach.tsx | 0 .../MessageInputActions/AttachSmall.tsx | 0 .../MessageInputActions/Copilot.tsx | 0 .../components/MessageInputActions/Focus.tsx | 0 .../MessageInputActions/Optimization.tsx | 0 {ui => src}/components/MessageSources.tsx | 0 {ui => src}/components/Navbar.tsx | 0 {ui => src}/components/SearchImages.tsx | 0 {ui => src}/components/SearchVideos.tsx | 0 {ui => src}/components/Sidebar.tsx | 0 {ui => src}/components/theme/Provider.tsx | 0 {ui => src}/components/theme/Switcher.tsx | 0 {ui => src}/components/ui/Select.tsx | 0 src/config.ts | 117 - src/db/index.ts | 10 - {ui => src}/lib/actions.ts | 0 {ui => src}/lib/chains/imageSearchAgent.ts | 0 .../lib/chains/suggestionGeneratorAgent.ts | 0 {ui => src}/lib/chains/videoSearchAgent.ts | 0 {ui => src}/lib/config.ts | 2 +- {ui => src}/lib/db/index.ts | 0 src/{ => lib}/db/schema.ts | 0 src/lib/huggingfaceTransformer.ts | 82 - src/lib/outputParsers/lineOutputParser.ts | 2 +- src/lib/outputParsers/listLineOutputParser.ts | 2 +- src/{ => lib}/prompts/academicSearch.ts | 0 src/{ => lib}/prompts/index.ts | 0 src/{ => lib}/prompts/redditSearch.ts | 0 src/{ => lib}/prompts/webSearch.ts | 0 src/{ => lib}/prompts/wolframAlpha.ts | 0 src/{ => lib}/prompts/writingAssistant.ts | 0 src/{ => lib}/prompts/youtubeSearch.ts | 0 src/lib/providers/anthropic.ts | 95 +- src/lib/providers/gemini.ts | 129 +- src/lib/providers/groq.ts | 212 +- src/lib/providers/index.ts | 50 +- src/lib/providers/ollama.ts | 59 +- src/lib/providers/openai.ts | 129 +- src/lib/providers/transformers.ts | 32 - {ui => src}/lib/search/metaSearchAgent.ts | 0 src/lib/searxng.ts | 9 +- {ui => src}/lib/types/compute-dot.d.ts | 0 {ui => src}/lib/utils.ts | 0 {ui => src}/lib/utils/computeSimilarity.ts | 0 {ui => src}/lib/utils/documents.ts | 0 src/{ => lib}/utils/files.ts | 0 src/{ => lib}/utils/formatHistory.ts | 0 src/routes/chats.ts | 66 - src/routes/config.ts | 104 - src/routes/discover.ts | 48 - src/routes/images.ts | 82 - src/routes/index.ts | 24 - src/routes/models.ts | 36 - src/routes/search.ts | 158 - src/routes/suggestions.ts | 81 - src/routes/uploads.ts | 151 - src/routes/videos.ts | 82 - src/search/metaSearchAgent.ts | 494 -- src/utils/computeSimilarity.ts | 17 - src/utils/documents.ts | 99 - src/utils/logger.ts | 22 - src/websocket/connectionManager.ts | 122 - src/websocket/index.ts | 8 - src/websocket/messageHandler.ts | 272 - src/websocket/websocketServer.ts | 16 - ui/tailwind.config.ts => tailwind.config.ts | 6 +- tsconfig.json | 35 +- ui/.env.example | 2 - ui/.gitignore | 34 - ui/.prettierignore | 41 - ui/.prettierrc.js | 11 - ui/data/.gitignore | 2 - ui/drizzle.config.ts | 10 - ui/lib/db/schema.ts | 28 - ui/lib/outputParsers/lineOutputParser.ts | 48 - ui/lib/outputParsers/listLineOutputParser.ts | 50 - ui/lib/prompts/academicSearch.ts | 65 - ui/lib/prompts/index.ts | 32 - ui/lib/prompts/redditSearch.ts | 65 - ui/lib/prompts/webSearch.ts | 106 - ui/lib/prompts/wolframAlpha.ts | 65 - ui/lib/prompts/writingAssistant.ts | 13 - ui/lib/prompts/youtubeSearch.ts | 65 - ui/lib/providers/anthropic.ts | 63 - ui/lib/providers/gemini.ts | 94 - ui/lib/providers/groq.ts | 107 - ui/lib/providers/index.ts | 91 - ui/lib/providers/ollama.ts | 73 - ui/lib/providers/openai.ts | 88 - ui/lib/searxng.ts | 48 - ui/lib/utils/files.ts | 17 - ui/lib/utils/formatHistory.ts | 9 - ui/package.json | 62 - ui/tsconfig.json | 27 - ui/uploads/.gitignore | 2 - ui/yarn.lock | 4883 ----------------- yarn.lock | 4185 +++++++++----- 145 files changed, 3546 insertions(+), 10516 deletions(-) rename ui/.eslintrc.json => .eslintrc.json (100%) delete mode 100644 backend.dockerfile create mode 100644 next-env.d.ts rename ui/next.config.mjs => next.config.mjs (100%) rename ui/postcss.config.js => postcss.config.js (100%) rename {ui/public => public}/next.svg (100%) rename {ui/public => public}/vercel.svg (100%) delete mode 100644 src/app.ts rename {ui => src}/app/api/chat/route.ts (80%) rename {ui => src}/app/api/chats/[id]/route.ts (100%) rename {ui => src}/app/api/chats/route.ts (100%) rename {ui => src}/app/api/config/route.ts (100%) rename {ui => src}/app/api/discover/route.ts (100%) rename {ui => src}/app/api/images/route.ts (92%) rename {ui => src}/app/api/models/route.ts (100%) rename {ui => src}/app/api/suggestions/route.ts (92%) rename {ui => src}/app/api/uploads/route.ts (100%) rename {ui => src}/app/api/videos/route.ts (92%) rename {ui => src}/app/c/[chatId]/page.tsx (100%) rename {ui => src}/app/discover/page.tsx (100%) rename {ui => src}/app/favicon.ico (100%) rename {ui => src}/app/globals.css (100%) rename {ui => src}/app/layout.tsx (100%) rename {ui => src}/app/library/layout.tsx (100%) rename {ui => src}/app/library/page.tsx (100%) rename {ui => src}/app/page.tsx (100%) rename {ui => src}/app/settings/page.tsx (100%) delete mode 100644 src/chains/imageSearchAgent.ts delete mode 100644 src/chains/suggestionGeneratorAgent.ts delete mode 100644 src/chains/videoSearchAgent.ts rename {ui => src}/components/Chat.tsx (100%) rename {ui => src}/components/ChatWindow.tsx (73%) rename {ui => src}/components/DeleteChat.tsx (100%) rename {ui => src}/components/EmptyChat.tsx (100%) rename {ui => src}/components/EmptyChatMessageInput.tsx (100%) rename {ui => src}/components/Layout.tsx (100%) rename {ui => src}/components/MessageActions/Copy.tsx (100%) rename {ui => src}/components/MessageActions/Rewrite.tsx (100%) rename {ui => src}/components/MessageBox.tsx (100%) rename {ui => src}/components/MessageBoxLoading.tsx (100%) rename {ui => src}/components/MessageInput.tsx (100%) rename {ui => src}/components/MessageInputActions/Attach.tsx (100%) rename {ui => src}/components/MessageInputActions/AttachSmall.tsx (100%) rename {ui => src}/components/MessageInputActions/Copilot.tsx (100%) rename {ui => src}/components/MessageInputActions/Focus.tsx (100%) rename {ui => src}/components/MessageInputActions/Optimization.tsx (100%) rename {ui => src}/components/MessageSources.tsx (100%) rename {ui => src}/components/Navbar.tsx (100%) rename {ui => src}/components/SearchImages.tsx (100%) rename {ui => src}/components/SearchVideos.tsx (100%) rename {ui => src}/components/Sidebar.tsx (100%) rename {ui => src}/components/theme/Provider.tsx (100%) rename {ui => src}/components/theme/Switcher.tsx (100%) rename {ui => src}/components/ui/Select.tsx (100%) delete mode 100644 src/config.ts delete mode 100644 src/db/index.ts rename {ui => src}/lib/actions.ts (100%) rename {ui => src}/lib/chains/imageSearchAgent.ts (100%) rename {ui => src}/lib/chains/suggestionGeneratorAgent.ts (100%) rename {ui => src}/lib/chains/videoSearchAgent.ts (100%) rename {ui => src}/lib/config.ts (97%) rename {ui => src}/lib/db/index.ts (100%) rename src/{ => lib}/db/schema.ts (100%) delete mode 100644 src/lib/huggingfaceTransformer.ts rename src/{ => lib}/prompts/academicSearch.ts (100%) rename src/{ => lib}/prompts/index.ts (100%) rename src/{ => lib}/prompts/redditSearch.ts (100%) rename src/{ => lib}/prompts/webSearch.ts (100%) rename src/{ => lib}/prompts/wolframAlpha.ts (100%) rename src/{ => lib}/prompts/writingAssistant.ts (100%) rename src/{ => lib}/prompts/youtubeSearch.ts (100%) delete mode 100644 src/lib/providers/transformers.ts rename {ui => src}/lib/search/metaSearchAgent.ts (100%) rename {ui => src}/lib/types/compute-dot.d.ts (100%) rename {ui => src}/lib/utils.ts (100%) rename {ui => src}/lib/utils/computeSimilarity.ts (100%) rename {ui => src}/lib/utils/documents.ts (100%) rename src/{ => lib}/utils/files.ts (100%) rename src/{ => lib}/utils/formatHistory.ts (100%) delete mode 100644 src/routes/chats.ts delete mode 100644 src/routes/config.ts delete mode 100644 src/routes/discover.ts delete mode 100644 src/routes/images.ts delete mode 100644 src/routes/index.ts delete mode 100644 src/routes/models.ts delete mode 100644 src/routes/search.ts delete mode 100644 src/routes/suggestions.ts delete mode 100644 src/routes/uploads.ts delete mode 100644 src/routes/videos.ts delete mode 100644 src/search/metaSearchAgent.ts delete mode 100644 src/utils/computeSimilarity.ts delete mode 100644 src/utils/documents.ts delete mode 100644 src/utils/logger.ts delete mode 100644 src/websocket/connectionManager.ts delete mode 100644 src/websocket/index.ts delete mode 100644 src/websocket/messageHandler.ts delete mode 100644 src/websocket/websocketServer.ts rename ui/tailwind.config.ts => tailwind.config.ts (88%) delete mode 100644 ui/.env.example delete mode 100644 ui/.gitignore delete mode 100644 ui/.prettierignore delete mode 100644 ui/.prettierrc.js delete mode 100644 ui/data/.gitignore delete mode 100644 ui/drizzle.config.ts delete mode 100644 ui/lib/db/schema.ts delete mode 100644 ui/lib/outputParsers/lineOutputParser.ts delete mode 100644 ui/lib/outputParsers/listLineOutputParser.ts delete mode 100644 ui/lib/prompts/academicSearch.ts delete mode 100644 ui/lib/prompts/index.ts delete mode 100644 ui/lib/prompts/redditSearch.ts delete mode 100644 ui/lib/prompts/webSearch.ts delete mode 100644 ui/lib/prompts/wolframAlpha.ts delete mode 100644 ui/lib/prompts/writingAssistant.ts delete mode 100644 ui/lib/prompts/youtubeSearch.ts delete mode 100644 ui/lib/providers/anthropic.ts delete mode 100644 ui/lib/providers/gemini.ts delete mode 100644 ui/lib/providers/groq.ts delete mode 100644 ui/lib/providers/index.ts delete mode 100644 ui/lib/providers/ollama.ts delete mode 100644 ui/lib/providers/openai.ts delete mode 100644 ui/lib/searxng.ts delete mode 100644 ui/lib/utils/files.ts delete mode 100644 ui/lib/utils/formatHistory.ts delete mode 100644 ui/package.json delete mode 100644 ui/tsconfig.json delete mode 100644 ui/uploads/.gitignore delete mode 100644 ui/yarn.lock diff --git a/ui/.eslintrc.json b/.eslintrc.json similarity index 100% rename from ui/.eslintrc.json rename to .eslintrc.json diff --git a/.gitignore b/.gitignore index 8391d19..c95173d 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,9 @@ npm-debug.log yarn-error.log # Build output -/.next/ -/out/ -/dist/ +.next/ +out/ +dist/ # IDE/Editor specific .vscode/ diff --git a/.prettierrc.js b/.prettierrc.js index 1937ff1..8ca480f 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -6,7 +6,6 @@ const config = { endOfLine: 'auto', singleQuote: true, tabWidth: 2, - semi: true, }; module.exports = config; diff --git a/app.dockerfile b/app.dockerfile index 488e64b..97c6a96 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,13 +1,20 @@ FROM node:20.18.0-alpine -ARG NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 -ARG NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api -ENV NEXT_PUBLIC_WS_URL=${NEXT_PUBLIC_WS_URL} -ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} - WORKDIR /home/perplexica -COPY ui /home/perplexica/ +COPY src /home/perplexica/src +COPY public /home/perplexica/public +COPY package.json /home/perplexica/package.json +COPY yarn.lock /home/perplexica/yarn.lock +COPY tsconfig.json /home/perplexica/tsconfig.json +COPY next.config.mjs /home/perplexica/next.config.mjs +COPY next-env.d.ts /home/perplexica/next-env.d.ts +COPY postcss.config.js /home/perplexica/postcss.config.js +COPY drizzle.config.ts /home/perplexica/drizzle.config.ts +COPY tailwind.config.ts /home/perplexica/tailwind.config.ts + +RUN mkdir /home/perplexica/data +RUN mkdir /home/perplexica/uploads RUN yarn install --frozen-lockfile RUN yarn build diff --git a/backend.dockerfile b/backend.dockerfile deleted file mode 100644 index b6ab95a..0000000 --- a/backend.dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM node:18-slim - -WORKDIR /home/perplexica - -COPY src /home/perplexica/src -COPY tsconfig.json /home/perplexica/ -COPY drizzle.config.ts /home/perplexica/ -COPY package.json /home/perplexica/ -COPY yarn.lock /home/perplexica/ - -RUN mkdir /home/perplexica/data -RUN mkdir /home/perplexica/uploads - -RUN yarn install --frozen-lockfile --network-timeout 600000 -RUN yarn build - -CMD ["yarn", "start"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index a0e1d73..631e42b 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -9,41 +9,20 @@ services: - perplexica-network restart: unless-stopped - perplexica-backend: - build: - context: . - dockerfile: backend.dockerfile - image: itzcrazykns1337/perplexica-backend:main - environment: - - SEARXNG_API_URL=http://searxng:8080 - depends_on: - - searxng - ports: - - 3001:3001 - volumes: - - backend-dbstore:/home/perplexica/data - - uploads:/home/perplexica/uploads - - ./config.toml:/home/perplexica/config.toml - extra_hosts: - - 'host.docker.internal:host-gateway' - networks: - - perplexica-network - restart: unless-stopped - - perplexica-frontend: + app: build: context: . dockerfile: app.dockerfile - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - image: itzcrazykns1337/perplexica-frontend:main - depends_on: - - perplexica-backend + environment: + - SEARXNG_API_URL=http://searxng:8080 ports: - 3000:3000 networks: - perplexica-network + volumes: + - backend-dbstore:/home/perplexica/data + - uploads:/home/perplexica/uploads + - ./config.toml:/home/perplexica/config.toml restart: unless-stopped networks: diff --git a/drizzle.config.ts b/drizzle.config.ts index 9ac3ec5..58de9e0 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'drizzle-kit'; export default defineConfig({ dialect: 'sqlite', - schema: './src/db/schema.ts', + schema: './src/lib/db/schema.ts', out: './drizzle', dbCredentials: { url: './data/db.sqlite', diff --git a/next-env.d.ts b/next-env.d.ts new file mode 100644 index 0000000..1b3be08 --- /dev/null +++ b/next-env.d.ts @@ -0,0 +1,5 @@ +/// <reference types="next" /> +/// <reference types="next/image-types/global" /> + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/ui/next.config.mjs b/next.config.mjs similarity index 100% rename from ui/next.config.mjs rename to next.config.mjs diff --git a/package.json b/package.json index 6041377..c9314b4 100644 --- a/package.json +++ b/package.json @@ -1,53 +1,62 @@ { - "name": "perplexica-backend", + "name": "perplexica-frontend", "version": "1.10.0-rc3", "license": "MIT", "author": "ItzCrazyKns", "scripts": { - "start": "npm run db:push && node dist/app.js", - "build": "tsc", - "dev": "nodemon --ignore uploads/ src/app.ts ", - "db:push": "drizzle-kit push sqlite", - "format": "prettier . --check", - "format:write": "prettier . --write" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.10", - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/html-to-text": "^9.0.4", - "@types/multer": "^1.4.12", - "@types/pdf-parse": "^1.1.4", - "@types/readable-stream": "^4.0.11", - "@types/ws": "^8.5.12", - "drizzle-kit": "^0.22.7", - "nodemon": "^3.1.0", - "prettier": "^3.2.5", - "ts-node": "^10.9.2", - "typescript": "^5.4.3" + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push sqlite" }, "dependencies": { + "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", - "@langchain/anthropic": "^0.2.3", - "@langchain/community": "^0.2.16", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", "@langchain/openai": "^0.0.25", - "@langchain/google-genai": "^0.0.23", - "@xenova/transformers": "^2.17.1", - "axios": "^1.6.8", - "better-sqlite3": "^11.0.0", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", "compute-cosine-similarity": "^1.1.0", "compute-dot": "^1.1.0", - "cors": "^2.8.5", - "dotenv": "^16.4.5", - "drizzle-orm": "^0.31.2", - "express": "^4.19.2", + "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "langchain": "^0.1.30", - "mammoth": "^1.8.0", - "multer": "^1.4.5-lts.1", + "lucide-react": "^0.363.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", "pdf-parse": "^1.1.1", - "winston": "^3.13.0", - "ws": "^8.17.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" } } diff --git a/ui/postcss.config.js b/postcss.config.js similarity index 100% rename from ui/postcss.config.js rename to postcss.config.js diff --git a/ui/public/next.svg b/public/next.svg similarity index 100% rename from ui/public/next.svg rename to public/next.svg diff --git a/ui/public/vercel.svg b/public/vercel.svg similarity index 100% rename from ui/public/vercel.svg rename to public/vercel.svg diff --git a/sample.config.toml b/sample.config.toml index cddb19d..0a800a0 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -24,4 +24,4 @@ MODEL_NAME = "" API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [API_ENDPOINTS] -SEARXNG = "http://localhost:32768" # SearxNG API URL \ No newline at end of file +SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file diff --git a/src/app.ts b/src/app.ts deleted file mode 100644 index 96b3a0c..0000000 --- a/src/app.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { startWebSocketServer } from './websocket'; -import express from 'express'; -import cors from 'cors'; -import http from 'http'; -import routes from './routes'; -import { getPort } from './config'; -import logger from './utils/logger'; - -const port = getPort(); - -const app = express(); -const server = http.createServer(app); - -const corsOptions = { - origin: '*', -}; - -app.use(cors(corsOptions)); -app.use(express.json()); - -app.use('/api', routes); -app.get('/api', (_, res) => { - res.status(200).json({ status: 'ok' }); -}); - -server.listen(port, () => { - logger.info(`Server is running on port ${port}`); -}); - -startWebSocketServer(server); - -process.on('uncaughtException', (err, origin) => { - logger.error(`Uncaught Exception at ${origin}: ${err}`); -}); - -process.on('unhandledRejection', (reason, promise) => { - logger.error(`Unhandled Rejection at: ${promise}, reason: ${reason}`); -}); diff --git a/ui/app/api/chat/route.ts b/src/app/api/chat/route.ts similarity index 80% rename from ui/app/api/chat/route.ts rename to src/app/api/chat/route.ts index 0b130de..918fd48 100644 --- a/ui/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -3,16 +3,28 @@ import MetaSearchAgent from '@/lib/search/metaSearchAgent'; import crypto from 'crypto'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { EventEmitter } from 'stream'; -import { chatModelProviders, embeddingModelProviders } from '@/lib/providers'; +import { + chatModelProviders, + embeddingModelProviders, + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; import db from '@/lib/db'; import { chats, messages as messagesSchema } from '@/lib/db/schema'; import { and, eq, gt } from 'drizzle-orm'; import { getFileDetails } from '@/lib/utils/files'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { ChatOpenAI } from '@langchain/openai'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; -export const searchHandlers: Record<string, MetaSearchAgent> = { +const searchHandlers: Record<string, MetaSearchAgent> = { webSearch: new MetaSearchAgent({ activeEngines: [], queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, @@ -227,7 +239,7 @@ const handleHistorySave = async ( export const POST = async (req: Request) => { try { const body = (await req.json()) as Body; - const { message, chatModel, embeddingModel } = body; + const { message } = body; if (message.content === '') { return Response.json( @@ -238,50 +250,52 @@ export const POST = async (req: Request) => { ); } - const getProviderChatModels = chatModelProviders[chatModel.provider]; + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); - if (!getProviderChatModels) { - return Response.json( - { - message: 'Invalid chat model provider', + const chatModelProvider = + chatModelProviders[ + body.chatModel?.provider || Object.keys(chatModelProviders)[0] + ]; + const chatModel = + chatModelProvider[ + body.chatModel?.name || Object.keys(chatModelProvider)[0] + ]; + + const embeddingProvider = + embeddingModelProviders[ + body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0] + ]; + const embeddingModel = + embeddingProvider[ + body.embeddingModel?.name || Object.keys(embeddingProvider)[0] + ]; + + let llm: BaseChatModel | undefined; + let embedding = embeddingModel.model; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + openAIApiKey: getCustomOpenaiApiKey(), + modelName: getCustomOpenaiModelName(), + temperature: 0.7, + configuration: { + baseURL: getCustomOpenaiApiUrl(), }, - { status: 400 }, - ); + }) as unknown as BaseChatModel; + } else if (chatModelProvider && chatModel) { + llm = chatModel.model; } - const chatModels = await getProviderChatModels(); - - const llm = chatModels[chatModel.name].model; - if (!llm) { - return Response.json( - { - message: 'Invalid chat model', - }, - { status: 400 }, - ); + return Response.json({ error: 'Invalid chat model' }, { status: 400 }); } - const getProviderEmbeddingModels = - embeddingModelProviders[embeddingModel.provider]; - - if (!getProviderEmbeddingModels) { - return Response.json( - { - message: 'Invalid embedding model provider', - }, - { status: 400 }, - ); - } - - const embeddingModels = await getProviderEmbeddingModels(); - const embedding = embeddingModels[embeddingModel.name].model; - if (!embedding) { return Response.json( - { - message: 'Invalid embedding model', - }, + { error: 'Invalid embedding model' }, { status: 400 }, ); } diff --git a/ui/app/api/chats/[id]/route.ts b/src/app/api/chats/[id]/route.ts similarity index 100% rename from ui/app/api/chats/[id]/route.ts rename to src/app/api/chats/[id]/route.ts diff --git a/ui/app/api/chats/route.ts b/src/app/api/chats/route.ts similarity index 100% rename from ui/app/api/chats/route.ts rename to src/app/api/chats/route.ts diff --git a/ui/app/api/config/route.ts b/src/app/api/config/route.ts similarity index 100% rename from ui/app/api/config/route.ts rename to src/app/api/config/route.ts diff --git a/ui/app/api/discover/route.ts b/src/app/api/discover/route.ts similarity index 100% rename from ui/app/api/discover/route.ts rename to src/app/api/discover/route.ts diff --git a/ui/app/api/images/route.ts b/src/app/api/images/route.ts similarity index 92% rename from ui/app/api/images/route.ts rename to src/app/api/images/route.ts index 4114cbd..f0a6773 100644 --- a/ui/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -32,7 +32,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -55,7 +55,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/api/models/route.ts b/src/app/api/models/route.ts similarity index 100% rename from ui/app/api/models/route.ts rename to src/app/api/models/route.ts diff --git a/ui/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts similarity index 92% rename from ui/app/api/suggestions/route.ts rename to src/app/api/suggestions/route.ts index f28092e..4a931df 100644 --- a/ui/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -31,7 +31,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -54,7 +54,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/api/uploads/route.ts b/src/app/api/uploads/route.ts similarity index 100% rename from ui/app/api/uploads/route.ts rename to src/app/api/uploads/route.ts diff --git a/ui/app/api/videos/route.ts b/src/app/api/videos/route.ts similarity index 92% rename from ui/app/api/videos/route.ts rename to src/app/api/videos/route.ts index 9b4bf9f..6153490 100644 --- a/ui/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -6,7 +6,7 @@ import { } from '@/lib/config'; import { getAvailableChatModelProviders } from '@/lib/providers'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { AIMessage, HumanMessage } from '@langchain/core/messages'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { ChatOpenAI } from '@langchain/openai'; interface ChatModel { @@ -32,7 +32,7 @@ export const POST = async (req: Request) => { return new AIMessage(msg.content); } }) - .filter((msg) => msg !== undefined); + .filter((msg) => msg !== undefined) as BaseMessage[]; const chatModelProviders = await getAvailableChatModelProviders(); @@ -55,7 +55,7 @@ export const POST = async (req: Request) => { configuration: { baseURL: getCustomOpenaiApiUrl(), }, - }); + }) as unknown as BaseChatModel; } else if (chatModelProvider && chatModel) { llm = chatModel.model; } diff --git a/ui/app/c/[chatId]/page.tsx b/src/app/c/[chatId]/page.tsx similarity index 100% rename from ui/app/c/[chatId]/page.tsx rename to src/app/c/[chatId]/page.tsx diff --git a/ui/app/discover/page.tsx b/src/app/discover/page.tsx similarity index 100% rename from ui/app/discover/page.tsx rename to src/app/discover/page.tsx diff --git a/ui/app/favicon.ico b/src/app/favicon.ico similarity index 100% rename from ui/app/favicon.ico rename to src/app/favicon.ico diff --git a/ui/app/globals.css b/src/app/globals.css similarity index 100% rename from ui/app/globals.css rename to src/app/globals.css diff --git a/ui/app/layout.tsx b/src/app/layout.tsx similarity index 100% rename from ui/app/layout.tsx rename to src/app/layout.tsx diff --git a/ui/app/library/layout.tsx b/src/app/library/layout.tsx similarity index 100% rename from ui/app/library/layout.tsx rename to src/app/library/layout.tsx diff --git a/ui/app/library/page.tsx b/src/app/library/page.tsx similarity index 100% rename from ui/app/library/page.tsx rename to src/app/library/page.tsx diff --git a/ui/app/page.tsx b/src/app/page.tsx similarity index 100% rename from ui/app/page.tsx rename to src/app/page.tsx diff --git a/ui/app/settings/page.tsx b/src/app/settings/page.tsx similarity index 100% rename from ui/app/settings/page.tsx rename to src/app/settings/page.tsx diff --git a/src/chains/imageSearchAgent.ts b/src/chains/imageSearchAgent.ts deleted file mode 100644 index 167019f..0000000 --- a/src/chains/imageSearchAgent.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { searchSearxng } from '../lib/searxng'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; - -const imageSearchChainPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. -You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - -Example: -1. Follow up question: What is a cat? -Rephrased: A cat - -2. Follow up question: What is a car? How does it works? -Rephrased: Car working - -3. Follow up question: How does an AC work? -Rephrased: AC working - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -type ImageSearchChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const strParser = new StringOutputParser(); - -const createImageSearchChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: ImageSearchChainInput) => { - return formatChatHistoryAsString(input.chat_history); - }, - query: (input: ImageSearchChainInput) => { - return input.query; - }, - }), - PromptTemplate.fromTemplate(imageSearchChainPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - const res = await searchSearxng(input, { - engines: ['bing images', 'google images'], - }); - - const images = []; - - res.results.forEach((result) => { - if (result.img_src && result.url && result.title) { - images.push({ - img_src: result.img_src, - url: result.url, - title: result.title, - }); - } - }); - - return images.slice(0, 10); - }), - ]); -}; - -const handleImageSearch = ( - input: ImageSearchChainInput, - llm: BaseChatModel, -) => { - const imageSearchChain = createImageSearchChain(llm); - return imageSearchChain.invoke(input); -}; - -export default handleImageSearch; diff --git a/src/chains/suggestionGeneratorAgent.ts b/src/chains/suggestionGeneratorAgent.ts deleted file mode 100644 index 6ba255d..0000000 --- a/src/chains/suggestionGeneratorAgent.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { RunnableSequence, RunnableMap } from '@langchain/core/runnables'; -import ListLineOutputParser from '../lib/outputParsers/listLineOutputParser'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { ChatOpenAI } from '@langchain/openai'; - -const suggestionGeneratorPrompt = ` -You are an AI suggestion generator for an AI powered search engine. You will be given a conversation below. You need to generate 4-5 suggestions based on the conversation. The suggestion should be relevant to the conversation that can be used by the user to ask the chat model for more information. -You need to make sure the suggestions are relevant to the conversation and are helpful to the user. Keep a note that the user might use these suggestions to ask a chat model for more information. -Make sure the suggestions are medium in length and are informative and relevant to the conversation. - -Provide these suggestions separated by newlines between the XML tags <suggestions> and </suggestions>. For example: - -<suggestions> -Tell me more about SpaceX and their recent projects -What is the latest news on SpaceX? -Who is the CEO of SpaceX? -</suggestions> - -Conversation: -{chat_history} -`; - -type SuggestionGeneratorInput = { - chat_history: BaseMessage[]; -}; - -const outputParser = new ListLineOutputParser({ - key: 'suggestions', -}); - -const createSuggestionGeneratorChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: SuggestionGeneratorInput) => - formatChatHistoryAsString(input.chat_history), - }), - PromptTemplate.fromTemplate(suggestionGeneratorPrompt), - llm, - outputParser, - ]); -}; - -const generateSuggestions = ( - input: SuggestionGeneratorInput, - llm: BaseChatModel, -) => { - (llm as unknown as ChatOpenAI).temperature = 0; - const suggestionGeneratorChain = createSuggestionGeneratorChain(llm); - return suggestionGeneratorChain.invoke(input); -}; - -export default generateSuggestions; diff --git a/src/chains/videoSearchAgent.ts b/src/chains/videoSearchAgent.ts deleted file mode 100644 index cdd1ac0..0000000 --- a/src/chains/videoSearchAgent.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { - RunnableSequence, - RunnableMap, - RunnableLambda, -} from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import { searchSearxng } from '../lib/searxng'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; - -const VideoSearchChainPrompt = ` - You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. - You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - - Example: - 1. Follow up question: How does a car work? - Rephrased: How does a car work? - - 2. Follow up question: What is the theory of relativity? - Rephrased: What is theory of relativity - - 3. Follow up question: How does an AC work? - Rephrased: How does an AC work - - Conversation: - {chat_history} - - Follow up question: {query} - Rephrased question: - `; - -type VideoSearchChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -const strParser = new StringOutputParser(); - -const createVideoSearchChain = (llm: BaseChatModel) => { - return RunnableSequence.from([ - RunnableMap.from({ - chat_history: (input: VideoSearchChainInput) => { - return formatChatHistoryAsString(input.chat_history); - }, - query: (input: VideoSearchChainInput) => { - return input.query; - }, - }), - PromptTemplate.fromTemplate(VideoSearchChainPrompt), - llm, - strParser, - RunnableLambda.from(async (input: string) => { - const res = await searchSearxng(input, { - engines: ['youtube'], - }); - - const videos = []; - - res.results.forEach((result) => { - if ( - result.thumbnail && - result.url && - result.title && - result.iframe_src - ) { - videos.push({ - img_src: result.thumbnail, - url: result.url, - title: result.title, - iframe_src: result.iframe_src, - }); - } - }); - - return videos.slice(0, 10); - }), - ]); -}; - -const handleVideoSearch = ( - input: VideoSearchChainInput, - llm: BaseChatModel, -) => { - const VideoSearchChain = createVideoSearchChain(llm); - return VideoSearchChain.invoke(input); -}; - -export default handleVideoSearch; diff --git a/ui/components/Chat.tsx b/src/components/Chat.tsx similarity index 100% rename from ui/components/Chat.tsx rename to src/components/Chat.tsx diff --git a/ui/components/ChatWindow.tsx b/src/components/ChatWindow.tsx similarity index 73% rename from ui/components/ChatWindow.tsx rename to src/components/ChatWindow.tsx index f642525..47bbab2 100644 --- a/ui/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -45,159 +45,138 @@ const checkConfig = async ( setIsConfigReady: (ready: boolean) => void, setHasError: (hasError: boolean) => void, ) => { - useEffect(() => { - const checkConfig = async () => { - try { - let chatModel = localStorage.getItem('chatModel'); - let chatModelProvider = localStorage.getItem('chatModelProvider'); - let embeddingModel = localStorage.getItem('embeddingModel'); - let embeddingModelProvider = localStorage.getItem( - 'embeddingModelProvider', + try { + let chatModel = localStorage.getItem('chatModel'); + let chatModelProvider = localStorage.getItem('chatModelProvider'); + let embeddingModel = localStorage.getItem('embeddingModel'); + let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (!autoImageSearch) { + localStorage.setItem('autoImageSearch', 'true'); + } + + if (!autoVideoSearch) { + localStorage.setItem('autoVideoSearch', 'false'); + } + + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', + }, + }).then(async (res) => { + if (!res.ok) + throw new Error( + `Failed to fetch models: ${res.status} ${res.statusText}`, ); + return res.json(); + }); - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + if ( + !chatModel || + !chatModelProvider || + !embeddingModel || + !embeddingModelProvider + ) { + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; - if (!autoImageSearch) { - localStorage.setItem('autoImageSearch', 'true'); - } + chatModelProvider = + chatModelProvider || Object.keys(chatModelProviders)[0]; - if (!autoVideoSearch) { - localStorage.setItem('autoVideoSearch', 'false'); - } + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - const providers = await fetch(`/api/models`, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(async (res) => { - if (!res.ok) - throw new Error( - `Failed to fetch models: ${res.status} ${res.statusText}`, - ); - return res.json(); - }); + if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) + return toast.error('No chat models available'); + } + + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; if ( - !chatModel || - !chatModelProvider || - !embeddingModel || - !embeddingModelProvider - ) { - if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders; + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); - chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; - - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) - return toast.error('No chat models available'); - } - - if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); - - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - } - - localStorage.setItem('chatModel', chatModel!); - localStorage.setItem('chatModelProvider', chatModelProvider); - localStorage.setItem('embeddingModel', embeddingModel!); - localStorage.setItem( - 'embeddingModelProvider', - embeddingModelProvider, - ); - } else { - const chatModelProviders = providers.chatModelProviders; - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - Object.keys(chatModelProviders).length > 0 && - !chatModelProviders[chatModelProvider] - ) { - const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvidersKeys.find( - (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; - - localStorage.setItem('chatModelProvider', chatModelProvider); - } - - if ( - chatModelProvider && - !chatModelProviders[chatModelProvider][chatModel] - ) { - chatModel = Object.keys( - chatModelProviders[ - Object.keys(chatModelProviders[chatModelProvider]).length > 0 - ? chatModelProvider - : Object.keys(chatModelProviders)[0] - ], - )[0]; - localStorage.setItem('chatModel', chatModel); - } - - if ( - Object.keys(embeddingModelProviders).length > 0 && - !embeddingModelProviders[embeddingModelProvider] - ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - localStorage.setItem( - 'embeddingModelProvider', - embeddingModelProvider, - ); - } - - if ( - embeddingModelProvider && - !embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - localStorage.setItem('embeddingModel', embeddingModel); - } - } - - setChatModelProvider({ - name: chatModel!, - provider: chatModelProvider, - }); - - setEmbeddingModelProvider({ - name: embeddingModel!, - provider: embeddingModelProvider, - }); - - setIsConfigReady(true); - } catch (err) { - console.error( - 'An error occurred while checking the configuration:', - err, - ); - setIsConfigReady(false); - setHasError(true); + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; } - }; - checkConfig(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); + localStorage.setItem('chatModel', chatModel!); + localStorage.setItem('chatModelProvider', chatModelProvider); + localStorage.setItem('embeddingModel', embeddingModel!); + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } else { + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + Object.keys(chatModelProviders).length > 0 && + !chatModelProviders[chatModelProvider] + ) { + const chatModelProvidersKeys = Object.keys(chatModelProviders); + chatModelProvider = + chatModelProvidersKeys.find( + (key) => Object.keys(chatModelProviders[key]).length > 0, + ) || chatModelProvidersKeys[0]; + + localStorage.setItem('chatModelProvider', chatModelProvider); + } + + if ( + chatModelProvider && + !chatModelProviders[chatModelProvider][chatModel] + ) { + chatModel = Object.keys( + chatModelProviders[ + Object.keys(chatModelProviders[chatModelProvider]).length > 0 + ? chatModelProvider + : Object.keys(chatModelProviders)[0] + ], + )[0]; + localStorage.setItem('chatModel', chatModel); + } + + if ( + Object.keys(embeddingModelProviders).length > 0 && + !embeddingModelProviders[embeddingModelProvider] + ) { + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } + + if ( + embeddingModelProvider && + !embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); + } + } + + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, + }); + + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); + + setIsConfigReady(true); + } catch (err) { + console.error('An error occurred while checking the configuration:', err); + setIsConfigReady(false); + setHasError(true); + } }; const loadMessages = async ( @@ -282,12 +261,15 @@ const ChatWindow = ({ id }: { id?: string }) => { const [hasError, setHasError] = useState(false); const [isReady, setIsReady] = useState(false); - checkConfig( - setChatModelProvider, - setEmbeddingModelProvider, - setIsConfigReady, - setHasError, - ); + useEffect(() => { + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, + setHasError, + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); const [loading, setLoading] = useState(false); const [messageAppeared, setMessageAppeared] = useState(false); diff --git a/ui/components/DeleteChat.tsx b/src/components/DeleteChat.tsx similarity index 100% rename from ui/components/DeleteChat.tsx rename to src/components/DeleteChat.tsx diff --git a/ui/components/EmptyChat.tsx b/src/components/EmptyChat.tsx similarity index 100% rename from ui/components/EmptyChat.tsx rename to src/components/EmptyChat.tsx diff --git a/ui/components/EmptyChatMessageInput.tsx b/src/components/EmptyChatMessageInput.tsx similarity index 100% rename from ui/components/EmptyChatMessageInput.tsx rename to src/components/EmptyChatMessageInput.tsx diff --git a/ui/components/Layout.tsx b/src/components/Layout.tsx similarity index 100% rename from ui/components/Layout.tsx rename to src/components/Layout.tsx diff --git a/ui/components/MessageActions/Copy.tsx b/src/components/MessageActions/Copy.tsx similarity index 100% rename from ui/components/MessageActions/Copy.tsx rename to src/components/MessageActions/Copy.tsx diff --git a/ui/components/MessageActions/Rewrite.tsx b/src/components/MessageActions/Rewrite.tsx similarity index 100% rename from ui/components/MessageActions/Rewrite.tsx rename to src/components/MessageActions/Rewrite.tsx diff --git a/ui/components/MessageBox.tsx b/src/components/MessageBox.tsx similarity index 100% rename from ui/components/MessageBox.tsx rename to src/components/MessageBox.tsx diff --git a/ui/components/MessageBoxLoading.tsx b/src/components/MessageBoxLoading.tsx similarity index 100% rename from ui/components/MessageBoxLoading.tsx rename to src/components/MessageBoxLoading.tsx diff --git a/ui/components/MessageInput.tsx b/src/components/MessageInput.tsx similarity index 100% rename from ui/components/MessageInput.tsx rename to src/components/MessageInput.tsx diff --git a/ui/components/MessageInputActions/Attach.tsx b/src/components/MessageInputActions/Attach.tsx similarity index 100% rename from ui/components/MessageInputActions/Attach.tsx rename to src/components/MessageInputActions/Attach.tsx diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/src/components/MessageInputActions/AttachSmall.tsx similarity index 100% rename from ui/components/MessageInputActions/AttachSmall.tsx rename to src/components/MessageInputActions/AttachSmall.tsx diff --git a/ui/components/MessageInputActions/Copilot.tsx b/src/components/MessageInputActions/Copilot.tsx similarity index 100% rename from ui/components/MessageInputActions/Copilot.tsx rename to src/components/MessageInputActions/Copilot.tsx diff --git a/ui/components/MessageInputActions/Focus.tsx b/src/components/MessageInputActions/Focus.tsx similarity index 100% rename from ui/components/MessageInputActions/Focus.tsx rename to src/components/MessageInputActions/Focus.tsx diff --git a/ui/components/MessageInputActions/Optimization.tsx b/src/components/MessageInputActions/Optimization.tsx similarity index 100% rename from ui/components/MessageInputActions/Optimization.tsx rename to src/components/MessageInputActions/Optimization.tsx diff --git a/ui/components/MessageSources.tsx b/src/components/MessageSources.tsx similarity index 100% rename from ui/components/MessageSources.tsx rename to src/components/MessageSources.tsx diff --git a/ui/components/Navbar.tsx b/src/components/Navbar.tsx similarity index 100% rename from ui/components/Navbar.tsx rename to src/components/Navbar.tsx diff --git a/ui/components/SearchImages.tsx b/src/components/SearchImages.tsx similarity index 100% rename from ui/components/SearchImages.tsx rename to src/components/SearchImages.tsx diff --git a/ui/components/SearchVideos.tsx b/src/components/SearchVideos.tsx similarity index 100% rename from ui/components/SearchVideos.tsx rename to src/components/SearchVideos.tsx diff --git a/ui/components/Sidebar.tsx b/src/components/Sidebar.tsx similarity index 100% rename from ui/components/Sidebar.tsx rename to src/components/Sidebar.tsx diff --git a/ui/components/theme/Provider.tsx b/src/components/theme/Provider.tsx similarity index 100% rename from ui/components/theme/Provider.tsx rename to src/components/theme/Provider.tsx diff --git a/ui/components/theme/Switcher.tsx b/src/components/theme/Switcher.tsx similarity index 100% rename from ui/components/theme/Switcher.tsx rename to src/components/theme/Switcher.tsx diff --git a/ui/components/ui/Select.tsx b/src/components/ui/Select.tsx similarity index 100% rename from ui/components/ui/Select.tsx rename to src/components/ui/Select.tsx diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index ab2a5db..0000000 --- a/src/config.ts +++ /dev/null @@ -1,117 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import toml from '@iarna/toml'; - -const configFileName = 'config.toml'; - -interface Config { - GENERAL: { - PORT: number; - SIMILARITY_MEASURE: string; - KEEP_ALIVE: string; - }; - MODELS: { - OPENAI: { - API_KEY: string; - }; - GROQ: { - API_KEY: string; - }; - ANTHROPIC: { - API_KEY: string; - }; - GEMINI: { - API_KEY: string; - }; - OLLAMA: { - API_URL: string; - }; - CUSTOM_OPENAI: { - API_URL: string; - API_KEY: string; - MODEL_NAME: string; - }; - }; - API_ENDPOINTS: { - SEARXNG: string; - }; -} - -type RecursivePartial<T> = { - [P in keyof T]?: RecursivePartial<T[P]>; -}; - -const loadConfig = () => - toml.parse( - fs.readFileSync(path.join(__dirname, `../${configFileName}`), 'utf-8'), - ) as any as Config; - -export const getPort = () => loadConfig().GENERAL.PORT; - -export const getSimilarityMeasure = () => - loadConfig().GENERAL.SIMILARITY_MEASURE; - -export const getKeepAlive = () => loadConfig().GENERAL.KEEP_ALIVE; - -export const getOpenaiApiKey = () => loadConfig().MODELS.OPENAI.API_KEY; - -export const getGroqApiKey = () => loadConfig().MODELS.GROQ.API_KEY; - -export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; - -export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; - -export const getSearxngApiEndpoint = () => - process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; - -export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; - -export const getCustomOpenaiApiKey = () => - loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; - -export const getCustomOpenaiApiUrl = () => - loadConfig().MODELS.CUSTOM_OPENAI.API_URL; - -export const getCustomOpenaiModelName = () => - loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; - -const mergeConfigs = (current: any, update: any): any => { - if (update === null || update === undefined) { - return current; - } - - if (typeof current !== 'object' || current === null) { - return update; - } - - const result = { ...current }; - - for (const key in update) { - if (Object.prototype.hasOwnProperty.call(update, key)) { - const updateValue = update[key]; - - if ( - typeof updateValue === 'object' && - updateValue !== null && - typeof result[key] === 'object' && - result[key] !== null - ) { - result[key] = mergeConfigs(result[key], updateValue); - } else if (updateValue !== undefined) { - result[key] = updateValue; - } - } - } - - return result; -}; - -export const updateConfig = (config: RecursivePartial<Config>) => { - const currentConfig = loadConfig(); - const mergedConfig = mergeConfigs(currentConfig, config); - - fs.writeFileSync( - path.join(__dirname, `../${configFileName}`), - toml.stringify(mergedConfig), - ); -}; diff --git a/src/db/index.ts b/src/db/index.ts deleted file mode 100644 index b431b47..0000000 --- a/src/db/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { drizzle } from 'drizzle-orm/better-sqlite3'; -import Database from 'better-sqlite3'; -import * as schema from './schema'; - -const sqlite = new Database('data/db.sqlite'); -const db = drizzle(sqlite, { - schema: schema, -}); - -export default db; diff --git a/ui/lib/actions.ts b/src/lib/actions.ts similarity index 100% rename from ui/lib/actions.ts rename to src/lib/actions.ts diff --git a/ui/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts similarity index 100% rename from ui/lib/chains/imageSearchAgent.ts rename to src/lib/chains/imageSearchAgent.ts diff --git a/ui/lib/chains/suggestionGeneratorAgent.ts b/src/lib/chains/suggestionGeneratorAgent.ts similarity index 100% rename from ui/lib/chains/suggestionGeneratorAgent.ts rename to src/lib/chains/suggestionGeneratorAgent.ts diff --git a/ui/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts similarity index 100% rename from ui/lib/chains/videoSearchAgent.ts rename to src/lib/chains/videoSearchAgent.ts diff --git a/ui/lib/config.ts b/src/lib/config.ts similarity index 97% rename from ui/lib/config.ts rename to src/lib/config.ts index 489fec3..9a20ce5 100644 --- a/ui/lib/config.ts +++ b/src/lib/config.ts @@ -62,7 +62,7 @@ export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; export const getSearxngApiEndpoint = () => - process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; + loadConfig().API_ENDPOINTS.SEARXNG || process.env.SEARXNG_API_URL; export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; diff --git a/ui/lib/db/index.ts b/src/lib/db/index.ts similarity index 100% rename from ui/lib/db/index.ts rename to src/lib/db/index.ts diff --git a/src/db/schema.ts b/src/lib/db/schema.ts similarity index 100% rename from src/db/schema.ts rename to src/lib/db/schema.ts diff --git a/src/lib/huggingfaceTransformer.ts b/src/lib/huggingfaceTransformer.ts deleted file mode 100644 index 7a959ca..0000000 --- a/src/lib/huggingfaceTransformer.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Embeddings, type EmbeddingsParams } from '@langchain/core/embeddings'; -import { chunkArray } from '@langchain/core/utils/chunk_array'; - -export interface HuggingFaceTransformersEmbeddingsParams - extends EmbeddingsParams { - modelName: string; - - model: string; - - timeout?: number; - - batchSize?: number; - - stripNewLines?: boolean; -} - -export class HuggingFaceTransformersEmbeddings - extends Embeddings - implements HuggingFaceTransformersEmbeddingsParams -{ - modelName = 'Xenova/all-MiniLM-L6-v2'; - - model = 'Xenova/all-MiniLM-L6-v2'; - - batchSize = 512; - - stripNewLines = true; - - timeout?: number; - - private pipelinePromise: Promise<any>; - - constructor(fields?: Partial<HuggingFaceTransformersEmbeddingsParams>) { - super(fields ?? {}); - - this.modelName = fields?.model ?? fields?.modelName ?? this.model; - this.model = this.modelName; - this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; - this.timeout = fields?.timeout; - } - - async embedDocuments(texts: string[]): Promise<number[][]> { - const batches = chunkArray( - this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts, - this.batchSize, - ); - - const batchRequests = batches.map((batch) => this.runEmbedding(batch)); - const batchResponses = await Promise.all(batchRequests); - const embeddings: number[][] = []; - - for (let i = 0; i < batchResponses.length; i += 1) { - const batchResponse = batchResponses[i]; - for (let j = 0; j < batchResponse.length; j += 1) { - embeddings.push(batchResponse[j]); - } - } - - return embeddings; - } - - async embedQuery(text: string): Promise<number[]> { - const data = await this.runEmbedding([ - this.stripNewLines ? text.replace(/\n/g, ' ') : text, - ]); - return data[0]; - } - - private async runEmbedding(texts: string[]) { - const { pipeline } = await import('@xenova/transformers'); - - const pipe = await (this.pipelinePromise ??= pipeline( - 'feature-extraction', - this.model, - )); - - return this.caller.call(async () => { - const output = await pipe(texts, { pooling: 'mean', normalize: true }); - return output.tolist(); - }); - } -} diff --git a/src/lib/outputParsers/lineOutputParser.ts b/src/lib/outputParsers/lineOutputParser.ts index 08711aa..fcd69ef 100644 --- a/src/lib/outputParsers/lineOutputParser.ts +++ b/src/lib/outputParsers/lineOutputParser.ts @@ -9,7 +9,7 @@ class LineOutputParser extends BaseOutputParser<string> { constructor(args?: LineOutputParserArgs) { super(); - this.key = args.key ?? this.key; + this.key = args?.key ?? this.key; } static lc_name() { diff --git a/src/lib/outputParsers/listLineOutputParser.ts b/src/lib/outputParsers/listLineOutputParser.ts index f465ef1..6409db9 100644 --- a/src/lib/outputParsers/listLineOutputParser.ts +++ b/src/lib/outputParsers/listLineOutputParser.ts @@ -9,7 +9,7 @@ class LineListOutputParser extends BaseOutputParser<string[]> { constructor(args?: LineListOutputParserArgs) { super(); - this.key = args.key ?? this.key; + this.key = args?.key ?? this.key; } static lc_name() { diff --git a/src/prompts/academicSearch.ts b/src/lib/prompts/academicSearch.ts similarity index 100% rename from src/prompts/academicSearch.ts rename to src/lib/prompts/academicSearch.ts diff --git a/src/prompts/index.ts b/src/lib/prompts/index.ts similarity index 100% rename from src/prompts/index.ts rename to src/lib/prompts/index.ts diff --git a/src/prompts/redditSearch.ts b/src/lib/prompts/redditSearch.ts similarity index 100% rename from src/prompts/redditSearch.ts rename to src/lib/prompts/redditSearch.ts diff --git a/src/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts similarity index 100% rename from src/prompts/webSearch.ts rename to src/lib/prompts/webSearch.ts diff --git a/src/prompts/wolframAlpha.ts b/src/lib/prompts/wolframAlpha.ts similarity index 100% rename from src/prompts/wolframAlpha.ts rename to src/lib/prompts/wolframAlpha.ts diff --git a/src/prompts/writingAssistant.ts b/src/lib/prompts/writingAssistant.ts similarity index 100% rename from src/prompts/writingAssistant.ts rename to src/lib/prompts/writingAssistant.ts diff --git a/src/prompts/youtubeSearch.ts b/src/lib/prompts/youtubeSearch.ts similarity index 100% rename from src/prompts/youtubeSearch.ts rename to src/lib/prompts/youtubeSearch.ts diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 642a6cb..e44d70d 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,6 +1,38 @@ -import { ChatAnthropic } from '@langchain/anthropic'; -import { getAnthropicApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { ChatOpenAI } from '@langchain/openai'; +import { ChatModel } from '.'; +import { getAnthropicApiKey } from '../config'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 3.7 Sonnet', + key: 'claude-3-7-sonnet-20250219', + }, + { + displayName: 'Claude 3.5 Haiku', + key: 'claude-3-5-haiku-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet v2', + key: 'claude-3-5-sonnet-20241022', + }, + { + displayName: 'Claude 3.5 Sonnet', + key: 'claude-3-5-sonnet-20240620', + }, + { + displayName: 'Claude 3 Opus', + key: 'claude-3-opus-20240229', + }, + { + displayName: 'Claude 3 Sonnet', + key: 'claude-3-sonnet-20240229', + }, + { + displayName: 'Claude 3 Haiku', + key: 'claude-3-haiku-20240307', + }, +]; export const loadAnthropicChatModels = async () => { const anthropicApiKey = getAnthropicApiKey(); @@ -8,52 +40,25 @@ export const loadAnthropicChatModels = async () => { if (!anthropicApiKey) return {}; try { - const chatModels = { - 'claude-3-5-sonnet-20241022': { - displayName: 'Claude 3.5 Sonnet', - model: new ChatAnthropic({ + const chatModels: Record<string, ChatModel> = {}; + + anthropicChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: anthropicApiKey, + modelName: model.key, temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-sonnet-20241022', - }), - }, - 'claude-3-5-haiku-20241022': { - displayName: 'Claude 3.5 Haiku', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-5-haiku-20241022', - }), - }, - 'claude-3-opus-20240229': { - displayName: 'Claude 3 Opus', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-opus-20240229', - }), - }, - 'claude-3-sonnet-20240229': { - displayName: 'Claude 3 Sonnet', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-sonnet-20240229', - }), - }, - 'claude-3-haiku-20240307': { - displayName: 'Claude 3 Haiku', - model: new ChatAnthropic({ - temperature: 0.7, - anthropicApiKey: anthropicApiKey, - model: 'claude-3-haiku-20240307', - }), - }, - }; + configuration: { + baseURL: 'https://api.anthropic.com/v1/', + }, + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Anthropic models: ${err}`); + console.error(`Error loading Anthropic models: ${err}`); return {}; } }; diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index d20c9b8..6806fb6 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -1,9 +1,42 @@ -import { - ChatGoogleGenerativeAI, - GoogleGenerativeAIEmbeddings, -} from '@langchain/google-genai'; -import { getGeminiApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getGeminiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.0 Flash', + key: 'gemini-2.0-flash', + }, + { + displayName: 'Gemini 2.0 Flash-Lite', + key: 'gemini-2.0-flash-lite', + }, + { + displayName: 'Gemini 2.0 Pro Experimental', + key: 'gemini-2.0-pro-exp-02-05', + }, + { + displayName: 'Gemini 1.5 Flash', + key: 'gemini-1.5-flash', + }, + { + displayName: 'Gemini 1.5 Flash-8B', + key: 'gemini-1.5-flash-8b', + }, + { + displayName: 'Gemini 1.5 Pro', + key: 'gemini-1.5-pro', + }, +]; + +const geminiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Gemini Embedding', + key: 'gemini-embedding-exp', + }, +]; export const loadGeminiChatModels = async () => { const geminiApiKey = getGeminiApiKey(); @@ -11,75 +44,53 @@ export const loadGeminiChatModels = async () => { if (!geminiApiKey) return {}; try { - const chatModels = { - 'gemini-1.5-flash': { - displayName: 'Gemini 1.5 Flash', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-flash', + const chatModels: Record<string, ChatModel> = {}; + + geminiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: geminiApiKey, + modelName: model.key, temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-1.5-flash-8b': { - displayName: 'Gemini 1.5 Flash 8B', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-flash-8b', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-1.5-pro': { - displayName: 'Gemini 1.5 Pro', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-1.5-pro', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-2.0-flash-exp': { - displayName: 'Gemini 2.0 Flash Exp', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-2.0-flash-exp', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - 'gemini-2.0-flash-thinking-exp-01-21': { - displayName: 'Gemini 2.0 Flash Thinking Exp 01-21', - model: new ChatGoogleGenerativeAI({ - modelName: 'gemini-2.0-flash-thinking-exp-01-21', - temperature: 0.7, - apiKey: geminiApiKey, - }), - }, - }; + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Gemini models: ${err}`); + console.error(`Error loading Gemini models: ${err}`); return {}; } }; -export const loadGeminiEmbeddingsModels = async () => { +export const loadGeminiEmbeddingModels = async () => { const geminiApiKey = getGeminiApiKey(); if (!geminiApiKey) return {}; try { - const embeddingModels = { - 'text-embedding-004': { - displayName: 'Text Embedding', - model: new GoogleGenerativeAIEmbeddings({ - apiKey: geminiApiKey, - modelName: 'text-embedding-004', - }), - }, - }; + const embeddingModels: Record<string, EmbeddingModel> = {}; + + geminiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, + model: new OpenAIEmbeddings({ + openAIApiKey: geminiApiKey, + modelName: model.key, + configuration: { + baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', + }, + }) as unknown as Embeddings, + }; + }); return embeddingModels; } catch (err) { - logger.error(`Error loading Gemini embeddings model: ${err}`); + console.error(`Error loading OpenAI embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 41004ec..6377690 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,6 +1,82 @@ import { ChatOpenAI } from '@langchain/openai'; -import { getGroqApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { getGroqApiKey } from '../config'; +import { ChatModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const groqChatModels: Record<string, string>[] = [ + { + displayName: 'Gemma2 9B IT', + key: 'gemma2-9b-it', + }, + { + displayName: 'Llama 3.3 70B Versatile', + key: 'llama-3.3-70b-versatile', + }, + { + displayName: 'Llama 3.1 8B Instant', + key: 'llama-3.1-8b-instant', + }, + { + displayName: 'Llama3 70B 8192', + key: 'llama3-70b-8192', + }, + { + displayName: 'Llama3 8B 8192', + key: 'llama3-8b-8192', + }, + { + displayName: 'Mixtral 8x7B 32768', + key: 'mixtral-8x7b-32768', + }, + { + displayName: 'Qwen QWQ 32B (Preview)', + key: 'qwen-qwq-32b', + }, + { + displayName: 'Mistral Saba 24B (Preview)', + key: 'mistral-saba-24b', + }, + { + displayName: 'Qwen 2.5 Coder 32B (Preview)', + key: 'qwen-2.5-coder-32b', + }, + { + displayName: 'Qwen 2.5 32B (Preview)', + key: 'qwen-2.5-32b', + }, + { + displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', + key: 'deepseek-r1-distill-qwen-32b', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', + key: 'deepseek-r1-distill-llama-70b-specdec', + }, + { + displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', + key: 'deepseek-r1-distill-llama-70b', + }, + { + displayName: 'Llama 3.3 70B SpecDec (Preview)', + key: 'llama-3.3-70b-specdec', + }, + { + displayName: 'Llama 3.2 1B Preview (Preview)', + key: 'llama-3.2-1b-preview', + }, + { + displayName: 'Llama 3.2 3B Preview (Preview)', + key: 'llama-3.2-3b-preview', + }, + { + displayName: 'Llama 3.2 11B Vision Preview (Preview)', + key: 'llama-3.2-11b-vision-preview', + }, + { + displayName: 'Llama 3.2 90B Vision Preview (Preview)', + key: 'llama-3.2-90b-vision-preview', + }, +]; export const loadGroqChatModels = async () => { const groqApiKey = getGroqApiKey(); @@ -8,129 +84,25 @@ export const loadGroqChatModels = async () => { if (!groqApiKey) return {}; try { - const chatModels = { - 'llama-3.3-70b-versatile': { - displayName: 'Llama 3.3 70B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.3-70b-versatile', - temperature: 0.7, - }, - { + const chatModels: Record<string, ChatModel> = {}; + + groqChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: groqApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { baseURL: 'https://api.groq.com/openai/v1', }, - ), - }, - 'llama-3.2-3b-preview': { - displayName: 'Llama 3.2 3B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-3b-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.2-11b-vision-preview': { - displayName: 'Llama 3.2 11B Vision', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-11b-vision-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.2-90b-vision-preview': { - displayName: 'Llama 3.2 90B Vision', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.2-90b-vision-preview', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama-3.1-8b-instant': { - displayName: 'Llama 3.1 8B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama-3.1-8b-instant', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama3-8b-8192': { - displayName: 'LLaMA3 8B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-8b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'llama3-70b-8192': { - displayName: 'LLaMA3 70B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'llama3-70b-8192', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'mixtral-8x7b-32768': { - displayName: 'Mixtral 8x7B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'mixtral-8x7b-32768', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - 'gemma2-9b-it': { - displayName: 'Gemma2 9B', - model: new ChatOpenAI( - { - openAIApiKey: groqApiKey, - modelName: 'gemma2-9b-it', - temperature: 0.7, - }, - { - baseURL: 'https://api.groq.com/openai/v1', - }, - ), - }, - }; + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading Groq models: ${err}`); + console.error(`Error loading Groq models: ${err}`); return {}; } }; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 57e9185..3b3cf63 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,33 +1,49 @@ -import { loadGroqChatModels } from './groq'; -import { loadOllamaChatModels, loadOllamaEmbeddingsModels } from './ollama'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingsModels } from './openai'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadTransformersEmbeddingsModels } from './transformers'; -import { loadGeminiChatModels, loadGeminiEmbeddingsModels } from './gemini'; +import { Embeddings } from '@langchain/core/embeddings'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, -} from '../../config'; +} from '../config'; import { ChatOpenAI } from '@langchain/openai'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; +import { loadGroqChatModels } from './groq'; +import { loadAnthropicChatModels } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -const chatModelProviders = { +export interface ChatModel { + displayName: string; + model: BaseChatModel; +} + +export interface EmbeddingModel { + displayName: string; + model: Embeddings; +} + +export const chatModelProviders: Record< + string, + () => Promise<Record<string, ChatModel>> +> = { openai: loadOpenAIChatModels, - groq: loadGroqChatModels, ollama: loadOllamaChatModels, + groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, }; -const embeddingModelProviders = { - openai: loadOpenAIEmbeddingsModels, - local: loadTransformersEmbeddingsModels, - ollama: loadOllamaEmbeddingsModels, - gemini: loadGeminiEmbeddingsModels, +export const embeddingModelProviders: Record< + string, + () => Promise<Record<string, EmbeddingModel>> +> = { + openai: loadOpenAIEmbeddingModels, + ollama: loadOllamaEmbeddingModels, + gemini: loadGeminiEmbeddingModels, }; export const getAvailableChatModelProviders = async () => { - const models = {}; + const models: Record<string, Record<string, ChatModel>> = {}; for (const provider in chatModelProviders) { const providerModels = await chatModelProviders[provider](); @@ -52,7 +68,7 @@ export const getAvailableChatModelProviders = async () => { configuration: { baseURL: customOpenAiApiUrl, }, - }), + }) as unknown as BaseChatModel, }, } : {}), @@ -62,7 +78,7 @@ export const getAvailableChatModelProviders = async () => { }; export const getAvailableEmbeddingModelProviders = async () => { - const models = {}; + const models: Record<string, Record<string, EmbeddingModel>> = {}; for (const provider in embeddingModelProviders) { const providerModels = await embeddingModelProviders[provider](); diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index 7277b27..92e98e4 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,74 +1,73 @@ -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; -import { getKeepAlive, getOllamaApiEndpoint } from '../../config'; -import logger from '../../utils/logger'; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; import axios from 'axios'; +import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOllama } from '@langchain/community/chat_models/ollama'; +import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; export const loadOllamaChatModels = async () => { - const ollamaEndpoint = getOllamaApiEndpoint(); - const keepAlive = getKeepAlive(); + const ollamaApiEndpoint = getOllamaApiEndpoint(); - if (!ollamaEndpoint) return {}; + if (!ollamaApiEndpoint) return {}; try { - const response = await axios.get(`${ollamaEndpoint}/api/tags`, { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = response.data; + const { models } = res.data; - const chatModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = { + const chatModels: Record<string, ChatModel> = {}; + + models.forEach((model: any) => { + chatModels[model.model] = { displayName: model.name, model: new ChatOllama({ - baseUrl: ollamaEndpoint, + baseUrl: ollamaApiEndpoint, model: model.model, temperature: 0.7, - keepAlive: keepAlive, + keepAlive: getKeepAlive(), }), }; - - return acc; - }, {}); + }); return chatModels; } catch (err) { - logger.error(`Error loading Ollama models: ${err}`); + console.error(`Error loading Ollama models: ${err}`); return {}; } }; -export const loadOllamaEmbeddingsModels = async () => { - const ollamaEndpoint = getOllamaApiEndpoint(); +export const loadOllamaEmbeddingModels = async () => { + const ollamaApiEndpoint = getOllamaApiEndpoint(); - if (!ollamaEndpoint) return {}; + if (!ollamaApiEndpoint) return {}; try { - const response = await axios.get(`${ollamaEndpoint}/api/tags`, { + const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { headers: { 'Content-Type': 'application/json', }, }); - const { models: ollamaModels } = response.data; + const { models } = res.data; - const embeddingsModels = ollamaModels.reduce((acc, model) => { - acc[model.model] = { + const embeddingModels: Record<string, EmbeddingModel> = {}; + + models.forEach((model: any) => { + embeddingModels[model.model] = { displayName: model.name, model: new OllamaEmbeddings({ - baseUrl: ollamaEndpoint, + baseUrl: ollamaApiEndpoint, model: model.model, }), }; + }); - return acc; - }, {}); - - return embeddingsModels; + return embeddingModels; } catch (err) { - logger.error(`Error loading Ollama embeddings model: ${err}`); + console.error(`Error loading Ollama embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 3747e37..01bacc6 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -1,89 +1,90 @@ import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getOpenaiApiKey } from '../../config'; -import logger from '../../utils/logger'; +import { getOpenaiApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +const openaiChatModels: Record<string, string>[] = [ + { + displayName: 'GPT-3.5 Turbo', + key: 'gpt-3.5-turbo', + }, + { + displayName: 'GPT-4', + key: 'gpt-4', + }, + { + displayName: 'GPT-4 turbo', + key: 'gpt-4-turbo', + }, + { + displayName: 'GPT-4 omni', + key: 'gpt-4o', + }, + { + displayName: 'GPT-4 omni mini', + key: 'gpt-4o-mini', + }, +]; + +const openaiEmbeddingModels: Record<string, string>[] = [ + { + displayName: 'Text Embedding 3 Small', + key: 'text-embedding-3-small', + }, + { + displayName: 'Text Embedding 3 Large', + key: 'text-embedding-3-large', + }, +]; export const loadOpenAIChatModels = async () => { - const openAIApiKey = getOpenaiApiKey(); + const openaiApiKey = getOpenaiApiKey(); - if (!openAIApiKey) return {}; + if (!openaiApiKey) return {}; try { - const chatModels = { - 'gpt-3.5-turbo': { - displayName: 'GPT-3.5 Turbo', + const chatModels: Record<string, ChatModel> = {}; + + openaiChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-3.5-turbo', + openAIApiKey: openaiApiKey, + modelName: model.key, temperature: 0.7, - }), - }, - 'gpt-4': { - displayName: 'GPT-4', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4', - temperature: 0.7, - }), - }, - 'gpt-4-turbo': { - displayName: 'GPT-4 turbo', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4-turbo', - temperature: 0.7, - }), - }, - 'gpt-4o': { - displayName: 'GPT-4 omni', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o', - temperature: 0.7, - }), - }, - 'gpt-4o-mini': { - displayName: 'GPT-4 omni mini', - model: new ChatOpenAI({ - openAIApiKey, - modelName: 'gpt-4o-mini', - temperature: 0.7, - }), - }, - }; + }) as unknown as BaseChatModel, + }; + }); return chatModels; } catch (err) { - logger.error(`Error loading OpenAI models: ${err}`); + console.error(`Error loading OpenAI models: ${err}`); return {}; } }; -export const loadOpenAIEmbeddingsModels = async () => { - const openAIApiKey = getOpenaiApiKey(); +export const loadOpenAIEmbeddingModels = async () => { + const openaiApiKey = getOpenaiApiKey(); - if (!openAIApiKey) return {}; + if (!openaiApiKey) return {}; try { - const embeddingModels = { - 'text-embedding-3-small': { - displayName: 'Text Embedding 3 Small', + const embeddingModels: Record<string, EmbeddingModel> = {}; + + openaiEmbeddingModels.forEach((model) => { + embeddingModels[model.key] = { + displayName: model.displayName, model: new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-small', - }), - }, - 'text-embedding-3-large': { - displayName: 'Text Embedding 3 Large', - model: new OpenAIEmbeddings({ - openAIApiKey, - modelName: 'text-embedding-3-large', - }), - }, - }; + openAIApiKey: openaiApiKey, + modelName: model.key, + }) as unknown as Embeddings, + }; + }); return embeddingModels; } catch (err) { - logger.error(`Error loading OpenAI embeddings model: ${err}`); + console.error(`Error loading OpenAI embeddings models: ${err}`); return {}; } }; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts deleted file mode 100644 index 8a3417d..0000000 --- a/src/lib/providers/transformers.ts +++ /dev/null @@ -1,32 +0,0 @@ -import logger from '../../utils/logger'; -import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; - -export const loadTransformersEmbeddingsModels = async () => { - try { - const embeddingModels = { - 'xenova-bge-small-en-v1.5': { - displayName: 'BGE Small', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bge-small-en-v1.5', - }), - }, - 'xenova-gte-small': { - displayName: 'GTE Small', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/gte-small', - }), - }, - 'xenova-bert-base-multilingual-uncased': { - displayName: 'Bert Multilingual', - model: new HuggingFaceTransformersEmbeddings({ - modelName: 'Xenova/bert-base-multilingual-uncased', - }), - }, - }; - - return embeddingModels; - } catch (err) { - logger.error(`Error loading Transformers embeddings model: ${err}`); - return {}; - } -}; diff --git a/ui/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts similarity index 100% rename from ui/lib/search/metaSearchAgent.ts rename to src/lib/search/metaSearchAgent.ts diff --git a/src/lib/searxng.ts b/src/lib/searxng.ts index da62457..ae19db2 100644 --- a/src/lib/searxng.ts +++ b/src/lib/searxng.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { getSearxngApiEndpoint } from '../config'; +import { getSearxngApiEndpoint } from './config'; interface SearxngSearchOptions { categories?: string[]; @@ -30,11 +30,12 @@ export const searchSearxng = async ( if (opts) { Object.keys(opts).forEach((key) => { - if (Array.isArray(opts[key])) { - url.searchParams.append(key, opts[key].join(',')); + const value = opts[key as keyof SearxngSearchOptions]; + if (Array.isArray(value)) { + url.searchParams.append(key, value.join(',')); return; } - url.searchParams.append(key, opts[key]); + url.searchParams.append(key, value as string); }); } diff --git a/ui/lib/types/compute-dot.d.ts b/src/lib/types/compute-dot.d.ts similarity index 100% rename from ui/lib/types/compute-dot.d.ts rename to src/lib/types/compute-dot.d.ts diff --git a/ui/lib/utils.ts b/src/lib/utils.ts similarity index 100% rename from ui/lib/utils.ts rename to src/lib/utils.ts diff --git a/ui/lib/utils/computeSimilarity.ts b/src/lib/utils/computeSimilarity.ts similarity index 100% rename from ui/lib/utils/computeSimilarity.ts rename to src/lib/utils/computeSimilarity.ts diff --git a/ui/lib/utils/documents.ts b/src/lib/utils/documents.ts similarity index 100% rename from ui/lib/utils/documents.ts rename to src/lib/utils/documents.ts diff --git a/src/utils/files.ts b/src/lib/utils/files.ts similarity index 100% rename from src/utils/files.ts rename to src/lib/utils/files.ts diff --git a/src/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts similarity index 100% rename from src/utils/formatHistory.ts rename to src/lib/utils/formatHistory.ts diff --git a/src/routes/chats.ts b/src/routes/chats.ts deleted file mode 100644 index afa74f9..0000000 --- a/src/routes/chats.ts +++ /dev/null @@ -1,66 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import db from '../db/index'; -import { eq } from 'drizzle-orm'; -import { chats, messages } from '../db/schema'; - -const router = express.Router(); - -router.get('/', async (_, res) => { - try { - let chats = await db.query.chats.findMany(); - - chats = chats.reverse(); - - return res.status(200).json({ chats: chats }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in getting chats: ${err.message}`); - } -}); - -router.get('/:id', async (req, res) => { - try { - const chatExists = await db.query.chats.findFirst({ - where: eq(chats.id, req.params.id), - }); - - if (!chatExists) { - return res.status(404).json({ message: 'Chat not found' }); - } - - const chatMessages = await db.query.messages.findMany({ - where: eq(messages.chatId, req.params.id), - }); - - return res.status(200).json({ chat: chatExists, messages: chatMessages }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in getting chat: ${err.message}`); - } -}); - -router.delete(`/:id`, async (req, res) => { - try { - const chatExists = await db.query.chats.findFirst({ - where: eq(chats.id, req.params.id), - }); - - if (!chatExists) { - return res.status(404).json({ message: 'Chat not found' }); - } - - await db.delete(chats).where(eq(chats.id, req.params.id)).execute(); - await db - .delete(messages) - .where(eq(messages.chatId, req.params.id)) - .execute(); - - return res.status(200).json({ message: 'Chat deleted successfully' }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in deleting chat: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/config.ts b/src/routes/config.ts deleted file mode 100644 index 18b370d..0000000 --- a/src/routes/config.ts +++ /dev/null @@ -1,104 +0,0 @@ -import express from 'express'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; -import { - getGroqApiKey, - getOllamaApiEndpoint, - getAnthropicApiKey, - getGeminiApiKey, - getOpenaiApiKey, - updateConfig, - getCustomOpenaiApiUrl, - getCustomOpenaiApiKey, - getCustomOpenaiModelName, -} from '../config'; -import logger from '../utils/logger'; - -const router = express.Router(); - -router.get('/', async (_, res) => { - try { - const config = {}; - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - config['chatModelProviders'] = {}; - config['embeddingModelProviders'] = {}; - - for (const provider in chatModelProviders) { - config['chatModelProviders'][provider] = Object.keys( - chatModelProviders[provider], - ).map((model) => { - return { - name: model, - displayName: chatModelProviders[provider][model].displayName, - }; - }); - } - - for (const provider in embeddingModelProviders) { - config['embeddingModelProviders'][provider] = Object.keys( - embeddingModelProviders[provider], - ).map((model) => { - return { - name: model, - displayName: embeddingModelProviders[provider][model].displayName, - }; - }); - } - - config['openaiApiKey'] = getOpenaiApiKey(); - config['ollamaApiUrl'] = getOllamaApiEndpoint(); - config['anthropicApiKey'] = getAnthropicApiKey(); - config['groqApiKey'] = getGroqApiKey(); - config['geminiApiKey'] = getGeminiApiKey(); - config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); - config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); - config['customOpenaiModelName'] = getCustomOpenaiModelName(); - - res.status(200).json(config); - } catch (err: any) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error getting config: ${err.message}`); - } -}); - -router.post('/', async (req, res) => { - const config = req.body; - - const updatedConfig = { - MODELS: { - OPENAI: { - API_KEY: config.openaiApiKey, - }, - GROQ: { - API_KEY: config.groqApiKey, - }, - ANTHROPIC: { - API_KEY: config.anthropicApiKey, - }, - GEMINI: { - API_KEY: config.geminiApiKey, - }, - OLLAMA: { - API_URL: config.ollamaApiUrl, - }, - CUSTOM_OPENAI: { - API_URL: config.customOpenaiApiUrl, - API_KEY: config.customOpenaiApiKey, - MODEL_NAME: config.customOpenaiModelName, - }, - }, - }; - - updateConfig(updatedConfig); - - res.status(200).json({ message: 'Config updated' }); -}); - -export default router; diff --git a/src/routes/discover.ts b/src/routes/discover.ts deleted file mode 100644 index b6f8ff9..0000000 --- a/src/routes/discover.ts +++ /dev/null @@ -1,48 +0,0 @@ -import express from 'express'; -import { searchSearxng } from '../lib/searxng'; -import logger from '../utils/logger'; - -const router = express.Router(); - -router.get('/', async (req, res) => { - try { - const data = ( - await Promise.all([ - searchSearxng('site:businessinsider.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:www.exchangewire.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:yahoo.com AI', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:businessinsider.com tech', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:www.exchangewire.com tech', { - engines: ['bing news'], - pageno: 1, - }), - searchSearxng('site:yahoo.com tech', { - engines: ['bing news'], - pageno: 1, - }), - ]) - ) - .map((result) => result.results) - .flat() - .sort(() => Math.random() - 0.5); - - return res.json({ blogs: data }); - } catch (err: any) { - logger.error(`Error in discover route: ${err.message}`); - return res.status(500).json({ message: 'An error has occurred' }); - } -}); - -export default router; diff --git a/src/routes/images.ts b/src/routes/images.ts deleted file mode 100644 index 5671657..0000000 --- a/src/routes/images.ts +++ /dev/null @@ -1,82 +0,0 @@ -import express from 'express'; -import handleImageSearch from '../chains/imageSearchAgent'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface ImageSearchBody { - query: string; - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: ImageSearchBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const images = await handleImageSearch( - { query: body.query, chat_history: chatHistory }, - llm, - ); - - res.status(200).json({ images }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in image search: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/index.ts b/src/routes/index.ts deleted file mode 100644 index cb2c915..0000000 --- a/src/routes/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import express from 'express'; -import imagesRouter from './images'; -import videosRouter from './videos'; -import configRouter from './config'; -import modelsRouter from './models'; -import suggestionsRouter from './suggestions'; -import chatsRouter from './chats'; -import searchRouter from './search'; -import discoverRouter from './discover'; -import uploadsRouter from './uploads'; - -const router = express.Router(); - -router.use('/images', imagesRouter); -router.use('/videos', videosRouter); -router.use('/config', configRouter); -router.use('/models', modelsRouter); -router.use('/suggestions', suggestionsRouter); -router.use('/chats', chatsRouter); -router.use('/search', searchRouter); -router.use('/discover', discoverRouter); -router.use('/uploads', uploadsRouter); - -export default router; diff --git a/src/routes/models.ts b/src/routes/models.ts deleted file mode 100644 index b5fbe12..0000000 --- a/src/routes/models.ts +++ /dev/null @@ -1,36 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; - -const router = express.Router(); - -router.get('/', async (req, res) => { - try { - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - Object.keys(chatModelProviders).forEach((provider) => { - Object.keys(chatModelProviders[provider]).forEach((model) => { - delete chatModelProviders[provider][model].model; - }); - }); - - Object.keys(embeddingModelProviders).forEach((provider) => { - Object.keys(embeddingModelProviders[provider]).forEach((model) => { - delete embeddingModelProviders[provider][model].model; - }); - }); - - res.status(200).json({ chatModelProviders, embeddingModelProviders }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(err.message); - } -}); - -export default router; diff --git a/src/routes/search.ts b/src/routes/search.ts deleted file mode 100644 index 57d90a3..0000000 --- a/src/routes/search.ts +++ /dev/null @@ -1,158 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getAvailableChatModelProviders, - getAvailableEmbeddingModelProviders, -} from '../lib/providers'; -import { searchHandlers } from '../websocket/messageHandler'; -import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; -import { MetaSearchAgentType } from '../search/metaSearchAgent'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface chatModel { - provider: string; - model: string; - customOpenAIKey?: string; - customOpenAIBaseURL?: string; -} - -interface embeddingModel { - provider: string; - model: string; -} - -interface ChatRequestBody { - optimizationMode: 'speed' | 'balanced'; - focusMode: string; - chatModel?: chatModel; - embeddingModel?: embeddingModel; - query: string; - history: Array<[string, string]>; -} - -router.post('/', async (req, res) => { - try { - const body: ChatRequestBody = req.body; - - if (!body.focusMode || !body.query) { - return res.status(400).json({ message: 'Missing focus mode or query' }); - } - - body.history = body.history || []; - body.optimizationMode = body.optimizationMode || 'balanced'; - - const history: BaseMessage[] = body.history.map((msg) => { - if (msg[0] === 'human') { - return new HumanMessage({ - content: msg[1], - }); - } else { - return new AIMessage({ - content: msg[1], - }); - } - }); - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - const embeddingModelProvider = - body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]; - const embeddingModel = - body.embeddingModel?.model || - Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; - - let llm: BaseChatModel | undefined; - let embeddings: Embeddings | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: body.chatModel?.model || getCustomOpenaiModelName(), - openAIApiKey: - body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: - body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if ( - embeddingModelProviders[embeddingModelProvider] && - embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddings = embeddingModelProviders[embeddingModelProvider][ - embeddingModel - ].model as Embeddings | undefined; - } - - if (!llm || !embeddings) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode]; - - if (!searchHandler) { - return res.status(400).json({ message: 'Invalid focus mode' }); - } - - const emitter = await searchHandler.searchAndAnswer( - body.query, - history, - llm, - embeddings, - body.optimizationMode, - [], - ); - - let message = ''; - let sources = []; - - emitter.on('data', (data) => { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - message += parsedData.data; - } else if (parsedData.type === 'sources') { - sources = parsedData.data; - } - }); - - emitter.on('end', () => { - res.status(200).json({ message, sources }); - }); - - emitter.on('error', (data) => { - const parsedData = JSON.parse(data); - res.status(500).json({ message: parsedData.data }); - }); - } catch (err: any) { - logger.error(`Error in getting search results: ${err.message}`); - res.status(500).json({ message: 'An error has occurred.' }); - } -}); - -export default router; diff --git a/src/routes/suggestions.ts b/src/routes/suggestions.ts deleted file mode 100644 index 7dd1739..0000000 --- a/src/routes/suggestions.ts +++ /dev/null @@ -1,81 +0,0 @@ -import express from 'express'; -import generateSuggestions from '../chains/suggestionGeneratorAgent'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface SuggestionsBody { - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: SuggestionsBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const suggestions = await generateSuggestions( - { chat_history: chatHistory }, - llm, - ); - - res.status(200).json({ suggestions: suggestions }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in generating suggestions: ${err.message}`); - } -}); - -export default router; diff --git a/src/routes/uploads.ts b/src/routes/uploads.ts deleted file mode 100644 index 7b063fc..0000000 --- a/src/routes/uploads.ts +++ /dev/null @@ -1,151 +0,0 @@ -import express from 'express'; -import logger from '../utils/logger'; -import multer from 'multer'; -import path from 'path'; -import crypto from 'crypto'; -import fs from 'fs'; -import { Embeddings } from '@langchain/core/embeddings'; -import { getAvailableEmbeddingModelProviders } from '../lib/providers'; -import { PDFLoader } from '@langchain/community/document_loaders/fs/pdf'; -import { DocxLoader } from '@langchain/community/document_loaders/fs/docx'; -import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; -import { Document } from 'langchain/document'; - -const router = express.Router(); - -const splitter = new RecursiveCharacterTextSplitter({ - chunkSize: 500, - chunkOverlap: 100, -}); - -const storage = multer.diskStorage({ - destination: (req, file, cb) => { - cb(null, path.join(process.cwd(), './uploads')); - }, - filename: (req, file, cb) => { - const splitedFileName = file.originalname.split('.'); - const fileExtension = splitedFileName[splitedFileName.length - 1]; - if (!['pdf', 'docx', 'txt'].includes(fileExtension)) { - return cb(new Error('File type is not supported'), ''); - } - cb(null, `${crypto.randomBytes(16).toString('hex')}.${fileExtension}`); - }, -}); - -const upload = multer({ storage }); - -router.post( - '/', - upload.fields([ - { name: 'files' }, - { name: 'embedding_model', maxCount: 1 }, - { name: 'embedding_model_provider', maxCount: 1 }, - ]), - async (req, res) => { - try { - const { embedding_model, embedding_model_provider } = req.body; - - if (!embedding_model || !embedding_model_provider) { - res - .status(400) - .json({ message: 'Missing embedding model or provider' }); - return; - } - - const embeddingModels = await getAvailableEmbeddingModelProviders(); - const provider = - embedding_model_provider ?? Object.keys(embeddingModels)[0]; - const embeddingModel: Embeddings = - embedding_model ?? Object.keys(embeddingModels[provider])[0]; - - let embeddingsModel: Embeddings | undefined; - - if ( - embeddingModels[provider] && - embeddingModels[provider][embeddingModel] - ) { - embeddingsModel = embeddingModels[provider][embeddingModel].model as - | Embeddings - | undefined; - } - - if (!embeddingsModel) { - res.status(400).json({ message: 'Invalid LLM model selected' }); - return; - } - - const files = req.files['files'] as Express.Multer.File[]; - if (!files || files.length === 0) { - res.status(400).json({ message: 'No files uploaded' }); - return; - } - - await Promise.all( - files.map(async (file) => { - let docs: Document[] = []; - - if (file.mimetype === 'application/pdf') { - const loader = new PDFLoader(file.path); - docs = await loader.load(); - } else if ( - file.mimetype === - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' - ) { - const loader = new DocxLoader(file.path); - docs = await loader.load(); - } else if (file.mimetype === 'text/plain') { - const text = fs.readFileSync(file.path, 'utf-8'); - docs = [ - new Document({ - pageContent: text, - metadata: { - title: file.originalname, - }, - }), - ]; - } - - const splitted = await splitter.splitDocuments(docs); - - const json = JSON.stringify({ - title: file.originalname, - contents: splitted.map((doc) => doc.pageContent), - }); - - const pathToSave = file.path.replace(/\.\w+$/, '-extracted.json'); - fs.writeFileSync(pathToSave, json); - - const embeddings = await embeddingsModel.embedDocuments( - splitted.map((doc) => doc.pageContent), - ); - - const embeddingsJSON = JSON.stringify({ - title: file.originalname, - embeddings: embeddings, - }); - - const pathToSaveEmbeddings = file.path.replace( - /\.\w+$/, - '-embeddings.json', - ); - fs.writeFileSync(pathToSaveEmbeddings, embeddingsJSON); - }), - ); - - res.status(200).json({ - files: files.map((file) => { - return { - fileName: file.originalname, - fileExtension: file.filename.split('.').pop(), - fileId: file.filename.replace(/\.\w+$/, ''), - }; - }), - }); - } catch (err: any) { - logger.error(`Error in uploading file results: ${err.message}`); - res.status(500).json({ message: 'An error has occurred.' }); - } - }, -); - -export default router; diff --git a/src/routes/videos.ts b/src/routes/videos.ts deleted file mode 100644 index b631f26..0000000 --- a/src/routes/videos.ts +++ /dev/null @@ -1,82 +0,0 @@ -import express from 'express'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { getAvailableChatModelProviders } from '../lib/providers'; -import { HumanMessage, AIMessage } from '@langchain/core/messages'; -import logger from '../utils/logger'; -import handleVideoSearch from '../chains/videoSearchAgent'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -const router = express.Router(); - -interface ChatModel { - provider: string; - model: string; -} - -interface VideoSearchBody { - query: string; - chatHistory: any[]; - chatModel?: ChatModel; -} - -router.post('/', async (req, res) => { - try { - let body: VideoSearchBody = req.body; - - const chatHistory = body.chatHistory.map((msg: any) => { - if (msg.role === 'user') { - return new HumanMessage(msg.content); - } else if (msg.role === 'assistant') { - return new AIMessage(msg.content); - } - }); - - const chatModelProviders = await getAvailableChatModelProviders(); - - const chatModelProvider = - body.chatModel?.provider || Object.keys(chatModelProviders)[0]; - const chatModel = - body.chatModel?.model || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - let llm: BaseChatModel | undefined; - - if (body.chatModel?.provider === 'custom_openai') { - llm = new ChatOpenAI({ - modelName: getCustomOpenaiModelName(), - openAIApiKey: getCustomOpenaiApiKey(), - temperature: 0.7, - configuration: { - baseURL: getCustomOpenaiApiUrl(), - }, - }) as unknown as BaseChatModel; - } else if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } - - if (!llm) { - return res.status(400).json({ message: 'Invalid model selected' }); - } - - const videos = await handleVideoSearch( - { chat_history: chatHistory, query: body.query }, - llm, - ); - - res.status(200).json({ videos }); - } catch (err) { - res.status(500).json({ message: 'An error has occurred.' }); - logger.error(`Error in video search: ${err.message}`); - } -}); - -export default router; diff --git a/src/search/metaSearchAgent.ts b/src/search/metaSearchAgent.ts deleted file mode 100644 index ee82c10..0000000 --- a/src/search/metaSearchAgent.ts +++ /dev/null @@ -1,494 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import { - ChatPromptTemplate, - MessagesPlaceholder, - PromptTemplate, -} from '@langchain/core/prompts'; -import { - RunnableLambda, - RunnableMap, - RunnableSequence, -} from '@langchain/core/runnables'; -import { BaseMessage } from '@langchain/core/messages'; -import { StringOutputParser } from '@langchain/core/output_parsers'; -import LineListOutputParser from '../lib/outputParsers/listLineOutputParser'; -import LineOutputParser from '../lib/outputParsers/lineOutputParser'; -import { getDocumentsFromLinks } from '../utils/documents'; -import { Document } from 'langchain/document'; -import { searchSearxng } from '../lib/searxng'; -import path from 'path'; -import fs from 'fs'; -import computeSimilarity from '../utils/computeSimilarity'; -import formatChatHistoryAsString from '../utils/formatHistory'; -import eventEmitter from 'events'; -import { StreamEvent } from '@langchain/core/tracers/log_stream'; -import { IterableReadableStream } from '@langchain/core/utils/stream'; - -export interface MetaSearchAgentType { - searchAndAnswer: ( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], - ) => Promise<eventEmitter>; -} - -interface Config { - searchWeb: boolean; - rerank: boolean; - summarizer: boolean; - rerankThreshold: number; - queryGeneratorPrompt: string; - responsePrompt: string; - activeEngines: string[]; -} - -type BasicChainInput = { - chat_history: BaseMessage[]; - query: string; -}; - -class MetaSearchAgent implements MetaSearchAgentType { - private config: Config; - private strParser = new StringOutputParser(); - - constructor(config: Config) { - this.config = config; - } - - private async createSearchRetrieverChain(llm: BaseChatModel) { - (llm as unknown as ChatOpenAI).temperature = 0; - - return RunnableSequence.from([ - PromptTemplate.fromTemplate(this.config.queryGeneratorPrompt), - llm, - this.strParser, - RunnableLambda.from(async (input: string) => { - const linksOutputParser = new LineListOutputParser({ - key: 'links', - }); - - const questionOutputParser = new LineOutputParser({ - key: 'question', - }); - - const links = await linksOutputParser.parse(input); - let question = this.config.summarizer - ? await questionOutputParser.parse(input) - : input; - - if (question === 'not_needed') { - return { query: '', docs: [] }; - } - - if (links.length > 0) { - if (question.length === 0) { - question = 'summarize'; - } - - let docs = []; - - const linkDocs = await getDocumentsFromLinks({ links }); - - const docGroups: Document[] = []; - - linkDocs.map((doc) => { - const URLDocExists = docGroups.find( - (d) => - d.metadata.url === doc.metadata.url && - d.metadata.totalDocs < 10, - ); - - if (!URLDocExists) { - docGroups.push({ - ...doc, - metadata: { - ...doc.metadata, - totalDocs: 1, - }, - }); - } - - const docIndex = docGroups.findIndex( - (d) => - d.metadata.url === doc.metadata.url && - d.metadata.totalDocs < 10, - ); - - if (docIndex !== -1) { - docGroups[docIndex].pageContent = - docGroups[docIndex].pageContent + `\n\n` + doc.pageContent; - docGroups[docIndex].metadata.totalDocs += 1; - } - }); - - await Promise.all( - docGroups.map(async (doc) => { - const res = await llm.invoke(` - You are a web search summarizer, tasked with summarizing a piece of text retrieved from a web search. Your job is to summarize the - text into a detailed, 2-4 paragraph explanation that captures the main ideas and provides a comprehensive answer to the query. - If the query is \"summarize\", you should provide a detailed summary of the text. If the query is a specific question, you should answer it in the summary. - - - **Journalistic tone**: The summary should sound professional and journalistic, not too casual or vague. - - **Thorough and detailed**: Ensure that every key point from the text is captured and that the summary directly answers the query. - - **Not too lengthy, but detailed**: The summary should be informative but not excessively long. Focus on providing detailed information in a concise format. - - The text will be shared inside the \`text\` XML tag, and the query inside the \`query\` XML tag. - - <example> - 1. \`<text> - Docker is a set of platform-as-a-service products that use OS-level virtualization to deliver software in packages called containers. - It was first released in 2013 and is developed by Docker, Inc. Docker is designed to make it easier to create, deploy, and run applications - by using containers. - </text> - - <query> - What is Docker and how does it work? - </query> - - Response: - Docker is a revolutionary platform-as-a-service product developed by Docker, Inc., that uses container technology to make application - deployment more efficient. It allows developers to package their software with all necessary dependencies, making it easier to run in - any environment. Released in 2013, Docker has transformed the way applications are built, deployed, and managed. - \` - 2. \`<text> - The theory of relativity, or simply relativity, encompasses two interrelated theories of Albert Einstein: special relativity and general - relativity. However, the word "relativity" is sometimes used in reference to Galilean invariance. The term "theory of relativity" was based - on the expression "relative theory" used by Max Planck in 1906. The theory of relativity usually encompasses two interrelated theories by - Albert Einstein: special relativity and general relativity. Special relativity applies to all physical phenomena in the absence of gravity. - General relativity explains the law of gravitation and its relation to other forces of nature. It applies to the cosmological and astrophysical - realm, including astronomy. - </text> - - <query> - summarize - </query> - - Response: - The theory of relativity, developed by Albert Einstein, encompasses two main theories: special relativity and general relativity. Special - relativity applies to all physical phenomena in the absence of gravity, while general relativity explains the law of gravitation and its - relation to other forces of nature. The theory of relativity is based on the concept of "relative theory," as introduced by Max Planck in - 1906. It is a fundamental theory in physics that has revolutionized our understanding of the universe. - \` - </example> - - Everything below is the actual data you will be working with. Good luck! - - <query> - ${question} - </query> - - <text> - ${doc.pageContent} - </text> - - Make sure to answer the query in the summary. - `); - - const document = new Document({ - pageContent: res.content as string, - metadata: { - title: doc.metadata.title, - url: doc.metadata.url, - }, - }); - - docs.push(document); - }), - ); - - return { query: question, docs: docs }; - } else { - const res = await searchSearxng(question, { - language: 'en', - engines: this.config.activeEngines, - }); - - const documents = res.results.map( - (result) => - new Document({ - pageContent: - result.content || - (this.config.activeEngines.includes('youtube') - ? result.title - : '') /* Todo: Implement transcript grabbing using Youtubei (source: https://www.npmjs.com/package/youtubei) */, - metadata: { - title: result.title, - url: result.url, - ...(result.img_src && { img_src: result.img_src }), - }, - }), - ); - - return { query: question, docs: documents }; - } - }), - ]); - } - - private async createAnsweringChain( - llm: BaseChatModel, - fileIds: string[], - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - ) { - return RunnableSequence.from([ - RunnableMap.from({ - query: (input: BasicChainInput) => input.query, - chat_history: (input: BasicChainInput) => input.chat_history, - date: () => new Date().toISOString(), - context: RunnableLambda.from(async (input: BasicChainInput) => { - const processedHistory = formatChatHistoryAsString( - input.chat_history, - ); - - let docs: Document[] | null = null; - let query = input.query; - - if (this.config.searchWeb) { - const searchRetrieverChain = - await this.createSearchRetrieverChain(llm); - - const searchRetrieverResult = await searchRetrieverChain.invoke({ - chat_history: processedHistory, - query, - }); - - query = searchRetrieverResult.query; - docs = searchRetrieverResult.docs; - } - - const sortedDocs = await this.rerankDocs( - query, - docs ?? [], - fileIds, - embeddings, - optimizationMode, - ); - - return sortedDocs; - }) - .withConfig({ - runName: 'FinalSourceRetriever', - }) - .pipe(this.processDocs), - }), - ChatPromptTemplate.fromMessages([ - ['system', this.config.responsePrompt], - new MessagesPlaceholder('chat_history'), - ['user', '{query}'], - ]), - llm, - this.strParser, - ]).withConfig({ - runName: 'FinalResponseGenerator', - }); - } - - private async rerankDocs( - query: string, - docs: Document[], - fileIds: string[], - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - ) { - if (docs.length === 0 && fileIds.length === 0) { - return docs; - } - - const filesData = fileIds - .map((file) => { - const filePath = path.join(process.cwd(), 'uploads', file); - - const contentPath = filePath + '-extracted.json'; - const embeddingsPath = filePath + '-embeddings.json'; - - const content = JSON.parse(fs.readFileSync(contentPath, 'utf8')); - const embeddings = JSON.parse(fs.readFileSync(embeddingsPath, 'utf8')); - - const fileSimilaritySearchObject = content.contents.map( - (c: string, i) => { - return { - fileName: content.title, - content: c, - embeddings: embeddings.embeddings[i], - }; - }, - ); - - return fileSimilaritySearchObject; - }) - .flat(); - - if (query.toLocaleLowerCase() === 'summarize') { - return docs.slice(0, 15); - } - - const docsWithContent = docs.filter( - (doc) => doc.pageContent && doc.pageContent.length > 0, - ); - - if (optimizationMode === 'speed' || this.config.rerank === false) { - if (filesData.length > 0) { - const [queryEmbedding] = await Promise.all([ - embeddings.embedQuery(query), - ]); - - const fileDocs = filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }); - - const similarity = filesData.map((fileData, i) => { - const sim = computeSimilarity(queryEmbedding, fileData.embeddings); - - return { - index: i, - similarity: sim, - }; - }); - - let sortedDocs = similarity - .filter( - (sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3), - ) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => fileDocs[sim.index]); - - sortedDocs = - docsWithContent.length > 0 ? sortedDocs.slice(0, 8) : sortedDocs; - - return [ - ...sortedDocs, - ...docsWithContent.slice(0, 15 - sortedDocs.length), - ]; - } else { - return docsWithContent.slice(0, 15); - } - } else if (optimizationMode === 'balanced') { - const [docEmbeddings, queryEmbedding] = await Promise.all([ - embeddings.embedDocuments( - docsWithContent.map((doc) => doc.pageContent), - ), - embeddings.embedQuery(query), - ]); - - docsWithContent.push( - ...filesData.map((fileData) => { - return new Document({ - pageContent: fileData.content, - metadata: { - title: fileData.fileName, - url: `File`, - }, - }); - }), - ); - - docEmbeddings.push(...filesData.map((fileData) => fileData.embeddings)); - - const similarity = docEmbeddings.map((docEmbedding, i) => { - const sim = computeSimilarity(queryEmbedding, docEmbedding); - - return { - index: i, - similarity: sim, - }; - }); - - const sortedDocs = similarity - .filter((sim) => sim.similarity > (this.config.rerankThreshold ?? 0.3)) - .sort((a, b) => b.similarity - a.similarity) - .slice(0, 15) - .map((sim) => docsWithContent[sim.index]); - - return sortedDocs; - } - } - - private processDocs(docs: Document[]) { - return docs - .map( - (_, index) => - `${index + 1}. ${docs[index].metadata.title} ${docs[index].pageContent}`, - ) - .join('\n'); - } - - private async handleStream( - stream: IterableReadableStream<StreamEvent>, - emitter: eventEmitter, - ) { - for await (const event of stream) { - if ( - event.event === 'on_chain_end' && - event.name === 'FinalSourceRetriever' - ) { - ``; - emitter.emit( - 'data', - JSON.stringify({ type: 'sources', data: event.data.output }), - ); - } - if ( - event.event === 'on_chain_stream' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit( - 'data', - JSON.stringify({ type: 'response', data: event.data.chunk }), - ); - } - if ( - event.event === 'on_chain_end' && - event.name === 'FinalResponseGenerator' - ) { - emitter.emit('end'); - } - } - } - - async searchAndAnswer( - message: string, - history: BaseMessage[], - llm: BaseChatModel, - embeddings: Embeddings, - optimizationMode: 'speed' | 'balanced' | 'quality', - fileIds: string[], - ) { - const emitter = new eventEmitter(); - - const answeringChain = await this.createAnsweringChain( - llm, - fileIds, - embeddings, - optimizationMode, - ); - - const stream = answeringChain.streamEvents( - { - chat_history: history, - query: message, - }, - { - version: 'v1', - }, - ); - - this.handleStream(stream, emitter); - - return emitter; - } -} - -export default MetaSearchAgent; diff --git a/src/utils/computeSimilarity.ts b/src/utils/computeSimilarity.ts deleted file mode 100644 index 6e36b75..0000000 --- a/src/utils/computeSimilarity.ts +++ /dev/null @@ -1,17 +0,0 @@ -import dot from 'compute-dot'; -import cosineSimilarity from 'compute-cosine-similarity'; -import { getSimilarityMeasure } from '../config'; - -const computeSimilarity = (x: number[], y: number[]): number => { - const similarityMeasure = getSimilarityMeasure(); - - if (similarityMeasure === 'cosine') { - return cosineSimilarity(x, y); - } else if (similarityMeasure === 'dot') { - return dot(x, y); - } - - throw new Error('Invalid similarity measure'); -}; - -export default computeSimilarity; diff --git a/src/utils/documents.ts b/src/utils/documents.ts deleted file mode 100644 index 5cd0366..0000000 --- a/src/utils/documents.ts +++ /dev/null @@ -1,99 +0,0 @@ -import axios from 'axios'; -import { htmlToText } from 'html-to-text'; -import { RecursiveCharacterTextSplitter } from 'langchain/text_splitter'; -import { Document } from '@langchain/core/documents'; -import pdfParse from 'pdf-parse'; -import logger from './logger'; - -export const getDocumentsFromLinks = async ({ links }: { links: string[] }) => { - const splitter = new RecursiveCharacterTextSplitter(); - - let docs: Document[] = []; - - await Promise.all( - links.map(async (link) => { - link = - link.startsWith('http://') || link.startsWith('https://') - ? link - : `https://${link}`; - - try { - const res = await axios.get(link, { - responseType: 'arraybuffer', - }); - - const isPdf = res.headers['content-type'] === 'application/pdf'; - - if (isPdf) { - const pdfText = await pdfParse(res.data); - const parsedText = pdfText.text - .replace(/(\r\n|\n|\r)/gm, ' ') - .replace(/\s+/g, ' ') - .trim(); - - const splittedText = await splitter.splitText(parsedText); - const title = 'PDF Document'; - - const linkDocs = splittedText.map((text) => { - return new Document({ - pageContent: text, - metadata: { - title: title, - url: link, - }, - }); - }); - - docs.push(...linkDocs); - return; - } - - const parsedText = htmlToText(res.data.toString('utf8'), { - selectors: [ - { - selector: 'a', - options: { - ignoreHref: true, - }, - }, - ], - }) - .replace(/(\r\n|\n|\r)/gm, ' ') - .replace(/\s+/g, ' ') - .trim(); - - const splittedText = await splitter.splitText(parsedText); - const title = res.data - .toString('utf8') - .match(/<title>(.*?)<\/title>/)?.[1]; - - const linkDocs = splittedText.map((text) => { - return new Document({ - pageContent: text, - metadata: { - title: title || link, - url: link, - }, - }); - }); - - docs.push(...linkDocs); - } catch (err) { - logger.error( - `Error at generating documents from links: ${err.message}`, - ); - docs.push( - new Document({ - pageContent: `Failed to retrieve content from the link: ${err.message}`, - metadata: { - title: 'Failed to retrieve content', - url: link, - }, - }), - ); - } - }), - ); - - return docs; -}; diff --git a/src/utils/logger.ts b/src/utils/logger.ts deleted file mode 100644 index 1c81eb9..0000000 --- a/src/utils/logger.ts +++ /dev/null @@ -1,22 +0,0 @@ -import winston from 'winston'; - -const logger = winston.createLogger({ - level: 'info', - transports: [ - new winston.transports.Console({ - format: winston.format.combine( - winston.format.colorize(), - winston.format.simple(), - ), - }), - new winston.transports.File({ - filename: 'app.log', - format: winston.format.combine( - winston.format.timestamp(), - winston.format.json(), - ), - }), - ], -}); - -export default logger; diff --git a/src/websocket/connectionManager.ts b/src/websocket/connectionManager.ts deleted file mode 100644 index bb8f242..0000000 --- a/src/websocket/connectionManager.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { WebSocket } from 'ws'; -import { handleMessage } from './messageHandler'; -import { - getAvailableEmbeddingModelProviders, - getAvailableChatModelProviders, -} from '../lib/providers'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import type { IncomingMessage } from 'http'; -import logger from '../utils/logger'; -import { ChatOpenAI } from '@langchain/openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; - -export const handleConnection = async ( - ws: WebSocket, - request: IncomingMessage, -) => { - try { - const searchParams = new URL(request.url, `http://${request.headers.host}`) - .searchParams; - - const [chatModelProviders, embeddingModelProviders] = await Promise.all([ - getAvailableChatModelProviders(), - getAvailableEmbeddingModelProviders(), - ]); - - const chatModelProvider = - searchParams.get('chatModelProvider') || - Object.keys(chatModelProviders)[0]; - const chatModel = - searchParams.get('chatModel') || - Object.keys(chatModelProviders[chatModelProvider])[0]; - - const embeddingModelProvider = - searchParams.get('embeddingModelProvider') || - Object.keys(embeddingModelProviders)[0]; - const embeddingModel = - searchParams.get('embeddingModel') || - Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; - - let llm: BaseChatModel | undefined; - let embeddings: Embeddings | undefined; - - if ( - chatModelProviders[chatModelProvider] && - chatModelProviders[chatModelProvider][chatModel] && - chatModelProvider != 'custom_openai' - ) { - llm = chatModelProviders[chatModelProvider][chatModel] - .model as unknown as BaseChatModel | undefined; - } else if (chatModelProvider == 'custom_openai') { - const customOpenaiApiKey = getCustomOpenaiApiKey(); - const customOpenaiApiUrl = getCustomOpenaiApiUrl(); - const customOpenaiModelName = getCustomOpenaiModelName(); - - if (customOpenaiApiKey && customOpenaiApiUrl && customOpenaiModelName) { - llm = new ChatOpenAI({ - modelName: customOpenaiModelName, - openAIApiKey: customOpenaiApiKey, - temperature: 0.7, - configuration: { - baseURL: customOpenaiApiUrl, - }, - }) as unknown as BaseChatModel; - } - } - - if ( - embeddingModelProviders[embeddingModelProvider] && - embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddings = embeddingModelProviders[embeddingModelProvider][ - embeddingModel - ].model as Embeddings | undefined; - } - - if (!llm || !embeddings) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid LLM or embeddings model selected, please refresh the page and try again.', - key: 'INVALID_MODEL_SELECTED', - }), - ); - ws.close(); - } - - const interval = setInterval(() => { - if (ws.readyState === ws.OPEN) { - ws.send( - JSON.stringify({ - type: 'signal', - data: 'open', - }), - ); - clearInterval(interval); - } - }, 5); - - ws.on( - 'message', - async (message) => - await handleMessage(message.toString(), ws, llm, embeddings), - ); - - ws.on('close', () => logger.debug('Connection closed')); - } catch (err) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Internal server error.', - key: 'INTERNAL_SERVER_ERROR', - }), - ); - ws.close(); - logger.error(err); - } -}; diff --git a/src/websocket/index.ts b/src/websocket/index.ts deleted file mode 100644 index 1b9ae77..0000000 --- a/src/websocket/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { initServer } from './websocketServer'; -import http from 'http'; - -export const startWebSocketServer = ( - server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, -) => { - initServer(server); -}; diff --git a/src/websocket/messageHandler.ts b/src/websocket/messageHandler.ts deleted file mode 100644 index 395c0de..0000000 --- a/src/websocket/messageHandler.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { EventEmitter, WebSocket } from 'ws'; -import { BaseMessage, AIMessage, HumanMessage } from '@langchain/core/messages'; -import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import type { Embeddings } from '@langchain/core/embeddings'; -import logger from '../utils/logger'; -import db from '../db'; -import { chats, messages as messagesSchema } from '../db/schema'; -import { eq, asc, gt, and } from 'drizzle-orm'; -import crypto from 'crypto'; -import { getFileDetails } from '../utils/files'; -import MetaSearchAgent, { - MetaSearchAgentType, -} from '../search/metaSearchAgent'; -import prompts from '../prompts'; - -type Message = { - messageId: string; - chatId: string; - content: string; -}; - -type WSMessage = { - message: Message; - optimizationMode: 'speed' | 'balanced' | 'quality'; - type: string; - focusMode: string; - history: Array<[string, string]>; - files: Array<string>; -}; - -export const searchHandlers = { - webSearch: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, - responsePrompt: prompts.webSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: true, - }), - academicSearch: new MetaSearchAgent({ - activeEngines: ['arxiv', 'google scholar', 'pubmed'], - queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, - responsePrompt: prompts.academicSearchResponsePrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - writingAssistant: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: '', - responsePrompt: prompts.writingAssistantPrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: false, - summarizer: false, - }), - wolframAlphaSearch: new MetaSearchAgent({ - activeEngines: ['wolframalpha'], - queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, - responsePrompt: prompts.wolframAlphaSearchResponsePrompt, - rerank: false, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - youtubeSearch: new MetaSearchAgent({ - activeEngines: ['youtube'], - queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, - responsePrompt: prompts.youtubeSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), - redditSearch: new MetaSearchAgent({ - activeEngines: ['reddit'], - queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, - responsePrompt: prompts.redditSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), -}; - -const handleEmitterEvents = ( - emitter: EventEmitter, - ws: WebSocket, - messageId: string, - chatId: string, -) => { - let recievedMessage = ''; - let sources = []; - - emitter.on('data', (data) => { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - ws.send( - JSON.stringify({ - type: 'message', - data: parsedData.data, - messageId: messageId, - }), - ); - recievedMessage += parsedData.data; - } else if (parsedData.type === 'sources') { - ws.send( - JSON.stringify({ - type: 'sources', - data: parsedData.data, - messageId: messageId, - }), - ); - sources = parsedData.data; - } - }); - emitter.on('end', () => { - ws.send(JSON.stringify({ type: 'messageEnd', messageId: messageId })); - - db.insert(messagesSchema) - .values({ - content: recievedMessage, - chatId: chatId, - messageId: messageId, - role: 'assistant', - metadata: JSON.stringify({ - createdAt: new Date(), - ...(sources && sources.length > 0 && { sources }), - }), - }) - .execute(); - }); - emitter.on('error', (data) => { - const parsedData = JSON.parse(data); - ws.send( - JSON.stringify({ - type: 'error', - data: parsedData.data, - key: 'CHAIN_ERROR', - }), - ); - }); -}; - -export const handleMessage = async ( - message: string, - ws: WebSocket, - llm: BaseChatModel, - embeddings: Embeddings, -) => { - try { - const parsedWSMessage = JSON.parse(message) as WSMessage; - const parsedMessage = parsedWSMessage.message; - - if (parsedWSMessage.files.length > 0) { - /* TODO: Implement uploads in other classes/single meta class system*/ - parsedWSMessage.focusMode = 'webSearch'; - } - - const humanMessageId = - parsedMessage.messageId ?? crypto.randomBytes(7).toString('hex'); - const aiMessageId = crypto.randomBytes(7).toString('hex'); - - if (!parsedMessage.content) - return ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid message format', - key: 'INVALID_FORMAT', - }), - ); - - const history: BaseMessage[] = parsedWSMessage.history.map((msg) => { - if (msg[0] === 'human') { - return new HumanMessage({ - content: msg[1], - }); - } else { - return new AIMessage({ - content: msg[1], - }); - } - }); - - if (parsedWSMessage.type === 'message') { - const handler: MetaSearchAgentType = - searchHandlers[parsedWSMessage.focusMode]; - - if (handler) { - try { - const emitter = await handler.searchAndAnswer( - parsedMessage.content, - history, - llm, - embeddings, - parsedWSMessage.optimizationMode, - parsedWSMessage.files, - ); - - handleEmitterEvents(emitter, ws, aiMessageId, parsedMessage.chatId); - - const chat = await db.query.chats.findFirst({ - where: eq(chats.id, parsedMessage.chatId), - }); - - if (!chat) { - await db - .insert(chats) - .values({ - id: parsedMessage.chatId, - title: parsedMessage.content, - createdAt: new Date().toString(), - focusMode: parsedWSMessage.focusMode, - files: parsedWSMessage.files.map(getFileDetails), - }) - .execute(); - } - - const messageExists = await db.query.messages.findFirst({ - where: eq(messagesSchema.messageId, humanMessageId), - }); - - if (!messageExists) { - await db - .insert(messagesSchema) - .values({ - content: parsedMessage.content, - chatId: parsedMessage.chatId, - messageId: humanMessageId, - role: 'user', - metadata: JSON.stringify({ - createdAt: new Date(), - }), - }) - .execute(); - } else { - await db - .delete(messagesSchema) - .where( - and( - gt(messagesSchema.id, messageExists.id), - eq(messagesSchema.chatId, parsedMessage.chatId), - ), - ) - .execute(); - } - } catch (err) { - console.log(err); - } - } else { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid focus mode', - key: 'INVALID_FOCUS_MODE', - }), - ); - } - } - } catch (err) { - ws.send( - JSON.stringify({ - type: 'error', - data: 'Invalid message format', - key: 'INVALID_FORMAT', - }), - ); - logger.error(`Failed to handle message: ${err}`); - } -}; diff --git a/src/websocket/websocketServer.ts b/src/websocket/websocketServer.ts deleted file mode 100644 index 3ab0b51..0000000 --- a/src/websocket/websocketServer.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { WebSocketServer } from 'ws'; -import { handleConnection } from './connectionManager'; -import http from 'http'; -import { getPort } from '../config'; -import logger from '../utils/logger'; - -export const initServer = ( - server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, -) => { - const port = getPort(); - const wss = new WebSocketServer({ server }); - - wss.on('connection', handleConnection); - - logger.info(`WebSocket server started on port ${port}`); -}; diff --git a/ui/tailwind.config.ts b/tailwind.config.ts similarity index 88% rename from ui/tailwind.config.ts rename to tailwind.config.ts index 00ae10a..ae2cba9 100644 --- a/ui/tailwind.config.ts +++ b/tailwind.config.ts @@ -15,9 +15,9 @@ const themeLight = (colors: DefaultColors) => ({ const config: Config = { content: [ - './pages/**/*.{js,ts,jsx,tsx,mdx}', - './components/**/*.{js,ts,jsx,tsx,mdx}', - './app/**/*.{js,ts,jsx,tsx,mdx}', + './src/pages/**/*.{js,ts,jsx,tsx,mdx}', + './src/components/**/*.{js,ts,jsx,tsx,mdx}', + './src/app/**/*.{js,ts,jsx,tsx,mdx}', ], darkMode: 'class', theme: { diff --git a/tsconfig.json b/tsconfig.json index 48e6042..51d0dbc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,27 @@ { "compilerOptions": { - "lib": ["ESNext"], - "module": "Node16", - "moduleResolution": "Node16", - "target": "ESNext", - "outDir": "dist", - "sourceMap": false, - "esModuleInterop": true, - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "allowSyntheticDefaultImports": true, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, "skipLibCheck": true, - "skipDefaultLibCheck": true + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + }, + "target": "ES2017" }, - "include": ["src"], - "exclude": ["node_modules", "**/*.spec.ts"] + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/ui/.env.example b/ui/.env.example deleted file mode 100644 index 57a3ed9..0000000 --- a/ui/.env.example +++ /dev/null @@ -1,2 +0,0 @@ -NEXT_PUBLIC_WS_URL=ws://localhost:3001 -NEXT_PUBLIC_API_URL=http://localhost:3001/api \ No newline at end of file diff --git a/ui/.gitignore b/ui/.gitignore deleted file mode 100644 index 5913b49..0000000 --- a/ui/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# dependencies -/node_modules -/.pnp -.pnp.js -.yarn/install-state.gz - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts diff --git a/ui/.prettierignore b/ui/.prettierignore deleted file mode 100644 index 55d3c7c..0000000 --- a/ui/.prettierignore +++ /dev/null @@ -1,41 +0,0 @@ -# Ignore all files in the node_modules directory -node_modules - -# Ignore all files in the .next directory (Next.js build output) -.next - -# Ignore all files in the .out directory (TypeScript build output) -.out - -# Ignore all files in the .cache directory (Prettier cache) -.cache - -# Ignore all files in the .vscode directory (Visual Studio Code settings) -.vscode - -# Ignore all files in the .idea directory (IntelliJ IDEA settings) -.idea - -# Ignore all files in the dist directory (build output) -dist - -# Ignore all files in the build directory (build output) -build - -# Ignore all files in the coverage directory (test coverage reports) -coverage - -# Ignore all files with the .log extension -*.log - -# Ignore all files with the .tmp extension -*.tmp - -# Ignore all files with the .swp extension -*.swp - -# Ignore all files with the .DS_Store extension (macOS specific) -.DS_Store - -# Ignore all files in uploads directory -uploads \ No newline at end of file diff --git a/ui/.prettierrc.js b/ui/.prettierrc.js deleted file mode 100644 index 8ca480f..0000000 --- a/ui/.prettierrc.js +++ /dev/null @@ -1,11 +0,0 @@ -/** @type {import("prettier").Config} */ - -const config = { - printWidth: 80, - trailingComma: 'all', - endOfLine: 'auto', - singleQuote: true, - tabWidth: 2, -}; - -module.exports = config; diff --git a/ui/data/.gitignore b/ui/data/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/ui/data/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ui/drizzle.config.ts b/ui/drizzle.config.ts deleted file mode 100644 index 76b84a9..0000000 --- a/ui/drizzle.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { defineConfig } from 'drizzle-kit'; - -export default defineConfig({ - dialect: 'sqlite', - schema: './lib/db/schema.ts', - out: './drizzle', - dbCredentials: { - url: './data/db.sqlite', - }, -}); diff --git a/ui/lib/db/schema.ts b/ui/lib/db/schema.ts deleted file mode 100644 index cee9660..0000000 --- a/ui/lib/db/schema.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { sql } from 'drizzle-orm'; -import { text, integer, sqliteTable } from 'drizzle-orm/sqlite-core'; - -export const messages = sqliteTable('messages', { - id: integer('id').primaryKey(), - content: text('content').notNull(), - chatId: text('chatId').notNull(), - messageId: text('messageId').notNull(), - role: text('type', { enum: ['assistant', 'user'] }), - metadata: text('metadata', { - mode: 'json', - }), -}); - -interface File { - name: string; - fileId: string; -} - -export const chats = sqliteTable('chats', { - id: text('id').primaryKey(), - title: text('title').notNull(), - createdAt: text('createdAt').notNull(), - focusMode: text('focusMode').notNull(), - files: text('files', { mode: 'json' }) - .$type<File[]>() - .default(sql`'[]'`), -}); diff --git a/ui/lib/outputParsers/lineOutputParser.ts b/ui/lib/outputParsers/lineOutputParser.ts deleted file mode 100644 index fcd69ef..0000000 --- a/ui/lib/outputParsers/lineOutputParser.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { BaseOutputParser } from '@langchain/core/output_parsers'; - -interface LineOutputParserArgs { - key?: string; -} - -class LineOutputParser extends BaseOutputParser<string> { - private key = 'questions'; - - constructor(args?: LineOutputParserArgs) { - super(); - this.key = args?.key ?? this.key; - } - - static lc_name() { - return 'LineOutputParser'; - } - - lc_namespace = ['langchain', 'output_parsers', 'line_output_parser']; - - async parse(text: string): Promise<string> { - text = text.trim() || ''; - - const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; - const startKeyIndex = text.indexOf(`<${this.key}>`); - const endKeyIndex = text.indexOf(`</${this.key}>`); - - if (startKeyIndex === -1 || endKeyIndex === -1) { - return ''; - } - - const questionsStartIndex = - startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; - const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; - const line = text - .slice(questionsStartIndex, questionsEndIndex) - .trim() - .replace(regex, ''); - - return line; - } - - getFormatInstructions(): string { - throw new Error('Not implemented.'); - } -} - -export default LineOutputParser; diff --git a/ui/lib/outputParsers/listLineOutputParser.ts b/ui/lib/outputParsers/listLineOutputParser.ts deleted file mode 100644 index 6409db9..0000000 --- a/ui/lib/outputParsers/listLineOutputParser.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { BaseOutputParser } from '@langchain/core/output_parsers'; - -interface LineListOutputParserArgs { - key?: string; -} - -class LineListOutputParser extends BaseOutputParser<string[]> { - private key = 'questions'; - - constructor(args?: LineListOutputParserArgs) { - super(); - this.key = args?.key ?? this.key; - } - - static lc_name() { - return 'LineListOutputParser'; - } - - lc_namespace = ['langchain', 'output_parsers', 'line_list_output_parser']; - - async parse(text: string): Promise<string[]> { - text = text.trim() || ''; - - const regex = /^(\s*(-|\*|\d+\.\s|\d+\)\s|\u2022)\s*)+/; - const startKeyIndex = text.indexOf(`<${this.key}>`); - const endKeyIndex = text.indexOf(`</${this.key}>`); - - if (startKeyIndex === -1 || endKeyIndex === -1) { - return []; - } - - const questionsStartIndex = - startKeyIndex === -1 ? 0 : startKeyIndex + `<${this.key}>`.length; - const questionsEndIndex = endKeyIndex === -1 ? text.length : endKeyIndex; - const lines = text - .slice(questionsStartIndex, questionsEndIndex) - .trim() - .split('\n') - .filter((line) => line.trim() !== '') - .map((line) => line.replace(regex, '')); - - return lines; - } - - getFormatInstructions(): string { - throw new Error('Not implemented.'); - } -} - -export default LineListOutputParser; diff --git a/ui/lib/prompts/academicSearch.ts b/ui/lib/prompts/academicSearch.ts deleted file mode 100644 index c2946ff..0000000 --- a/ui/lib/prompts/academicSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const academicSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does stable diffusion work? -Rephrased: Stable diffusion working - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const academicSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/index.ts b/ui/lib/prompts/index.ts deleted file mode 100644 index f479185..0000000 --- a/ui/lib/prompts/index.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { - academicSearchResponsePrompt, - academicSearchRetrieverPrompt, -} from './academicSearch'; -import { - redditSearchResponsePrompt, - redditSearchRetrieverPrompt, -} from './redditSearch'; -import { webSearchResponsePrompt, webSearchRetrieverPrompt } from './webSearch'; -import { - wolframAlphaSearchResponsePrompt, - wolframAlphaSearchRetrieverPrompt, -} from './wolframAlpha'; -import { writingAssistantPrompt } from './writingAssistant'; -import { - youtubeSearchResponsePrompt, - youtubeSearchRetrieverPrompt, -} from './youtubeSearch'; - -export default { - webSearchResponsePrompt, - webSearchRetrieverPrompt, - academicSearchResponsePrompt, - academicSearchRetrieverPrompt, - redditSearchResponsePrompt, - redditSearchRetrieverPrompt, - wolframAlphaSearchResponsePrompt, - wolframAlphaSearchRetrieverPrompt, - writingAssistantPrompt, - youtubeSearchResponsePrompt, - youtubeSearchRetrieverPrompt, -}; diff --git a/ui/lib/prompts/redditSearch.ts b/ui/lib/prompts/redditSearch.ts deleted file mode 100644 index fc71957..0000000 --- a/ui/lib/prompts/redditSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const redditSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: Which company is most likely to create an AGI -Rephrased: Which company is most likely to create an AGI - -2. Follow up question: Is Earth flat? -Rephrased: Is Earth flat? - -3. Follow up question: Is there life on Mars? -Rephrased: Is there life on Mars? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const redditSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/webSearch.ts b/ui/lib/prompts/webSearch.ts deleted file mode 100644 index d8269c8..0000000 --- a/ui/lib/prompts/webSearch.ts +++ /dev/null @@ -1,106 +0,0 @@ -export const webSearchRetrieverPrompt = ` -You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. -If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). -If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. -You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. - -There are several examples attached for your reference inside the below \`examples\` XML block - -<examples> -1. Follow up question: What is the capital of France -Rephrased question:\` -<question> -Capital of france -</question> -\` - -2. Hi, how are you? -Rephrased question\` -<question> -not_needed -</question> -\` - -3. Follow up question: What is Docker? -Rephrased question: \` -<question> -What is Docker -</question> -\` - -4. Follow up question: Can you tell me what is X from https://example.com -Rephrased question: \` -<question> -Can you tell me what is X? -</question> - -<links> -https://example.com -</links> -\` - -5. Follow up question: Summarize the content from https://example.com -Rephrased question: \` -<question> -summarize -</question> - -<links> -https://example.com -</links> -\` -</examples> - -Anything below is the part of the actual conversation and you need to use conversation and the follow-up question to rephrase the follow-up question as a standalone question based on the guidelines shared above. - -<conversation> -{chat_history} -</conversation> - -Follow up question: {query} -Rephrased question: -`; - -export const webSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/wolframAlpha.ts b/ui/lib/prompts/wolframAlpha.ts deleted file mode 100644 index 40410c1..0000000 --- a/ui/lib/prompts/wolframAlpha.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const wolframAlphaSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: What is the atomic radius of S? -Rephrased: Atomic radius of S - -2. Follow up question: What is linear algebra? -Rephrased: Linear algebra - -3. Follow up question: What is the third law of thermodynamics? -Rephrased: Third law of thermodynamics - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const wolframAlphaSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/prompts/writingAssistant.ts b/ui/lib/prompts/writingAssistant.ts deleted file mode 100644 index f56bf47..0000000 --- a/ui/lib/prompts/writingAssistant.ts +++ /dev/null @@ -1,13 +0,0 @@ -export const writingAssistantPrompt = ` -You are Perplexica, an AI model who is expert at searching the web and answering user's queries. You are currently set on focus mode 'Writing Assistant', this means you will be helping the user write a response to a given query. -Since you are a writing assistant, you would not perform web searches. If you think you lack information to answer the query, you can ask the user for more information or suggest them to switch to a different focus mode. -You will be shared a context that can contain information from files user has uploaded to get answers from. You will have to generate answers upon that. - -You have to cite the answer using [number] notation. You must cite the sentences with their relevent context number. You must cite each and every part of the answer so the user can know where the information is coming from. -Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. -However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. - -<context> -{context} -</context> -`; diff --git a/ui/lib/prompts/youtubeSearch.ts b/ui/lib/prompts/youtubeSearch.ts deleted file mode 100644 index 5805b54..0000000 --- a/ui/lib/prompts/youtubeSearch.ts +++ /dev/null @@ -1,65 +0,0 @@ -export const youtubeSearchRetrieverPrompt = ` -You will be given a conversation below and a follow up question. You need to rephrase the follow-up question if needed so it is a standalone question that can be used by the LLM to search the web for information. -If it is a writing task or a simple hi, hello rather than a question, you need to return \`not_needed\` as the response. - -Example: -1. Follow up question: How does an A.C work? -Rephrased: A.C working - -2. Follow up question: Linear algebra explanation video -Rephrased: What is linear algebra? - -3. Follow up question: What is theory of relativity? -Rephrased: What is theory of relativity? - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: -`; - -export const youtubeSearchResponsePrompt = ` - You are Perplexica, an AI model skilled in web search and crafting detailed, engaging, and well-structured answers. You excel at summarizing web pages and extracting relevant information to create professional, blog-style responses. - - Your task is to provide answers that are: - - **Informative and relevant**: Thoroughly address the user's query using the given context. - - **Well-structured**: Include clear headings and subheadings, and use a professional tone to present information concisely and logically. - - **Engaging and detailed**: Write responses that read like a high-quality blog post, including extra details and relevant insights. - - **Cited and credible**: Use inline citations with [number] notation to refer to the context source(s) for each fact or detail included. - - **Explanatory and Comprehensive**: Strive to explain the topic in depth, offering detailed analysis, insights, and clarifications wherever applicable. - - ### Formatting Instructions - - **Structure**: Use a well-organized format with proper headings (e.g., "## Example heading 1" or "## Example heading 2"). Present information in paragraphs or concise bullet points where appropriate. - - **Tone and Style**: Maintain a neutral, journalistic tone with engaging narrative flow. Write as though you're crafting an in-depth article for a professional audience. - - **Markdown Usage**: Format your response with Markdown for clarity. Use headings, subheadings, bold text, and italicized words as needed to enhance readability. - - **Length and Depth**: Provide comprehensive coverage of the topic. Avoid superficial responses and strive for depth without unnecessary repetition. Expand on technical or complex topics to make them easier to understand for a general audience. - - **No main heading/title**: Start your response directly with the introduction unless asked to provide a specific title. - - **Conclusion or Summary**: Include a concluding paragraph that synthesizes the provided information or suggests potential next steps, where appropriate. - - ### Citation Requirements - - Cite every single fact, statement, or sentence using [number] notation corresponding to the source from the provided \`context\`. - - Integrate citations naturally at the end of sentences or clauses as appropriate. For example, "The Eiffel Tower is one of the most visited landmarks in the world[1]." - - Ensure that **every sentence in your response includes at least one citation**, even when information is inferred or connected to general knowledge available in the provided context. - - Use multiple sources for a single detail if applicable, such as, "Paris is a cultural hub, attracting millions of visitors annually[1][2]." - - Always prioritize credibility and accuracy by linking all statements back to their respective context sources. - - Avoid citing unsupported assumptions or personal interpretations; if no source supports a statement, clearly indicate the limitation. - - ### Special Instructions - - If the query involves technical, historical, or complex topics, provide detailed background and explanatory sections to ensure clarity. - - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip - - ### Example Output - - Begin with a brief introduction summarizing the event or query topic. - - Follow with detailed sections under clear headings, covering all aspects of the query if possible. - - Provide explanations or historical context as needed to enhance understanding. - - End with a conclusion or overall perspective if relevant. - - <context> - {context} - </context> - - Current date & time in ISO format (UTC timezone) is: {date}. -`; diff --git a/ui/lib/providers/anthropic.ts b/ui/lib/providers/anthropic.ts deleted file mode 100644 index 894fda5..0000000 --- a/ui/lib/providers/anthropic.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import { ChatModel } from '.'; -import { getAnthropicApiKey } from '../config'; - -const anthropicChatModels: Record<string, string>[] = [ - { - displayName: 'Claude 3.7 Sonnet', - key: 'claude-3-7-sonnet-20250219', - }, - { - displayName: 'Claude 3.5 Haiku', - key: 'claude-3-5-haiku-20241022', - }, - { - displayName: 'Claude 3.5 Sonnet v2', - key: 'claude-3-5-sonnet-20241022', - }, - { - displayName: 'Claude 3.5 Sonnet', - key: 'claude-3-5-sonnet-20240620', - }, - { - displayName: 'Claude 3 Opus', - key: 'claude-3-opus-20240229', - }, - { - displayName: 'Claude 3 Sonnet', - key: 'claude-3-sonnet-20240229', - }, - { - displayName: 'Claude 3 Haiku', - key: 'claude-3-haiku-20240307', - }, -]; - -export const loadAnthropicChatModels = async () => { - const anthropicApiKey = getAnthropicApiKey(); - - if (!anthropicApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - anthropicChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: anthropicApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://api.anthropic.com/v1/', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Anthropic models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/gemini.ts b/ui/lib/providers/gemini.ts deleted file mode 100644 index 28a31cf..0000000 --- a/ui/lib/providers/gemini.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getGeminiApiKey } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; - -const geminiChatModels: Record<string, string>[] = [ - { - displayName: 'Gemini 2.0 Flash', - key: 'gemini-2.0-flash', - }, - { - displayName: 'Gemini 2.0 Flash-Lite', - key: 'gemini-2.0-flash-lite', - }, - { - displayName: 'Gemini 2.0 Pro Experimental', - key: 'gemini-2.0-pro-exp-02-05', - }, - { - displayName: 'Gemini 1.5 Flash', - key: 'gemini-1.5-flash', - }, - { - displayName: 'Gemini 1.5 Flash-8B', - key: 'gemini-1.5-flash-8b', - }, - { - displayName: 'Gemini 1.5 Pro', - key: 'gemini-1.5-pro', - }, -]; - -const geminiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Gemini Embedding', - key: 'gemini-embedding-exp', - }, -]; - -export const loadGeminiChatModels = async () => { - const geminiApiKey = getGeminiApiKey(); - - if (!geminiApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - geminiChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: geminiApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Gemini models: ${err}`); - return {}; - } -}; - -export const loadGeminiEmbeddingModels = async () => { - const geminiApiKey = getGeminiApiKey(); - - if (!geminiApiKey) return {}; - - try { - const embeddingModels: Record<string, EmbeddingModel> = {}; - - geminiEmbeddingModels.forEach((model) => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: geminiApiKey, - modelName: model.key, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/groq.ts b/ui/lib/providers/groq.ts deleted file mode 100644 index 05947fb..0000000 --- a/ui/lib/providers/groq.ts +++ /dev/null @@ -1,107 +0,0 @@ -import { ChatOpenAI } from '@langchain/openai'; -import { getGroqApiKey } from '../config'; -import { ChatModel } from '.'; - -const groqChatModels: Record<string, string>[] = [ - { - displayName: 'Gemma2 9B IT', - key: 'gemma2-9b-it', - }, - { - displayName: 'Llama 3.3 70B Versatile', - key: 'llama-3.3-70b-versatile', - }, - { - displayName: 'Llama 3.1 8B Instant', - key: 'llama-3.1-8b-instant', - }, - { - displayName: 'Llama3 70B 8192', - key: 'llama3-70b-8192', - }, - { - displayName: 'Llama3 8B 8192', - key: 'llama3-8b-8192', - }, - { - displayName: 'Mixtral 8x7B 32768', - key: 'mixtral-8x7b-32768', - }, - { - displayName: 'Qwen QWQ 32B (Preview)', - key: 'qwen-qwq-32b', - }, - { - displayName: 'Mistral Saba 24B (Preview)', - key: 'mistral-saba-24b', - }, - { - displayName: 'Qwen 2.5 Coder 32B (Preview)', - key: 'qwen-2.5-coder-32b', - }, - { - displayName: 'Qwen 2.5 32B (Preview)', - key: 'qwen-2.5-32b', - }, - { - displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', - key: 'deepseek-r1-distill-qwen-32b', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', - key: 'deepseek-r1-distill-llama-70b-specdec', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', - key: 'deepseek-r1-distill-llama-70b', - }, - { - displayName: 'Llama 3.3 70B SpecDec (Preview)', - key: 'llama-3.3-70b-specdec', - }, - { - displayName: 'Llama 3.2 1B Preview (Preview)', - key: 'llama-3.2-1b-preview', - }, - { - displayName: 'Llama 3.2 3B Preview (Preview)', - key: 'llama-3.2-3b-preview', - }, - { - displayName: 'Llama 3.2 11B Vision Preview (Preview)', - key: 'llama-3.2-11b-vision-preview', - }, - { - displayName: 'Llama 3.2 90B Vision Preview (Preview)', - key: 'llama-3.2-90b-vision-preview', - }, -]; - -export const loadGroqChatModels = async () => { - const groqApiKey = getGroqApiKey(); - - if (!groqApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - groqChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: groqApiKey, - modelName: model.key, - temperature: 0.7, - configuration: { - baseURL: 'https://api.groq.com/openai/v1', - }, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Groq models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/index.ts b/ui/lib/providers/index.ts deleted file mode 100644 index e45c09d..0000000 --- a/ui/lib/providers/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Embeddings } from '@langchain/core/embeddings'; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; -import { - getCustomOpenaiApiKey, - getCustomOpenaiApiUrl, - getCustomOpenaiModelName, -} from '../config'; -import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; -import { loadGroqChatModels } from './groq'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; - -export interface ChatModel { - displayName: string; - model: BaseChatModel; -} - -export interface EmbeddingModel { - displayName: string; - model: Embeddings; -} - -export const chatModelProviders: Record< - string, - () => Promise<Record<string, ChatModel>> -> = { - openai: loadOpenAIChatModels, - ollama: loadOllamaChatModels, - groq: loadGroqChatModels, - anthropic: loadAnthropicChatModels, - gemini: loadGeminiChatModels, -}; - -export const embeddingModelProviders: Record< - string, - () => Promise<Record<string, EmbeddingModel>> -> = { - openai: loadOpenAIEmbeddingModels, - ollama: loadOllamaEmbeddingModels, - gemini: loadGeminiEmbeddingModels, -}; - -export const getAvailableChatModelProviders = async () => { - const models: Record<string, Record<string, ChatModel>> = {}; - - for (const provider in chatModelProviders) { - const providerModels = await chatModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } - } - - const customOpenAiApiKey = getCustomOpenaiApiKey(); - const customOpenAiApiUrl = getCustomOpenaiApiUrl(); - const customOpenAiModelName = getCustomOpenaiModelName(); - - models['custom_openai'] = { - ...(customOpenAiApiKey && customOpenAiApiUrl && customOpenAiModelName - ? { - [customOpenAiModelName]: { - displayName: customOpenAiModelName, - model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, - modelName: customOpenAiModelName, - temperature: 0.7, - configuration: { - baseURL: customOpenAiApiUrl, - }, - }), - }, - } - : {}), - }; - - return models; -}; - -export const getAvailableEmbeddingModelProviders = async () => { - const models: Record<string, Record<string, EmbeddingModel>> = {}; - - for (const provider in embeddingModelProviders) { - const providerModels = await embeddingModelProviders[provider](); - if (Object.keys(providerModels).length > 0) { - models[provider] = providerModels; - } - } - - return models; -}; diff --git a/ui/lib/providers/ollama.ts b/ui/lib/providers/ollama.ts deleted file mode 100644 index 92e98e4..0000000 --- a/ui/lib/providers/ollama.ts +++ /dev/null @@ -1,73 +0,0 @@ -import axios from 'axios'; -import { getKeepAlive, getOllamaApiEndpoint } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; - -export const loadOllamaChatModels = async () => { - const ollamaApiEndpoint = getOllamaApiEndpoint(); - - if (!ollamaApiEndpoint) return {}; - - try { - const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { - headers: { - 'Content-Type': 'application/json', - }, - }); - - const { models } = res.data; - - const chatModels: Record<string, ChatModel> = {}; - - models.forEach((model: any) => { - chatModels[model.model] = { - displayName: model.name, - model: new ChatOllama({ - baseUrl: ollamaApiEndpoint, - model: model.model, - temperature: 0.7, - keepAlive: getKeepAlive(), - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading Ollama models: ${err}`); - return {}; - } -}; - -export const loadOllamaEmbeddingModels = async () => { - const ollamaApiEndpoint = getOllamaApiEndpoint(); - - if (!ollamaApiEndpoint) return {}; - - try { - const res = await axios.get(`${ollamaApiEndpoint}/api/tags`, { - headers: { - 'Content-Type': 'application/json', - }, - }); - - const { models } = res.data; - - const embeddingModels: Record<string, EmbeddingModel> = {}; - - models.forEach((model: any) => { - embeddingModels[model.model] = { - displayName: model.name, - model: new OllamaEmbeddings({ - baseUrl: ollamaApiEndpoint, - model: model.model, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading Ollama embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/providers/openai.ts b/ui/lib/providers/openai.ts deleted file mode 100644 index c6b938d..0000000 --- a/ui/lib/providers/openai.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; -import { getOpenaiApiKey } from '../config'; -import { ChatModel, EmbeddingModel } from '.'; - -const openaiChatModels: Record<string, string>[] = [ - { - displayName: 'GPT-3.5 Turbo', - key: 'gpt-3.5-turbo', - }, - { - displayName: 'GPT-4', - key: 'gpt-4', - }, - { - displayName: 'GPT-4 turbo', - key: 'gpt-4-turbo', - }, - { - displayName: 'GPT-4 omni', - key: 'gpt-4o', - }, - { - displayName: 'GPT-4 omni mini', - key: 'gpt-4o-mini', - }, -]; - -const openaiEmbeddingModels: Record<string, string>[] = [ - { - displayName: 'Text Embedding 3 Small', - key: 'text-embedding-3-small', - }, - { - displayName: 'Text Embedding 3 Large', - key: 'text-embedding-3-large', - }, -]; - -export const loadOpenAIChatModels = async () => { - const openaiApiKey = getOpenaiApiKey(); - - if (!openaiApiKey) return {}; - - try { - const chatModels: Record<string, ChatModel> = {}; - - openaiChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, - modelName: model.key, - temperature: 0.7, - }), - }; - }); - - return chatModels; - } catch (err) { - console.error(`Error loading OpenAI models: ${err}`); - return {}; - } -}; - -export const loadOpenAIEmbeddingModels = async () => { - const openaiApiKey = getOpenaiApiKey(); - - if (!openaiApiKey) return {}; - - try { - const embeddingModels: Record<string, EmbeddingModel> = {}; - - openaiEmbeddingModels.forEach((model) => { - embeddingModels[model.key] = { - displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, - modelName: model.key, - }), - }; - }); - - return embeddingModels; - } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); - return {}; - } -}; diff --git a/ui/lib/searxng.ts b/ui/lib/searxng.ts deleted file mode 100644 index ae19db2..0000000 --- a/ui/lib/searxng.ts +++ /dev/null @@ -1,48 +0,0 @@ -import axios from 'axios'; -import { getSearxngApiEndpoint } from './config'; - -interface SearxngSearchOptions { - categories?: string[]; - engines?: string[]; - language?: string; - pageno?: number; -} - -interface SearxngSearchResult { - title: string; - url: string; - img_src?: string; - thumbnail_src?: string; - thumbnail?: string; - content?: string; - author?: string; - iframe_src?: string; -} - -export const searchSearxng = async ( - query: string, - opts?: SearxngSearchOptions, -) => { - const searxngURL = getSearxngApiEndpoint(); - - const url = new URL(`${searxngURL}/search?format=json`); - url.searchParams.append('q', query); - - if (opts) { - Object.keys(opts).forEach((key) => { - const value = opts[key as keyof SearxngSearchOptions]; - if (Array.isArray(value)) { - url.searchParams.append(key, value.join(',')); - return; - } - url.searchParams.append(key, value as string); - }); - } - - const res = await axios.get(url.toString()); - - const results: SearxngSearchResult[] = res.data.results; - const suggestions: string[] = res.data.suggestions; - - return { results, suggestions }; -}; diff --git a/ui/lib/utils/files.ts b/ui/lib/utils/files.ts deleted file mode 100644 index e6e91df..0000000 --- a/ui/lib/utils/files.ts +++ /dev/null @@ -1,17 +0,0 @@ -import path from 'path'; -import fs from 'fs'; - -export const getFileDetails = (fileId: string) => { - const fileLoc = path.join( - process.cwd(), - './uploads', - fileId + '-extracted.json', - ); - - const parsedFile = JSON.parse(fs.readFileSync(fileLoc, 'utf8')); - - return { - name: parsedFile.title, - fileId: fileId, - }; -}; diff --git a/ui/lib/utils/formatHistory.ts b/ui/lib/utils/formatHistory.ts deleted file mode 100644 index 6d0d309..0000000 --- a/ui/lib/utils/formatHistory.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { BaseMessage } from '@langchain/core/messages'; - -const formatChatHistoryAsString = (history: BaseMessage[]) => { - return history - .map((message) => `${message._getType()}: ${message.content}`) - .join('\n'); -}; - -export default formatChatHistoryAsString; diff --git a/ui/package.json b/ui/package.json deleted file mode 100644 index c9314b4..0000000 --- a/ui/package.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "name": "perplexica-frontend", - "version": "1.10.0-rc3", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push sqlite" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} diff --git a/ui/tsconfig.json b/ui/tsconfig.json deleted file mode 100644 index 64c2104..0000000 --- a/ui/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./*"] - }, - "target": "ES2017" - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/ui/uploads/.gitignore b/ui/uploads/.gitignore deleted file mode 100644 index d6b7ef3..0000000 --- a/ui/uploads/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -* -!.gitignore diff --git a/ui/yarn.lock b/ui/yarn.lock deleted file mode 100644 index 31abdb3..0000000 --- a/ui/yarn.lock +++ /dev/null @@ -1,4883 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@anthropic-ai/sdk@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" - integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" - integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== - dependencies: - regenerator-runtime "^0.14.0" - -"@cfworker/json-schema@^4.0.2": - version "4.1.1" - resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" - integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== - -"@colors/colors@1.6.0", "@colors/colors@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" - integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== - -"@dabh/diagnostics@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" - integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@drizzle-team/brocli@^0.10.2": - version "0.10.2" - resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" - integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== - -"@emnapi/runtime@^1.2.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" - integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== - dependencies: - tslib "^2.4.0" - -"@esbuild-kit/core-utils@^3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" - integrity sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ== - dependencies: - esbuild "~0.18.20" - source-map-support "^0.5.21" - -"@esbuild-kit/esm-loader@^2.5.5": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz#6eedee46095d7d13b1efc381e2211ed1c60e64ea" - integrity sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA== - dependencies: - "@esbuild-kit/core-utils" "^3.3.2" - get-tsconfig "^4.7.0" - -"@esbuild/aix-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" - integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== - -"@esbuild/android-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" - integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== - -"@esbuild/android-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" - integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== - -"@esbuild/android-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" - integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== - -"@esbuild/android-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" - integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== - -"@esbuild/android-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" - integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== - -"@esbuild/android-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" - integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== - -"@esbuild/darwin-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" - integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== - -"@esbuild/darwin-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" - integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== - -"@esbuild/darwin-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" - integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== - -"@esbuild/darwin-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" - integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== - -"@esbuild/freebsd-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" - integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== - -"@esbuild/freebsd-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" - integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== - -"@esbuild/freebsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" - integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== - -"@esbuild/freebsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" - integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== - -"@esbuild/linux-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" - integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== - -"@esbuild/linux-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" - integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== - -"@esbuild/linux-arm@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" - integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== - -"@esbuild/linux-arm@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" - integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== - -"@esbuild/linux-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" - integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== - -"@esbuild/linux-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" - integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== - -"@esbuild/linux-loong64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" - integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== - -"@esbuild/linux-loong64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" - integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== - -"@esbuild/linux-mips64el@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" - integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== - -"@esbuild/linux-mips64el@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" - integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== - -"@esbuild/linux-ppc64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" - integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== - -"@esbuild/linux-ppc64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" - integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== - -"@esbuild/linux-riscv64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" - integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== - -"@esbuild/linux-riscv64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" - integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== - -"@esbuild/linux-s390x@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" - integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== - -"@esbuild/linux-s390x@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" - integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== - -"@esbuild/linux-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" - integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== - -"@esbuild/linux-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" - integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== - -"@esbuild/netbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" - integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== - -"@esbuild/netbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" - integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== - -"@esbuild/openbsd-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" - integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== - -"@esbuild/openbsd-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" - integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== - -"@esbuild/sunos-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" - integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== - -"@esbuild/sunos-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" - integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== - -"@esbuild/win32-arm64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" - integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== - -"@esbuild/win32-arm64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" - integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== - -"@esbuild/win32-ia32@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" - integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== - -"@esbuild/win32-ia32@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" - integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== - -"@esbuild/win32-x64@0.18.20": - version "0.18.20" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" - integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== - -"@esbuild/win32-x64@0.19.12": - version "0.19.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" - integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.57.0": - version "8.57.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" - integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== - -"@floating-ui/core@^1.6.0": - version "1.6.8" - resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" - integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== - dependencies: - "@floating-ui/utils" "^0.2.8" - -"@floating-ui/dom@^1.0.0": - version "1.6.12" - resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" - integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== - dependencies: - "@floating-ui/core" "^1.6.0" - "@floating-ui/utils" "^0.2.8" - -"@floating-ui/react-dom@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" - integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/react@^0.26.16": - version "0.26.28" - resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" - integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== - dependencies: - "@floating-ui/react-dom" "^2.1.2" - "@floating-ui/utils" "^0.2.8" - tabbable "^6.0.0" - -"@floating-ui/utils@^0.2.8": - version "0.2.8" - resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" - integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== - -"@headlessui/react@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" - integrity sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ== - dependencies: - "@floating-ui/react" "^0.26.16" - "@react-aria/focus" "^3.17.1" - "@react-aria/interactions" "^3.21.3" - "@tanstack/react-virtual" "^3.8.1" - -"@humanwhocodes/config-array@^0.11.14": - version "0.11.14" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" - integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== - dependencies: - "@humanwhocodes/object-schema" "^2.0.2" - debug "^4.3.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== - -"@iarna/toml@^2.2.5": - version "2.2.5" - resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" - integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== - -"@icons-pack/react-simple-icons@^12.3.0": - version "12.3.0" - resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" - integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== - -"@img/sharp-darwin-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" - integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== - optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.0.4" - -"@img/sharp-darwin-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" - integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.4" - -"@img/sharp-libvips-darwin-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" - integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== - -"@img/sharp-libvips-darwin-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" - integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== - -"@img/sharp-libvips-linux-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" - integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== - -"@img/sharp-libvips-linux-arm@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" - integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== - -"@img/sharp-libvips-linux-s390x@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" - integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== - -"@img/sharp-libvips-linux-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" - integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" - integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== - -"@img/sharp-libvips-linuxmusl-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" - integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== - -"@img/sharp-linux-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" - integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.4" - -"@img/sharp-linux-arm@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" - integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.5" - -"@img/sharp-linux-s390x@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" - integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.4" - -"@img/sharp-linux-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" - integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.4" - -"@img/sharp-linuxmusl-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" - integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - -"@img/sharp-linuxmusl-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" - integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - -"@img/sharp-wasm32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" - integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== - dependencies: - "@emnapi/runtime" "^1.2.0" - -"@img/sharp-win32-ia32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" - integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== - -"@img/sharp-win32-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" - integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.24": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@langchain/community@^0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" - integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== - dependencies: - "@langchain/openai" ">=0.2.0 <0.5.0" - binary-extensions "^2.2.0" - expr-eval "^2.0.2" - flat "^5.0.2" - js-yaml "^4.1.0" - langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" - langsmith ">=0.2.8 <0.4.0" - uuid "^10.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/community@~0.0.41": - version "0.0.44" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" - integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== - dependencies: - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" - expr-eval "^2.0.2" - flat "^5.0.2" - langsmith "~0.1.1" - uuid "^9.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/core@^0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" - integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== - dependencies: - "@cfworker/json-schema" "^4.0.2" - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith ">=0.2.8 <0.4.0" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^10.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.54" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" - integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" - integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== - dependencies: - js-tiktoken "^1.0.12" - openai "^4.87.3" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@^0.0.25": - version "0.0.25" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" - integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.26.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": - version "0.0.26" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" - integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.32.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" - integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== - dependencies: - js-tiktoken "^1.0.12" - -"@next/env@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" - integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== - -"@next/eslint-plugin-next@14.1.4": - version "14.1.4" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" - integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== - dependencies: - glob "10.3.10" - -"@next/swc-darwin-arm64@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" - integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== - -"@next/swc-darwin-x64@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" - integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== - -"@next/swc-linux-arm64-gnu@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" - integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== - -"@next/swc-linux-arm64-musl@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" - integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== - -"@next/swc-linux-x64-gnu@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" - integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== - -"@next/swc-linux-x64-musl@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" - integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== - -"@next/swc-win32-arm64-msvc@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" - integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== - -"@next/swc-win32-x64-msvc@15.2.2": - version "15.2.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" - integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@petamoriken/float16@^3.8.7": - version "3.9.2" - resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" - integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@react-aria/focus@^3.17.1": - version "3.18.4" - resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" - integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== - dependencies: - "@react-aria/interactions" "^3.22.4" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": - version "3.22.4" - resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" - integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== - dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-aria/utils" "^3.25.3" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - -"@react-aria/ssr@^3.9.6": - version "3.9.6" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" - integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-aria/utils@^3.25.3": - version "3.25.3" - resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" - integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== - dependencies: - "@react-aria/ssr" "^3.9.6" - "@react-stately/utils" "^3.10.4" - "@react-types/shared" "^3.25.0" - "@swc/helpers" "^0.5.0" - clsx "^2.0.0" - -"@react-stately/utils@^3.10.4": - version "3.10.4" - resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" - integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== - dependencies: - "@swc/helpers" "^0.5.0" - -"@react-types/shared@^3.25.0": - version "3.25.0" - resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" - integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== - -"@rushstack/eslint-patch@^1.3.3": - version "1.10.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" - integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== - -"@selderee/plugin-htmlparser2@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz#d5b5e29a7ba6d3958a1972c7be16f4b2c188c517" - integrity sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ== - dependencies: - domhandler "^5.0.3" - selderee "^0.11.0" - -"@swc/counter@0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" - integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== - dependencies: - tslib "^2.8.0" - -"@tailwindcss/typography@^0.5.12": - version "0.5.12" - resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.12.tgz#c0532fd594427b7f4e8e38eff7bf272c63a1dca4" - integrity sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg== - dependencies: - lodash.castarray "^4.4.0" - lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" - postcss-selector-parser "6.0.10" - -"@tanstack/react-virtual@^3.8.1": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" - integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== - dependencies: - "@tanstack/virtual-core" "3.10.9" - -"@tanstack/virtual-core@3.10.9": - version "3.10.9" - resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" - integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== - -"@types/better-sqlite3@^7.6.12": - version "7.6.12" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" - integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== - dependencies: - "@types/node" "*" - -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz#41fec4ea20e9c7b22f024ab88a95c6bb288f51b8" - integrity sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/html-to-text@^9.0.4": - version "9.0.4" - resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" - integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== - -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/multer@^1.4.12": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" - integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== - dependencies: - "@types/express" "*" - -"@types/node-fetch@^2.6.4": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - -"@types/node@*", "@types/node@^20": - version "20.12.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" - integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== - dependencies: - undici-types "~5.26.4" - -"@types/node@^18.11.18": - version "18.19.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" - integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== - dependencies: - undici-types "~5.26.4" - -"@types/pdf-parse@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" - integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== - -"@types/prop-types@*": - version "15.7.12" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== - -"@types/qs@*": - version "6.9.18" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.18.tgz#877292caa91f7c1b213032b34626505b746624c2" - integrity sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/react-dom@^18": - version "18.2.24" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" - integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18": - version "18.2.74" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c" - integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw== - dependencies: - "@types/prop-types" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/triple-beam@^1.3.2": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" - integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== - -"@types/uuid@^10.0.0": - version "10.0.0" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" - integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== - -"@types/uuid@^9.0.1": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" - integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== - dependencies: - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" - integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - -"@typescript-eslint/types@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" - integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== - -"@typescript-eslint/typescript-estree@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" - integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== - dependencies: - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/visitor-keys" "6.21.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - minimatch "9.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/visitor-keys@6.21.0": - version "6.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" - integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== - dependencies: - "@typescript-eslint/types" "6.21.0" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== - -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" - integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== - dependencies: - call-bind "^1.0.5" - is-array-buffer "^3.0.4" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.8" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" - integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlast@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" - integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.findlastindex@^1.2.3: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" - integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-shim-unscopables "^1.0.2" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.toreversed@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" - integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" - es-shim-unscopables "^1.0.2" - -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" - define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" - is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" - integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== - -async@^3.2.3: - version "3.2.6" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -autoprefixer@^10.0.1: - version "10.4.19" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" - integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== - dependencies: - browserslist "^4.23.0" - caniuse-lite "^1.0.30001599" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== - -axios@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" - integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== - dependencies: - follow-redirects "^1.15.6" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - -base64-js@^1.3.1, base64-js@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -better-sqlite3@^11.9.1: - version "11.9.1" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" - integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== - dependencies: - bindings "^1.5.0" - prebuild-install "^7.1.1" - -binary-extensions@^2.0.0, binary-extensions@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -binary-search@^1.3.5: - version "1.3.6" - resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" - integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== - dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" - node-releases "^2.0.14" - update-browserslist-db "^1.0.13" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -busboy@1.6.0, busboy@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@6: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001579: - version "1.0.30001705" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" - integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== - -caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: - version "1.0.30001606" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" - integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== - -chalk@^4.0.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -clsx@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -clsx@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" - integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== - -color-convert@^1.9.3: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.6.0, color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colorspace@1.1.x: - version "1.1.4" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243" - integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== - dependencies: - color "^3.1.3" - text-hex "1.0.x" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -compute-cosine-similarity@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" - integrity sha512-FXhNx0ILLjGi9Z9+lglLzM12+0uoTnYkHm7GiadXDAr0HGVLm25OivUS1B/LPkbzzvlcXz/1EvWg9ZYyJSdhTw== - dependencies: - compute-dot "^1.1.0" - compute-l2norm "^1.1.0" - validate.io-array "^1.0.5" - validate.io-function "^1.0.2" - -compute-dot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-dot/-/compute-dot-1.1.0.tgz#01a5ba2c7af73b99002acb258459c9576a8232dc" - integrity sha512-L5Ocet4DdMrXboss13K59OK23GXjiSia7+7Ukc7q4Bl+RVpIXK2W9IHMbWDZkh+JUEvJAwOKRaJDiFUa1LTnJg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - -compute-l2norm@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/compute-l2norm/-/compute-l2norm-1.1.0.tgz#bd09131c6b36c8d70c68334e176009a4e0a989ac" - integrity sha512-6EHh1Elj90eU28SXi+h2PLnTQvZmkkHWySpoFz+WOlVNLz3DQoC4ISUHSV9n5jMxPHtKGJ01F4uu2PsXBB8sSg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-table-printer@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" - integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== - dependencies: - simple-wcswidth "^1.0.1" - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -data-view-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" - integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" - integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -debug@^3.1.0, debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -detect-libc@^2.0.0, detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -digest-fetch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" - integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== - dependencies: - base-64 "^0.1.0" - md5 "^2.3.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^3.0.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" - integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -drizzle-kit@^0.30.5: - version "0.30.5" - resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" - integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== - dependencies: - "@drizzle-team/brocli" "^0.10.2" - "@esbuild-kit/esm-loader" "^2.5.5" - esbuild "^0.19.7" - esbuild-register "^3.5.0" - gel "^2.0.0" - -drizzle-orm@^0.40.1: - version "0.40.1" - resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" - integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -electron-to-chromium@^1.4.668: - version "1.4.729" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" - integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.12.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -env-paths@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" - integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== - -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: - version "1.23.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" - integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== - dependencies: - array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - data-view-buffer "^1.0.1" - data-view-byte-length "^1.0.1" - data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" - get-symbol-description "^1.0.2" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - hasown "^2.0.2" - internal-slot "^1.0.7" - is-array-buffer "^3.0.4" - is-callable "^1.2.7" - is-data-view "^1.0.1" - is-negative-zero "^2.0.3" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" - is-typed-array "^1.1.13" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.5" - regexp.prototype.flags "^1.5.2" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.2" - typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: - version "1.0.18" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" - integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-errors "^1.3.0" - es-set-tostringtag "^2.0.3" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - iterator.prototype "^1.1.2" - safe-array-concat "^1.1.2" - -es-object-atoms@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" - integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" - integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== - dependencies: - get-intrinsic "^1.2.4" - has-tostringtag "^1.0.2" - hasown "^2.0.1" - -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -esbuild-register@^3.5.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" - integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== - dependencies: - debug "^4.3.4" - -esbuild@^0.19.7: - version "0.19.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" - integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.19.12" - "@esbuild/android-arm" "0.19.12" - "@esbuild/android-arm64" "0.19.12" - "@esbuild/android-x64" "0.19.12" - "@esbuild/darwin-arm64" "0.19.12" - "@esbuild/darwin-x64" "0.19.12" - "@esbuild/freebsd-arm64" "0.19.12" - "@esbuild/freebsd-x64" "0.19.12" - "@esbuild/linux-arm" "0.19.12" - "@esbuild/linux-arm64" "0.19.12" - "@esbuild/linux-ia32" "0.19.12" - "@esbuild/linux-loong64" "0.19.12" - "@esbuild/linux-mips64el" "0.19.12" - "@esbuild/linux-ppc64" "0.19.12" - "@esbuild/linux-riscv64" "0.19.12" - "@esbuild/linux-s390x" "0.19.12" - "@esbuild/linux-x64" "0.19.12" - "@esbuild/netbsd-x64" "0.19.12" - "@esbuild/openbsd-x64" "0.19.12" - "@esbuild/sunos-x64" "0.19.12" - "@esbuild/win32-arm64" "0.19.12" - "@esbuild/win32-ia32" "0.19.12" - "@esbuild/win32-x64" "0.19.12" - -esbuild@~0.18.20: - version "0.18.20" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" - integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== - optionalDependencies: - "@esbuild/android-arm" "0.18.20" - "@esbuild/android-arm64" "0.18.20" - "@esbuild/android-x64" "0.18.20" - "@esbuild/darwin-arm64" "0.18.20" - "@esbuild/darwin-x64" "0.18.20" - "@esbuild/freebsd-arm64" "0.18.20" - "@esbuild/freebsd-x64" "0.18.20" - "@esbuild/linux-arm" "0.18.20" - "@esbuild/linux-arm64" "0.18.20" - "@esbuild/linux-ia32" "0.18.20" - "@esbuild/linux-loong64" "0.18.20" - "@esbuild/linux-mips64el" "0.18.20" - "@esbuild/linux-ppc64" "0.18.20" - "@esbuild/linux-riscv64" "0.18.20" - "@esbuild/linux-s390x" "0.18.20" - "@esbuild/linux-x64" "0.18.20" - "@esbuild/netbsd-x64" "0.18.20" - "@esbuild/openbsd-x64" "0.18.20" - "@esbuild/sunos-x64" "0.18.20" - "@esbuild/win32-arm64" "0.18.20" - "@esbuild/win32-ia32" "0.18.20" - "@esbuild/win32-x64" "0.18.20" - -escalade@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" - integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.1.4: - version "14.1.4" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" - integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== - dependencies: - "@next/eslint-plugin-next" "14.1.4" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" - integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.15.0" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== - dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" - array.prototype.flatmap "^1.3.2" - ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" - jsx-ast-utils "^3.3.5" - language-tags "^1.0.9" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.33.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== - dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" - array.prototype.flatmap "^1.3.2" - array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" - prop-types "^15.8.1" - resolve "^2.0.0-next.5" - semver "^6.3.1" - string.prototype.matchall "^4.0.10" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8: - version "8.57.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" - integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.0" - "@humanwhocodes/config-array" "^0.11.14" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -expr-eval@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" - integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.17.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" - integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== - dependencies: - reusify "^1.0.4" - -fecha@^4.2.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" - integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.1" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" - integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -follow-redirects@^1.15.6: - version "1.15.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" - integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data-encoder@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" - integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formdata-node@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" - integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== - dependencies: - node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.3" - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gel@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" - integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== - dependencies: - "@petamoriken/float16" "^3.8.7" - debug "^4.3.4" - env-paths "^3.0.0" - semver "^7.6.2" - shell-quote "^1.8.1" - which "^4.0.0" - -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== - dependencies: - call-bind "^1.0.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - -get-tsconfig@^4.5.0: - version "4.7.3" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" - integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== - dependencies: - resolve-pkg-maps "^1.0.0" - -get-tsconfig@^4.7.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" - integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== - dependencies: - resolve-pkg-maps "^1.0.0" - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob@10.3.10: - version "10.3.10" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" - integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.5" - minimatch "^9.0.1" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry "^1.10.1" - -glob@^10.3.10: - version "10.3.12" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" - integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.3.6" - minimatch "^9.0.1" - minipass "^7.0.4" - path-scurry "^1.10.2" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -html-to-text@^9.0.5: - version "9.0.5" - resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-9.0.5.tgz#6149a0f618ae7a0db8085dca9bbf96d32bb8368d" - integrity sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg== - dependencies: - "@selderee/plugin-htmlparser2" "^0.11.0" - deepmerge "^4.3.1" - dom-serializer "^2.0.0" - htmlparser2 "^8.0.2" - selderee "^0.11.0" - -htmlparser2@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" - integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-any-array@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" - integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== - -is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== - dependencies: - is-typed-array "^1.1.13" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== - dependencies: - call-bind "^1.0.7" - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== - dependencies: - which-typed-array "^1.1.14" - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isexe@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" - integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jackspeak@^2.3.5, jackspeak@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" - integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jiti@^1.21.0: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -js-tiktoken@^1.0.12: - version "1.0.19" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" - integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== - dependencies: - base64-js "^1.5.1" - -js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" - integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== - dependencies: - base64-js "^1.5.1" - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonpointer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" - integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": - version "0.3.19" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" - integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== - dependencies: - "@langchain/openai" ">=0.1.0 <0.5.0" - "@langchain/textsplitters" ">=0.0.0 <0.2.0" - js-tiktoken "^1.0.12" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langsmith ">=0.2.8 <0.4.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^10.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchain@^0.1.30: - version "0.1.31" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" - integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== - dependencies: - "@anthropic-ai/sdk" "^0.9.1" - "@langchain/community" "~0.0.41" - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.26" - binary-extensions "^2.2.0" - js-tiktoken "^1.0.7" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^9.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchainhub@~0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" - integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== - -"langsmith@>=0.2.8 <0.4.0": - version "0.3.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" - integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== - dependencies: - "@types/uuid" "^10.0.0" - chalk "^4.1.2" - console-table-printer "^2.12.1" - p-queue "^6.6.2" - p-retry "4" - semver "^7.6.3" - uuid "^10.0.0" - -langsmith@~0.1.1, langsmith@~0.1.7: - version "0.1.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" - integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== - dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - -language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" - integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== - dependencies: - language-subtag-registry "^0.3.20" - -leac@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" - integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" - integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.castarray@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" - integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== - -lodash.isplainobject@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -logform@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" - integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== - dependencies: - "@colors/colors" "1.6.0" - "@types/triple-beam" "^1.3.2" - fecha "^4.2.0" - ms "^2.1.1" - safe-stable-stringify "^2.3.1" - triple-beam "^1.3.0" - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" - integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lucide-react@^0.363.0: - version "0.363.0" - resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" - integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== - -markdown-to-jsx@^7.7.2: - version "7.7.2" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" - integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@~2.1.24: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" - integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -ml-array-mean@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" - integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== - dependencies: - ml-array-sum "^1.1.6" - -ml-array-sum@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" - integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== - dependencies: - is-any-array "^2.0.0" - -ml-distance-euclidean@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" - integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== - -ml-distance@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" - integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== - dependencies: - ml-array-mean "^1.1.6" - ml-distance-euclidean "^2.0.0" - ml-tree-similarity "^1.0.0" - -ml-tree-similarity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" - integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== - dependencies: - binary-search "^1.3.5" - num-sort "^2.0.0" - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.0.0, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multer@^1.4.5-lts.1: - version "1.4.5-lts.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" - integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== - dependencies: - append-field "^1.0.0" - busboy "^1.0.0" - concat-stream "^1.5.2" - mkdirp "^0.5.4" - object-assign "^4.1.1" - type-is "^1.6.4" - xtend "^4.0.0" - -mustache@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" - integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6: - version "3.3.10" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" - integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== - -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== - -napi-build-utils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" - integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next-themes@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" - integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== - -next@^15.2.2: - version "15.2.2" - resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" - integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== - dependencies: - "@next/env" "15.2.2" - "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.15" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" - optionalDependencies: - "@next/swc-darwin-arm64" "15.2.2" - "@next/swc-darwin-x64" "15.2.2" - "@next/swc-linux-arm64-gnu" "15.2.2" - "@next/swc-linux-arm64-musl" "15.2.2" - "@next/swc-linux-x64-gnu" "15.2.2" - "@next/swc-linux-x64-musl" "15.2.2" - "@next/swc-win32-arm64-msvc" "15.2.2" - "@next/swc-win32-x64-msvc" "15.2.2" - sharp "^0.33.5" - -node-abi@^3.3.0: - version "3.74.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" - integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== - dependencies: - semver "^7.3.5" - -node-domexception@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - -node-ensure@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" - integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-releases@^2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" - integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -num-sort@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" - integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" - integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -object.fromentries@^2.0.7: - version "2.0.8" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.groupby@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.hasown@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" - integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== - dependencies: - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -openai@^4.26.0, openai@^4.32.1: - version "4.33.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" - integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.87.3: - version "4.87.4" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" - integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - -openapi-types@^12.1.3: - version "12.1.3" - resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" - integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-queue@^6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-retry@4: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parseley@^0.12.0: - version "0.12.1" - resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef" - integrity sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw== - dependencies: - leac "^0.6.0" - peberminta "^0.9.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.10.1, path-scurry@^1.10.2: - version "1.10.2" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" - integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pdf-parse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pdf-parse/-/pdf-parse-1.1.1.tgz#745e07408679548b3995ff896fd38e96e19d14a7" - integrity sha512-v6ZJ/efsBpGrGGknjtq9J/oC8tZWq0KWL5vQrk2GlzLEQPUDB1ex+13Rmidl1neNN358Jn9EHZw5y07FFtaC7A== - dependencies: - debug "^3.1.0" - node-ensure "^0.0.0" - -peberminta@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" - integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== - -picocolors@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -possible-typed-array-names@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" - integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" - integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== - dependencies: - lilconfig "^3.0.0" - yaml "^2.3.4" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.11: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8, postcss@^8.4.23: - version "8.4.38" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" - integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== - dependencies: - nanoid "^3.3.7" - picocolors "^1.0.0" - source-map-js "^1.2.0" - -prebuild-install@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" - integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^2.0.0" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -pump@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" - integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-text-to-speech@^0.14.5: - version "0.14.5" - resolved "https://registry.yarnpkg.com/react-text-to-speech/-/react-text-to-speech-0.14.5.tgz#f918786ab283311535682011045bd49777193300" - integrity sha512-3brr/IrK/5YTtOZSTo+Y8b+dnWelzfZiDZvkXnOct1e7O7fgA/h9bYAVrtwSRo/VxKfdw+wh6glkj6M0mlQuQQ== - -react-textarea-autosize@^8.5.3: - version "8.5.3" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" - integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readable-stream@^2.2.2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" - integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.1" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regexp.prototype.flags@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" - integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== - dependencies: - call-bind "^1.0.6" - define-properties "^1.2.1" - es-errors "^1.3.0" - set-function-name "^2.0.1" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.5: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== - dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== - dependencies: - call-bind "^1.0.6" - es-errors "^1.3.0" - is-regex "^1.1.4" - -safe-stable-stringify@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" - integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -selderee@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/selderee/-/selderee-0.11.0.tgz#6af0c7983e073ad3e35787ffe20cefd9daf0ec8a" - integrity sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA== - dependencies: - parseley "^0.12.0" - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: - version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.1, set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -sharp@^0.33.5: - version "0.33.5" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" - integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.3" - optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.5" - "@img/sharp-darwin-x64" "0.33.5" - "@img/sharp-libvips-darwin-arm64" "1.0.4" - "@img/sharp-libvips-darwin-x64" "1.0.4" - "@img/sharp-libvips-linux-arm" "1.0.5" - "@img/sharp-libvips-linux-arm64" "1.0.4" - "@img/sharp-libvips-linux-s390x" "1.0.4" - "@img/sharp-libvips-linux-x64" "1.0.4" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - "@img/sharp-linux-arm" "0.33.5" - "@img/sharp-linux-arm64" "0.33.5" - "@img/sharp-linux-s390x" "0.33.5" - "@img/sharp-linux-x64" "0.33.5" - "@img/sharp-linuxmusl-arm64" "0.33.5" - "@img/sharp-linuxmusl-x64" "0.33.5" - "@img/sharp-wasm32" "0.33.5" - "@img/sharp-win32-ia32" "0.33.5" - "@img/sharp-win32-x64" "0.33.5" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" - integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== - -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -simple-wcswidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" - integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sonner@^1.4.41: - version "1.4.41" - resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" - integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== - -source-map-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== - -source-map-support@^0.5.21: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.matchall@^4.0.10: - version "4.0.11" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" - integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.7" - regexp.prototype.flags "^1.5.2" - set-function-name "^2.0.2" - side-channel "^1.0.6" - -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.0" - es-object-atoms "^1.0.0" - -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -styled-jsx@5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" - integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" - integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "^10.3.10" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tabbable@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" - integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== - -tailwind-merge@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.2.tgz#87341e7604f0e20499939e152cd2841f41f7a3df" - integrity sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw== - dependencies: - "@babel/runtime" "^7.24.0" - -tailwindcss@^3.3.0: - version "3.4.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" - integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.0" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar-fs@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" - integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -triple-beam@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" - integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== - -ts-api-utils@^1.0.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" - integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.4.0, tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-is@^1.6.4: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== - dependencies: - call-bind "^1.0.7" - es-errors "^1.3.0" - is-typed-array "^1.1.13" - -typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^5: - version "5.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" - integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -uuid@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" - integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== - -uuid@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" - integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== - -validate.io-array@^1.0.3, validate.io-array@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg== - -validate.io-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" - integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== - -web-streams-polyfill@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" - integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== - -web-streams-polyfill@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.2" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" - integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== - dependencies: - isexe "^3.1.1" - -winston-transport@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" - integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== - dependencies: - logform "^2.7.0" - readable-stream "^3.6.2" - triple-beam "^1.3.0" - -winston@^3.17.0: - version "3.17.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" - integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== - dependencies: - "@colors/colors" "^1.6.0" - "@dabh/diagnostics" "^2.0.2" - async "^3.2.3" - is-stream "^2.0.0" - logform "^2.7.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - safe-stable-stringify "^2.3.1" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.9.0" - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.2.1, yaml@^2.3.4: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" - integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== - -yet-another-react-lightbox@^3.17.2: - version "3.17.2" - resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" - integrity sha512-fM+Br5nR2kt/oBAOHDqVdUmogiHRLCt4iuIJHPS9Q+ME+h+ciME6vEpLt3IPgGU8whib1agEyZBgWJOAKjgadQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: - version "3.22.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" - integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== - -zod@^3.22.3, zod@^3.22.4: - version "3.22.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" - integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== diff --git a/yarn.lock b/yarn.lock index 5764b3c..da8c916 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,19 +2,15 @@ # yarn lockfile v1 -"@anthropic-ai/sdk@^0.22.0": - version "0.22.0" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.22.0.tgz#548e4218d9810fd494e595d4e57cb2d46d301a1a" - integrity sha512-dv4BCC6FZJw3w66WNLsHlUFjhu19fS1L/5jMPApwhZLa/Oy1j0A2i3RypmDtHEPp4Wwg3aZkSHksp7VzYWjzmw== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@anthropic-ai/sdk@^0.9.1": version "0.9.1" @@ -31,18 +27,23 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" + integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== + dependencies: + regenerator-runtime "^0.14.0" + +"@cfworker/json-schema@^4.0.2": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz#4a2a3947ee9fa7b7c24be981422831b8674c3be6" + integrity sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og== + "@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - "@dabh/diagnostics@^2.0.2": version "2.0.3" resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a" @@ -52,6 +53,18 @@ enabled "2.0.x" kuler "^2.0.0" +"@drizzle-team/brocli@^0.10.2": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@drizzle-team/brocli/-/brocli-0.10.2.tgz#9757c006a43daaa6f45512e6cf5fabed36fb9da7" + integrity sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w== + +"@emnapi/runtime@^1.2.0": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" + integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== + dependencies: + tslib "^2.4.0" + "@esbuild-kit/core-utils@^3.3.2": version "3.3.2" resolved "https://registry.yarnpkg.com/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz#186b6598a5066f0413471d7c4d45828e399ba96c" @@ -293,71 +306,290 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== -"@google/generative-ai@^0.7.0": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.7.1.tgz#eb187c75080c0706245699dbc06816c830d8c6a7" - integrity sha512-WTjMLLYL/xfA5BW6xAycRPiAX7FNHKAxrid/ayqC1QMam0KAK0NbMeS9Lubw80gVg5xFMLE+H7pw4wdNzTOlxw== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" -"@huggingface/jinja@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" - integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== +"@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.57.0": + version "8.57.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== + +"@floating-ui/core@^1.6.0": + version "1.6.8" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.6.8.tgz#aa43561be075815879305965020f492cdb43da12" + integrity sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA== + dependencies: + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/dom@^1.0.0": + version "1.6.12" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.6.12.tgz#6333dcb5a8ead3b2bf82f33d6bc410e95f54e556" + integrity sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w== + dependencies: + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.8" + +"@floating-ui/react-dom@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.1.2.tgz#a1349bbf6a0e5cb5ded55d023766f20a4d439a31" + integrity sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A== + dependencies: + "@floating-ui/dom" "^1.0.0" + +"@floating-ui/react@^0.26.16": + version "0.26.28" + resolved "https://registry.yarnpkg.com/@floating-ui/react/-/react-0.26.28.tgz#93f44ebaeb02409312e9df9507e83aab4a8c0dc7" + integrity sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw== + dependencies: + "@floating-ui/react-dom" "^2.1.2" + "@floating-ui/utils" "^0.2.8" + tabbable "^6.0.0" + +"@floating-ui/utils@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" + integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== + +"@headlessui/react@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" + integrity sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ== + dependencies: + "@floating-ui/react" "^0.26.16" + "@react-aria/focus" "^3.17.1" + "@react-aria/interactions" "^3.21.3" + "@tanstack/react-virtual" "^3.8.1" + +"@humanwhocodes/config-array@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== + dependencies: + "@humanwhocodes/object-schema" "^2.0.2" + debug "^4.3.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@iarna/toml@^2.2.5": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@jridgewell/resolve-uri@^3.0.3": +"@icons-pack/react-simple-icons@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-12.3.0.tgz#2089c8226842611d751fc86fa93fea053076db77" + integrity sha512-71KKdd2tg36Pctg5pQTAmPRIdFrtxsLccoSexkZLztn46eV6Ek6ov69o0Ph4t4ZPs6n4+Fw4sBnIzEsKssnXxg== + +"@img/sharp-darwin-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" + integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== + optionalDependencies: + "@img/sharp-libvips-darwin-arm64" "1.0.4" + +"@img/sharp-darwin-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" + integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== + optionalDependencies: + "@img/sharp-libvips-darwin-x64" "1.0.4" + +"@img/sharp-libvips-darwin-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" + integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== + +"@img/sharp-libvips-darwin-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" + integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== + +"@img/sharp-libvips-linux-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" + integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== + +"@img/sharp-libvips-linux-arm@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" + integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== + +"@img/sharp-libvips-linux-s390x@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" + integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== + +"@img/sharp-libvips-linux-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" + integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== + +"@img/sharp-libvips-linuxmusl-arm64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" + integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== + +"@img/sharp-libvips-linuxmusl-x64@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" + integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== + +"@img/sharp-linux-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" + integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== + optionalDependencies: + "@img/sharp-libvips-linux-arm64" "1.0.4" + +"@img/sharp-linux-arm@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" + integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.0.5" + +"@img/sharp-linux-s390x@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" + integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== + optionalDependencies: + "@img/sharp-libvips-linux-s390x" "1.0.4" + +"@img/sharp-linux-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" + integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== + optionalDependencies: + "@img/sharp-libvips-linux-x64" "1.0.4" + +"@img/sharp-linuxmusl-arm64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" + integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + +"@img/sharp-linuxmusl-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" + integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + +"@img/sharp-wasm32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" + integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== + dependencies: + "@emnapi/runtime" "^1.2.0" + +"@img/sharp-win32-ia32@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" + integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== + +"@img/sharp-win32-x64@0.33.5": + version "0.33.5" + resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" + integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -"@langchain/anthropic@^0.2.3": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.2.3.tgz#1505da939f47c90e53dfede0407c497b8177bdf0" - integrity sha512-f2fqzLGcvsXXUyZ1vl8cgwkKDGLshOGrPuR9hkhGuBG5m91eq755OqPBxWJuS1TFtNU813cXft3xh0MQbxavwg== +"@langchain/community@^0.3.36": + version "0.3.36" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" + integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== dependencies: - "@anthropic-ai/sdk" "^0.22.0" - "@langchain/core" ">=0.2.9 <0.3.0" - fast-xml-parser "^4.3.5" - zod "^3.22.4" - zod-to-json-schema "^3.22.4" - -"@langchain/community@^0.2.16": - version "0.2.16" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.2.16.tgz#5888baf7fc7ea272c5f91aaa0e71bc444167262d" - integrity sha512-dFDcMabKACvuRd0w6EIRLWf1ubPGZEeEwFt9v1jiEr4HCFxH0OF+iM1QUCcVRbB2fK5lqmKeTD1XAeZV8+AyXA== - dependencies: - "@langchain/core" "~0.2.11" - "@langchain/openai" "~0.1.0" + "@langchain/openai" ">=0.2.0 <0.5.0" binary-extensions "^2.2.0" expr-eval "^2.0.2" flat "^5.0.2" js-yaml "^4.1.0" - langchain "0.2.3" - langsmith "~0.1.30" - uuid "^9.0.0" + langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" + langsmith ">=0.2.8 <0.4.0" + uuid "^10.0.0" zod "^3.22.3" zod-to-json-schema "^3.22.5" "@langchain/community@~0.0.41": - version "0.0.43" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.43.tgz#017e2f9b3209b3999482f10df5aec2520731a63c" - integrity sha512-60TjV3knGGOPHfbJxLpuwARr8oA0r6Txm8wTFvFx+TjRUrloyBUcWSbJIdm62gAwBJDEHmdjjyWOOzU+eewcuA== + version "0.0.44" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" + integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== dependencies: "@langchain/core" "~0.1.44" "@langchain/openai" "~0.0.19" @@ -366,53 +598,19 @@ langsmith "~0.1.1" uuid "^9.0.0" zod "^3.22.3" + zod-to-json-schema "^3.22.5" -"@langchain/core@>0.1.56 <0.3.0", "@langchain/core@>0.2.0 <0.3.0", "@langchain/core@>=0.2.5 <0.3.0", "@langchain/core@~0.2.0", "@langchain/core@~0.2.11": - version "0.2.11" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.11.tgz#5f47467e20e56b250831baef20083657c6facb4c" - integrity sha512-d4SNL7WI0c3oHrV4WxCRH1/TNqdePXEzYjYwIb4aEH6lW1aM0utGhLbNthX+aYkOL4Ynx2FoG4h91ECIipiKWQ== +"@langchain/core@^0.3.42": + version "0.3.42" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" + integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== dependencies: + "@cfworker/json-schema" "^4.0.2" ansi-styles "^5.0.0" camelcase "6" decamelize "1.2.0" js-tiktoken "^1.0.12" - langsmith "~0.1.30" - ml-distance "^4.0.0" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@>=0.2.16 <0.3.0": - version "0.2.36" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.36.tgz#75754c33aa5b9310dcf117047374a1ae011005a4" - integrity sha512-qHLvScqERDeH7y2cLuJaSAlMwg3f/3Oc9nayRSXRU2UuaK/SOhI42cxiPLj1FnuHJSmN0rBQFkrLx02gI4mcVg== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith "^0.1.56-rc.1" - mustache "^4.2.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^10.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/core@>=0.2.9 <0.3.0": - version "0.2.15" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.2.15.tgz#1bb99ac4fffe935c7ba37edcaa91abfba3c82219" - integrity sha512-L096itIBQ5XNsy5BCCPqIQEk/x4rzI+U4BhYT+fDBYtljESshIi/WzXdmiGfY/6MpVjB76jNuaRgMDmo1m9NeQ== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.12" - langsmith "~0.1.30" - ml-distance "^4.0.0" + langsmith ">=0.2.8 <0.4.0" mustache "^4.2.0" p-queue "^6.6.2" p-retry "4" @@ -421,9 +619,9 @@ zod-to-json-schema "^3.22.3" "@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.52" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.52.tgz#7619310b83ffa841628efe2e1eda873ca714d068" - integrity sha512-AEyP99r7jijF33pyzaWtqCkiO9crotgethqq7jznAGlIojMCL9BT/id2DjVyN32SGFTpet273kkjsmEdFSHqpA== + version "0.1.54" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" + integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== dependencies: ansi-styles "^5.0.0" camelcase "6" @@ -437,16 +635,17 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/google-genai@^0.0.23": - version "0.0.23" - resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.0.23.tgz#e73af501bc1df4c7642b531759b82dc3eb7ae459" - integrity sha512-MTSCJEoKsfU1inz0PWvAjITdNFM4s41uvBCwLpcgx3jWJIEisczFD82x86ahYqJlb2fD6tohYSaCH/4tKAdkXA== +"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" + integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== dependencies: - "@google/generative-ai" "^0.7.0" - "@langchain/core" ">=0.2.16 <0.3.0" - zod-to-json-schema "^3.22.4" + js-tiktoken "^1.0.12" + openai "^4.87.3" + zod "^3.22.4" + zod-to-json-schema "^3.22.3" -"@langchain/openai@^0.0.25", "@langchain/openai@~0.0.19": +"@langchain/openai@^0.0.25": version "0.0.25" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== @@ -457,88 +656,162 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/openai@~0.0.28": - version "0.0.34" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.34.tgz#36c9bca0721ab9f7e5d40927e7c0429cacbd5b56" - integrity sha512-M+CW4oXle5fdoz2T2SwdOef8pl3/1XmUx1vjn2mXUVM/128aO0l23FMF0SNBsAbRV6P+p/TuzjodchJbi0Ht/A== +"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": + version "0.0.26" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" + integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== dependencies: - "@langchain/core" ">0.1.56 <0.3.0" - js-tiktoken "^1.0.12" - openai "^4.41.1" + "@langchain/core" "~0.1.45" + js-tiktoken "^1.0.7" + openai "^4.32.1" zod "^3.22.4" zod-to-json-schema "^3.22.3" -"@langchain/openai@~0.1.0": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.1.3.tgz#6eb0994e970d85ffa9aaeafb94449024ccf6ca63" - integrity sha512-riv/JC9x2A8b7GcHu8sx+mlZJ8KAwSSi231IPTlcciYnKozmrQ5H0vrtiD31fxiDbaRsk7tyCpkSBIOQEo7CyQ== +"@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.1.0.tgz#f37620992192df09ecda3dfbd545b36a6bcbae46" + integrity sha512-djI4uw9rlkAb5iMhtLED+xJebDdAG935AdP4eRTB02R7OB/act55Bj9wsskhZsvuyQRpO4O1wQOp85s6T6GWmw== dependencies: - "@langchain/core" ">=0.2.5 <0.3.0" - js-tiktoken "^1.0.12" - openai "^4.49.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/textsplitters@~0.0.0": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@langchain/textsplitters/-/textsplitters-0.0.3.tgz#1a3cc93dd2ab330edb225400ded190a22fea14e3" - integrity sha512-cXWgKE3sdWLSqAa8ykbCcUsUF1Kyr5J3HOWYGuobhPEycXW4WI++d5DhzdpL238mzoEXTi90VqfSCra37l5YqA== - dependencies: - "@langchain/core" ">0.2.0 <0.3.0" js-tiktoken "^1.0.12" -"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" - integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== +"@next/env@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" + integrity sha512-yWgopCfA9XDR8ZH3taB5nRKtKJ1Q5fYsTOuYkzIIoS8TJ0UAUKAGF73JnGszbjk2ufAQDj6mDdgsJAFx5CLtYQ== -"@protobufjs/base64@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" - integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== - -"@protobufjs/codegen@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" - integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== - -"@protobufjs/eventemitter@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" - integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== - -"@protobufjs/fetch@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" - integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== +"@next/eslint-plugin-next@14.1.4": + version "14.1.4" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz#d7372b5ffede0e466af8af2ff534386418827fc8" + integrity sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA== dependencies: - "@protobufjs/aspromise" "^1.1.1" - "@protobufjs/inquire" "^1.1.0" + glob "10.3.10" -"@protobufjs/float@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" - integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== +"@next/swc-darwin-arm64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.2.2.tgz#d3131279d4815ed7604eba7bf0063e0b8bfd2135" + integrity sha512-HNBRnz+bkZ+KfyOExpUxTMR0Ow8nkkcE6IlsdEa9W/rI7gefud19+Sn1xYKwB9pdCdxIP1lPru/ZfjfA+iT8pw== -"@protobufjs/inquire@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" - integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== +"@next/swc-darwin-x64@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.2.2.tgz#8562f6b51177aa30f3a6e95a8b3e0e176a6cb04f" + integrity sha512-mJOUwp7al63tDpLpEFpKwwg5jwvtL1lhRW2fI1Aog0nYCPAhxbJsaZKdoVyPZCy8MYf/iQVNDuk/+i29iLCzIA== -"@protobufjs/path@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" - integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== +"@next/swc-linux-arm64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.2.2.tgz#c2466cffc541f39ae4d435087c81f5899d401903" + integrity sha512-5ZZ0Zwy3SgMr7MfWtRE7cQWVssfOvxYfD9O7XHM7KM4nrf5EOeqwq67ZXDgo86LVmffgsu5tPO57EeFKRnrfSQ== -"@protobufjs/pool@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" - integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== +"@next/swc-linux-arm64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.2.2.tgz#24ed87fe47325597e986bd01c427efae53d6b677" + integrity sha512-cgKWBuFMLlJ4TWcFHl1KOaVVUAF8vy4qEvX5KsNd0Yj5mhu989QFCq1WjuaEbv/tO1ZpsQI6h/0YR8bLwEi+nA== -"@protobufjs/utf8@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" - integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@next/swc-linux-x64-gnu@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.2.2.tgz#0240f44530ca39c1fc899fabe8f33aa35d7e77da" + integrity sha512-c3kWSOSsVL8rcNBBfOq1+/j2PKs2nsMwJUV4icUxRgGBwUOfppeh7YhN5s79enBQFU+8xRgVatFkhHU1QW7yUA== + +"@next/swc-linux-x64-musl@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.2.2.tgz#cca6ce8e9ec89afaa618673f0f8658682c30ff56" + integrity sha512-PXTW9PLTxdNlVYgPJ0equojcq1kNu5NtwcNjRjHAB+/sdoKZ+X8FBu70fdJFadkxFIGekQTyRvPMFF+SOJaQjw== + +"@next/swc-win32-arm64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.2.2.tgz#08f621602ed53fa21ddf6f656160b9186860be15" + integrity sha512-nG644Es5llSGEcTaXhnGWR/aThM/hIaz0jx4MDg4gWC8GfTCp8eDBWZ77CVuv2ha/uL9Ce+nPTfYkSLG67/sHg== + +"@next/swc-win32-x64-msvc@15.2.2": + version "15.2.2" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.2.2.tgz#2072d69374f8c944134a5c5a80ce03ff84254cfa" + integrity sha512-52nWy65S/R6/kejz3jpvHAjZDPKIbEQu4x9jDBzmB9jJfuOy5rspjKu4u77+fI4M/WzLXrrQd57hlFGzz1ubcQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@petamoriken/float16@^3.8.7": + version "3.9.2" + resolved "https://registry.yarnpkg.com/@petamoriken/float16/-/float16-3.9.2.tgz#217a5d349f3655b8e286be447e0ed1eae063a78f" + integrity sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@react-aria/focus@^3.17.1": + version "3.18.4" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" + integrity sha512-91J35077w9UNaMK1cpMUEFRkNNz0uZjnSwiyBCFuRdaVuivO53wNC9XtWSDNDdcO5cGy87vfJRVAiyoCn/mjqA== + dependencies: + "@react-aria/interactions" "^3.22.4" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-aria/interactions@^3.21.3", "@react-aria/interactions@^3.22.4": + version "3.22.4" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.22.4.tgz#88ed61ab6a485f869bc1f65ae6688d48ca96064b" + integrity sha512-E0vsgtpItmknq/MJELqYJwib+YN18Qag8nroqwjk1qOnBa9ROIkUhWJerLi1qs5diXq9LHKehZDXRlwPvdEFww== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-aria/utils" "^3.25.3" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.9.6": + version "3.9.6" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.9.6.tgz#a9e8b351acdc8238f2b5215b0ce904636c6ea690" + integrity sha512-iLo82l82ilMiVGy342SELjshuWottlb5+VefO3jOQqQRNYnJBFpUSadswDPbRimSgJUZuFwIEYs6AabkP038fA== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.25.3": + version "3.25.3" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.25.3.tgz#cad9bffc07b045cdc283df2cb65c18747acbf76d" + integrity sha512-PR5H/2vaD8fSq0H/UB9inNbc8KDcVmW6fYAfSWkkn+OAdhTTMVKqXXrZuZBWyFfSD5Ze7VN6acr4hrOQm2bmrA== + dependencies: + "@react-aria/ssr" "^3.9.6" + "@react-stately/utils" "^3.10.4" + "@react-types/shared" "^3.25.0" + "@swc/helpers" "^0.5.0" + clsx "^2.0.0" + +"@react-stately/utils@^3.10.4": + version "3.10.4" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.10.4.tgz#310663a834b67048d305e1680ed258130092fe51" + integrity sha512-gBEQEIMRh5f60KCm7QKQ2WfvhB2gLUr9b72sqUdIZ2EG+xuPgaIlCBeSicvjmjBvYZwOjoOEnmIkcx2GHp/HWw== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-types/shared@^3.25.0": + version "3.25.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.25.0.tgz#7223baf72256e918a3c29081bb1ecc6fad4fbf58" + integrity sha512-OZSyhzU6vTdW3eV/mz5i6hQwQUhkRs7xwY2d1aqPvTdMe0+2cY7Fwp45PAiwYLEj73i9ro2FxF9qC4DvHGSCgQ== + +"@rushstack/eslint-patch@^1.3.3": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz#7ca168b6937818e9a74b47ac4e2112b2e1a024cf" + integrity sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg== "@selderee/plugin-htmlparser2@^0.11.0": version "0.11.0" @@ -548,121 +821,56 @@ domhandler "^5.0.3" selderee "^0.11.0" -"@tsconfig/node10@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" - integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== +"@swc/counter@0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== +"@swc/helpers@0.5.15", "@swc/helpers@^0.5.0": + version "0.5.15" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" + integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== + dependencies: + tslib "^2.8.0" -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== +"@tailwindcss/typography@^0.5.12": + version "0.5.12" + resolved "https://registry.yarnpkg.com/@tailwindcss/typography/-/typography-0.5.12.tgz#c0532fd594427b7f4e8e38eff7bf272c63a1dca4" + integrity sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg== + dependencies: + lodash.castarray "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + postcss-selector-parser "6.0.10" -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@tanstack/react-virtual@^3.8.1": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-virtual/-/react-virtual-3.10.9.tgz#40606b6dd8aba8e977f576d8f7df07f69ca63eea" + integrity sha512-OXO2uBjFqA4Ibr2O3y0YMnkrRWGVNqcvHQXmGvMu6IK8chZl3PrDxFXdGZ2iZkSrKh3/qUYoFqYe+Rx23RoU0g== + dependencies: + "@tanstack/virtual-core" "3.10.9" -"@types/better-sqlite3@^7.6.10": - version "7.6.10" - resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.10.tgz#1818e56490953404acfd44cdde0464f201be6105" - integrity sha512-TZBjD+yOsyrUJGmcUj6OS3JADk3+UZcNv3NOBqGkM09bZdi28fNZw8ODqbMOLfKCu7RYCO62/ldq1iHbzxqoPw== +"@tanstack/virtual-core@3.10.9": + version "3.10.9" + resolved "https://registry.yarnpkg.com/@tanstack/virtual-core/-/virtual-core-3.10.9.tgz#55710c92b311fdaa8d8c66682a0dbdd684bc77c4" + integrity sha512-kBknKOKzmeR7lN+vSadaKWXaLS0SZZG+oqpQ/k80Q6g9REn6zRHS/ZYdrIzHnpHgy/eWs00SujveUN/GJT2qTw== + +"@types/better-sqlite3@^7.6.12": + version "7.6.12" + resolved "https://registry.yarnpkg.com/@types/better-sqlite3/-/better-sqlite3-7.6.12.tgz#e5712d46d71097dcc2775c0b068072eadc15deb7" + integrity sha512-fnQmj8lELIj7BSrZQAdBMHEHX8OZLYIHXqAKT1O7tDfLxaINzf00PMjw22r3N/xXh0w/sGHlO6SVaCQ2mj78lg== dependencies: "@types/node" "*" -"@types/body-parser@*": - version "1.19.5" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" - integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/cors@^2.8.17": - version "2.8.17" - resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.17.tgz#5d718a5e494a8166f569d986794e49c48b216b2b" - integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== - dependencies: - "@types/node" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.17.43" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz#10d8444be560cb789c4735aea5eac6e5af45df54" - integrity sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz#3c9997ae9d00bc236e45c6374e84f2596458d9db" - integrity sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" - integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^5.0.0" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/express@^4.17.21": - version "4.17.21" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" - integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - "@types/html-to-text@^9.0.4": version "9.0.4" resolved "https://registry.yarnpkg.com/@types/html-to-text/-/html-to-text-9.0.4.tgz#4a83dd8ae8bfa91457d0b1ffc26f4d0537eff58c" integrity sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ== -"@types/http-errors@*": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" - integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== - -"@types/long@^4.0.1": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" - integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/multer@^1.4.12": - version "1.4.12" - resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" - integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== - dependencies: - "@types/express" "*" +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/node-fetch@^2.6.4": version "2.6.11" @@ -672,24 +880,17 @@ "@types/node" "*" form-data "^4.0.0" -"@types/node@*": - version "20.12.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" - integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== - dependencies: - undici-types "~5.26.4" - -"@types/node@>=13.7.0": - version "20.12.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.9.tgz#d7234f2e7839b55fcab5048404aef0195684adff" - integrity sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg== +"@types/node@*", "@types/node@^20": + version "20.12.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" + integrity sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw== dependencies: undici-types "~5.26.4" "@types/node@^18.11.18": - version "18.19.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.28.tgz#c64a2c992c8ebbf61100a4570e4eebc1934ae030" - integrity sha512-J5cOGD9n4x3YGgVuaND6khm5x07MMdAKkRyXnjVR6KFhLMNh2yONGiP7Z+4+tBOt5mK+GvDTiacTOVGGpqiecw== + version "18.19.30" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" + integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== dependencies: undici-types "~5.26.4" @@ -698,46 +899,31 @@ resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" integrity sha512-+gbBHbNCVGGYw1S9lAIIvrHW47UYOhMIFUsJcMkMrzy1Jf0vulBN3XQIjPgnoOXveMuHnF3b57fXROnY/Or7eg== -"@types/qs@*": - version "6.9.14" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.14.tgz#169e142bfe493895287bee382af6039795e9b75b" - integrity sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA== +"@types/prop-types@*": + version "15.7.12" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" + integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/readable-stream@^4.0.11": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-4.0.11.tgz#684f1e947c90cb6a8ad3904523d650bb66cdbb84" - integrity sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ== +"@types/react-dom@^18": + version "18.2.24" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" + integrity sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg== dependencies: - "@types/node" "*" - safe-buffer "~5.1.1" + "@types/react" "*" + +"@types/react@*", "@types/react@^18": + version "18.2.74" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.74.tgz#2d52eb80e4e7c4ea8812c89181d6d590b53f958c" + integrity sha512-9AEqNZZyBx8OdZpxzQlaFEVCSFUM2YXJH46yPOiOpm078k6ZLOCcuAzGum/zK8YBwY+dbahVNbHrbgrAwIRlqw== + dependencies: + "@types/prop-types" "*" + csstype "^3.0.2" "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== -"@types/send@*": - version "0.17.4" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" - integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-static@*": - version "1.15.7" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.7.tgz#22174bbd74fb97fe303109738e9b5c2f3064f714" - integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - "@types/triple-beam@^1.3.2": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" @@ -753,33 +939,56 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== -"@types/ws@^8.5.12": - version "8.5.12" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" - integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" + integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== dependencies: - "@types/node" "*" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" -"@xenova/transformers@^2.17.1": - version "2.17.1" - resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.1.tgz#712f7a72c76c8aa2075749382f83dc7dd4e5a9a5" - integrity sha512-zo702tQAFZXhzeD2GCYUNUqeqkoueOdiSbQWa4s0q7ZE4z8WBIwIsMMPGobpgdqjQ2u0Qulo08wuqVEUrBXjkQ== +"@typescript-eslint/scope-manager@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" + integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== dependencies: - "@huggingface/jinja" "^0.2.2" - onnxruntime-web "1.14.0" - sharp "^0.32.0" - optionalDependencies: - onnxruntime-node "1.14.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" -"@xmldom/xmldom@^0.8.6": - version "0.8.10" - resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" - integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== +"@typescript-eslint/types@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" + integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +"@typescript-eslint/typescript-estree@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" + integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== + dependencies: + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/visitor-keys" "6.21.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + minimatch "9.0.3" + semver "^7.5.4" + ts-api-utils "^1.0.1" + +"@typescript-eslint/visitor-keys@6.21.0": + version "6.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" + integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== + dependencies: + "@typescript-eslint/types" "6.21.0" + eslint-visitor-keys "^3.4.1" + +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== abort-controller@^3.0.0: version "3.0.0" @@ -788,20 +997,12 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn-walk@^8.1.1: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== - -acorn@^8.4.1: +acorn@^8.9.0: version "8.11.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== @@ -813,11 +1014,48 @@ agentkeepalive@^4.2.1: dependencies: humanize-ms "^1.2.1" +ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -826,95 +1064,187 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -append-field@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" - integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -argparse@~1.0.3: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== +aria-query@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: - sprintf-js "~1.0.2" + dequal "^2.0.3" -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== + dependencies: + call-bind "^1.0.5" + is-array-buffer "^3.0.4" + +array-includes@^3.1.6, array-includes@^3.1.7: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.findlast@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" + integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.findlastindex@^1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" + +array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" + integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.1.0" + es-shim-unscopables "^1.0.2" + +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== + dependencies: + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" + is-shared-array-buffer "^1.0.2" + +ast-types-flow@^0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6" + integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== async@^3.2.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" - integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== + version "3.2.6" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.6.8: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== +autoprefixer@^10.0.1: + version "10.4.19" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== + dependencies: + browserslist "^4.23.0" + caniuse-lite "^1.0.30001599" + fraction.js "^4.3.7" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axe-core@=4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" + integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== + +axios@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.8.3.tgz#9ebccd71c98651d547162a018a1a95a4b4ed4de8" + integrity sha512-iP4DebzoNlP/YN2dpwCgb8zoCmhtkajzS48JvwmkSkXvPI3DHc7m+XYL5tGnSlJtR6nImXZmdCuN5aP8dh1d8A== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" -b4a@^1.6.4: - version "1.6.6" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" - integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== +axobject-query@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@^2.0.0, bare-events@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.2.2.tgz#a98a41841f98b2efe7ecc5c5468814469b018078" - integrity sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ== - -bare-fs@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.0.tgz#0872f8e33cf291c9fd527d827154f156a298d402" - integrity sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw== - dependencies: - bare-events "^2.0.0" - bare-path "^2.0.0" - bare-stream "^1.0.0" - -bare-os@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.3.0.tgz#718e680b139effff0624a7421c098e7a2c2d63da" - integrity sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg== - -bare-path@^2.0.0, bare-path@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.2.tgz#7a0940d34ebe65f7e179fa61ed8d49d9dc151d67" - integrity sha512-o7KSt4prEphWUHa3QUwCxUI00R86VdjiuxmJK0iNVDHYPGo+HsDaVCnqCmPbf/MiW1ok8F4p3m8RTHlWk8K2ig== - dependencies: - bare-os "^2.1.0" - -bare-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-1.0.0.tgz#25c3e56198d922187320c3f8c52d75c4051178b4" - integrity sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ== - dependencies: - streamx "^2.16.1" - base-64@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" @@ -925,10 +1255,10 @@ base64-js@^1.3.1, base64-js@^1.5.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -better-sqlite3@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.0.0.tgz#12083acfe0ded6abdba908ed73520f2003e3ea0e" - integrity sha512-1NnNhmT3EZTsKtofJlMox1jkMxdedILury74PwUbQBjWgo4tL4kf7uTAjU55mgQwjdzqakSTjkf+E1imrFwjnA== +better-sqlite3@^11.9.1: + version "11.9.1" + resolved "https://registry.yarnpkg.com/better-sqlite3/-/better-sqlite3-11.9.1.tgz#0540da2f2ce24cbd766bb35db412f4be2c75b8bb" + integrity sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ== dependencies: bindings "^1.5.0" prebuild-install "^7.1.1" @@ -959,29 +1289,6 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" -bluebird@~3.4.0: - version "3.4.7" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== - -body-parser@1.20.2: - version "1.20.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" - integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -990,13 +1297,30 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@~3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" +browserslist@^4.23.0: + version "4.23.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + dependencies: + caniuse-lite "^1.0.30001587" + electron-to-chromium "^1.4.668" + node-releases "^2.0.14" + update-browserslist-db "^1.0.13" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1010,19 +1334,14 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -busboy@^1.0.0: +busboy@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -call-bind@^1.0.7: +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== @@ -1033,17 +1352,45 @@ call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + camelcase@6: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caniuse-lite@^1.0.30001579: + version "1.0.30001705" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001705.tgz#dc3510bcdef261444ca944b7be9c8d0bb7fafeef" + integrity sha512-S0uyMMiYvA7CxNgomYBwwwPUnWzFD83f3B1ce5jHUfHTH//QL6hHsreI8RVC5606R4ssqravelYO5TU6t8sEyg== + +caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: + version "1.0.30001606" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" + integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== + +chalk@^4.0.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + charenc@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -chokidar@^3.5.2: +chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -1063,6 +1410,21 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +clsx@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + +clsx@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.0.tgz#e851283bcb5c80ee7608db18487433f7b23f77cb" + integrity sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg== + color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1131,6 +1493,11 @@ commander@^10.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + compute-cosine-similarity@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/compute-cosine-similarity/-/compute-cosine-similarity-1.1.0.tgz#0086a06b0239deb90f231f0da894efdc48884609" @@ -1162,89 +1529,83 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -concat-stream@^1.5.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== +console-table-printer@^2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" + integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + simple-wcswidth "^1.0.1" -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== +cross-spawn@^7.0.0, cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" - integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.5: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" crypt@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -debug@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -debug@^3.1.0: +csstype@^3.0.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +debug@^3.1.0, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" -debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== - dependencies: - ms "2.1.2" - decamelize@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1262,12 +1623,17 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -define-data-property@^1.1.4: +define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== @@ -1276,30 +1642,34 @@ define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== + dependencies: + define-data-property "^1.0.1" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-libc@^2.0.0, detect-libc@^2.0.2: +detect-libc@^2.0.0, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== digest-fetch@^1.3.0: version "1.3.0" @@ -1309,10 +1679,31 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" -dingbat-to-unicode@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" - integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" dom-serializer@^2.0.0: version "2.0.0" @@ -1336,55 +1727,55 @@ domhandler@^5.0.2, domhandler@^5.0.3: domelementtype "^2.3.0" domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== dependencies: dom-serializer "^2.0.0" domelementtype "^2.3.0" domhandler "^5.0.3" -dotenv@^16.4.5: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== - -drizzle-kit@^0.22.7: - version "0.22.7" - resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.22.7.tgz#4339c3e24c6555ea8cbad605f005b3db3e604a9c" - integrity sha512-9THPCb2l1GPt7wxhws9LvTR0YG565ZlVgTuqGMwjs590Kch1pXu4GyjEArVijSF5m0OBj3qgdeKmuJXhKXgWFw== +drizzle-kit@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/drizzle-kit/-/drizzle-kit-0.30.5.tgz#fce34a8ca9f82da5212f31c266e407c78523166f" + integrity sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA== dependencies: + "@drizzle-team/brocli" "^0.10.2" "@esbuild-kit/esm-loader" "^2.5.5" esbuild "^0.19.7" esbuild-register "^3.5.0" + gel "^2.0.0" -drizzle-orm@^0.31.2: - version "0.31.2" - resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.31.2.tgz#221a257dd487bab49ddb88a17bd82388600cf655" - integrity sha512-QnenevbnnAzmbNzQwbhklvIYrDE8YER8K7kSrAWQSV1YvFCdSQPzj+jzqRdTSsV2cDqSpQ0NXGyL1G9I43LDLg== +drizzle-orm@^0.40.1: + version "0.40.1" + resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" + integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== -duck@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" - integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== - dependencies: - underscore "^1.13.1" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +electron-to-chromium@^1.4.668: + version "1.4.729" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.729.tgz#8477d21e2a50993781950885b2731d92ad532c00" + integrity sha512-bx7+5Saea/qu14kmPTDHQxkp2UnziG3iajUQu3BxFvCOnpAJdDbMV4rSl+EqFDkkpNNVUFlR1kDfpL59xfy1HA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== enabled@2.0.x: version "2.0.0" resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -1392,11 +1783,76 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" +enhanced-resolve@^5.12.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== + dependencies: + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" + globalthis "^1.0.3" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" + is-callable "^1.2.7" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.3" + is-string "^1.0.7" + is-typed-array "^1.1.13" + is-weakref "^1.0.2" + object-inspect "^1.13.1" + object-keys "^1.1.1" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.15" + es-define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" @@ -1404,15 +1860,67 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.3.0: +es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== +es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: + version "1.0.18" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz#4d3424f46b24df38d064af6fbbc89274e29ea69d" + integrity sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-errors "^1.3.0" + es-set-tostringtag "^2.0.3" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + iterator.prototype "^1.1.2" + safe-array-concat "^1.1.2" + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + esbuild-register@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.5.0.tgz#449613fb29ab94325c722f560f800dd946dc8ea8" - integrity sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A== + version "3.6.0" + resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d" + integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg== dependencies: debug "^4.3.4" @@ -1473,15 +1981,223 @@ esbuild@~0.18.20: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escalade@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-next@14.1.4: + version "14.1.4" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.1.4.tgz#22f2ba4c0993e991249d863656a64c204bae542c" + integrity sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g== + dependencies: + "@next/eslint-plugin-next" "14.1.4" + "@rushstack/eslint-patch" "^1.3.3" + "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" + eslint-import-resolver-node "^0.3.6" + eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.28.1" + eslint-plugin-jsx-a11y "^6.7.1" + eslint-plugin-react "^7.33.2" + eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + +eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-import-resolver-typescript@^3.5.2: + version "3.6.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" + integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.12.0" + eslint-module-utils "^2.7.4" + fast-glob "^3.3.1" + get-tsconfig "^4.5.0" + is-core-module "^2.11.0" + is-glob "^4.0.3" + +eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz#52f2404300c3bd33deece9d7372fb337cc1d7c34" + integrity sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.28.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" + integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlastindex "^1.2.3" + array.prototype.flat "^1.3.2" + array.prototype.flatmap "^1.3.2" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.8.0" + hasown "^2.0.0" + is-core-module "^2.13.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.7" + object.groupby "^1.0.1" + object.values "^1.1.7" + semver "^6.3.1" + tsconfig-paths "^3.15.0" + +eslint-plugin-jsx-a11y@^6.7.1: + version "6.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" + integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + dependencies: + "@babel/runtime" "^7.23.2" + aria-query "^5.3.0" + array-includes "^3.1.7" + array.prototype.flatmap "^1.3.2" + ast-types-flow "^0.0.8" + axe-core "=4.7.0" + axobject-query "^3.2.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + es-iterator-helpers "^1.0.15" + hasown "^2.0.0" + jsx-ast-utils "^3.3.5" + language-tags "^1.0.9" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + +"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.33.2: + version "7.34.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" + integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.17" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.10" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint@^8: + version "8.57.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.4" + "@eslint/js" "8.57.0" + "@humanwhocodes/config-array" "^0.11.14" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-target-shim@^5.0.0: version "5.0.1" @@ -1503,60 +2219,51 @@ expr-eval@^2.0.2: resolved "https://registry.yarnpkg.com/expr-eval/-/expr-eval-2.0.2.tgz#fa6f044a7b0c93fde830954eb9c5b0f7fbc7e201" integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== -express@^4.19.2: - version "4.19.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.19.2.tgz#e25437827a3aa7f2a827bc8171bbbb664a356465" - integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.2" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.6.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-fifo@^1.1.0, fast-fifo@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" - integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== - -fast-xml-parser@^4.3.5: - version "4.4.0" - resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501" - integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg== +fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: - strnum "^1.0.5" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" fecha@^4.2.0: version "4.2.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + file-uri-to-path@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" @@ -1569,28 +2276,32 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.3" + rimraf "^3.0.2" flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatbuffers@^1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" - integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== +flatted@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== fn.name@1.x.x: version "1.1.0" @@ -1598,9 +2309,24 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.15.6: - version "1.15.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" - integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" form-data-encoder@1.7.2: version "1.7.2" @@ -1624,21 +2350,21 @@ formdata-node@^4.3.2: node-domexception "1.0.0" web-streams-polyfill "4.0.0-beta.3" -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fraction.js@^4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -1649,7 +2375,34 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gel@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gel/-/gel-2.0.1.tgz#587d89db54351c2d436de981d136481e37d06a7a" + integrity sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw== + dependencies: + "@petamoriken/float16" "^3.8.7" + debug "^4.3.4" + env-paths "^3.0.0" + semver "^7.6.2" + shell-quote "^1.8.1" + which "^4.0.0" + +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -1660,10 +2413,26 @@ get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: has-symbols "^1.0.3" hasown "^2.0.0" +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + dependencies: + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + +get-tsconfig@^4.5.0: + version "4.7.3" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.3.tgz#0498163d98f7b58484dd4906999c0c9d5f103f83" + integrity sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg== + dependencies: + resolve-pkg-maps "^1.0.0" + get-tsconfig@^4.7.0: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: resolve-pkg-maps "^1.0.0" @@ -1672,13 +2441,80 @@ github-from-package@0.0.0: resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@10.3.10: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + +glob@^10.3.10: + version "10.3.12" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.6" + minimatch "^9.0.1" + minipass "^7.0.4" + path-scurry "^1.10.2" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.19.0: + version "13.24.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -1686,34 +2522,51 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -guid-typescript@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" - integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== +graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== -has-property-descriptors@^1.0.2: +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1: +has-proto@^1.0.1, has-proto@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== -has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -hasown@^2.0.0: +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== @@ -1741,17 +2594,6 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -1759,29 +2601,38 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== +ignore@^5.2.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" -inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1791,21 +2642,47 @@ ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== + dependencies: + es-errors "^1.3.0" + hasown "^2.0.0" + side-channel "^1.0.4" is-any-array@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-arrayish@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -1813,42 +2690,213 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-glob@^4.0.1, is-glob@~4.0.1: +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" + integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== + +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" + integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== + +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + dependencies: + call-bind "^1.0.7" + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== + dependencies: + which-typed-array "^1.1.14" + +is-weakmap@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" + integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" + integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + +jackspeak@^2.3.5, jackspeak@^2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jiti@^1.21.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-tiktoken@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.12.tgz#af0f5cf58e5e7318240d050c8413234019424211" - integrity sha512-L7wURW1fH9Qaext0VzaUDpFGVQgjkdE3Dgsy9/+yXyGEpBKnylTd0mU0bfbNkKDlXRb6TEsZkwuflu1B8uQbJQ== + version "1.0.19" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" + integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== dependencies: base64-js "^1.5.1" @@ -1859,6 +2907,11 @@ js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: dependencies: base64-js "^1.5.1" +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -1866,57 +2919,82 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + jsonpointer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jszip@^3.7.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" - integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - lie "~3.3.0" - pako "~1.0.2" - readable-stream "~2.3.6" - setimmediate "^1.0.5" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" kuler@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -langchain@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.2.3.tgz#c14bb05cf871b21bd63b84b3ab89580b1d62539f" - integrity sha512-T9xR7zd+Nj0oXy6WoYKmZLy0DlQiDLFPGYWdOXDxy+AvqlujoPdVQgDSpdqiOHvAjezrByAoKxoHCz5XMwTP/Q== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": + version "0.3.19" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" + integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== dependencies: - "@langchain/core" "~0.2.0" - "@langchain/openai" "~0.0.28" - "@langchain/textsplitters" "~0.0.0" - binary-extensions "^2.2.0" + "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/textsplitters" ">=0.0.0 <0.2.0" js-tiktoken "^1.0.12" js-yaml "^4.1.0" jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" + langsmith ">=0.2.8 <0.4.0" openapi-types "^12.1.3" p-retry "4" - uuid "^9.0.0" + uuid "^10.0.0" yaml "^2.2.1" zod "^3.22.4" zod-to-json-schema "^3.22.3" langchain@^0.1.30: - version "0.1.30" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.30.tgz#e1adb3f1849fcd5c596c668300afd5dc8cb37a97" - integrity sha512-5h/vNMmutQ98tbB0sPDlAileZVca6A2McFgGa3+D56Dm8mSSCzTQL2DngPA6h09DlKDpSr7+6PdFw5Hoj0ZDSw== + version "0.1.31" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" + integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== dependencies: "@anthropic-ai/sdk" "^0.9.1" "@langchain/community" "~0.0.41" "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" + "@langchain/openai" "~0.0.26" binary-extensions "^2.2.0" js-tiktoken "^1.0.7" js-yaml "^4.1.0" @@ -1936,13 +3014,14 @@ langchainhub@~0.0.8: resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== -langsmith@^0.1.56-rc.1: - version "0.1.68" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.68.tgz#848332e822fe5e6734a07f1c36b6530cc1798afb" - integrity sha512-otmiysWtVAqzMx3CJ4PrtUBhWRG5Co8Z4o7hSZENPjlit9/j3/vm3TSvbaxpDYakZxtMjhkcJTqrdYFipISEiQ== +"langsmith@>=0.2.8 <0.4.0": + version "0.3.14" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" + integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== dependencies: "@types/uuid" "^10.0.0" - commander "^10.0.1" + chalk "^4.1.2" + console-table-printer "^2.12.1" p-queue "^6.6.2" p-retry "4" semver "^7.6.3" @@ -1959,39 +3038,72 @@ langsmith@~0.1.1, langsmith@~0.1.7: p-retry "4" uuid "^9.0.0" -langsmith@~0.1.30: - version "0.1.34" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.34.tgz#801310495fef258ed9c22bb5575120e2c06d51cf" - integrity sha512-aMv2k8kEaovhTuZnK6/6DMCoM7Jurvm1AzdESn+yN+HramRxp3sK32jFRz3ogkXP6GjAjOIofcnNkzhHXSUXGA== +language-subtag-registry@^0.3.20: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777" + integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - lodash.set "^4.3.2" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" + language-subtag-registry "^0.3.20" leac@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/leac/-/leac-0.6.0.tgz#dcf136e382e666bd2475f44a1096061b70dc0912" integrity sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg== -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: - immediate "~3.0.5" + prelude-ls "^1.2.1" + type-check "~0.4.0" -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg== +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== -logform@^2.3.2, logform@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" - integrity sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ== +lilconfig@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.castarray@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" + integrity sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== dependencies: "@colors/colors" "1.6.0" "@types/triple-beam" "^1.3.2" @@ -2000,19 +3112,17 @@ logform@^2.3.2, logform@^2.4.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" -long@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -lop@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" - integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== +loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - duck "^0.1.12" - option "~0.2.1" - underscore "^1.13.1" + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== lru-cache@^6.0.0: version "6.0.0" @@ -2021,26 +3131,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +lucide-react@^0.363.0: + version "0.363.0" + resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" + integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -mammoth@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.8.0.tgz#d8f1b0d3a0355fda129270346e9dc853f223028f" - integrity sha512-pJNfxSk9IEGVpau+tsZFz22ofjUsl2mnA5eT8PjPs2n0BP+rhVte4Nez6FdgEuxv3IGI3afiV46ImKqTGDVlbA== - dependencies: - "@xmldom/xmldom" "^0.8.6" - argparse "~1.0.3" - base64-js "^1.5.1" - bluebird "~3.4.0" - dingbat-to-unicode "^1.0.1" - jszip "^3.7.1" - lop "^0.4.1" - path-is-absolute "^1.0.0" - underscore "^1.13.1" - xmlbuilder "^10.0.0" +markdown-to-jsx@^7.7.2: + version "7.7.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" + integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== md5@^2.3.0: version "2.3.0" @@ -2051,67 +3150,72 @@ md5@^2.3.0: crypt "0.0.2" is-buffer "~1.1.6" -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" mime-db@1.52.0: version "1.52.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== -minimatch@^3.1.2: +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^9.0.1: + version "9.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" + integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - ml-array-mean@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" @@ -2148,61 +3252,85 @@ ml-tree-similarity@^1.0.0: binary-search "^1.3.5" num-sort "^2.0.0" -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multer@^1.4.5-lts.1: - version "1.4.5-lts.1" - resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" - integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== - dependencies: - append-field "^1.0.0" - busboy "^1.0.0" - concat-stream "^1.5.2" - mkdirp "^0.5.4" - object-assign "^4.1.1" - type-is "^1.6.4" - xtend "^4.0.0" - mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +nanoid@^3.3.6: + version "3.3.10" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.10.tgz#7bc882237698ef787d5cbba109e3b0168ba6e7b1" + integrity sha512-vSJJTG+t/dIKAUhUDw/dLdZ9s//5OxcHqLaDWWrW4Cdq7o6tdLIczUkMXt2MBNmk6sJRZBZRXVixs7URY1CmIg== + +nanoid@^3.3.7: + version "3.3.7" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +next-themes@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/next-themes/-/next-themes-0.3.0.tgz#b4d2a866137a67d42564b07f3a3e720e2ff3871a" + integrity sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w== + +next@^15.2.2: + version "15.2.2" + resolved "https://registry.yarnpkg.com/next/-/next-15.2.2.tgz#e3941a0e0e76cfe1880b57452807489e0546e3a2" + integrity sha512-dgp8Kcx5XZRjMw2KNwBtUzhngRaURPioxoNIVl5BOyJbhi9CUgEtKDO7fx5wh8Z8vOVX1nYZ9meawJoRrlASYA== + dependencies: + "@next/env" "15.2.2" + "@swc/counter" "0.1.3" + "@swc/helpers" "0.5.15" + busboy "1.6.0" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" + optionalDependencies: + "@next/swc-darwin-arm64" "15.2.2" + "@next/swc-darwin-x64" "15.2.2" + "@next/swc-linux-arm64-gnu" "15.2.2" + "@next/swc-linux-arm64-musl" "15.2.2" + "@next/swc-linux-x64-gnu" "15.2.2" + "@next/swc-linux-x64-musl" "15.2.2" + "@next/swc-win32-arm64-msvc" "15.2.2" + "@next/swc-win32-x64-msvc" "15.2.2" + sharp "^0.33.5" node-abi@^3.3.0: - version "3.62.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.62.0.tgz#017958ed120f89a3a14a7253da810f5d724e3f36" - integrity sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g== + version "3.74.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" + integrity sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== dependencies: semver "^7.3.5" -node-addon-api@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" - integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== - node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -2220,57 +3348,103 @@ node-fetch@^2.6.7: dependencies: whatwg-url "^5.0.0" -nodemon@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-3.1.0.tgz#ff7394f2450eb6a5e96fe4180acd5176b29799c9" - integrity sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA== - dependencies: - chokidar "^3.5.2" - debug "^4" - ignore-by-default "^1.0.1" - minimatch "^3.1.2" - pstree.remy "^1.1.8" - semver "^7.5.3" - simple-update-notifier "^2.0.0" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.5" - -nopt@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== - dependencies: - abbrev "1" +node-releases@^2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + num-sort@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== -object-assign@^4, object-assign@^4.1.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -once@^1.3.1, once@^1.4.0: +object.assign@^4.1.4, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.7: + version "1.1.8" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" + integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +object.fromentries@^2.0.7: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.groupby@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + +object.hasown@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" + integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== + dependencies: + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + +object.values@^1.1.6, object.values@^1.1.7: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -2284,56 +3458,10 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" -onnx-proto@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" - integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== - dependencies: - protobufjs "^6.8.8" - -onnxruntime-common@~1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" - integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== - -onnxruntime-node@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" - integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== - dependencies: - onnxruntime-common "~1.14.0" - -onnxruntime-web@1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" - integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== - dependencies: - flatbuffers "^1.12.0" - guid-typescript "^1.0.9" - long "^4.0.0" - onnx-proto "^4.0.4" - onnxruntime-common "~1.14.0" - platform "^1.3.6" - -openai@^4.26.0: - version "4.31.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.31.0.tgz#5d96045c4eb244fa21f0fff0981043a2c9f09e8c" - integrity sha512-JebkRnRGEGLnJt3+bJ5B7au8nBeZvJjs9baVxDmUZ5+BgafAdy6KDxJGSuyaw/IA+ErqY3jmOH5cDC2mCDJF2w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.41.1, openai@^4.49.1: - version "4.52.2" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.52.2.tgz#5d67271f3df84c0b54676b08990eaa9402151759" - integrity sha512-mMc0XgFuVSkcm0lRIi8zaw++otC82ZlfkCur1qguXYWPETr/+ZwL9A/vvp3YahX+shpaT6j03dwsmUyLAfmEfg== +openai@^4.26.0, openai@^4.32.1: + version "4.33.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" + integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -2344,21 +3472,55 @@ openai@^4.41.1, openai@^4.49.1: node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +openai@^4.87.3: + version "4.87.4" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" + integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + openapi-types@^12.1.3: version "12.1.3" resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== -option@~0.2.1: - version "0.2.4" - resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" - integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-queue@^6.6.2: version "6.6.2" resolved "https://registry.yarnpkg.com/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" @@ -2382,10 +3544,12 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" -pako@~1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" parseley@^0.12.0: version "0.12.1" @@ -2395,20 +3559,38 @@ parseley@^0.12.0: leac "^0.6.0" peberminta "^0.9.0" -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.10.1, path-scurry@^1.10.2: + version "1.10.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pdf-parse@^1.1.1: version "1.1.1" @@ -2423,27 +3605,112 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== -picomatch@^2.0.4, picomatch@^2.2.1: +picocolors@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -platform@^1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" - integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== + dependencies: + lilconfig "^3.0.0" + yaml "^2.3.4" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@6.0.10: + version "6.0.10" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" + integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^6.0.11: + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.31: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8, postcss@^8.4.23: + version "8.4.38" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== + dependencies: + nanoid "^3.3.7" + picocolors "^1.0.0" + source-map-js "^1.2.0" prebuild-install@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056" - integrity sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ== + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== dependencies: detect-libc "^2.0.0" expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.3" mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" + napi-build-utils "^2.0.0" node-abi "^3.3.0" pump "^3.0.0" rc "^1.2.7" @@ -2451,87 +3718,47 @@ prebuild-install@^7.1.1: tar-fs "^2.0.0" tunnel-agent "^0.6.0" +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prettier@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -protobufjs@^6.8.8: - version "6.11.4" - resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" - integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== dependencies: - "@protobufjs/aspromise" "^1.1.2" - "@protobufjs/base64" "^1.1.2" - "@protobufjs/codegen" "^2.0.4" - "@protobufjs/eventemitter" "^1.1.0" - "@protobufjs/fetch" "^1.1.0" - "@protobufjs/float" "^1.0.2" - "@protobufjs/inquire" "^1.1.0" - "@protobufjs/path" "^1.1.2" - "@protobufjs/pool" "^1.1.0" - "@protobufjs/utf8" "^1.1.0" - "@types/long" "^4.0.1" - "@types/node" ">=13.7.0" - long "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -pstree.remy@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== - pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + version "3.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== dependencies: end-of-stream "^1.1.0" once "^1.3.1" -qs@6.11.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -queue-tick@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" - integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== rc@^1.2.7: version "1.2.8" @@ -2543,20 +3770,48 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -readable-stream@^2.2.2, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== +react-dom@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" + loose-envify "^1.1.0" + scheduler "^0.23.0" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-text-to-speech@^0.14.5: + version "0.14.5" + resolved "https://registry.yarnpkg.com/react-text-to-speech/-/react-text-to-speech-0.14.5.tgz#f918786ab283311535682011045bd49777193300" + integrity sha512-3brr/IrK/5YTtOZSTo+Y8b+dnWelzfZiDZvkXnOct1e7O7fgA/h9bYAVrtwSRo/VxKfdw+wh6glkj6M0mlQuQQ== + +react-textarea-autosize@^8.5.3: + version "8.5.3" + resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz#d1e9fe760178413891484847d3378706052dd409" + integrity sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react@^18: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -2572,35 +3827,121 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reflect.getprototypeof@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859" + integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== + dependencies: + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.5: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + retry@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@~5.2.0: +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== + dependencies: + call-bind "^1.0.7" + get-intrinsic "^1.2.4" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-regex "^1.1.4" safe-stable-stringify@^2.3.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz#138c84b6f6edb3db5f8ef3ef7115b8f55ccbf886" - integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== + version "2.5.0" + resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" selderee@^0.11.0: version "0.11.0" @@ -2609,47 +3950,23 @@ selderee@^0.11.0: dependencies: parseley "^0.12.0" -semver@^7.3.5, semver@^7.5.3, semver@^7.5.4: +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.5, semver@^7.6.2, semver@^7.6.3: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +semver@^7.5.4: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" -semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - set-function-length@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" @@ -2662,31 +3979,63 @@ set-function-length@^1.2.1: gopd "^1.0.1" has-property-descriptors "^1.0.2" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== +set-function-name@^2.0.1, set-function-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.2" -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sharp@^0.32.0: - version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" - integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== +sharp@^0.33.5: + version "0.33.5" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" + integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== dependencies: color "^4.2.3" - detect-libc "^2.0.2" - node-addon-api "^6.1.0" - prebuild-install "^7.1.1" - semver "^7.5.4" - simple-get "^4.0.1" - tar-fs "^3.0.4" - tunnel-agent "^0.6.0" + detect-libc "^2.0.3" + semver "^7.6.3" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.33.5" + "@img/sharp-darwin-x64" "0.33.5" + "@img/sharp-libvips-darwin-arm64" "1.0.4" + "@img/sharp-libvips-darwin-x64" "1.0.4" + "@img/sharp-libvips-linux-arm" "1.0.5" + "@img/sharp-libvips-linux-arm64" "1.0.4" + "@img/sharp-libvips-linux-s390x" "1.0.4" + "@img/sharp-libvips-linux-x64" "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" + "@img/sharp-libvips-linuxmusl-x64" "1.0.4" + "@img/sharp-linux-arm" "0.33.5" + "@img/sharp-linux-arm64" "0.33.5" + "@img/sharp-linux-s390x" "0.33.5" + "@img/sharp-linux-x64" "0.33.5" + "@img/sharp-linuxmusl-arm64" "0.33.5" + "@img/sharp-linuxmusl-x64" "0.33.5" + "@img/sharp-wasm32" "0.33.5" + "@img/sharp-win32-ia32" "0.33.5" + "@img/sharp-win32-x64" "0.33.5" -side-channel@^1.0.4: +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.2.tgz#d2d83e057959d53ec261311e9e9b8f51dcb2934a" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel@^1.0.4, side-channel@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== @@ -2696,12 +4045,17 @@ side-channel@^1.0.4: get-intrinsic "^1.2.4" object-inspect "^1.13.1" +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-concat@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^4.0.0, simple-get@^4.0.1: +simple-get@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== @@ -2717,12 +4071,30 @@ simple-swizzle@^0.2.2: dependencies: is-arrayish "^0.3.1" -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" +simple-wcswidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" + integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +sonner@^1.4.41: + version "1.4.41" + resolved "https://registry.yarnpkg.com/sonner/-/sonner-1.4.41.tgz#ff085ae4f4244713daf294959beaa3e90f842d2c" + integrity sha512-uG511ggnnsw6gcn/X+YKkWPo5ep9il9wYi3QJxHsYe7yTZ4+cOd1wuodOUmOpFuXL+/RE3R04LczdNCDygTDgQ== + +source-map-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-js@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-support@^0.5.21: version "0.5.21" @@ -2737,35 +4109,88 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== -streamx@^2.15.0, streamx@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.16.1.tgz#2b311bd34832f08aa6bb4d6a80297c9caef89614" - integrity sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ== +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - fast-fifo "^1.1.0" - queue-tick "^1.0.1" - optionalDependencies: - bare-events "^2.2.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string.prototype.matchall@^4.0.10: + version "4.0.11" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" + integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.7" + regexp.prototype.flags "^1.5.2" + set-function-name "^2.0.2" + side-channel "^1.0.6" + +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" + +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.1.1: version "1.3.0" @@ -2774,51 +4199,129 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - safe-buffer "~5.1.0" + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -strnum@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" - integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== - -supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +styled-jsx@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" + integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== dependencies: - has-flag "^3.0.0" + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tabbable@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwind-merge@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.2.2.tgz#87341e7604f0e20499939e152cd2841f41f7a3df" + integrity sha512-tWANXsnmJzgw6mQ07nE3aCDkCK4QdT3ThPMCzawoYA2Pws7vSTCvz3Vrjg61jVUGfFZPJzxEP+NimbcW+EdaDw== + dependencies: + "@babel/runtime" "^7.24.0" + +tailwindcss@^3.3.0: + version "3.4.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.0" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== tar-fs@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.2.tgz#425f154f3404cb16cb8ff6e671d45ab2ed9596c5" + integrity sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== dependencies: chownr "^1.1.1" mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.1.4" -tar-fs@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" - integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" - optionalDependencies: - bare-fs "^2.1.1" - bare-path "^2.1.0" - tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -2830,20 +4333,30 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -tar-stream@^3.1.5: - version "3.1.7" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" - integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== - dependencies: - b4a "^1.6.4" - fast-fifo "^1.2.0" - streamx "^2.15.0" - text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -2851,18 +4364,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -touch@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== - dependencies: - nopt "~1.0.10" - tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -2873,24 +4374,30 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== -ts-node@^10.9.2: - version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" - integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== +ts-api-utils@^1.0.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tsconfig-paths@^3.15.0: + version "3.15.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" + integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.4.0, tslib@^2.8.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tunnel-agent@^0.6.0: version "0.6.0" @@ -2899,54 +4406,119 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -type-is@^1.6.4, type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" + prelude-ls "^1.2.1" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^5.4.3: - version "5.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" - integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -undefsafe@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" - integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -underscore@^1.13.1: - version "1.13.7" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" - integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== + dependencies: + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" + +typescript@^5: + version "5.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.4.tgz#eb2471e7b0a5f1377523700a21669dce30c2d952" + integrity sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" -util-deprecate@^1.0.1, util-deprecate@~1.0.1: +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" @@ -2957,11 +4529,6 @@ uuid@^9.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - validate.io-array@^1.0.3, validate.io-array@^1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" @@ -2972,11 +4539,6 @@ validate.io-function@^1.0.2: resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" @@ -3000,77 +4562,144 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -winston-transport@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.7.0.tgz#e302e6889e6ccb7f383b926df6936a5b781bd1f0" - integrity sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - logform "^2.3.2" - readable-stream "^3.6.0" + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" + integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== + dependencies: + is-map "^2.0.3" + is-set "^2.0.3" + is-weakmap "^2.0.2" + is-weakset "^2.0.3" + +which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.2" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" triple-beam "^1.3.0" -winston@^3.13.0: - version "3.13.0" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.13.0.tgz#e76c0d722f78e04838158c61adc1287201de7ce3" - integrity sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ== +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-3.17.0.tgz#74b8665ce9b4ea7b29d0922cfccf852a08a11423" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== dependencies: "@colors/colors" "^1.6.0" "@dabh/diagnostics" "^2.0.2" async "^3.2.3" is-stream "^2.0.0" - logform "^2.4.0" + logform "^2.7.0" one-time "^1.0.0" readable-stream "^3.4.0" safe-stable-stringify "^2.3.1" stack-trace "0.0.x" triple-beam "^1.3.0" - winston-transport "^4.7.0" + winston-transport "^4.9.0" + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -ws@^8.17.1: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" - integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== - -xmlbuilder@^10.0.0: - version "10.1.1" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" - integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.1: +yaml@^2.2.1, yaml@^2.3.4: version "2.4.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yet-another-react-lightbox@^3.17.2: + version "3.17.2" + resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" + integrity sha512-fM+Br5nR2kt/oBAOHDqVdUmogiHRLCt4iuIJHPS9Q+ME+h+ciME6vEpLt3IPgGU8whib1agEyZBgWJOAKjgadQ== -zod-to-json-schema@^3.22.3: +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: version "3.22.5" resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== -zod-to-json-schema@^3.22.4, zod-to-json-schema@^3.22.5: - version "3.23.1" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.23.1.tgz#5225925b8ed5fa20096bd99be076c4b29b53d309" - integrity sha512-oT9INvydob1XV0v1d2IadrR74rLtDInLvDFfAa1CG0Pmg/vxATk7I2gSelfj271mbzeM4Da0uuDQE/Nkj3DWNw== - zod@^3.22.3, zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 403d13eb50bd17b264ae38c485f75f3f5b4183dd Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:34:55 +0530 Subject: [PATCH 031/147] feat(package): update scripts --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index c9314b4..8d5b49b 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,10 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start", + "start": "npm run db:push && next start", "lint": "next lint", "format:write": "prettier . --write", - "db:push": "drizzle-kit push sqlite" + "db:push": "drizzle-kit push" }, "dependencies": { "@headlessui/react": "^2.2.0", From ea638279e5c3a21a31333d18f1158998c39ffb5c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:46:50 +0530 Subject: [PATCH 032/147] feat(docker): use standalone build --- .github/workflows/docker-build.yaml | 25 +++++---------------- app.dockerfile | 35 ++++++++++++++++------------- docker-compose.yaml | 1 + next.config.mjs | 1 + 4 files changed, 28 insertions(+), 34 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index f658c29..0620afb 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -10,9 +10,6 @@ on: jobs: build-and-push: runs-on: ubuntu-latest - strategy: - matrix: - service: [backend, app] steps: - name: Checkout code uses: actions/checkout@v3 @@ -36,17 +33,12 @@ jobs: id: version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build and push Docker image for ${{ matrix.service }} + - name: Build and push Docker image if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | docker buildx create --use - if [[ "${{ matrix.service }}" == "backend" ]]; then \ - DOCKERFILE=backend.dockerfile; \ - IMAGE_NAME=perplexica-backend; \ - else \ - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica-frontend; \ - fi + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica; \ docker buildx build --platform linux/amd64,linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \ --cache-to=type=inline \ @@ -54,17 +46,12 @@ jobs: -t itzcrazykns1337/${IMAGE_NAME}:main \ --push . - - name: Build and push release Docker image for ${{ matrix.service }} + - name: Build and push release Docker image if: github.event_name == 'release' run: | docker buildx create --use - if [[ "${{ matrix.service }}" == "backend" ]]; then \ - DOCKERFILE=backend.dockerfile; \ - IMAGE_NAME=perplexica-backend; \ - else \ - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica-frontend; \ - fi + DOCKERFILE=app.dockerfile; \ + IMAGE_NAME=perplexica; \ docker buildx build --platform linux/amd64,linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ --cache-to=type=inline \ diff --git a/app.dockerfile b/app.dockerfile index 97c6a96..2571305 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,22 +1,27 @@ +FROM node:20.18.0-alpine AS builder + +WORKDIR /home/perplexica + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +COPY tsconfig.json next.config.mjs next-env.d.ts postcss.config.js drizzle.config.ts tailwind.config.ts ./ +COPY src ./src +COPY public ./public + +RUN mkdir -p /home/perplexica/data +RUN yarn build + FROM node:20.18.0-alpine WORKDIR /home/perplexica -COPY src /home/perplexica/src -COPY public /home/perplexica/public -COPY package.json /home/perplexica/package.json -COPY yarn.lock /home/perplexica/yarn.lock -COPY tsconfig.json /home/perplexica/tsconfig.json -COPY next.config.mjs /home/perplexica/next.config.mjs -COPY next-env.d.ts /home/perplexica/next-env.d.ts -COPY postcss.config.js /home/perplexica/postcss.config.js -COPY drizzle.config.ts /home/perplexica/drizzle.config.ts -COPY tailwind.config.ts /home/perplexica/tailwind.config.ts +COPY --from=builder /home/perplexica/public ./public +COPY --from=builder /home/perplexica/.next/static ./public/_next/static + +COPY --from=builder /home/perplexica/.next/standalone ./ +COPY --from=builder /home/perplexica/data ./data -RUN mkdir /home/perplexica/data RUN mkdir /home/perplexica/uploads -RUN yarn install --frozen-lockfile -RUN yarn build - -CMD ["yarn", "start"] \ No newline at end of file +CMD ["node", "server.js"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 631e42b..b702b4e 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -10,6 +10,7 @@ services: restart: unless-stopped app: + image: itzcrazykns1337/perplexica:main build: context: . dockerfile: app.dockerfile diff --git a/next.config.mjs b/next.config.mjs index 74156d1..2300ff4 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -1,5 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + output: 'standalone', images: { remotePatterns: [ { From 4d1ee79b8daaa1564da774ee838fa0ed0e2af67f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:47:12 +0530 Subject: [PATCH 033/147] feat(package): migrate db when built --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 8d5b49b..f73500c 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "author": "ItzCrazyKns", "scripts": { "dev": "next dev", - "build": "next build", - "start": "npm run db:push && next start", + "build": "npm run db:push && next build", + "start": "next start", "lint": "next lint", "format:write": "prettier . --write", "db:push": "drizzle-kit push" From 008c7cbec03253d45b73457bc2d3abab9a0da6b5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:47:32 +0530 Subject: [PATCH 034/147] feat(chat-window): remove debugging code, --- src/components/ChatWindow.tsx | 54 ++++++++++------------------------- 1 file changed, 15 insertions(+), 39 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 47bbab2..0c956e8 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -343,30 +343,6 @@ const ChatWindow = ({ id }: { id?: string }) => { messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - console.log( - JSON.stringify({ - content: message, - message: { - messageId: messageId, - chatId: chatId!, - content: message, - }, - chatId: chatId!, - files: fileIds, - focusMode: focusMode, - optimizationMode: optimizationMode, - history: chatHistory, - chatModel: { - name: chatModelProvider.name, - provider: chatModelProvider.provider, - }, - embeddingModel: { - name: embeddingModelProvider.name, - provider: embeddingModelProvider.provider, - }, - }), - ); - setMessages((prevMessages) => [ ...prevMessages, { @@ -445,6 +421,21 @@ const ChatWindow = ({ id }: { id?: string }) => { const lastMsg = messagesRef.current[messagesRef.current.length - 1]; + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (autoImageSearch === 'true') { + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); + } + + if (autoVideoSearch === 'true') { + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); + } + if ( lastMsg.role === 'assistant' && lastMsg.sources && @@ -461,21 +452,6 @@ const ChatWindow = ({ id }: { id?: string }) => { }), ); } - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (autoImageSearch === 'true') { - document - .getElementById(`search-images-${lastMsg.messageId}`) - ?.click(); - } - - if (autoVideoSearch === 'true') { - document - .getElementById(`search-videos-${lastMsg.messageId}`) - ?.click(); - } } }; From 584d02b92a2949aeb7927cc44c9a82f769dfb2c9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:56:03 +0530 Subject: [PATCH 035/147] feat(app): add thinking model support --- src/components/MessageBox.tsx | 38 +++++++++++++++++++++++++++---- src/components/ThinkBox.tsx | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/components/ThinkBox.tsx diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 499c3d6..4473c3b 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -12,13 +12,18 @@ import { Layers3, Plus, } from 'lucide-react'; -import Markdown from 'markdown-to-jsx'; +import Markdown, { MarkdownToJSX } from 'markdown-to-jsx'; import Copy from './MessageActions/Copy'; import Rewrite from './MessageActions/Rewrite'; import MessageSources from './MessageSources'; import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; +import ThinkBox from './ThinkBox'; + +const ThinkTagProcessor = ({ children }: { children: React.ReactNode }) => { + return <ThinkBox content={children as string} />; +}; const MessageBox = ({ message, @@ -44,27 +49,48 @@ const MessageBox = ({ useEffect(() => { const regex = /\[(\d+)\]/g; + let processedMessage = message.content; + + if (message.role === 'assistant' && message.content.includes('<think>')) { + const openThinkTag = processedMessage.match(/<think>/g)?.length || 0; + const closeThinkTag = processedMessage.match(/<\/think>/g)?.length || 0; + + if (openThinkTag > closeThinkTag) { + processedMessage += '</think> <a> </a>'; // The extra <a> </a> is to prevent the the think component from looking bad + } + } if ( message.role === 'assistant' && message?.sources && message.sources.length > 0 ) { - return setParsedMessage( - message.content.replace( + setParsedMessage( + processedMessage.replace( regex, (_, number) => - `<a href="${message.sources?.[number - 1]?.metadata?.url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, + `<a href="${ + message.sources?.[number - 1]?.metadata?.url + }" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, ), ); + return; } setSpeechMessage(message.content.replace(regex, '')); - setParsedMessage(message.content); + setParsedMessage(processedMessage); }, [message.content, message.sources, message.role]); const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); + const markdownOverrides: MarkdownToJSX.Options = { + overrides: { + think: { + component: ThinkTagProcessor, + }, + }, + }; + return ( <div> {message.role === 'user' && ( @@ -111,11 +137,13 @@ const MessageBox = ({ Answer </h3> </div> + <Markdown className={cn( 'prose prose-h1:mb-3 prose-h2:mb-2 prose-h2:mt-6 prose-h2:font-[800] prose-h3:mt-4 prose-h3:mb-1.5 prose-h3:font-[600] dark:prose-invert prose-p:leading-relaxed prose-pre:p-0 font-[400]', 'max-w-none break-words text-black dark:text-white', )} + options={markdownOverrides} > {parsedMessage} </Markdown> diff --git a/src/components/ThinkBox.tsx b/src/components/ThinkBox.tsx new file mode 100644 index 0000000..9c6a576 --- /dev/null +++ b/src/components/ThinkBox.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { useState } from 'react'; +import { cn } from '@/lib/utils'; +import { ChevronDown, ChevronUp, BrainCircuit } from 'lucide-react'; + +interface ThinkBoxProps { + content: string; +} + +const ThinkBox = ({ content }: ThinkBoxProps) => { + const [isExpanded, setIsExpanded] = useState(false); + + return ( + <div className="my-4 bg-light-secondary/50 dark:bg-dark-secondary/50 rounded-xl border border-light-200 dark:border-dark-200 overflow-hidden"> + <button + onClick={() => setIsExpanded(!isExpanded)} + className="w-full flex items-center justify-between px-4 py-1 text-black/90 dark:text-white/90 hover:bg-light-200 dark:hover:bg-dark-200 transition duration-200" + > + <div className="flex items-center space-x-2"> + <BrainCircuit + size={20} + className="text-[#9C27B0] dark:text-[#CE93D8]" + /> + <p className="font-medium text-sm">Thinking Process</p> + </div> + {isExpanded ? ( + <ChevronUp size={18} className="text-black/70 dark:text-white/70" /> + ) : ( + <ChevronDown size={18} className="text-black/70 dark:text-white/70" /> + )} + </button> + + {isExpanded && ( + <div className="px-4 py-3 text-black/80 dark:text-white/80 text-sm border-t border-light-200 dark:border-dark-200 bg-light-100/50 dark:bg-dark-100/50 whitespace-pre-wrap"> + {content} + </div> + )} + </div> + ); +}; + +export default ThinkBox; From ffa793056d69116c1cdaca825ac917e8a5113e52 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:47:54 +0530 Subject: [PATCH 036/147] feat(chains): remove think tags --- src/lib/chains/imageSearchAgent.ts | 2 ++ src/lib/chains/videoSearchAgent.ts | 2 ++ src/lib/search/metaSearchAgent.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index d194612..4fd684f 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -58,6 +58,8 @@ const createImageSearchChain = (llm: BaseChatModel) => { llm, strParser, RunnableLambda.from(async (input: string) => { + input = input.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(input, { engines: ['bing images', 'google images'], }); diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index e1051f6..f7cb156 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -59,6 +59,8 @@ const createVideoSearchChain = (llm: BaseChatModel) => { llm, strParser, RunnableLambda.from(async (input: string) => { + input = input.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(input, { engines: ['youtube'], }); diff --git a/src/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts index 38ea2a0..4a3d817 100644 --- a/src/lib/search/metaSearchAgent.ts +++ b/src/lib/search/metaSearchAgent.ts @@ -202,6 +202,8 @@ class MetaSearchAgent implements MetaSearchAgentType { return { query: question, docs: docs }; } else { + question = question.replace(/<think>.*?<\/think>/g, ''); + const res = await searchSearxng(question, { language: 'en', engines: this.config.activeEngines, From cf7144db9661ff57945960e44aeeba7b11b6d346 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:48:26 +0530 Subject: [PATCH 037/147] feat(providers): add HF transformers --- package.json | 1 + src/lib/huggingfaceTransformer.ts | 82 ++++++++++ src/lib/providers/index.ts | 2 + src/lib/providers/transformers.ts | 31 ++++ yarn.lock | 259 +++++++++++++++++++++++++++++- 5 files changed, 373 insertions(+), 2 deletions(-) create mode 100644 src/lib/huggingfaceTransformer.ts create mode 100644 src/lib/providers/transformers.ts diff --git a/package.json b/package.json index f73500c..904e0b2 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "@langchain/openai": "^0.0.25", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", "axios": "^1.8.3", "better-sqlite3": "^11.9.1", "clsx": "^2.1.0", diff --git a/src/lib/huggingfaceTransformer.ts b/src/lib/huggingfaceTransformer.ts new file mode 100644 index 0000000..6afc652 --- /dev/null +++ b/src/lib/huggingfaceTransformer.ts @@ -0,0 +1,82 @@ +import { Embeddings, type EmbeddingsParams } from '@langchain/core/embeddings'; +import { chunkArray } from '@langchain/core/utils/chunk_array'; + +export interface HuggingFaceTransformersEmbeddingsParams + extends EmbeddingsParams { + modelName: string; + + model: string; + + timeout?: number; + + batchSize?: number; + + stripNewLines?: boolean; +} + +export class HuggingFaceTransformersEmbeddings + extends Embeddings + implements HuggingFaceTransformersEmbeddingsParams +{ + modelName = 'Xenova/all-MiniLM-L6-v2'; + + model = 'Xenova/all-MiniLM-L6-v2'; + + batchSize = 512; + + stripNewLines = true; + + timeout?: number; + + private pipelinePromise: Promise<any> | undefined; + + constructor(fields?: Partial<HuggingFaceTransformersEmbeddingsParams>) { + super(fields ?? {}); + + this.modelName = fields?.model ?? fields?.modelName ?? this.model; + this.model = this.modelName; + this.stripNewLines = fields?.stripNewLines ?? this.stripNewLines; + this.timeout = fields?.timeout; + } + + async embedDocuments(texts: string[]): Promise<number[][]> { + const batches = chunkArray( + this.stripNewLines ? texts.map((t) => t.replace(/\n/g, ' ')) : texts, + this.batchSize, + ); + + const batchRequests = batches.map((batch) => this.runEmbedding(batch)); + const batchResponses = await Promise.all(batchRequests); + const embeddings: number[][] = []; + + for (let i = 0; i < batchResponses.length; i += 1) { + const batchResponse = batchResponses[i]; + for (let j = 0; j < batchResponse.length; j += 1) { + embeddings.push(batchResponse[j]); + } + } + + return embeddings; + } + + async embedQuery(text: string): Promise<number[]> { + const data = await this.runEmbedding([ + this.stripNewLines ? text.replace(/\n/g, ' ') : text, + ]); + return data[0]; + } + + private async runEmbedding(texts: string[]) { + const { pipeline } = await import('@xenova/transformers'); + + const pipe = await (this.pipelinePromise ??= pipeline( + 'feature-extraction', + this.model, + )); + + return this.caller.call(async () => { + const output = await pipe(texts, { pooling: 'mean', normalize: true }); + return output.tolist(); + }); + } +} diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 3b3cf63..c32d0fa 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -11,6 +11,7 @@ import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; import { loadGroqChatModels } from './groq'; import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; +import { loadTransformersEmbeddingsModels } from './transformers'; export interface ChatModel { displayName: string; @@ -40,6 +41,7 @@ export const embeddingModelProviders: Record< openai: loadOpenAIEmbeddingModels, ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, + transformers: loadTransformersEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts new file mode 100644 index 0000000..a06dd12 --- /dev/null +++ b/src/lib/providers/transformers.ts @@ -0,0 +1,31 @@ +import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; + +export const loadTransformersEmbeddingsModels = async () => { + try { + const embeddingModels = { + 'xenova-bge-small-en-v1.5': { + displayName: 'BGE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bge-small-en-v1.5', + }), + }, + 'xenova-gte-small': { + displayName: 'GTE Small', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/gte-small', + }), + }, + 'xenova-bert-base-multilingual-uncased': { + displayName: 'Bert Multilingual', + model: new HuggingFaceTransformersEmbeddings({ + modelName: 'Xenova/bert-base-multilingual-uncased', + }), + }, + }; + + return embeddingModels; + } catch (err) { + console.error(`Error loading Transformers embeddings model: ${err}`); + return {}; + } +}; diff --git a/yarn.lock b/yarn.lock index da8c916..a405105 100644 --- a/yarn.lock +++ b/yarn.lock @@ -384,6 +384,11 @@ "@react-aria/interactions" "^3.21.3" "@tanstack/react-virtual" "^3.8.1" +"@huggingface/jinja@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@huggingface/jinja/-/jinja-0.2.2.tgz#faeb205a9d6995089bef52655ddd8245d3190627" + integrity sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" @@ -757,6 +762,59 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + "@react-aria/focus@^3.17.1": version "3.18.4" resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.18.4.tgz#a6e95896bc8680d1b5bcd855e983fc2c195a1a55" @@ -872,6 +930,11 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + "@types/node-fetch@^2.6.4": version "2.6.11" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" @@ -887,6 +950,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@>=13.7.0": + version "22.13.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.13.10.tgz#df9ea358c5ed991266becc3109dc2dc9125d77e4" + integrity sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw== + dependencies: + undici-types "~6.20.0" + "@types/node@^18.11.18": version "18.19.30" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" @@ -990,6 +1060,17 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@xenova/transformers@^2.17.2": + version "2.17.2" + resolved "https://registry.yarnpkg.com/@xenova/transformers/-/transformers-2.17.2.tgz#7448d73b90f67bced66f39fe2dd656adc891fde5" + integrity sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ== + dependencies: + "@huggingface/jinja" "^0.2.2" + onnxruntime-web "1.14.0" + sharp "^0.32.0" + optionalDependencies: + onnxruntime-node "1.14.0" + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1240,11 +1321,49 @@ axobject-query@^3.2.1: dependencies: dequal "^2.0.3" +b4a@^1.6.4: + version "1.6.7" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4" + integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.5.4.tgz#16143d435e1ed9eafd1ab85f12b89b3357a41745" + integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== + +bare-fs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.0.1.tgz#85844f34da819c76754d545323a8b23ed3617c76" + integrity sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg== + dependencies: + bare-events "^2.0.0" + bare-path "^3.0.0" + bare-stream "^2.0.0" + +bare-os@^3.0.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-3.6.0.tgz#1465dd7e1bebe0dec230097a23ad00f7db51f957" + integrity sha512-BUrFS5TqSBdA0LwHop4OjPJwisqxGy6JsWVqV6qaFoe965qqtaKfDzHY5T2YA1gUL0ZeeQeA+4BBc1FJTcHiPw== + +bare-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.0.0.tgz#b59d18130ba52a6af9276db3e96a2e3d3ea52178" + integrity sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw== + dependencies: + bare-os "^3.0.1" + +bare-stream@^2.0.0: + version "2.6.5" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.6.5.tgz#bba8e879674c4c27f7e27805df005c15d7a2ca07" + integrity sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA== + dependencies: + streamx "^2.21.0" + base-64@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" @@ -1661,7 +1780,7 @@ dequal@^2.0.3: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -detect-libc@^2.0.0, detect-libc@^2.0.3: +detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== @@ -2224,6 +2343,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -2298,6 +2422,11 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatbuffers@^1.12.0: + version "1.12.0" + resolved "https://registry.yarnpkg.com/flatbuffers/-/flatbuffers-1.12.0.tgz#72e87d1726cb1b216e839ef02658aa87dcef68aa" + integrity sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ== + flatted@^3.2.9: version "3.3.1" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" @@ -2532,6 +2661,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +guid-typescript@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" + integrity sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ== + has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -3112,6 +3246,11 @@ logform@^2.7.0: safe-stable-stringify "^2.3.1" triple-beam "^1.3.0" +long@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" + integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3331,6 +3470,11 @@ node-abi@^3.3.0: dependencies: semver "^7.3.5" +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + node-domexception@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" @@ -3458,6 +3602,37 @@ one-time@^1.0.0: dependencies: fn.name "1.x.x" +onnx-proto@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/onnx-proto/-/onnx-proto-4.0.4.tgz#2431a25bee25148e915906dda0687aafe3b9e044" + integrity sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA== + dependencies: + protobufjs "^6.8.8" + +onnxruntime-common@~1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz#2bb5dac5261269779aa5fb6536ca379657de8bf6" + integrity sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew== + +onnxruntime-node@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz#c4ae6c355cfae7d83abaf36dd39a905c4a010217" + integrity sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w== + dependencies: + onnxruntime-common "~1.14.0" + +onnxruntime-web@1.14.0: + version "1.14.0" + resolved "https://registry.yarnpkg.com/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz#c8cee538781b1d4c1c6b043934f4a3e6ddf1466e" + integrity sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw== + dependencies: + flatbuffers "^1.12.0" + guid-typescript "^1.0.9" + long "^4.0.0" + onnx-proto "^4.0.4" + onnxruntime-common "~1.14.0" + platform "^1.3.6" + openai@^4.26.0, openai@^4.32.1: version "4.33.0" resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" @@ -3625,6 +3800,11 @@ pirates@^4.0.1: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +platform@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.6.tgz#48b4ce983164b209c2d45a107adb31f473a6e7a7" + integrity sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -3737,6 +3917,25 @@ prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" +protobufjs@^6.8.8: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -3989,6 +4188,20 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +sharp@^0.32.0: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + sharp@^0.33.5: version "0.33.5" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" @@ -4055,7 +4268,7 @@ simple-concat@^1.0.0: resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== -simple-get@^4.0.0: +simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== @@ -4119,6 +4332,16 @@ streamsearch@^1.1.0: resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== +streamx@^2.15.0, streamx@^2.21.0: + version "2.22.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.22.0.tgz#cd7b5e57c95aaef0ff9b2aef7905afa62ec6e4a7" + integrity sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw== + dependencies: + fast-fifo "^1.3.2" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -4322,6 +4545,17 @@ tar-fs@^2.0.0: pump "^3.0.0" tar-stream "^2.1.4" +tar-fs@^3.0.4: + version "3.0.8" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.8.tgz#8f62012537d5ff89252d01e48690dc4ebed33ab7" + integrity sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + tar-stream@^2.1.4: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" @@ -4333,6 +4567,22 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +text-decoder@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" + text-hex@1.0.x: version "1.0.0" resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" @@ -4482,6 +4732,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" From f628b6e41634d21c2435ef3df893797b8d0aaa40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:48:44 +0530 Subject: [PATCH 038/147] feat(groq): remove deprecated model --- src/lib/providers/groq.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 6377690..beeba02 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -48,10 +48,6 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', key: 'deepseek-r1-distill-qwen-32b', }, - { - displayName: 'DeepSeek R1 Distill Llama 70B SpecDec (Preview)', - key: 'deepseek-r1-distill-llama-70b-specdec', - }, { displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', key: 'deepseek-r1-distill-llama-70b', From 274e6ca88cff878ccf208aea25ff6f731cc7cc06 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 11:49:00 +0530 Subject: [PATCH 039/147] feat(sidebar): remove unused state --- src/components/Sidebar.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 81db8ba..5829c60 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -16,8 +16,6 @@ const VerticalIconContainer = ({ children }: { children: ReactNode }) => { const Sidebar = ({ children }: { children: React.ReactNode }) => { const segments = useSelectedLayoutSegments(); - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - const navLinks = [ { icon: Home, From 048de2cb7420c0f87b868a162ffa7cbdaf5dd42f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:29:31 +0530 Subject: [PATCH 040/147] feat(docs): update docs --- CONTRIBUTING.md | 45 ++++++++++++++++++++++++++++----------------- README.md | 8 ++++---- 2 files changed, 32 insertions(+), 21 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b16eccf..7bbb280 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,32 +1,43 @@ # How to Contribute to Perplexica -Hey there, thanks for deciding to contribute to Perplexica. Anything you help with will support the development of Perplexica and will make it better. Let's walk you through the key aspects to ensure your contributions are effective and in harmony with the project's setup. +Thanks for your interest in contributing to Perplexica! Your help makes this project better. This guide explains how to contribute effectively. + +Perplexica is a modern AI chat application with advanced search capabilities. ## Project Structure -Perplexica's design consists of two main domains: +Perplexica's codebase is organized as follows: -- **Frontend (`ui` directory)**: This is a Next.js application holding all user interface components. It's a self-contained environment that manages everything the user interacts with. -- **Backend (root and `src` directory)**: The backend logic is situated in the `src` folder, but the root directory holds the main `package.json` for backend dependency management. - - All of the focus modes are created using the Meta Search Agent class present in `src/search/metaSearchAgent.ts`. The main logic behind Perplexica lies there. +- **UI Components and Pages**: + - **Components (`src/components`)**: Reusable UI components. + - **Pages and Routes (`src/app`)**: Next.js app directory structure with page components. + - Main app routes include: home (`/`), chat (`/c`), discover (`/discover`), library (`/library`), and settings (`/settings`). + - **API Routes (`src/app/api`)**: API endpoints implemented with Next.js API routes. + - `/api/chat`: Handles chat interactions. + - `/api/search`: Provides direct access to Perplexica's search capabilities. + - Other endpoints for models, files, and suggestions. +- **Backend Logic (`src/lib`)**: Contains all the backend functionality including search, database, and API logic. + - The search functionality is present inside `src/lib/search` directory. + - All of the focus modes are implemented using the Meta Search Agent class in `src/lib/search/metaSearchAgent.ts`. + - Database functionality is in `src/lib/db`. + - Chat model and embedding model providers are managed in `src/lib/providers`. + - Prompt templates and LLM chain definitions are in `src/lib/prompts` and `src/lib/chains` respectively. + +## API Documentation + +Perplexica exposes several API endpoints for programmatic access, including: + +- **Search API**: Access Perplexica's advanced search capabilities directly via the `/api/search` endpoint. For detailed documentation, see `docs/api/search.md`. ## Setting Up Your Environment Before diving into coding, setting up your local environment is key. Here's what you need to do: -### Backend - 1. In the root directory, locate the `sample.config.toml` file. -2. Rename it to `config.toml` and fill in the necessary configuration fields specific to the backend. -3. Run `npm install` to install dependencies. -4. Run `npm run db:push` to set up the local sqlite. -5. Use `npm run dev` to start the backend in development mode. - -### Frontend - -1. Navigate to the `ui` folder and repeat the process of renaming `.env.example` to `.env`, making sure to provide the frontend-specific variables. -2. Execute `npm install` within the `ui` directory to get the frontend dependencies ready. -3. Launch the frontend development server with `npm run dev`. +2. Rename it to `config.toml` and fill in the necessary configuration fields. +3. Run `npm install` to install all dependencies. +4. Run `npm run db:push` to set up the local sqlite database. +5. Use `npm run dev` to start the application in development mode. **Please note**: Docker configurations are present for setting up production environments, whereas `npm run dev` is used for development purposes. diff --git a/README.md b/README.md index 291ea19..fecb3e8 100644 --- a/README.md +++ b/README.md @@ -109,10 +109,10 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 1. Install SearXNG and allow `JSON` format in the SearXNG settings. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. -3. Rename the `.env.example` file to `.env` in the `ui` folder and fill in all necessary fields. -4. After populating the configuration and environment files, run `npm i` in both the `ui` folder and the root directory. -5. Install the dependencies and then execute `npm run build` in both the `ui` folder and the root directory. -6. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. +3. Rename the `sample.config.toml` file to `config.toml`. +4. After populating the configuration run `npm i`. +5. Install the dependencies and then execute `npm run build`. +6. Finally, start the app by running `npm rum start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. From 33b895b75eb349856f66528ef05817ff4cb472a5 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:29:52 +0530 Subject: [PATCH 041/147] feat(app): add search API --- docs/API/SEARCH.md | 12 +-- src/app/api/chat/route.ts | 58 +------------ src/app/api/search/route.ts | 164 ++++++++++++++++++++++++++++++++++++ src/lib/search/index.ts | 59 +++++++++++++ 4 files changed, 230 insertions(+), 63 deletions(-) create mode 100644 src/app/api/search/route.ts create mode 100644 src/lib/search/index.ts diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 9405bc5..0169976 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -20,11 +20,11 @@ The API accepts a JSON object in the request body, where you define the focus mo { "chatModel": { "provider": "openai", - "model": "gpt-4o-mini" + "name": "gpt-4o-mini" }, "embeddingModel": { "provider": "openai", - "model": "text-embedding-3-large" + "name": "text-embedding-3-large" }, "optimizationMode": "speed", "focusMode": "webSearch", @@ -38,18 +38,18 @@ The API accepts a JSON object in the request body, where you define the focus mo ### Request Parameters -- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini"). +- **`chatModel`** (object, optional): Defines the chat model to be used for the query. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "gpt-4o-mini" instead of the display name "GPT 4 omni mini"). - `provider`: Specifies the provider for the chat model (e.g., `openai`, `ollama`). - - `model`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). + - `name`: The specific model from the chosen provider (e.g., `gpt-4o-mini`). - Optional fields for custom OpenAI configuration: - `customOpenAIBaseURL`: If you’re using a custom OpenAI instance, provide the base URL. - `customOpenAIKey`: The API key for a custom OpenAI instance. -- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3001/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large"). +- **`embeddingModel`** (object, optional): Defines the embedding model for similarity-based searching. For model details you can send a GET request at `http://localhost:3000/api/models`. Make sure to use the key value (For example "text-embedding-3-large" instead of the display name "Text Embedding 3 Large"). - `provider`: The provider for the embedding model (e.g., `openai`). - - `model`: The specific embedding model (e.g., `text-embedding-3-large`). + - `name`: The specific embedding model (e.g., `text-embedding-3-large`). - **`focusMode`** (string, required): Specifies which focus mode to use. Available modes: diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 918fd48..d9f9c6b 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -20,67 +20,11 @@ import { getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '@/lib/config'; +import { searchHandlers } from '@/lib/search'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; -const searchHandlers: Record<string, MetaSearchAgent> = { - webSearch: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, - responsePrompt: prompts.webSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: true, - }), - academicSearch: new MetaSearchAgent({ - activeEngines: ['arxiv', 'google scholar', 'pubmed'], - queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, - responsePrompt: prompts.academicSearchResponsePrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - writingAssistant: new MetaSearchAgent({ - activeEngines: [], - queryGeneratorPrompt: '', - responsePrompt: prompts.writingAssistantPrompt, - rerank: true, - rerankThreshold: 0, - searchWeb: false, - summarizer: false, - }), - wolframAlphaSearch: new MetaSearchAgent({ - activeEngines: ['wolframalpha'], - queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, - responsePrompt: prompts.wolframAlphaSearchResponsePrompt, - rerank: false, - rerankThreshold: 0, - searchWeb: true, - summarizer: false, - }), - youtubeSearch: new MetaSearchAgent({ - activeEngines: ['youtube'], - queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, - responsePrompt: prompts.youtubeSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), - redditSearch: new MetaSearchAgent({ - activeEngines: ['reddit'], - queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, - responsePrompt: prompts.redditSearchResponsePrompt, - rerank: true, - rerankThreshold: 0.3, - searchWeb: true, - summarizer: false, - }), -}; - type Message = { messageId: string; chatId: string; diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts new file mode 100644 index 0000000..a2c1bd0 --- /dev/null +++ b/src/app/api/search/route.ts @@ -0,0 +1,164 @@ +import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import type { Embeddings } from '@langchain/core/embeddings'; +import { ChatOpenAI } from '@langchain/openai'; +import { + getAvailableChatModelProviders, + getAvailableEmbeddingModelProviders, +} from '@/lib/providers'; +import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; +import { MetaSearchAgentType } from '@/lib/search/metaSearchAgent'; +import { + getCustomOpenaiApiKey, + getCustomOpenaiApiUrl, + getCustomOpenaiModelName, +} from '@/lib/config'; +import { searchHandlers } from '@/lib/search'; + +interface chatModel { + provider: string; + name: string; + customOpenAIKey?: string; + customOpenAIBaseURL?: string; +} + +interface embeddingModel { + provider: string; + name: string; +} + +interface ChatRequestBody { + optimizationMode: 'speed' | 'balanced'; + focusMode: string; + chatModel?: chatModel; + embeddingModel?: embeddingModel; + query: string; + history: Array<[string, string]>; +} + +export const POST = async (req: Request) => { + try { + const body: ChatRequestBody = await req.json(); + + if (!body.focusMode || !body.query) { + return Response.json( + { message: 'Missing focus mode or query' }, + { status: 400 }, + ); + } + + body.history = body.history || []; + body.optimizationMode = body.optimizationMode || 'balanced'; + + const history: BaseMessage[] = body.history.map((msg) => { + return msg[0] === 'human' + ? new HumanMessage({ content: msg[1] }) + : new AIMessage({ content: msg[1] }); + }); + + const [chatModelProviders, embeddingModelProviders] = await Promise.all([ + getAvailableChatModelProviders(), + getAvailableEmbeddingModelProviders(), + ]); + + const chatModelProvider = + body.chatModel?.provider || Object.keys(chatModelProviders)[0]; + const chatModel = + body.chatModel?.name || + Object.keys(chatModelProviders[chatModelProvider])[0]; + + const embeddingModelProvider = + body.embeddingModel?.provider || Object.keys(embeddingModelProviders)[0]; + const embeddingModel = + body.embeddingModel?.name || + Object.keys(embeddingModelProviders[embeddingModelProvider])[0]; + + let llm: BaseChatModel | undefined; + let embeddings: Embeddings | undefined; + + if (body.chatModel?.provider === 'custom_openai') { + llm = new ChatOpenAI({ + modelName: body.chatModel?.name || getCustomOpenaiModelName(), + openAIApiKey: + body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), + temperature: 0.7, + configuration: { + baseURL: + body.chatModel?.customOpenAIBaseURL || getCustomOpenaiApiUrl(), + }, + }) as unknown as BaseChatModel; + } else if ( + chatModelProviders[chatModelProvider] && + chatModelProviders[chatModelProvider][chatModel] + ) { + llm = chatModelProviders[chatModelProvider][chatModel] + .model as unknown as BaseChatModel | undefined; + } + + if ( + embeddingModelProviders[embeddingModelProvider] && + embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddings = embeddingModelProviders[embeddingModelProvider][ + embeddingModel + ].model as Embeddings | undefined; + } + + if (!llm || !embeddings) { + return Response.json( + { message: 'Invalid model selected' }, + { status: 400 }, + ); + } + + const searchHandler: MetaSearchAgentType = searchHandlers[body.focusMode]; + + if (!searchHandler) { + return Response.json({ message: 'Invalid focus mode' }, { status: 400 }); + } + + const emitter = await searchHandler.searchAndAnswer( + body.query, + history, + llm, + embeddings, + body.optimizationMode, + [], + ); + + return new Promise((resolve, reject) => { + let message = ''; + let sources: any[] = []; + + emitter.on('data', (data) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); + } + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error) => { + reject( + Response.json({ message: 'Search error', error }, { status: 500 }), + ); + }); + }); + } catch (err: any) { + console.error(`Error in getting search results: ${err.message}`); + return Response.json( + { message: 'An error has occurred.' }, + { status: 500 }, + ); + } +}; diff --git a/src/lib/search/index.ts b/src/lib/search/index.ts new file mode 100644 index 0000000..01fb87f --- /dev/null +++ b/src/lib/search/index.ts @@ -0,0 +1,59 @@ +import MetaSearchAgent from '@/lib/search/metaSearchAgent'; +import prompts from '../prompts'; + +export const searchHandlers: Record<string, MetaSearchAgent> = { + webSearch: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: prompts.webSearchRetrieverPrompt, + responsePrompt: prompts.webSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: true, + }), + academicSearch: new MetaSearchAgent({ + activeEngines: ['arxiv', 'google scholar', 'pubmed'], + queryGeneratorPrompt: prompts.academicSearchRetrieverPrompt, + responsePrompt: prompts.academicSearchResponsePrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + writingAssistant: new MetaSearchAgent({ + activeEngines: [], + queryGeneratorPrompt: '', + responsePrompt: prompts.writingAssistantPrompt, + rerank: true, + rerankThreshold: 0, + searchWeb: false, + summarizer: false, + }), + wolframAlphaSearch: new MetaSearchAgent({ + activeEngines: ['wolframalpha'], + queryGeneratorPrompt: prompts.wolframAlphaSearchRetrieverPrompt, + responsePrompt: prompts.wolframAlphaSearchResponsePrompt, + rerank: false, + rerankThreshold: 0, + searchWeb: true, + summarizer: false, + }), + youtubeSearch: new MetaSearchAgent({ + activeEngines: ['youtube'], + queryGeneratorPrompt: prompts.youtubeSearchRetrieverPrompt, + responsePrompt: prompts.youtubeSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), + redditSearch: new MetaSearchAgent({ + activeEngines: ['reddit'], + queryGeneratorPrompt: prompts.redditSearchRetrieverPrompt, + responsePrompt: prompts.redditSearchResponsePrompt, + rerank: true, + rerankThreshold: 0.3, + searchWeb: true, + summarizer: false, + }), +}; From 97804e7b4df7031c0dfdf48429e375c6a371ca1f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:30:06 +0530 Subject: [PATCH 042/147] feat(config): remove unused vars --- sample.config.toml | 1 - src/lib/config.ts | 3 --- 2 files changed, 4 deletions(-) diff --git a/sample.config.toml b/sample.config.toml index 0a800a0..691b964 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -1,5 +1,4 @@ [GENERAL] -PORT = 3001 # Port to run the server on SIMILARITY_MEASURE = "cosine" # "cosine" or "dot" KEEP_ALIVE = "5m" # How long to keep Ollama models loaded into memory. (Instead of using -1 use "-1m") diff --git a/src/lib/config.ts b/src/lib/config.ts index 9a20ce5..dac1ca5 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -6,7 +6,6 @@ const configFileName = 'config.toml'; interface Config { GENERAL: { - PORT: number; SIMILARITY_MEASURE: string; KEEP_ALIVE: string; }; @@ -46,8 +45,6 @@ const loadConfig = () => fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), ) as any as Config; -export const getPort = () => loadConfig().GENERAL.PORT; - export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; From 8b552010f9eabdd2f4ca326f094a7d77c92e8a40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:33:15 +0530 Subject: [PATCH 043/147] feat(docs): update docs --- README.md | 9 ++- docs/installation/NETWORKING.md | 109 -------------------------------- docs/installation/UPDATING.md | 9 +-- 3 files changed, 7 insertions(+), 120 deletions(-) delete mode 100644 docs/installation/NETWORKING.md diff --git a/README.md b/README.md index fecb3e8..6540c73 100644 --- a/README.md +++ b/README.md @@ -109,14 +109,13 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 1. Install SearXNG and allow `JSON` format in the SearXNG settings. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. -3. Rename the `sample.config.toml` file to `config.toml`. -4. After populating the configuration run `npm i`. -5. Install the dependencies and then execute `npm run build`. -6. Finally, start the app by running `npm rum start` +3. After populating the configuration run `npm i`. +4. Install the dependencies and then execute `npm run build`. +5. Finally, start the app by running `npm rum start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. -See the [installation documentation](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/installation) for more information like exposing it your network, etc. +See the [installation documentation](https://github.com/ItzCrazyKns/Perplexica/tree/master/docs/installation) for more information like updating, etc. ### Ollama Connection Errors diff --git a/docs/installation/NETWORKING.md b/docs/installation/NETWORKING.md deleted file mode 100644 index ae39e3f..0000000 --- a/docs/installation/NETWORKING.md +++ /dev/null @@ -1,109 +0,0 @@ -# Expose Perplexica to a network - -This guide will show you how to make Perplexica available over a network. Follow these steps to allow computers on the same network to interact with Perplexica. Choose the instructions that match the operating system you are using. - -## Windows - -1. Open PowerShell as Administrator - -2. Navigate to the directory containing the `docker-compose.yaml` file - -3. Stop and remove the existing Perplexica containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Open the `docker-compose.yaml` file in a text editor like Notepad++ - -5. Replace `127.0.0.1` with the IP address of the server Perplexica is running on in these two lines: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and close the `docker-compose.yaml` file - -7. Rebuild and restart the Perplexica container: - - ```bash - docker compose up -d --build - ``` - -## macOS - -1. Open the Terminal application - -2. Navigate to the directory with the `docker-compose.yaml` file: - - ```bash - cd /path/to/docker-compose.yaml - ``` - -3. Stop and remove existing containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Open `docker-compose.yaml` in a text editor like Sublime Text: - - ```bash - nano docker-compose.yaml - ``` - -5. Replace `127.0.0.1` with the server IP in these lines: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and exit the editor - -7. Rebuild and restart Perplexica: - - ```bash - docker compose up -d --build - ``` - -## Linux - -1. Open the terminal - -2. Navigate to the `docker-compose.yaml` directory: - - ```bash - cd /path/to/docker-compose.yaml - ``` - -3. Stop and remove containers and images: - - ```bash - docker compose down --rmi all - ``` - -4. Edit `docker-compose.yaml`: - - ```bash - nano docker-compose.yaml - ``` - -5. Replace `127.0.0.1` with the server IP: - - ```bash - args: - - NEXT_PUBLIC_API_URL=http://127.0.0.1:3001/api - - NEXT_PUBLIC_WS_URL=ws://127.0.0.1:3001 - ``` - -6. Save and exit the editor - -7. Rebuild and restart Perplexica: - - ```bash - docker compose up -d --build - ``` diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index a4651df..972142f 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -39,11 +39,8 @@ To update Perplexica to the latest version, follow these steps: 2. Navigate to the project directory. 3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. - -4. Execute `npm i` in both the `ui` folder and the root directory. - -5. Once the packages are updated, execute `npm run build` in both the `ui` folder and the root directory. - -6. Finally, start both the frontend and the backend by running `npm run start` in both the `ui` folder and the root directory. +4. After populating the configuration run `npm i`. +5. Install the dependencies and then execute `npm run build`. +6. Finally, start the app by running `npm rum start` --- From 5c016127cb1567fe8bfa294c1568961b8e46bfd1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:41:07 +0530 Subject: [PATCH 044/147] feat(package): bump version --- docs/API/SEARCH.md | 4 ++-- docs/architecture/WORKING.md | 2 +- package.json | 2 +- src/lib/config.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 0169976..3007901 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -6,9 +6,9 @@ Perplexica’s Search API makes it easy to use our AI-powered search engine. You ## Endpoint -### **POST** `http://localhost:3001/api/search` +### **POST** `http://localhost:3000/api/search` -**Note**: Replace `3001` with any other port if you've changed the default PORT +**Note**: Replace `3000` with any other port if you've changed the default PORT ### Request diff --git a/docs/architecture/WORKING.md b/docs/architecture/WORKING.md index 75b20fd..6bad4f9 100644 --- a/docs/architecture/WORKING.md +++ b/docs/architecture/WORKING.md @@ -4,7 +4,7 @@ Curious about how Perplexica works? Don't worry, we'll cover it here. Before we We'll understand how Perplexica works by taking an example of a scenario where a user asks: "How does an A.C. work?". We'll break down the process into steps to make it easier to understand. The steps are as follows: -1. The message is sent via WS to the backend server where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode. +1. The message is sent to the `/api/chat` route where it invokes the chain. The chain will depend on your focus mode. For this example, let's assume we use the "webSearch" focus mode. 2. The chain is now invoked; first, the message is passed to another chain where it first predicts (using the chat history and the question) whether there is a need for sources and searching the web. If there is, it will generate a query (in accordance with the chat history) for searching the web that we'll take up later. If not, the chain will end there, and then the answer generator chain, also known as the response generator, will be started. 3. The query returned by the first chain is passed to SearXNG to search the web for information. 4. After the information is retrieved, it is based on keyword-based search. We then convert the information into embeddings and the query as well, then we perform a similarity search to find the most relevant sources to answer the query. diff --git a/package.json b/package.json index 904e0b2..e2cf944 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0-rc3", + "version": "1.10.0", "license": "MIT", "author": "ItzCrazyKns", "scripts": { diff --git a/src/lib/config.ts b/src/lib/config.ts index dac1ca5..ef99eed 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -59,7 +59,7 @@ export const getAnthropicApiKey = () => loadConfig().MODELS.ANTHROPIC.API_KEY; export const getGeminiApiKey = () => loadConfig().MODELS.GEMINI.API_KEY; export const getSearxngApiEndpoint = () => - loadConfig().API_ENDPOINTS.SEARXNG || process.env.SEARXNG_API_URL; + process.env.SEARXNG_API_URL || loadConfig().API_ENDPOINTS.SEARXNG; export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; From 62e6c24840106bfbe982f894da53707bc569ab2b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:47:54 +0530 Subject: [PATCH 045/147] feat(app): fix build errors --- app.dockerfile | 2 +- src/app/api/search/route.ts | 55 ++++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/app.dockerfile b/app.dockerfile index 2571305..57a270e 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -3,7 +3,7 @@ FROM node:20.18.0-alpine AS builder WORKDIR /home/perplexica COPY package.json yarn.lock ./ -RUN yarn install --frozen-lockfile +RUN yarn install --frozen-lockfile --network-timeout 600000 COPY tsconfig.json next.config.mjs next-env.d.ts postcss.config.js drizzle.config.ts tailwind.config.ts ./ COPY src ./src diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index a2c1bd0..b980623 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,35 +125,40 @@ export const POST = async (req: Request) => { [], ); - return new Promise((resolve, reject) => { - let message = ''; - let sources: any[] = []; + return new Promise( + ( + resolve: (value: Response) => void, + reject: (value: Response) => void, + ) => { + let message = ''; + let sources: any[] = []; - emitter.on('data', (data) => { - try { - const parsedData = JSON.parse(data); - if (parsedData.type === 'response') { - message += parsedData.data; - } else if (parsedData.type === 'sources') { - sources = parsedData.data; + emitter.on('data', (data) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); } - } catch (error) { + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error) => { reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), + Response.json({ message: 'Search error', error }, { status: 500 }), ); - } - }); - - emitter.on('end', () => { - resolve(Response.json({ message, sources }, { status: 200 })); - }); - - emitter.on('error', (error) => { - reject( - Response.json({ message: 'Search error', error }, { status: 500 }), - ); - }); - }); + }); + }, + ); } catch (err: any) { console.error(`Error in getting search results: ${err.message}`); return Response.json( From dddd944a18842cba33a1047b778a01d7870dabf1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:22:43 +0530 Subject: [PATCH 046/147] feat(workflow): update docker build --- .github/workflows/docker-build.yaml | 105 +++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 18 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index 0620afb..c5a4331 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -8,15 +8,12 @@ on: types: [published] jobs: - build-and-push: + build-amd64: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 with: @@ -33,28 +30,100 @@ jobs: id: version run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV - - name: Build and push Docker image + - name: Build and push AMD64 Docker image if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | - docker buildx create --use - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica; \ - docker buildx build --platform linux/amd64,linux/arm64 \ - --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:main \ + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/amd64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:amd64 \ --cache-to=type=inline \ -f $DOCKERFILE \ - -t itzcrazykns1337/${IMAGE_NAME}:main \ + -t itzcrazykns1337/${IMAGE_NAME}:amd64 \ --push . - - name: Build and push release Docker image + - name: Build and push AMD64 release Docker image if: github.event_name == 'release' run: | - docker buildx create --use - DOCKERFILE=app.dockerfile; \ - IMAGE_NAME=perplexica; \ - docker buildx build --platform linux/amd64,linux/arm64 \ - --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/amd64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --cache-to=type=inline \ -f $DOCKERFILE \ - -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --push . + + build-arm64: + runs-on: ubuntu-24.04-arm + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + with: + install: true + + - name: Log in to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract version from release tag + if: github.event_name == 'release' + id: version + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + + - name: Build and push ARM64 Docker image + if: github.ref == 'refs/heads/master' && github.event_name == 'push' + run: | + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:arm64 \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:arm64 \ + --push . + + - name: Build and push ARM64 release Docker image + if: github.event_name == 'release' + run: | + DOCKERFILE=app.dockerfile + IMAGE_NAME=perplexica + docker buildx build --platform linux/arm64 \ + --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ + --cache-to=type=inline \ + -f $DOCKERFILE \ + -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ + --push . + + manifest: + needs: [build-amd64, build-arm64] + runs-on: ubuntu-latest + steps: + - name: Log in to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Create and push multi-arch manifest for main + if: github.ref == 'refs/heads/master' && github.event_name == 'push' + run: | + IMAGE_NAME=perplexica + docker manifest create itzcrazykns1337/${IMAGE_NAME}:main \ + --amend itzcrazykns1337/${IMAGE_NAME}:amd64 \ + --amend itzcrazykns1337/${IMAGE_NAME}:arm64 + docker manifest push itzcrazykns1337/${IMAGE_NAME}:main + + - name: Create and push multi-arch manifest for releases + if: github.event_name == 'release' + run: | + IMAGE_NAME=perplexica + docker manifest create itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} \ + --amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ + --amend itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 + docker manifest push itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }} From 74f7eaed6e7c87864307fd1e3c2f944b3f288e49 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:43:29 +0530 Subject: [PATCH 047/147] feat(workflow): fix build errors --- .github/workflows/docker-build.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index c5a4331..ea956ea 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -38,6 +38,7 @@ jobs: docker buildx build --platform linux/amd64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:amd64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:amd64 \ --push . @@ -50,6 +51,7 @@ jobs: docker buildx build --platform linux/amd64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-amd64 \ --push . @@ -84,6 +86,7 @@ jobs: docker buildx build --platform linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:arm64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:arm64 \ --push . @@ -96,6 +99,7 @@ jobs: docker buildx build --platform linux/arm64 \ --cache-from=type=registry,ref=itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ --cache-to=type=inline \ + --provenance false \ -f $DOCKERFILE \ -t itzcrazykns1337/${IMAGE_NAME}:${{ env.RELEASE_VERSION }}-arm64 \ --push . From 06db95d7c0530c5650d9e50ba7023191b9f1d2e9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:25:28 +0530 Subject: [PATCH 048/147] feat(dockerfile): fix onnx issues --- app.dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app.dockerfile b/app.dockerfile index 57a270e..3433288 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -1,4 +1,4 @@ -FROM node:20.18.0-alpine AS builder +FROM node:20.18.0-slim AS builder WORKDIR /home/perplexica @@ -12,7 +12,7 @@ COPY public ./public RUN mkdir -p /home/perplexica/data RUN yarn build -FROM node:20.18.0-alpine +FROM node:20.18.0-slim WORKDIR /home/perplexica From 45df9dc5bfe52ef06cf9918e234c5f47eb4d39b1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:27:12 +0530 Subject: [PATCH 049/147] feat(readme): update networking guide --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6540c73..e01f109 100644 --- a/README.md +++ b/README.md @@ -153,7 +153,7 @@ For more details, check out the full documentation [here](https://github.com/Itz ## Expose Perplexica to network -You can access Perplexica over your home network by following our networking guide [here](https://github.com/ItzCrazyKns/Perplexica/blob/master/docs/installation/NETWORKING.md). +Perplexica runs on Next.js and handles all API requests. It works right away on the same network and stays accessible even with port forwarding. ## One-Click Deployment From defc67793235ea79660922e99bd9e3fd022ddeab Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 25 Mar 2025 22:01:24 +0530 Subject: [PATCH 050/147] feat(providers): update gemini & anthropic provider --- package.json | 2 ++ src/lib/providers/anthropic.ts | 9 ++---- src/lib/providers/gemini.ts | 19 +++++------- yarn.lock | 53 ++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index e2cf944..8ab1823 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,10 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", "@langchain/community": "^0.3.36", "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", "@langchain/openai": "^0.0.25", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index e44d70d..7ecde4b 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,4 +1,4 @@ -import { ChatOpenAI } from '@langchain/openai'; +import { ChatAnthropic } from '@langchain/anthropic'; import { ChatModel } from '.'; import { getAnthropicApiKey } from '../config'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -45,13 +45,10 @@ export const loadAnthropicChatModels = async () => { anthropicChatModels.forEach((model) => { chatModels[model.key] = { displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: anthropicApiKey, + model: new ChatAnthropic({ + apiKey: anthropicApiKey, modelName: model.key, temperature: 0.7, - configuration: { - baseURL: 'https://api.anthropic.com/v1/', - }, }) as unknown as BaseChatModel, }; }); diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6806fb6..f355d08 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -1,4 +1,7 @@ -import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { + ChatGoogleGenerativeAI, + GoogleGenerativeAIEmbeddings, +} from '@langchain/google-genai'; import { getGeminiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; @@ -49,13 +52,10 @@ export const loadGeminiChatModels = async () => { geminiChatModels.forEach((model) => { chatModels[model.key] = { displayName: model.displayName, - model: new ChatOpenAI({ - openAIApiKey: geminiApiKey, + model: new ChatGoogleGenerativeAI({ + apiKey: geminiApiKey, modelName: model.key, temperature: 0.7, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, }) as unknown as BaseChatModel, }; }); @@ -78,12 +78,9 @@ export const loadGeminiEmbeddingModels = async () => { geminiEmbeddingModels.forEach((model) => { embeddingModels[model.key] = { displayName: model.displayName, - model: new OpenAIEmbeddings({ - openAIApiKey: geminiApiKey, + model: new GoogleGenerativeAIEmbeddings({ + apiKey: geminiApiKey, modelName: model.key, - configuration: { - baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', - }, }) as unknown as Embeddings, }; }); diff --git a/yarn.lock b/yarn.lock index a405105..921186b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,6 +12,19 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@anthropic-ai/sdk@^0.37.0": + version "0.37.0" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.37.0.tgz#0018127404ecb9b8a12968068e0c4b3e8bbd6386" + integrity sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + "@anthropic-ai/sdk@^0.9.1": version "0.9.1" resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" @@ -374,6 +387,11 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.8.tgz#21a907684723bbbaa5f0974cf7730bd797eb8e62" integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== +"@google/generative-ai@^0.24.0": + version "0.24.0" + resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.0.tgz#4d27af7d944c924a27a593c17ad1336535d53846" + integrity sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q== + "@headlessui/react@^2.2.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@headlessui/react/-/react-2.2.0.tgz#a8e32f0899862849a1ce1615fa280e7891431ab7" @@ -575,6 +593,16 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@langchain/anthropic@^0.3.15": + version "0.3.15" + resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.15.tgz#0244cdb345cb492eb40aedd681881ebadfbb73f2" + integrity sha512-Ar2viYcZ64idgV7EtCBCb36tIkNtPAhQRxSaMTWPHGspFgMfvwRoleVri9e90sCpjpS9xhlHsIQ0LlUS/Atsrw== + dependencies: + "@anthropic-ai/sdk" "^0.37.0" + fast-xml-parser "^4.4.1" + zod "^3.22.4" + zod-to-json-schema "^3.22.4" + "@langchain/community@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" @@ -640,6 +668,14 @@ zod "^3.22.4" zod-to-json-schema "^3.22.3" +"@langchain/google-genai@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.1.12.tgz#6727253bda6f0d87cd74cf0bb6b1e0f398f60f32" + integrity sha512-0Ea0E2g63ejCuormVxbuoyJQ5BYN53i2/fb6WP8bMKzyh+y43R13V8JqOtr3e/GmgNyv3ou/VeaZjx7KAvu/0g== + dependencies: + "@google/generative-ai" "^0.24.0" + zod-to-json-schema "^3.22.4" + "@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": version "0.4.5" resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" @@ -2369,6 +2405,13 @@ fast-levenshtein@^2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== +fast-xml-parser@^4.4.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz#c54d6b35aa0f23dc1ea60b6c884340c006dc6efb" + integrity sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig== + dependencies: + strnum "^1.1.1" + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -4458,6 +4501,11 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strnum@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.1.2.tgz#57bca4fbaa6f271081715dbc9ed7cee5493e28e4" + integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== + styled-jsx@5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" @@ -4955,6 +5003,11 @@ zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== +zod-to-json-schema@^3.22.4: + version "3.24.5" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" + integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== + zod@^3.22.3, zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" From 27286465a36633f9f70012c8e2fb1fe617fe890c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 26 Mar 2025 13:34:09 +0530 Subject: [PATCH 051/147] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ab1823..52ba392 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.0", + "version": "1.10.1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From d3b2f8983dc12ec908f787438e922835dc23c696 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:28:05 +0100 Subject: [PATCH 052/147] feat(api): add streaming support to search route --- src/app/api/search/route.ts | 122 +++++++++++++++++++++++++++++++----- 1 file changed, 105 insertions(+), 17 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index b980623..e136d54 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -33,6 +33,7 @@ interface ChatRequestBody { embeddingModel?: embeddingModel; query: string; history: Array<[string, string]>; + stream?: boolean; } export const POST = async (req: Request) => { @@ -48,6 +49,7 @@ export const POST = async (req: Request) => { body.history = body.history || []; body.optimizationMode = body.optimizationMode || 'balanced'; + body.stream = body.stream || false; const history: BaseMessage[] = body.history.map((msg) => { return msg[0] === 'human' @@ -125,40 +127,126 @@ export const POST = async (req: Request) => { [], ); - return new Promise( - ( - resolve: (value: Response) => void, - reject: (value: Response) => void, - ) => { - let message = ''; + if (!body.stream) { + return new Promise( + ( + resolve: (value: Response) => void, + reject: (value: Response) => void, + ) => { + let message = ''; + let sources: any[] = []; + + emitter.on('data', (data: string) => { + try { + const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { + message += parsedData.data; + } else if (parsedData.type === 'sources') { + sources = parsedData.data; + } + } catch (error) { + reject( + Response.json({ message: 'Error parsing data' }, { status: 500 }), + ); + } + }); + + emitter.on('end', () => { + resolve(Response.json({ message, sources }, { status: 200 })); + }); + + emitter.on('error', (error: any) => { + reject( + Response.json({ message: 'Search error', error }, { status: 500 }), + ); + }); + }, + ); + } + + const encoder = new TextEncoder(); + + // Create an AbortController to handle cancellation + const abortController = new AbortController(); + const { signal } = abortController; + + const stream = new ReadableStream({ + start(controller) { let sources: any[] = []; - emitter.on('data', (data) => { + // Send an initial message to keep the connection alive + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'init', + data: 'Stream connected' + }) + "\n\n")); + + // Set up cleanup function for when client disconnects + signal.addEventListener('abort', () => { + // Remove all listeners from emitter to prevent memory leaks + emitter.removeAllListeners(); + + // Close the controller if it's still active + try { + controller.close(); + } catch (error) { + // Controller might already be closed + } + }); + + emitter.on('data', (data: string) => { + // Check if request has been cancelled before processing + if (signal.aborted) return; + try { const parsedData = JSON.parse(data); + if (parsedData.type === 'response') { - message += parsedData.data; + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'response', + data: parsedData.data + }) + "\n\n")); } else if (parsedData.type === 'sources') { sources = parsedData.data; + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'sources', + data: sources + }) + "\n\n")); } } catch (error) { - reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), - ); + controller.error(error); } }); emitter.on('end', () => { - resolve(Response.json({ message, sources }, { status: 200 })); + // Check if request has been cancelled before processing + if (signal.aborted) return; + + controller.enqueue(encoder.encode("data: " + JSON.stringify({ + type: 'done' + }) + "\n\n")); + controller.close(); }); - emitter.on('error', (error) => { - reject( - Response.json({ message: 'Search error', error }, { status: 500 }), - ); + emitter.on('error', (error: any) => { + // Check if request has been cancelled before processing + if (signal.aborted) return; + + controller.error(error); }); }, - ); + + cancel() { + abortController.abort(); + } + }); + + return new Response(stream, { + headers: { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache, no-transform', + 'Connection': 'keep-alive', + }, + }); } catch (err: any) { console.error(`Error in getting search results: ${err.message}`); return Response.json( From 191d1dc25f0936d9e9c5233b07bc59525caa32d7 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Wed, 26 Mar 2025 11:32:46 +0100 Subject: [PATCH 053/147] refactor(api): clean up comments and improve abort handling in search route --- src/app/api/search/route.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index e136d54..24990ad 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -166,7 +166,6 @@ export const POST = async (req: Request) => { const encoder = new TextEncoder(); - // Create an AbortController to handle cancellation const abortController = new AbortController(); const { signal } = abortController; @@ -174,27 +173,21 @@ export const POST = async (req: Request) => { start(controller) { let sources: any[] = []; - // Send an initial message to keep the connection alive controller.enqueue(encoder.encode("data: " + JSON.stringify({ type: 'init', data: 'Stream connected' }) + "\n\n")); - // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { - // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); - // Close the controller if it's still active try { controller.close(); } catch (error) { - // Controller might already be closed } }); emitter.on('data', (data: string) => { - // Check if request has been cancelled before processing if (signal.aborted) return; try { @@ -218,7 +211,6 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { - // Check if request has been cancelled before processing if (signal.aborted) return; controller.enqueue(encoder.encode("data: " + JSON.stringify({ @@ -228,7 +220,6 @@ export const POST = async (req: Request) => { }); emitter.on('error', (error: any) => { - // Check if request has been cancelled before processing if (signal.aborted) return; controller.error(error); From 310c8a75fd7fbf0a3867f2985ee4e61cefc2997f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 27 Mar 2025 11:36:58 +0530 Subject: [PATCH 054/147] feat(routes): fix typo, closes #692 --- src/app/api/chat/route.ts | 4 ++-- src/app/api/config/route.ts | 8 ++++---- src/app/api/discover/route.ts | 2 +- src/app/api/images/route.ts | 4 ++-- src/app/api/models/route.ts | 2 +- src/app/api/suggestions/route.ts | 4 ++-- src/app/api/videos/route.ts | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index d9f9c6b..d48fbb6 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -295,9 +295,9 @@ export const POST = async (req: Request) => { }, }); } catch (err) { - console.error('An error ocurred while processing chat request:', err); + console.error('An error occurred while processing chat request:', err); return Response.json( - { message: 'An error ocurred while processing chat request' }, + { message: 'An error occurred while processing chat request' }, { status: 500 }, ); } diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 46c71f5..871bb21 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -59,9 +59,9 @@ export const GET = async (req: Request) => { return Response.json({ ...config }, { status: 200 }); } catch (err) { - console.error('An error ocurred while getting config:', err); + console.error('An error occurred while getting config:', err); return Response.json( - { message: 'An error ocurred while getting config' }, + { message: 'An error occurred while getting config' }, { status: 500 }, ); } @@ -100,9 +100,9 @@ export const POST = async (req: Request) => { return Response.json({ message: 'Config updated' }, { status: 200 }); } catch (err) { - console.error('An error ocurred while updating config:', err); + console.error('An error occurred while updating config:', err); return Response.json( - { message: 'An error ocurred while updating config' }, + { message: 'An error occurred while updating config' }, { status: 500 }, ); } diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 0c95498..8c1f470 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -48,7 +48,7 @@ export const GET = async (req: Request) => { }, ); } catch (err) { - console.error(`An error ocurred in discover route: ${err}`); + console.error(`An error occurred in discover route: ${err}`); return Response.json( { message: 'An error has occurred', diff --git a/src/app/api/images/route.ts b/src/app/api/images/route.ts index f0a6773..db39d9f 100644 --- a/src/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -74,9 +74,9 @@ export const POST = async (req: Request) => { return Response.json({ images }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while searching images: ${err}`); + console.error(`An error occurred while searching images: ${err}`); return Response.json( - { message: 'An error ocurred while searching images' }, + { message: 'An error occurred while searching images' }, { status: 500 }, ); } diff --git a/src/app/api/models/route.ts b/src/app/api/models/route.ts index a5e5b43..04a6949 100644 --- a/src/app/api/models/route.ts +++ b/src/app/api/models/route.ts @@ -34,7 +34,7 @@ export const GET = async (req: Request) => { }, ); } catch (err) { - console.error('An error ocurred while fetching models', err); + console.error('An error occurred while fetching models', err); return Response.json( { message: 'An error has occurred.', diff --git a/src/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts index 4a931df..e92e5ec 100644 --- a/src/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -72,9 +72,9 @@ export const POST = async (req: Request) => { return Response.json({ suggestions }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while generating suggestions: ${err}`); + console.error(`An error occurred while generating suggestions: ${err}`); return Response.json( - { message: 'An error ocurred while generating suggestions' }, + { message: 'An error occurred while generating suggestions' }, { status: 500 }, ); } diff --git a/src/app/api/videos/route.ts b/src/app/api/videos/route.ts index 6153490..34ae7fd 100644 --- a/src/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -74,9 +74,9 @@ export const POST = async (req: Request) => { return Response.json({ videos }, { status: 200 }); } catch (err) { - console.error(`An error ocurred while searching videos: ${err}`); + console.error(`An error occurred while searching videos: ${err}`); return Response.json( - { message: 'An error ocurred while searching videos' }, + { message: 'An error occurred while searching videos' }, { status: 500 }, ); } From 5d60ab113942c307e20bb105ca18063dc0784b99 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Thu, 27 Mar 2025 13:04:09 +0100 Subject: [PATCH 055/147] feat(api): Switch to newline-delimited JSON streaming instead of SSE --- docs/API/SEARCH.md | 29 +++++++++++++++++++++++++++-- src/app/api/search/route.ts | 28 ++++++++++++++++++---------- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 3007901..3a28a78 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -32,7 +32,8 @@ The API accepts a JSON object in the request body, where you define the focus mo "history": [ ["human", "Hi, how are you?"], ["assistant", "I am doing well, how can I help you today?"] - ] + ], + "stream": false } ``` @@ -71,11 +72,13 @@ The API accepts a JSON object in the request body, where you define the focus mo ] ``` +- **`stream`** (boolean, optional): When set to `true`, enables streaming responses. Default is `false`. + ### Response The response from the API includes both the final message and the sources used to generate that message. -#### Example Response +#### Standard Response (stream: false) ```json { @@ -100,6 +103,28 @@ The response from the API includes both the final message and the sources used t } ``` +#### Streaming Response (stream: true) + +When streaming is enabled, the API returns a stream of newline-delimited JSON objects. Each line contains a complete, valid JSON object. The response has Content-Type: application/json. + +Example of streamed response objects: + +``` +{"type":"init","data":"Stream connected"} +{"type":"sources","data":[{"pageContent":"...","metadata":{"title":"...","url":"..."}},...]} +{"type":"response","data":"Perplexica is an "} +{"type":"response","data":"innovative, open-source "} +{"type":"response","data":"AI-powered search engine..."} +{"type":"done"} +``` + +Clients should process each line as a separate JSON object. The different message types include: + +- **`init`**: Initial connection message +- **`sources`**: All sources used for the response +- **`response`**: Chunks of the generated answer text +- **`done`**: Indicates the stream is complete + ### Fields in the Response - **`message`** (string): The search result, generated based on the query and focus mode. diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 24990ad..b2be3f9 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -166,6 +166,7 @@ export const POST = async (req: Request) => { const encoder = new TextEncoder(); + // Create an AbortController to handle cancellation const abortController = new AbortController(); const { signal } = abortController; @@ -173,37 +174,43 @@ export const POST = async (req: Request) => { start(controller) { let sources: any[] = []; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + // Send an initial message to keep the connection alive + controller.enqueue(encoder.encode(JSON.stringify({ type: 'init', data: 'Stream connected' - }) + "\n\n")); + }) + '\n')); + // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { + // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); + // Close the controller if it's still active try { controller.close(); } catch (error) { + // Controller might already be closed } }); emitter.on('data', (data: string) => { + // Check if request has been cancelled before processing if (signal.aborted) return; try { const parsedData = JSON.parse(data); if (parsedData.type === 'response') { - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'response', data: parsedData.data - }) + "\n\n")); + }) + '\n')); } else if (parsedData.type === 'sources') { sources = parsedData.data; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'sources', data: sources - }) + "\n\n")); + }) + '\n')); } } catch (error) { controller.error(error); @@ -211,21 +218,22 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { + // Check if request has been cancelled before processing if (signal.aborted) return; - controller.enqueue(encoder.encode("data: " + JSON.stringify({ + controller.enqueue(encoder.encode(JSON.stringify({ type: 'done' - }) + "\n\n")); + }) + '\n')); controller.close(); }); emitter.on('error', (error: any) => { + // Check if request has been cancelled before processing if (signal.aborted) return; controller.error(error); }); }, - cancel() { abortController.abort(); } @@ -233,7 +241,7 @@ export const POST = async (req: Request) => { return new Response(stream, { headers: { - 'Content-Type': 'text/event-stream', + 'Content-Type': 'application/json', 'Cache-Control': 'no-cache, no-transform', 'Connection': 'keep-alive', }, From b285cb432335f9c17233713c3379724cc6f642f9 Mon Sep 17 00:00:00 2001 From: ottsch <397865+ottsch@users.noreply.github.com> Date: Fri, 28 Mar 2025 17:07:11 +0100 Subject: [PATCH 056/147] Update Gemini chat models --- src/lib/providers/gemini.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index f355d08..b0fa887 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -8,6 +8,10 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.5 Pro Experimental', + key: 'gemini-2.5-pro-exp-03-25', + }, { displayName: 'Gemini 2.0 Flash', key: 'gemini-2.0-flash', @@ -17,8 +21,8 @@ const geminiChatModels: Record<string, string>[] = [ key: 'gemini-2.0-flash-lite', }, { - displayName: 'Gemini 2.0 Pro Experimental', - key: 'gemini-2.0-pro-exp-02-05', + displayName: 'Gemini 2.0 Flash Thinking Experimental', + key: 'gemini-2.0-flash-thinking-exp-01-21', }, { displayName: 'Gemini 1.5 Flash', From 90e303f737e9c9efe494fd141f951ed2b94d1b7d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 30 Mar 2025 21:12:04 +0530 Subject: [PATCH 057/147] feat(search): lint & beautify, update content type --- src/app/api/search/route.ts | 88 +++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index b2be3f9..d3e98ca 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -146,7 +146,10 @@ export const POST = async (req: Request) => { } } catch (error) { reject( - Response.json({ message: 'Error parsing data' }, { status: 500 }), + Response.json( + { message: 'Error parsing data' }, + { status: 500 }, + ), ); } }); @@ -157,7 +160,10 @@ export const POST = async (req: Request) => { emitter.on('error', (error: any) => { reject( - Response.json({ message: 'Search error', error }, { status: 500 }), + Response.json( + { message: 'Search error', error }, + { status: 500 }, + ), ); }); }, @@ -165,52 +171,56 @@ export const POST = async (req: Request) => { } const encoder = new TextEncoder(); - - // Create an AbortController to handle cancellation + const abortController = new AbortController(); const { signal } = abortController; - + const stream = new ReadableStream({ start(controller) { let sources: any[] = []; - // Send an initial message to keep the connection alive - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'init', - data: 'Stream connected' - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'init', + data: 'Stream connected', + }) + '\n', + ), + ); - // Set up cleanup function for when client disconnects signal.addEventListener('abort', () => { - // Remove all listeners from emitter to prevent memory leaks emitter.removeAllListeners(); - - // Close the controller if it's still active + try { controller.close(); - } catch (error) { - // Controller might already be closed - } + } catch (error) {} }); emitter.on('data', (data: string) => { - // Check if request has been cancelled before processing if (signal.aborted) return; - + try { const parsedData = JSON.parse(data); - + if (parsedData.type === 'response') { - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'response', - data: parsedData.data - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'response', + data: parsedData.data, + }) + '\n', + ), + ); } else if (parsedData.type === 'sources') { sources = parsedData.data; - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'sources', - data: sources - }) + '\n')); + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'sources', + data: sources, + }) + '\n', + ), + ); } } catch (error) { controller.error(error); @@ -218,32 +228,34 @@ export const POST = async (req: Request) => { }); emitter.on('end', () => { - // Check if request has been cancelled before processing if (signal.aborted) return; - - controller.enqueue(encoder.encode(JSON.stringify({ - type: 'done' - }) + '\n')); + + controller.enqueue( + encoder.encode( + JSON.stringify({ + type: 'done', + }) + '\n', + ), + ); controller.close(); }); emitter.on('error', (error: any) => { - // Check if request has been cancelled before processing if (signal.aborted) return; - + controller.error(error); }); }, cancel() { abortController.abort(); - } + }, }); return new Response(stream, { headers: { - 'Content-Type': 'application/json', + 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-transform', - 'Connection': 'keep-alive', + Connection: 'keep-alive', }, }); } catch (err: any) { From 4b2a7916fde21c8d83e056f614fa995044b96f3d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 30 Mar 2025 22:51:59 +0530 Subject: [PATCH 058/147] feat(docker-build): fix image tag errors --- .github/workflows/docker-build.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index ea956ea..29f7987 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -114,6 +114,11 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} + - name: Extract version from release tag + if: github.event_name == 'release' + id: version + run: echo "RELEASE_VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + - name: Create and push multi-arch manifest for main if: github.ref == 'refs/heads/master' && github.event_name == 'push' run: | From 5b1055e8c9656dd988c52368df7e27e64de39fde Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:49:36 +0530 Subject: [PATCH 059/147] feat(routes): add system instructions --- src/app/api/chat/route.ts | 2 ++ src/app/api/search/route.ts | 1 + src/lib/prompts/academicSearch.ts | 4 ++++ src/lib/prompts/redditSearch.ts | 4 ++++ src/lib/prompts/webSearch.ts | 4 ++++ src/lib/prompts/wolframAlpha.ts | 4 ++++ src/lib/prompts/writingAssistant.ts | 4 ++++ src/lib/prompts/youtubeSearch.ts | 4 ++++ src/lib/search/metaSearchAgent.ts | 5 +++++ 9 files changed, 32 insertions(+) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index d48fbb6..e566edb 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -49,6 +49,7 @@ type Body = { files: Array<string>; chatModel: ChatModel; embeddingModel: EmbeddingModel; + systemInstructions: string; }; const handleEmitterEvents = async ( @@ -278,6 +279,7 @@ export const POST = async (req: Request) => { embedding, body.optimizationMode, body.files, + body.systemInstructions, ); const responseStream = new TransformStream(); diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index d3e98ca..59d84ff 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,6 +125,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], + "", ); if (!body.stream) { diff --git a/src/lib/prompts/academicSearch.ts b/src/lib/prompts/academicSearch.ts index c2946ff..d015910 100644 --- a/src/lib/prompts/academicSearch.ts +++ b/src/lib/prompts/academicSearch.ts @@ -51,6 +51,10 @@ export const academicSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Academic', this means you will be searching for academic papers and articles on the web. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/redditSearch.ts b/src/lib/prompts/redditSearch.ts index fc71957..577fa82 100644 --- a/src/lib/prompts/redditSearch.ts +++ b/src/lib/prompts/redditSearch.ts @@ -51,6 +51,10 @@ export const redditSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Reddit', this means you will be searching for information, opinions and discussions on the web using Reddit. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts index d8269c8..c1b458b 100644 --- a/src/lib/prompts/webSearch.ts +++ b/src/lib/prompts/webSearch.ts @@ -92,6 +92,10 @@ export const webSearchResponsePrompt = ` - If the user provides vague input or if relevant information is missing, explain what additional details might help refine the search. - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/wolframAlpha.ts b/src/lib/prompts/wolframAlpha.ts index 40410c1..63145dd 100644 --- a/src/lib/prompts/wolframAlpha.ts +++ b/src/lib/prompts/wolframAlpha.ts @@ -51,6 +51,10 @@ export const wolframAlphaSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Wolfram Alpha', this means you will be searching for information on the web using Wolfram Alpha. It is a computational knowledge engine that can answer factual queries and perform computations. + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/prompts/writingAssistant.ts b/src/lib/prompts/writingAssistant.ts index f56bf47..565827a 100644 --- a/src/lib/prompts/writingAssistant.ts +++ b/src/lib/prompts/writingAssistant.ts @@ -7,6 +7,10 @@ You have to cite the answer using [number] notation. You must cite the sentences Place these citations at the end of that particular sentence. You can cite the same sentence multiple times if it is relevant to the user's query like [number1][number2]. However you do not need to cite it using the same number. You can use different numbers to cite the same sentence multiple times. The number refers to the number of the search result (passed in the context) used to generate that part of the answer. +### User instructions +These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. +{systemInstructions} + <context> {context} </context> diff --git a/src/lib/prompts/youtubeSearch.ts b/src/lib/prompts/youtubeSearch.ts index 5805b54..9898016 100644 --- a/src/lib/prompts/youtubeSearch.ts +++ b/src/lib/prompts/youtubeSearch.ts @@ -51,6 +51,10 @@ export const youtubeSearchResponsePrompt = ` - If no relevant information is found, say: "Hmm, sorry I could not find any relevant information on this topic. Would you like me to search again or ask something else?" Be transparent about limitations and suggest alternatives or ways to reframe the query. - You are set on focus mode 'Youtube', this means you will be searching for videos on the web using Youtube and providing information based on the video's transcrip + ### User instructions + These instructions are shared to you by the user and not by the system. You will have to follow them but give them less priority than the above instructions. If the user has provided specific instructions or preferences, incorporate them into your response while adhering to the overall guidelines. + {systemInstructions} + ### Example Output - Begin with a brief introduction summarizing the event or query topic. - Follow with detailed sections under clear headings, covering all aspects of the query if possible. diff --git a/src/lib/search/metaSearchAgent.ts b/src/lib/search/metaSearchAgent.ts index 4a3d817..67b7c58 100644 --- a/src/lib/search/metaSearchAgent.ts +++ b/src/lib/search/metaSearchAgent.ts @@ -33,6 +33,7 @@ export interface MetaSearchAgentType { embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', fileIds: string[], + systemInstructions: string, ) => Promise<eventEmitter>; } @@ -236,9 +237,11 @@ class MetaSearchAgent implements MetaSearchAgentType { fileIds: string[], embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', + systemInstructions: string, ) { return RunnableSequence.from([ RunnableMap.from({ + systemInstructions: () => systemInstructions, query: (input: BasicChainInput) => input.query, chat_history: (input: BasicChainInput) => input.chat_history, date: () => new Date().toISOString(), @@ -468,6 +471,7 @@ class MetaSearchAgent implements MetaSearchAgentType { embeddings: Embeddings, optimizationMode: 'speed' | 'balanced' | 'quality', fileIds: string[], + systemInstructions: string, ) { const emitter = new eventEmitter(); @@ -476,6 +480,7 @@ class MetaSearchAgent implements MetaSearchAgentType { fileIds, embeddings, optimizationMode, + systemInstructions, ); const stream = answeringChain.streamEvents( From 4b8e0ea1aa221b9b8018daf1b650e54c92adb2ce Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:50:05 +0530 Subject: [PATCH 060/147] feat(chat-window): handle system instructions --- src/components/ChatWindow.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 0c956e8..93c8a0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -480,6 +480,7 @@ const ChatWindow = ({ id }: { id?: string }) => { name: embeddingModelProvider.name, provider: embeddingModelProvider.provider, }, + systemInstructions: localStorage.getItem('systemInstructions'), }), }); From 7d52fbb368db416639fc3a70952207cc7f1bab1b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:50:24 +0530 Subject: [PATCH 061/147] feat(settings): add system instructions --- src/app/settings/page.tsx | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index efe54d5..8e1c45a 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -54,6 +54,38 @@ const Input = ({ className, isSaving, onSave, ...restProps }: InputProps) => { ); }; +interface TextareaProps extends React.InputHTMLAttributes<HTMLTextAreaElement> { + isSaving?: boolean; + onSave?: (value: string) => void; +} + +const Textarea = ({ + className, + isSaving, + onSave, + ...restProps +}: TextareaProps) => { + return ( + <div className="relative"> + <textarea + placeholder="Any special instructions for the LLM" + className="placeholder:text-sm text-sm w-full flex items-center justify-between p-3 bg-light-secondary dark:bg-dark-secondary rounded-lg hover:bg-light-200 dark:hover:bg-dark-200 transition-colors" + rows={4} + onBlur={(e) => onSave?.(e.target.value)} + {...restProps} + /> + {isSaving && ( + <div className="absolute right-3 top-3"> + <Loader2 + size={16} + className="animate-spin text-black/70 dark:text-white/70" + /> + </div> + )} + </div> + ); +}; + const Select = ({ className, options, @@ -111,6 +143,7 @@ const Page = () => { const [isLoading, setIsLoading] = useState(false); const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); + const [systemInstructions, setSystemInstructions] = useState<string>(''); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -172,6 +205,8 @@ const Page = () => { localStorage.getItem('autoVideoSearch') === 'true', ); + setSystemInstructions(localStorage.getItem('systemInstructions')!); + setIsLoading(false); }; @@ -328,6 +363,8 @@ const Page = () => { localStorage.setItem('embeddingModelProvider', value); } else if (key === 'embeddingModel') { localStorage.setItem('embeddingModel', value); + } else if (key === 'systemInstructions') { + localStorage.setItem('systemInstructions', value); } } catch (err) { console.error('Failed to save:', err); @@ -473,6 +510,19 @@ const Page = () => { </div> </SettingsSection> + <SettingsSection title="System Instructions"> + <div className="flex flex-col space-y-4"> + <Textarea + value={systemInstructions} + isSaving={savingStates['systemInstructions']} + onChange={(e) => { + setSystemInstructions(e.target.value); + }} + onSave={(value) => saveConfig('systemInstructions', value)} + /> + </div> + </SettingsSection> + <SettingsSection title="Model Settings"> {config.chatModelProviders && ( <div className="flex flex-col space-y-4"> From 09661ae11d485b8e66a8916bcd943d5c613b4543 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 2 Apr 2025 13:02:28 +0530 Subject: [PATCH 062/147] feat(prompts): fix typo, closes #715 --- src/app/api/search/route.ts | 2 +- src/lib/prompts/webSearch.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 59d84ff..563cebe 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -125,7 +125,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], - "", + '', ); if (!body.stream) { diff --git a/src/lib/prompts/webSearch.ts b/src/lib/prompts/webSearch.ts index c1b458b..1a431ea 100644 --- a/src/lib/prompts/webSearch.ts +++ b/src/lib/prompts/webSearch.ts @@ -1,6 +1,6 @@ export const webSearchRetrieverPrompt = ` You are an AI question rephraser. You will be given a conversation and a follow-up question, you will have to rephrase the follow up question so it is a standalone question and can be used by another LLM to search the web for information to answer it. -If it is a smple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). +If it is a simple writing task or a greeting (unless the greeting contains a question after it) like Hi, Hello, How are you, etc. than a question then you need to return \`not_needed\` as the response (This is because the LLM won't need to search the web for finding information on this topic). If the user asks some question from some URL or wants you to summarize a PDF or a webpage (via URL) you need to return the links inside the \`links\` XML block and the question inside the \`question\` XML block. If the user wants to you to summarize the webpage or the PDF you need to return \`summarize\` inside the \`question\` XML block in place of a question and the link to summarize in the \`links\` XML block. You must always return the rephrased question inside the \`question\` XML block, if there are no links in the follow-up question then don't insert a \`links\` XML block in your response. From 2e4433a6b3b82cc1944483325589a4c221a2f30c Mon Sep 17 00:00:00 2001 From: singleparadox <glennmatthew_perez@hotmail.com> Date: Sat, 5 Apr 2025 15:24:45 +0000 Subject: [PATCH 063/147] feat(message-box): support [1,2,3,4] citation format instead of just [1][2][3] --- src/components/MessageBox.tsx | 46 ++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 4473c3b..2b2144a 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -48,6 +48,7 @@ const MessageBox = ({ const [speechMessage, setSpeechMessage] = useState(message.content); useEffect(() => { + const citationRegex = /\[([^\]]+)\]/g; const regex = /\[(\d+)\]/g; let processedMessage = message.content; @@ -67,12 +68,45 @@ const MessageBox = ({ ) { setParsedMessage( processedMessage.replace( - regex, - (_, number) => - `<a href="${ - message.sources?.[number - 1]?.metadata?.url - }" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${number}</a>`, - ), + citationRegex, // Use the updated regex + (match, capturedContent) => { // match is the full "[1,2,3]", capturedContent is "1,2,3" + // Split the captured content by comma, trim whitespace, and filter out non-digits + const numbers = capturedContent + .split(',') + .map(numStr => numStr.trim()) + .filter(numStr => /^\d+$/.test(numStr)); // Ensure it's only digits + + // If no valid numbers found after split/filter (e.g., "[]" or "[abc]"), return original match + if (numbers.length === 0) { + return match; + } + + // Generate an HTML link for each valid number found + const linksHtml = numbers.map(numStr => { + const number = parseInt(numStr, 10); // Convert string to integer for array indexing + + // Basic validation: Ensure it's a positive number + if (isNaN(number) || number <= 0) { + // Return the original number part as text if invalid for lookup + return `[${numStr}]`; + } + + // Get the corresponding source, adjusting for 0-based index + const source = message.sources?.[number - 1]; + const url = source?.metadata?.url; + + // If URL exists, create the link + if (url) { + return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; + } else { + // If no URL found for this number, return the number styled similarly but red + return `<span className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 text-xs relative font-medium text-red-600 dark:text-red-400">${numStr}</span>`; + } + }).join(''); // Join the generated links (or fallback text) together without separators + + return linksHtml; + } + ) ); return; } From bf705afc216bb7e0193b1771c0f5527c969fad37 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 5 Apr 2025 22:32:56 +0530 Subject: [PATCH 064/147] feat(message-box): change styles, lint & beautify --- src/components/MessageBox.tsx | 51 ++++++++++++++--------------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 2b2144a..4617103 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -68,45 +68,34 @@ const MessageBox = ({ ) { setParsedMessage( processedMessage.replace( - citationRegex, // Use the updated regex - (match, capturedContent) => { // match is the full "[1,2,3]", capturedContent is "1,2,3" - // Split the captured content by comma, trim whitespace, and filter out non-digits + citationRegex, + (_, capturedContent: string) => { const numbers = capturedContent .split(',') - .map(numStr => numStr.trim()) - .filter(numStr => /^\d+$/.test(numStr)); // Ensure it's only digits + .map((numStr) => numStr.trim()) - // If no valid numbers found after split/filter (e.g., "[]" or "[abc]"), return original match - if (numbers.length === 0) { - return match; - } + const linksHtml = numbers + .map((numStr) => { + const number = parseInt(numStr); - // Generate an HTML link for each valid number found - const linksHtml = numbers.map(numStr => { - const number = parseInt(numStr, 10); // Convert string to integer for array indexing + if (isNaN(number) || number <= 0) { + return `[${numStr}]`; + } - // Basic validation: Ensure it's a positive number - if (isNaN(number) || number <= 0) { - // Return the original number part as text if invalid for lookup - return `[${numStr}]`; - } + const source = message.sources?.[number - 1]; + const url = source?.metadata?.url; - // Get the corresponding source, adjusting for 0-based index - const source = message.sources?.[number - 1]; - const url = source?.metadata?.url; - - // If URL exists, create the link - if (url) { - return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; - } else { - // If no URL found for this number, return the number styled similarly but red - return `<span className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 text-xs relative font-medium text-red-600 dark:text-red-400">${numStr}</span>`; - } - }).join(''); // Join the generated links (or fallback text) together without separators + if (url) { + return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; + } else { + return `[${numStr}]`; + } + }) + .join(''); return linksHtml; - } - ) + }, + ), ); return; } From 64e2d457cce794b6b34f2c6f53da1c496420434f Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Sat, 5 Apr 2025 19:06:18 +0100 Subject: [PATCH 065/147] feat(search): add optional systemInstructions to API request body --- docs/API/SEARCH.md | 3 +++ src/app/api/search/route.ts | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/API/SEARCH.md b/docs/API/SEARCH.md index 3a28a78..b67b62b 100644 --- a/docs/API/SEARCH.md +++ b/docs/API/SEARCH.md @@ -33,6 +33,7 @@ The API accepts a JSON object in the request body, where you define the focus mo ["human", "Hi, how are you?"], ["assistant", "I am doing well, how can I help you today?"] ], + "systemInstructions": "Focus on providing technical details about Perplexica's architecture.", "stream": false } ``` @@ -63,6 +64,8 @@ The API accepts a JSON object in the request body, where you define the focus mo - **`query`** (string, required): The search query or question. +- **`systemInstructions`** (string, optional): Custom instructions provided by the user to guide the AI's response. These instructions are treated as user preferences and have lower priority than the system's core instructions. For example, you can specify a particular writing style, format, or focus area. + - **`history`** (array, optional): An array of message pairs representing the conversation history. Each pair consists of a role (either 'human' or 'assistant') and the message content. This allows the system to use the context of the conversation to refine results. Example: ```json diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 563cebe..970ec42 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -34,6 +34,7 @@ interface ChatRequestBody { query: string; history: Array<[string, string]>; stream?: boolean; + systemInstructions?: string; } export const POST = async (req: Request) => { @@ -125,7 +126,7 @@ export const POST = async (req: Request) => { embeddings, body.optimizationMode, [], - '', + body.systemInstructions || '', ); if (!body.stream) { From 588e68e93e3dbe77cba477eeef5a9d288a60f323 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:37:43 +0530 Subject: [PATCH 066/147] feat(providers): add deepseek provider --- sample.config.toml | 3 +++ src/app/api/config/route.ts | 5 ++++ src/app/settings/page.tsx | 20 ++++++++++++++++ src/lib/config.ts | 5 ++++ src/lib/providers/deepseek.ts | 44 +++++++++++++++++++++++++++++++++++ src/lib/providers/index.ts | 2 ++ 6 files changed, 79 insertions(+) create mode 100644 src/lib/providers/deepseek.ts diff --git a/sample.config.toml b/sample.config.toml index 691b964..980e99d 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -22,5 +22,8 @@ MODEL_NAME = "" [MODELS.OLLAMA] API_URL = "" # Ollama API URL - http://host.docker.internal:11434 +[MODELS.DEEPSEEK] +API_KEY = "" + [API_ENDPOINTS] SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 871bb21..39c1f84 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -7,6 +7,7 @@ import { getGroqApiKey, getOllamaApiEndpoint, getOpenaiApiKey, + getDeepseekApiKey, updateConfig, } from '@/lib/config'; import { @@ -53,6 +54,7 @@ export const GET = async (req: Request) => { config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); + config['deepseekApiKey'] = getDeepseekApiKey(); config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); config['customOpenaiModelName'] = getCustomOpenaiModelName(); @@ -88,6 +90,9 @@ export const POST = async (req: Request) => { OLLAMA: { API_URL: config.ollamaApiUrl, }, + DEEPSEEK: { + API_KEY: config.deepseekApiKey, + }, CUSTOM_OPENAI: { API_URL: config.customOpenaiApiUrl, API_KEY: config.customOpenaiApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 8e1c45a..8eee9a4 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -20,6 +20,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + deepseekApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; customOpenaiModelName: string; @@ -838,6 +839,25 @@ const Page = () => { onSave={(value) => saveConfig('geminiApiKey', value)} /> </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Deepseek API Key + </p> + <Input + type="text" + placeholder="Deepseek API Key" + value={config.deepseekApiKey} + isSaving={savingStates['deepseekApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + deepseekApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('deepseekApiKey', value)} + /> + </div> </div> </SettingsSection> </div> diff --git a/src/lib/config.ts b/src/lib/config.ts index ef99eed..2831214 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -25,6 +25,9 @@ interface Config { OLLAMA: { API_URL: string; }; + DEEPSEEK: { + API_KEY: string; + }; CUSTOM_OPENAI: { API_URL: string; API_KEY: string; @@ -63,6 +66,8 @@ export const getSearxngApiEndpoint = () => export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; +export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; + export const getCustomOpenaiApiKey = () => loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts new file mode 100644 index 0000000..88f02ec --- /dev/null +++ b/src/lib/providers/deepseek.ts @@ -0,0 +1,44 @@ +import { ChatOpenAI } from '@langchain/openai'; +import { getDeepseekApiKey } from '../config'; +import { ChatModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; + +const deepseekChatModels: Record<string, string>[] = [ + { + displayName: 'Deepseek Chat (Deepseek V3)', + key: 'deepseek-chat', + }, + { + displayName: 'Deepseek Reasoner (Deepseek R1)', + key: 'deepseek-reasoner', + }, +]; + +export const loadDeepseekChatModels = async () => { + const deepseekApiKey = getDeepseekApiKey(); + + if (!deepseekApiKey) return {}; + + try { + const chatModels: Record<string, ChatModel> = {}; + + deepseekChatModels.forEach((model) => { + chatModels[model.key] = { + displayName: model.displayName, + model: new ChatOpenAI({ + openAIApiKey: deepseekApiKey, + modelName: model.key, + temperature: 0.7, + configuration: { + baseURL: 'https://api.deepseek.com', + }, + }) as unknown as BaseChatModel, + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading Deepseek models: ${err}`); + return {}; + } +}; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index c32d0fa..eef212f 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -12,6 +12,7 @@ import { loadGroqChatModels } from './groq'; import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; import { loadTransformersEmbeddingsModels } from './transformers'; +import { loadDeepseekChatModels } from './deepseek'; export interface ChatModel { displayName: string; @@ -32,6 +33,7 @@ export const chatModelProviders: Record< groq: loadGroqChatModels, anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, + deepseek: loadDeepseekChatModels, }; export const embeddingModelProviders: Record< From e226645bc7620db5a4f276d8f3a3c68e464b7abe Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sun, 6 Apr 2025 13:48:58 +0530 Subject: [PATCH 067/147] feat(app): lint & beautify --- src/components/MessageBox.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index 4617103..b049185 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -72,7 +72,7 @@ const MessageBox = ({ (_, capturedContent: string) => { const numbers = capturedContent .split(',') - .map((numStr) => numStr.trim()) + .map((numStr) => numStr.trim()); const linksHtml = numbers .map((numStr) => { From 3ddcceda0a96c7d72ed947c791eaffbe671cc2c9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:26:29 +0530 Subject: [PATCH 068/147] feat(gemini-provider): update embedding models --- src/lib/providers/gemini.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b0fa887..2a88015 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -40,8 +40,12 @@ const geminiChatModels: Record<string, string>[] = [ const geminiEmbeddingModels: Record<string, string>[] = [ { - displayName: 'Gemini Embedding', - key: 'gemini-embedding-exp', + displayName: 'Text Embedding 004', + key: 'models/text-embedding-004', + }, + { + displayName: 'Embedding 001', + key: 'models/embedding-001', }, ]; From a85f762c58d901e532b6f9fea24d785ccbc735cf Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 10:27:04 +0530 Subject: [PATCH 069/147] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52ba392..e68410f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.1", + "version": "1.10.2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 28b9cca413966040a7904d64e0c001606a823b96 Mon Sep 17 00:00:00 2001 From: ClawCloud-Ron <ron@claw.cloud> Date: Mon, 7 Apr 2025 16:49:59 +0800 Subject: [PATCH 070/147] docs: add ClawCloud Run button --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e01f109..18c9f84 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Perplexica runs on Next.js and handles all API requests. It works right away on [![Deploy to Sealos](https://raw.githubusercontent.com/labring-actions/templates/main/Deploy-on-Sealos.svg)](https://usw.sealos.io/?openapp=system-template%3FtemplateName%3Dperplexica) [![Deploy to RepoCloud](https://d16t0pc4846x52.cloudfront.net/deploylobe.svg)](https://repocloud.io/details/?app_id=267) +[![Run on ClawCloud](https://raw.githubusercontent.com/ClawCloud/Run-Template/refs/heads/main/Run-on-ClawCloud.svg)](https://template.run.claw.cloud/?referralCode=U11MRQ8U9RM4&openapp=system-fastdeploy%3FtemplateName%3Dperplexica) ## Upcoming Features From 245573efcaa1edb91366c91b0c0ad29c4b43cbcb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:23:18 +0530 Subject: [PATCH 071/147] feat(groq): update model list --- src/lib/providers/groq.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index beeba02..b2f8bc0 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -72,6 +72,14 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'Llama 3.2 90B Vision Preview (Preview)', key: 'llama-3.2-90b-vision-preview', }, + { + displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', + key: 'meta-llama/llama-4-maverick-17b-128e-instruct', + }, + { + displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', + key: 'meta-llama/llama-4-scout-17b-16e-instruct', + }, ]; export const loadGroqChatModels = async () => { From 627775c430739bdd820f54cdf97ff905fb0f0d08 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:29:51 +0530 Subject: [PATCH 072/147] feat(groq): remove maverick (not being run yet) --- src/lib/providers/groq.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index b2f8bc0..bd55863 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -72,10 +72,10 @@ const groqChatModels: Record<string, string>[] = [ displayName: 'Llama 3.2 90B Vision Preview (Preview)', key: 'llama-3.2-90b-vision-preview', }, - { + /* { displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', key: 'meta-llama/llama-4-maverick-17b-128e-instruct', - }, + }, */ { displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', key: 'meta-llama/llama-4-scout-17b-16e-instruct', From da1123d84baa8ced8a9427f866b068b4652e7d9c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Apr 2025 23:30:51 +0530 Subject: [PATCH 073/147] feat(groq): update model name --- src/lib/providers/groq.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index bd55863..85c75f4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -77,7 +77,7 @@ const groqChatModels: Record<string, string>[] = [ key: 'meta-llama/llama-4-maverick-17b-128e-instruct', }, */ { - displayName: 'Llama 4 Maverick 17B 16E Instruct (Preview)', + displayName: 'Llama 4 Scout 17B 16E Instruct (Preview)', key: 'meta-llama/llama-4-scout-17b-16e-instruct', }, ]; From 41b258e4d894972876205cdbcff9d2c05241c2b8 Mon Sep 17 00:00:00 2001 From: sjiampojamarn <18257803+sjiampojamarn@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:16:27 -0700 Subject: [PATCH 074/147] Set speech message before return --- src/components/MessageBox.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index b049185..a7c46ec 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -97,6 +97,7 @@ const MessageBox = ({ }, ), ); + setSpeechMessage(message.content.replace(regex, '')); return; } From aa240009ab615311e62c31314ef8b9258179c01b Mon Sep 17 00:00:00 2001 From: haddadrm <121486289+haddadrm@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:23:28 +0400 Subject: [PATCH 075/147] Feature: Add LM Studio provider integration - Added LM Studio provider to support OpenAI compatible API - Implemented chat and embeddings model loading - Updated config to include LM Studio API endpoint --- sample.config.toml | 5 +- src/lib/config.ts | 5 ++ src/lib/providers/index.ts | 3 + src/lib/providers/lmstudio.ts | 101 ++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/lib/providers/lmstudio.ts diff --git a/sample.config.toml b/sample.config.toml index 980e99d..1db2125 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -25,5 +25,8 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [MODELS.DEEPSEEK] API_KEY = "" +[MODELS.LM_STUDIO] +API_URL = "" # LM Studio API URL - http://host.docker.internal:1234 + [API_ENDPOINTS] -SEARXNG = "" # SearxNG API URL - http://localhost:32768 \ No newline at end of file +SEARXNG = "" # SearxNG API URL - http://localhost:32768 diff --git a/src/lib/config.ts b/src/lib/config.ts index 2831214..7c6d495 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -28,6 +28,9 @@ interface Config { DEEPSEEK: { API_KEY: string; }; + LM_STUDIO: { + API_URL: string; + }; CUSTOM_OPENAI: { API_URL: string; API_KEY: string; @@ -77,6 +80,8 @@ export const getCustomOpenaiApiUrl = () => export const getCustomOpenaiModelName = () => loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; +export const getLMStudioApiEndpoint = () => loadConfig().MODELS.LM_STUDIO.API_URL; + const mergeConfigs = (current: any, update: any): any => { if (update === null || update === undefined) { return current; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index eef212f..0a4a6db 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -13,6 +13,7 @@ import { loadAnthropicChatModels } from './anthropic'; import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; import { loadTransformersEmbeddingsModels } from './transformers'; import { loadDeepseekChatModels } from './deepseek'; +import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels } from './lmstudio'; export interface ChatModel { displayName: string; @@ -34,6 +35,7 @@ export const chatModelProviders: Record< anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, deepseek: loadDeepseekChatModels, + lmstudio: loadLMStudioChatModels, }; export const embeddingModelProviders: Record< @@ -44,6 +46,7 @@ export const embeddingModelProviders: Record< ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, transformers: loadTransformersEmbeddingsModels, + lmstudio: loadLMStudioEmbeddingsModels, }; export const getAvailableChatModelProviders = async () => { diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts new file mode 100644 index 0000000..fd8eb75 --- /dev/null +++ b/src/lib/providers/lmstudio.ts @@ -0,0 +1,101 @@ +import { getKeepAlive, getLMStudioApiEndpoint } from '../config'; +import axios from 'axios'; +import { ChatModel, EmbeddingModel } from '.'; +import { ChatOpenAI } from '@langchain/openai'; +import { OpenAIEmbeddings } from '@langchain/openai'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; + +interface LMStudioModel { + id: string; + name?: string; +} + +const ensureV1Endpoint = (endpoint: string): string => + endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`; + +const checkServerAvailability = async (endpoint: string): Promise<boolean> => { + try { + const keepAlive = getKeepAlive(); + await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + return true; + } catch { + return false; + } +}; + +export const loadLMStudioChatModels = async () => { + const endpoint = getLMStudioApiEndpoint(); + const keepAlive = getKeepAlive(); + + if (!endpoint) return {}; + if (!await checkServerAvailability(endpoint)) return {}; + + try { + const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + + const chatModels: Record<string, ChatModel> = {}; + + response.data.data.forEach((model: LMStudioModel) => { + chatModels[model.id] = { + displayName: model.name || model.id, + model: new ChatOpenAI({ + openAIApiKey: 'lm-studio', + configuration: { + baseURL: ensureV1Endpoint(endpoint), + }, + modelName: model.id, + temperature: 0.7, + streaming: true, + maxRetries: 3 + }) as unknown as BaseChatModel, + }; + }); + + return chatModels; + } catch (err) { + console.error(`Error loading LM Studio models: ${err}`); + return {}; + } +}; + +export const loadLMStudioEmbeddingsModels = async () => { + const endpoint = getLMStudioApiEndpoint(); + const keepAlive = getKeepAlive(); + + if (!endpoint) return {}; + if (!await checkServerAvailability(endpoint)) return {}; + + try { + const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { + timeout: parseInt(keepAlive) * 1000 || 5000, + headers: { 'Content-Type': 'application/json' }, + }); + + const embeddingsModels: Record<string, EmbeddingModel> = {}; + + response.data.data.forEach((model: LMStudioModel) => { + embeddingsModels[model.id] = { + displayName: model.name || model.id, + model: new OpenAIEmbeddings({ + openAIApiKey: 'lm-studio', + configuration: { + baseURL: ensureV1Endpoint(endpoint), + }, + modelName: model.id, + }) as unknown as Embeddings, + }; + }); + + return embeddingsModels; + } catch (err) { + console.error(`Error loading LM Studio embeddings model: ${err}`); + return {}; + } +}; From 7e1dc33a081c563991d2fc084b7b7e3dd143e04e Mon Sep 17 00:00:00 2001 From: haddadrm <121486289+haddadrm@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:26:15 +0400 Subject: [PATCH 076/147] Implement provider formatting improvements and fix client-side compatibility - Add PROVIDER_INFO metadata to each provider file with proper display names - Create centralized PROVIDER_METADATA in index.ts for consistent reference - Update settings UI to use provider metadata for display names - Fix client/server compatibility for Node.js modules in config.ts --- src/app/settings/page.tsx | 11 ++++----- src/lib/config.ts | 41 ++++++++++++++++++++++--------- src/lib/providers/anthropic.ts | 5 ++++ src/lib/providers/deepseek.ts | 5 ++++ src/lib/providers/gemini.ts | 5 ++++ src/lib/providers/groq.ts | 5 ++++ src/lib/providers/index.ts | 31 +++++++++++++++++------ src/lib/providers/lmstudio.ts | 5 ++++ src/lib/providers/ollama.ts | 5 ++++ src/lib/providers/openai.ts | 5 ++++ src/lib/providers/transformers.ts | 5 ++++ 11 files changed, 97 insertions(+), 26 deletions(-) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 8eee9a4..919304b 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -7,6 +7,7 @@ import { Switch } from '@headlessui/react'; import ThemeSwitcher from '@/components/theme/Switcher'; import { ImagesIcon, VideoIcon } from 'lucide-react'; import Link from 'next/link'; +import { PROVIDER_METADATA } from '@/lib/providers'; interface SettingsType { chatModelProviders: { @@ -547,9 +548,8 @@ const Page = () => { options={Object.keys(config.chatModelProviders).map( (provider) => ({ value: provider, - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), + label: (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + provider.slice(1), }), )} /> @@ -689,9 +689,8 @@ const Page = () => { options={Object.keys(config.embeddingModelProviders).map( (provider) => ({ value: provider, - label: - provider.charAt(0).toUpperCase() + - provider.slice(1), + label: (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + provider.slice(1), }), )} /> diff --git a/src/lib/config.ts b/src/lib/config.ts index 7c6d495..e3f2680 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,7 +1,14 @@ -import fs from 'fs'; -import path from 'path'; import toml from '@iarna/toml'; +// Use dynamic imports for Node.js modules to prevent client-side errors +let fs: any; +let path: any; +if (typeof window === 'undefined') { + // We're on the server + fs = require('fs'); + path = require('path'); +} + const configFileName = 'config.toml'; interface Config { @@ -46,10 +53,17 @@ type RecursivePartial<T> = { [P in keyof T]?: RecursivePartial<T[P]>; }; -const loadConfig = () => - toml.parse( - fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), - ) as any as Config; +const loadConfig = () => { + // Server-side only + if (typeof window === 'undefined') { + return toml.parse( + fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), + ) as any as Config; + } + + // Client-side fallback - settings will be loaded via API + return {} as Config; +}; export const getSimilarityMeasure = () => loadConfig().GENERAL.SIMILARITY_MEASURE; @@ -114,10 +128,13 @@ const mergeConfigs = (current: any, update: any): any => { }; export const updateConfig = (config: RecursivePartial<Config>) => { - const currentConfig = loadConfig(); - const mergedConfig = mergeConfigs(currentConfig, config); - fs.writeFileSync( - path.join(path.join(process.cwd(), `${configFileName}`)), - toml.stringify(mergedConfig), - ); + // Server-side only + if (typeof window === 'undefined') { + const currentConfig = loadConfig(); + const mergedConfig = mergeConfigs(currentConfig, config); + fs.writeFileSync( + path.join(path.join(process.cwd(), `${configFileName}`)), + toml.stringify(mergedConfig), + ); + } }; diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 7ecde4b..e434b32 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -1,6 +1,11 @@ import { ChatAnthropic } from '@langchain/anthropic'; import { ChatModel } from '.'; import { getAnthropicApiKey } from '../config'; + +export const PROVIDER_INFO = { + key: 'anthropic', + displayName: 'Anthropic' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const anthropicChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index 88f02ec..b272801 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -3,6 +3,11 @@ import { getDeepseekApiKey } from '../config'; import { ChatModel } from '.'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +export const PROVIDER_INFO = { + key: 'deepseek', + displayName: 'Deepseek AI' +}; + const deepseekChatModels: Record<string, string>[] = [ { displayName: 'Deepseek Chat (Deepseek V3)', diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 2a88015..6af9fb2 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -4,6 +4,11 @@ import { } from '@langchain/google-genai'; import { getGeminiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'gemini', + displayName: 'Google Gemini' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 85c75f4..62481d4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,6 +1,11 @@ import { ChatOpenAI } from '@langchain/openai'; import { getGroqApiKey } from '../config'; import { ChatModel } from '.'; + +export const PROVIDER_INFO = { + key: 'groq', + displayName: 'Groq' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const groqChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 0a4a6db..073bd61 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,19 +1,34 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels } from './openai'; +import { loadOpenAIChatModels, loadOpenAIEmbeddingModels, PROVIDER_INFO as OpenAIInfo, PROVIDER_INFO } from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '../config'; import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels } from './ollama'; -import { loadGroqChatModels } from './groq'; -import { loadAnthropicChatModels } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels } from './gemini'; -import { loadTransformersEmbeddingsModels } from './transformers'; -import { loadDeepseekChatModels } from './deepseek'; -import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels } from './lmstudio'; +import { loadOllamaChatModels, loadOllamaEmbeddingModels, PROVIDER_INFO as OllamaInfo } from './ollama'; +import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq'; +import { loadAnthropicChatModels, PROVIDER_INFO as AnthropicInfo } from './anthropic'; +import { loadGeminiChatModels, loadGeminiEmbeddingModels, PROVIDER_INFO as GeminiInfo } from './gemini'; +import { loadTransformersEmbeddingsModels, PROVIDER_INFO as TransformersInfo } from './transformers'; +import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo } from './deepseek'; +import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, PROVIDER_INFO as LMStudioInfo } from './lmstudio'; + +export const PROVIDER_METADATA = { + openai: OpenAIInfo, + ollama: OllamaInfo, + groq: GroqInfo, + anthropic: AnthropicInfo, + gemini: GeminiInfo, + transformers: TransformersInfo, + deepseek: DeepseekInfo, + lmstudio: LMStudioInfo, + custom_openai: { + key: 'custom_openai', + displayName: 'Custom OpenAI' + } +}; export interface ChatModel { displayName: string; diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index fd8eb75..f7be638 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -1,6 +1,11 @@ import { getKeepAlive, getLMStudioApiEndpoint } from '../config'; import axios from 'axios'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'lmstudio', + displayName: 'LM Studio' +}; import { ChatOpenAI } from '@langchain/openai'; import { OpenAIEmbeddings } from '@langchain/openai'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index 92e98e4..beab58f 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,6 +1,11 @@ import axios from 'axios'; import { getKeepAlive, getOllamaApiEndpoint } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'ollama', + displayName: 'Ollama' +}; import { ChatOllama } from '@langchain/community/chat_models/ollama'; import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 01bacc6..36f7e29 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -1,6 +1,11 @@ import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; import { getOpenaiApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; + +export const PROVIDER_INFO = { + key: 'openai', + displayName: 'OpenAI' +}; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index a06dd12..fd7cb9e 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -1,5 +1,10 @@ import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; +export const PROVIDER_INFO = { + key: 'transformers', + displayName: 'Hugging Face' +}; + export const loadTransformersEmbeddingsModels = async () => { try { const embeddingModels = { From 7e1d6ebd19fb62a4dfbded959efc9a51553ae958 Mon Sep 17 00:00:00 2001 From: OTYAK <118303871+OmarElKadri@users.noreply.github.com> Date: Fri, 11 Apr 2025 18:46:03 +0100 Subject: [PATCH 077/147] bug(file upload): fixed an erro in uploading dox files. --- package.json | 129 ++++++++++++++++++++++---------------------- yarn.lock | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 213 insertions(+), 66 deletions(-) diff --git a/package.json b/package.json index e68410f..38f22f9 100644 --- a/package.json +++ b/package.json @@ -1,65 +1,66 @@ { - "name": "perplexica-frontend", - "version": "1.10.2", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "npm run db:push && next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "@xenova/transformers": "^2.17.2", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} + "name": "perplexica-frontend", + "version": "1.10.2", + "license": "MIT", + "author": "ItzCrazyKns", + "scripts": { + "dev": "next dev", + "build": "npm run db:push && next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push" + }, + "dependencies": { + "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", + "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", + "html-to-text": "^9.0.5", + "langchain": "^0.1.30", + "lucide-react": "^0.363.0", + "mammoth": "^1.7.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 921186b..ffd6648 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1107,6 +1107,11 @@ optionalDependencies: onnxruntime-node "1.14.0" +"@xmldom/xmldom@^0.8.6": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1191,6 +1196,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +argparse@~1.0.3: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + aria-query@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" @@ -1444,6 +1456,11 @@ bl@^4.0.3: inherits "^2.0.4" readable-stream "^3.4.0" +bluebird@~3.4.0: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1691,6 +1708,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1834,6 +1856,11 @@ digest-fetch@^1.3.0: base-64 "^0.1.0" md5 "^2.3.0" +dingbat-to-unicode@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" + integrity sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1906,6 +1933,13 @@ drizzle-orm@^0.40.1: resolved "https://registry.yarnpkg.com/drizzle-orm/-/drizzle-orm-0.40.1.tgz#15f1d970d4fb034db2b13e4a33fcbbccda9bf1cb" integrity sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew== +duck@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/duck/-/duck-0.1.12.tgz#de7adf758421230b6d7aee799ce42670586b9efa" + integrity sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg== + dependencies: + underscore "^1.13.1" + eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" @@ -2788,6 +2822,11 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -2809,7 +2848,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3035,6 +3074,11 @@ isarray@^2.0.5: resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -3133,6 +3177,16 @@ jsonpointer@^5.0.1: object.assign "^4.1.4" object.values "^1.1.6" +jszip@^3.7.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== + dependencies: + lie "~3.3.0" + pako "~1.0.2" + readable-stream "~2.3.6" + setimmediate "^1.0.5" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -3240,6 +3294,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== + dependencies: + immediate "~3.0.5" + lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" @@ -3301,6 +3362,15 @@ loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +lop@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/lop/-/lop-0.4.2.tgz#c9c2f958a39b9da1c2f36ca9ad66891a9fe84640" + integrity sha512-RefILVDQ4DKoRZsJ4Pj22TxE3omDO47yFpkIBoDKzkqPRISs5U1cnAdg/5583YPkWPaLIYHOKRMQSvjFsO26cw== + dependencies: + duck "^0.1.12" + option "~0.2.1" + underscore "^1.13.1" + lru-cache@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" @@ -3318,6 +3388,22 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== +mammoth@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.0.tgz#71e34ca280735275788bfe95e653a058dcab4df2" + integrity sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg== + dependencies: + "@xmldom/xmldom" "^0.8.6" + argparse "~1.0.3" + base64-js "^1.5.1" + bluebird "~3.4.0" + dingbat-to-unicode "^1.0.1" + jszip "^3.7.1" + lop "^0.4.2" + path-is-absolute "^1.0.0" + underscore "^1.13.1" + xmlbuilder "^10.0.0" + markdown-to-jsx@^7.7.2: version "7.7.2" resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" @@ -3708,6 +3794,11 @@ openapi-types@^12.1.3: resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-12.1.3.tgz#471995eb26c4b97b7bd356aacf7b91b73e777dd3" integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== +option@~0.2.1: + version "0.2.4" + resolved "https://registry.yarnpkg.com/option/-/option-0.2.4.tgz#fd475cdf98dcabb3cb397a3ba5284feb45edbfe4" + integrity sha512-pkEqbDyl8ou5cpq+VsnQbe/WlEy5qS7xPzMS1U55OCG9KPvwFD46zDbxQIj3egJSFc3D+XhYOPUzz49zQAVy7A== + optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -3762,6 +3853,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +pako@~1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3951,6 +4047,11 @@ prettier@^3.2.5: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" @@ -4062,6 +4163,19 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.2: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4164,6 +4278,11 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + safe-regex-test@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" @@ -4231,6 +4350,11 @@ set-function-name@^2.0.1, set-function-name@^2.0.2: functions-have-names "^1.2.3" has-property-descriptors "^1.0.2" +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + sharp@^0.32.0: version "0.32.6" resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" @@ -4365,6 +4489,11 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -4465,6 +4594,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -4775,6 +4911,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@^1.13.1: + version "1.13.7" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10" + integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g== + undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" @@ -4817,7 +4958,7 @@ use-latest@^1.2.1: dependencies: use-isomorphic-layout-effect "^1.1.1" -util-deprecate@^1.0.1, util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -4978,6 +5119,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +xmlbuilder@^10.0.0: + version "10.1.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" + integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" From 073b5e897cc5c2081b6963fa4d3b8b4ce1cc6cfc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:58:52 +0530 Subject: [PATCH 078/147] feat(app): lint & beautify --- src/app/api/config/route.ts | 5 ++++ src/app/settings/page.tsx | 13 ++++++--- src/lib/config.ts | 5 ++-- src/lib/providers/anthropic.ts | 2 +- src/lib/providers/deepseek.ts | 2 +- src/lib/providers/gemini.ts | 2 +- src/lib/providers/groq.ts | 2 +- src/lib/providers/index.ts | 44 ++++++++++++++++++++++++------- src/lib/providers/lmstudio.ts | 20 +++++--------- src/lib/providers/ollama.ts | 2 +- src/lib/providers/openai.ts | 2 +- src/lib/providers/transformers.ts | 2 +- 12 files changed, 66 insertions(+), 35 deletions(-) diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 39c1f84..c1e5bbd 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -8,6 +8,7 @@ import { getOllamaApiEndpoint, getOpenaiApiKey, getDeepseekApiKey, + getLMStudioApiEndpoint, updateConfig, } from '@/lib/config'; import { @@ -51,6 +52,7 @@ export const GET = async (req: Request) => { config['openaiApiKey'] = getOpenaiApiKey(); config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['lmStudioApiUrl'] = getLMStudioApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); @@ -93,6 +95,9 @@ export const POST = async (req: Request) => { DEEPSEEK: { API_KEY: config.deepseekApiKey, }, + LM_STUDIO: { + API_URL: config.lmStudioApiUrl, + }, CUSTOM_OPENAI: { API_URL: config.customOpenaiApiUrl, API_KEY: config.customOpenaiApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 919304b..0385944 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -21,6 +21,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + lmStudioApiUrl: string; deepseekApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; @@ -548,8 +549,10 @@ const Page = () => { options={Object.keys(config.chatModelProviders).map( (provider) => ({ value: provider, - label: (PROVIDER_METADATA as any)[provider]?.displayName || - provider.charAt(0).toUpperCase() + provider.slice(1), + label: + (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + + provider.slice(1), }), )} /> @@ -689,8 +692,10 @@ const Page = () => { options={Object.keys(config.embeddingModelProviders).map( (provider) => ({ value: provider, - label: (PROVIDER_METADATA as any)[provider]?.displayName || - provider.charAt(0).toUpperCase() + provider.slice(1), + label: + (PROVIDER_METADATA as any)[provider]?.displayName || + provider.charAt(0).toUpperCase() + + provider.slice(1), }), )} /> diff --git a/src/lib/config.ts b/src/lib/config.ts index e3f2680..78ad09c 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -60,7 +60,7 @@ const loadConfig = () => { fs.readFileSync(path.join(process.cwd(), `${configFileName}`), 'utf-8'), ) as any as Config; } - + // Client-side fallback - settings will be loaded via API return {} as Config; }; @@ -94,7 +94,8 @@ export const getCustomOpenaiApiUrl = () => export const getCustomOpenaiModelName = () => loadConfig().MODELS.CUSTOM_OPENAI.MODEL_NAME; -export const getLMStudioApiEndpoint = () => loadConfig().MODELS.LM_STUDIO.API_URL; +export const getLMStudioApiEndpoint = () => + loadConfig().MODELS.LM_STUDIO.API_URL; const mergeConfigs = (current: any, update: any): any => { if (update === null || update === undefined) { diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index e434b32..2b0f2cc 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -4,7 +4,7 @@ import { getAnthropicApiKey } from '../config'; export const PROVIDER_INFO = { key: 'anthropic', - displayName: 'Anthropic' + displayName: 'Anthropic', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index b272801..46f2398 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -5,7 +5,7 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; export const PROVIDER_INFO = { key: 'deepseek', - displayName: 'Deepseek AI' + displayName: 'Deepseek AI', }; const deepseekChatModels: Record<string, string>[] = [ diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6af9fb2..6cf2243 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -7,7 +7,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'gemini', - displayName: 'Google Gemini' + displayName: 'Google Gemini', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 62481d4..4b0ca92 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -4,7 +4,7 @@ import { ChatModel } from '.'; export const PROVIDER_INFO = { key: 'groq', - displayName: 'Groq' + displayName: 'Groq', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 073bd61..e536431 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -1,19 +1,45 @@ import { Embeddings } from '@langchain/core/embeddings'; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -import { loadOpenAIChatModels, loadOpenAIEmbeddingModels, PROVIDER_INFO as OpenAIInfo, PROVIDER_INFO } from './openai'; +import { + loadOpenAIChatModels, + loadOpenAIEmbeddingModels, + PROVIDER_INFO as OpenAIInfo, + PROVIDER_INFO, +} from './openai'; import { getCustomOpenaiApiKey, getCustomOpenaiApiUrl, getCustomOpenaiModelName, } from '../config'; import { ChatOpenAI } from '@langchain/openai'; -import { loadOllamaChatModels, loadOllamaEmbeddingModels, PROVIDER_INFO as OllamaInfo } from './ollama'; +import { + loadOllamaChatModels, + loadOllamaEmbeddingModels, + PROVIDER_INFO as OllamaInfo, +} from './ollama'; import { loadGroqChatModels, PROVIDER_INFO as GroqInfo } from './groq'; -import { loadAnthropicChatModels, PROVIDER_INFO as AnthropicInfo } from './anthropic'; -import { loadGeminiChatModels, loadGeminiEmbeddingModels, PROVIDER_INFO as GeminiInfo } from './gemini'; -import { loadTransformersEmbeddingsModels, PROVIDER_INFO as TransformersInfo } from './transformers'; -import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo } from './deepseek'; -import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, PROVIDER_INFO as LMStudioInfo } from './lmstudio'; +import { + loadAnthropicChatModels, + PROVIDER_INFO as AnthropicInfo, +} from './anthropic'; +import { + loadGeminiChatModels, + loadGeminiEmbeddingModels, + PROVIDER_INFO as GeminiInfo, +} from './gemini'; +import { + loadTransformersEmbeddingsModels, + PROVIDER_INFO as TransformersInfo, +} from './transformers'; +import { + loadDeepseekChatModels, + PROVIDER_INFO as DeepseekInfo, +} from './deepseek'; +import { + loadLMStudioChatModels, + loadLMStudioEmbeddingsModels, + PROVIDER_INFO as LMStudioInfo, +} from './lmstudio'; export const PROVIDER_METADATA = { openai: OpenAIInfo, @@ -26,8 +52,8 @@ export const PROVIDER_METADATA = { lmstudio: LMStudioInfo, custom_openai: { key: 'custom_openai', - displayName: 'Custom OpenAI' - } + displayName: 'Custom OpenAI', + }, }; export interface ChatModel { diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index f7be638..811208f 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'lmstudio', - displayName: 'LM Studio' + displayName: 'LM Studio', }; import { ChatOpenAI } from '@langchain/openai'; import { OpenAIEmbeddings } from '@langchain/openai'; @@ -16,14 +16,12 @@ interface LMStudioModel { name?: string; } -const ensureV1Endpoint = (endpoint: string): string => +const ensureV1Endpoint = (endpoint: string): string => endpoint.endsWith('/v1') ? endpoint : `${endpoint}/v1`; const checkServerAvailability = async (endpoint: string): Promise<boolean> => { try { - const keepAlive = getKeepAlive(); await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); return true; @@ -34,14 +32,12 @@ const checkServerAvailability = async (endpoint: string): Promise<boolean> => { export const loadLMStudioChatModels = async () => { const endpoint = getLMStudioApiEndpoint(); - const keepAlive = getKeepAlive(); - + if (!endpoint) return {}; - if (!await checkServerAvailability(endpoint)) return {}; + if (!(await checkServerAvailability(endpoint))) return {}; try { const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); @@ -58,7 +54,7 @@ export const loadLMStudioChatModels = async () => { modelName: model.id, temperature: 0.7, streaming: true, - maxRetries: 3 + maxRetries: 3, }) as unknown as BaseChatModel, }; }); @@ -72,14 +68,12 @@ export const loadLMStudioChatModels = async () => { export const loadLMStudioEmbeddingsModels = async () => { const endpoint = getLMStudioApiEndpoint(); - const keepAlive = getKeepAlive(); - + if (!endpoint) return {}; - if (!await checkServerAvailability(endpoint)) return {}; + if (!(await checkServerAvailability(endpoint))) return {}; try { const response = await axios.get(`${ensureV1Endpoint(endpoint)}/models`, { - timeout: parseInt(keepAlive) * 1000 || 5000, headers: { 'Content-Type': 'application/json' }, }); diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index beab58f..cca2142 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'ollama', - displayName: 'Ollama' + displayName: 'Ollama', }; import { ChatOllama } from '@langchain/community/chat_models/ollama'; import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 36f7e29..61621c3 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -4,7 +4,7 @@ import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { key: 'openai', - displayName: 'OpenAI' + displayName: 'OpenAI', }; import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; diff --git a/src/lib/providers/transformers.ts b/src/lib/providers/transformers.ts index fd7cb9e..3098d9f 100644 --- a/src/lib/providers/transformers.ts +++ b/src/lib/providers/transformers.ts @@ -2,7 +2,7 @@ import { HuggingFaceTransformersEmbeddings } from '../huggingfaceTransformer'; export const PROVIDER_INFO = { key: 'transformers', - displayName: 'Hugging Face' + displayName: 'Hugging Face', }; export const loadTransformersEmbeddingsModels = async () => { From 186249149674df5938faecabb3a3b7c48d9bce71 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 12 Apr 2025 11:59:05 +0530 Subject: [PATCH 079/147] feat(settings): add LM Studio API URL --- src/app/settings/page.tsx | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 0385944..05338c3 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -862,6 +862,25 @@ const Page = () => { onSave={(value) => saveConfig('deepseekApiKey', value)} /> </div> + + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + LM Studio API URL + </p> + <Input + type="text" + placeholder="LM Studio API URL" + value={config.lmStudioApiUrl} + isSaving={savingStates['lmStudioApiUrl']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + lmStudioApiUrl: e.target.value, + })); + }} + onSave={(value) => saveConfig('lmStudioApiUrl', value)} + /> + </div> </div> </SettingsSection> </div> From 06ff2725417435f7d2f0faaa7cc4f67905d9f4a0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Apr 2025 13:10:14 +0530 Subject: [PATCH 080/147] feat(openai): add GPT 4.1 models --- src/lib/providers/openai.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index 61621c3..e68e574 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -30,6 +30,18 @@ const openaiChatModels: Record<string, string>[] = [ displayName: 'GPT-4 omni mini', key: 'gpt-4o-mini', }, + { + displayName: 'GPT 4.1 nano', + key: 'gpt-4.1-nano', + }, + { + displayName: 'GPT 4.1 mini', + key: 'gpt-4.1-mini', + }, + { + displayName: 'GPT 4.1', + key: 'gpt-4.1', + }, ]; const openaiEmbeddingModels: Record<string, string>[] = [ From 68e151b2bda7490ad9c3f17ee27bf539326143b6 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Apr 2025 17:13:30 +0530 Subject: [PATCH 081/147] Update README.md --- README.md | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/README.md b/README.md index 18c9f84..9e94028 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,5 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> -<div align="center" markdown="1"> - <sup>Special thanks to:</sup> - <br> - <br> - <a href="https://www.warp.dev/perplexica"> - <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b"> - </a> - -### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) - -[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica) - -</div> - -<hr/> - [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From 701819d01834e8aefba42ec37ac0a85188851641 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 13 May 2025 20:14:08 +0530 Subject: [PATCH 082/147] Revert "Update README.md" This reverts commit 68e151b2bda7490ad9c3f17ee27bf539326143b6. --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 9e94028..18c9f84 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,21 @@ # 🚀 Perplexica - An AI-powered search engine 🔎 <!-- omit in toc --> +<div align="center" markdown="1"> + <sup>Special thanks to:</sup> + <br> + <br> + <a href="https://www.warp.dev/perplexica"> + <img alt="Warp sponsorship" width="400" src="https://github.com/user-attachments/assets/775dd593-9b5f-40f1-bf48-479faff4c27b"> + </a> + +### [Warp, the AI Devtool that lives in your terminal](https://www.warp.dev/perplexica) + +[Available for MacOS, Linux, & Windows](https://www.warp.dev/perplexica) + +</div> + +<hr/> + [![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From 0c3740fdf2421d3ac9a1601ae133f35bafdb5b2f Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:23:40 +0530 Subject: [PATCH 083/147] feat(groq-provider): dynamically fetch models --- src/lib/providers/groq.ts | 98 ++++++--------------------------------- 1 file changed, 14 insertions(+), 84 deletions(-) diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 4b0ca92..5435de4 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -6,101 +6,31 @@ export const PROVIDER_INFO = { key: 'groq', displayName: 'Groq', }; -import { BaseChatModel } from '@langchain/core/language_models/chat_models'; -const groqChatModels: Record<string, string>[] = [ - { - displayName: 'Gemma2 9B IT', - key: 'gemma2-9b-it', - }, - { - displayName: 'Llama 3.3 70B Versatile', - key: 'llama-3.3-70b-versatile', - }, - { - displayName: 'Llama 3.1 8B Instant', - key: 'llama-3.1-8b-instant', - }, - { - displayName: 'Llama3 70B 8192', - key: 'llama3-70b-8192', - }, - { - displayName: 'Llama3 8B 8192', - key: 'llama3-8b-8192', - }, - { - displayName: 'Mixtral 8x7B 32768', - key: 'mixtral-8x7b-32768', - }, - { - displayName: 'Qwen QWQ 32B (Preview)', - key: 'qwen-qwq-32b', - }, - { - displayName: 'Mistral Saba 24B (Preview)', - key: 'mistral-saba-24b', - }, - { - displayName: 'Qwen 2.5 Coder 32B (Preview)', - key: 'qwen-2.5-coder-32b', - }, - { - displayName: 'Qwen 2.5 32B (Preview)', - key: 'qwen-2.5-32b', - }, - { - displayName: 'DeepSeek R1 Distill Qwen 32B (Preview)', - key: 'deepseek-r1-distill-qwen-32b', - }, - { - displayName: 'DeepSeek R1 Distill Llama 70B (Preview)', - key: 'deepseek-r1-distill-llama-70b', - }, - { - displayName: 'Llama 3.3 70B SpecDec (Preview)', - key: 'llama-3.3-70b-specdec', - }, - { - displayName: 'Llama 3.2 1B Preview (Preview)', - key: 'llama-3.2-1b-preview', - }, - { - displayName: 'Llama 3.2 3B Preview (Preview)', - key: 'llama-3.2-3b-preview', - }, - { - displayName: 'Llama 3.2 11B Vision Preview (Preview)', - key: 'llama-3.2-11b-vision-preview', - }, - { - displayName: 'Llama 3.2 90B Vision Preview (Preview)', - key: 'llama-3.2-90b-vision-preview', - }, - /* { - displayName: 'Llama 4 Maverick 17B 128E Instruct (Preview)', - key: 'meta-llama/llama-4-maverick-17b-128e-instruct', - }, */ - { - displayName: 'Llama 4 Scout 17B 16E Instruct (Preview)', - key: 'meta-llama/llama-4-scout-17b-16e-instruct', - }, -]; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; export const loadGroqChatModels = async () => { const groqApiKey = getGroqApiKey(); - if (!groqApiKey) return {}; try { + const res = await fetch('https://api.groq.com/openai/v1/models', { + method: 'GET', + headers: { + Authorization: `bearer ${groqApiKey}`, + 'Content-Type': 'application/json', + }, + }); + + const groqChatModels = (await res.json()).data; const chatModels: Record<string, ChatModel> = {}; - groqChatModels.forEach((model) => { - chatModels[model.key] = { - displayName: model.displayName, + groqChatModels.forEach((model: any) => { + chatModels[model.id] = { + displayName: model.id, model: new ChatOpenAI({ openAIApiKey: groqApiKey, - modelName: model.key, + modelName: model.id, temperature: 0.7, configuration: { baseURL: 'https://api.groq.com/openai/v1', From bb21184ea273dea127996040fb23f67d107c6a4d Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:32:09 +0530 Subject: [PATCH 084/147] feat(settings): show loading spinner immediately --- src/app/settings/page.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 05338c3..6f20f01 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -143,7 +143,7 @@ const Page = () => { const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState< string | null >(null); - const [isLoading, setIsLoading] = useState(false); + const [isLoading, setIsLoading] = useState(true); const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); @@ -151,7 +151,6 @@ const Page = () => { useEffect(() => { const fetchConfig = async () => { - setIsLoading(true); const res = await fetch(`/api/config`, { headers: { 'Content-Type': 'application/json', From c80ac1415dbb6760a076ac4e23faca72e49060a2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 27 May 2025 18:42:02 +0530 Subject: [PATCH 085/147] feat(app): lint & beautify --- package.json | 130 +++++++++++++++++++++++++-------------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 38f22f9..147348c 100644 --- a/package.json +++ b/package.json @@ -1,66 +1,66 @@ { - "name": "perplexica-frontend", - "version": "1.10.2", - "license": "MIT", - "author": "ItzCrazyKns", - "scripts": { - "dev": "next dev", - "build": "npm run db:push && next build", - "start": "next start", - "lint": "next lint", - "format:write": "prettier . --write", - "db:push": "drizzle-kit push" - }, - "dependencies": { - "@headlessui/react": "^2.2.0", - "@iarna/toml": "^2.2.5", - "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", - "@langchain/textsplitters": "^0.1.0", - "@tailwindcss/typography": "^0.5.12", - "@xenova/transformers": "^2.17.2", - "axios": "^1.8.3", - "better-sqlite3": "^11.9.1", - "clsx": "^2.1.0", - "compute-cosine-similarity": "^1.1.0", - "compute-dot": "^1.1.0", - "drizzle-orm": "^0.40.1", - "html-to-text": "^9.0.5", - "langchain": "^0.1.30", - "lucide-react": "^0.363.0", - "mammoth": "^1.7.0", - "markdown-to-jsx": "^7.7.2", - "next": "^15.2.2", - "next-themes": "^0.3.0", - "pdf-parse": "^1.1.1", - "react": "^18", - "react-dom": "^18", - "react-text-to-speech": "^0.14.5", - "react-textarea-autosize": "^8.5.3", - "sonner": "^1.4.41", - "tailwind-merge": "^2.2.2", - "winston": "^3.17.0", - "yet-another-react-lightbox": "^3.17.2", - "zod": "^3.22.4" - }, - "devDependencies": { - "@types/better-sqlite3": "^7.6.12", - "@types/html-to-text": "^9.0.4", - "@types/node": "^20", - "@types/pdf-parse": "^1.1.4", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "drizzle-kit": "^0.30.5", - "eslint": "^8", - "eslint-config-next": "14.1.4", - "postcss": "^8", - "prettier": "^3.2.5", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } -} \ No newline at end of file + "name": "perplexica-frontend", + "version": "1.10.2", + "license": "MIT", + "author": "ItzCrazyKns", + "scripts": { + "dev": "next dev", + "build": "npm run db:push && next build", + "start": "next start", + "lint": "next lint", + "format:write": "prettier . --write", + "db:push": "drizzle-kit push" + }, + "dependencies": { + "@headlessui/react": "^2.2.0", + "@iarna/toml": "^2.2.5", + "@icons-pack/react-simple-icons": "^12.3.0", + "@langchain/anthropic": "^0.3.15", + "@langchain/community": "^0.3.36", + "@langchain/core": "^0.3.42", + "@langchain/google-genai": "^0.1.12", + "@langchain/openai": "^0.0.25", + "@langchain/textsplitters": "^0.1.0", + "@tailwindcss/typography": "^0.5.12", + "@xenova/transformers": "^2.17.2", + "axios": "^1.8.3", + "better-sqlite3": "^11.9.1", + "clsx": "^2.1.0", + "compute-cosine-similarity": "^1.1.0", + "compute-dot": "^1.1.0", + "drizzle-orm": "^0.40.1", + "html-to-text": "^9.0.5", + "langchain": "^0.1.30", + "lucide-react": "^0.363.0", + "mammoth": "^1.7.0", + "markdown-to-jsx": "^7.7.2", + "next": "^15.2.2", + "next-themes": "^0.3.0", + "pdf-parse": "^1.1.1", + "react": "^18", + "react-dom": "^18", + "react-text-to-speech": "^0.14.5", + "react-textarea-autosize": "^8.5.3", + "sonner": "^1.4.41", + "tailwind-merge": "^2.2.2", + "winston": "^3.17.0", + "yet-another-react-lightbox": "^3.17.2", + "zod": "^3.22.4" + }, + "devDependencies": { + "@types/better-sqlite3": "^7.6.12", + "@types/html-to-text": "^9.0.4", + "@types/node": "^20", + "@types/pdf-parse": "^1.1.4", + "@types/react": "^18", + "@types/react-dom": "^18", + "autoprefixer": "^10.0.1", + "drizzle-kit": "^0.30.5", + "eslint": "^8", + "eslint-config-next": "14.1.4", + "postcss": "^8", + "prettier": "^3.2.5", + "tailwindcss": "^3.3.0", + "typescript": "^5" + } +} From 18da75ad9790e790c0672a8648fa2ec68c613d3a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 10:35:19 +0530 Subject: [PATCH 086/147] feat(db): create migration files --- drizzle/0000_fuzzy_randall.sql | 16 +++++ drizzle/meta/0000_snapshot.json | 116 ++++++++++++++++++++++++++++++++ drizzle/meta/_journal.json | 13 ++++ 3 files changed, 145 insertions(+) create mode 100644 drizzle/0000_fuzzy_randall.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/_journal.json diff --git a/drizzle/0000_fuzzy_randall.sql b/drizzle/0000_fuzzy_randall.sql new file mode 100644 index 0000000..0a2ff07 --- /dev/null +++ b/drizzle/0000_fuzzy_randall.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS `chats` ( + `id` text PRIMARY KEY NOT NULL, + `title` text NOT NULL, + `createdAt` text NOT NULL, + `focusMode` text NOT NULL, + `files` text DEFAULT '[]' +); +--> statement-breakpoint +CREATE TABLE IF NOT EXISTS `messages` ( + `id` integer PRIMARY KEY NOT NULL, + `content` text NOT NULL, + `chatId` text NOT NULL, + `messageId` text NOT NULL, + `type` text, + `metadata` text +); diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..850bcd3 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,116 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "ef3a044b-0f34-40b5-babb-2bb3a909ba27", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "chats": { + "name": "chats", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "focusMode": { + "name": "focusMode", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "files": { + "name": "files", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "messages": { + "name": "messages", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "chatId": { + "name": "chatId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "messageId": { + "name": "messageId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "metadata": { + "name": "metadata", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..5db59d1 --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1748405503809, + "tag": "0000_fuzzy_randall", + "breakpoints": true + } + ] +} From 876487ad1185f3aed2e18e73a54a33aea7609f94 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 10:41:12 +0530 Subject: [PATCH 087/147] feat(db): add migration script, migrate on each run --- app.dockerfile | 10 +++++++++- docker-compose.yaml | 1 + drizzle.config.ts | 3 ++- entrypoint.sh | 6 ++++++ src/lib/db/index.ts | 3 ++- src/lib/db/migrate.ts | 5 +++++ 6 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 entrypoint.sh create mode 100644 src/lib/db/migrate.ts diff --git a/app.dockerfile b/app.dockerfile index 3433288..c3c0fd0 100644 --- a/app.dockerfile +++ b/app.dockerfile @@ -12,6 +12,9 @@ COPY public ./public RUN mkdir -p /home/perplexica/data RUN yarn build +RUN yarn add --dev @vercel/ncc +RUN yarn ncc build ./src/lib/db/migrate.ts -o migrator + FROM node:20.18.0-slim WORKDIR /home/perplexica @@ -21,7 +24,12 @@ COPY --from=builder /home/perplexica/.next/static ./public/_next/static COPY --from=builder /home/perplexica/.next/standalone ./ COPY --from=builder /home/perplexica/data ./data +COPY drizzle ./drizzle +COPY --from=builder /home/perplexica/migrator/build ./build +COPY --from=builder /home/perplexica/migrator/index.js ./migrate.js RUN mkdir /home/perplexica/uploads -CMD ["node", "server.js"] \ No newline at end of file +COPY entrypoint.sh ./entrypoint.sh +RUN chmod +x ./entrypoint.sh +CMD ["./entrypoint.sh"] \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index b702b4e..b32e0a9 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -16,6 +16,7 @@ services: dockerfile: app.dockerfile environment: - SEARXNG_API_URL=http://searxng:8080 + - DATA_DIR=/home/perplexica ports: - 3000:3000 networks: diff --git a/drizzle.config.ts b/drizzle.config.ts index 58de9e0..a029112 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,10 +1,11 @@ import { defineConfig } from 'drizzle-kit'; +import path from 'path'; export default defineConfig({ dialect: 'sqlite', schema: './src/lib/db/schema.ts', out: './drizzle', dbCredentials: { - url: './data/db.sqlite', + url: path.join(process.cwd(), 'data', 'db.sqlite'), }, }); diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..9f9448a --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,6 @@ +#!/bin/sh +set -e + +node migrate.js + +exec node server.js \ No newline at end of file diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts index 9b761d4..515cdb3 100644 --- a/src/lib/db/index.ts +++ b/src/lib/db/index.ts @@ -3,7 +3,8 @@ import Database from 'better-sqlite3'; import * as schema from './schema'; import path from 'path'; -const sqlite = new Database(path.join(process.cwd(), 'data/db.sqlite')); +const DATA_DIR = process.env.DATA_DIR || process.cwd(); +const sqlite = new Database(path.join(DATA_DIR, './data/db.sqlite')); const db = drizzle(sqlite, { schema: schema, }); diff --git a/src/lib/db/migrate.ts b/src/lib/db/migrate.ts new file mode 100644 index 0000000..c3ebff6 --- /dev/null +++ b/src/lib/db/migrate.ts @@ -0,0 +1,5 @@ +import db from './'; +import { migrate } from 'drizzle-orm/better-sqlite3/migrator'; +import path from 'path'; + +migrate(db, { migrationsFolder: path.join(process.cwd(), 'drizzle') }); From bcebdb5fd98bc13413596659823b82be00685315 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 28 May 2025 13:01:05 +0530 Subject: [PATCH 088/147] feat(chat): allow export as pdf or markdown --- package.json | 2 + src/components/Navbar.tsx | 155 ++++++++++++++++++++++++++++++++++++-- yarn.lock | 144 +++++++++++++++++++++++++++++++++++ 3 files changed, 295 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index e68410f..5746fd3 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "compute-dot": "^1.1.0", "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", + "jspdf": "^3.0.1", "langchain": "^0.1.30", "lucide-react": "^0.363.0", "markdown-to-jsx": "^7.7.2", @@ -49,6 +50,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", + "@types/jspdf": "^2.0.0", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index 13f2da3..e406ade 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -1,8 +1,122 @@ -import { Clock, Edit, Share, Trash } from 'lucide-react'; +import { Clock, Edit, Share, Trash, FileText, FileDown } from 'lucide-react'; import { Message } from './ChatWindow'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, Fragment } from 'react'; import { formatTimeDifference } from '@/lib/utils'; import DeleteChat from './DeleteChat'; +import { + Popover, + PopoverButton, + PopoverPanel, + Transition, +} from '@headlessui/react'; +import jsPDF from 'jspdf'; + +const downloadFile = (filename: string, content: string, type: string) => { + const blob = new Blob([content], { type }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + setTimeout(() => { + document.body.removeChild(a); + URL.revokeObjectURL(url); + }, 0); +}; + +const exportAsMarkdown = (messages: Message[], title: string) => { + const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString(); + let md = `# 💬 Chat Export: ${title}\n\n`; + md += `*Exported on: ${date}*\n\n---\n`; + messages.forEach((msg, idx) => { + md += `\n---\n`; + md += `**${msg.role === 'user' ? '🧑 User' : '🤖 Assistant'}** +`; + md += `*${new Date(msg.createdAt).toLocaleString()}*\n\n`; + md += `> ${msg.content.replace(/\n/g, '\n> ')}\n`; + if (msg.sources && msg.sources.length > 0) { + md += `\n**Citations:**\n`; + msg.sources.forEach((src: any, i: number) => { + const url = src.metadata?.url || ''; + md += `- [${i + 1}] [${url}](${url})\n`; + }); + } + }); + md += '\n---\n'; + downloadFile(`${title || 'chat'}.md`, md, 'text/markdown'); +}; + +const exportAsPDF = (messages: Message[], title: string) => { + const doc = new jsPDF(); + const date = new Date(messages[0]?.createdAt || Date.now()).toLocaleString(); + let y = 15; + const pageHeight = doc.internal.pageSize.height; + doc.setFontSize(18); + doc.text(`Chat Export: ${title}`, 10, y); + y += 8; + doc.setFontSize(11); + doc.setTextColor(100); + doc.text(`Exported on: ${date}`, 10, y); + y += 8; + doc.setDrawColor(200); + doc.line(10, y, 200, y); + y += 6; + doc.setTextColor(30); + messages.forEach((msg, idx) => { + if (y > pageHeight - 30) { + doc.addPage(); + y = 15; + } + doc.setFont('helvetica', 'bold'); + doc.text(`${msg.role === 'user' ? 'User' : 'Assistant'}`, 10, y); + doc.setFont('helvetica', 'normal'); + doc.setFontSize(10); + doc.setTextColor(120); + doc.text(`${new Date(msg.createdAt).toLocaleString()}`, 40, y); + y += 6; + doc.setTextColor(30); + doc.setFontSize(12); + const lines = doc.splitTextToSize(msg.content, 180); + for (let i = 0; i < lines.length; i++) { + if (y > pageHeight - 20) { + doc.addPage(); + y = 15; + } + doc.text(lines[i], 12, y); + y += 6; + } + if (msg.sources && msg.sources.length > 0) { + doc.setFontSize(11); + doc.setTextColor(80); + if (y > pageHeight - 20) { + doc.addPage(); + y = 15; + } + doc.text('Citations:', 12, y); + y += 5; + msg.sources.forEach((src: any, i: number) => { + const url = src.metadata?.url || ''; + if (y > pageHeight - 15) { + doc.addPage(); + y = 15; + } + doc.text(`- [${i + 1}] ${url}`, 15, y); + y += 5; + }); + doc.setTextColor(30); + } + y += 6; + doc.setDrawColor(230); + if (y > pageHeight - 10) { + doc.addPage(); + y = 15; + } + doc.line(10, y, 200, y); + y += 4; + }); + doc.save(`${title || 'chat'}.pdf`); +}; const Navbar = ({ chatId, @@ -59,10 +173,39 @@ const Navbar = ({ <p className="hidden lg:flex">{title}</p> <div className="flex flex-row items-center space-x-4"> - <Share - size={17} - className="active:scale-95 transition duration-100 cursor-pointer" - /> + <Popover className="relative"> + <PopoverButton className="active:scale-95 transition duration-100 cursor-pointer p-2 rounded-full hover:bg-light-secondary dark:hover:bg-dark-secondary"> + <Share size={17} /> + </PopoverButton> + <Transition + as={Fragment} + enter="transition ease-out duration-100" + enterFrom="opacity-0 translate-y-1" + enterTo="opacity-100 translate-y-0" + leave="transition ease-in duration-75" + leaveFrom="opacity-100 translate-y-0" + leaveTo="opacity-0 translate-y-1" + > + <PopoverPanel className="absolute right-0 mt-2 w-64 rounded-xl shadow-xl bg-light-primary dark:bg-dark-primary border border-light-200 dark:border-dark-200 z-50"> + <div className="flex flex-col py-3 px-3 gap-2"> + <button + className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium" + onClick={() => exportAsMarkdown(messages, title || '')} + > + <FileText size={17} className="text-[#24A0ED]" /> + Export as Markdown + </button> + <button + className="flex items-center gap-2 px-4 py-2 text-left hover:bg-light-secondary dark:hover:bg-dark-secondary transition-colors text-black dark:text-white rounded-lg font-medium" + onClick={() => exportAsPDF(messages, title || '')} + > + <FileDown size={17} className="text-[#24A0ED]" /> + Export as PDF + </button> + </div> + </PopoverPanel> + </Transition> + </Popover> <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> </div> </div> diff --git a/yarn.lock b/yarn.lock index 921186b..58b53ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,11 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.3.tgz#10491113799fb8d77e1d9273384d5d68deeea8f6" + integrity sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw== + "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" @@ -966,6 +971,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jspdf@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/jspdf/-/jspdf-2.0.0.tgz#c64d63e9248a62849902085c1cd4753b33f8ee0c" + integrity sha512-oonYDXI4GegGaG7FFVtriJ+Yqlh4YR3L3NVDiwCEBVG7sbya19SoGx4MW4kg1MCMRPgkbbFTck8YKJL8PrkDfA== + dependencies: + jspdf "*" + "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -1010,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/raf@^3.4.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" + integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -1035,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/uuid@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" @@ -1317,6 +1339,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + autoprefixer@^10.0.1: version "10.4.19" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" @@ -1405,6 +1432,11 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1476,6 +1508,11 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1532,6 +1569,20 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== +canvg@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" + integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/raf" "^3.4.0" + core-js "^3.8.3" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + rgbcolor "^1.0.1" + stackblur-canvas "^2.0.0" + svg-pathdata "^6.0.3" + chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1691,6 +1742,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-js@^3.6.0, core-js@^3.8.3: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1705,6 +1761,13 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -1881,6 +1944,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^3.0.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -2424,6 +2494,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fflate@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2761,6 +2836,14 @@ html-to-text@^9.0.5: htmlparser2 "^8.0.2" selderee "^0.11.0" +html2canvas@^1.0.0-rc.5: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + htmlparser2@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -3123,6 +3206,21 @@ jsonpointer@^5.0.1: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jspdf@*, jspdf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" + integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== + dependencies: + "@babel/runtime" "^7.26.7" + atob "^2.1.2" + btoa "^1.2.1" + fflate "^0.8.1" + optionalDependencies: + canvg "^3.0.11" + core-js "^3.6.0" + dompurify "^3.2.4" + html2canvas "^1.0.0-rc.5" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -3823,6 +3921,11 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4002,6 +4105,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4082,6 +4192,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -4135,6 +4250,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rgbcolor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4370,6 +4490,11 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stackblur-canvas@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" + integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -4538,6 +4663,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-pathdata@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" + integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -4636,6 +4766,13 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4822,6 +4959,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" From 41fc5274ffc2fa6563db18c8aad94cccd0e0a627 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 29 May 2025 19:13:20 +0530 Subject: [PATCH 089/147] feat(package): update package files --- package.json | 4 +- yarn.lock | 152 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 151 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 147348c..a8fd416 100644 --- a/package.json +++ b/package.json @@ -30,9 +30,10 @@ "compute-dot": "^1.1.0", "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", + "jspdf": "^3.0.1", "langchain": "^0.1.30", "lucide-react": "^0.363.0", - "mammoth": "^1.7.0", + "mammoth": "^1.9.1", "markdown-to-jsx": "^7.7.2", "next": "^15.2.2", "next-themes": "^0.3.0", @@ -50,6 +51,7 @@ "devDependencies": { "@types/better-sqlite3": "^7.6.12", "@types/html-to-text": "^9.0.4", + "@types/jspdf": "^2.0.0", "@types/node": "^20", "@types/pdf-parse": "^1.1.4", "@types/react": "^18", diff --git a/yarn.lock b/yarn.lock index ffd6648..f2b847c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -40,6 +40,11 @@ node-fetch "^2.6.7" web-streams-polyfill "^3.2.1" +"@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.3.tgz#10491113799fb8d77e1d9273384d5d68deeea8f6" + integrity sha512-7EYtGezsdiDMyY80+65EzwiGmcJqpmcZCojSXaRgdrBaGtWTgDZKq69cPIVped6MkIM78cTQ2GOiEYjwOlG4xw== + "@babel/runtime@^7.20.13", "@babel/runtime@^7.23.2", "@babel/runtime@^7.24.0": version "7.24.4" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" @@ -966,6 +971,13 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== +"@types/jspdf@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/jspdf/-/jspdf-2.0.0.tgz#c64d63e9248a62849902085c1cd4753b33f8ee0c" + integrity sha512-oonYDXI4GegGaG7FFVtriJ+Yqlh4YR3L3NVDiwCEBVG7sbya19SoGx4MW4kg1MCMRPgkbbFTck8YKJL8PrkDfA== + dependencies: + jspdf "*" + "@types/long@^4.0.1": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" @@ -1010,6 +1022,11 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6" integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/raf@^3.4.0": + version "3.4.3" + resolved "https://registry.yarnpkg.com/@types/raf/-/raf-3.4.3.tgz#85f1d1d17569b28b8db45e16e996407a56b0ab04" + integrity sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw== + "@types/react-dom@^18": version "18.2.24" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.24.tgz#8dda8f449ae436a7a6e91efed8035d4ab03ff759" @@ -1035,6 +1052,11 @@ resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/uuid@^10.0.0": version "10.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" @@ -1329,6 +1351,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + autoprefixer@^10.0.1: version "10.4.19" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" @@ -1417,6 +1444,11 @@ base-64@^0.1.0: resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -1493,6 +1525,11 @@ browserslist@^4.23.0: node-releases "^2.0.14" update-browserslist-db "^1.0.13" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1549,6 +1586,20 @@ caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001606.tgz#b4d5f67ab0746a3b8b5b6d1f06e39c51beb39a9e" integrity sha512-LPbwnW4vfpJId225pwjZJOgX1m9sGfbw/RKJvw/t0QhYOOaTXHvkjVGFGPpvwEzufrjvTlsULnVTxdy4/6cqkg== +canvg@^3.0.11: + version "3.0.11" + resolved "https://registry.yarnpkg.com/canvg/-/canvg-3.0.11.tgz#4b4290a6c7fa36871fac2b14e432eff33b33cf2b" + integrity sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA== + dependencies: + "@babel/runtime" "^7.12.5" + "@types/raf" "^3.4.0" + core-js "^3.8.3" + raf "^3.4.1" + regenerator-runtime "^0.13.7" + rgbcolor "^1.0.1" + stackblur-canvas "^2.0.0" + svg-pathdata "^6.0.3" + chalk@^4.0.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1708,6 +1759,11 @@ console-table-printer@^2.12.1: dependencies: simple-wcswidth "^1.0.1" +core-js@^3.6.0, core-js@^3.8.3: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== + core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1727,6 +1783,13 @@ crypt@0.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + cssesc@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" @@ -1908,6 +1971,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.2.4: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" + integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^3.0.1: version "3.2.2" resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" @@ -2458,6 +2528,11 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== +fflate@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -2795,6 +2870,14 @@ html-to-text@^9.0.5: htmlparser2 "^8.0.2" selderee "^0.11.0" +html2canvas@^1.0.0-rc.5: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + htmlparser2@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" @@ -3167,6 +3250,21 @@ jsonpointer@^5.0.1: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== +jspdf@*, jspdf@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" + integrity sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg== + dependencies: + "@babel/runtime" "^7.26.7" + atob "^2.1.2" + btoa "^1.2.1" + fflate "^0.8.1" + optionalDependencies: + canvg "^3.0.11" + core-js "^3.6.0" + dompurify "^3.2.4" + html2canvas "^1.0.0-rc.5" + "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -3388,10 +3486,10 @@ lucide-react@^0.363.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.363.0.tgz#2bb1f9d09b830dda86f5118fcd097f87247fe0e3" integrity sha512-AlsfPCsXQyQx7wwsIgzcKOL9LwC498LIMAo+c0Es5PkHJa33xwmYAkkSoKoJWWWSYQEStqu58/jT4tL2gi32uQ== -mammoth@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.0.tgz#71e34ca280735275788bfe95e653a058dcab4df2" - integrity sha512-F+0NxzankQV9XSUAuVKvkdQK0GbtGGuqVnND9aVf9VSeUA82LQa29GjLqYU6Eez8LHqSJG3eGiDW3224OKdpZg== +mammoth@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/mammoth/-/mammoth-1.9.1.tgz#b544c26747a412b5b00a11aa80477c6796860eaf" + integrity sha512-4S2v1eP4Yo4so0zGNicJKcP93su3wDPcUk+xvkjSG75nlNjSkDJu8BhWQ+e54BROM0HfA6nPzJn12S6bq2Ko6w== dependencies: "@xmldom/xmldom" "^0.8.6" argparse "~1.0.3" @@ -3919,6 +4017,11 @@ peberminta@^0.9.0: resolved "https://registry.yarnpkg.com/peberminta/-/peberminta-0.9.0.tgz#8ec9bc0eb84b7d368126e71ce9033501dca2a352" integrity sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ== +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -4103,6 +4206,13 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -4196,6 +4306,11 @@ reflect.getprototypeof@^1.0.4: globalthis "^1.0.3" which-builtin-type "^1.1.3" +regenerator-runtime@^0.13.7: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" @@ -4249,6 +4364,11 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rgbcolor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" + integrity sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw== + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -4499,6 +4619,11 @@ stack-trace@0.0.x: resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== +stackblur-canvas@^2.0.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz#af931277d0b5096df55e1f91c530043e066989b6" + integrity sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -4674,6 +4799,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-pathdata@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" + integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== + tabbable@^6.0.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" @@ -4772,6 +4902,13 @@ text-hex@1.0.x: resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -4963,6 +5100,13 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" From 91306dc0c7b49c50f0af573855a7fdc898a1df17 Mon Sep 17 00:00:00 2001 From: alckasoc <tuvincent0106@gmail.com> Date: Thu, 29 May 2025 18:26:36 -0700 Subject: [PATCH 090/147] update gemini 2.5 pro key --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6cf2243..29b33b5 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -15,7 +15,7 @@ import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ { displayName: 'Gemini 2.5 Pro Experimental', - key: 'gemini-2.5-pro-exp-03-25', + key: 'gemini-2.5-pro-preview-05-06', }, { displayName: 'Gemini 2.0 Flash', From 117a683d9a0cf7726aec24d5a0f688a7de00afa8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:34:47 +0530 Subject: [PATCH 091/147] feat(assets): add weather icons --- public/weather/clear-day.svg | 131 ++++++ public/weather/clear-night.svg | 159 ++++++++ public/weather/cloudy-1-day.svg | 178 +++++++++ public/weather/cloudy-1-night.svg | 206 ++++++++++ public/weather/fog-day.svg | 244 ++++++++++++ public/weather/fog-night.svg | 309 +++++++++++++++ public/weather/frost-day.svg | 204 ++++++++++ public/weather/frost-night.svg | 269 +++++++++++++ public/weather/rain-and-sleet-mix.svg | 141 +++++++ public/weather/rainy-1-day.svg | 179 +++++++++ public/weather/rainy-1-night.svg | 243 ++++++++++++ public/weather/rainy-2-day.svg | 204 ++++++++++ public/weather/rainy-2-night.svg | 256 ++++++++++++ public/weather/rainy-3-day.svg | 206 ++++++++++ public/weather/rainy-3-night.svg | 270 +++++++++++++ .../weather/scattered-thunderstorms-day.svg | 374 ++++++++++++++++++ .../weather/scattered-thunderstorms-night.svg | 283 +++++++++++++ public/weather/severe-thunderstorm.svg | 307 ++++++++++++++ public/weather/snowy-1-day.svg | 241 +++++++++++ public/weather/snowy-1-night.svg | 269 +++++++++++++ public/weather/snowy-2-day.svg | 273 +++++++++++++ public/weather/snowy-2-night.svg | 301 ++++++++++++++ public/weather/snowy-3-day.svg | 334 ++++++++++++++++ public/weather/snowy-3-night.svg | 361 +++++++++++++++++ 24 files changed, 5942 insertions(+) create mode 100644 public/weather/clear-day.svg create mode 100644 public/weather/clear-night.svg create mode 100644 public/weather/cloudy-1-day.svg create mode 100644 public/weather/cloudy-1-night.svg create mode 100644 public/weather/fog-day.svg create mode 100644 public/weather/fog-night.svg create mode 100644 public/weather/frost-day.svg create mode 100644 public/weather/frost-night.svg create mode 100644 public/weather/rain-and-sleet-mix.svg create mode 100644 public/weather/rainy-1-day.svg create mode 100644 public/weather/rainy-1-night.svg create mode 100644 public/weather/rainy-2-day.svg create mode 100644 public/weather/rainy-2-night.svg create mode 100644 public/weather/rainy-3-day.svg create mode 100644 public/weather/rainy-3-night.svg create mode 100644 public/weather/scattered-thunderstorms-day.svg create mode 100644 public/weather/scattered-thunderstorms-night.svg create mode 100644 public/weather/severe-thunderstorm.svg create mode 100644 public/weather/snowy-1-day.svg create mode 100644 public/weather/snowy-1-night.svg create mode 100644 public/weather/snowy-2-day.svg create mode 100644 public/weather/snowy-2-night.svg create mode 100644 public/weather/snowy-3-day.svg create mode 100644 public/weather/snowy-3-night.svg diff --git a/public/weather/clear-day.svg b/public/weather/clear-day.svg new file mode 100644 index 0000000..d97d28b --- /dev/null +++ b/public/weather/clear-day.svg @@ -0,0 +1,131 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.34167" y="-.34167" width="1.6833" height="1.85"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/clear-night.svg b/public/weather/clear-night.svg new file mode 100644 index 0000000..005ac63 --- /dev/null +++ b/public/weather/clear-night.svg @@ -0,0 +1,159 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.3038" y="-.3318" width="1.6076" height="1.894"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + ]]> + </style> + </defs> + <g id="night" transform="translate(-4,-18)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .78534 36 20.022)" stroke-width="1.2616"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5" fill="#ffa500" stroke-miterlimit="10" + stroke-width="1.4105" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5" + fill="#ffa500" stroke-miterlimit="10" stroke-width="1.4105" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2.5232" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/cloudy-1-day.svg b/public/weather/cloudy-1-day.svg new file mode 100644 index 0000000..823fea1 --- /dev/null +++ b/public/weather/cloudy-1-day.svg @@ -0,0 +1,178 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.28472" width="1.403" height="1.6944"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/cloudy-1-night.svg b/public/weather/cloudy-1-night.svg new file mode 100644 index 0000000..3fe1541 --- /dev/null +++ b/public/weather/cloudy-1-night.svg @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.19471" y="-.26087" width="1.3744" height="1.6884"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#c6deff" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/fog-day.svg b/public/weather/fog-day.svg new file mode 100644 index 0000000..ed834cf --- /dev/null +++ b/public/weather/fog-day.svg @@ -0,0 +1,244 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** FOG +*/ + @keyframes am-weather-fog-1 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(7px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-1 { + -webkit-animation-name: am-weather-fog-1; + -moz-animation-name: am-weather-fog-1; + -ms-animation-name: am-weather-fog-1; + animation-name: am-weather-fog-1; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-2 { + 0% { + transform: translate(0px, 0px) + } + + 21.05% { + transform: translate(-6px, 0px) + } + + 78.95% { + transform: translate(9px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-2 { + -webkit-animation-name: am-weather-fog-2; + -moz-animation-name: am-weather-fog-2; + -ms-animation-name: am-weather-fog-2; + animation-name: am-weather-fog-2; + -webkit-animation-duration: 20s; + -moz-animation-duration: 20s; + -ms-animation-duration: 20s; + animation-duration: 20s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-3 { + 0% { + transform: translate(0px, 0px) + } + + 25% { + transform: translate(4px, 0px) + } + + 75% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-3 { + -webkit-animation-name: am-weather-fog-3; + -moz-animation-name: am-weather-fog-3; + -ms-animation-name: am-weather-fog-3; + animation-name: am-weather-fog-3; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-4 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-4 { + -webkit-animation-name: am-weather-fog-4; + -moz-animation-name: am-weather-fog-4; + -ms-animation-name: am-weather-fog-4; + animation-name: am-weather-fog-4; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" />F + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" /> + </g> + </g> + <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" /> + <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" /> + <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" /> + <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/fog-night.svg b/public/weather/fog-night.svg new file mode 100644 index 0000000..d59f98f --- /dev/null +++ b/public/weather/fog-night.svg @@ -0,0 +1,309 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** FOG +*/ + @keyframes am-weather-fog-1 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(7px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-1 { + -webkit-animation-name: am-weather-fog-1; + -moz-animation-name: am-weather-fog-1; + -ms-animation-name: am-weather-fog-1; + animation-name: am-weather-fog-1; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-2 { + 0% { + transform: translate(0px, 0px) + } + + 21.05% { + transform: translate(-6px, 0px) + } + + 78.95% { + transform: translate(9px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-2 { + -webkit-animation-name: am-weather-fog-2; + -moz-animation-name: am-weather-fog-2; + -ms-animation-name: am-weather-fog-2; + animation-name: am-weather-fog-2; + -webkit-animation-duration: 20s; + -moz-animation-duration: 20s; + -ms-animation-duration: 20s; + animation-duration: 20s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-3 { + 0% { + transform: translate(0px, 0px) + } + + 25% { + transform: translate(4px, 0px) + } + + 75% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-3 { + -webkit-animation-name: am-weather-fog-3; + -moz-animation-name: am-weather-fog-3; + -ms-animation-name: am-weather-fog-3; + animation-name: am-weather-fog-3; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-fog-4 { + 0% { + transform: translate(0px, 0px) + } + + 50% { + transform: translate(-4px, 0px) + } + + 100% { + transform: translate(0px, 0px) + } + } + + .am-weather-fog-4 { + -webkit-animation-name: am-weather-fog-4; + -moz-animation-name: am-weather-fog-4; + -ms-animation-name: am-weather-fog-4; + animation-name: am-weather-fog-4; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffc04a" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-fog" transform="translate(-10,20)" fill="none" stroke="#c6deff" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-fog-1" y1="0" y2="0" x1="1" x2="37" stroke-dasharray="3, 5, 17, 5, 7" /> + <line class="am-weather-fog-2" y1="5" y2="5" x1="9" x2="33" stroke-dasharray="11, 7, 15" /> + <line class="am-weather-fog-3" y1="10" y2="10" x1="5" x2="40" stroke-dasharray="11, 7, 3, 5, 9" /> + <line class="am-weather-fog-4" y1="15" y2="15" x1="7" x2="42" stroke-dasharray="13, 5, 9, 5, 3" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/frost-day.svg b/public/weather/frost-day.svg new file mode 100644 index 0000000..16d591c --- /dev/null +++ b/public/weather/frost-day.svg @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** FROST +*/ + @keyframes am-weather-frost { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 1% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 3% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 5% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 7% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 9% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 11% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 13% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 15% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-frost { + -webkit-animation-name: am-weather-frost; + -moz-animation-name: am-weather-frost; + animation-name: am-weather-frost; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" />F + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffc04a" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffc04a" stroke="#ffc04a" stroke-width="2" /> + </g> + </g> + <g transform="translate(-16,4)"> + <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2" + stroke-linecap="round" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear"> + <path d="M11,32H45" /> + <path d="M15.5,37H40.5" /> + <path d="M22.5,42H33.5" /> + </g> + <g> + <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round" + d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/frost-night.svg b/public/weather/frost-night.svg new file mode 100644 index 0000000..ff2c8dc --- /dev/null +++ b/public/weather/frost-night.svg @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** FROST +*/ + @keyframes am-weather-frost { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 1% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 3% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 5% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 7% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 9% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 11% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 13% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 15% { + -webkit-transform: translate(-0.3px, 0.0px); + -moz-transform: translate(-0.3px, 0.0px); + -ms-transform: translate(-0.3px, 0.0px); + transform: translate(-0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-frost { + -webkit-animation-name: am-weather-frost; + -moz-animation-name: am-weather-frost; + animation-name: am-weather-frost; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffc04a" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffc04a" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffc04a" stroke="#ffc04a" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g transform="translate(-16,4)"> + <g class="am-weather-frost" stroke="#57a0ee" transform="translate(0,2)" fill="none" stroke-width="2" + stroke-linecap="round" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-frost;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-frost;-webkit-animation-timing-function:linear"> + <path d="M11,32H45" /> + <path d="M15.5,37H40.5" /> + <path d="M22.5,42H33.5" /> + </g> + <g> + <path stroke="#57a0ee" transform="translate(0,0)" fill="none" stroke-width="2" stroke-linecap="round" + d="M28,31V9M28,22l11,-3.67M34,20l2,-4M34,20l4,2M28,22l-11,-3.67M22,20l-2,-4M22,20l-4,2M28,14.27l3.01,-3.02M28,14.27l-3.01,-3.02" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rain-and-sleet-mix.svg b/public/weather/rain-and-sleet-mix.svg new file mode 100644 index 0000000..172010d --- /dev/null +++ b/public/weather/rain-and-sleet-mix.svg @@ -0,0 +1,141 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Mix of Rain and Sleet | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22776" width="1.4937" height="1.5756"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-3;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-3;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-sleet-2" transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" + stroke-linecap="round"> + <line class="am-weather-rain-1" transform="translate(-5,1)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(5)" y2="8" stroke-dasharray="0.1, 7" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + <g class="am-weather-rain-3" transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-13,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(-3,2)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(7,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-1-day.svg b/public/weather/rainy-1-day.svg new file mode 100644 index 0000000..2faf06e --- /dev/null +++ b/public/weather/rainy-1-day.svg @@ -0,0 +1,179 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-1-night.svg b/public/weather/rainy-1-night.svg new file mode 100644 index 0000000..ee8ffd8 --- /dev/null +++ b/public/weather/rainy-1-night.svg @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.21122" width="1.403" height="1.4997"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weaher-rain-1" transform="translate(-20,-10) rotate(10,-238.68,233.96)"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-2-day.svg b/public/weather/rainy-2-day.svg new file mode 100644 index 0000000..affdfff --- /dev/null +++ b/public/weather/rainy-2-day.svg @@ -0,0 +1,204 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.20592" width="1.403" height="1.4872"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-245.89,217.31)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 7" stroke-linecap="round" + stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-6,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-2-night.svg b/public/weather/rainy-2-night.svg new file mode 100644 index 0000000..9c3ae20 --- /dev/null +++ b/public/weather/rainy-2-night.svg @@ -0,0 +1,256 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g class="layer" transform="translate(16,-2)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-rain-2" transform="translate(-20,-10) rotate(10,34,46)" fill="none" stroke="#91c0f8" + stroke-dasharray="4, 7" stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-6,1)" x1="34" x2="34" y1="46" y2="54" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" x1="34" x2="34" y1="46" y2="54" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-3-day.svg b/public/weather/rainy-3-day.svg new file mode 100644 index 0000000..b0b5754 --- /dev/null +++ b/public/weather/rainy-3-day.svg @@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" stroke="#ffa500" stroke-linecap="round" stroke-width="2" fifll="none" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4" + stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(4)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/rainy-3-night.svg b/public/weather/rainy-3-night.svg new file mode 100644 index 0000000..4078e7d --- /dev/null +++ b/public/weather/rainy-3-night.svg @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.22892" width="1.4937" height="1.5576"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** RAIN +*/ + @keyframes am-weather-rain { + 0% { + stroke-dashoffset: 0; + } + + 100% { + stroke-dashoffset: -100; + } + } + + .am-weather-rain-1 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-rain-2 { + -webkit-animation-name: am-weather-rain; + -moz-animation-name: am-weather-rain; + -ms-animation-name: am-weather-rain; + animation-name: am-weather-rain; + -webkit-animation-delay: 0.25s; + -moz-animation-delay: 0.25s; + -ms-animation-delay: 0.25s; + animation-delay: 0.25s; + -webkit-animation-duration: 8s; + -moz-animation-duration: 8s; + -ms-animation-duration: 8s; + animation-duration: 8s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="translate(-20,-10) rotate(10,-247.39,200.17)" fill="none" stroke="#91c0f8" stroke-dasharray="4, 4" + stroke-linecap="round" stroke-width="2"> + <line class="am-weather-rain-1" transform="translate(-4,1)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-2" transform="translate(0,-1)" y2="8" + style="-moz-animation-delay:0.25s;-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-delay:0.25s;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-delay:0.25s;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + <line class="am-weather-rain-1" transform="translate(4)" y2="8" + style="-moz-animation-duration:8s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-rain;-moz-animation-timing-function:linear;-ms-animation-duration:8s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-rain;-ms-animation-timing-function:linear;-webkit-animation-duration:8s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-rain;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/scattered-thunderstorms-day.svg b/public/weather/scattered-thunderstorms-day.svg new file mode 100644 index 0000000..0cfbccc --- /dev/null +++ b/public/weather/scattered-thunderstorms-day.svg @@ -0,0 +1,374 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g id="thunder" transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" + fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/scattered-thunderstorms-night.svg b/public/weather/scattered-thunderstorms-night.svg new file mode 100644 index 0000000..72cf7a6 --- /dev/null +++ b/public/weather/scattered-thunderstorms-night.svg @@ -0,0 +1,283 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Scattered Thunderstorms | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.1975" width="1.403" height="1.4766"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g id="thunder" transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="3.3 1.5 4 2.7 5.2 3.3 4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-lightning" transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" + fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/severe-thunderstorm.svg b/public/weather/severe-thunderstorm.svg new file mode 100644 index 0000000..223198b --- /dev/null +++ b/public/weather/severe-thunderstorm.svg @@ -0,0 +1,307 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<!-- Severe Thunderstorm | Contributed by hsoJ95 on GitHub: https://github.com/hsoj95 --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.17571" y="-.19575" width="1.3379" height="1.4959"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-3 { + 0% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + + 50% { + -webkit-transform: translate(10px, 0px); + -moz-transform: translate(10px, 0px); + -ms-transform: translate(10px, 0px); + transform: translate(10px, 0px); + } + + 100% { + -webkit-transform: translate(-5px, 0px); + -moz-transform: translate(-5px, 0px); + -ms-transform: translate(-5px, 0px); + transform: translate(-5px, 0px); + } + } + + .am-weather-cloud-3 { + -webkit-animation-name: am-weather-cloud-3; + -moz-animation-name: am-weather-cloud-3; + animation-name: am-weather-cloud-3; + -webkit-animation-duration: 7s; + -moz-animation-duration: 7s; + animation-duration: 7s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-cloud-1 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-1 { + -webkit-animation-name: am-weather-cloud-1; + -moz-animation-name: am-weather-cloud-1; + animation-name: am-weather-cloud-1; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** STROKE +*/ + + @keyframes am-weather-stroke { + 0% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 2% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 4% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 6% { + -webkit-transform: translate(0.5px, 0.4px); + -moz-transform: translate(0.5px, 0.4px); + -ms-transform: translate(0.5px, 0.4px); + transform: translate(0.5px, 0.4px); + } + + 8% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 10% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 12% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 14% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 16% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 18% { + -webkit-transform: translate(0.3px, 0.0px); + -moz-transform: translate(0.3px, 0.0px); + -ms-transform: translate(0.3px, 0.0px); + transform: translate(0.3px, 0.0px); + } + + 20% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 22% { + -webkit-transform: translate(1px, 0.0px); + -moz-transform: translate(1px, 0.0px); + -ms-transform: translate(1px, 0.0px); + transform: translate(1px, 0.0px); + } + + 24% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 26% { + -webkit-transform: translate(-1px, 0.0px); + -moz-transform: translate(-1px, 0.0px); + -ms-transform: translate(-1px, 0.0px); + transform: translate(-1px, 0.0px); + } + + 28% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 40% { + fill: orange; + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + + 65% { + fill: white; + -webkit-transform: translate(-1px, 5.0px); + -moz-transform: translate(-1px, 5.0px); + -ms-transform: translate(-1px, 5.0px); + transform: translate(-1px, 5.0px); + } + + 61% { + fill: orange; + } + + 100% { + -webkit-transform: translate(0.0px, 0.0px); + -moz-transform: translate(0.0px, 0.0px); + -ms-transform: translate(0.0px, 0.0px); + transform: translate(0.0px, 0.0px); + } + } + + .am-weather-stroke { + -webkit-animation-name: am-weather-stroke; + -moz-animation-name: am-weather-stroke; + animation-name: am-weather-stroke; + -webkit-animation-duration: 1.11s; + -moz-animation-duration: 1.11s; + animation-duration: 1.11s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes error { + 0% { + fill: #cc0000; + } + + 50% { + fill: #ff0000; + } + + 100% { + fill: #cc0000; + } + } + + #Shape { + -webkit-animation-name: error; + -moz-animation-name: error; + animation-name: error; + -webkit-animation-duration: 1s; + -moz-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g class="am-weather-cloud-1" + style="-moz-animation-duration:7s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-1;-moz-animation-timing-function:linear;-webkit-animation-duration:7s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-1;-webkit-animation-timing-function:linear"> + <path transform="matrix(.6 0 0 .6 -10 -6)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#666" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-cloud-3"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#333" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g transform="matrix(1.2,0,0,1.2,-4,28)"> + <polygon class="am-weather-stroke" + points="11.1 6.9 14.3 -2.9 20.5 -2.9 16.4 4.3 20.3 4.3 11.5 14.6 14.9 6.9" fill="#ffa500" stroke="#fff" + style="-moz-animation-duration:1.11s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-stroke;-moz-animation-timing-function:linear;-webkit-animation-duration:1.11s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-stroke;-webkit-animation-timing-function:linear" /> + </g> + <g class="warning" transform="translate(20,30)"> + <path + d="m7.7791 2.906-5.9912 10.117c-0.56283 0.95042-0.24862 2.1772 0.7018 2.74 0.30853 0.18271 0.66051 0.27911 1.0191 0.27911h11.982c1.1046 0 2-0.89543 2-2 0-0.35857-0.0964-0.71056-0.27911-1.0191l-5.9912-10.117c-0.56283-0.95042-1.7896-1.2646-2.74-0.7018-0.28918 0.17125-0.53055 0.41262-0.7018 0.7018z" + fill="#c00" /> + <path d="m9.5 10.5v-5" stroke="#fff" stroke-linecap="round" stroke-width="1.5" /> + <circle cx="9.5" cy="13" r="1" fill="#fff" /> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-1-day.svg b/public/weather/snowy-1-day.svg new file mode 100644 index 0000000..fb73943 --- /dev/null +++ b/public/weather/snowy-1-day.svg @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" transform="translate(0,16)" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-1-night.svg b/public/weather/snowy-1-night.svg new file mode 100644 index 0000000..039ea2e --- /dev/null +++ b/public/weather/snowy-1-night.svg @@ -0,0 +1,269 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(12,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-2-day.svg b/public/weather/snowy-2-day.svg new file mode 100644 index 0000000..323a616 --- /dev/null +++ b/public/weather/snowy-2-day.svg @@ -0,0 +1,273 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-2-night.svg b/public/weather/snowy-2-night.svg new file mode 100644 index 0000000..10dcbfa --- /dev/null +++ b/public/weather/snowy-2-night.svg @@ -0,0 +1,301 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.20655" y="-.23099" width="1.403" height="1.5634"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-3" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(7,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(16,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-3-day.svg b/public/weather/snowy-3-day.svg new file mode 100644 index 0000000..846c17a --- /dev/null +++ b/public/weather/snowy-3-day.svg @@ -0,0 +1,334 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SUN +*/ + @keyframes am-weather-sun { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(360deg); + -moz-transform: rotate(360deg); + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } + } + + .am-weather-sun { + -webkit-animation-name: am-weather-sun; + -moz-animation-name: am-weather-sun; + -ms-animation-name: am-weather-sun; + animation-name: am-weather-sun; + -webkit-animation-duration: 9s; + -moz-animation-duration: 9s; + -ms-animation-duration: 9s; + animation-duration: 9s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + @keyframes am-weather-sun-shiny { + 0% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + + 50% { + stroke-dasharray: 0.1px 10px; + stroke-dashoffset: -1px; + } + + 100% { + stroke-dasharray: 3px 10px; + stroke-dashoffset: 0px; + } + } + + .am-weather-sun-shiny line { + -webkit-animation-name: am-weather-sun-shiny; + -moz-animation-name: am-weather-sun-shiny; + -ms-animation-name: am-weather-sun-shiny; + animation-name: am-weather-sun-shiny; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + @keyframes am-weather-snow-reverse { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(1.2px) translateY(2px); + -moz-transform: translateX(1.2px) translateY(2px); + -ms-transform: translateX(1.2px) translateY(2px); + transform: translateX(1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(-1.4px) translateY(4px); + -moz-transform: translateX(-1.4px) translateY(4px); + -ms-transform: translateX(-1.4px) translateY(4px); + transform: translateX(-1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(1.6px) translateY(6px); + -moz-transform: translateX(1.6px) translateY(6px); + -ms-transform: translateX(1.6px) translateY(6px); + transform: translateX(1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-3 { + -webkit-animation-name: am-weather-snow-reverse; + -moz-animation-name: am-weather-snow-reverse; + -ms-animation-name: am-weather-snow-reverse; + animation-name: am-weather-snow-reverse; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="translate(0,16)"> + <g class="am-weather-sun" + style="-moz-animation-duration:9s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-sun;-moz-animation-timing-function:linear;-ms-animation-duration:9s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-sun;-ms-animation-timing-function:linear;-webkit-animation-duration:9s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-sun;-webkit-animation-timing-function:linear"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + <g transform="rotate(45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(135)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="scale(-1)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(225)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-90)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + <g transform="rotate(-45)"> + <line transform="translate(0,9)" y2="3" fill="none" stroke="#ffa500" stroke-linecap="round" + stroke-width="2" /> + </g> + </g> + <circle r="5" fill="#ffa500" stroke="#ffa500" stroke-width="2" /> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-3" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear"> + <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/weather/snowy-3-night.svg b/public/weather/snowy-3-night.svg new file mode 100644 index 0000000..b3c8c24 --- /dev/null +++ b/public/weather/snowy-3-night.svg @@ -0,0 +1,361 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- (c) ammap.com | SVG weather icons --> +<svg width="56" height="48" version="1.1" xmlns="http://www.w3.org/2000/svg"> + <defs> + <filter id="blur" x="-.24684" y="-.26897" width="1.4937" height="1.6759"> + <feGaussianBlur in="SourceAlpha" stdDeviation="3" /> + <feOffset dx="0" dy="4" result="offsetblur" /> + <feComponentTransfer> + <feFuncA slope="0.05" type="linear" /> + </feComponentTransfer> + <feMerge> + <feMergeNode /> + <feMergeNode in="SourceGraphic" /> + </feMerge> + </filter> + <style type="text/css"> + <![CDATA[ + /* +** CLOUDS +*/ + @keyframes am-weather-cloud-2 { + 0% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + + 50% { + -webkit-transform: translate(2px, 0px); + -moz-transform: translate(2px, 0px); + -ms-transform: translate(2px, 0px); + transform: translate(2px, 0px); + } + + 100% { + -webkit-transform: translate(0px, 0px); + -moz-transform: translate(0px, 0px); + -ms-transform: translate(0px, 0px); + transform: translate(0px, 0px); + } + } + + .am-weather-cloud-2 { + -webkit-animation-name: am-weather-cloud-2; + -moz-animation-name: am-weather-cloud-2; + animation-name: am-weather-cloud-2; + -webkit-animation-duration: 3s; + -moz-animation-duration: 3s; + animation-duration: 3s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + /* +** MOON +*/ + @keyframes am-weather-moon { + 0% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + + 50% { + -webkit-transform: rotate(15deg); + -moz-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -moz-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } + } + + .am-weather-moon { + -webkit-animation-name: am-weather-moon; + -moz-animation-name: am-weather-moon; + -ms-animation-name: am-weather-moon; + animation-name: am-weather-moon; + -webkit-animation-duration: 6s; + -moz-animation-duration: 6s; + -ms-animation-duration: 6s; + animation-duration: 6s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + -webkit-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -moz-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + -ms-transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + transform-origin: 12.5px 15.15px 0; + /* TODO FF CENTER ISSUE */ + } + + @keyframes am-weather-moon-star-1 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-1 { + -webkit-animation-name: am-weather-moon-star-1; + -moz-animation-name: am-weather-moon-star-1; + -ms-animation-name: am-weather-moon-star-1; + animation-name: am-weather-moon-star-1; + -webkit-animation-delay: 3s; + -moz-animation-delay: 3s; + -ms-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-duration: 5s; + -moz-animation-duration: 5s; + -ms-animation-duration: 5s; + animation-duration: 5s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + @keyframes am-weather-moon-star-2 { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } + } + + .am-weather-moon-star-2 { + -webkit-animation-name: am-weather-moon-star-2; + -moz-animation-name: am-weather-moon-star-2; + -ms-animation-name: am-weather-moon-star-2; + animation-name: am-weather-moon-star-2; + -webkit-animation-delay: 5s; + -moz-animation-delay: 5s; + -ms-animation-delay: 5s; + animation-delay: 5s; + -webkit-animation-duration: 4s; + -moz-animation-duration: 4s; + -ms-animation-duration: 4s; + animation-duration: 4s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: 1; + -moz-animation-iteration-count: 1; + -ms-animation-iteration-count: 1; + animation-iteration-count: 1; + } + + /* +** SNOW +*/ + @keyframes am-weather-snow { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(-1.2px) translateY(2px); + -moz-transform: translateX(-1.2px) translateY(2px); + -ms-transform: translateX(-1.2px) translateY(2px); + transform: translateX(-1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(1.4px) translateY(4px); + -moz-transform: translateX(1.4px) translateY(4px); + -ms-transform: translateX(1.4px) translateY(4px); + transform: translateX(1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(-1.6px) translateY(6px); + -moz-transform: translateX(-1.6px) translateY(6px); + -ms-transform: translateX(-1.6px) translateY(6px); + transform: translateX(-1.6px) translateY(6px); + opacity: 0; + } + } + + @keyframes am-weather-snow-reverse { + 0% { + -webkit-transform: translateX(0) translateY(0); + -moz-transform: translateX(0) translateY(0); + -ms-transform: translateX(0) translateY(0); + transform: translateX(0) translateY(0); + } + + 33.33% { + -webkit-transform: translateX(1.2px) translateY(2px); + -moz-transform: translateX(1.2px) translateY(2px); + -ms-transform: translateX(1.2px) translateY(2px); + transform: translateX(1.2px) translateY(2px); + } + + 66.66% { + -webkit-transform: translateX(-1.4px) translateY(4px); + -moz-transform: translateX(-1.4px) translateY(4px); + -ms-transform: translateX(-1.4px) translateY(4px); + transform: translateX(-1.4px) translateY(4px); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(1.6px) translateY(6px); + -moz-transform: translateX(1.6px) translateY(6px); + -ms-transform: translateX(1.6px) translateY(6px); + transform: translateX(1.6px) translateY(6px); + opacity: 0; + } + } + + .am-weather-snow-1 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-2 { + -webkit-animation-name: am-weather-snow; + -moz-animation-name: am-weather-snow; + -ms-animation-name: am-weather-snow; + animation-name: am-weather-snow; + -webkit-animation-delay: 1.2s; + -moz-animation-delay: 1.2s; + -ms-animation-delay: 1.2s; + animation-delay: 1.2s; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + + .am-weather-snow-3 { + -webkit-animation-name: am-weather-snow-reverse; + -moz-animation-name: am-weather-snow-reverse; + -ms-animation-name: am-weather-snow-reverse; + animation-name: am-weather-snow-reverse; + -webkit-animation-duration: 2s; + -moz-animation-duration: 2s; + -ms-animation-duration: 2s; + animation-duration: 2s; + -webkit-animation-timing-function: linear; + -moz-animation-timing-function: linear; + -ms-animation-timing-function: linear; + animation-timing-function: linear; + -webkit-animation-iteration-count: infinite; + -moz-animation-iteration-count: infinite; + -ms-animation-iteration-count: infinite; + animation-iteration-count: infinite; + } + ]]> + </style> + </defs> + <g transform="translate(16,-2)" filter="url(#blur)"> + <g transform="matrix(.8 0 0 .8 16 4)"> + <g class="am-weather-moon-star-1" + style="-moz-animation-delay:3s;-moz-animation-duration:5s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-1;-moz-animation-timing-function:linear;-ms-animation-delay:3s;-ms-animation-duration:5s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-1;-ms-animation-timing-function:linear;-webkit-animation-delay:3s;-webkit-animation-duration:5s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-1;-webkit-animation-timing-function:linear"> + <polygon points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" fill="#ffa500" + stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon-star-2" + style="-moz-animation-delay:5s;-moz-animation-duration:4s;-moz-animation-iteration-count:1;-moz-animation-name:am-weather-moon-star-2;-moz-animation-timing-function:linear;-ms-animation-delay:5s;-ms-animation-duration:4s;-ms-animation-iteration-count:1;-ms-animation-name:am-weather-moon-star-2;-ms-animation-timing-function:linear;-webkit-animation-delay:5s;-webkit-animation-duration:4s;-webkit-animation-iteration-count:1;-webkit-animation-name:am-weather-moon-star-2;-webkit-animation-timing-function:linear"> + <polygon transform="translate(20,10)" points="4 4 3.3 5.2 2.7 4 1.5 3.3 2.7 2.7 3.3 1.5 4 2.7 5.2 3.3" + fill="#ffa500" stroke-miterlimit="10" /> + </g> + <g class="am-weather-moon" + style="-moz-animation-duration:6s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-moon;-moz-animation-timing-function:linear;-moz-transform-origin:12.5px 15.15px 0;-ms-animation-duration:6s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-moon;-ms-animation-timing-function:linear;-ms-transform-origin:12.5px 15.15px 0;-webkit-animation-duration:6s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-moon;-webkit-animation-timing-function:linear;-webkit-transform-origin:12.5px 15.15px 0"> + <path + d="m14.5 13.2c0-3.7 2-6.9 5-8.7-1.5-0.9-3.2-1.3-5-1.3-5.5 0-10 4.5-10 10s4.5 10 10 10c1.8 0 3.5-0.5 5-1.3-3-1.7-5-5-5-8.7z" + fill="#ffa500" stroke="#ffa500" stroke-linejoin="round" stroke-width="2" /> + </g> + </g> + <g class="am-weather-cloud-2" + style="-moz-animation-duration:3s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-cloud-2;-moz-animation-timing-function:linear;-webkit-animation-duration:3s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-cloud-2;-webkit-animation-timing-function:linear"> + <path transform="translate(-20,-11)" + d="m47.7 35.4c0-4.6-3.7-8.2-8.2-8.2-1 0-1.9 0.2-2.8 0.5-0.3-3.4-3.1-6.2-6.6-6.2-3.7 0-6.7 3-6.7 6.7 0 0.8 0.2 1.6 0.4 2.3-0.3-0.1-0.7-0.1-1-0.1-3.7 0-6.7 3-6.7 6.7 0 3.6 2.9 6.6 6.5 6.7h17.2c4.4-0.5 7.9-4 7.9-8.4z" + fill="#57a0ee" stroke="#fff" stroke-linejoin="round" stroke-width="1.2" /> + </g> + <g class="am-weather-snow-1" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(3,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-2" + style="-moz-animation-delay:1.2s;-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow;-moz-animation-timing-function:linear;-ms-animation-delay:1.2s;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow;-ms-animation-timing-function:linear;-webkit-animation-delay:1.2s;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow;-webkit-animation-timing-function:linear"> + <g transform="translate(11,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + <g class="am-weather-snow-3" + style="-moz-animation-duration:2s;-moz-animation-iteration-count:infinite;-moz-animation-name:am-weather-snow-reverse;-moz-animation-timing-function:linear;-ms-animation-duration:2s;-ms-animation-iteration-count:infinite;-ms-animation-name:am-weather-snow-reverse;-ms-animation-timing-function:linear;-webkit-animation-duration:2s;-webkit-animation-iteration-count:infinite;-webkit-animation-name:am-weather-snow-reverse;-webkit-animation-timing-function:linear"> + <g transform="translate(20,28)" fill="none" stroke="#57a0ee" stroke-linecap="round"> + <line transform="translate(0,9)" y1="-2.5" y2="2.5" stroke-width="1.2" /> + <line transform="rotate(45,-10.864,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(90,-4.5,4.5)" y1="-2.5" y2="2.5" /> + <line transform="rotate(135,-1.864,4.5)" y1="-2.5" y2="2.5" /> + </g> + </g> + </g> +</svg> \ No newline at end of file From 740ff941a57351d6200700b3e45aee112e720a3a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:35:15 +0530 Subject: [PATCH 092/147] feat(discover): add preview mode --- src/app/api/discover/route.ts | 59 ++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 8c1f470..b1c761d 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -16,28 +16,43 @@ const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ export const GET = async (req: Request) => { try { - const data = ( - await Promise.all([ - ...new Array(articleWebsites.length * topics.length) - .fill(0) - .map(async (_, i) => { - return ( - await searchSearxng( - `site:${articleWebsites[i % articleWebsites.length]} ${ - topics[i % topics.length] - }`, - { - engines: ['bing news'], - pageno: 1, - }, - ) - ).results; - }), - ]) - ) - .map((result) => result) - .flat() - .sort(() => Math.random() - 0.5); + const params = new URL(req.url).searchParams; + const mode: 'normal' | 'preview' = + (params.get('mode') as 'normal' | 'preview') || 'normal'; + + let data = []; + + if (mode === 'normal') { + data = ( + await Promise.all([ + ...new Array(articleWebsites.length * topics.length) + .fill(0) + .map(async (_, i) => { + return ( + await searchSearxng( + `site:${articleWebsites[i % articleWebsites.length]} ${ + topics[i % topics.length] + }`, + { + engines: ['bing news'], + pageno: 1, + }, + ) + ).results; + }), + ]) + ) + .map((result) => result) + .flat() + .sort(() => Math.random() - 0.5); + } else { + data = ( + await searchSearxng( + `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, + { engines: ['bing news'], pageno: 1 }, + ) + ).results; + } return Response.json( { From ccb72c8970691d1980692751bfc7ad2784b457cb Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:36:08 +0530 Subject: [PATCH 093/147] feat(app): add weather widget --- src/app/api/weather/route.ts | 164 +++++++++++++++++++++++++++++++ src/components/EmptyChat.tsx | 10 +- src/components/WeatherWidget.tsx | 145 +++++++++++++++++++++++++++ 3 files changed, 316 insertions(+), 3 deletions(-) create mode 100644 src/app/api/weather/route.ts create mode 100644 src/components/WeatherWidget.tsx diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts new file mode 100644 index 0000000..7594aa9 --- /dev/null +++ b/src/app/api/weather/route.ts @@ -0,0 +1,164 @@ +export const POST = async (req: Request) => { + try { + const body: { lat: number; lng: number } = await req.json(); + + if (!body.lat || !body.lng) { + return Response.json( + { + message: 'Invalid request.', + }, + { status: 400 }, + ); + } + + const res = await fetch( + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto`, + ); + + const data = await res.json(); + + if (data.error) { + console.error(`Error fetching weather data: ${data.reason}`); + return Response.json( + { + message: 'An error has occurred.', + }, + { status: 500 }, + ); + } + + const weather: { + temperature: number; + condition: string; + humidity: number; + windSpeed: number; + icon: string; + } = { + temperature: data.current.temperature_2m, + condition: '', + humidity: data.current.relative_humidity_2m, + windSpeed: data.current.wind_speed_10m, + icon: '', + }; + + const code = data.current.weather_code; + const isDay = data.current.is_day === 1; + const dayOrNight = isDay ? 'day' : 'night'; + + switch (code) { + case 0: + weather.icon = `clear-${dayOrNight}`; + weather.condition = 'Clear'; + break; + + case 1: + weather.condition = 'Mainly Clear'; + case 2: + weather.condition = 'Partly Cloudy'; + case 3: + weather.icon = `cloudy-1-${dayOrNight}`; + weather.condition = 'Cloudy'; + break; + + case 45: + weather.condition = 'Fog'; + case 48: + weather.icon = `fog-${dayOrNight}`; + weather.condition = 'Fog'; + break; + + case 51: + weather.condition = 'Light Drizzle'; + case 53: + weather.condition = 'Moderate Drizzle'; + case 55: + weather.icon = `rainy-1-${dayOrNight}`; + weather.condition = 'Dense Drizzle'; + break; + + case 56: + weather.condition = 'Light Freezing Drizzle'; + case 57: + weather.icon = `frost-${dayOrNight}`; + weather.condition = 'Dense Freezing Drizzle'; + break; + + case 61: + weather.condition = 'Slight Rain'; + case 63: + weather.condition = 'Moderate Rain'; + case 65: + weather.condition = 'Heavy Rain'; + weather.icon = `rainy-2-${dayOrNight}`; + break; + + case 66: + weather.condition = 'Light Freezing Rain'; + case 67: + weather.condition = 'Heavy Freezing Rain'; + weather.icon = 'rain-and-sleet-mix'; + break; + + case 71: + weather.condition = 'Slight Snow Fall'; + case 73: + weather.condition = 'Moderate Snow Fall'; + case 75: + weather.condition = 'Heavy Snow Fall'; + weather.icon = `snowy-2-${dayOrNight}`; + break; + + case 77: + weather.condition = 'Snow'; + weather.icon = `snowy-1-${dayOrNight}`; + break; + + case 80: + weather.condition = 'Slight Rain Showers'; + case 81: + weather.condition = 'Moderate Rain Showers'; + case 82: + weather.condition = 'Heavy Rain Showers'; + weather.icon = `rainy-3-${dayOrNight}`; + break; + + case 85: + weather.condition = 'Slight Snow Showers'; + case 86: + weather.condition = 'Moderate Snow Showers'; + case 87: + weather.condition = 'Heavy Snow Showers'; + weather.icon = `snowy-3-${dayOrNight}`; + break; + + case 95: + weather.condition = 'Thunderstorm'; + weather.icon = `scattered-thunderstorms-${dayOrNight}`; + break; + + case 96: + weather.condition = 'Thunderstorm with Slight Hail'; + case 99: + weather.condition = 'Thunderstorm with Heavy Hail'; + weather.icon = 'severe-thunderstorm'; + break; + + default: + weather.icon = `clear-${dayOrNight}`; + weather.condition = 'Clear'; + break; + } + + return Response.json(weather); + } catch (err) { + console.error('An error occurred while getting home widgets', err); + return Response.json( + { + message: 'An error has occurred.', + }, + { + status: 500, + }, + ); + } +}; diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 838849f..8c6bdab 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -1,8 +1,9 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; -import { useState } from 'react'; +import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; +import WeatherWidget from './WeatherWidget'; const EmptyChat = ({ sendMessage, @@ -25,8 +26,6 @@ const EmptyChat = ({ files: File[]; setFiles: (files: File[]) => void; }) => { - const [isSettingsOpen, setIsSettingsOpen] = useState(false); - return ( <div className="relative"> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> @@ -49,6 +48,11 @@ const EmptyChat = ({ files={files} setFiles={setFiles} /> + <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> + <div className="flex-1 max-w-xs"> + <WeatherWidget /> + </div> + </div> </div> </div> ); diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx new file mode 100644 index 0000000..afbc94e --- /dev/null +++ b/src/components/WeatherWidget.tsx @@ -0,0 +1,145 @@ +import { Cloud, Sun, CloudRain, CloudSnow, Wind } from 'lucide-react'; +import { useEffect, useState } from 'react'; + +const WeatherWidget = () => { + const [data, setData] = useState({ + temperature: 0, + condition: '', + location: '', + humidity: 0, + windSpeed: 0, + icon: '', + }); + const [loading, setLoading] = useState(true); + + useEffect(() => { + const getApproxLocation = async () => { + const res = await fetch('https://ipwhois.app/json/'); + const data = await res.json(); + + return { + latitude: data.latitude, + longitude: data.longitude, + city: data.city, + }; + }; + + const getLocation = async ( + callback: (location: { + latitude: number; + longitude: number; + city: string; + }) => void, + ) => { + /* + // Geolocation doesn't give city so we'll country using ipapi for now + if (navigator.geolocation) { + const result = await navigator.permissions.query({ + name: 'geolocation', + }) + + if (result.state === 'granted') { + navigator.geolocation.getCurrentPosition(position => { + callback({ + latitude: position.coords.latitude, + longitude: position.coords.longitude, + }) + }) + } else if (result.state === 'prompt') { + callback(await getApproxLocation()) + navigator.geolocation.getCurrentPosition(position => {}) + } else if (result.state === 'denied') { + callback(await getApproxLocation()) + } + } else { + callback(await getApproxLocation()) + } */ + callback(await getApproxLocation()); + }; + + getLocation(async (location) => { + const res = await fetch(`/api/weather`, { + method: 'POST', + body: JSON.stringify({ + lat: location.latitude, + lng: location.longitude, + }), + }); + + const data = await res.json(); + + if (res.status !== 200) { + console.error('Error fetching weather data'); + setLoading(false); + return; + } + + setData({ + temperature: data.temperature, + condition: data.condition, + location: location.city, + humidity: data.humidity, + windSpeed: data.windSpeed, + icon: data.icon, + }); + setLoading(false); + }); + }, []); + + return ( + <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3"> + {loading ? ( + <> + <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full animate-pulse"> + <div className="h-10 w-10 rounded-full bg-light-200 dark:bg-dark-200 mb-2" /> + <div className="h-4 w-10 rounded bg-light-200 dark:bg-dark-200" /> + </div> + <div className="flex flex-col justify-between flex-1 h-full py-1 animate-pulse"> + <div className="flex flex-row items-center justify-between"> + <div className="h-3 w-20 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-12 rounded bg-light-200 dark:bg-dark-200" /> + </div> + <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200 mt-1" /> + <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200"> + <div className="h-3 w-16 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-8 rounded bg-light-200 dark:bg-dark-200" /> + </div> + </div> + </> + ) : ( + <> + <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full"> + <img + src={`/weather/${data.icon}.svg`} + alt={data.condition} + className="h-10 w-auto" + /> + <span className="text-base font-semibold text-black dark:text-white"> + {data.temperature}°C + </span> + </div> + <div className="flex flex-col justify-between flex-1 h-full py-1"> + <div className="flex flex-row items-center justify-between"> + <span className="text-xs font-medium text-black dark:text-white"> + {data.location} + </span> + <span className="flex items-center text-xs text-black/60 dark:text-white/60"> + <Wind className="w-3 h-3 mr-1" /> + {data.windSpeed} km/h + </span> + </div> + <span className="text-xs text-black/60 dark:text-white/60 mt-1"> + {data.condition} + </span> + <div className="flex flex-row justify-between w-full mt-auto pt-1 border-t border-light-200 dark:border-dark-200 text-xs text-black/60 dark:text-white/60"> + <span>Humidity: {data.humidity}%</span> + <span>Now</span> + </div> + </div> + </> + )} + </div> + ); +}; + +export default WeatherWidget; From 2257e1df0cfd0a0dc4c3f296a57ab3db6d5c1b47 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 08:36:40 +0530 Subject: [PATCH 094/147] feat(empty-chat): add article widget --- src/components/EmptyChat.tsx | 4 ++ src/components/NewsArticleWidget.tsx | 71 ++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/components/NewsArticleWidget.tsx diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 8c6bdab..2a06d1d 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; +import NewsArticleWidget from './NewsArticleWidget'; const EmptyChat = ({ sendMessage, @@ -52,6 +53,9 @@ const EmptyChat = ({ <div className="flex-1 max-w-xs"> <WeatherWidget /> </div> + <div className="flex-1 max-w-xs"> + <NewsArticleWidget /> + </div> </div> </div> </div> diff --git a/src/components/NewsArticleWidget.tsx b/src/components/NewsArticleWidget.tsx new file mode 100644 index 0000000..eca6940 --- /dev/null +++ b/src/components/NewsArticleWidget.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from 'react'; + +interface Article { + title: string; + content: string; + url: string; + thumbnail: string; +} + +const NewsArticleWidget = () => { + const [article, setArticle] = useState<Article | null>(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(false); + + useEffect(() => { + fetch('/api/discover?mode=preview') + .then((res) => res.json()) + .then((data) => { + const articles = (data.blogs || []).filter((a: Article) => a.thumbnail); + setArticle(articles[Math.floor(Math.random() * articles.length)]); + setLoading(false); + }) + .catch(() => { + setError(true); + setLoading(false); + }); + }, []); + + return ( + <div className="bg-light-secondary dark:bg-dark-secondary rounded-xl border border-light-200 dark:border-dark-200 shadow-sm flex flex-row items-center w-full h-24 min-h-[96px] max-h-[96px] px-3 py-2 gap-3 overflow-hidden"> + {loading ? ( + <> + <div className="animate-pulse flex flex-row items-center w-full h-full"> + <div className="rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 bg-light-200 dark:bg-dark-200 mr-3" /> + <div className="flex flex-col justify-center flex-1 h-full w-0 gap-2"> + <div className="h-4 w-3/4 rounded bg-light-200 dark:bg-dark-200" /> + <div className="h-3 w-1/2 rounded bg-light-200 dark:bg-dark-200" /> + </div> + </div> + </> + ) : error ? ( + <div className="w-full text-xs text-red-400">Could not load news.</div> + ) : article ? ( + <a + href={`/?q=Summary: ${article.url}`} + className="flex flex-row items-center w-full h-full group" + > + <img + className="object-cover rounded-lg w-16 min-w-16 max-w-16 h-16 min-h-16 max-h-16 border border-light-200 dark:border-dark-200 bg-light-200 dark:bg-dark-200 group-hover:opacity-90 transition" + src={ + new URL(article.thumbnail).origin + + new URL(article.thumbnail).pathname + + `?id=${new URL(article.thumbnail).searchParams.get('id')}` + } + alt={article.title} + /> + <div className="flex flex-col justify-center flex-1 h-full pl-3 w-0"> + <div className="font-bold text-xs text-black dark:text-white leading-tight truncate overflow-hidden whitespace-nowrap"> + {article.title} + </div> + <p className="text-black/70 dark:text-white/70 text-xs leading-snug truncate overflow-hidden whitespace-nowrap"> + {article.content} + </p> + </div> + </a> + ) : null} + </div> + ); +}; + +export default NewsArticleWidget; From a86a1a461cabf9ca249f6863a2a8b52fa9cf7896 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:24:54 +0530 Subject: [PATCH 095/147] feat(weather-icons): rename `weather` to `weather-ico` --- public/{weather => weather-ico}/clear-day.svg | 0 public/{weather => weather-ico}/clear-night.svg | 0 public/{weather => weather-ico}/cloudy-1-day.svg | 0 public/{weather => weather-ico}/cloudy-1-night.svg | 0 public/{weather => weather-ico}/fog-day.svg | 0 public/{weather => weather-ico}/fog-night.svg | 0 public/{weather => weather-ico}/frost-day.svg | 0 public/{weather => weather-ico}/frost-night.svg | 0 public/{weather => weather-ico}/rain-and-sleet-mix.svg | 0 public/{weather => weather-ico}/rainy-1-day.svg | 0 public/{weather => weather-ico}/rainy-1-night.svg | 0 public/{weather => weather-ico}/rainy-2-day.svg | 0 public/{weather => weather-ico}/rainy-2-night.svg | 0 public/{weather => weather-ico}/rainy-3-day.svg | 0 public/{weather => weather-ico}/rainy-3-night.svg | 0 public/{weather => weather-ico}/scattered-thunderstorms-day.svg | 0 .../{weather => weather-ico}/scattered-thunderstorms-night.svg | 0 public/{weather => weather-ico}/severe-thunderstorm.svg | 0 public/{weather => weather-ico}/snowy-1-day.svg | 0 public/{weather => weather-ico}/snowy-1-night.svg | 0 public/{weather => weather-ico}/snowy-2-day.svg | 0 public/{weather => weather-ico}/snowy-2-night.svg | 0 public/{weather => weather-ico}/snowy-3-day.svg | 0 public/{weather => weather-ico}/snowy-3-night.svg | 0 src/components/WeatherWidget.tsx | 2 +- 25 files changed, 1 insertion(+), 1 deletion(-) rename public/{weather => weather-ico}/clear-day.svg (100%) rename public/{weather => weather-ico}/clear-night.svg (100%) rename public/{weather => weather-ico}/cloudy-1-day.svg (100%) rename public/{weather => weather-ico}/cloudy-1-night.svg (100%) rename public/{weather => weather-ico}/fog-day.svg (100%) rename public/{weather => weather-ico}/fog-night.svg (100%) rename public/{weather => weather-ico}/frost-day.svg (100%) rename public/{weather => weather-ico}/frost-night.svg (100%) rename public/{weather => weather-ico}/rain-and-sleet-mix.svg (100%) rename public/{weather => weather-ico}/rainy-1-day.svg (100%) rename public/{weather => weather-ico}/rainy-1-night.svg (100%) rename public/{weather => weather-ico}/rainy-2-day.svg (100%) rename public/{weather => weather-ico}/rainy-2-night.svg (100%) rename public/{weather => weather-ico}/rainy-3-day.svg (100%) rename public/{weather => weather-ico}/rainy-3-night.svg (100%) rename public/{weather => weather-ico}/scattered-thunderstorms-day.svg (100%) rename public/{weather => weather-ico}/scattered-thunderstorms-night.svg (100%) rename public/{weather => weather-ico}/severe-thunderstorm.svg (100%) rename public/{weather => weather-ico}/snowy-1-day.svg (100%) rename public/{weather => weather-ico}/snowy-1-night.svg (100%) rename public/{weather => weather-ico}/snowy-2-day.svg (100%) rename public/{weather => weather-ico}/snowy-2-night.svg (100%) rename public/{weather => weather-ico}/snowy-3-day.svg (100%) rename public/{weather => weather-ico}/snowy-3-night.svg (100%) diff --git a/public/weather/clear-day.svg b/public/weather-ico/clear-day.svg similarity index 100% rename from public/weather/clear-day.svg rename to public/weather-ico/clear-day.svg diff --git a/public/weather/clear-night.svg b/public/weather-ico/clear-night.svg similarity index 100% rename from public/weather/clear-night.svg rename to public/weather-ico/clear-night.svg diff --git a/public/weather/cloudy-1-day.svg b/public/weather-ico/cloudy-1-day.svg similarity index 100% rename from public/weather/cloudy-1-day.svg rename to public/weather-ico/cloudy-1-day.svg diff --git a/public/weather/cloudy-1-night.svg b/public/weather-ico/cloudy-1-night.svg similarity index 100% rename from public/weather/cloudy-1-night.svg rename to public/weather-ico/cloudy-1-night.svg diff --git a/public/weather/fog-day.svg b/public/weather-ico/fog-day.svg similarity index 100% rename from public/weather/fog-day.svg rename to public/weather-ico/fog-day.svg diff --git a/public/weather/fog-night.svg b/public/weather-ico/fog-night.svg similarity index 100% rename from public/weather/fog-night.svg rename to public/weather-ico/fog-night.svg diff --git a/public/weather/frost-day.svg b/public/weather-ico/frost-day.svg similarity index 100% rename from public/weather/frost-day.svg rename to public/weather-ico/frost-day.svg diff --git a/public/weather/frost-night.svg b/public/weather-ico/frost-night.svg similarity index 100% rename from public/weather/frost-night.svg rename to public/weather-ico/frost-night.svg diff --git a/public/weather/rain-and-sleet-mix.svg b/public/weather-ico/rain-and-sleet-mix.svg similarity index 100% rename from public/weather/rain-and-sleet-mix.svg rename to public/weather-ico/rain-and-sleet-mix.svg diff --git a/public/weather/rainy-1-day.svg b/public/weather-ico/rainy-1-day.svg similarity index 100% rename from public/weather/rainy-1-day.svg rename to public/weather-ico/rainy-1-day.svg diff --git a/public/weather/rainy-1-night.svg b/public/weather-ico/rainy-1-night.svg similarity index 100% rename from public/weather/rainy-1-night.svg rename to public/weather-ico/rainy-1-night.svg diff --git a/public/weather/rainy-2-day.svg b/public/weather-ico/rainy-2-day.svg similarity index 100% rename from public/weather/rainy-2-day.svg rename to public/weather-ico/rainy-2-day.svg diff --git a/public/weather/rainy-2-night.svg b/public/weather-ico/rainy-2-night.svg similarity index 100% rename from public/weather/rainy-2-night.svg rename to public/weather-ico/rainy-2-night.svg diff --git a/public/weather/rainy-3-day.svg b/public/weather-ico/rainy-3-day.svg similarity index 100% rename from public/weather/rainy-3-day.svg rename to public/weather-ico/rainy-3-day.svg diff --git a/public/weather/rainy-3-night.svg b/public/weather-ico/rainy-3-night.svg similarity index 100% rename from public/weather/rainy-3-night.svg rename to public/weather-ico/rainy-3-night.svg diff --git a/public/weather/scattered-thunderstorms-day.svg b/public/weather-ico/scattered-thunderstorms-day.svg similarity index 100% rename from public/weather/scattered-thunderstorms-day.svg rename to public/weather-ico/scattered-thunderstorms-day.svg diff --git a/public/weather/scattered-thunderstorms-night.svg b/public/weather-ico/scattered-thunderstorms-night.svg similarity index 100% rename from public/weather/scattered-thunderstorms-night.svg rename to public/weather-ico/scattered-thunderstorms-night.svg diff --git a/public/weather/severe-thunderstorm.svg b/public/weather-ico/severe-thunderstorm.svg similarity index 100% rename from public/weather/severe-thunderstorm.svg rename to public/weather-ico/severe-thunderstorm.svg diff --git a/public/weather/snowy-1-day.svg b/public/weather-ico/snowy-1-day.svg similarity index 100% rename from public/weather/snowy-1-day.svg rename to public/weather-ico/snowy-1-day.svg diff --git a/public/weather/snowy-1-night.svg b/public/weather-ico/snowy-1-night.svg similarity index 100% rename from public/weather/snowy-1-night.svg rename to public/weather-ico/snowy-1-night.svg diff --git a/public/weather/snowy-2-day.svg b/public/weather-ico/snowy-2-day.svg similarity index 100% rename from public/weather/snowy-2-day.svg rename to public/weather-ico/snowy-2-day.svg diff --git a/public/weather/snowy-2-night.svg b/public/weather-ico/snowy-2-night.svg similarity index 100% rename from public/weather/snowy-2-night.svg rename to public/weather-ico/snowy-2-night.svg diff --git a/public/weather/snowy-3-day.svg b/public/weather-ico/snowy-3-day.svg similarity index 100% rename from public/weather/snowy-3-day.svg rename to public/weather-ico/snowy-3-day.svg diff --git a/public/weather/snowy-3-night.svg b/public/weather-ico/snowy-3-night.svg similarity index 100% rename from public/weather/snowy-3-night.svg rename to public/weather-ico/snowy-3-night.svg diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index afbc94e..e6a631e 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -110,7 +110,7 @@ const WeatherWidget = () => { <> <div className="flex flex-col items-center justify-center w-16 min-w-16 max-w-16 h-full"> <img - src={`/weather/${data.icon}.svg`} + src={`/weather-ico/${data.icon}.svg`} alt={data.condition} className="h-10 w-auto" /> From 3a57261590a548d7edcc16f6420762d020fc8460 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:33:15 +0530 Subject: [PATCH 096/147] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a8fd416..f62543b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.10.2", + "version": "1.11.0-rc1", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From 8cfcc3e39c7323723c715d2e11a75f2544a2ccac Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:52:36 +0530 Subject: [PATCH 097/147] feat(chat): update margins and spacing --- src/components/EmptyChat.tsx | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 2a06d1d..b28b659 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -34,21 +34,23 @@ const EmptyChat = ({ <Settings className="cursor-pointer lg:hidden" /> </Link> </div> - <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8"> - <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> - Research begins here. - </h2> - <EmptyChatMessageInput - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-4"> + <div className="flex flex-col items-center justify-center w-full space-y-8"> + <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> + Research begins here. + </h2> + <EmptyChatMessageInput + sendMessage={sendMessage} + focusMode={focusMode} + setFocusMode={setFocusMode} + optimizationMode={optimizationMode} + setOptimizationMode={setOptimizationMode} + fileIds={fileIds} + setFileIds={setFileIds} + files={files} + setFiles={setFiles} + /> + </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> <div className="flex-1 max-w-xs"> <WeatherWidget /> From 0b7989c3d3f3a5c21354c623f7bd98c70b6d7137 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 30 May 2025 09:55:06 +0530 Subject: [PATCH 098/147] feat(empty-chat): remove unused imports --- src/components/EmptyChat.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index b28b659..42e5a09 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -1,6 +1,5 @@ import { Settings } from 'lucide-react'; import EmptyChatMessageInput from './EmptyChatMessageInput'; -import { useEffect, useState } from 'react'; import { File } from './ChatWindow'; import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; From 5c6018a0f9c498da28df3b08889b7c9ccf7a1f40 Mon Sep 17 00:00:00 2001 From: Dave <davixk83@gmail.com> Date: Sun, 1 Jun 2025 06:35:16 +0200 Subject: [PATCH 099/147] docs: correct typo in npm start command --- docs/installation/UPDATING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/UPDATING.md b/docs/installation/UPDATING.md index 972142f..66edf5c 100644 --- a/docs/installation/UPDATING.md +++ b/docs/installation/UPDATING.md @@ -41,6 +41,6 @@ To update Perplexica to the latest version, follow these steps: 3. Check for changes in the configuration files. If the `sample.config.toml` file contains new fields, delete your existing `config.toml` file, rename `sample.config.toml` to `config.toml`, and update the configuration accordingly. 4. After populating the configuration run `npm i`. 5. Install the dependencies and then execute `npm run build`. -6. Finally, start the app by running `npm rum start` +6. Finally, start the app by running `npm run start` --- From 772e461c0887f72d35d9ebef9fa500908b702dad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=93=E3=82=84=E3=81=97?= <168693811+koyasi777@users.noreply.github.com> Date: Mon, 2 Jun 2025 00:30:18 +0900 Subject: [PATCH 100/147] feat(gemini): add Gemini 2.5 Flash & Pro preview models (May 2025) --- src/lib/providers/gemini.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index 6cf2243..2dcdc88 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -13,6 +13,14 @@ import { BaseChatModel } from '@langchain/core/language_models/chat_models'; import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ + { + displayName: 'Gemini 2.5 Flash Preview 05-20', + key: 'gemini-2.5-flash-preview-05-20', + }, + { + displayName: 'Gemini 2.5 Pro Preview', + key: 'gemini-2.5-pro-preview-05-06', + }, { displayName: 'Gemini 2.5 Pro Experimental', key: 'gemini-2.5-pro-exp-03-25', From 3b46baca4f3ef35c7fa3c0605d2738b58976b2dd Mon Sep 17 00:00:00 2001 From: Dave <davixk83@gmail.com> Date: Mon, 2 Jun 2025 05:52:31 +0200 Subject: [PATCH 101/147] docs(readme): fix typo in npm start command --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 18c9f84..8a0c78e 100644 --- a/README.md +++ b/README.md @@ -111,7 +111,7 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. 2. Clone the repository and rename the `sample.config.toml` file to `config.toml` in the root directory. Ensure you complete all required fields in this file. 3. After populating the configuration run `npm i`. 4. Install the dependencies and then execute `npm run build`. -5. Finally, start the app by running `npm rum start` +5. Finally, start the app by running `npm run start` **Note**: Using Docker is recommended as it simplifies the setup process, especially for managing environment variables and dependencies. From 68c43ea372202d09ed3d78feddbe6f3334051044 Mon Sep 17 00:00:00 2001 From: Chris Scott <chris@getfit.us> Date: Mon, 2 Jun 2025 21:52:41 -0400 Subject: [PATCH 102/147] Fix: IOS Input Zoom config for theme consistency and iOS standalone mode - Modified manifest.ts to ensure proper metadata - Added display: standalone for iOS PWA behavior --- .assets/manifest.json | 0 public/icons8-search-100.png | Bin 0 -> 1531 bytes public/icons8-search-50.png | Bin 0 -> 750 bytes src/app/globals.css | 9 +++++++++ src/app/manifest.ts | 26 ++++++++++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 .assets/manifest.json create mode 100644 public/icons8-search-100.png create mode 100644 public/icons8-search-50.png create mode 100644 src/app/manifest.ts diff --git a/.assets/manifest.json b/.assets/manifest.json new file mode 100644 index 0000000..e69de29 diff --git a/public/icons8-search-100.png b/public/icons8-search-100.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb6582310a28a061710535069cf40b620c932d9 GIT binary patch literal 1531 zcmV<X1qAwuP)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz00009a7bBm000XU z000XU0RWnu7ytkTtw}^dRCt{2o!g6*RTRK~HhJtNL+i1zR7`@hoQOINngl(hL_-<T z#V$lew}<GZmoAht6=g(V5>!|bO$9!vnPvJCp_Sx6&~3)1pysB{sMO4f4QuFQvA^Rv zp4-~{+dtSZGiRS~t-Zc)uWzrt_BxPABoc{4B9TZW62)a1umRWvd;%N>egsB=lhQ`z zZ-?bG?z4AE-$a9)1*`|Q0YgBg!8R!0bqg>rS*Lb-fUR=3S6b9Yfj5Db$uRl!0y}`2 z78;`BX<q}^CByvBQsA>12JRTJTl~V^z*WE!U;$8)wm|;o{&$aj*7f<jhVS1geG7{l zz-NKuRR(DoctxI`xeZ)vu6)O<@|}6tn*yE@*$Rcb6Tho6Fkb;T09`G(b{DW#u90{B zZ-K=Wgqwl!oPpRQ(@nc517GIIG6wV!IgbI;9_4=%ztAae1b+3%<z6tJBtqthgZ15s z9{^`}T0mev@L`UO8%2j`*p%Zy@5dew=DcV)qeQ_YIrH->>~b~mmq+d=h`@nspYc1e z0{g5GS+lZFhwSJt07jHT?(OPw!r>B62xlzBSK^XqoiSy6n#$u^k54%m+T!s!&-`oA zf!E4I9(|rBpxBhYqdp>h-uFE5LBzgvpm4~@I-?oulp{(v7o9du+4E?-4WU@L&7+?S zTAF3ICpHxudzFs6Fuc>J?;f|nij8YL@h+1)k6V?X?oNu8{Yuv@7)(ge3n;gr5i4tz zt|QhGCvH^&4!3A?$qHwB!YVFIWQO;Ya4!=-o0ZP*U<jQz<s4t^tWrAvf)OtAWQR18 zkPr$bPd1B-QgoaRN+`D$DGGa(?ssBvH!zx=wHoMGx<8KrK2<`wC#ERet8^d006!?9 z>Ph427K0v@wjEd=Q2(;h{SXHDSqXJv9fP5F6f3g8><*wmvU8a2`x6Gx$pGh`=2Vw$ z9|zFiah~e;Ck8mFgsOFG^JtX;nFydi5-!R1J3*ud84sYp&me9rf}OIqR~e9j0Q&o; zEa#Jgb?VD=PDwcfpC3SfpHp}F!RB6j>)Dj*76&>ZZJ>_9u+U#`R(+2F^xH}&v)J3s zeHOE8HY%Z9D5WU8Xi;|^T>PBk@P*R-4h*nN2{jp7nq?Ei?~5?PU`V-2O=7ju*^Pl2 zwkhG<$=TR>P3inLhFD*~B!@qg&Mp(h4D&pTEK>qDnRT8sBPHvJa_$^>Q4;0ez#uC< zbxPa@PHgll9cSv?)avL_1a~MuHui;*Y>mXRbg<54HO9j2o~PpqjI&b-eMAnsgw8oq zal%~e>QpR|<6c?8U4?|u8Sq3Tf;iHKlsM8;*8_yh!=V=uC`pN<tOCa++z=XTWUoA{ z%Qqn|d>47rY$mLpHp<~r&w_U(#KHly^aWg6<1)_~kbi;e37p40^Y57P>1$0+k+oxO zF0j_NUBy|S;z}V|bl@jE^3JyL7>qI}$0)O}#Pf};GX|;{B08fu9?dE7H*BE9-(Zc# z$QmVzW8Zz^Lwri^ZS!%sUQcYQUZX_uq%4*aM|q0wll_#g7HuxA^Muf|?Ld{vsnHsx zBqfe?m_@%LZ<Yg=r3SCHTDD#FPG7c7$qM`o8RWtl1&Igks6pvTIn&oK32J5OyD(E~ ze4+fUET8F@RGrCFeD{pJT(~NDSqf_u#CPm!b20vDNxHtWid=;@3KCk`l5@JL(xm1R zs$T~#u2H7K8)Y_e!j-FdR}SS@8f>n(!CSyhr|FN9Q4~w%9QX^efIB2VZ!{tYW&V*s z;E+U`-A^99Bt^%XwQrG(Vze&UNYNIL*6B$`u}4obianB143dmukYp5tB%>H48O0#U zC<aMJF-S6sL6T7nl8j=IWE6wc6S{w@)4~>oo*Dv@?iaKZMvRh-VaO=S7>10JjA6*p hCkLKLBoYbQ!GHdQ*7*!5-&Ozs002ovPDHLkV1np5&N=`9 literal 0 HcmV?d00001 diff --git a/public/icons8-search-50.png b/public/icons8-search-50.png new file mode 100644 index 0000000000000000000000000000000000000000..7d83950a048d2e2ca2ae07bcd59fe2b86f64491d GIT binary patch literal 750 zcmV<K0ulX*P)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkQph-kQRCt{2nagSvK@^6+Sr~V&G%ds|CaztI8ZT?3D`9jJB8c$; z1TPqbs5|um1a}$~3BgS=lC?%RUh)QRG;Y*vG?*ACX5_%%P=*$qOjS)!(jPQ5Q$7Ew z(^Ylq)M+RvC<w`JU<4Qk=70s@m#(kCJGGq$5^~5fpa#@|#(!S+>@;wc9IzLdaXPmO zyZ|l%2Y_y1n=ZRQ2wVnc^=$gTXFy-OoEQcc)sY{-ZD3au|2N0(087&N4h#{Q8_wID z0D4-`+5=2FdSgW5mJF`xzT`>wBJewwGs7}u1}g#dPdm;G5^!OsYvNicBfzM$X38N9 z%s6WzBqe9f)I#hN4Mmt<!qcNj*Z_|B6s}3sLToH7G@H#SpJ_*38(1^@M61|7v#RvQ z?px-9-pq62^HR3Y`4AhIn57-Dxgy&Se2C3S%yOsL^vm`eA7Tp<%UT~Nflt6ZFc6?U zk?k)Y{9r|5T^VijPLA|3K>K#J{oE{$EQX$11L}-*;&_1eM7H1iT<mrzip^o!wlKUY z!tZ?_Vj~i><7sSO$@VE9Vu_QYcu5sDkfQAHB|5D)V~JcW?#kv9pQ48(x*R!;Ujz2} z7Ee?8Nss6BEKK{UW6L{b9X}g7j)vm8Y<vz`jT~}{4^}Af%^7LilsZ9R#vErxJx#Nc zMk1}CShT7Vfz+9F9$S%Zqx3p!VtsA6N(2U-HM6A9+{`}Htq{8`jc*x6@Oms~%1$&( zr^KvMi+(NEE?tR!yQ<vDEn+`bZJ^ptXHdyzs>#m^cE)%F?B{RV?o2vetWfX}c&m>) zE85&X0Iz|2>eNpDO)i}Ah1HhVJ7d%FEFDOta3-fzijm1Fm11OaN;P9->;o;GKFw~@ g;Z!?$B-m2?0UfV5Z^;J0ga7~l07*qoM6N<$g6)P#ZvX%Q literal 0 HcmV?d00001 diff --git a/src/app/globals.css b/src/app/globals.css index f75daca..a8e6ae1 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -11,3 +11,12 @@ display: none; } } + +/* Add Fix for IOS to allow PWA and stop zooming on the page */ +@media screen and (-webkit-min-device-pixel-ratio: 0) { + select, + textarea, + input { + font-size: 16px !important; + } +} diff --git a/src/app/manifest.ts b/src/app/manifest.ts new file mode 100644 index 0000000..204e58f --- /dev/null +++ b/src/app/manifest.ts @@ -0,0 +1,26 @@ +import type { MetadataRoute } from 'next'; + +export default function manifest(): MetadataRoute.Manifest { + return { + name: 'Perplexica - Chat with the internet', + short_name: 'Perplexica', + description: + 'Perplexica is an AI powered chatbot that is connected to the internet.', + start_url: '/', + display: 'standalone', + background_color: '#0a0a0a', + theme_color: '#0a0a0a', + icons: [ + { + src: '/icons8-search-50.png', + sizes: '50x50', + type: 'image/png' as const, + }, + { + src: '/icons8-search-100.png', + sizes: '100x100', + type: 'image/png', + }, + ], + }; +} From e2b9ffc072bbb1826719ec480338247d470173c9 Mon Sep 17 00:00:00 2001 From: Siddhesh Mhatre <157303637+glitchySid@users.noreply.github.com> Date: Wed, 11 Jun 2025 22:52:13 +0530 Subject: [PATCH 103/147] Update README.md Mentioned that Gemini api key can be used in perplexica. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 18c9f84..07d5c2d 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**. - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**. - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**. + - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. **Note**: You can change these after starting Perplexica from the settings dialog. From c6d084f5dc960c271c2c01464b13f93a769e1d88 Mon Sep 17 00:00:00 2001 From: D1m7asis <tumaskow@yandex.ru> Date: Fri, 27 Jun 2025 13:43:20 +0200 Subject: [PATCH 104/147] feat: add AIML API provider Introduces support for the AI/ML API provider, including configuration options, chat and embedding model loading, and UI integration. Updates documentation and sample config to reflect the new provider. --- README.md | 4 +- sample.config.toml | 3 ++ src/app/api/config/route.ts | 5 ++ src/app/settings/page.tsx | 20 ++++++++ src/lib/config.ts | 5 ++ src/lib/providers/aimlapi.ts | 94 ++++++++++++++++++++++++++++++++++++ src/lib/providers/index.ts | 8 +++ 7 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 src/lib/providers/aimlapi.ts diff --git a/README.md b/README.md index 14a6193..9551250 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,9 @@ There are mainly 2 ways of installing Perplexica - With Docker, Without Docker. - `OLLAMA`: Your Ollama API URL. You should enter it as `http://host.docker.internal:PORT_NUMBER`. If you installed Ollama on port 11434, use `http://host.docker.internal:11434`. For other ports, adjust accordingly. **You need to fill this if you wish to use Ollama's models instead of OpenAI's**. - `GROQ`: Your Groq API key. **You only need to fill this if you wish to use Groq's hosted models**. - `ANTHROPIC`: Your Anthropic API key. **You only need to fill this if you wish to use Anthropic models**. - - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. + - `Gemini`: Your Gemini API key. **You only need to fill this if you wish to use Google's models**. + - `DEEPSEEK`: Your Deepseek API key. **Only needed if you want Deepseek models.** + - `AIMLAPI`: Your AI/ML API key. **Only needed if you want to use AI/ML API models and embeddings.** **Note**: You can change these after starting Perplexica from the settings dialog. diff --git a/sample.config.toml b/sample.config.toml index 1db2125..ba3e98e 100644 --- a/sample.config.toml +++ b/sample.config.toml @@ -25,6 +25,9 @@ API_URL = "" # Ollama API URL - http://host.docker.internal:11434 [MODELS.DEEPSEEK] API_KEY = "" +[MODELS.AIMLAPI] +API_KEY = "" # Required to use AI/ML API chat and embedding models + [MODELS.LM_STUDIO] API_URL = "" # LM Studio API URL - http://host.docker.internal:1234 diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index c1e5bbd..0c11b23 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -8,6 +8,7 @@ import { getOllamaApiEndpoint, getOpenaiApiKey, getDeepseekApiKey, + getAimlApiKey, getLMStudioApiEndpoint, updateConfig, } from '@/lib/config'; @@ -57,6 +58,7 @@ export const GET = async (req: Request) => { config['groqApiKey'] = getGroqApiKey(); config['geminiApiKey'] = getGeminiApiKey(); config['deepseekApiKey'] = getDeepseekApiKey(); + config['aimlApiKey'] = getAimlApiKey(); config['customOpenaiApiUrl'] = getCustomOpenaiApiUrl(); config['customOpenaiApiKey'] = getCustomOpenaiApiKey(); config['customOpenaiModelName'] = getCustomOpenaiModelName(); @@ -95,6 +97,9 @@ export const POST = async (req: Request) => { DEEPSEEK: { API_KEY: config.deepseekApiKey, }, + AIMLAPI: { + API_KEY: config.aimlApiKey, + }, LM_STUDIO: { API_URL: config.lmStudioApiUrl, }, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 6f20f01..b91519e 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -23,6 +23,7 @@ interface SettingsType { ollamaApiUrl: string; lmStudioApiUrl: string; deepseekApiKey: string; + aimlApiKey: string; customOpenaiApiKey: string; customOpenaiApiUrl: string; customOpenaiModelName: string; @@ -862,6 +863,25 @@ const Page = () => { /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + AI/ML API Key + </p> + <Input + type="text" + placeholder="AI/ML API Key" + value={config.aimlApiKey} + isSaving={savingStates['aimlApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + aimlApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('aimlApiKey', value)} + /> + </div> + <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> LM Studio API URL diff --git a/src/lib/config.ts b/src/lib/config.ts index 78ad09c..d885e13 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -35,6 +35,9 @@ interface Config { DEEPSEEK: { API_KEY: string; }; + AIMLAPI: { + API_KEY: string; + }; LM_STUDIO: { API_URL: string; }; @@ -85,6 +88,8 @@ export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; +export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY; + export const getCustomOpenaiApiKey = () => loadConfig().MODELS.CUSTOM_OPENAI.API_KEY; diff --git a/src/lib/providers/aimlapi.ts b/src/lib/providers/aimlapi.ts new file mode 100644 index 0000000..e934362 --- /dev/null +++ b/src/lib/providers/aimlapi.ts @@ -0,0 +1,94 @@ +import { ChatOpenAI, OpenAIEmbeddings } from '@langchain/openai'; +import { getAimlApiKey } from '../config'; +import { ChatModel, EmbeddingModel } from '.'; +import { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import { Embeddings } from '@langchain/core/embeddings'; +import axios from 'axios'; + +export const PROVIDER_INFO = { + key: 'aimlapi', + displayName: 'AI/ML API', +}; + +interface AimlApiModel { + id: string; + name?: string; + type?: string; +} + +const API_URL = 'https://api.aimlapi.com'; + +export const loadAimlApiChatModels = async () => { + const apiKey = getAimlApiKey(); + + if (!apiKey) return {}; + + try { + const response = await axios.get(`${API_URL}/models`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + }); + + const chatModels: Record<string, ChatModel> = {}; + + response.data.data.forEach((model: AimlApiModel) => { + if (model.type === 'chat-completion') { + chatModels[model.id] = { + displayName: model.name || model.id, + model: new ChatOpenAI({ + openAIApiKey: apiKey, + modelName: model.id, + temperature: 0.7, + configuration: { + baseURL: API_URL, + }, + }) as unknown as BaseChatModel, + }; + } + }); + + return chatModels; + } catch (err) { + console.error(`Error loading AI/ML API models: ${err}`); + return {}; + } +}; + +export const loadAimlApiEmbeddingModels = async () => { + const apiKey = getAimlApiKey(); + + if (!apiKey) return {}; + + try { + const response = await axios.get(`${API_URL}/models`, { + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${apiKey}`, + }, + }); + + const embeddingModels: Record<string, EmbeddingModel> = {}; + + response.data.data.forEach((model: AimlApiModel) => { + if (model.type === 'embedding') { + embeddingModels[model.id] = { + displayName: model.name || model.id, + model: new OpenAIEmbeddings({ + openAIApiKey: apiKey, + modelName: model.id, + configuration: { + baseURL: API_URL, + }, + }) as unknown as Embeddings, + }; + } + }); + + return embeddingModels; + } catch (err) { + console.error(`Error loading AI/ML API embeddings models: ${err}`); + return {}; + } +}; diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index e536431..4b8a090 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -35,6 +35,11 @@ import { loadDeepseekChatModels, PROVIDER_INFO as DeepseekInfo, } from './deepseek'; +import { + loadAimlApiChatModels, + loadAimlApiEmbeddingModels, + PROVIDER_INFO as AimlApiInfo, +} from './aimlapi'; import { loadLMStudioChatModels, loadLMStudioEmbeddingsModels, @@ -49,6 +54,7 @@ export const PROVIDER_METADATA = { gemini: GeminiInfo, transformers: TransformersInfo, deepseek: DeepseekInfo, + aimlapi: AimlApiInfo, lmstudio: LMStudioInfo, custom_openai: { key: 'custom_openai', @@ -76,6 +82,7 @@ export const chatModelProviders: Record< anthropic: loadAnthropicChatModels, gemini: loadGeminiChatModels, deepseek: loadDeepseekChatModels, + aimlapi: loadAimlApiChatModels, lmstudio: loadLMStudioChatModels, }; @@ -87,6 +94,7 @@ export const embeddingModelProviders: Record< ollama: loadOllamaEmbeddingModels, gemini: loadGeminiEmbeddingModels, transformers: loadTransformersEmbeddingsModels, + aimlapi: loadAimlApiEmbeddingModels, lmstudio: loadLMStudioEmbeddingsModels, }; From 0bb8b7ec5c22f8cc6f1c6ef943dbbacacdb28ba3 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 28 Jun 2025 13:49:17 +0530 Subject: [PATCH 105/147] feat(weather-widget): enable geolocation for weather data Replaces the previous commented-out geolocation logic with an implementation that uses the browser's geolocation API and reverse geocoding to determine the user's city. Falls back to approximate location if permission is denied or unavailable. --- src/components/WeatherWidget.tsx | 58 +++++++++++++++++++------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index e6a631e..d308bb4 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -31,30 +31,40 @@ const WeatherWidget = () => { city: string; }) => void, ) => { - /* - // Geolocation doesn't give city so we'll country using ipapi for now - if (navigator.geolocation) { - const result = await navigator.permissions.query({ - name: 'geolocation', - }) - - if (result.state === 'granted') { - navigator.geolocation.getCurrentPosition(position => { - callback({ - latitude: position.coords.latitude, - longitude: position.coords.longitude, - }) - }) - } else if (result.state === 'prompt') { - callback(await getApproxLocation()) - navigator.geolocation.getCurrentPosition(position => {}) - } else if (result.state === 'denied') { - callback(await getApproxLocation()) - } - } else { - callback(await getApproxLocation()) - } */ - callback(await getApproxLocation()); + if (navigator.geolocation) { + const result = await navigator.permissions.query({ + name: 'geolocation', + }); + + if (result.state === 'granted') { + navigator.geolocation.getCurrentPosition(async (position) => { + const res = await fetch( + `https://api-bdc.io/data/reverse-geocode-client?latitude=${position.coords.latitude}&longitude=${position.coords.longitude}&localityLanguage=en`, + { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }, + ); + + const data = await res.json(); + + callback({ + latitude: position.coords.latitude, + longitude: position.coords.longitude, + city: data.locality, + }); + }); + } else if (result.state === 'prompt') { + callback(await getApproxLocation()); + navigator.geolocation.getCurrentPosition((position) => {}); + } else if (result.state === 'denied') { + callback(await getApproxLocation()); + } + } else { + callback(await getApproxLocation()); + } }; getLocation(async (location) => { From 809b625a34cd8fbf3b380b08650897bd0b48a0cf Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 30 Jun 2025 15:42:41 +0530 Subject: [PATCH 106/147] feat(widgets): fix size on smaller screens, closes #791 --- src/components/EmptyChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 42e5a09..0eb76ac 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -51,10 +51,10 @@ const EmptyChat = ({ /> </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> - <div className="flex-1 max-w-xs"> + <div className="flex-1 w-full"> <WeatherWidget /> </div> - <div className="flex-1 max-w-xs"> + <div className="flex-1 w-full"> <NewsArticleWidget /> </div> </div> From 87d788ddef0d6d2435c2ca59b5fc260fc6979e40 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 30 Jun 2025 19:55:23 +0530 Subject: [PATCH 107/147] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9551250..6744cd1 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ <hr/> -[![Discord](https://dcbadge.vercel.app/api/server/26aArMy8tT?style=flat&compact=true)](https://discord.gg/26aArMy8tT) +[![Discord](https://dcbadge.limes.pink/api/server/26aArMy8tT?style=flat)](https://discord.gg/26aArMy8tT) ![preview](.assets/perplexica-screenshot.png?) From ccd89d48d9b06c5cfef860ebf4ebc9412e1e69b6 Mon Sep 17 00:00:00 2001 From: kittrydge <rydberg136@proton.me> Date: Tue, 1 Jul 2025 18:00:26 -0600 Subject: [PATCH 108/147] Update Linux ollama instructions in README.md When setting the OLLAMA_HOST environment variable, the port number must be specified ( see https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux ) Also, 'systemctl daemon-reload' needs to be called after changing a systemd unit file, and before the relevant systemd service is reloaded. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6744cd1..5eb0713 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ If you're encountering an Ollama connection error, it is likely due to the backe 3. **Linux Users - Expose Ollama to Network:** - - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0"`. Then restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux) + - Inside `/etc/systemd/system/ollama.service`, you need to add `Environment="OLLAMA_HOST=0.0.0.0:11434"`. (Change the port number if you are using a different one.) Then reload the systemd manager configuration with `systemctl daemon-reload`, and restart Ollama by `systemctl restart ollama`. For more information see [Ollama docs](https://github.com/ollama/ollama/blob/main/docs/faq.md#setting-environment-variables-on-linux) - Ensure that the port (default is 11434) is not blocked by your firewall. From 2ccbd9a44c5d3723222f20561deb14310337f9a0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 5 Jul 2025 22:00:06 +0530 Subject: [PATCH 109/147] Update ChatWindow.tsx --- src/components/ChatWindow.tsx | 37 ++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 93c8a0c..ad75d1b 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -83,13 +83,35 @@ const checkConfig = async ( if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; + if ( + !chatModelProviders || + Object.keys(chatModelProviders).length === 0 + ) { + setHasError(true); + return toast.error('No chat model providers found'); + } else if ( + chatModelProviders.length === 1 && + Object.keys(chatModelProviders['custom_openai']).length === 0 + ) { + setHasError(true); + return toast.error( + "Seems like you're trying to use the custom OpenAI provider. Please configure it using the settings page or the config file to use it.", + ); + } + chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; + chatModelProvider || + Object.keys(chatModelProviders).find( + (v) => Object.keys(chatModelProviders[v]).length > 0, + ) || + null; + + if (!chatModelProvider) { + setHasError(true); + return toast.error('No chat models found.'); + } chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) - return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -123,7 +145,12 @@ const checkConfig = async ( chatModelProvider = chatModelProvidersKeys.find( (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; + ) || null; + + if (!chatModelProvider) { + setHasError(true); + return toast.error('No chat models found.'); + } localStorage.setItem('chatModelProvider', chatModelProvider); } From d5c012d7486fc46e0125a4404fe7a6e04e2ca8e7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Jul 2025 15:52:39 +0530 Subject: [PATCH 110/147] Revert "Update ChatWindow.tsx" This reverts commit 2ccbd9a44c5d3723222f20561deb14310337f9a0. --- src/components/ChatWindow.tsx | 37 +++++------------------------------ 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index ad75d1b..93c8a0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -83,35 +83,13 @@ const checkConfig = async ( if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; - if ( - !chatModelProviders || - Object.keys(chatModelProviders).length === 0 - ) { - setHasError(true); - return toast.error('No chat model providers found'); - } else if ( - chatModelProviders.length === 1 && - Object.keys(chatModelProviders['custom_openai']).length === 0 - ) { - setHasError(true); - return toast.error( - "Seems like you're trying to use the custom OpenAI provider. Please configure it using the settings page or the config file to use it.", - ); - } - chatModelProvider = - chatModelProvider || - Object.keys(chatModelProviders).find( - (v) => Object.keys(chatModelProviders[v]).length > 0, - ) || - null; - - if (!chatModelProvider) { - setHasError(true); - return toast.error('No chat models found.'); - } + chatModelProvider || Object.keys(chatModelProviders)[0]; chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + + if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) + return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -145,12 +123,7 @@ const checkConfig = async ( chatModelProvider = chatModelProvidersKeys.find( (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || null; - - if (!chatModelProvider) { - setHasError(true); - return toast.error('No chat models found.'); - } + ) || chatModelProvidersKeys[0]; localStorage.setItem('chatModelProvider', chatModelProvider); } From cf8dec53ca246bb24a73b54aefebbb31e0f171d4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 7 Jul 2025 16:09:36 +0530 Subject: [PATCH 111/147] feat(chat-window): select provider if model's present, closes #803 --- src/components/ChatWindow.tsx | 39 +++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 93c8a0c..67a5d0c 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -82,14 +82,29 @@ const checkConfig = async ( ) { if (!chatModel || !chatModelProvider) { const chatModelProviders = providers.chatModelProviders; + const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvider || Object.keys(chatModelProviders)[0]; + if (!chatModelProviders || chatModelProvidersKeys.length === 0) { + return toast.error('No chat models available'); + } else { + chatModelProvider = + chatModelProvidersKeys.find( + (provider) => + Object.keys(chatModelProviders[provider]).length > 0, + ) || chatModelProvidersKeys[0]; + } + + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - - if (!chatModelProviders || Object.keys(chatModelProviders).length === 0) - return toast.error('No chat models available'); } if (!embeddingModel || !embeddingModelProvider) { @@ -117,7 +132,8 @@ const checkConfig = async ( if ( Object.keys(chatModelProviders).length > 0 && - !chatModelProviders[chatModelProvider] + (!chatModelProviders[chatModelProvider] || + Object.keys(chatModelProviders[chatModelProvider]).length === 0) ) { const chatModelProvidersKeys = Object.keys(chatModelProviders); chatModelProvider = @@ -132,6 +148,16 @@ const checkConfig = async ( chatModelProvider && !chatModelProviders[chatModelProvider][chatModel] ) { + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + chatModel = Object.keys( chatModelProviders[ Object.keys(chatModelProviders[chatModelProvider]).length > 0 @@ -139,6 +165,7 @@ const checkConfig = async ( : Object.keys(chatModelProviders)[0] ], )[0]; + localStorage.setItem('chatModel', chatModel); } From 01e04a209f4724a05f5a4c5d28b29722beab9192 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:24 +0530 Subject: [PATCH 112/147] feat(public): add screenshots & update icons --- public/icon-100.png | Bin 0 -> 916 bytes public/icon-50.png | Bin 0 -> 515 bytes public/icon.png | Bin 0 -> 30498 bytes public/icons8-search-100.png | Bin 1531 -> 0 bytes public/icons8-search-50.png | Bin 750 -> 0 bytes public/screenshots/p1.png | Bin 0 -> 187470 bytes public/screenshots/p1_small.png | Bin 0 -> 133129 bytes public/screenshots/p2.png | Bin 0 -> 642123 bytes public/screenshots/p2_small.png | Bin 0 -> 206329 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/icon-100.png create mode 100644 public/icon-50.png create mode 100644 public/icon.png delete mode 100644 public/icons8-search-100.png delete mode 100644 public/icons8-search-50.png create mode 100644 public/screenshots/p1.png create mode 100644 public/screenshots/p1_small.png create mode 100644 public/screenshots/p2.png create mode 100644 public/screenshots/p2_small.png diff --git a/public/icon-100.png b/public/icon-100.png new file mode 100644 index 0000000000000000000000000000000000000000..98fa2426346528e44e11295ce77400ff5096b2b0 GIT binary patch literal 916 zcmV;F18e+=P)<h;3K|Lk000e1NJLTq003kF003kN0{{R3M?7U_0000#P)t-s|Ns90 z0092}{`dFyEG#TUL`3T9>KqGj(P@$u#5<vBSymzS5?+S*c5Qpw55wY9ZlV`HVI zrGtZmd3kw*)woCi00R(7L_t(&-tAf0lBFOF#Q-A6Ci4H^I@p5Rqu7n&t(qzGDso83 zazYS#<&{@n`4T8w4TZY{=0Se{7fj1>DazRQJ=I<s{-d(oNUv#FFH1EUnpqf??deJ( zDT{0URgk9XsL5Iz!1l|+X1op(w6R$b$(l+a4Kq1Cwix9go-x)fztiLESF5c$Mwl#( z5H5r=k|rE?xN1xYS{fw;zY<q~+A*SNe6XsGiZID9#O?;o$9>d6gxL86orIg2MUcF` zqO~-?o4t}M2cDBWP~Ojx(I&(G6Q;AZOzEE7IA_1*5i^H^-rJqe_fACNv5gK}cD>u| zC}t44cdvH7uD<X}OuS|0b~m2~p}Z^rb&6l2c3b5^aG4@&CUVb#tjS6~2BH>CI{O$1 zUh+E?kAWZ+Z=M+R90(F)&lnjDdJ-i3sgwZpFvyOgJp%IktsVf`*Vg(VeVYrbiXaE| zHztT0AhBv}azGM!!Z8Y+4aWfWkohpceNB+hut?XXTzVe`Qf}_;)-KqRELpl@uceC^ zocUsjSQw{MS@1Qi1+ZbfjOdV`9oevCfvN}?x-$1b8@9cRRtV~#pmy!1f-iBJh&**| z%`Q0bG2g|yJV!e7F7%TC^-vI2c4RRoXHLnaRk*4iPP5fv<<j@);MKKMQH#G$Om5rh zb%Us+hgzMh3sJ#`ZKJ2FT>To1p=q<>;J6jau8rPU#a@Y5k|nK7F2x<&G1?n4F3tS6 zGeb&{u7>mGGJ4Ha|B0gYnezKdBGK<Dk$8aIeSmlUM>O>Xc|rbBkjf7@8IamfQAZ^{ z=GuMLfQyf6DF0-7Q2!!bW#&G}n4Ksj0(QU1rw8V<CtG~4$^*!gkwAKUc5sV#^EA3R z^wab(P3*N$nPyt8vI_~8XFY3Z^sJg@TBT;1W?C!d?T_75k#(|BKGQ;f4QcFghXAr` zYE6Qe%ozfYT_q6W^1g#5sQ}WEQJpy`D8In?(mU~t5JL56#ZSip;k@p{YEnGR<U)w{ qS3|044d$&Vo@u@E$}6wDg8l#-%^wQGi)fkv0000<MNUMnLSTZ=PP*0r literal 0 HcmV?d00001 diff --git a/public/icon-50.png b/public/icon-50.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb7a0ef00b12f1d0c51de08319440adedb007ab GIT binary patch literal 515 zcmV+e0{s1nP)<h;3K|Lk000e1NJLTq001%o001%w0{{R3DdBj70000{P)t-s|Ns90 z001yBFz)W|ii(Q<{{H&<`UwdMB_$<CM@Q@H>-6;W;^N}V%gbkHXAlq&8X6jPb#+)+ zSUo*G+1c5tsi}W|f55=Nw6wIBmzSWRpeNoOBLDyaZAnByR7l6|Rb7*VAPf``ga9fi zRQvyb=!Jfr&I!`K-AwalWM`9QNt)&xkI(@6AT1a$o`EcsPJP&;xQ&X+USuGFV07MW z8P+i+RSvSqvBUp<!xIKf3}co>n>kSASzZ}7A;4J!ydZ(aLi*R&1xZ}?`27bL9xH!U zc104K0YK~Hz3oT{WzTd=h%}ile3Ator*;qu$B;Qm*<B7H?6?m=p@^K{fS@$fNCSTh z(y$p0P8A`|VaL^wUtL`lWPM7Pv{!^o`V^8pqV6<$MVI#c{GIivH|<w#qC$kU6>k%q zL?WuuU)`uKRqvTwHxSRUbrqlr0g)n0D^z0fHFe#3k-gQcn<{&;NwN7RlWx1x3)|hx z^4`6CaQmNm>=P&d56HP^YUkKy)K^c-+)PHt#FAqKm<30D7xt4s&ZR9T(|%DKjjky% zo@_C+@s_w9PPUk&{<;@cSU1Vi7Bfuz-8&k}TkIQW@dN(o4_J86mcIZ1002ovPDHLk FV1nvw>VW_N literal 0 HcmV?d00001 diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fe3c7728b8aa93e8c462a411755a9a6b33eb67 GIT binary patch literal 30498 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 Jt70GZe*n1=%RK-9 literal 0 HcmV?d00001 diff --git a/public/icons8-search-100.png b/public/icons8-search-100.png deleted file mode 100644 index 6bb6582310a28a061710535069cf40b620c932d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1531 zcmV<X1qAwuP)<h;3K|Lk000e1NJLTq003kF003kN1^@s6aN?Cz00009a7bBm000XU z000XU0RWnu7ytkTtw}^dRCt{2o!g6*RTRK~HhJtNL+i1zR7`@hoQOINngl(hL_-<T z#V$lew}<GZmoAht6=g(V5>!|bO$9!vnPvJCp_Sx6&~3)1pysB{sMO4f4QuFQvA^Rv zp4-~{+dtSZGiRS~t-Zc)uWzrt_BxPABoc{4B9TZW62)a1umRWvd;%N>egsB=lhQ`z zZ-?bG?z4AE-$a9)1*`|Q0YgBg!8R!0bqg>rS*Lb-fUR=3S6b9Yfj5Db$uRl!0y}`2 z78;`BX<q}^CByvBQsA>12JRTJTl~V^z*WE!U;$8)wm|;o{&$aj*7f<jhVS1geG7{l zz-NKuRR(DoctxI`xeZ)vu6)O<@|}6tn*yE@*$Rcb6Tho6Fkb;T09`G(b{DW#u90{B zZ-K=Wgqwl!oPpRQ(@nc517GIIG6wV!IgbI;9_4=%ztAae1b+3%<z6tJBtqthgZ15s z9{^`}T0mev@L`UO8%2j`*p%Zy@5dew=DcV)qeQ_YIrH->>~b~mmq+d=h`@nspYc1e z0{g5GS+lZFhwSJt07jHT?(OPw!r>B62xlzBSK^XqoiSy6n#$u^k54%m+T!s!&-`oA zf!E4I9(|rBpxBhYqdp>h-uFE5LBzgvpm4~@I-?oulp{(v7o9du+4E?-4WU@L&7+?S zTAF3ICpHxudzFs6Fuc>J?;f|nij8YL@h+1)k6V?X?oNu8{Yuv@7)(ge3n;gr5i4tz zt|QhGCvH^&4!3A?$qHwB!YVFIWQO;Ya4!=-o0ZP*U<jQz<s4t^tWrAvf)OtAWQR18 zkPr$bPd1B-QgoaRN+`D$DGGa(?ssBvH!zx=wHoMGx<8KrK2<`wC#ERet8^d006!?9 z>Ph427K0v@wjEd=Q2(;h{SXHDSqXJv9fP5F6f3g8><*wmvU8a2`x6Gx$pGh`=2Vw$ z9|zFiah~e;Ck8mFgsOFG^JtX;nFydi5-!R1J3*ud84sYp&me9rf}OIqR~e9j0Q&o; zEa#Jgb?VD=PDwcfpC3SfpHp}F!RB6j>)Dj*76&>ZZJ>_9u+U#`R(+2F^xH}&v)J3s zeHOE8HY%Z9D5WU8Xi;|^T>PBk@P*R-4h*nN2{jp7nq?Ei?~5?PU`V-2O=7ju*^Pl2 zwkhG<$=TR>P3inLhFD*~B!@qg&Mp(h4D&pTEK>qDnRT8sBPHvJa_$^>Q4;0ez#uC< zbxPa@PHgll9cSv?)avL_1a~MuHui;*Y>mXRbg<54HO9j2o~PpqjI&b-eMAnsgw8oq zal%~e>QpR|<6c?8U4?|u8Sq3Tf;iHKlsM8;*8_yh!=V=uC`pN<tOCa++z=XTWUoA{ z%Qqn|d>47rY$mLpHp<~r&w_U(#KHly^aWg6<1)_~kbi;e37p40^Y57P>1$0+k+oxO zF0j_NUBy|S;z}V|bl@jE^3JyL7>qI}$0)O}#Pf};GX|;{B08fu9?dE7H*BE9-(Zc# z$QmVzW8Zz^Lwri^ZS!%sUQcYQUZX_uq%4*aM|q0wll_#g7HuxA^Muf|?Ld{vsnHsx zBqfe?m_@%LZ<Yg=r3SCHTDD#FPG7c7$qM`o8RWtl1&Igks6pvTIn&oK32J5OyD(E~ ze4+fUET8F@RGrCFeD{pJT(~NDSqf_u#CPm!b20vDNxHtWid=;@3KCk`l5@JL(xm1R zs$T~#u2H7K8)Y_e!j-FdR}SS@8f>n(!CSyhr|FN9Q4~w%9QX^efIB2VZ!{tYW&V*s z;E+U`-A^99Bt^%XwQrG(Vze&UNYNIL*6B$`u}4obianB143dmukYp5tB%>H48O0#U zC<aMJF-S6sL6T7nl8j=IWE6wc6S{w@)4~>oo*Dv@?iaKZMvRh-VaO=S7>10JjA6*p hCkLKLBoYbQ!GHdQ*7*!5-&Ozs002ovPDHLkV1np5&N=`9 diff --git a/public/icons8-search-50.png b/public/icons8-search-50.png deleted file mode 100644 index 7d83950a048d2e2ca2ae07bcd59fe2b86f64491d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 750 zcmV<K0ulX*P)<h;3K|Lk000e1NJLTq001%o001%w1^@s69zTe&00009a7bBm000XU z000XU0RWnu7ytkQph-kQRCt{2nagSvK@^6+Sr~V&G%ds|CaztI8ZT?3D`9jJB8c$; z1TPqbs5|um1a}$~3BgS=lC?%RUh)QRG;Y*vG?*ACX5_%%P=*$qOjS)!(jPQ5Q$7Ew z(^Ylq)M+RvC<w`JU<4Qk=70s@m#(kCJGGq$5^~5fpa#@|#(!S+>@;wc9IzLdaXPmO zyZ|l%2Y_y1n=ZRQ2wVnc^=$gTXFy-OoEQcc)sY{-ZD3au|2N0(087&N4h#{Q8_wID z0D4-`+5=2FdSgW5mJF`xzT`>wBJewwGs7}u1}g#dPdm;G5^!OsYvNicBfzM$X38N9 z%s6WzBqe9f)I#hN4Mmt<!qcNj*Z_|B6s}3sLToH7G@H#SpJ_*38(1^@M61|7v#RvQ z?px-9-pq62^HR3Y`4AhIn57-Dxgy&Se2C3S%yOsL^vm`eA7Tp<%UT~Nflt6ZFc6?U zk?k)Y{9r|5T^VijPLA|3K>K#J{oE{$EQX$11L}-*;&_1eM7H1iT<mrzip^o!wlKUY z!tZ?_Vj~i><7sSO$@VE9Vu_QYcu5sDkfQAHB|5D)V~JcW?#kv9pQ48(x*R!;Ujz2} z7Ee?8Nss6BEKK{UW6L{b9X}g7j)vm8Y<vz`jT~}{4^}Af%^7LilsZ9R#vErxJx#Nc zMk1}CShT7Vfz+9F9$S%Zqx3p!VtsA6N(2U-HM6A9+{`}Htq{8`jc*x6@Oms~%1$&( zr^KvMi+(NEE?tR!yQ<vDEn+`bZJ^ptXHdyzs>#m^cE)%F?B{RV?o2vetWfX}c&m>) zE85&X0Iz|2>eNpDO)i}Ah1HhVJ7d%FEFDOta3-fzijm1Fm11OaN;P9->;o;GKFw~@ g;Z!?$B-m2?0UfV5Z^;J0ga7~l07*qoM6N<$g6)P#ZvX%Q diff --git a/public/screenshots/p1.png b/public/screenshots/p1.png new file mode 100644 index 0000000000000000000000000000000000000000..02f01e5037305d60b3232e622fc1bee1931a634a GIT binary patch literal 187470 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≥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%0DG4(UYYm}E(>IC;KU{_A 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 GUiu$c2I7kV literal 0 HcmV?d00001 diff --git a/public/screenshots/p1_small.png b/public/screenshots/p1_small.png new file mode 100644 index 0000000000000000000000000000000000000000..13d9a4265d5660f684d8914402763e81961e396d GIT binary patch literal 133129 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%0DUN^OGpHE4UC+neFyzZMSe$G9V%GefT!0Sf^LR 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 E4+#G)TmS$7 literal 0 HcmV?d00001 diff --git a/public/screenshots/p2.png b/public/screenshots/p2.png new file mode 100644 index 0000000000000000000000000000000000000000..117167569fdf383847b95041147e3813c2a78ed7 GIT binary patch literal 642123 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Ξ(;7A17kKm@XL5ap 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%0D^E56B@?Lsz_-c)Xh^ylw3O4O2P4lOYyuT;cQc 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 JS@-LvI0OT0K+KN-~#+$)1e+SY}JH<7E$ zjN}-GeJtaD0oGpv5TUgC80usBkujHPkCc&1ucG7Lxg?DTbadv`7e^C;EaKRU#?lcN z*F!OK!c)BG-6Cl?b5$+67T+-d+~2OCD$zq}-_O8<U90_*hwgBY1+FYppaRjut^3Nk zHS_oVe|)fh9MxO1T=AeT3J5GYxwaNu5j~*L84bqkO>z_s&HRd8YlX8`%cvBoEFdZv z#`Au=+G$&f0&s$tx3jLsBVU&s$3v*S62fGWQ<%r2eZ4)xB_a9>4r0ZNzsAifem4wz zqxO!D_DNb!aYyRd+R$#?Lsu)S40p?yk_k2bl<bQ_WR&cmlu~gtkl?got2d5>dTd6h zmp;UE`NDloPep%Z9U|T)|Klc*X(?H<(O%Re#>W5gQ&V2Y16Pjoow$ds#cZ6{d58_- z(1%Hp?^HcQ$yyQ?P^chJ6Bjuk`;&~ReKP=I)L=A*LUbju4IHXA|14I4vcR&?`wG}= zClsgWy!f8i-YP>L2+Zj-DV?DvqXJfP8os6@`nj|s0ThFwVA>@4oMl#$`v6*UDBLFc zhdfxDS3rGiUK71CkZwtOmO2uf#Dvqax91EH`2it7Jf8fVN<?<m4ksy%FH=7!CiR>( zko5cfv{M?otxa82-S1ZGbb58Z8q{5Db5#gzxDx`O5SU^@sn1=^sz@=!^-hN`+ylp@ zuecKc^<~Tfr0cckN7g9>8~jv}C60cLM&hc%<8*8DZ#)|)W<&`i(I$6Y94wpD{BKg# zZ4$;wlf##y!8zWq-+uYx-X}iAw%+J^^|RYXhV2Tj%y}p8?u&-e8`s~SQ_BUhydTj= zujX1JuB<Ex^6<KV+&RuMsWX$$PuX6&SOQ-`kbAo%pd{RwP4nPyJ({*cig<i<_V7MC zYRVgUGQ#2B45)|>|7r%!N)ChZ-6gkwee#=G^%b{TIIGmga9uPeXF!qpINc}6&$|B5 zGi3+bxf#1ytNMSsjKG%^@&5-`5bk9Y8e%><@uX%@M-F>gDEjBC$!Uj?;q`tr;EuWN zG*tk*5faCNbH~i{Y;m7SOqsjpJ?#BQQjvsfU?Uz`n}F7La&nG%G1Ohd&9;KySWW6_ zQj`QMT7ij`{Bxd<lQ0`7)a9myA>XC!euZ2H_an-i{Ka8BY07W8<2#7?^#)kTqQSJW zUHQTKPiUVH6Z;#~$5!+orYUw=)|j)^cZNL2=B}fQ1>?!Hj%g{BQ+i;c6JKlOi~fvA zqUv07rHrhQq`zXSCLG;WKe#@UR2)kt>rz8qtuoz3eI9!@92L-oToo+~t$ztER;`IB zpxJz~u6*G<M|9*n#)W`B92!qLQr19+L-3+I25x<G3NrEhC?FX`eSR~zQ#F?#QYnC? zvF~;;3c-RSN}!IO`l!ePlTN-+T?97`8u${=oSt~nwNV^G)?xV8sFb1~LN<!G5@mQP z*KK8Gbx8&sFn_SByK^?yR9bY1BNDi+BLp)hnK#+jUo@2#Tl49Bhv2!Z`<RBwz~j+$ z8L0z@Ns9XVRH=Ms&ISh;C}AanKr~UYSxjB_Q(t(7r6FJCIOo{iKhqnzRur}@hGOUL z04s8yJtX1ku6CGL2y>}NSZYE4WuQL%AaFw{x6>u?nC^29cw?~c`fAwhwidN$%B`O0 zbaRx}-b2-X-Wzl91opmMzbY^U1X(q&T>y;3^kGBj&6k&HP4Fjw?sM*O9#ZO_4k_Sk zYg7ji#QvOI>6z^PiC_-OZ4C0=(a601y&o8<8L*|3a_qhjcnuOZl=*!CiFr=x*`6xh zw|lw(+?KIpeT)N7Q_!yIe|nxe=nj$cN`9fj9R(B|E(PzRTc>LCNmv<uj>}-J@O=EN z<IXT7enjQL%d7_T>LA>D@5<+8{4se33V$wAChIx!`B413Q^kl6HS#}>q%!25JU`?M z@!^h8;C|2_-{A%R;-$r%qV}2|=gD0C60Ynot~BPcR~{TV378M>q~hJ-oqQQdoe8@g zZVarQ+Ut4qE7QE!9im5O`H4>_>G$)oe=W)cs|4`CpBomfK5vS(+E~or?eq?4^m;@# zNZFJ8$e`9yykvKZsF4LBa#E7bZzK49voTmXI{q3`rA;7|q&{#b_R)PdSH&4U;KS6O z{6_X7%W6F{O0C~vnu=X|fwRoxn%m~h1;f?m+ZsuMMezqPNHSR=J#IgH7u|Sl1;=E8 ziX2$^$jE*5tR?kIUO^K2Slv+TS2+Fp)#)jv2eInjkbyWcfg!qpNb*3IbtO7@@X9*q za<!n?P_tj)Mu)>XlW9{qKRQ?Z=|Y3koG9zH_QL97OR7WXHbfUiN=~2{SoEW(2L2aF zrMj69YRQ#^@YX)M9o>d7y6^fv@;#Q=Qw8`%N!8Hx6vcs+v(3PN*R7W}+8EVw`^DHD zTeh)NIf0jd0h1G4Z`7$m@M_)S?P<edK5@VY@XDS&%2X9YYbbcw)H+viZ#-bn<GhQi zty;MWH8teYx6&IsT>QO%KW&j_?<sVb_ZTR5NG^w=PQPl`;oxvh=|m;bOpqK^h4Fs2 ziH6%xd3;F7pfb>=2OD1LyzT+mYGvy`2LIDyW1h?6dh=*XFX=BtMw=dWl#cj{Ueuw_ z|EGY@M;XhSJW4xLnK;NIBpK1U$LqLIO&jo%E|@<O(S|n#<@{BnPGE|zQp>Pd?9cwC zG_o^I>?u-b_u4MlDn$pxn&6;7NotlpK!r{5DLvJe#q1wRquK!%=lo%>DAYpx!LT2D z@@4;(!P{xCq4hUT!x4`$O{MvFhS#}glni-`u<PAEFv({Ku*SNzUFSqQqZj-s;z8+Z z!i8;ZSb@}?*}f0?Z5JGS5Zb~GU$O$l9>ln`q=9KR+f|dyNp`@?1CokLY@DS3*dE7C zxk^f&zh}dRW9C#ZiLtjPIH|m)ZclbEpxB0B!F?CD;vw%6izsRXpv^-~t{N@KvUk~> zXE@<cGq~oG0)6?$-5kL~hYJc|qW+qZx3I6w`>URxZO26sd8BGm<2zJ=n$Zbr!}viH zF-1cHT4Tuya(nufto_%3hIX~On@Gr#aX)QMo<?SIri6_X@d{m28^mErK)j$@kEl(* z8O@bp;#M3+eAo$%gEGP=nWmzmqq+4*LTw@xz0h^mivVBiD7Q;L83chQnxx$`H`&Bv zOt^~2)_uROC8?gKvx&KVsVW8y1e_e_-p#Y^y-@AgNk(uFKTv(Q)bm9ewy}D4J({!z zyWm+q9(M23H*r&3ZwTA{2x=_7Da8-2x*q%?f$msi25QxsK`B%M{uorcGr84+4hA5+ z|83ek_)6AzSYk$-ALmXU&NhUgP)X<2=aq4w^F`+RCRpO*l;IVN(f#?o5PtoKTGYiL zc5h6bnsNF;6@QFe8+M1ly2I*W`d?O3WI=xA1EG>St2>&j{MNchqT!DTyfH>>Q+Mn7 zaHJCYi;4wm`3RSlzz_=6gB@)53lqbw&rYnbeNFMh<w#SVSh9xm*HYqKZIS@tYVG`s ze@jLbWU5L}tea=lN+kEy9*m!OTaA{e<B@a`r*G+p>VBlelUq|2Z-i0R7)S{katw-C zv>SfrcNpVV%N6NnqpbDkL-H8cn-3<jzZ#?X0SQ7CvVjmv1#fx+*B3FMMTZjix07l1 zPslEYaqXzp&MRLHAV139{8SN|5OA11KVGl+QH?{V<exyXs6Eo@sHF%GKBz+w=r|q~ zRju}#<qT&Nw!!VGI;a^Y8<U(A+~0J_ZWGxQIn6s|@8eUQQ~|LnN*@qFlS4Az8ECMv z4U2oc$`WyK$&GmPc0?u6F>Q5|8u|!smi@53a9+6yMn($VP|x}m5)yJtKvmzp4X_X{ zVdCav$amDaSYyc^so3%vxN|pEcb9x7Z~tn#cH!^$_-+P_#Krc1^>nB)@08;<`Z5rg zd*-VCQAdOw=V0ga*i8AR898Y9-1G@Xq95Q=3$QPZP!WnFDRoPxo0*jcHI`KNXF(sa z`Ev)a_S=~@bAzOF0JpcHwx#K&DJI`F($AcVnAweP=TgH&?YmAcLgS!}sQL4{s({g* zzf5=M{TqSex}f>*tEIr<=!X9<a4=xv0N$Z=i<nDTei`Uo$-w4);eU9BdDyp`_!VDI z;mJPAPz43fAp?pgh&b#5L7;m*vJXMm2)nc`u}VFQx?SLX<Mca@XFFHkV1zYS-O7$X z-cmq;#K@Ig;71>8`Y*Jc{AAw*ZdFHi#4ENHH&!bcn08U!=%rm@_V<S7ZY633E>5<Y z@}wgDfjxw@{?K9OaWM3dYtRQ=cDT554mb9#`0LN;@YLIKgm_6QIZ6y48;3YrfnXw& z4W5H6pvqgr{owMtFD7&$tls|0V&NT*(n2BOQ{dD9H#CC^jQGN6j9><6-Dd=r5%x89 zJ*-0#l5BsGxx+{Fipo`jGO!2p)fQN(yf0sqbpd0%&v$P>zh-+)Y_YMFm6D>pK_7*r z3f`Z_FEI_saGNxK+UPdvi)p~1YZ7yt-XbDU3IcJ~1HgPP)9uZhH|cfjB2G?DuO9gj zFEaV<2qe4qNxL@{EGy8&p2+|XMd<)Y1Y5IOVN{eV+0r%v%haojUT5LIONyBO{@rRe zL&QPPCXV9TheuJ0;Kfd;eH48t`h498k5h0>q)UG20ztcG08pOWX@Bhp?E8(jh(7?R zzg~l}0d5TIG^?L`+r%jevNA#ELqW%;FihsDRNSeE!61`|q*;nF>qhRQxo@|iK+Mna z<41q$)Ie*dm)~=5!+@+m%Bh#$FWEC*kV(2U?}}EKG)>02c;g3O@2$l0^#Nkd)?xa_ zAV6TP{e4d}@F@B4-}fW-C!jt1rWYW8MdEj+71$i4z`npaVX5Am{}CkiSpUUl5%zzm zcOg@`9aWWPHf$V24rugw1{sAS4O|<YVsM$Zct{KV4VNk?^(JZBfkfb5eQRzdr<;<D z%}bOoOH>pvlOuVC$3PVyKkCX&4DIi(ZTb%Mvja?4pXdS0p??VvgY(y!`Ne~qB^;;q z3fwJio0dS&Nx<Ceq!EFNN#rx*CjHpWhzUHipJaI|VF4MWgpUQ!hYOJwS4;eu67PO( z*hd+WQm9Hxa)oUQef$=_E~aAZA$EZd3L}s1j8=#{S3Zml&?YM+RLP-OVAD=;Pe*5_ zgz-Yj)gFK$hZ0bB6ZMcYz4qw`$)f|>*z$q4LzKv2P4JvR^aMXaMzucgLvBnC8rN2K z@wi2uN`PlYdPv`|Oq#In3?&xe0bEetSV2un4go`1>^3vO)fFl9@AH{6sUN?7WdzRf zo{<BFyQQwPb949ebcTa(LcoxzHJEmefrf^G4`+v&)~1#<5&pBolY!OEjeB1Iy2W)_ zPDpPo91LE6?!LmvQNBf?1Z!El0Z<BlaC#B>vwEz4Pt<stjqF0d8;W%*l{?3GBLgl- zM^nR4X?E8E+S=Y4A*&@$h(Ckb11Bo83zwx~QjiVu_$Hb&ho3#5iT6l?b-V>V0{Cx5 zjy{X|cImEs0%TkPODQoVItQ@GcvUsfd1wlF6`Ze7wKvWQ47p(DD({VMg<icM-y#k? zz`8z&l$lp#)WvYs<oblUG#v2Y-!pdp8DJ?Do6&QOiPy*JfY#?dyC+`%?~iMT6}!^V zGaO~<qcu|C!+u1#E)%0mQTh=_)Ks+-YDOR+_yd_!`Dwb%m-SawAZ_mmq{WgET@qs& z)wiM7W97zHNVH|ukwt8nkPz|ghnRpuU$IO*=TR;U>&tJd#~_{^3ag=?A<#OUb-{+- z`NlQ9TjMcp|A!<UR#5ZBsv^3#j529=W2x?tSxUyhQ$xw4o!8c?Y7%P9G^$-(IIb(& zVbx1YRs&R0KSYHyu{$!qJ^+mQd(by2YvM;N?Uj|htVx5a){<ixWYib66@oIu?f3{# zK^_NiC%}Zw=AwBXAEGwT3lx+uB5O50qqRs^22yGn=9XzaB!7Y}Pcn5flY5^3HHJsW zi1jvUpRO(>Vk^cdcX!JxU8)w7Dfw7sm<#67H=1{1>X4<?=KfR8Pncvo(`Q=&)2e5- zD&i+%G8FT`7y*R=)IGsk?}_#)*Ldir0{z;w&!f$OHb~szTd3Q}p|$}!V7z?>cl=n| zJyRyA&0<Kv6<O^lShf7s)zqJ=6J=$2_w$Gwi0Dc-Q65W<EOJCpTZ_+r*O0QR3dH|{ z?Mkz_2M2kWY3)dy{LtZ=%)$#ilGK`QT}_a9;trXLzS>x4tf~W@Z_3=w43rM1@m1~k zL1%{d_r7jdO2K1*Wg>0d`@{{{3_|~g+@pMInC2(>m`gc&MmQa5SA>5&;pVlZ!2P`T z(=-KL6+o77eD3+|e;dR8=YdTt<Cz3?*D3iF6tUUZkw=G-rb32QXbfTRR>cXR*JtIO zD8fD^T!HCDD>9J8)5_ifS*F^*q=2<kep%CFln*Aaqd_lbrVdepu`h|y>*S~ofg{S~ zIqqRm;V0|X@1saT<=-3Quyt<7O<cm-I!thGIS0LXy$AxpqtUW`*c}Lxbhc-UQ9;)` zg=;BGDG)nD2x$7pT&N#oAhz+<0}{<&h4~4!8AugLU=3x?;$u$c%B!p)RZZpXpS&UN z_?IE1ZmdSiDnYt`uF)AE2b~y{ghnbB3W#a=?j^}8vm`pHT$nAeu2Nhe_mfQfrJ)Nj zcp>_!O^{=#JKeglp(ZIwQ($c>NBBgo*1%?b6m(a|vG5Pap#A#o;Ox`waS!?`6IN)L zgqNdoKtNO6KENJR%i>-hMzp*54jcD<zkRDN0SKUW9>ew3)UrjLzGgfm9z&U|y}wF6 zCS6Xv8KjLh;Iw}?&zCK<*>S7Lfvy)5O{J0ssDLAFw#I8Ln@}PIe64X!!j#pWdVjgR zxp}UFPv)~sLVSQAO|{klYc5~<X1GJo=|IdTRO9IK``uxv--&7-ra2AM*$IH%T4nnm z4L&|R1Ds;}l%<bIKUda9Dq635!1DJ>vYZ9oKS-uky%7MG$3!b@eDjzdfFf3bvMCR@ z2rLnM0!#gAweH~xq>iqP2#pJ0y-0ciFdTzyv)vxF-QDc30&dhl$vXHPP(TwjO#cUF z=f?*iT`_zrrzejLaXQMrWIm(%Z-q(%I~@eEcL5_|7cUYJLp=yRvgKhFt<><_5Yo5= zLi4;Tx|^4C{PR<fIR7QmFenXj<+U~8G&z!LfO<&HFS2hAN)$a3-FX^OMW~XGs_yX2 z_jK{BUv^^RHZB;u4kzo9BG#{Le37^~e5mVm29+9M+?AF=a$+65XZP<X2bB+lbXt~A zoJlZ5IzkYn#FEFtjAox1Td@k2w93mJ6rxB(>O3JA7~GteWT3R&Adu0V#JAZ6X9bDc zRUgP>0d);{8+=CJ;>q#Sbuk5he`j6dQEO6+N|Soh6$EEAM`}(*16)}n%u}pVGOPWi zkgeaEuaat?{4Z?s+JGp{KIGaIo)>f8@0nWLG*7Jdom^adh)R_#H>#i|XV414I9tzi z4Ir1oWkI8(>c9*YxK3X+(-zR2fpxXHm@U&kT9XP7frh{n5SS@eNnhl~4B?NDX>TQ- z^lOl!tk%VAH`5I+Pt;xBlD`_wv_XK_e<$6z@>+Lz4^<)R)3&?4#5hoF8UOl4p^t{% z(wf%W#OdagqI;VTmJDVXFVNvVN^$WvYR$lq#GnU|@Vkj5MzXJ#GME<1nXn!M(|n`p zy_r>lj)r*ePUOAk=KVdv3uOZI##vy$qzBALKl$qUMDd@&saESKKuuKp&HK`<pulb8 zMM3)ja4OuAg&d?`Y0@-jk>fEYetxqbWCp9Ja61pdW$Xa1e22i2QFT6n3@l;~Hv0uG z2c6gQ|5b#WliicR$arUUX={PHW-sE&``_xCH=c>-$#^_JYeCw8ZBhjXy8v`RD|^`! zoduDyIbsBcE&gv);d@S5HJ+=_rrRPrxIkXPcHo3eU91&nY-biEYbsAqZN_d?7^9qb zDM)2d(ONj6_aQg-s%36b%P#jOU6+@6SVyqi8;%Cz4WVJs9QQt5Do#fSF$n{oy(4@I ztS~WPjmESfn;zmzbvPm6nSnf@jKE?dt}>3b6?N)6T?kYF3jidODE5^og~EZyaE^S} z!`hpPZ`1D#JvQ<y^E*|{DS8GH1&MXmAmP21=(r&(k->l*+dkv>Yn)_-MJdsVJx8DE zndTnv?I<Vx83?bX8~@D4S1fTlI!>{e{zj<{!I8EPTx~_6p@_@W?V)|>fVO+`nljD9 zxs7uLqcvO9zK_)RJ%dYwFxk|jmkrMGs7oIPvw6Oq<Vm{yi@v9AAuj%_+Z;Hk#pA#P z@8gY6DTwAIHRwIJ=iBNv^vccI#F&wSS=@U_V-3h}b@0&<TcZv<&RV2CEH5dcWMKF{ za><{9tN>=XcpsIS<X!jNWCr3}<4-Cf4U2&iK#ZK&=U+A!HQbkOjyqY=!9XMf|1N^t z+V48&Mrg(r5Hr0ZbWA?W4)`VRcVcy4^d1dq|NXyQ0H!nk@4E|kw`Z$!i?{U`BLUnt zIqPSkQ*FTJ(9ND^f`F|F+w_~Q9~uz^&%3CBOuoJ;gI!82hmntX^vee_0h%7<GBEyE z#<jkk=C<V?e>akLwFh|ki(DaL!Ci`b-^n`sjC_DOaGf>30U8o;&u+fDCR5+V02Y9{ zDSg}0|1hILLZ)InJ~~uY6b-}P(S09-^wdc5tP94dp?e`84ixjF!SgE5BJ)E`|D8B0 zPyHJGGha=qvD8VR`oW<xoIJXNfC2l0Y@@zz`CIsBfpY2a505)M$oW)&Kw!C&Z2^pG z6U=l>wWj$h6&?zZuL{g0F!eYUwLQchc$3Fnf5?t$KH%Q48tHGQ0s3cwyf|3OqeiY| z?9RE~C2Qt;Lmmx#nH%#K)IeTuZ)yL-jI;4bZ?_Y8HI^9~9-G$XPS1*}Q6I8T+UO62 zW(wqMSc{<kDrl|L2?o}3m^G!Y78F6=v8@ZkZLSj#48#la85M<vg$PD{IJW8$^CEPh z#spxjmMqphf`Qh2D?h0OJ0@GLG%8vq3sh@D`9{XC8`KEg=!vVA+kj$MPP*)aM?U11 zO}E)G*?d2=-_%I*>EKtjUB33;bufEs6AEQG^4o(Ygs+DTrWC(X2AH%RgHnU_GaOer z(g9yd_kEc9d#=P50oonSVWJa{N#i#Y&9d6!;-5P#7K0Z@j2TQ-o6lUilPLPf>0?J= z)+!uAM{iGi1-~54C;q)>4$z_TpcqM|QK3v?H}ZZbf674yef@P-m`i52M^y9f!#uA7 zKI+^ku-$u=9s=1xRYzAWf3vE*NbftW-%5_(o`4^E7xAZ@cYRpkh$iSyexw&E$d?Dl zsN^L)!!2W6V(~)51UTSsh~G5?T|H$5#b^yX+~XNTK*@WZi{Gk=zq1V-`sb(g?P8Fc zz&6m<@l5JJHQ5#o?8>$cDy8%S>|SpIGYV}5GT`6=&|eAlHI%vXo4xTuu>$_=&xDM{ zZ`U}V=(t{kx3&>crAdJ3w^t>IiO8shL_;7{K8;(!!HM3jKVnxwi@?7TMO{$Sh}xmv zwKa@8qkDSYm!a}8g*mC_Md@2ulZg+zM+Tl}k~62%8i65sU%z|Xx>j3tHpf71b(4F> zlH8Jo#~IQ5T~G2K#$i^Me$>Y@dGJc68zo%Y>&@9xM<{V$2-iXwu#QYuI$+Bl6%_S( zL$TBb)sqH_xLrjwbJCJ}vdK5)X5taXzqmRr<gDyi4<vthe(CxI%jY)<mdWfjNPKPu z#>ZxiII=%K#H$Up|MC^en*B(O5njjJ!Y|98t>{tofV2lR^}Hw@XP#sRLFDS#SdYc| zW%*px9|<-i)aDG^q!P$vkgv#pU}cJ*>SSf4PXGQU;6s_c>=zO+%`-@sGRt1a{&w#U z&avxo?k#zL>kT%cWIMyBL)tgecapSc4vL8}8Ep@6AE?32^9_1}7X6494lBtI)|i;O znisDaCC_(Oqk0SM)P8owfBnN7$Gp+^ZI-;lrL6OV@jC|0U6GUN8YixK1wtn;0ssnP zO^7VO`Z4trL!O4PV(y)_V0fR+am_~4Cci_UT3kZ0fbE_M|FD~nbx+0aBBS3(QPp7{ z|A4hTG;-u5k6Y0fxh)@(G!7SE7I?J=Lt$NHYef|;4NMMDfS|7q{Yn^)q)k;x56L%! z-d5%KKL&ZPBroESMqj8!%W~H8=S~1|E>lIKL*7ZwPl{{JVB$+ti2M9;o8i=q#YI-6 z<YbZlQ3I?Get`z_1eJ5ieQ{d7+^*`sH}pA{U_Ij71ZKw|Cfgj}l8_#<4mIft>HmL# zoe7{#Q;JxA?xv1dSCA{$h_!U5Oa2Ct^mP9HU|1us!Bzr(LCDy0##j-!<;Ipx!m#UP zXJ;?RO{?f3|7g}B>5rX?<zdAQNdx9|h_XEKp*5MaFwt;4HA^)&=qujMduTv2>xvQ> z&tS`2^0C%rtJ;uR4L6?#1!%Z74r%wrL@<>P{uaD&xL;t~`OrYFF^oa#x6hkVBgy7E zIx9VTr|+jiD+Q}ciG03){_b|i&3Fg|b%MDKzF@2K@F>k%$*5f?uSvNVO<Td~{BlU! zi-MXs@UX<t`}C!V*J)?ee>qo}tp(q^&{<4Y#TUxFS1PbB9MoVov+ZP}kw+(KJ&6(c znrs@i!5l-uZQV*=OWHw<`C|^hv56$mypW_OF@8<^AHfHw54|1VKxBv572iawR7k?< zz8<tn#`I!>5Apn`lrUIUCLph|n8J1G$Gtt5$LL&oacpx!?M8ajcUd>CrUe9p`+7Yl z7A1oJ9x6>|NKQ5p!o8yGdIbCu90uI9>&iY=$#?Q~o^qod^SrI`ye8z;mzbp_!!|N@ zRfI(?-?$P6gbP^57_vz|JkFfe8rWE3TdkI3-cRA*Sr-sa?YrFkwG>u}R20h=h)!v} z_<|DtoDpY89uuc2c|(!PZ5;DefnXfSA=Rriv7e-9qC~8u0W7M(@f*$OsgY=#;>2Ft zcbf_%Yo_KaV0N{fw4-nHSb+W@Xs`9N^gmSV+dnTr^U+n$PBa6_eE_DUxaRHM_4r*J zFm;w9jIzeriJ<|v?o{jhP|)oXt_*)!#2Xwj>C;}RV_=M+j06PMK60-w8jgyRHM#(A z<5z9Ty7GHEB{+hx#7Kf*KJOR4?*VRLSgL6`HV64VB>4TcdS?wV5#Uh0DE)7cU_da4 z9OSEIPWD`Ba!Vnh(7$Ux-LC(iU`(*Y*RLoQQCf^|d>gLgLAQ+C`ZDpS8*hJ16_HfI z3YyCBJ<F(HH3;YbdQ|P&C(H&3o{|0Gxm>GTNsPV*1=^+H$j*gJv0%7@IY_rY4qNF> zR%4QHHz;FN>pr1|MI2FX_IiuEhm$B)MUgOGMm#ti*b<qZej0Zx7v&=ueq&_3jLUNQ z;DI*xMY^;fQ7W(py&B03z3fwB4T=_1LPe=T>1ryt?^-pnJ72q@7PSfHpg0d)>8B1v z*PU9)#JYUU^TSBG>v5k_Dtf6>ZTzUq<HY|FF7Tr(f~rQq@v4NrCW{M9n!5Ci8)Y0e zd}m0Cj**_%r5DFmQ66Fs4o$+P<8E*a*<;rsu?oTJ-`o`BGDsy|EJ%p`u$#vbWf_^$ zYrxhMm#TLz@gU?K@uKIFj!{Ll<+c`|37_oCLAjxL3*}eXH6=!BNVd3h&g~wlUWLyQ zmv0^E7`r^^L@jUUeO+UuuO|e){Cvu?tW<6P0hew&K=_&4mk8~i&(cX66cf4xb60-L zUw%>7@G;It858Nf^c9izA5&H<uwo;9x{_<gopBMD5LZxBgCRB7tTy=5(_t#}UwcRh z2J6uwZ6yu)?Rkb@?l{&|`0C?j<o0mkWroE^7F7(7-@Y=$39)|iLwD{@gU42zftFQ) zH~^uKrESZ)ee3hlyxVSLJ%Ii619nqFBRNvd;4!yPXDQen_b}O|o6ONuxuQN||0S%F zxSDHI4^x1s#eX%47G%0pFMM+e@I7^J^)L=nBwqu^KQg1YpUBeH?nQWN<svx!A2F9G zOmyD^f|~#JIG2Zgih<dF4TR_t_yRyItzo<ztqsQz3_Jw$eVHm>JkX>2**`zZM7n25 zmN??l?_mDB=E|+i4V4k#v*z&@cixAhOaU{Na^(4YhkSOL&YgOWo+Z`|0}jP8VtE4% z3X}nTJ>4fXsJ@fB`8_mv=ksNr3j5!HpEfe$ro+TfiUrsO9BjdP#QiqDbM8lGo^&N6 zCFIJLS|CTJ?!TmxZGo&gbH8F)#+B4xVp-PXOvUE~*<sK4GwxoEc67QtqxifzrflW$ zd08pYF?QcQDv@<PK=DDcE}sR@3TnW%gbj+>nEEKPEC8LHiNK5XeS?<!@hWCI)s^JL zM1g>^&*1AX9+sS_JR;dnTE)R9VEPkO)GubHc(Bz~6lVeT?rv}Pr6|QQMFe;tE`g<w zO@#}@O<WTdZ~2Fn&HyhP;y+z2#pIc7#)0IgdY%t`=U5T;pd{JzQ9ip->^mm&-EaJv zw!4uvsK6pY@sTong&g)mR%xYq&?hf!Msj9{B<ep*vLl|Pp`kl=w1Jgjzxp_Sa5&VI z`ALYr+3#RQ-aIO8y;4wE<*hgB7W?8$S<q@2M;Om+_wl(XO~`kxP}B(j)^f)l<MX@O zO>Hyd$den1>YeHCi8Q*<Zoyv^T=C;}-9*79v(Mt<OGvR<B*&i)`kPSIZU%0eZW<lU zEX6Lm%r{O91ekCR1yWf0=1S7d>)+hm_^hFnU3*BC)4hPJ#kSf-#WU32|D5{Ffcod% ztIvZoe5}49$;P0`CIfT57b(Vgj7v3ufA4W&G6yLeL>Q4lY_8`Wwx_D9qGIj|xN{4q z^)JaV#23jm#4u#;F2=d0fYTkEQ3Tkw@OfJG@YOi(O>|0rX1=omOmql%KWh9(6CF^9 zgWgMvFcDNbAnZw4^-fCcZ&!>Vg}S~Gj`yGF`ex2_`L)5~YD3-UPn#dfXZbI}BFu*R zp*Y7IEGuDlRq6%M4RdGZSSSWJCbQ5IrWhU%9R_z;DwY9}iA0y=GggD>3Z0j~^m`aC z5~$f3hKYvOgA{M`-@M=fT?RJ!a}f`jfc*|HEeGW~xiC|aYAlicQ%*fX?_Y9YeDh+p zbF%AL`o<3rjC#Wn8?Ksaez(r01-UQ)uw4#zjiGaQLdha*{wo$`3%Fq-yA8XqHd&j3 z^P0a;ygb$98Ho?kQEF)R%dTIxIbBY7M^Yo<q0apgRMXQ75@8N|ZRGY(W!)N??vBbH zYEdCOhBvhx*!c-?Lt#|$$Itj%YRGvMnI472SL~XPo;qJ|rOq9c%3L#gFT9bOUC}NA zB>FW1CLWtEHO}VLhb5F@;h2`D7{wFZi0GT8URBxjzHlZnI**mQ5AkfM(D=ut*%8TO zVhp)r7Yf|L;Uxvg78{EI1BLFG;`4KyT-h(8;kV1r-*|dkbbod@82mimDf2#%gYts+ zbu0$vu#(y2^WOq4T>_;!QNMho7~3uy3_ON;3`iVgpS<~&8@D809=w|nnYG`@V0?RR zYjV;({7oB_T9k>3>X|U4?z5VEYIW<@zw`r{8%pobOw(&8joV+ZKE#ZpiY$(l8b{wc zIy-kB9Pk?%8L82j5$K!r=jXG09(QiP@$%o&$(1uR%k_0`EU7g`i249TL5`oU8zUJ2 zG5!;JDwS;3#H9@=&FeDnC>9d#?T&0UB+su8#8*AW$=cCNyp2nkpS_NZEfp-vxv8@z z7kj}(QvbBBfs+rvob5^Hv7?7(|KewC{<*+$zlG4B<@#BR{1@*Fqh^5<=<UW?x!$KP z{kEf&m)J^UcR-*l^j?GsH#`J<l$%S6T<ewwq(&B5?EO|GgU*^4Gg^5!ZRmk4asI(D zoihLp+p7FDwiB-b(086*68XH}tioK{ZUN1<{-^3*0tv~zTj5kvu$-jmB_m*@7-tJl zNQ%S@rcj1RW}rJ%C|UywRggrMc?}Px=AIokv`Yu)B`O9u5%7GU)lP;Nlu3vGjrZih zaMkd8XnCN9Z_ZVuyV>Oq=C~P;R>0^FcWR1KBv%5VYa79bunaTaaP%>7PEq-oi5Kji zvsy(7dKmt`_Tk)mdv|m?RTwG74VfH4urERIcFkK!jBn9>-*k0CQ4_*S{k1B#f(E{8 z+UZh$jFh~luZQ*!=TB7qZ17=4)s|&Zc178Q5G#~>M-qVn4+x?1v8V@!eOeEX&W(ac zkl=9XQ+wa@zx1>XC(Lo|i3uET+ut>p3mk$%+O8pO0k;?D2T52p1Grn%c6L*RLX`b7 zGUs&ko+AQc5Z4;J5&2&y0$OH~FOX92s?5Cbov(iK3A8U+&AQTh4Rz|x^*;{sqrda| zeKMWS7*1ZNMTOC#M%ng)crEgfkIFP^oWYYKQ&5`ZQ>UzCgdaCkX>Ne%?U_C2O77w{ z?;C6QfU*hU*x!yc=N5vrc{eVlSn+?QfOFTg7+3B{`AxoFTbZ}gw~Ip!mPTLk7QJek zctT#t(@ne`5Nz>VuQ@*p`U;Yf+~WB&pva%fXW`iz|C2#`zTIBx)zf|4vq4+ep)8_M ziS+01HBmo06Vv3U(OunA5(mv8jM-;1nyez_3^c>a(0|%gnk;0quD{u8o3c?Cke#}Q z2D%F*EKprtef_9^;)5X-ycWO?`wA3e6E#ZXdj`=mrZQH2gvS}<#8qiGoPK}?<MX5X zljYAcU-jF$GeM19($bp#fo+HJE=$R|*G0Yy2DE3}W_Qmj+ix$2T<E5hbEND;f`lF& zTpy2D6-6D*Z?k}E%@Q^%oA<izNtDo4u6Cw-1o|Eq6#7RT@JGIJzwOGaDPr;Nq$)^J zSvj&P;_Uxho1k;KEQU!Gp7$v5#K3>T4Ao>-+h1sFB^L=12>h)f6f|TiWW}<<aJ|x# zJUj@c{xg&Ct3+ueUFhM2N)KM}=S(_**0Kj4vsufRiV77Zyx(t3sHzQ<eugj^C}F<I z#sh0KS=-hf=)VUU++<9_0Or>YT+NLO@KHDV`cQu8-TE8ZF`XVpQbLP<El3JEsJ{=V zqwXb^3M;`=+DP(qfV1?6iC#$()w8V36yH~(C)`k9So~=;%0lo}LiDccg#nDL@L%t( z@B4uibk|3mj+jJh?1O;R_jM%aZq`Q_V36qV0L~Jr6T*d+5)vr30o8e<S3k$KZ9Os7 zU3=B)%y3nwJxXch$iIgb8uzU3d{>sZt>JVWj~-XQbyJtV#feZ)vZJsv(!tBI%fkYr zl<|&eXHg`KwU))PDlGoskO@m(Y^j^+`RdT)KZAteS5zb(AemobsD7sIuVyCE$qq&} z%zDUOMdII1kHl7q+j|=V|4EqyE#Gx{FJ2O<F^zz!qRn-T8F<e}<IfMC^7XBR63LDc zkZ7`fOa0LMt6eHKR{9Rd#P_;cz(I_dj?~c^wv^rM(g|e4w+9>ZHB(YCx(cTzcoy<( zW0o07F5sE`>tF1K`ij|Hz+0dPHFy91LW+c3TR<0%lu!;MBUx|Z2xCF}ALD=>k&KVv z<t})#7?XZj&Pg~#F6Zh4x3jxb<0c&)T|9qZ-LlZ+>}<?E41)KrH0Lb=aP>2VB^JHu z6P!)jN*}J_cAfmvD>7~^_==A|I$^3NKw9(e-?GQqmOfCF-=7a;k{tsi67u`Zj8{BO zfkzUqcQ<FNfbjTJRCcZCQOn`8N|D|%I_Jhtl{`Mr>sB&QvDscTVA!NT1UmK(^LVzA zZY7JKc;$3)w663P{YGyrWO7SKQ|bkZ9=ODnrDXe<;&kZ4)vEL{lf&=zvNpvff5ZU2 zY{A3w?}+~}<D)ya)s`li?!FCx(LWU`3T46U!Nn#V>+GbPkUTV;k${~p^ycQz?n2C- zlX3Ol4CnHuP?Rz~+iQn!Kjxz%8e?y0U)Pwo>y0=%gsi44f%zwM#%tR{!V?Aa$V2F& zyW<s>s<Ep@Ofl2homCm%RcGf=C8V8yqP$u&ijnlfo2~{mo2(>Tss)qW`dpd{WGT%& zDoXENYlyN>1IN>878s0R=>-Ft3}lrd@}xC%U`9Y}0(-KMwVE3@04vna-l@C7_gKJX z89b69RRyTCR+w~_#TeTl?Ak==L*b`S>7v!FJGN@uuhsrWt`s*(LztZ<q8jT4{8+XM z1SCDLoD6E-3K3BccGC<NG<+gje0ltI{#)JSPbVkmV_C@FLsk|t-h-V1X7|sVt5^-6 zx{gIeH^y=jf(#qU_GxMp2|fNeR(6-(UU^;fQ1)|b%HX>&4Oraq1VBz6b-$Owb+B|Z z@n3v@o@VUQ9jp`PbOoUllx2$!3YdbOFH0<h*7MALTWf}hd@<Jvpm(`L8Xx@L4ocvX zzBRnIUe`|7$3yX6PS2YnHRnC)#_smo3j$8xG!9aijAur3GWk#|^BTk;Th1u__ZeJz zv-2ej0_lyjlFt9^POX00mn8F0roUdDFQ%q5M1K7e|Asr_#mg+$pIdc4<4G4{0-{)4 z1sJa#lBs#uv~{L}M-K34S6~#iH0SE0K9WftkI!y!$IkoGNYotUzO+3EY>T=!cu>gd z3!DdCmqKu9XJTM!+_{%&?bkRjU%pggTk~Vd?MEro$J4pAknZ~}UVZ!hJ3gZCnd9si z{81jBflYU6MjC-}3ROH?A(~_EM}&mwwsG6=LuA0g!tr>sc~u|=01ieY2V*JD3{KN< z@8aK&=ljlH%ys_Ip6i2_X1@dc2&%!t9swi!6X(Z6Cl<zPSl2tYGFM;OKtt*08W@R5 zwIiYJy+F42#+lFWubyIC9|}j>lGe1xR_`Gko3xjD(6e&PC9Z&xAx!2wnXRc%O5R49 z_!<LDJz0CHFc0^OGZSI}Vdr4FM{^c4)yqiBL1M+JI-G_7>An*X(J{_@R|6|3JoxeL zoB0AXSq0x1HdR>B7aEkNC>!I{v1Bgu;6d}mTpfd^%%#48DTcZTbh=CoQHMWLp;<6- z=r+C5`$4k=gp4qyP%O{x(jV}1b)<^+A(*hkBz;Qolu-aPS4D!t7}9mXFIT{%n{=}# zf$<s#Eh=|z0b1zvZi~sW9U_t_?)aBAyrIQSG2%b%B}^OAi!H~cKthQ+bN6u{edhRQ zPq7o0XQ#-YG}w9UKdmO}=-ge4rN^A9l4mvhW+Z*WqHnkckyzvd5o9(*%;p~`ULZGT zO4*RwBt>s}{1oJp1V;kFF&um`j)U^`>7m=$=ihIFIu40FEq$dG3Uqspc?7QCoD??N zdQeIGtz{jaT64X!jfraH{fZ#<-)n1jjZE&nZfM8Zx62JBmrymBdEaa2M5$3ky6Ai9 zW<pN5G@pEj!Re@K_1BJ8TSmdIKM~gBW;_1MF?%8SEby-fH4n~*_+r;pO}_5t+`VpN zO95=B1Zb{93K?~oLkHA*F_>@BUnKAl_0V-a|4zow7L)0P@7~@1PIAT$Mi+-dL4iWF z<>O*~%bHBua!AStU4?ns*JZ`2?|vaFKjoc_zxc@fIz9@A;PLY(qV)yej43K0kk=#v z6)-$Qj*P(_p}VW>LAK;XYmUL{+-}ZXmJE-Db>CcX@y(l@MUTh!nEqdvWNX8>7ma)0 z3k41i?3=tZty--fj+m$@MfUY*I=8*2YD-gYpJm2Qo=HRXNIBf~WJo3Z`kV&|RL_QR z@GvOLCn5tLsok7OptD5g{Vwnbwvwp#+?F-IX<3L`si?8De^Asn)9lbka{N(tfURA$ zO8oV8z}TcRi7aQ4t?q;s^uk}Liv(Pqu7B5*d4XP(zE~sgOJEoV8dx=((ZnCQU<3XS z`N~Qz^h8vD?P-AYs?cBYzfDWSCMXxlw6rEk>e?Cq($GKQ)4%*_X#2kR_U0<3x&kve zrYf#Iz_Ota^D&4pLvwaxkTchMzR@jTpunvqM%dZlvF>gC+mqKEnmO}eYj0|jIBfS~ zmz;ppnR!4CGo-ow23e1phkhYPR`s%3kA}5tHSdRae*#0x?dA6MS<sz#@=94Y-|BG^ zyK3Xs$8udz^>8bf%Aeeb$3JOHZp(9MRWTprGPX-c-6}l>?bO=;eE8xaz3syfpd~lw z;O|m?k3o{ZrDQ*~zsC59`4LC=;Ri}Bo;)Mjy5RrihowITODVm4+S=Or!C<l#VeD?2 ztjB+7pNn3Y<_TkHVkf#aOX=$U(lIoA?sUTP`pNLjl{)@&B)NJ=Bs)(Eqtv9zciaKE z=33J6Snr34mE&_aUrgPn(;ph<CbkuJHIb&aJ?1JMcKnv2S^ODmXNhEa{sd~Akp=&U zvUiG(?0tiUJDzxACzFY7JDJ$FZQGb+Vss|f#I|kQ#>BRDdVc?N*7|P0yM5cM_gnjU zs_LzhDTWpDjwcT4TSNg&7j^p!`G6zBNfd)sZB=z^;#TQ{ov#yexHfY8d`w^V7zAV; z^VOt8AKeM9`(dp~cOI;bTHy=v?Kj+8AeyZ^(QA1<o=&X<hsDLENVq+$Sg;9+?lT~K zN^+V~8ShPjN|q;bgn|>NYmJ7gOOq3IN586lqJ35VCR3tcFefM6LDVrItU&W8Ad?Ot zXx%+!ryQ`vzZOKy6wb7TBkASJcN_=^V-@<))a@DLX}mEF3QS(4KaA|E+#lUwLnw3m z%l<lzH@gN2fQ4o}q2+u7qfV%xeL8~>n@W>=@eD30DcuimBd<HFJv}~jQ#znhPei#+ zE0&QrJKIuYtb+htZHf~ev|%AC0|b*d<rQ{|ILI#ubcf;9^(2YXiFCh(->A?CXg|UU z;P8YBVX$Q!&i-X0y-r=60IDe`MgKo9z#99tTu1b^K<034SN7C9$A;L<qy1obtSpB2 z^38FP37JN!%K#;_>sJehzZ_bcIvvRvVaQi?6huY#mx0X$ZZcwdfB9#Tdkytzs7G;F zDYX?ZZeM&yV+DQWiqhX-M{#&PzOXGcWPnoEEL`kR(JFji&zq!PDJUpt{K`U7Fb75l z<L1CIkO+A-0tH3E6dnTLhhk3EhSb2i<DT;c_&^TPh?`7&Td;teM~N@hwY3SbXylZC zoca{(u>T@Lv>Li9Dx$7~`lC>6UF!keSIgwjU7$YWb<kcUg|qMeEH@a_;(T~Bh-ZHV z3I`(iqxAHAm<>!wm_-lLQU#pZa43UyPio2V={Izb7=b=xyqa1k=yXMJfUI1^GBxQ2 z!FJj>zVO`rx@O|KjK7}7*pDuj?MgA;+|OP5L+#;M3Dw42kNSMkf13{-oJdn#?NQ1I zI|4UV2gW-*@o&4hxJE0IZtfZd)plqJKaU|Rc`2ZPD^cy6=as8s*F^r4{Xf@Y;vLCr zP9ld!#sY4lk%263GfboE6NR^!3Tvge?5Cp`x63L_fjxpFwFqLo%fDIYt^Xa=U$Iaz zuKrQ}ewxlpb(Ti-<ZIAo*({;Y*G%Ijzefw;m+K!ep_S#XMYy80oia)v@5oE-l*Rlp z&0`E!9jOPeN8M&e33&NyIaF-7cZiJ@)I)S_!#&EE{>F=`k5%cpdua;ZH_VlFEUXeD z!?)|)1%bc829OgYBSITHKW&J)@&;Z)@}f|RJyaxqEs?`gWxHpcUsBd}jJx4$quNjn zS|}GU3(lWciSpv>0Ltnx784ylT*hwg_wHVUDzxMqmMR5l)ud4gn~;NhqR5NUT*6w@ zaG}yrujB=}VGF3Ub5$s}C|Icte~Ms=ugVGoyx;gU?6Bx#VZ!Q!p1ZmOxPu9^m&!uW zlj6GcV#TR~yWPN_EPRA!l@qEp5So4Hr9e@sw+38<9Y1Gpq{tAe@#SLG13#fnOo3_f za%N^kvr0gWWwCDrR7LrC^x1E+iT#joa4TFcAv=O4MN2d%{=~og81c!M)Z6eR98Y17 z?wj8UqoB0_0o+Y^<`F;t+7daQFF-YqAsH_QXrG#<t4@*l`=|GPV)5TKG0>ZAZwIz_ z9f?*tLk;t51aDgO=h))`?v8`784VvSN@h=%f7_XiWKDS-9aB87h#<3gb{kZ3<CAJQ z0({k|35&u4wuXDMB+)xtg7iOK9oygn9^Vg8=%+fqmMsWJFCnc0%#SM8o!=*T{r4Y- z%Wrd$HA<vq49?Ywm~MFbB=|gjv1H(mHee<}j-}o{i<_93Guba*N;Z;TJ$LH*uwPEG zKJmR-f2x0fA2!GfZ^^6Nq3s~lSLI_9A}J#<ZNEEL=Y1TM;?)b3WJ{qlJFz;Ikdn%6 zZI!ZwQ9K4#cjnf*eL!J-ore7FHZgn@E@r$(@hH$e9IwvIY)^_fY30LTmHQ1F>7Dld z$II`hnmdTRnfy2UQGe9Gns1shYyLjwO|2bp0QScMfsgB0H~@C&Pab9)Y{<l^-!$sX zwpvG%)c9f?2#}#ee1YCwZ#UBW84}G`7T^IpJ|LtRjw2R9uV&S`aA?s=7WYfOmJx;s zGqin9hXc4Zrk4N=%;^fVs<gIEY63v#n3m2pB1stvAU_kTTITwqY4AoHaZ?+hwAp3O z9?4@IcqTcX>WR~_pSCLR@$u)`#;(27Vc#wSj#;Ej)z)A&APCI`!UQSZMtNi*EJ91k z#B>=VlS%k#9d_L7SPEU*E@k*k&bHN*>G-j(S%yg+F}s~H`dM4+H!)A_3`g|A;JP!8 zkDdLVBkH_T>p4y1`zr%2{i@*O*D+zWbNcUHH6u2sMKh0Hu4AP%Svh*nXS8wm+uVy& zlO%ODpN+#SovACSc^)?@=;qX?NRz}2P&RnxvyWOBvYg~*mrCST+O8uunVlA3+62*n zZB&{*a(8a9d+>js^S@?+#v4StnfkZQx~*0ST)Wy`rE{5V9yBEGhn>Z)-aqF`pW;?x zX-^KgJD9E&l~Xw`zR#XzUyTOeu1r%;9e)-ZEq-A+(~;>BRgQV$x1(QB6rQplVCqBx z)FT;>GL78zkC>dS!KAV%VTRzPtTYM!RBc;lz1FB2Ac>||&w0fn3}ecF{mHMZ%sJwF zUd*OVsGQvij3fouRX^<Ym>d(Y$g=7k>IIih?kMfH1pgHx@(IU@s+NO>EmZ^`Ho``2 zkPfhRYs)<Gf<bI(V8!Pj->h;|Q1<=e53;`yc>z-)E3(QrE#H=Y9?nqE{SJNMJ~=s4 zSy-LXLg>BuvxMi!#n-&SkMGu$TWc2owS~V6d>Gb+%pj>)6IQUO_zVT^dL<v6@=rM4 z?;2jYWN^SD&)NLS`SQtWab<;~fnc!YJk*42Tx{-iXrfS+popC|gs+!bTvAr?{7#wu zBPAe5+WMe-2lphC5Gsx}WddOYM@q^Id2)F4J8@4$T~B3k59}TpdxE?q3j$bZA9k3b zU`d$ZubZ}c%~7)Zc<VmH<o!$UQY1&q#jg)ZAa`o@C?>?`@)hRRrvuR;cQCf7<aF`C zg)=ap$pFc!X19o6awtlk<JQg=QC;5~;*tMJ85IF+@qOy^N+dG|Y=0qzjU3?xK@=or z3SvBN_>eq%pK>-;A~g~JS}Y^(v+a*gg0Ljt<kaZh+51Y%&BT&khs<su$?7<*9*jZN zm9^oEiv2iv`sTGy)6RMg7D4~aZ;9&1@g4FiM4zu;H97X%*DK}y%03HrhtSPl2m#!o zUYbtvDQM)?0NAD;!4CF-$;-kfhJb~l-N-!?yQf1ZBom9LjSTar$`XMCNRmxwuj-Rj z0q30BpuflwsUV88)^Ss~P|t(vJwq>uUcgj~rRwZ60;7P8x5)_y7B<{tL+(vWKuorH zBVV@v5$Xd?bX+71DLyN{r%PZxKO~ushNr)_fJURqjllciT>WM8BX~<e%}oKU5)zQu zm^AhB;x$f=23{bgp?1B3L8InyJ%9xS0!6-k-CNZ5Td%P5;|2?uP3{lX_r1s1dcSZ_ z|0czhv+Ujz1of}*tH#_LE+Bp|27!itr$y9MUYK9{_2=);J^W|gm!iEjwJ+NR(#g!A zXw^c8zdO8pJ~(Z?Vfh%H9~DiTO2V(9hN91Hj9?&(coz8UPvnxirv>-UTLL5^exDy3 zy~N{vjVL_ppdiV&ho&yuQJRcPqK_*W$b_i!;C!lGnWvY<$)|&KduG$oL`=iq`#Opu z=tKgp$e;nmbxo~e<=F1utg^wk&AFrx1&DQqC|)VU{FMyV+A0aum6*}TQu2tQwEJD{ z@y1wKZcVSUd8@5iWb*;oD$g-E>ffz{#aNJ=K(_7~I2dBaX5%;!wau7bn3$x6)7Kj4 zU4u3r6dg%$L`cW4so}Cg6`gvEzza1qvV(VmOYYYj4b5GVNv+9^#EbHzeKH|Hn}j9P zXw41C2(M_uXfwjP$6Wvy9|ND$)Mtv^sr{qS5It~fcC$B!M@f)0bw}m=1SViU&o?w0 zwji6Gw=jAwuWnoRv{qk%-o{Nqm_A$5QjE#jLF-WdYV316=4FM(b1?<=YL<o16tN;s zsWQaWRk?}Pu&*F%sj9&1`PG>F-bq0l){N=2BR18qq{X+{Mg@gu5i?<-!aL3GA;x31 zI$e~DFu4q1&|Xd$d#}Yi`%B%oHE!}6TclM%<{q`CTk^tMybNWi%INX-Ib@TG&UE0O zOGamFWL)l+s{pvjT_Er8Ix@zIj|5c+8|-g5JhkhHh7gKg0LhASCI3(X32<!H!LO_u z(A1O_@q{YS_X}+631wOdnK%~=11szKaj^o?Y;$BV&RyKJptQA(o+;!~_?46lkRvAa zQt!bB#!Fb0OMMjo1>LR*d?5ULmLMni+!xMd14inuFtBdMe3GlkxeEn=pyEfFJ7+Zq zXK~#U4IqaSfa~H#Mj)v?R~%I!$j(p1pB$SHiMIFy%?lW_0W-GzAWPMd_07#bpcT5w z2)=_V&^at4ma1no)jU(w$cXvak}4wlyHFQnJ4yD=Wv^8P_{_-Xz`;#NB40Tn7PK3r zl-5TRTl-a;r^*_EiW<@2rL_W}`|UH)F^lCF)z|(!_^<OX)gBN>?Lt0DkZ#Xs>kY@g zow7C6f2*u#w8odqMxS3MI9iI^gYb*6I`q-N0EA{YbOL|V_}HP>Y&aYE@4)yh<><g% z&X&AOMyhX;A2)YitZ%sH%!=%Fzb5kw+6E<=Bq!zQOH2Br3Ha?I66&IW1N2+=Uh^Bl z0Ypz5Hte16?tTy3Q&$ug*D&pOiz!dfv4hv^?&9$~=)Zp;f<?#V0Mdj6#QeWzi;dMr zyubNvnd>-Q#x@^@?c%H&3>dN2XzPpX2FJ|nS<WZ=PPAu#WWX>q|AJ=%Vt!FNMRcI7 z<3MijOljTZ^EmjO+_NiE1p61(V;Yh*;zl1kq@tum@#SZ+Jh=ufHkypjt1Xq9_4mt) zPb?yv)$z8=PVwU`rHAt^QP+DzsBh?>=#&b*oHXAw8Go%ED+MTAAKu-$K<%MkDZi{& zG_7w|T<^Pp1Nz=`^Yedz0Sb`AkdFmW!9B)Pn9h4`&T+WcKl24TL2Ezgj;6Auw`H9J zrQV2iK<DB~(9L^URp)3F4ol*-;wbjTQnv3y>g=X10VrzYfI{F|GV;zu#sU!#TJ=7_ z;Ma4rKZcPVfnbdPp?8CkoggyXd6XL&Qym<FfQctcXb50LP-&{n&cE-5K&~HFzd`-k zBk}4!7A`*=sS3CXvB7Lm08JJKAoPg}Mp+<j{f9$mt>^PJs_+>Km`Ae^4L+DYwTZBB zZ|b9II7>_y1B)-thN^A2{5p)$qT2GsT1~VvJuaA0T*wdY6TnzkjGWWe1LF@6K5_Fy ze*UiXN;w_mpb6O%Xb8{sc9sMkIDV`~2yaSvRxE*rEdyrdH2*3M0ifd2)Fmz?wwg=% zdt4EbR(}m#mKV6USePh{j~gFLXp!)F*m#E*98HX=sGWBAi)C`W6dlnd-aw-15c4e> zX;n+Q!yBvm9;60~+t=OifW3>P>Ra0~yBC+GgL7R0-xW1GzSB>mm@}=(>b1Xr4vQNX zW~|DRj@@kKc-c*rofYXES~a&d9)~;*lEr5pT+z)$26&XQU6i%8_8rHoq#s4kpOlrg zy0h4#aF}BjSAS;S^k-M@Zm;tun)<h$IBAZ*8o&TU!Pl_jouBI~H_$+Rq7`y6MTl+6 zF}p4maDc(FtN#sB9t%bA$N0%i`SANH3|u9E?x!v7hC=|#wAU_GrEJ|ub1U%Cx#&3~ z*R9G7UgFDk^$W2047MFztp=WIIb1kP4s8Ah0UiGLTLVp;q&pMdg$9-L^`CXMsBL+n z0Vt#AswwwsN(iufvG{VIdXm^dVAM#z6)zo(ShXdkrTT4{X#fU{#bm_*4P0<P#Sv6d z276^}T`Hg;1^6;$L;x%%lpBf#8N%i8CsempantUD=kMw+LPgy<%j*~4oCWG7(j$Zv zv~lb^XefI4h?A_Tu(kc%#@3{qE$JXpc_l5>1tf~k%?Ga6(vvGI#3wc{Q7}d(vY-6# zlR2LOERu54dFoZ0kPyTH^4$!9Vfh(Gb&PLVp+S&OKqo29J>|*x>8zc&8mFu`SwG0H zbL84gOV3|PC(Ww*4sExy@wN_DEA|l_1E~OZ9a!0$k(#3yb2~TISNCT<83aT?-=T9I z#=mf-*T!skPg?>V{jQbY-X95i4QAPY0{qCPQ2}>W5Zf?ictNPW%SL<EL!z;JtnF;B z*se$k>$q03UMI3zUMu%fU-lWGv7fI?+1?64yi9A`<=%z1eO_fJVe)3!WDYTl#hy9G z=ICv5?DvK9L5fj-A;uSx&XWZz$K!^xnWL149RZI!1_lVR_SaHL8OB}7S>UYqw`GDi z$3c<xRd+yN2Ci3gFek5_&b#-m0Fi(9>1*dsFCKie_YJxWA+lNrQtZ~q&Zt)BhZk0| zj#GH<FY=tCVx5D71EpGLiV;hy#AJ1Y8d9g3pIbd<b-=`w@gzEJPXD77bgZt4YQw(7 zS}B2e*8KM$Bg`apvWgIijZ>qeN`lOm{@2kwgIfy~J4YaB8c<+H`t`EDpR8Y5ulN+# z#h}w12U6mQ$?v-)^2AGBMz;z+J3l{Od2fbEr1Y5SrM!JXRF7>amR_SxDylFi0zk@( zS<Y^&Qx^wWi|FQkwZS@-*V75!ln)02)c?{AVr<-h5P(vF2tZzw2l9mui7$-2W)dIZ zl~TWst4H;plzsk%Y>#IPbU_Jf=<06d11R@xDjX>H5okby2B~xK)8l4`w<@T+{a)wZ z=-&nulMFHnUU_KhO{o7{1xsUcw6@V}1dE7@MZ5hw;n>G<MSJEp;Q76+G-_|tV<)bN z>Y*P)LCE9!co-`DzAB|r=Rl9#1VM2SqYujMCy&EhMKS4%>O_CLp07R$*NNP1?OCda z^?7M@S5CRk`)X8iYwMk0&zRLsVB13x6UTf!IiSH1A^uIMp&~}s+1(EW9{WoFz=K=s zA9!#cEaelb2wn39W6vGHBZGir?opKBNtv`gIMUX?Jq3lO)oUtoYL-Eb$;-glkD$Vr zP*;8-YA1!t@Os)%hD(^~n({HwWA%y>>)wKN>zQqDhH{`J&Wv}_`dVU_bM?j}ns}&Y zl)`?IBDQMabF(y4Em9$$?m0K3N2Ip9DO$8ojIn~{cGi-=D5Kr?`v=+Q+*l-fu?SM2 zz@E4us$w4Mk!TJwm~AgHbzi9uB0UzO5OSr6s*3+T8{fDXH8MdyKc%5HGV0w4PJ%0Y z-tFzQ$0;M^`#jGHtVKPkmNFANwJFN{-&^QJqM$!<?O?WFs|3)&IT7+DKuy5lD>x0@ z1yP1<e1Y0~am+j?Cyt(c9zJ?OsN@=q0u|(t0ILR#hEOp!8qp8=Ktw3+MC*5O6fYeR zor{_<&Iv&YDqKuFE3EAV%VYurj>uH;`%1{k9*&<mqXVX`WWQ6*<Wd?*rtXVNPF<?o z(Cj0vDUZ?$=HWZ}VK*mwjkY-HnVJ@$`l%(t(cru0dqzXLa3iUzC!`tu@p#v&e4Y}T zbbVris%ORKYnG9d@gu@a4uv#kcFPQZyt)z_@H69O$=21Qz~gw2tcNhw(X>14<>nx) zK<gl`V1jgz1}GfybWsE>o{Fa%6cP%Iz^X-s;YkP$5l15Csf!m3{F=)ts*(-c#M-{a z26VR(r3!75CFd?!SxkFPALS(LPstChk7kGJi_|WKt7CP4BhK*^0=Fn(Ili*Ezmpu_ zyT8$O(4;rl^Tsfxhe0yuBaDsYr+W7|Y%tAGw%t9+`B`VZL241DqJ8I6dh4_m+EiSd z^0YxS1x(BcoY^5CD2C7t5c$oPUr<1!PzbKaUdpn#ut4>vRC#s|y{n|Ol(;8DMoJ17 z$s6MJ;j%9SKt(kowY(h&0i&d<3W_GRyg%Ovo8LpXX<Q{Qu9nZ{hbtx%c-&a)Fn27% z1JOBVk&%(V{V@3<f3^LMpg|w#s7BQ*&ojj?gb%xjX_tGc?zV$LCNz1v+OaLvRZ|-r zjK=$YnJ>dEHsV2M6%sG*fdG_0-UVGz>q-|!3?n`Z3IZp~bnv*jx(83J)NZP@9JiK+ zVk}qlxSil2`h!Y&zuaU`l<jjP8Oc1-OkxPsh6vsP_U<P#haG+y5x?PVKvo62nzz$$ za4V|&hY2or?`Sy})Bq1~)*vm&1@P-?!6L%q{krYE0vYV@8fnppu~7;;U4`sN>j%c9 zZ{};9K$N9MwevBf*@UJP*AGm>cF*rLxqPH_ltx3f!nHr>t~{vx`um9Fb6I0fp|jxt zPORr!&-L<Ivf04mNGj3jPx9ZZYD0rC+#H}KhxxxHN0;v3lJj<B9rR8Uk;-Wy!(%me zJr*msfhBrfgn5NT5W*O9k?c8TXSx7NI=1KK_IWnMJf$gQ;YE>3+GDhFQvcI;v~P7A z1=?{UMLDyQUHuR}d8NI-9}@hx=WxcbbK4mYJC@%{rr(e3T3>fHS+&iOx7VaYEtv?5 zGATp*4u?c&j<&1R*ue!4HWnPL$?awzIFCxMk;Mr2e73vPfd2_M$^=+|r+uOQ4oG{` z7c68PC*2O~R?IacCw6;WAS5?<RBXD%qdx_XSJHj<ud@7}qOqO#hR{i5328^!BAzx7 zIlbL=@w$S!$Bu&4s3-nS3l+eUZeiiD>)18}>vD8Q8JDe=*H_H4jr0pW1I&CncG7}$ z#i++1k+EB=9v7AvPeJ&Jdf&<+bRL30P6k)8d2aiTvnHQ($B9Sst0osLcR7b4bBY5y z=Wo_}Zh{3rsysYCp>j+bKijYAYZF@>o${Kt5aiOxtdmks&Qn9SQUj}xItfZj*t|Im zxE;{axvGJky@I(uaN}su7=40y%UU*6)!EB}58!>(1p(3EI#L#LVBr~H0)@C7Ve4|V zI8-Tg+#lCd4LXlIeoh_SchCa#+I*POsG*SXuQa1asR@BAI3``NS?>?Zc7A(Zj#<7) zZtf5~>Xq9!5n7XVYp^HyM+i9M?>;n<5bPJ7*W7;9T`|P2_bDBEI*Tq@x}WZLogZeX z_^PBZ8BZZatQy1R@Cr%sy$oC4z#(xxk*+?(Cvfscr18BZ4*i{L^=#vn{4fv8BMDT5 z+#~G#?<1qKmlZonsdG54EBg_syPGG$`T69)i=SbGn?2c~hrkoZ?Ilk}Pg!hS)M|2a zr3;3lN!MR2XfRibxmiQ*Z(-tkZ)g~<NZ@kF<cMcmFGT$M_uP*rhjF@>-%$wKz8K)~ z{_@t-?Uxfl-6C?%ob@A_<jKB+WPwdRwqc+dP<8uN{$WmeVjqS?kZZr?C;W?@Dr-e_ zVaDV;7uio}Z-_8t^_e1hdn+qjbh-}~<wD->td6aO-)sPDBXC4SHw0)t$e^bVVh`2C zx!O7y$L($*D0DRaREMFBjgtisx-8QfmtcX|jur3-ep)})^77d$pzQs!EUX2%S6s_! zVSkFUlDrB?$K39({YL<6oI9@m76TE$ZRF}SKBZdU4q&XF$6s@PNs5S?O%8?*RTdaj z;*vJ5&>3y{s0hDqW|xIr)!JrEG%WGsBs;V@^E)uA3i}a2iPkGGytgS=fxh}h-~rTt zWr9P#@Ji6hUKptpaz|xT#uJV9mE&zWElJV?$w>zP(XYSt38lL<ii$T?%hQK*YG_uO z+}dw~^B@4N4l5HWXg!U7<i1teTU<pWSpzS!#5q+i@=%%(EP0jp=@+n#Q$t?Q<CFVK z8+FE=O=osu6bJW1_aC6-MM*4ajQ<Y#k<s<8qo%Sx_k*znZ-l>Bf#c1S*4t&ps>Sh{ zrwypfT8A&OlJcARU+A;|!B;ag^O)}kg598n!O81BFUGoUui-mXFWQmJHVfD+q#Wv3 zsetZk=HG7u<=~XxfQvci`uD`VZUQm7Z8$3o;b~R;`R<DVetwO<%33G-NrK*L;=|l~ z)|_h?2XF8vaA+4V2u$4oXmbd=D*a!~sHni1lj!*sg65M`Cg^U%vOZeDjD;Zbo?r4X zUUlL9A*2QEJIt^W6pX)%8&*!Nsuva$EEw}{rGIGf@FS9%=A+F+OV*@ZH?KG2;&v0| zm}_whbrHpmiDvc$tnG@pe5oje4C1D%%!!RA@*Qr>EU<{Sypz0h{_r$cu8{2K-u8(q zgq%DB298(_ekaz)QyuxiBrVug{oO!gMmjiDkTGYO&F0jB(|839p)W~^=-IzxNw!rx zR(`Ys{_n%`%EvK`&ijX*6Yd))qTC%f1b=3#k~m*0Db0u;=Um=UXtJ-bQp!hcljm8c zJEi-4&3l6YOD!|xGZX^-T`0nVPv`FfFg!FdtgB#%`%!nb%ur^L@3H7rJAdoKoHkP5 zakgCyX0c0dEw7)p{X5(a{9n1Ibgu}U)`fV%NY*Bg#^|guZ^Jk~`mJ{fw+AAtepG?- zuAxh0WK7Q5%5WY}Q+>=OVvJyPYZVm%_!d$|y$!~cxSj;5h^`iFdOEo9_p2sS$oSi5 zEU1!5+>9Pk_%c!^`+tHHkx!<s(#2>DWA9<gsQj#u<|<o}`Y!B;Ndx$f^4tW8{9dQr zpPCz!qF5#mIHq{R`z{NU*}{VhyuWCmNsOMv9!?X_CL|;>R)O*^LctwFiDeb7(3@FF zNFdTD3ZGH~s`vNzo7e65*FM<lh+YZwvct~Tnu5p!=8nICvd+o|f|dww<hk;r(a_K^ z?gcC#+sHSUDt08G0BxrH{|5JSjc<^Em+337-=VJ@3v&iCaUMt1fZ~@Zt3cp7=yrog z0>}1<9_aoh?~1kpU6)m$7<~VoAYC@sB?i;|?ANy@+npa`yejwuA^%_H)MM`$sCKb^ z9pCYLItE8w2BMbI=gyIQ%Z;ohl_~|#lwQXTZ+|UP^KRMZz}}|7h{*=L&W|gw_wrzt zXCO)w{mO@4r_rhL-5YA^)5}fezP-@tf6}SOJlWwd+gqm3$5SdV2ahiwYn{KsljTX$ z$c*Xa=0brXZ?#BybKvjt_PHnQ1p^uxT;P`RjWO%5Sd8X6gjiW~>52V=VyNkD>xq|d ziFBu*y>oS#?gUojlg20S0=t7{^n2@_RCKov%gc4=m$Y6caFLCJR;dqDW7HV~yN@vk zwHbl=8YFK+`-5&*H2l8qY*VxuQ=wu|gXH@0q!ZDH5cJ-ZtYWt_S%}W5jITm=IIbl| z0?M4x)$fg6fN$8S|IZ6B6@f)$_7K57uXUk65VLhKqs=^%p8f(uk5w5r>N_{1m#r)} zOmDJyN#3+!&QE{95GxxQY0Fd1{WEs*?<C$$vxDG|*H)cn>c;Dj(E;9>m`|6jkMrbG zZ_B2dV-ml&TYbkvHY{d^&43tF-qYcNSnW2~K68>&G(!FFgPNwaEvGQie%p3%`uvyr zs(-4x;@@SCNh%QL3z&Ew5L?%;>pUEE_>&J13Y(&kWo?gobsM4|llivnEFKCI+;TU? z+5PE(S!n}wP{{;L6sr$@qg$VEkn;Q;U^sN#9I^Y%$17YiR_E!Ba1S<X-D$Ziwy{E) zxK76DXyJ1nTZ>-bFME#PPKFFW;W+dxGN}9v+3WCZv6LI~KPTFOGbC##Q<rsr7bsFX zNbi(>06*C)Y_;~MS(B3McAB`NG_gfsjXKEX9&G4mM$UqFTrEN}!(@$mE-9{q*MD*8 zA7qvC`8*x4jQbVeuaZSJzDX<=ND=vXk}G4n9hjyppW_6phaB84`cWD0qgWSUzZx4C z{%KGoR!54~IAoigA*y_ZuOrezH;rCud0VZpegJQ@OZJAvN<TDXJgIq@j8gVX@R4~G zWonR%tY1VI>df5+5pXpi@gK_=w|l+;q|#B7LB4maq;u`Uh(iJD^j3Rf)@pOJu)L`R z-;5UfXZ9Lq{P}&&QCNs9?jq$@tM|3O@v5yAFTYdaZTkFNiLFpLXc;!{ttA-8TfoCl z_cT%vI{OCeiSAn;fd?I6J7)vEF^@ZV_VKpN1yH!~ZEGaAYaAj~^S$Qu#EE}gCs<bo zz1@h?JX~%Au86B2oEn>d`6(anwO;+!)o^v|CT4D1kh~0k=yNX`OQ<h`)kITVr@*YG zZLN8dliuzeEb!hgvtkZio#oU`L8qPiAY4Elx1PsbbS%WvWp|mtlnt6RsB{uE1XS3| z7*y-cTf$?rdy3f5&y8@AHU3zrlM{n)zbiUSM+fwsID=QgHj{UaeL{sKe8TsWUS$J< zy@CUswAm)Pkz@G0o5|a-0&f^3rR0rcrN@eRq_O=R>CNvX`Y5qQ83U%O`e*=9xH9|{ zcK&fWlRrdV`Pz`xYMmeT9tdek_+~}}Hu<<XXy7Zhf)|WPiDyC<%Sni5q?Ck_$$adv z0f{$XAT_kLrFDJDe*fM-3WnyTCkhQAMHr!)_wK+iF3-Pkpi=|Jm;3o1#hVOVy2K?I z41Tln=O*|N{K}^l#m&bJL~-vHANk;Gf4z*of~G^bFeP8H3cX{wGB=5jUkST2fsh;- z8FiMZQRU2cGFdhP8|^h@FE~RbSBr6ImJbB$GYlFSylF$dm@lU2v+uQM{(J4+eQL5l zs@`&_Ex=U?aI3?sTIkiw3?2GxOoL|_-U;n#xudH1&ezl535hs{bY8T@w|ne4@@xaT z(P&LWpyRL{!y&ZFnc0%<KhE40%_H_1XN|PzXy?n<nv;FAr{ec<VAZZg*VXa>gWwJ& zS^2QbM1HMkkJhDAm)M&4Bk4d_R!x;ns4J=J<>4T7VeI++B-!)45ys;>ffqyw9?d9N zOXgf<mp#ug6gf`#>jsLI_0YkERziDO%kVO~@lHjz#;}~8Fur!2$x7{2yl^LdUV8I7 z@5<f@=#+$bG^n>On=)UktYEEwyrJDOk+ST*3glYsVbi)U+{w)DB61hcygb);hN`wb z7))bNL*3gruXt=957j)3k`5&P@a+J0Rr&(k2Dd_|P89(i4zH5w&+YuEKvaxx3ac_X zlc4ZYhtrBCYQ~(YLkhkQB7grw0_bdSBtrS%Ts$?93r<Um8Z2915llu-PAy04InfQ1 zC~oUA!$H0&6cI$ACq2(cs>0VBgUEChU6F?F5-ZRXud4O~X-P6@f+a;Pz*KG!WQG6X zo0Bwl*R*A}C?T|{lSqp*R6SDj&3cAoH;rAwjegL}ovKXl72_EqJxIGj(Fu!e?81DU zuNEaybZ1W5)60mS>PDxqqfhn!Qu7ae`mT0)g&k43OC0Wl+?#%^@`0Z^JXkCjxm1q9 zpZO{qmEtP;!{(b^5h<)PR$uqOwtaGkIo1Rq%1VOZwBWm0G{L%K`sg!=OB3)G$Ri9N zz*?iW##C1C94HSeKX9-*R~<1ozOCb6I*Ff{V2@GzB>6T@3wKCwu-MOAn@e5YMyY$x zxD>5F@6=Z(dCy>VkVsp@Y~yr#n~%W2^7yf1;x=#Y!!D&ZX*SMRaTA+mJI_)JcX)NP zUV<<c<y2Y`f>AffSfkoy8>*9My5RYx5%jHDzr(3HVctyRNh^;DWm&a6Bq?=kU!_Ch z$J0!{dioCN!>Ee8U!9ANsNDhD$N~(2%%b&X7YVDDcZjCfb5LC!vF%8Qc?vr^Tje`D z>4P=J9gOFh#qK7q&gSJt#|*c5PhXoKY_@-f!BM^*3mpve5)6>HJTjObUm9IaL^Cj+ zucmIK<mFC;UlUwvms8kn4$g8An!C7#5iokKQ6Zx4YKi20FsL!UE{5-YETDjEnA$ok z;!*mkqwD19q3L@|O~?}vCDxciR+$V{o0TtjpQXclD18ewoHN!)79J>kUiWvs>qOPw zvc8yO;eqVu=3&^Y9i4enl1o1g9-N_Qi{qM_GClc433TCccDcpItoRhiTgU72ci~fI z38k4{kNCqSV`HB|Cig7asJPV2l=S|q-Ynr|fLe57`hLJ@P>1<v%5+#z!I=hE8ZA^% zdy3+_+RiU9z}|-|zK_%emz1WnFVgO!d+vIL{CT;)&br2+1p_H!djG7t5q25gVGE|O z(f>49C>!mRzF%QR2+r%QNlCSTU+~GrmdP6VPjXpD->^^LHQbl_Cno0GD-{<%?I#U4 zlxLP0EBOX^9bZ$XJ(ezJR%!}&y~8F~nxnD_GDNayZP_RDFB>vdCRI-6ttK9SaTPjt z$gbf-Wk;^kXh(?;c_75Q3d&dyY8+O06k-wHiaa7s-RVvB!sKpjiFvzCH<&}%-iur> zJ#E6fZMlg*Zk9Gs$ea6eu3!Eq-Z(dJ{m=E{Y^<@()Q|p!GwarAUalz1;k))XQ~>&w zWN$W{L^2SVCnz6Z8W1S>HIht7QN+1bCsAEhN&j%L#-3;?0~mhUjRY0KgD<lUWauKj zypgWP?J=4bWRwszRsjg=e+w8mH1pRaTkBjM=ynb>lDQZu(my}QyvG~i&ch0Rxj#tz z#O>*<>LQ)VCsx#xk!Ovg%*kXI4XlSuKr5CDp!RfZZ3UU-*1+2Bu;hx6qZefavjwxy zdVCt}1@PE?hXeV-IIXt<(D&y*C+7sGey~7zJ${=p>9?E@3PBVThPP%+ky+-WKk=d8 z)cUkPL!!e%lo;48CV3vewUoFR!}5M`8W}j8>Ds~}CDlOphTSU=Oz`5%eLB4MLdW{b zsenXP=fe=;bVKEjO!EoKa$XRG?Xi)NCLgf=mNSQf06p!kTkdNOwcBZ9pb!nwH8MsV z8MpxRc+-oOZOC}?{C;nYt+rEGH6)U{R7trnyYhr2-+qs4Pw$h8hveDZJT4>xhwZ}W zVf8BBj$6Ecf#*N`h&=Dy*cY=vl;18cZ>L{}udJpI-MT)GA1@vYM`Wk_z3a(}kEhJq zQRD8-bnkJblrL(LD8JrZzEZa>VueQE>^M`|^Ln<7(Hg>HUFc*S)6Vk}vGQ|)wbTFk z3w0T_<+KME3lF@mDP33RJAYPdZNP2mY0Z<5&1q`?vVW)Ks8h}!3o9A}H-vI8Ao z`_g)Dz1)oL2~Rjc%EKmyPG?o9NhT2m5-&LsB6sy`5H^ry+AHYES8wsT?8~06)D%2J zFZB{m!WFzlc-Z}AhxFxU$MH;FSnezZz)VRg0ToWWyDuUFuC})J>1j8X>$JR10(75{ z=<|&tS<j0Mw*oV7Bw+2_;4`qp#O$Hpgjvb2Itmh~c^!Ro!~F7iSrrfh4j6SDdTMKB z<1GdlG>sSOm22e?fUMp*C%C0ha;pDK-zBTH6p|ev`jga>vLU4uDpxb755`JU#@Ac< z3-uBD8%3(vR+RPXw`Vg5Jf&OoeQ+Bx8;ynx^$%U)0Whr8cc+%}D>XX;jL=>ko7dfe zaXH<A+3VbVu*OUfd^sc9+rLI6^pzk?w#4BL$$s<KF#B@h^gj<ueO)T<shI3g;aPL1 zCUT|m++{4`8_a~^EF|}Ei^V9470!&#pIzChq)vsJV+P)?D~56n45jQKog4cx^E-kj zr`=yY`OWONd%qON?cD1ghG!A{y=YD^5F4l(mDug+4=!mUsPxpzDJS+YW&RFcqop{= z(x?6brUm>dcC~gD{*dO;ARDEGtFH+aWneJ7?^WOj_t}dcIUKD)OJSr=9`A2l(Bj_b zKvS=IUGYhzb5(~T(`K(em{@54oWvE?WwhS2fP<%CGL#|IgwsFH&9^}4BeXF0=A=fL zUHz^pqjiHB8w(2-ORw0iRhu$kjj2eB=fC19(`<|i96SW#G1Ft5nlqogJZC=Ux#5zW z_NbQovkJ_+@naQeZ<-90?nk@X?+d`?SQz(_kWhNGp382?t#kpAW}oXx*s;5)0?&Gg zr`@N_Hg%q{Ha|)e6Hu{vpN6l?jf-D68@1bg*}+3-Hd!*>{+L~@P;T51<FRAheyH!O z*udV04U>Ermga&5plLLCgFXM5lp4TFU#Yf3EZd?pi>915J7jt()J}03irzB~GdMyr zjG>?B`FyUBy-i;(Hc@u$_n6`2$5<EMx$hGZtg*!#*fNP{aBzbG803T7dQ|Gx8;KU{ zF^3AUhG)M&iQP<ERxUM5x5AaW^HL0Yx7$1O88VpOu426HZ!l0Hx(YfmbpF;J+GlBw zH@?IkoH9CDy&uO}_#)Cmz1--?R+fHHFx~u{s7B0@fYPjvCcFL27#=XVmQ|F5yt>?2 zlhH$B>bsL`WX%+rTzN3YhoO?f!o~5ZWryPp(bv~)4<fZI{j#+;)6uk&*&ANNY~WvK z+%NYQnLK6v@@*dU*FJnwKj+CKE~ZoupbF%x^e1n~tc9&9ag-}t610u<n&9%QvoxWi zt=Ef>TZ%QBaLk3Wz@;1Bg96GS$VCI{40+h9qHD$E40_*zX-fwGX^0Dx_yq5S-;yl3 z>_?Cm!-Eu5mU;M}sZ1j%ET*|D3LCUZ#ve6UE$AY-h<wIXQW@Oo3%7HrY<`7|zG6=E zqb}G0ZT;(+jl^g%?RPWIO3J;wF`wUY15Zj(Bh+cluhajuh%8n;t8es%T)oVw3SDDT zJd<G9TkFTS8z7x#XOB7@8;|lfrR_7YZ>fXce)Cy*yh|z*S&x2Do9r$Ba!>xB|Je}e zp$+){rkzI)xA<ty;c{f%8q-=2KUId40J=G_c1F{GR3fnNa5*ekVOFd`_uWw8v!#u= zZ_M&;t~AyhWueGe-x6|lT2CkK8r;1C)*g(cU=C<p!;t~aLGsRU+Wht!>f;e#*4A-q zpc5KYrPqEu#g3x|8wDn>KDMNI?K$F${N=G1@|m-S2BaUlw-hm$J?kgk?p#C^nhP(* zQ0;}H>|lMYb~T-S)CK0bGGN=U34v%#EidOq<@9AofBG-&TX6MeZ`5uA3{yXZr|!hY zf3YJEdg{fL?3Peu7Grw6q!uya%3?=Dla*I?TkJ3vfS1C?k#}bU+`&tJiY!HVX?B1P z)gN5yu9X3@j)}WFRVrdvYc@%n=RM<4ecnWVz63{(WyVw)1I8WL(B3nzGNd}|M?GFG zh?c&poc6_mSJ40W5z$9Val}<;Pp<BB`2E5E76UgsGBEfhVU+|nb}9_T8km;V?XN@* z2EfC`Z}xSKI9dG@VO45<W`aCI_8J8LJk%v%&{s&8n3(9KEClxMZ92`smx{becaRbI ze!Nx&vuXka$4Hx|a=nLoYraxGcdFhAj)jFz7(Px7$SX~#uVXNg@0JnnlBu0MlU?bA z^D?>1`KP~eQhhbh)J(mh`kK07r#_469l@Nltb9h>or4da{_~v971bN|iw53ZLP?F0 zdn?niD`bZp`<p$Jy3O*yPi&^AOqHUd>)A;L&+GIlk2CkriN@sQtFbe~yYfo4AdSWQ zqY?O5=_CJF*R#(9?arpH5qIl)m9(>z20o96u_?+MLW9|8V{FfyEE{ox5<5z1x!q0K z&us@a+&uA^?k-yxl9$Y}O%d1ek0q^HSt<`izYpFw>e_a8a61N59GvxLJ2q!M{n6a( z$D8$^TYWi*21rMaWTcACj%4bxpIpg%8L<OaJ+m~ar6+wR+R80$+v4pm`-mCd%Q2uI z?%kzQ>1mCFrR$4<v*vztG%YQ0+kB*4F>rcw)ssq2xbe{SX41QH_f(vrQv}av$Lqzw zZws(h5D8L`Tp&RW0V_pqFGpJSI0MFdo=sI5%xXy>oiIWLCoZVX7U}DYF31}QSkeR< z7G#pHSB0EmFkW5l^ugg%D&*9c^v!fbVd;!gtTifHml+;S6X%=fE2-*+*Zm3XDDdWd z%;=G7lhy*+Oo{TN3p$22eYBfGq5psEeD!TJ3#d<4%JJoW^?CM#4QlKESDRRI)2Io8 zve9J@?5X`E{j-FsEYUM~P(;yK2EHWhXg_DeT<KRkfjU&Hh&B;L02WKP-DP2=IKyJ~ z8ui7sS&qu^N8#d3p?S!O&~Yi#Ueu+aCqrADWFED~osrBcISSdZ`SHWgJ3WrzHZy#j zi?ZW>3H>KCC@2w%!NT0xM8R9_<4QVtr|U;EcR&kh8~lLRtiKw5oZ~s<&>Vjm@`6Ja z=xJW#{*sx@_uJL*sQW)7`zn(4q9lNE7KVm>@}ThH1t;D>h=Ooj{8k(GxvsY6b2M}{ zcsFHHEyY;UeA#93-4)ZbcijbW={ET>1GjwhI$5;QevBqnvRe~A9BseEexT1Clxo{u zJJhuC_pDBKS9(|&T#C=pnsq-luSOCB5fD-?zEtOD!zI7YRT=ECOm{du5o^k5Wrydt zxZ)*F?W<;E_5qP+p$;pflB(yGR+21MT-yjUijH1mtVyit1%|2a@L7STIfIl#&?2e* zpH4cMKQ&W&GqVT)?RT*n@;0ec{g(|zqe)X4j}f@%iyxfHk7sIXRKz^S3SKtSBPS`; zfWeupq8#K<=uA|#b%D@u+eyCocN`mbEGnvl7}f7}@Ki6S!f;b4$d<-Ho^_J%XE?U& zW7M=p3%$M5T1{3EEM4l|Z))!<gGI3zs_jR+7Lj+jV{=);4s-AV;13fm;Xy6uA?z`b zy{nmBx%Z#T2YZ;KS+*sX>||)!Z;5*`<NyiGy3N;=<K#4vbDkWM00vg9pR3$|MH5rN zx(`|^T~xuic6r*!v5bEts&B8jXKfdzueQjeHOwcg)m$|WVtJw)H^Kl8l<R#leu7K6 zFEa!NdD?iDpjcQV>P~3LFXR~!VVzI*#8)o5FwC92aZbf5F2y<Oqj5Af6yHh=bF3vj z^Lk8;KO8=9RTUle>=0A75Ckw+T2GUcjZI6#D_%mVO~D0vMT_$Sx(n;Mb%+GvvFjVA zM7yOkZ(Ha)>)rZ2T%rc!IH$Dxc{+Y!$%@>151|m%Ug)ltk8hH<<HVXnh#%@Pel+sn zKB~n-*xp8}RI+Dxi3--#@DGI_w&Snei13|4HgpI5yv5*@{6+yb2PpyEdOTk%D*in} zT%9l;44w~bLlKY;Py`24TVPjEcMO16V#}~}NwAX4FW2ki@b21AfS)2+DW|}8$>YH7 zG3m`?+P;STGC#lb0Q2P}>WPg!YUKEgrp)A!qwP38Lq;uI&jSzt3HR)7Sb~gcB7$m$ z7Tni@7py?Xkc^Ki`K)Nf=lqHr7Ba`?Qpg3nnzV>{JHvTJ-!;YG_5<0iEiB8j#OHG~ zo^@VLxzimPIw)VGBL6|I*JRpo_Na%bTO1(X9XYXUGUwlD%=AD?(I+zz2$64gcw^iB zt5aXz>t3FsOrPDW0xWr~q}y9c6CY`yQi;DNdzlWwPc$?Y(Vr-^ulG+9l(0+sJ!wn* zQ9U#QGy$R<p1<}dIY;6$=Mo+%({|pv(f)pwTdm1sa(kl}*%aRu0NG5xo68FkHVYs$ z?h{{p7>H=yVm_;juy*<POqZ?M`(@gLmbYuyISC5M(fNZdirU#BsVH#MkMEVPWc{)0 zb8k9_@U4r&e*!3wJ=w#zKQGOxlO0P@^cImj0RMElz>!x$HIT!h5Wfms+tiqBUs7kb ze}mNP{OdLSa=p4Se=HNV)f|Cm#@}B&MlW8p^mq0ZW1rW!AyfbJN$=xHe`%(w5~*IO z^Wt~U@>25E_T^_cR5&@m&x7V*rYC=@Dt-APWas2`U2AP(UjzLl$NhfWarn{o_EHFU z`V6ufvW8C%7Jw0F(_!Iixa(t}9b-&V{ycDV|3?+#^tL0-*TQ;rQ&Usmizzk$T_4y< zObrD01jW)O!+r4>#DRD+dlX7YP?nIE-v@<r#qA{P=7z9+JgjZpoo~R@&GduzQS@qs zZGmI$ge1x@a_zU9cF_nRC7JH_pQLRu1X8z(TSKh^l^6c$T&0a?usT)s^{o4Yl1Lyz zFc43QF3l=%QX^*q#)?kWK9?%JK2!H@q8StKVXNF=d^((<l!LWP7Jrn9JLT(j+<H^= zGZjh7ikM-Z-F&~vRO2a4I>o8^;ZNa8>OTyz>*LW>&oOclA%jM0q!uJSF@%+3q2niv z2-;27Xv*NSrHnJZkqxO@KbCXEUzDy~WHbpKm3-a`qubMkH&>Rg6!hU%;qun00E~Zy z-X5NHe4fWCOZ`yZ$xBb<Xd5FHs>5>!R}!@z@Y!usr7FK7Rj6q79^$jTx>IGijmc&g z$CcZZi3{S}mfhlCx<wY);!TAQn3D)KBjpS&whZbQeCGyWdrz3xbQ*E@{S(S@eXI0c z_6jmf-3dk4mVV}Z@h+z>eFj}Yph83cQsS7!C5%yeTgvt<?N%+7*yKY-+i8id%uT@0 z{DS*Ujc15?vq?j~KNtEpU*vtdu<g*pvj&5G2e-v0LX4&^wG(~PD1kD7QO#O-=z*8b zmoY8ZX4otKBpV#P9@(5jlLy?YM1vz<$XLDJ>enyUHL#Z$ix%>3NNTO0lh%rZ^!XH? z4X^+=wRno$&w9jz{-V#YA%9Ozl3njQ9*3K!y&{vZ^3ypL_1_mc2&ypBe24xM{_W>q zB5?rYxfZWTru@guycj!?HJk8q8ZGHiP&;2|Z6N|C9-T4J<q7*!$P@>we)*}@<_8!8 z`xuS;Jr*Xln3(qqr-5`iz^AELf-3pg!L;Um+<IfvHM7Vc)E$lW)??Sx3+LWpU+~=b z`2~~M9lwClHk@?YavwTRob>B@8dhXp9~H+EQ!KW-?(tI6t?(X1YBiw}@<rrY&9x@M zMO@<ar<lg)iSTA2;%|8OJm|q4t>b=oaRW`}-=$_C&D<F~IWo~mu<@omxgPdwy$)b4 z0@ah-%M(YBU8qal!O3CslM)hg1FUmHKzfTic;mvt!cP@IgO*j9b+P+v$+~*P&a_<R z<gt7xS@=7fpOmz_^9+=Eyu~64f(N7KxIyFgLi*K9_Ys_d`!Z}!57zYb_RUwp$R3M+ zJ>|&3U5F~84z)<Ns=kEyP&Ph{V8yUSTlG;|g``C7Zqa9yqscrLWj((y@*NP_eWF$4 zdLBVwQHzkQ&?NNwg0NjDuHIK|e5BY>DF|XvPt2O{q^Z%^uF(5D^3$;!r-K)dSJ}2? zcM>?=+a`Q4UG&7321o_mG%tav`H!*%_FDcjV!+(1hfVKGs_reeC7n4)X*dmXfm}w4 z*MQt_6zqsJ;GkZnkLq_QUbJr&?Away05&ZMA=$5)Ov5zR`n!X^^j@kfjOjtmv&^2? z0@>F^1Z$q}*{2S^&s5pGkKi1Bk48%PehFnk^Q2^TYT6U<1OB@;Z)?r#zXhX9g3xuj zKkdiFY3-MXp3(=eI<z><z3?R9kGL}CfsQmuN<c%yV{3+K2udD}i7j?t!G^-Lt!VGK zbU%%58g;#}LGLflQr!C1GBSEExVL)xles(>MmxyxC6DuYh!&0@(JikF({ZWFuLo+y z+>jAh;w)3@+Y!aU@u9jgMfG-AlflE{j6u+7KB0`)v8Y`(H!uSwIMwUaL$Bk+3;O=# z=a8m2pI=aF$5UUK|3N1ea(s(Fhgo)Zj##9A9$5}-keGoYZ06a(xr_3f|4#a$?-iKz z2dG3j4VGL0kq{4z0rg2UkR9p_=oY8Y0Re-g@?f(s?sE?6+W>iVg2XHZU?XkaA+Mg_ zNy#Xjwz~;K_c9_U)cPhf$q?GEzJJv1lX%^q6x<P9vq<X4bo#zBzl0LGTB|64b=#%N zcW5*S@?a`}2`;dyz-N?#p1PGAOy#@1K-LAv-DnPGqy8_G{I50zAx<ngg#V%uGQcq{ zb|-Ey{|w|u)YvgMGKzz6_W<z~`!`-nANiV!6I9`?t?^7XicBP?5j!*^8UMGL_<LKF zP01SBA!6CKJ=u6T)*8Fg`ea2JfI(Ect8S?b1^o#+V2OL<SG5JaGxoIt!XNWhN-Yq= zR&a}7@=RC(n0Ptuy@og4D0kT_=ub%hQ#RREnX&IRC{_#aOEMK>qng>PEMQLI$U=11 zMy153KBoUMM!wuib~c9Tl;2jb?V9A+JQ4Wuz<L`xQkUF9ueb6eC;-@f<XYw@1Yp`O zQX_1+u?;xXEK2v*^`;L0&kH~qDm$wn?V`>{4W0dKVaN#klBX-{s5#pmR{?gZpkynn z8DJ20J4AI7++WPB-0Z|58hxc?v#avY>@;)~*o_rgqsLrOpe|0GII#Yh1FK@im+ivQ z;Rc%T-i-baUtbkeM;k3WxVyW%y9Ege7F<Gb55e8t-4fj0-5oX%+}%C6yTjT4y>+VY z(|x62*n8@mp0!r@>h}LdWSR2ts=g3SMjVjHB{hvX87cK)+hpzZNJsj_qt2X_^I6Ee zA5w!abCwV`mH>!K$zHi0#~;{~7WH!YOK&RGexNcF<yXAwB~wh06H(Q>t}|4`;WJ5y z7!qZv@_x=fXJSH9e^6_FLcK>?*Z=B)y+4S$7$@~po*04D*{D(xdTe2&>aQcp%9-FG z5^yS3dKdOS)n#3`Z?gkdKpNr3RZ#gg3TH>=Uhrf(d>V*5pWwR6YF_E6jsO7TjLl&^ z(83uO{@VU0{QpYN8$EX3A&yhNvnmQg#juag@B9a0KC_1HU&V?zK&$pJH$t-?bB>Dq zNF9$e;xxC_^yxBTs{U_Z3*~wjBW5)5k+B~Yx0=}D4<DY)O6nbRIxyQS34Qw)brKzE z-zsn|EC?TOZ_fVh@5d#i_-!8i{gV(jk>ICqtL7(~-Iout{gbUwu6nw2^JL$?)^be5 zek`x{gOrv=fIyT`#q$mnXGOF1kpBY^gW!e+tUw2M+cz%>4TO-8BS%XQ<2C^{2!-Wz z!c-`k!(kIv)Frb_=z7&z*G9o1er#dz14mA<kPt#L3(&V(!lcdG2oTIb4%gPtlZ8oX z&LW4;-Et!j$+;)?urE%Mn6UR$XHian?uKtqW@EvkAEvkzz`L=railotPhuP5B@Sva zGbqn54E(P#P^+1{M>qGpAc#*oY-XGha%+Zt&|o9|+3tP%wY$BLt-Yam6zEX5&<Ppu zOyBRTT}$8hWpO{wUFVX1Y}d|H@if8(CLBA>nHflbV-!A97+FUN+k1#4A0{A>%W%U> z&+-h14#kQc?Kj*jrMMjy$o`T2LFN2%|7W9~t+9u^rvXUwzWc=fME9?)BVpAVk^NYj zUG?~y>mf1t(@P}5EnZk{SB!yJ07l<|*5h6uSIg^8WMWg}3(VH7(cR<I85=1@ZCOOx ziWV`U9b8W(hvQ~cXsd}6DJ)@%>ZP#-5g~kw4txlmn||VwOg_b+MZc=PqEdbjU2a98 z9;O}vcH#qdZQuq-BsxZ-x+A3Dh_>WzYq7ONSZ&ac3zq)u?ru>(J~OitRPFn+x`{8~ zP%uM_gM)+kx>Em35$0d~g^$}h+SOx2!Vk5}>S&^tldSfV#_#_*u7EDS6i@$IW>Rfs z^$NSr2CvjI=9B?$y(r-p{%T0v6KtHO=5C$e`rguy&Dm+il&VYOk8Kb?cO2(}onJu1 zzy711pH@x_n6ENjH--yj;_*LekS21IfeTU<-eN5?@OGzGPJiGYhn4n!Q}1CF8$oMN zMs}1j<Y0o;))ad@`6H#=>YqFRmz5S&I<QRLr(QVA#6v{59Y=HsQHaVjfi=OaHTI+k zz-X+jo5xuyW|6Yc+~gpW3Q8+wEbL8_C^8zt#Em5zNN~2d8^GN@*a7fd8jc8R!#~fP z?u$C%ajhb46NZ*aC{pgozY%ydJR09JrA>yp9Wqk{`UuC^BdsDhFMh7e4E<}wVtfND zzMA{|ele_!EGEa_EMtkrX{#22xx?fz+ps%hQo9vTBFA40^|M~1{N_}h80#mB@<`f= zBR*dFAC13~@<(;V4(H|w7No*2u0Q3%mTt{e<twa>of{w=*H&2;?!Qk&_WVj8NJdRy zSsmhfPglEw0rEpiPQP|))7PVr3?!r&AaQ6p`dVWF$PYcdpEK`?+DdJ71Elh*A&gvW z4|lx}7O_Z}yvIGN8L^A%XBkT{jC&BufTfBIM`|&jvS)+UV=rqrgIO;c%d#cxfON0w zyp-_30rXOcCGHs4x{Jn?U8<4kx7!sJz)DZsl~K)VmUw+3g*5hkGqqL_45-h28~{L- zNW2=fm4@A=lYkv<xCDi<?I{ESOgw>l=5k3uLnNrZ<31R={<S~F$HiQ<5&gECj{hOi z%Aag3m`etoTXC(Klvv5LB{qbF$Mn7~Z9m_ZRD^3!2npcHhx_=hEtzOe+Wrjn>$t9y z59;;QS<JC7add)j5&jj^ZLM{?so`~AQgS0z5@hTCC$gKb{b#zXG4j#-r&)*hC|8f% zBpcEj<E%}p^Y1aY#crR7_#++y?6tlGdCGt*O+wZ4uVJUsZl2>y!~@Q^R?J{l_LPt8 zIF&931{%PglJWV6z9-;63H^$7s3^wsq+rm%UQiSSi3)AMO02eQA)uxiQfWoT7fr12 zrxQ_C7l-KM1_Mv$T^Gg)F;pGrJCBTPoKW+RFL4H{8rybehT&0rE(nZ8RQR{s51t&U zD7S~dW9$MxX9Iqp3w0deZ|T_8HDIQ;@AA2V$VCzM7=J2&RUIP~-vUCQ>+{ZO?|yrH zB_;F)GN=92)zID`*Ph^^1Nnt*ntUE95J>TU9e9NjHiroFpvrl3$_yXNI&6|60ws%w z*h+FUiGoOSw7Etw@W`t?$im-R`;L8$uu21U7TaCPteUi76tLM9PAT?qoW%sBMp(e_ zQfsgWFSBl2lmWY+B$Y*gAgS-GJq%-m2BuxR@F%c&4zY+%egd7q^0zO6>E^RO0~47- znw=gjX#;kxdEfXv@0klTz*pG4@cj_#ttc#@X7ag=)PEIc2qacvt8L!A0B_hifMJIL z-CQ@5{*cCQki<1EHMLZ%u={D;7W;B~+m2ys9nB}Mdg*HdIt@u_?2^2)-K`rq9<n&G z?&a-shaOsRFrVXI;t$4qjPBRd`bmurHw4Li(&p93VH0vDCfQ|U-S&H1#4!fm=@W@u z#ojNWUK-_zBd|EyZ_kTpOnbQ9NPS7yPv`9?!=pr{euX~1e%IFy{jSu+_dS7diEXm! z(ocJ;GjWRT>s50<R=!tZbYp3M^9(P`$>1^>Lf^9`^Sbn>gr$0SKM3+{<6$g8^jqi5 z_NcY+cVW(91j?#%wYJn6{}YOrv3NqxpGb*5V@!&?RMh#|c!N1pggGS(Wi=$HK}dPD zxo?{FWAg9TfnP2+lb+;WHz;AdJHrL2R1=7eP(H936~HB774T^rE~(ZQnmE&e*!+6m z>)WP||4W)UY$OFtQu?O|iGvC-`+1|pyi6m}uP$J!Xmmsr%O$97&cZ7y{98E|+jS5t zFGM&J8Ha|T)e7fy`HErnThrC{^8<rkBgH;Su^G%bp@2U^@Q*(~VO6_(GFJ0BI)2Uu zmm(8W+F2kYx>=jh=BB2vP^l4o>yB&l>My>)Rqd!qF_Sj<@%n>dq{gc#wmtDi#Xrjb z-+l7OS5jJ!?0AWYu1qCw2MaoIc^3NW$y;wUn`KsH`z*4zLo}3JlUGTebTr!JaH2^< zU2iGSXX9CS6jT(Qtq{l^T(P42)yH&ogsgU{`*Qhi41Z*%??TU_f8MRN$Nq2}6x z^%=;I>`pHK*fPP*53UyzfAj?a65}s9y|R*KSwKVDw{mr@+MF=^FARCtwiqib30jd; z>I{@&E0ik%{kRg^%uRV35}zSHf6k)``VI+Q_v`-YBg@f|)|IyY7bQi;=r0ih)AQvl z@M*sodz-ic8=!M1MY%xjs|~W4d6lNr%WQPWyvdh+HA;*PAX6MbgEN5|63>3s;TF(p z-=j!Y@}OQ~^0%iGxggBPuC&_q?ANGwX@7Kf*U|1)#`k4F1EHj>Q&-wm5E^BB{zNI& zxQL%&{brTMbzzhwZ}5g%k|CD5f0&vOgOd3v^T0qgGte-_tX_Df1<zM4au_NeqK1&9 z`c4!&OrV+4g?r_yq}^w|1u=cMOKwQ~y%A<;6xp>B^W%z4bCn--Ew-)Ju&AU7Y3Wk& zojuJ`dDq$O(AkQ$XmnC<o0tF#Tzx_wE5l78%R_;F-~&p{NjTk2sH^5MSc?mA`LxJi zn%NiMAX?b+guJMzHQFqgVR3jN6ItwiqMB$M#(3;07kMa*HrsJSeFrCtdv4eh7juTQ ze-Kj4J&HbrDiqCG_Td^$3S>q)3}r-GwvA@yRY<Wkh7`PZB<|eg(8_b3sNS|ty<Win zNw-uMMQRFjv2RJH<CcN?ag*}WgDXd71-BERw;R|jaaQ_?jgE)+dr2d`7!XI)Lmi+2 zo${D$fTd4mN5j_{NubQA*oj1^ko9%>ic`(2k&NnkLK0PH=zeZDP_b#dBQhjRtrvR6 zMC&^O;PJW-+|qt#UQi?-JEIgkzyflHO~eKjNDP{_x9|BO#63{6>1Bt$LHa?jJ*M@+ zZLbY>k%{`~6xjb<Jq?|=354^3m?S`fh4^(v!H0zm2~a<O2IB5ogh}V-77a(?$Z{;x zNPZpc<*ylnvUU@tFQ%c61Tv>`J%2fkA5)$l!q?do_eR%LDFDWp?7K?{1;gCkR>?2+ zRLD|;VlmkdNOwp6nq-50-UxrpK}E{^wAUh(qjqFXQt;8GrcVa?8fe*A0n|ZK4}u7? zBR<k7%dm|*FLnCNgV%MUr%am%UC{R>LW6%DPN7Z`UTUh>Of1aL6<vqd+g&5)+A!%& zG#7GX8Fa7tA0D%UXj;27Vo&h~M}5$1c0Xv$q`ax^7*2kY%q5n3E#Lpj_NHy{0)y=( zczr+YtyJ`27(8*b+i*YF2KhsYe-V#z`di?_tgWRLktyVAbU2mU%Mz!#Ua(OSZ><bB zkV$la5AoTef03U~KxDyl7mb$Nl0gYDsQ;%LoCt}5tpwzx5q|S;D)WN`RxM1lhg;kz zy4<deblmq64Lu70kUA#)JW8RMBhFMIUBdV8=Nb{c7+i#F?}#;StB7*6@X&A(`Wayq z4}YQ3`rnOsQ;8spp#Xe%nLQWgPDg4}?$<m`v?&^JrGVrF|JuC$+mijhR-;9W7>g!` z?FSO6ZggurVw}_#jnfUklBRl;t2%3cN8TO>M4O%P2#F|Oq^~=l<Q)RcJLR3I01(%> zx6z2q<l_L&J`1rORo07=uNIDVS7iPh!mgl$Fu6&gT4QC7F@QGbx8l~M#t*>SF#nx3 zXz>;Y6{Xw-pJvx6w26Eb+Sn~^o(`t%-J<f7znUY_F-BUuT~=oz#*g1fBjB61VLY%R zK9OyyrA6!bs=}J3v1dHuII84ioCVnLt|-6(>{b3j%ca2pNUiE2oUDG@mY(<5Mn7{p zFoqW<N&HhK_m_$wuM;OLP?I>`L%SY+$cfv!s|+F58Y87eMyXCj>Jur@j9H<$s+;_c zWB8G~Q$75RfZRpZng}Rxv;>l-0(~Ih3gH)<|GSlE{D>WRp0GiiR8g#g$=6DtSZC;r zqFx|?qZ-TDnQQEcqpFcT{Kn#+r4fl0?f{3-GkUMk=|IOqY+<C$xaEX9&DG>vE{SX> zZ(gvEghsbLZOBi^pO(dW7ty1EgfYAaMlyJ}K691_Nt$0&yt8DSy>kyL!?F|8;YnVe zyWKZY{#J?VobEnzXhc*|n7j-RQjeU@7e2H4*fWQ$<vUhID_LES(rA2YBHCgYxF!lQ zuqa@LknstTJJe7W%Em=x)~izjw9>w$DFZ*f6s96B33F+V0BJy05CSvjMo^dE=bF0A zqD<Mfj(A}uzGY`kr(p5Nu5Y2|RHvdXgsDt2Undl~Tv}uX^g{tuj^7$F^i)Uha;4?s zM9m8Pg!`7$e4hnp-;YZFpQk@cpmJ6XFt<nzIlB}~BJFS?s$)omdef=|fQWZb@5?75 zU7*qw3E4E>?#;19_p%2qbe2J7$>!-2Dr2@%$m5nM%oue`tP$$WGYdxc#mVV(1tGIe zsOR7gE=MT9VD6j6@O>*rRe=!2pmn3B1g&we!D;?s@-#jGUmCtt-IMtH0)smKC<URM zgLa0Z#`}d?O)Ud^uhhC&Art!Fz*{NS=xkvu2ZhF9o5`nTK7=`$(63zs4nc?fsOBcU zg3EMGJ)9Mx?CBMe#uSHi#vpJqATt|<6l83MF)`H1!Iz0IM^Qr#r%2$q3&_kUifpWV zV-l;t$vY5rcD)Ef&2?+gHT*5OM^_wkY$L}!CgL`W!|%)e68e?kxQ`#>n(A`Ur(U-= z&_TiZbPfZzULq>=LKQ2C4tWS}oq)z^_?gdkgZVinJ{~KKOBE1(1SzI9D$oNpn%AYh z-~8bb=>a8qFcfHi7lZJ#=BcYR(c#<l;>z;kbWo6h0h<1Zfkgr^Y2{+@06y{ukJ^T< z;KI8ntEBVp$F4jN(aXL*Cm%FsH^vm_n;E0$5Xv0-qvEP4-mJcUY^!ll9D*Pt?|{)A zkpw;ZlopK&>__c0beGONaR?$iv#;M{9tGVfYCCFzJ+W4(z+zNiZ;Pr1Bz`--wthy1 z0G;4S&D*-K;d=VTmZNE+S)DhU#H4QQ8Z`+JSY~O*N0gNvyCx!VILm<KB8-L4n}pEz z_X^*`vnr`;MKydU`eG}yS+74dv^V;Ua_#2j2tO%N3r=h>X0OF{TPVC5ADp$+*o478 zP9{X^PJwKEK4r-*^~EN1<FldiZgh=FjALb<vPP{XOVveu2b94%&f@M&RuAjIGL)pT z+az~oc$&4_yMHizr^Ii!Z0+-+$<hcS72#i48v3{K+;@DXM*ZIoy8eE@k3?}hsC2zN zPTInrtBb{3?*wMq#=nI_Z9OK-)<p63V#?p$`63wQ6;_~(9eg=qZ$G3VmT|(dOEPrq zMXlzT=w#5lz!Ejh&%S{y<-+=wN!no};S?MNwQq@;r}0yz;DCS!u8#z+5*A?Yeda`A zm5GKjaFhBhA25(mv6{Rd33EZ$CI%$-m)F=>PK`uYHpch-&AaL&$UQp-WzHLOn5l55 zkl#1@tmS{Z*1>6d*Km&34asC0r24@xf|XKZyc{!+zljE)PN?BqNeU<CGC~ZHt%j|< zToZURPvQrZde}n_Y7i`prv)d+43eaVkYv)Yb`%YxIhww=6H8F_2`EN`mr*Q(i?((C zY3;l&aRLSnmOC1YJj&czHH0*iINbK?35$BAEwJ*(ugq=4>j<B^QsX_WP1@u28G3fg z8!ejz)(3K?Upnk35<3NOylvq_pmtAO`}B$pP-NcQgys(_FYjQon=u6jsoC-VJll}_ zKRd_g`~*N|D~(Z51_me!W&wQX#CICu&cxKqMT{=b43~@FeKBHwLBS%UGsqxF%SiDC zsLs$R7G=+?zz}WScx*YhDvjP2H#YLSpVF71CT)3Av3=Ik<yo81;$K6B_*{z`@ZAHL zGN_v+ln3d0wPYwjtYXY@f&y-D<r*xLS;@r$f5&*Bwt#;Z@F*vSEc%m!_nG^sW50Q6 z>&}wFZTZJL4Y{OJ%q~TWWX-f`v$;X$F!S?g@;FfTrWtybFW7As6BCMI`A0-7ug%{> zSxL(J7tJO2L;f;kUZ?YABs`sjYJs<(1xPuHZ3LL=@d`e~qAxv7%XIhO#ofHB3QL_M zyz!v|tZ~a>X!9AiD2LuhuSQZXKaP$FAfKtY2R$RK0!u9r7BFgdPrwWQ*bJ7M-E!U) zg$N3GD|W`dEuy2UiUSb}&X|yi29$$e`D5Nph=TB*GVbbF?p51h>ret5gZ^oR#F2bV zJ|9U+)5ig%t3Tf=zO>1WG)%mT<_awIaO$?Z;AjnFx1WlFZ8uLHH8nL2s$?|&82_pA zJjGf)c&~_@BK_d3WIv&-p!+P7w0%P=?7_`1@eFS5#b{ne>YNb&`2<0w3Z~v9dz)qw zpMa%2Fiyh{HZ9w*(|m&Db^nnCM%R_D+?Lb--`XdMRW|}`-p*lUiw!J&gDh;z#Wt&g z6a=PfEd^-xI2(JO*b0n<k$30^u4TTkH})*Edf^#uM#=7nfXpEP$$2TXWa^y~>1O{U z_<#=|UQA=Wpiq@RX}IIB4m`f6;Jua?QXRgaQg?{K0f9rO@4IJl8s3Or_G9U3$+6K8 zXd$i@Ve^t57g%-~?^|-Om&ZCR);C$-@r7F0;jv{+-g%2682if*0+sOZmcsk)XmOGA zh|F@b5dxX7%5aQDy%}42zOeJy&^KUc(4#osh+@29k;v>g7r%oMCq{eZ!0OM5>@^=H zm4vWlg%c`nA=9AYROU2^tuZ8Sc+|`G9ep+rvI~FB(QgI(8;uUGW{zm}7N^eE$+N!` z2(2>y!B_V=M?TZl5GtJ;bUtH}aDY^23zp^J9wdE#nI&8<`yVEmLy+?gT_Ip#U=!pD zBb%D_Yl;|Is96;mpv^qz0`|ZcuLWN`Y+<!vUjPaA7zs|68giw-o$~KHGJ1Q_*NO5{ zv+7)_@QUSHSPUs$2sr9N7iL{pxh_637oV6GjsPMRNL0UZAz#`&-x_p?IDTSa$(F$7 z96wek>%hrTC@FzsbFs2>H5s{gh>XumB(0Hj5ACLd(1*n~{Kj~0w?U#RoX9v>cl5Wt z47vk>ZW~ac8NsuN+WR-eQJ1m$GZY~gY#{iXgik`0N<*v>Tld}z&14{DNMUyPz~hyw z)`S#1cO)J^bEp2%youMJT{1cacTVM^D}w8sD~$k9;%FG%sxGzSFX}@m0PEOWiDpj> zC(~Sxn5B-$?EWkRK{cGv9aLD5Pxu-1_VR#4CxEafQ^QIn3`G}97Cd|MrLoWdI$uiZ zVV(l{bOEF98SFY0Uah3*E)M(*DqNBT7dS!F)TcC=J93h}?k*4?1kpZoLhz+eTX(J7 zH*SV5W;XVm-qm1C2yvIk1)0IOjL7`@eEwx>!nC&6rkP?q3)hYpd%`*B_Ep3!+Hdp> z7a%_=b>+XjYO1_!|I~6D5UB*gCBiBYhT8ek^Jjz9xv_CbxSXy7cPktQNl8zS0$^{N z@AUlfUqU<PjlVVem@(O}u}6fuI!^l@7(96P^TtKJFD@=ppI$E~f2XH2k#nZ9Chbx; zfDx?Po;Yayu;pPw=wb^TEgd*}<iBo%TNMtz5&gD4H$-3oWsZKgPf2xk;3nD?Vea2} zI;L%hRt}Hby%w+mw8SR9?LY`QDTG9TSCsH-CWkSsg+&T%8hSB?goFenZNfw(G_*ib zscLb={cxxtvC}!%PGPcM?{6w8Nb?BI3$DpefoP&@$kmIA=PIXzPLpzXW4vRg@0&>3 zlWcmUV^*Or7u|{=C$3);A%nZ9#QMDHINi_l#J9)uNdI}-N@&l|-yJSiqmlYN8bX{; zpTz>C*`iPXD5spO+q42n9Ua=ha-WGFuvvVtWp$@I@LTR>w5enhOYsv0_v1caH^Z$j z*gLYu^#WqeY4*W>l%*N|@}jgjtM~D0SK^ytZ{QDoXPi%Z)pjmAw{u21-gnKA42ehl zOYN=~VrAC%hBGX|<63NBWMY0&Gb|K?hQS6(ib7O!Dj9PCP!r*@Iw$LUUcs-)EDX>5 z|EF=2{)fcV*(dh|JJ!WXSb*~qxol!%l7$KwST$pLYwhuq;M}oBWpP^36UJ*j#@^8X zZbi4>*vmUSV@Yu@75=<LJxw&lf&`3g<8-uOl@pPpzeRI&We>fg@S9s@#VY)m2)Car z!Ueu=?duUNtS#YT<@bh;>nimokkvy9=@)BLp|kR67vMr2)l;^70zbET`QJLu=QeKz z=Iv#lGUOe+%}GJ%tk)byG%p0jNc!I(#16%}gv;4&><rz=MNKqd!1!YU>9f|`Dt=^; zcZL*V^lwrHK1S+OOP(%NflsI6Yf7~J#O(SKog4dgT5wpUR*k30SAZP=0sW(#>?T^L zIE-7|*e=3yh2Uri;;0<=2naE11U24)cKp%1Ew3%FEPU!U4Sl!f0>9n8TpoPa^S><% znTPef_rLs>>bo#h!caa6iiD?&sVBc14r2Y#6?7}l{WCMa%WkFu{rCw1{7Cq0=VPSc z$rDfHN!W6#Co@a>vkRf^g5ki~(MmTgH+eF~*gE=G)4!c7G#8^0gSS{0r|L6}h|g4} z+}7nV6S2yZQY;Sg73p6LXNaZL6^j*@1+ni*Lccp4sQI`|K@1IhqrzWo;7?WnT4F@H zee#)fL_E%?8ezFqX#(Af{e*vxZ`8|9u%7Aa_vs!qS)8&Y-fhTRpYwet%rVYX&;Z_| z>-CtzFOo)*YjJE`Vill?WMeNy^hJC0&4`?P!A=~FyK6)U>FM$4I8uMQqh4Cwb$It_ z|7ZY@WDLF;+$*FY+daRPIJen%oH9K!mMhi!qE!*tBh;~oWPEy0^vl#>#RhJPtn)|^ zt}twn3jBFEb*m6yp(xlvyUqysQ9#b>c2MmG5ddgr0TdM6ZIkn!Z|vHQYHgS)@fb#) z>iJ0{Noe=7MU{K{bh;?cK+d$4_)|F6quB|rj@LH2N%2p^hgyfz(y}kHj%;G`nM8PK zq{uCwmfBvhymli-gLjGi1qH{vZ>Oaw$C)pnFuSztO;NhQ1MTgm;dn!C^HQIq>mQom z5z6}`_}=eeY2{Lay5G)dAhw3>mA|BhB(b_VweGr+dEY8qt+uh4LB8i5;<fCjS$-vM zWgC>vIfD~@^!M9NX-Zmc0p~gY(DzORP?z-~9p?1SH1ye?T`oFj?JhwgZr*yz`<u4! zMA}U@J>a+%+WVhGr@QSJ?|8FCZ_@mC_Md_fTF29bWyQiyMg1jugPS)zn7RaCzpueX z_Z@-8Qqd^riqiqyc9$bU`j?fH>g}6JSL4;DN;mU8S$;hq9e&(rZ=a~Aef%|WBopLi zejm-9*Xz~b)s++(+zhiLvS}m<I6<=eE28NH!Tp^-94W}Uc|9amG?if>D6`P-f3*NU zd9OhL(E5E*4e9dYwEo5TY-KU%g+dqIz1wxE#t`zD`t}>hX`*@`dX2Q*`Gl66-{ZDq z>UErN^Dh`u%ZP#9ECdUwLeOF<cy83K(D+^Zn}4+`1PtJlX_0MceHHLB%GQnS)q=q1 z1p{Om#*3pgpE1U5;aRkzRrC)?NtsufDN}%!^v7r&`?{<FzqE9HavH0Oh7o<Z*FiU0 zemqK2Y?*m1xZ5I2ySZ8IS{Kat(O}mv-<BbW`pwyXKc!D~pfseWVS}F2^<&tQjCUk3 zbVO8Xwag^)!E-4sIgw-r*ZkKueSJA!uY}6JxvpLGG%=?C>LINi=Vp*R*}D9wDn@g{ z<Z{76@Z4s>3>lhXZW#1dL=MrYKC{$-grSZrCUG<Aek9x{BtbgIyij?hQXyF5-j{Gv zmf!cWXh0Oo7}Qn8f8(Fp3HR{!JKRs5I83yA2yi;J5@}c-<P?|*m<^=3hHsKABvy}( zdKQz}zXph-*lkr&fMerMTa*EmD5$F0x1}Nmu{<d5_>$OsRL?P(fy^8(=f8WDVCZpE zPXqjLuQdKNg26{wJHXOq&i=3Fk8@+9+Py9>>$5Gwbx&qo$uj<P$2shZ^$&hYXGq4y zNwHYV<N+%8OA&~NPvndVB}_OSs3B0mmxWukwp6%h?GWdO+x`{@gru)86>-lu#<w@h zvN~9BUka{tgxF1<PeSV&Ri_^$-x6JnGsnAOt>wbg=MI3Zr;W^L(#5Zz81u%?_ARk+ zv@#k9X%xAF9iS3A-3eT}6hcQs1RjlcLUonGRqH|yxn*}g&EEc3E0rj5TKYI-&!>H5 z-*JT+o+o<?Rba{0Efdw|(MzUId;2`gi~kk%Ayu^SV9%8FPuXMX_pMl8Eyj#Vcn6Hb zKL*4Q>;eAJ%ZyA+)7`$l5Hc9&JD#Xg!dAFcj20)`mr#v7jdqF2yBb%&hE7&sk~0?J zaHP->4dT!OG(F(NvOhy16z&pdo;_}vauoL*aKS%Ln)3CXIQJcu1onN0>mEdk9G!v( z2%|4~06&FdB-CvEf@_+o!F%`-40x)cy@%&GoBBSB+OUU5_B41x3sk>5Jy&$#@ZRIA z$L`GAi`_;ml)-I!?TsCQ&Y56Oa%%LsKxbV1JchvX^5cQ;X0L1YheDvj{LsWX`BwL; zZ8wSI!9>6QdmZMk&106|0elz+TW&f@kLVFdie+gslC=#!5|0hngNt`A{U`jv^j?g| z^%K~8HnKSR6ASl^;~2Yv;xOrdKGQ8H6YU1<gkRS?Js)}wr;WE<1PpQ<DgD}>1$BI$ za31&ABE|Tlty^_%G^}}*_s^O)aTzQ_(a30bOq!Rk7M|}O!9`re%SATpib<L_WJvw5 zN!%B#_uY?JQX$3}eAkl&DBsszE=bm&zOC|UPDBa`WJtGsPWQ8wN=pa!+_3PMPLE+2 zDeT*!kIR!jMTJ&2OM1^Ivi~LI+7FU6M?SPWokIrp(2sOq4G=B0Srh5`JYBdQ6?Vgy zT;-;sZG+{sXz(~HOyVhXrl(7_j~fqFcrR1a7yWp8*z8o!MYz`~mu|vf)>B$h7E9Re z-(q*j<bj0Gd+<`5Gm<1SS$KKXbJ7&(;K6Vp>Vs};=;i$7w;e%&Bh}|#>(wR%_CLny z9@RxZ>$Kg##{i$~qg0+D2U}Vaj8e4uX^i>U{3PJ<_tp`5;cQFn>m|0eDzIfvtTXRi z=%?q;->tELH@&$Q?xjk8k5@muR-*|24I|Sg)rULtYwfDJisVHJK7+NL((xW=g{KMf zKq2RuZHHs-rcQ+(bO*OJue!wB_vQ(R8ZRi*Thho!8-bX?<3B&sjHQ{$#jCYdfGsCx z&s|Ed$9i$*bwY0ev)4r5l=KvTV>*6o^%g=XzFI1fl|Sca12b$uiLbh^a1iAz@O|H5 zZ$Fs6!@)%@G&?|Q(Rdgd4p#?<3CA&G)O-t;U~8!!R<zTQGD$K`>TSSyc{9o2wY39> zbeV!H^^R&{;~4N;s+~W!3QrdSl}7#75Mmw>=AIITay&#-K$A%1O9+A+!zw;V@-Vj> zUWMl7putMlFc?PH%AT3v8}@_#vz|agPJ&obL9F=dp<t3k`VFXmccWkd)isfod%R$b zaa{B6xt7201c4ulD{9YNfzFrwOf1#z4Z23szY+3N9;af<1KmbFR5!Jk>jrF~HKwBc z!-sly9|PPidP#eC(rdFkQW!17TfD@j+aVrs7b@)qHI15uwhaMNJ8`ES>w&lYIsyTL zUc92<s=c45gs`?}WyzkqeI#l$V^YVn$T1(gY3=F?p$HANapZUiWJwXx5W29@QVQb` zjZAv)030{<0@8_**l8<-OfeV#8j52|`{ExfESPN0HPDqsH?scqruZ$bi-~BgwU zBaPiX-2wrktYDi3ZM%t`T=o$L_mfo){PVvWk9^g%yc+035yiy934sG3GG%k}u`Nx# z;jpr!Irn{3YjzSTk(V^U+{oAT<mjAK;~OvLTe-op-!2A|j8P;yVJN?il6P*5$8MA< z&-$I^iH|9d#I8m>InF1(W31yi4zl$f)9n7H6K{v8XS4O_%$~7ST8~Y~d?C((VfhY_ z#}Qf+7XLv#T&u;dXYwi0tsh8pysDzIua+v+{el_cO?*(Pwum?RAS6!{<MNgraRIB< z^Q(v7==brYdbH?_IqYp&;CP@)%P9GPJ@LQT%<y4jVvTwe3SR0RG5m|#l6y-WL}t%- zO>p#im|FQ7{PEQW&UQ-_^1I3i8$jQ7WFKGU7c_5SQD)er(eHWZ>|Da{j`^KVac3wu zkbX!MZ~xfXEZat+ZC+YbR71`*Wy~c-&gF4T9Y31Ti%u6n@V37}e4K;~oQA6|#`UR& zx^w<+$8TwHNnlv-60~fE5r>n@^?PIS1gl10-kIlBB-?L)hKuv-CVb7+$5+9M1#WPR zNecW&s{BrMj|t|5r?8LPw*ROuTyeRA<AIPmO7|#WSxkJ&lX^K^oV}BA0}ClhrKf!( z2o5)f3M6}6J^m5YzTS_g&wQMhzLvy7wp&(SH9+?9DAn<_-(71qO?f4l%h4M#w`9?n z(^RD;_OsEs5%SS;Qv?aDC5W<%*iC^ik~w?wO<Jw{$utnvib*A<L&_bC-|jeZ6#GL@ zlLa*Ha<-CRR0Ipoo$8$WybAr3P6cf?{QS7Q8kZx^CfcbnUDQ`Z<kc?T@4vTOT;e>0 zZC5Mmq7D~s`Hv6X4uu0DaVxftOGxz!jcMTL%<@!V+q0IAeLqgGOspRTg;>m4k~XcO z?Xbu+sqq)#7LGl(m%+JSFadzYvG>aFc1aG4`Uwq9<S|DY?7IK&euSyopf@Nyh0iw2 z4$kE5`Dz*>&N!bI8Z+DTTmS;Lj%DHE;bp2+^%pj_PBepRk-<jCliT~#&%+I2sRH?; z37clwQ?`T7q_kzq=jR?cG6V3Pq;%%eg*|%b^SCv$N49U@jS;%se0YznHAb3hw$=ar zE&ZaF?Z4>UU~m@jMQnSi<_Spk?#1vreLIJ!_zvDi&zV)wYZ2<PwETU^LY=FuMrA8X zRZN>^UBi7X;6<cFGMWX-v>Jl79%A9*XNJ8;2?P_&N(3Y#V8!&?s&E%P&0|7|I!;m{ zpGW+A6|6N&>&Wr8cSldSD&G!4z$>hGnr_cw8y7@inGOjAzw}yE__hG+^d==-s#D1= zEXW_qC-jaK=uC<<5qw<{$yskq>XjSlUdA#2gG7o~FfZGVGtzHEn^(wX|2jUryvspH z@h;GK|KlKT{$Z8!P%so~yRIJ_k?9?1iEdYv9rDbLn0~bub@T`GV7cr91$_4*AL8sU zQGZRW>!4K{TWZu!2Zc*FX9h|V{fgdBQF>(1@23aWJ}3c4C5<_|FRHG)<qm@mWAD>y z%xL~-nx@NryT6n7{Q8VT*NM-HDktRol%u{s#C+K<3uy|G>!~XhNO3Ig>TXSW2M1%2 zP&w2=fT@a`Q?i=d;61@;M~*T(&LX+YfD?o|!0Z?vvwI@f6SlRN|68r$ve%e)o@MtY zy<C?w;(7Op$G`A>5_;V?Rj*$&Gc|nd@tUGL=iZdHIEhVT@?>q48Fej%9uu_ARfZx- zcl5q)8hx#%s8y||K7F+#cRBEVuDC{$;;2luMuqLa^;$_r$=dK#(?PEP@v*;wu16^Q zt4{L>VxZsYn2$8}!yTds+2(a71?79vS>JChA_tEHawgU1vF}DNf5bbu%~D-v1uCF& zcyGSM_Q*3O8*gOq8)w?E?4UF-peYQ<Qz76&#*oNzxco)7ig?-jEhO0uD}CpYJ?DWw znL*5nRj%&=4<iiK<zqLemUn%Lp_T*X;9<fu(3_iC94og`Dv%}V$a2DmN5rQn)m5_K zKjWHg{Js{fLF$Ke!{I*h#s6-qwj5sycAtW;SAcEaBMZTi{WQS_0$^Vg>^i<$*0>Z} zcOHy`9P4<akjr96ZZ%T)8h9zbwHtEt1ZJ<J7da^I1YE2^_gVSu%uFNB!5h|T!sK2Z zZVX9mv$`id0*c9o>kVD_&CF`!OW6=RS}M5K64r*KTgx%Qnp7M@M!DFHc)MEsRU#*@ z5x=5;zo0RI9(CY&L-n*nc?sD7d}*HaM`s76cnVQD1h_)DY(8Roy>1c#;}8laN?@oV zHnR4vf0)p3fX8lEzxFk}Fr{1Fm50<rhrh}AsF8}p*!Z9HzjqrdmyL9`<AlW-L;pW< zj4JLvQ3qZLE0#v<&f^Ox{G4_PQ}ea9Sntnc#AEtXZpa6E90apu8R2AlndPldo+CB6 zX2=5}Z}yrN)t}QXI<OtHrg{W(Ph^(`txA|dC62040B&~^af?>EqrLg8okHwWUpvUT zEW^>>uj7i9w%7{AobbgoyIEW$l()LeWZ`va@uT#~hJ4{5^73=+IWWXo8Y96ds(oZ| zt|7V=C3xVxX&Dsw%a{bt1LU^o5Y=vCVX`H(VXSzz$cXbeTlXu7i@=Z-(g3;*{z2vk z|51Wes95UCcaW2hFR(?4EnydV$9{GS?%jj4X!#~CvQW~8L+^2+X2xh!<Z&SY!ZGv9 zbSnrvQE>xIXe>&CF-VYuC-G&A#a3B0xbOtLSV0Cs!*epXiR}0!EAT@wGmGkrVLr9K zUeVr3ak-DOz_eA!um$cG8HHG&CKMn{%H|~k>33(>W&y#b<eZ0^+JtJ?JUX!H>O)KX zUV;WDG??%5%2x-;yaQ~#c8Mq}%kcwx{3^AZchWasi|in%4F;SVRD@DJmX4f2RvbOb z)vat*-o`98ZRU`y9d_(KPow$~9{>3HaRra2D{Y7W&_J5jYf;}W@OOf9#0A0e5wKrE zkTI@umf=4(;Q@;m%mAtaKIdb#ZMQ*>*0;9{-$6E?E2Iq1^HxgMD3<k0cqGow%j5a- z;QJr|JlMqAwgA6G3`oXgrlvyCL|)My_g_^&o{%-S9vtr1XOG91zy0D1T8y0ezrLyP z-OCO{qf>E}DR;vl;X>c<c0mKFE02ra?>t5F>9jk!oBVo3`b7#Ap*cCQfCV`<2^+$m z_s7eol%8JJQZhM({=w^?x2ccptF4n)*&mV%{Ti1%Mar~h49(g$tuU+2wu835d_M{h z_aBeaq<=|okeQ~tZsO3cN<cF8gI_5I*V-_^VV!rd_J<2AXV+OkkL^CSTn=qxxr!JA zdV>$Z-W#2)pv7_aW-+J1Wq9?p#SJ!&D=CUl+2U3Q6WYc0mkOa(Okf}Bus_H7D&#PT zf1kx!jIe5FcK_40WD!y4jyLlFal5m{1{O|g#IZQ~%zbxG7~d=+|FvNh)`dAz;O*j7 zfC75GOn6K=&~XGT8gAjK4d5$=!2&e#HP7!($*o1g44_>yX3HSGPbeT+8owyw+oRON zMhcrDE3xx@Fw{c>DWaA<>Yp_H*0wHm9<5P{$Nm{MS&Aw4;Vzd_{-f=f`;vs_@PZU# z8tk%Hxb$NmdW<A)ww<Vs(B|1zzm6COtJqkrf#{CnMiMDx!M7a<?0rKN#Z%4Fj?N>x z3E0I~V`aBU=oCQXTO&6tFQ5faW?*8g`u})Jnu9EJ7~qKE7l^aIS?S*cv?A!soz&pA z;a!;;Q+r`Wh0pshqJ6|p(vCp-Z7c0xi1A(YDP4ncna2>-Qw<pZ<(;Lnuja!T{18ru z%W&%rfjEgmNk;DdXdIbax{MHF%ATwPqOU|_ZRLP_<}IAuE;BCqfUR$YK>0VKOibf~ zk$)VIkHYzc<oO|OgxvEBsJd@LNjv`9rho0cqn*_H+hC>7{tv)EWQ+|aNGKXSw-^r1 zbENwJ_9UiXfBnJiWmaaF82un9(ZVd^;ytT@4%j-NmVpvT;`1|ZRLYBao0>%6`o`A5 zPrCDoTVE_9WU;8;mtY-7kaC1`cV?J9hAxGsAQ_jwrhjPFg4nv*!R$z-tg@Rs!@1}u zzI|tyXZfDGWbPJ$l9ie_=DxPg4fNdX+L#ai$pI|&{C@&Pi{Kv$y%?>HES<<_@SNbb zfi;F-k{$SJSgCbXRg>#l7E_>CBJcp@mSx&2ck%`y=-iK2bi`-qY^uM%fVVr*>h&y^ zzeC;+yO+jJkWth3ORX9&?d=?l>YY15?If~fDPaWHgRB@dvxURBd*VAp631$pWV^y- zh39Gfk8P&^j<@9}Smcdp8W;x3^6crO_PbJMET`bJ>7E3r|2g^@ZwijJx)8&@R;mMc zrFK98)_x0%{AByEB^6yfYQT<c?b-$w|C;KtG~;TtE6VR$#bx*M?Hjpo$FlpxSWnNQ zJYX%*yB7xQZ7l>SsU<{u{8zc;ufY)PrC1uy*1(7PzSVTnqacpwHlqyLYJJTBoJF43 zq3K!@Bq52H9<gh0H5$cENGA0zKk&Q)(Jf-a1oM${ZXntK%U@6go_#o>^R>LS<THOM zMi6C`6nV@;7vndV?Nihv{%(ES20ri@h6CY;XnsE}AQs5M2^>BUZ9BAYIn99%>=7>~ zE$;hF3_SFqbVxk`fcjPH$0uPx+93MPSRcOhieeUx2nxu7VJCowriTzqj@-4k1aj(0 zZJP0T=JgsTk0btEfAdnY7Y8{7z4EI=>Q}T^R3HmAUHnJQz`)bZQu~7UfqVDPu1DGM zz}nB_r5^!4;7Q8B+ruWC6A8~T=bDdHuJm`W;le(<%PokG#~mcdk%ECW{WknM;TZSn z_{f^$z3<YBmSo)F@a15LSKz;%_K$hN%y|Kag^}1{CcqS!{?K!$A$9+UfuSE@(cj<S zyQ~BmYLyL2Ck0N|TI=m_Gr)|O%lR5ZS%O`DpE6wJJT*5Vw;6kuyJ>iec7^BtY4*+l z*{jka`9Yl1xiO<5LaM`>*T;eAhXASPDaUm8(QGl&p@Pj7;0H~9H1c>mtGEl^-u4Cn z6Maq5L5WQGWA8^_5aq{Y*K}#@q(Bo`dZ;cIkuMpI38H8Q+x2&Vqd@REjDi4ScVrZN zb}=B^0T~)e_S<`?zUVVkuJEk6@B7mMWYtfr(a}*=RN#GGh>UDi9T17XbpOXcUxclM zNL>OfYeMcq_eyPsyF9$Y&f|iIF(r8`x(ri{IN)Nw99eetC;==*RA8Q$PJmR#F<TgC zcuNk=EfqBO<siC1!Sw#v?X2C<DEj$4tv0)K_BAqa1Lw1&8Z<87T7|p~ES-HH+k#FG z(?%fLc2haq*K8XU_N*>P=zCP_!8SUwuiJm5kC2U{L#p&*jTinZ%je=L7TTSryNaql zeCv#N=AB+kq}}8ve8OZ#KGNFDHS%hC<`_%CArRk{e`J_su|%AoPcVErxnaMWFnADb zdu4I25o;i5P;UQ&q9Ni6Yg*lgYPs90tO)H_<zGKY6?+7^N1K77-`BB<*jKzv!U+>e zmKkuNo3;p$9FMB(y4JkPpfFnewjMIUeltO&jUAC{R!S+VL+)Sw2rd+z6-zVI<~)%y z+LfVhVsW1>&Rr~~w_!-HuU$ws>p9{hb;QHjwrQI=qWE`hRN-mQJ0Kzdoj}Vzqc$&o zpNv$zXUj&u=iu7NN+Y)tWpNn0p8*bVek<adtJ%gE=EgJU51-sz@sm$qgcc}(RpA{3 z0Ex=Cf&9ZoG=uAs4q&WAUzAancYFSqsj<b(3BP6JK}Jg3ok-~&dALBTXa8Nx?Tm7Z zsTeQ3h4<ro=%ZcX#^)vu5?dV*WTqn-Sg_lXcjR$8HC{jCmo+`%UOHPpyuD<4U@#=D zjSS4K7`7dz*4rX^zVF3CHg$I+Dt>q=tW8;;KT^K#cMao{m}X)w8b|&zj<Nf&(0SOA zflK$jFdFN8@x))?8*9}2Nzi1g5d)+ALNIwnHc8N0yIIHt2NpE^u978OjVxZs@fL@u z<%I-b7yf!%vb${k#crW67rTUtZ#dcCveY<x_Uf73H)EK=5{w}{8ArNV4mjB=T1+y! zZz$|hSXYJ=wpdoEAjxLBr`P4d4Me1({jk=OMVyF5$c$BSkSE@6qh*gNT3j)zba!Of zACo8lZVDC<<j>Jec$UBW35YHb%VT}4kv*lc)!bjDUAxw^3!J+1Ay~IG!DZ0Jr#MdI zR#I1~8ddq*L;0~dZG0PcXHRvMt2p`C_u)e?f4}?<_F=N}*WiAs{|=#ksug|mQh?|& zFHjTu-omtCpW~Xqq8-}XwOhlu@1NrWCUM<-o*W^?jS*Mco;|i}iV6*_*>dQP#-uLg zY%m!q$qV61HP8(C#my2!AGVh^)*s(frZ0bxe2G0}#@B?)++a4Z0g>7PR&o#(ji7to zyF0tqV?*vo!vH+qNDRrx?d!)ao+5<H80%5Bx}Zg9HOT|9W^EuqDwY(bWfbGkh@f0p zwcw3MbL^4`0U!i}ZQowd=7Im}k>BXv*Ur^Yt!9j*+nA;6ep3FGLL@xVUMs8Qw*pzx z&s85?FA#?vd|r>2evZV3)nK|lVi8QY`@(NUO_99FSR<ep6&D*G_J6V40zrTW+dtjT zTSW~ow?03vU-;0Gf9~~!zWg`f5<Jl8OyALoPHVjDxfXiixaLGf9VhK7a_j^S6hUHF z?Up$M%X=98xO<&vXksS`JdeK#mu8a!)KdeT;8OKHDcwo;_N9{@|Ban6>TtEX8hC{7 z=b%0HG?j#Vy)72)2Y)a^auv}eHvJfINYdvys-91f?wijG%|R1RUpijS+k;p0)*7%u zSiJ?n!acd)5J!c6H|fXoVs{OglLr9$1L94(2C2^f<O3XfT?4JxuQ!u{=0Sx*hS?(C zfAR5uLH=?2tkYtbYp3Y-u<j~>Xdv#Zg46~<D&mFS?c;=6S1*J}vP?JN@8Q6@CU|sj z%0kqG>L+#C_JLqEtiu3^?SZ8M=HIuuG$3fB=maf!-ITemc?;H`n7|xd&&_9)PHTq$ zlma-D>U@M?!Dd@r2`U3j0^~RUg+j4z<(Bsuo2^BDu>3DzM!KjdzZIY7T*axrQSI$n zZ$Ce$=QqgRjB5dUhJ8R36C&icp}$h%U8Cp)=8rX7$uCY^r<<u_#mHrE0UNpzalgD2 z3Dvqlt8UEx&*<{s7!@^X!UuSNqDWO7&i!R6bmW!!-5}yMev^0^&#y6RRQyZML1&yP ziQEZyZfUV~LXzmG<&o44CB#_&z{t@MAJnveA^REhL@D?TciRZB_7Yp!oMJJv?Piua zOH`>M=)?Uz1TWKkL~O7Qj>(>ZVuFY8F$56o0*;%n)`?;V>l%X(J&li*;oXJfj!%5u zJ89OAFx#@M!{dC`Pt58T|8jux)v9@<w|UG)UXr#xNh^boWP>Tzz7tX46N1Zb!?Li1 z2h2eF@v{n}$xSzrw7IJ|lWeX_@xS`-5&Z;rJ7Azlj!Y6fC~RpjYoo>?2k3L@0u+O) zTQK(XxQJ$ZN7UNAV$qH^BugT5uru%B%Q#@zdw7eqg?(<>8Bs6#E*%}FnZ^UG(h(#h zF{EV!dn^K%*AD@DL*{oJa(!=<V@u0z`}V0^U0OLw(}cU+qB6{j?hl9=K^F`KPw3r4 z>_N`8Lw461C$i_e6S^(#06Ql?Dv(6Z?_G`*D?k;ME7~}XMC5V%>gBInrU)Lg9$SY3 z9I*nP#V4`G&4BgLnEaWeo~cpEuv)JEtEt>C!R17sSuL)gs@Npbblb*divNzM^F=1K z?hZs_ojW>dCQMN`7U|h`)Z)%wWXGITy~F@phltXTu`igoyN@lk#DhIeS>WuR-$jc? zrXI$Tz`sMaL6PAmwzfk`Y#bbfW&w-K%nPq#8AJnw(^{MRbOpb@5R|@Xz76{0=`Y!* zfzUv<$1%fi$kYe^Wx4>Hpw*@3r<()gg^JY6KBngn@Y30KykZjq3cNzyxUrOC-j8ZM zBP(dKO^*{6bn$<Z-U0_p_c@;fzsjY)Cr_r9X`n^E-(-JaTeInPX!!X#{hCt|usrwo zn()xr2lvXoaAaP7|8Yj3STsR=2fe9Q+wn9WBe|gK7SRKalik2-EKKTGI#vC8z4JZ+ z38mkDGzY!%eCybUyNA>H+c)kU??o5JgE1s|)zIXcNq2Rze2N(v|9+R_Ai)41{xFaH z#xz?zVeVDDg?=jJ_Ao)7MG)+Lfh)Gyy*`7);1Y;6pAjrIOax1;YrcmRo;iI3E3D~~ zEU3Rhfd4=YOj{`-(u1E=Yc+qFa^-98Srf?B>@m=grnOT>aZe4QuAfmMvoH#5yfofC zvD{adMq5h6A+@HgGmVtOndg3*^%R_?r{}vNi8|J0`^G#M3uZxC)c@52@E}qjd|I$* z^IdT*;DE7PP6yM!A$!GdVRJwNWN|uV8rCy`%b9l@3<J!Yx5X71Bsx(po4CRnyf{Vy zB|TV*_Lwn6;?EVJ6x99b8{p>^eTn;l$^UZvm*e!qh>rFAcVI__%b^J$$PB`Zz}#;h zvYkm-shKz=s9DE(zNAVJA$>VuB2%#E`-PadHAxJKFk?>L`9TI1Ib)O5QXJ8X_+SSW z92!Ehh~Uz2LqBxqqe!lpr-!G;p|}}uuSp~5fUayGZ`a-}6B4+ceVg2t3`Sb=u7KS0 z!D_n~Av&AkcKs@@Ur`PY;q)_fdS((*VFd(>;EMF-V$FX(5$awal1jPqANO}jKZwI; zGmt5$X8`^j;zmJNB}d>;y|0Ld=c5iY?pNSr(!cSCEm$gX*<|pfx;q9;Urs)r=zlOa z7?9yHYxsSD2P!Gt=6|N5s+_%ayOqgOtCFnOT~@9CtF&R3=nwqYvK{?%NMHUFz=e4q z1`HmoQOilgS2Z<h6#%AQDX^_IHA*eFwcZP=x`p$K@HQ(A=8uQ@v40&cXdz}b>rKNs zrVX#a6O~3g0+VOmHrkOhTi=&-I|1sNq1yUSWSBY$M@g-sx(o#6(L{W(DzBJZ#-fLe z((H;hb9-#QPe|YtJ{O2vj>7A!-NF7<%(%ptI@Eylxm5c-$5ymis8uW6HJ?H2UT?dh zsocZac0RBTiZF-X#Po3U#&ku#287@EA4ME>#GwD7>@9=hYTIn#?xulm++9PE1b6o! z2_BrF!QI^&*B}oGPS5}Wg1bwC2M<or;1=9DoA=C_@63Evr{4KVHBeM>?|ZLnT}z$} z05<QLkmt*vi1?N&dqO&O0K3CNc0>QK!wQ_;PSSh{aI*iIz)dSJYJ;4TI2-bd&NX{x zj%$74vFR+!_Cvujz$MTwhD@lU{QbMv1g-01!`6EO_39(tu&NMr^#qU8Ju03Bb=PB! z;_~^}0twvdl%L-#6^(EIktDfZm$ycI3Vs_jQ1Q|D@2@39wR`HkCj~*=)bv(31f*gf zivD>a>KDEXScNlrnFFdmlRfymxc(EwG7o}jOT%aE5nrX_#qh={JoY-xk{I3ib>Yny z(==f9)JYm70nvnR!`{3`<q6gg%`zi1d?QmCQ-RBuU$eAYg3lz}h`l80;751K;#LhB z*4i7W>~^fn%@XE@fj%A+?RiXn4lON50n8)a4plvS7a%clo0qn#d&Q_+lMq0-v1WG5 zvgh6mwVDRxiXe`@2PZnGPjl^b6WrXP!s%Uhp%I{*-{7&W@X^)ap4Fb$4b(^ex@evr z+GblDEB~CHgp#ivF13V7Qyc8Sz!P6aKr!-k8QIzF^J`w)H@yV)p#xMt+qA0$a+q+| zYO0@23CFp_$|*>sJEV;l&9*Z0x{z=eJHRhS1R|$xDJij8ExtU>zHbE&pP_@|uskRl z-1_P6_?_2Y;S`u&16{O2D-29U^-$1tN)-z$E8&QrA6pjmPrF?PXr-a!-hTD1yrpzE zLUCQefHbhMt8KTWR8>ze*g?>Mr${semo)9*?|zL+OtWB$PnLUqDqRc_E1uIv0<APz zuT~gfXIrZo6~kYl+gd?qZ>70$1+d-SwwySc(90dr6UftUWS*c;FfI&zZf;}KD=B74 zIVIKoaVpwfp-3T4vOB~sraUwhhu>}%vHWn+@N6@d(zHiOA|ETlspEO1e2R=z^oh<I ziIB%WqUEq131A<H4nty1FAtZHGY6)|#IGK(GwLS()96z9FQW^_7m0;`8D046zr8mD zjya);YS#b0h5z$X7LX<&sW)bx{{0D67$i660Zd>oHVIk#E;!alv(E%J#Y9N+eWKgc z?$%ymG+8c@=4lLJyACqbdu8HaPA&#kfh*XuBd*c;a$W>{j8VfTSdB{4)AJm2-?OCS z^yu1wzx*mVd*Z54myinKel&>7OT3t*C{wZ<9yk)k-y4dCa_Iic4(cG^{!;UVM-6x? zS*eTFbnY(jw<}9Hwo$=Np5HpfsavR;JaSy_?amsta^+a5(SHTMrFj(u2VNxl;QgZ! z*?8M2&e`OxK6Lhn*9cQC)|Zs4uuxnLx-xpoJ+nb|h>BnKSW4(mSj_nK2N2=1X;VmF z-0H@_`tc{q&Q!4f_>xWN(tCvX5?aO2I1Hn7M331UeZb4$4=Hxh_#8T5B>~8RuSBS> z+7Jsn!82RZ_WqO!i41<Hvokl%K41<Z3cX#O>>(uIbV`&871vLvUaH#K=pm!nF-vi^ zSO>@;D~@zf{^pb%EFsXqkQgI?dQlO)f3l*gNqM0m=)7pv(|H#&#!9DD&_#bHI~yZG zKE(O+P}s49kz#Wj)c>J^n3y=^t5;fHveQP1X6dV&-@s{mC$O#d&VdU1oIi3aR$5OF zMXUXc7z`)FkOd4H1z(DK_WrK^(l#PI4EXg+6C!_lO{0GTI~w;+bY2TN$abIB)u}dv zySTcBmF9%5Z}=szP@B?BlAa1?oz5CPnCmxH?RPw!vvVHS+0LMiCHb>5G2z_QC`oxK zD%}lpD}>>Ho+$;pV~ZSvMubWkQL@Bglr_Tn?Z0UeVi0FV&*AHy3sUy9-PD6gljC4? zHk|XLr55c*l3hyBS7geY)ZMG67U)jz_<Oylae=2m7Oy`ED`_g+HKM}R&o0UMGZ8wg z|M3&MKb$2DJU;DrCqq(l$?MLvTV?zF>t{no4{sYqe!C2@=84pqFZ-VFM!jzM%|auY z=Att#-8bl4sAxNVQr%xgZIKPfN`h1EskM#}bfyJ{kM@}=d;vKmH<lcemLi}a)&Oi9 zHgsk1K39hEwP7#t>LF`<yW*z(M5+5i-+4b0f@TMi3Yv@l1H$~r!!uS-unjB%#XCUi z;jn*LDg|v`s(D|*UW$OKUB-&kiOAa5iH?ot<^@Sy*Sk5K^cMcvvZef)kfw9L6`?vN z*OErV7cae7D_H#q%LLgi-OxO_!*mZ-qYf0%I8XYDI3vGquFMGi)G&2s;;;bpX<~+7 zYClMqNRXYRE2WCNU~KM3<tNPl;d%N)St&ag`}p1u`Cre+a}O$1RSd(;HfSnTdg}D% zgoY1=l?CJL+-NlJ-vl|K-FYGN{r(uUMl73m{F+|voz{xV&}Uo;d|HWaB{vJYMaIed z-K=XfA!DIJ+<>(Znoo+}FDD<X6@NsLWflvB)0sc^9M`n0inLHteqbQso?NM&OK_-^ zl>W`56Nf!5S2=93{_1x4VokKL$=zph&7Xgv;9d3)hWU+lJs*AHOy!6xaat*S3=Z;G zjvfS03?WfITq_9~g?q)?64yWZ_}P#`k+f7G$`#P4sCMLTdf7!+T;nb=^FZ90`8moh zNwTqv^Ba2*Z?fp)-Kh-P%0wHg^8kGctbZ>_MGO}~p4$rO1whgfScFc`E-hc`LQMT{ zF9^x-6O#NBPh%@H+zOM%$R6>uO#K14i|Nw5-YAID?Qla-w~uN%aKUFk|9tV}jNDX- zA6Q#yZy#Kug81WPq`dd(vaocq`@De(9?V}Ysv8b^1{T^KYVV)XjWd0A)nDH@{wH2& zP|2qAtkG?bPUH250)<@p`^7fj&g;ZKu=iZ<&W47D5-PgXrrjjt2CCRXgO}#ZFkTl7 z)81HI$13Vr^dX#!4HAHOlvy@!HoN$sN>53n`?%5-;tY)crW^f<jq6yfU)Wb)Uz7$u z20%a`4}%r?hc8J|fQbJ8JxsH!OjC!>9YqXT1ugjCJ$4@bRcqN=Jx?>)2#qLgn19bq zGfmPUTv;Cmsj0G6^{ur)_Od(G*^-8ICf+E35*V4lpn!awdf}~{`G4T(Tak0n8VKl} zYq93?6Os93w5DNwvRS{=Fw|`NuQ&-93d$hYNzun+OG!X4Fu&Q(Rn1ryGxif_c_?Ed z^1|lR^lK&w&yF-NtCLHPGRI`BGxV>6>k{SzC@k5+NHyA7pGN|7*NO#Gzq_f)=qUyv z&{v3uI4|<P7Fqio5G57muF2w*xt$AOq`Q%Y^s};RW|SBK2cK#LW-PMsZLto`H9#lw z3tGMXUyfpwCrW_(UC>sFI5DUbCX2I1ca<09Z_%ia1)lxO+gyOVpQk_#W{}dw18v+w ztpI}k_sqbFjm9r6W5=B$feKe){lzA3p^R9LFAFQx>4^@C=y;z&<a_2>7D-AHI$|Bv zRE0%#W8)*()Q{Kq9O-s|#;^G6SEBo83G&CIe>{42rf*biMM7rSB|6JI4iX$xkYWQ! zCV02_>ltY|#29n_xcIJ~2!wGPe;Nu>x!8}WFd%l@cE>8)IT)+4Wdt8{p0lXW;6dMY z1c+7(o2`ctYr(GKB`78FZMv$SSnOxN_5jrJO7DHQk)pIO5b&IPE(lB<yW@^iCcubG zBH)yR(A3Fx(|xYfKl7)TQ(pD8)#fQOjl_lf=x0%g)-6!z5ayd5KsPLJr6d*Ua~1!> zW=F3t!mZWRAMoDr0KmK1sJ`#=kC;#8+asK7AdBT)!TBGrRH?M|{;Jn)+mUisi8L>} z-oW=OM?(qed0zD4pn(Q2t}bKP+i^@SjncGq;#kkD9{a=}Xy40z*k+T*{PH;#5Q)OY z@t8IiHyZ_y=tTyrIL$dG?|uVPP%x^55Qm}j5A#&Ng#wV-%OxT~%em>F_>BCv;I~h1 zfBZ1P2ycD72la)td{DeebLE=|)%$)zkk{rg67K}J%9ALP^fU^e@jW2w$vYeT#LNj) zb3eDWS@;1MPU_c7W&isHenZ&bw&tTRv@I1&m5%Ow+ocwbz5EDm;jidIaqqdd#Wa4H z{o7A2Krw^SKRy5Lio(%uE^h79UU#AOgP!nA@CN|g1h18ptgGiNGwBCf^UtczZN@iT zLE$wi6HL}S%16Qf!9amWq%*2Em+HZ}4TGr|fD(ced7f9|$ClT5o#vY(EmEdmFMugI zhxO(0B6T)ar#S^REnlJ0ms4`eL6|(w$CXET8Lsg&rk)x2Px<Xw0D8>=#mGQoN*_X6 z4l8f}JGel&<nPaR|M6e2)XCxFS;b27bO@qM1r$ldyqk#yBuRRS80zfI7LjsA{j?jK zFSisjZtg>uNIW#4T3y^a_vU3}Z$Q<mLH5YNOxq!?oMWw={mDVfJ0rAn$GC)%##NVB zh!#*oDpzXr*L=>ocJDW8ecaO6?S4Clmna~tXYx5e49j#7q<Mb18j*3likhLSrbge{ zesMsaiGKe80?BvAJL!0M)Pwq;);~1-!Iou5)kAFP>3S68UEL-<;c$W1keE=E9lky# z?2@WSsg&@k4m_*e<j}j+<g1Rydq;d!iTbYEy8D}RbdU>_7T$~-kUvR%J1kb|aB-d= zFNRm{6)Fj5ueRU87!Z@EQM*t9B-f}r0ey{?%J4tVfrkn@|M-90@fPgR(GsG4t9_w) z<U}$8Rt*k-f;#R_6u@P`;UiSiC;GAyD!9WUzwPop5?At84Lvx{&C#soPJEKpHBeA1 zE*nH+WEs0N*8kzgNk3oCC<u=4h_`O8e|fabK6vU+W$C%(?O2mchz#OW5UcvlabY9u zN=Q>XVyf2h0(3l_g>AE8Z}fClan~cLd|-at{15~h#O`Gw1eBC&ToU=;uhsvLI{8n~ z{+}3LqJ~hX)ht&Y_Z9$p@ct+X3@|I)xC;DxXm_rr2+<a*{&|Sd3F$dWKVXBQWu2D3 z+HG}3S<#UZY%dYOm>K8N|J5OWGy9F>ohXNej`5ie(n@ORU)X0j=qG4OFbgq?o$(7T zeiF0g2c%{kieyw{-hJQ#*Wu*JTK~I?_LmGlyE?lpJ}!X5)Fa}8<AyAVx7)(cNQ{L6 zUs-D=XCBqhxe>!%mc04=Af64dl;INsn%D=~MSxI%xX>-0XDo|^8?=ZKk1m+k6JrJ1 z$q8NHvb=xuPRc6u8dme#Q?ULuN!&`5Vm@<j6X4FXTWZ!sc!a78U>(-jFYqOnXcd0_ z)RmHubJy|vAWniT>ooOc%GZ!{@-AM7GIgntvW!Zqr3cve9ZF0=Y@K+;(V^MBTxmhR zHuN033V=(A4dHCLT8jyxKsx`bb?z>&{ks0Or&zG7or(h#v|}eP_p00T=28F^ZWXXj zzT6o>9S|8D94sN27MH?~0~#I}z;#7*=0o+)9fBuV-wF}!x?5sAv3F-j%hVL>>MEjP z?;P7SB|h^nx#1r+=Bpx#+}@gHZu4C26lJ67e0<Dyxr|SD$6y9=cwfWJPR7$4<VQYz zYZ@&wUG{2Ur>hJ<iFyO}6AFKOuKNP#$(hpovDg{aP@h$=ws?SDbA#$mv&VhLfH7bx zhffLkxFqfWkZk||lk$I4aR2eC(@O#`mvMZ^@cTDLg}U@sGGkF3R9TO(oPnu!E*XX( zCNV~*9~}TAhz}y7T!Uq3YH6+Yw}%v8HmMz!bp-(lE;1Ejjm2_|vn<M9!-lgMX+cv} z6#RQ;8D*m;JbAwlg5$9QWP$2gE|asHM2os;jdpjoitVJngP@@uJH&QuafK&rOF~MY zDqCB`(^sUjaE_N)G@IN&*aG!S*(Xz6oSags%2_q7qptFhK4ZHXfU#GMZN1|%Gb>zg z^IXP1CZp|B%HUf+I6tCcE)5ymS?Q97sM2xtwL9mBJX62M6HBu8kTwxLEK<oI+OnM~ zC*(9v*N1<v%2rGSm<DR6rFGlZQKl}*dPz&khfkGy*4AGm`+zq2bO8_^sDPPz5^d<L zGnPJA2;xKmB;xc2RI)<Cpyuu8-yGpq%2J*zeINc@2|eNweB^j;lurbGy^~CQ)a$Vv zaBB}9<79Ob06C52NE$aA^h!E#A#)5JyI<V5o{pfuNgVc1gQPmIw{G2;8*m}l$0{`v z<i5op(Y=TtvjfCL2#F#<aP&R^@K*wI*9=ty^%u3qEF?7}SuHswZ(;@<sj{dm2uv;k z%F5*=OL-)4LWX-np743<A_a`~izh?_3-NVa<5wPm)dzqH;20?$`+NhKT4S2{S390K z=pWI9oR^~b9)Ncs4ab~U_P;Q+|L?=|O(p0L`yH-ZCSCt`o-d&^X7fgENm+{0%vt|j z1;U|Ry!I7_ZBTi6IaV;L&%J=5L6nP%=u2!$$)a>JebH_GS=RGo(yYq#`H&Z$^!hT# zN)W^+WyaL0<YS}e0gRRbv>0lqU%&F}%dwP6kY@pmac?g4YhJGq=_21iPl!b^483#J zIlr)+$l)q6IWasomPd!BkYOcPo_PPfd*gD=${e%xpk?L2z9oTw1MiB3$jqXUu2kB$ zG0TCoy|&g(<aF4zxV#*zVC!3jD^w7KH)zrUBoR@9<?vYOpv37mZ%1HoFkbg_vy{)D z*)k8zc6AGL>5F?gT}=Z?`I{klPDx|5rUGXD2{cX#2(sIIfZXA?g0x?6W;_EHI$75w zj?KHAaf(Mn&9M5{{31Jw^29A*BoycuOv45T1Dwphs%laHXyZb<!c)pRd9(Z;sxH|= zE@dcavBi^}t@XGYRPaVVVLeefmVy{8(H%Gy1fp3Gyxp%sB6Bt3<X0@rVdHMk<Oi7B zz|adf?}9_OF0(ek2<QknR2+@hdoMY5rZbTAUKc0hyx6++pQKWJ70qz_62#$rO~O8M zIcbiL3VOL+VV>8wt^@j2W+(`%kL@qf`qKI0NkirgrO_WWB1%#YY_0s|=;!}u@Y75B zN*7S9smE6X095~1GXMYerJhs}Bhj5!fdsvo46%TeYUnO33rFkO_udacL_MR|vq=zs z^2+TUvm|@4g`&T$o3GlsM{Zd;(VqzH9-j@S@-{1+38i0^h2$nY1wB?AHcq6}(9KlH z?15}n%2hTPr2-ozg*dK6PlHkzY-vv!Yk@z};vv&=ao~J6%c)bQr4})?BV}%mJn@0Z ztiY0njvF5(2G`wz5rc@^&e}ugfJnz~Gl!r#GzjM6tSF{UX(NKNUwUEO_mJP;Mnf$M z!1L`yX#sY2Y~`YNvFD$(r;Ue_zd?8u6;y~pvxyahp+oN?uyiS+$D+o5Z~n|cR+ZIB zz;c5!NmKqQV5Z5fR1v#=^^yLr&#fDHqvmpc+3!!J3z>igUd&kvI2nrr|LJF(42OL) zvhh@`#`3wjU5N9&8FbKbx@|c;T`E>^l|MLOpPJh3WN6SP{&2}RvVCx>Zr|1W+BuQR z>w9FPq_MHLcawb00?=B2wmq(H^;+j&Jj<z+g05ZX#ep!?PM#8PZd*g%@&^#0gJR97 z4w7>L0W1o;%&s}+3OB%5dPINh+>dvYe-7%uUM^C}25Ah4;UPZ81?N^0uFHfF+jRNB zY(4g-3DeRJLO+*f_X<8~`Sl%8qob*a`mln;A;BUR0$bZ80-J-S_=$M~?PwrHeK9y0 zqv6ROD=mQaFT-uKZsjE|_YMpe>^}5~&>90<+n-k@YA=wBfk85VIK=8j;4(ncCmyEU zDyDLPL!r|AO`~Zdzdj<Zq*3_udi)RWrXuB_BBDo0glQ-h;B*Qo`Sy+Qk<qVrX1-xG z_?HcCxi0iMO!Tk26j1F$3PI3m^i(VQDu7s8r1>%(*au5(RXw&rB8+h+S95KNrYAH# z`=}FTkj)7s7U;K3EY!twcaCU+X5QJlJ@ozAcJc@;N@?X0-R-G5^yc#cNuWFL)w|Zw z-UmOmJLKpNrl2{;V0u<cq}!|y<xACxi5A_uZ7yS96y$#X_-Tb!tME(arAfS8$afYC zjh@Ir$6E}_+w6$yLA?#5g!sVrJAM(KQ%0}H_4u)TUu+h=+E*Vr)0B>H{hXQ>pZzQ! z-ICKwH-ILYmVPV!5p<90yz?ccbN$@-^6<Ue@CcE$`+}u8d^_<#TSIH5^8x7@GIv*! zSetLIdeI062_{Fza9;bU=aK9vl_)ZWd}>^vg2H8&71vrT7>TEU#O(X;f7-TZtJICD zn_0Miu;+3^EGdfims5-af&%VuqI4z?25qXkw=TPmPGh{PV-b=vzBs4B*0#6VlhhV9 zaKmh3hJ1M6Q2hGrxal*Qik}Yn=lK0*-ZeiUbdwO@Hm9kX7{OPJ((qrex1??Q#7LyD zkau<T^<$N@gmX<j<kXa#pH;IJ$}p(*H}$s<rcwz9P%x@w;*8}itP=?>l<}z%FU)La z;f6w6+;&(HauqYIyXECyyT+@zaFL|4GH3j<5HI%@8yq{vA`<9L2Wopo!XE&cSQNpm z8!5|+7m_>eZH?P`F~=(*m*|K@V;1ncW&tj&(ASPxZoV~G0RT2<FcLWojHNbZ+bUM< z`I+pM>00g_^QT*`l5deANR;YG-}F4AUHRhE9`hD6t!8kci>V-$5!61OTAVFTDGf~@ z92E64YOKv$pDb1ukTi&pYFdAhD19R1aiydy<6i_yFWooZwtAnYH{Qy)!k;rSEkWKL zC|c#ly#Q5)g=+qK`6O!icQ4ylnk!$69uUJGX%L&-bqZSg?&pg_Zv8~%K7Izxxww97 z?V)M~Nm-#+SAZS6gY9kW#o;eh#+NUh_s!@5M`X{yy|1&f2SfP9prmg;b^tjTU8o25 zd|e&W#`KmU8#QiTPlt7fN!W$rsH26HF>c0q_6yy3n;f>rFKwHZ>~W?X!NQGSh*Z6g zA1S0-VlTF{J^8AIEMTy)_sC@)_=*<X!}UDiqwyf6VA0SjC~O-wPIyu0BA$QDbS!K; zu*+DV!-->JRZh#oSED7%>!5C?>hC=^@|_H#thpJDlr*i|B+gyPfX(mvM~aXajD%}L z3Y;LAMW(9jaaQcazTq0|4!vpoQd9&-6>Wx9i-&?)En;Rzw@%T<5{yZM>QO?(-F6mr z7fb&<7*=3g?^u%+Hw228l+@O?`^AruX2CiDts{8V8j(co?Ty3(!U^#5SIoo!Q$`c? zp1VIg{LvB<X0fO<<Bc@hGl0+NT(A!lMUkNpd_W)Rkoagy`t^kY^5r3G;u2xP#`P9< zcTx5s0Rq#s7`3c6h}U5%^(cGk(hfYVsj0Qr2_V$g=Vkp%qa7<xIZ9V|0lA{<811Mb zPH$`H%bxM=GjEY^9e);m#P?rK1>!j1WAW}$wKHNB2->fvx^rro0^Sg@;H1oaG0e{W zgscw^1}$hQui~=o7wkPa*|Dh~(CX@VIo=I>9e3??!xR594*#ffDt{Yzv3}9rl2IoG z)S_@+H+sBAuzP*B-oxIyjKrn;p3cZGC@#n^c7LW0c&9oncJ>n80hQ99_wC^e1;R`Q z+;m+&ncA8BZYvn5WV=R5JH7ClYDc^>Wku4u1`WjgJ9|E0`gj4X|MQ>VrlK*Ua%QAV z3=yw)1kQ4;^`wMlhts>~R>z9U@G?**U$aZG$-hK9|K9nw`h#|7J;&YsI$D)Pk|XUV zrISRGt@}-A5o~@uD*6~>mA;+gHPO=l(E=!sg&LC#;X34z6RPLn-BhQt6c?9tRiR;m z%3caX6@GBWlJi2+0@zzoR6wAQII&QWL7Y(P9g5j3_sX}^mDyE%0SzA*FJayG#8>9b zav|_;suIKOzQ=e(`mPONB+NDNu+*{ha2wf)j9aQ+<@H_V_BN@{FecgwhOb#$M@x65 zue)PW2<d+C|5UflxdPGm+Hq=ayz^e<w8pERuM1g!G_C@S&~%x1wPimrtvx=FnaMHz zw5yMdJoV2_9C$uKb~Io24&mtbwpP#nxQE@1n1+1mNaCuWokk)!m}`m4M7-OoJ9o?u z@1Xx<j#!0Ch(8SH=049p%_Zg5DRyTkU7C(RS6%6Y*Hi2ZkN|TY=d(K97cl-M9w#G| zZilI#^Q0@)H%$G#X@=XQs{m#9y>esxHB5$#r>`@7i)`NlH-~N^rLuVF0M99($XCjp zA|shiz>6EUl4y_HN{7R=i#y62@hTXxUo%VgUg}CYcJ82SAUX-My+%@;hQfVgVoSoj z)zqWLev{LcO2)*LiPA=;hPsd-^p;NiaTyegOOnS&g}p>rCr~M_7<HF#eHkrKQvo$g zV@ta?4#c7mh@@7^`dvmS1x7>-^y$c_^41oFny2xl$9<T0o7k*f^w^)Joo+I=s;goc zNmO8KdWG<v7aG&in*L$Bw&b~tIm{?(+<)ShxWC*H_)35y{gj3hjo)FhxGAfI^#yV$ z9orHSCgR7D<WGJylNML364taz4)fMI=;<ZbKPB%7-vUY%<u*VVfDt9h!`K0AbU7@( z<GEwS>aJS1hX8B&Q&7nv^S^&X3n&qKT@lwfPwQI3nZlj$Oc>yP?t95}5{%u7iU!RA z_dc=I;$kbuvd8h2&}BwDS*tffaG^be;%}ZSW=gDB6u+^J+>zt<e+RXcQ^&Y9n$%d0 zr9#clun?aJ8J)B)sc7h|E=X2N-SeyWpZh6emnduGwKpplf0OhKST&YE{;7;J^gf7w z3FVyy*+dQZ3WpCU11wepHY{x5weo)++T*-Ci9_v)B>d1oy?K$9FnOt8yEhBpvDP~4 z-w77)xO#@x8$hhW=7+|}{PNYUYzWG7lL7R(N{&KGxn7Abd5~x}=mPeLdz5rAcK)ro z1P$0vOJ2j39E*Bhyxqc^Uky=qhlJy+QU>v2#+v#AX$Rf9!|TrI2iH`T+fb6NUvEjd ze|;M|2$%WZi;v)|yBEz9S^p6*JvAL!+fo)mL(wNqlMo1Rb_TRL>66rb!|m5~8eN!9 zA0;+1pqs_tN@+zaQRbtBTB($nL%?h)>SKv`HqR-x84~0eUqK=;EAvD$YkibxIGBEd z;g_5N6h)zg@EL2>B9;A$pcqV=!Ua~u8ym+OJsICSado^HjqL7oRir`~xOq+ssqshE zI6MKtY|sV6!TbH3p#Lw|$W-P$E)~JCMLOlV`}y`n9r|J8Iv=ht74tsxCB8$b6nY8( zw9{vlx(5<hM4Jk6KxSmd_Y7M?;7&TZxL5nU>NfZ*>qH|<@#lAdwjG{fm}=XH03!kF z!)ydy2~}L&d8U1Jz{n{kIUf^XD`=9*;$El&hW&qTzP<;fj^zMyCV%$IDZV@~#lS;1 zDfOF9m6X8akCv)(I6eb{!(>~Qzmxj~eI*36p2ce;{y%`wZ-O*la@bzPhmljL_fQEq zfsm1r`+xrY0Z28*>uj~bFK{2|I-gHIyixs7314Lt3vEePagA7igzsE`u%IX{`~Lf$ zzPLgF#d1zkU+kCyLx36epiJv0Z+VxDl9;8h1s$*n30X2j$}~)ELoBa`H;lmJhnV%j z@UO2K*}KiVt3JfJF;EYu@##$19j9X)>tZ^Qw>pvE9sdPzh6E?v1h@Ym|Ki&EzKqAE zSgNM2JpV0+W3pI*yI*2{KqG|>Vsr7ze7qtwgj$_$;lMhN4dUJxPaU!3U<+y!k>X#S zx8#D`vk=vQwqQN(!-tWh;*S)fz83^>fn^~ME-o0Mvu`dAe*lWOanYg{`6UH8+29w@ zR3L&C<+qA?>~>t=Uj-7S5lktYW80BX=p(H4bz1=v)uSG4rD^flM-*%+)g7StsGt*v z$b?cNYs_$<z@twb4eYZ(N829#fU>mP@4Z<6Bl;{pnNwf+PS!87MS>=AQ~9gJvk$#1 z)>t-EAJ&Z*!`7)LpT+QWaDCuVH8P6uI9TXWI*>6S%js)Z6TVRCj_w{GE&YOP;a`AE ziUcRM$@#1hLrN>3uV(e*G7LXwg_ieH3XWcl6{ph3<Kr)NnmwF}OTyfxK0PGZb=%_? zF#7T8s3Jo6@Dq~p`%)84P0cAt>=KYTh=hg66^?))CU_HW$Ip+}V%VpR4U*uY;GM|% zCfBWSo`ue*Fz0FA@&>@oM!c8cmb}p(f{KkL#3yC)!wJXOiduIQ_&u{tu9olDirbLT zoG8_>5H?bP(5eu)PodDW%X!<1un!zv;t<4u-S{GOYcxCCt!?1!kH#l8pbPx1VO{Be zU9<ncIL(z|EyN2%8rMH7XhHO1sfQ^qIIdF?@F>S%O}I9=PC%@!6WYge3q{d^565t$ zQ-Q_V<HOtS`4-}m-4Z9WN2-l2kG|v6o4nGcV4iGfLoGo~s4+~w>I1Np26iD@Nu;vb z)B(+loUEl_j_aQs%}U@-<z#xlA6rxz)Kn02H)}c?Sz@scmBz=WdoeFX930ZVuKP!E zUrWfc#;1<^BHd=`Ac%QUZ8bBYhQzCwZPhMhnHMdQgC%)uD2*K3OoPMODUvc{q(O;F zs<N-pkY5B37FNHoQp+*751L4Juuft)66wguD72plt4DJgvCJIX`0YCCJ@U`u=E4>n z0}YR{u`@@)&;N`9>&}A$7xw^1qlN9nUW>;{1J!oAynACnUA09^ROIiKI;0pE1OJMZ zU+%pJ`a#&*jja4XD`a~!tGujv#1rB+o;PRKwb54efQp=AVJI7p``33a!=ZU#N1)GR z*Ht5i?pM}9@hQMRR+{$lWeU0LWnR{j=p9Umjp<*yA(T*g>zpT61Vy7$W>RJi8w6JG zg8jfL(0crp5n2S*5-Mx5ANa(p^*a!j41rIL(~nWMy7Kjsjw%$1=My1gP|2}oAwD<$ z1)c|x1S^#;bL;2d7WJQ8)gy{#Jt-?UIM>9sk17N&n!3XG85jEa{$3+G5$`#^Hon0l zacfpTNpB_U`%w91oBeO^NT%gUAPO}>G=Bc3NPkmjHatMt|1Yw)vS;R$0r#BPNH*#r zwf+}Oc`)KrQUzedTH@pt64Emk7lO&k$PC=MW&4JD!f$uOT;HE={?uvlU{%f(2m&&1 zmQ2km+bee2z8=OORy29QxBM)Z%B}VX2i$-(4Nxa@02&kc;X9iCUy!kG0@Z4VWBYaC zo1P<9ywt#^YP&hE*7NCinkA2K#dX1mlpEOBi~j)xzH)uZasFfL$A{<@U4W2J{P;0+ zYDy!jYQxh@GAO7q;S;@abf>EFjQG+)d<l-tz{rTl4={Hy7b7=$R~N0kNOJ7(B6_6N zIBcfQI;y*daXin^9y$k0vc^I*4}HSIzabyy5HzU8V32art7R6wqrgJ)D{IH22jc4` zxSCr8snHd~D(Ai-dO)&2$cz)#VZDR|^J*(wIDNuVkGy2YeAc+N(CW=HWr>hNZQ8N` zZXUZ?n3ybTdD{cohHi~&g`q(~k@@;h(m+p1N600K-}es{)=7ns3fvJo7Fn8q#-4-4 zgAJ$RaI27!wSu53Sz=*hKDph!xJ>J&%fdHnKvA+x4)4<IL>#p@gVq}x92c`edUZDW z0U<Z@W^UEa`;WaJ$Z@GVej{J}rT5M4A!JrOj$#X@;Ft1DS0G*5<uOj^i^)jio=85R zo$Zsdl-@1+KxiV$dXtKg`5lbE;`&h5^ho-JN*h{|p+@DtB6yRE9?7&`B=dJS?jNB= zMt1?;i5wZ~aWy0)_=0tL5FWi<9pSrzo5h5OsGjVlIW?R7x-`H6G>^`kFrEWWCd2t^ zq+*+4cvg=dNpGs`l_V2_1|Q+#N(HSISbm;b3#WIPQ^}DiC#34T=4A5F`NRj9$h4H( zcTqsz?&X?NEr4R>2ar^z|MGn*3n<s9Ih0E;RXLD;3xDaR-eF1aC7({VEkI&D1!P?H zyDt_hk%xwbS=Wq^Y8$+b+So92hM!;f{Q1~Y9j66a`NaFXq(M6wqRj%*(b{0o74JRM z(tg2=*VtU4X<%Po?n405F?dtr^FLr5n2=xQcOq_&a2v#Xe{yBn0t6%k2~USB13pjK zNW*7TQz7D5wb5n9m!H%5Os&x`E<xS!vrL}Z<RrIo0|5=)9)yg~KFC#f%h`Pa23<Hc z5p~5g&}#^;h({Uelw}&iqQijbU#I;%rd5?;6bzBnKY)So#%eaUa%q;syCF%nF)KPj zOAI*K<FAN?=rGz*-s^CrD{*A_AzwYyu%L%pd3H*5mX4v&(FGlNT%jWOpwLa18N^HL zYE7ZrhUXykj!!S;%=YA=GvC5|&ZUiO<`W#NR+l`ty3BaG&A4LlKO>yS^s&E!O~j;R z0Rfyxu#tD3g1o%F^N&edp6;j@FJ9#Fj*^S|U_7IHR-jV0UW6pR3M5?hICeZlXD(8x z`YzEYY}MN?U;zqM$)aLqHk{+J+*d4ytt5hibC8`XtDHi$@?VY4bfoHW)JB%Ky2P{s zZO2}e?WT6lLBGPKGL&cpqpUrI2zOTsQRb{S1E4S88T}%={Ow!uoep1q@qCF*o2OR7 zE6k&*@Rca}&UTSx(o~o{?H)C^PwaQqz`8%ob~i3b=+hfP&EaK3EOChR9@>S2y{)}q zDPB1#Ox3A{GU1}X`WJHXD$}NZ@Pdgys*B`VG>q}IjeUP-BqeRWfQy7WOC&>uJ~Ex^ z>BG?fo-nJ|U62<yC{Yl?!>VyUQr>T04YJI<?RyETbUD#v1Qk~ViTU3c141P(OI?9c z*dFKMB|v&tUjP|0^sa~sXR&eG<K%Y^T~8hfRi?|8e7X4dze+UM8cT>pM^eUnGEEOh zfiaC_M&I>=c4z$Q0g%8qbuouV02ICF$D`%6`dz!&&DVZ~SQ3hx?M{8QnkmnEt`KlC z!1zh*@vWdFaIp@`7ke-vmly>x<AKgL2j#qX`nA=|{mh#%@dP%E#_r~#A)rS)x{{mx z{{hN4Q8nI>?m6zKi-+xx1JEW&)2%@uDm^S-pc81_rQ>JU&S4E!2=gF6IpG<L1(esN zt(hWbTW09R6W>nj1b{xH>as9_jL+f92Me9a9w_a)JKM7*FN`mO5^)G6nKLL+P@iwk zjGD=sn1KB-JWyr_U7<~O*8uPyku+ojzk)eg7Udh}Vv5NkDF(E!H4_<MgamQqaNo>W zadp`+-f6>J9EeZsk7=jO3t}=U+a>D~&5<8&ZWQ%h71(F}F^ZRSz$a)YxcWtW&w!ry zFErHW(tAC2Cq0iDymAP(pl&pKsdn76JS0kVFfXNk?Z%dELT*O~MNyD3^al^B*w5<` z)FcMc5ZMo8aF{304%6Cn0Bw0}d%N53nl}WMhaUaS@S&Y@*Kc|<k*7Ll8=8>REWxDc z%jG~L{mpF~IZILJ+axdJj7Dk~KR2g%dxl1jWq+jSDCz6sfe#`Z!~~rdtcdLF4v_Oc zbKmE6MVbWMCOcm%E2LPma~xphj!WD?<i0!giAlW~-C?;MDci3ZkFQiSr&}aOM*ku> zBm^2wV5O{o{XJ0C)rE(Q!(&*d(kL@&Z>9p@;96us<?8K>&S%eNFy6@|SZstuR7+=f z#)jR6eWTU2`BBhlN}q%j+m7Q+3v35hV@k3!ulPOdO^P0eSXu>o>K9#*P2Z&M_)fvq z;%U<Nop@E^Rq;6L4)V=Rnk!zvS!vCACgA=Qye`29ZBXQ&E(6tc-#^5krj+|;HUOhX zN_La>#J+rXJpDTb#ty(Ajm-M4{$t8^d$ZX9o^A(ACcnrs{`Wr79M7ZQ@8@56#ow}y z5(>=g4n~6u@mF0(MHwr(x>ivz$yR_QOq_-ZU?c=Wjl4hMUj{0e-kj|KZ7Cs$SVf;! z{TK*{eI`-;Knv|-MJFLD=;TARhR1-^Rk_f!z@enpGI`^NKjRZ$6oyLIs(lQAXXTgE z*WUjD&wMq>bi8X@u>wR46X(Qoz$J;gl>x`L<n6_QfrADRcn*=leMS56*`YH7-NeMm zz-d!c6ATmclb1rTMtywj$JF0Fj4Js`5f`v;gpnb_?UJV;?q_6S-B=mlM{e*M^WIS| zJ;quTWqiU!88C52{MKZk&X+JtUewodIaN!*jym{q`8iOPh9a~A1Lf-awrj>1j|K;Y z8vF<=!Np^#)HML*<kL`tE$Ht2{7v|;X-h#~7K65tjcjO`<ouE?SioX%<27^&O{%Ao z1Ny5xEQwM1S>7+rRQ@9*a8ofcZ6$zNgXVcaN+J95LDq*+*J}jwS05^D1zRNA>5b;~ z5{wXx*?xGqxQQ+!4a)%`fCBr2h{ETy2IZw@$iq%&&Y=*~K*!Bv)IAl4aVO|(+c_zA zw4#Hm8xW3cLxbd<ZPXh4J~-j5$~ZSo>hJ{#2u@dppmdGSU}yVZ07l?th84zK(dOkU zY#%5OyL^$z;P0YQO32-pf<mC%VVTJOuzAlRG&D34iN*j<IyrP&mughBPHh^p<FOsP zNv~MkcMHs^REdeWG_AEB2gDP~!QL(gEt_LS4Knf9e|Dfq@C)2cI+E?(9PSD286&(X zb02Hx-e#=O+FDy&zNt*gYw;$OJ=1K1^1yjseeoFXJatt|9`1$fnH_coYIrd2)g(0> znd_yFAn2j}owYj%5qoNGqId(CD_)KSX3{On&6FGLxooT(cIqrY^U^4K6>~EzsNE6Z z9|WoZ(p&^nlo3EYZ6XB$F)^cSn^|I`Lks0My*jCmfO{xp<1TMKyFL3f6A1rmG4B4y z9fOqX)dgmEG<*A19%u?%^eh1s#H>|@gW5CrgqE~8-CF^z)UhwK(+@Dh_wo>#R^(FZ z>Ij%G@0V)X(II!D3x9px0LxED#NaO3zr9R(GO5uMUiCe;Ma>vx2U$-V5^0Nezkyzr zH}Ag86m&(|+1WyVL%Sj870!W1=MAsR6whYBtq*M@k$Wv)3Fwjp0`8z>ze;0<hZPI9 zbXUkpVDAk1-r`}eG#^_;TImooBw?emT(5mD>@p#vSa-Y#!?p*%wi>UFKTaKIp~=Y_ zGm@lrsX0ZKK>w;u?9?5A6*4W0M9LO|jb;*2r-}qRwb$Bshi+UqmuPz_Y2ttteCNMv z%SSh35%H5CvMBqJ`B}wYtgVoz?12z%e}kU$u3ZVp9tx_daUH7+AQ8LX=)mh!pxkz` zteb~I=`tCs>MfEGh^dIJ6G4cdUsjx-&~tgEoyD0VmDndkp?y#ECuXP^T~42XS#Wab zJnSO!)X*d`pW2!`*dcc34`=Jhm`TsrH(P$|89;Mc<vOE0iw>{0#`2;tvia7P!9Z%; z?d`WA35c?3n%$bPBCsFB0lBC4TIL70d)FWbk1;j1ks8A2m?hJAQHF$#Y1VhgK%^av zsVF3TieH#fE=TI8`xt!kngnV%k%h6d*hgGPx)M@l>W<pUUgf-wLNJjPe@qDk{4z<G z{aO|Iv9nSn=^q=MJd=6+IUu%?vAP37ZR6Zq7C)*cZPVjS+o%b}BP)1>Lg*p76v%b1 zXY$6)cs74KWa2_^>J0s?t8MR(y}C8GMzWGPHv_AXBDAd4-vU%?QiTvmqWR33BF(O! z#Hbv2s;?wh#M_*x{BI8$Aj{ULy|2T3tjZte0dEHL-#L*>VAt0B<jMr}K;MR8MzW}$ z2lIr0E1J5z{l?}wJ^fR9Xgs>qVv}ppeh)qRWg!r<M+ulziA|X(1<Eqhzr<^Sj5P^0 zww|bF-fvHLdNOokyHRedW4Q$f^4xobU*)o!JW5<0U{12Fc{Gjw2MAtY3{B+xY#nj~ z1kXq9QPbiDt1_y5er07vNueaf0vZHNUC=8u3=D#VGW8;50sohpdCa7~ueZdTGsfrk z0gk7!>7Di+VE?unYo%x5V<rm=r};A`$s<9lH-#NkVbRK<n(=D)<`(@UgM+tn<xqsO z1GIGiNr?)*MwP!SqaO-ZFH)fs;eyB-)qKCzLqjtjXaL3H^O0uZ<e)UpQFv%WkDJOw zuDaQPeE*j`>4}-?ak`G9A%XdYB)mR6aajUb9SBf?rFpk87wx)KAxK;jTnCuU^DCob zr@rjb-j??5<2g-Aboxz|XfBXmmv)KA%5FMCq3}^&`*{Kt(eqkvJ|6f{>uKE3PK-OA z#dA=xFbWC^@?aJC0SwXG&7s_Tp9Q^#eNoE1dfwghZXoq%=5=x`>$>mGTHoKvb;<Ko zJu$p7)64@*{zZiE?K0!R{l=uqanI$lf;gPaX2wZqL(t@VhR@k|pt3fqtPI@?$j(nl zOv{xy!#kuaV_Hc<`D2a9-n{CwJxM&T{@L6^noakd-(r~Lm8@)ZMw&ngu7nwZJEEhJ zq1rHrcISd|d~o9xFG3~8d|E=9vO7QAPPl^ZRLRrUjjD9V9=AcdW?&zJ8K&bl{Vg8J zU;?J$ET&_x1r~yPP2{RNCLPB0U*De<Fw*ONat#Cez;@<)IW<5lKx2RwGH65p_HQ3G zeWB;^N>?g}Nig$;=W2Ht+jd-Ao-fs<Vw`BcH?y9h?*Xsd&V<Y+u^?RZ&FsSU1_Q~` zPyY-F&Y@=aJ^e#}VUK+rrxvp&AViVFWkWtH|1%Ky0uU%_;|$5(nGjH^jI3r9aBHiE zJP{=;)R>E(pc@a{7aEuP0KM(bT(YbFFPHGYd0Q7pLR1tf*a7yhz_z?e*7ZO^B}Je= z1oe{c#We>O<qcs^1a{IojLUt078eLGkj}3xTuYX%{0iuejq^yl2!&wb{MNCMQbKQ! z&TY$ZQE}oREp!&fr12_qeCVx>gDtcHwmtrJw9ky7K{yGUj@@5^P9j7)2F}2~eY6)L zRf-uPCR<QYkfXU*`W)p-N}12a#Wmqm7G^{pj%*DP((ueSN*|N4RIo<`_Jk|Cu?NAk z&Y9<Nu3FUi7Y}|UN9_9Hcby;%Dn9+VZ`vJV#$1v3E7!4Z;O%O*4daCd;VkFI*n)HC zAGgs8)Rddg^|X;DArPd5q^uCVy5Pi*nJg>X9$NJXFK8s}28SX;_|o9+ZfF$m_3*`s z-jv(y@oHm}rAon<tUlqRR#qBplV{xsH`;>9YzZ5dsX^m}j}3j<UQ#Q~_6zNVp6o)` zJIcX%p1DfzBXzy7@-uf-WF-!(;PLsIubB7e+Q?&4ScpiH5Lptw$|=ImeXat>v!Q*^ zsfBh^VXeS=Jy0Wq650A;%TeMC{D@LG86#<K--gcMv70P>weYhj?(b@PDXHE5%s0Z> z;grJl>p=A%3AY|#t}*$UKKkQz;$c*)n2D4u-Li`U&wQOd<LQUaKWW^Se|xZ(WAMqh z2+>E!dqYRUWJxoozb&j3W;oz+Fbgyi0S2~&f6}Add_C3yr;IYAc!a=%^|@75&&?tu zXh@Knq_|0VS2?(BVSkUg!n!<|Y*^s@2eJNXraR8tsVtIf0lV$~XcqN~J|@)8!2!=I z5X}~MU%atV2A}=+uknd(Ea*fmII8hseK>{d`so7B&m7v$wSt_Ce0IK|1wFkVe`Gke zzu2<`JQtAZ-5HOguT<GeI4x@VvL|>!V&#GLe*y7&g-C<>5Ye2%8=_#J#iJ*er}ydR zz>u3irI=sio$ueZA8TSd)jYP-iaAF0Ny8|VSnyZX-$F5mkU*rK!>8~}Zm!R^*}m66 z@E^TBYblP)^G5j@DIw|;|L_F*(e=90nyC_lcPq9vJ>mNqvRy~xJN;a!J$4O1tz5U8 zqpG{1@~<zzyn7c1tmluhJr>nLIX+0&lrt^OAOC&1c@VQ~&<pi!d{l8MYiKeIa<Uxz z56|sQ4)6+IW0T=HKHHgu?BgO<Ig>@mfuRjKASyDl6WAL`N)%`Tg%<Bv)@GBFv(Q}; z;%KaMFm#Uf&SdCW`-9#TItI=xP}%_Q43;9_7eg2sgYNwNez3;Ve2P;07MsC)o2R8( ziEyyUFqofd^yZEN72Ym~WwKc3|9lIo$*zz9d=3a9e$>uIDJe=1=XZATasNjPK(k@% z&4;?yF&{p<R-f~rx!PD07zjl{rJZ>ngz51$Lt>?=X3Ll-waWWc%Q-*)mSWxcYZ}V9 z^&^A697#gCPr7iHbmkiD@~>C(58Qg+)1M8U+Y8xP6rCN9=j?(hP85`9+XaA59O3~? z1zf~%Hr(w=%D*ts?mjgw4-v%i)wFCJ1w8^2Tm!sLVc&agf!77DrC87og)*vai-b>T zv_tb(#>0KjqDE{s!xP*%3c+W6X|W98_XPqp$IndV;6!Y?%_LDBch5LX&CH<TSmbOG zY`WD@xi|_UnzzcXvp`C@|9H*TPsq6%dg)JwiYjrxtmC&55;+o)zzOaSzw)wltCZBg zacI9L3PQk+s>EZtEdqyK+L7eqsJa-LwO7t|2!e>*x5VRS0Qoc^|M(b7*!Q|qBHx3J zb|3^bu=gMO800q-2B<Q^5h!36eK`3IDwHO^&&k1MSkZ#jXV&;*`J2=#?!4=;fzf7= zL^<WONtKQnB`%GhU3Ze^yzRe+V>Tkt)Mmw|&g;k|c(~v5?aKki?8avSO{loC>v}f} z%MT2`jOetTp`p;HDu_RPS4~@=rQ@kYYjuutrR!#Q@o>A>3amL+E*2a;!4<I(;8-;b zFRO^(Yh1{e(^732lDrcE@_U0cpS0I=4Z1L>*mVIPV9gp0j9$p~CFQeAZN$LC+M1sP z=}<dYn~~2sLYja<qYrS?R@%)~zu$6Q>h0~#b69Gw=6^j^f9gji&kCnYcB9)c?9w>~ z3bn?YP|!DS7P*@~UpY3<jHL4_T#W28p@GV<2sJ6+1Sve}^8q4E*0RtARHo*w`RCt! zh5c_Yhamxp@S#aTk!2)0Med7c8Qjf$VfB!3cN4B_8k$b(fq_0~z%zZR##oUz?O~M} z*`3yIxq0XWfXmrS0Ie3bkPvPHS?fxVFYVr?TTS|N;^n_E4cWo{Slu0`Zwt0_qM;EW zVTiz$O*Q5tqraIM-9Sh3!!f=H`<4Uh4TeN9IgpN{g^5XcIIvZ_)F2zy>XmU^rz1n$ zNc>Z&Ff#I0^+9PYcBXBWJ=;tK{met}dj@&;Di2yhikF2TGlqdk={&Y*%qD_KD8x56 zx3q#UNORB0R!)D}BJ1TEhAPD>AIGazLXgNXl|9Asi3Dvur94A_tl$X5Vnt(%-$hci zSgk^Wv|;f(5>!Dci>>-1JT3&yZae$YDS!6#77z8Eji1lv_pQ2k!B;C)v^`tNfS;-a z*#HRK5s-Kom9yedJBx(GqdW)()doXK@x4M~w}5GaEpY^j1wX-=GBpU@uH6&hc>g_Q zd+}OtfBBJ)i0w|*_)UF<(%v+Qh*z<MFBF804{~cRS{iSl&U1`Po(Z_yVRXJ6k{?a5 zo%ClZRKd`z#~>aXof*Y8a=61I=XXd5z>RBt$%O~}F~!?AOP(zWm4cFsFR!_`mJB?9 zhcPInuK_tUI+e%LQRo&x>^K?ko6hHPq>^Q<@7i4;iDKJxHH;1|2OgoJQ^~Ghb;VX0 z_}3Es88+nn&qz$#l@negA)#+18q;nCV;KPMXN{C~>b~f`2q3zZ`|AuHcKo-A-vuDx zrKL>>QtfyP6sFUEPFZho`Sa#U<9p&b@(ox)^&;;zAt7#>2%VAkf48-O!po8z5G@`D zFMqvmpU#y=1(&<`DU5UgP9*tFqAZRbs?^j}9hUS|LecxP$wolbUIk3Fck9%TPQMI@ zK=M~dpM4J#O+616qaFe2f`I2?=AB}HqR$v%!fD2>_G=Ia0|N@3Y;3}Pv_qhufp`Z{ z6mg>G<<+>a=?J_xITIWK+IFqJ|K9(6_ZOR|v|)zo>QeyWk@n}2Z;Sg(LV92XacQQI z$_u9*W+3Rv1tbx`<O4+V{pnFNM_UG2j%2=Y3^gbG11hEfF>_Z;RsFZej8L2AF8N`5 zo<M%7j_lnP>RidwJpbRm=|8@7l6m2@WzY~4LQ1DZ>i9-JdPEIiFliVW-{q<Iknw%r ztZ0`yn6FF7Hlm>+GRTI3xh4`hV`DYw-SCKr7>-ks!uneiXw_<dlJR%VeI%H|LhGJZ zf;(;eG4@mBxf_lhW(lpU1YwB>W)2KWx5vYkb|bp2*h5KUA9%Z$x3QCGf@Jjtvcp{m zI^d}@JM*@Q+6nQH7EJH!Ydm<GC4bk9xWxMid$)4*<1o$l;pp^Yvor5Q=3rN32ToT4 z3AU`?ThPV22WobT34fzt0!(g1sc>GWO~}A9v4yyJrh+)OZ4hCAMWA2n9X=Ep8SPlM zGf|Zi%uCeGN=8xK1m1m2?w`$(Aecv6-LvgAx;g8j<n)Be^LwA5_xBGc$SXkDphWlg zcgS3(p;mjP<x;Y;%@pr|RbCU;?dxyrYim3yk^)c<?ldJx?zqy?`OI>HDZl*<p0l$p z(3*x?Gq>S#L)Y5tu?M1E6^mnyr^T3Qa1<~2^2MYp7#n$t7Ao%&KN1AZ*;ecoJO(UL zD-qNlw#T{g@vru=$oVwN+sp>uQi$DU)K;8pidd$07QAb4_yLR=8x-|vuAwW|_bBJc zK7eojWz@=2t035RCV=+u80PLwUvUJrq*a@$-~G9kv((2(qoP|{TB(sX+#b39bwI=X zqE9t`d)p9#<}8Lk`+k^1@{3-bZ4^3<<nYD8{OZFkH4Z9waM|Aa40>acG@?DAoh*`R z#B@IOH2wWISm(ZNcwLUfG@b$cD`B7S;MA76*qC|3D0+cS-JpB%eFz;@`9uKFT?Ras zlpq>YfB0Ax&e;0mpT#01DoT*<)hW=c#^6MeD^3*b&GM%SJYk^eIhx->BdI6KX0U8o z>rH7;cDne#7<;RzHrudUH^JTAowm3XcXw%Vx8m*|C{WxfQnWY}cXy}7t+>0pv)+FH zT5FGeu*cXZIZ6hBgh%F__cf9C5o7}5jE?^mui1N_o(A%557s{c!1^JbnMiJs3M6Z+ zA_~XCM-ER65{ySE`@4OV6c}U%YbO9ksE=Sa#TFn!L;}=eJbsU^05AbiqbsrtL*&*d zc6T%#?fQIwQ4{LzOjfpxGWpLT>@O}HQ$^Av1CEDPBp^p1%AP<EVGB9WR*LlD2ZpSX zKy9hb1;A7OU;j++!~=)Iwd&1@OmrUk(Q7E)+w+~0@W9K;@%(=Wjw%RXP2g|v_hSQK z!O=il%Luh-GVqyFu#8hVk_Uch$-vyDXp<larXUJLl|sNKqj@Jq5jVKE`z6odrG+Qm z8}1L$$AOS2h2Xi8NV_%P$mwBew)2)-OQ7Py_m7B@J(}<HbDZ6sXv{2FI1lXhH3-A< zHZ-;u1o=$y8xFf>s@BL6hiXEV;^g=6sCfFVT|X@AxQVE@6yKQMP|#mt89fkTgU$6v z>NR_DZz;ILkl?P$F1T8BN@jlBkdUETXooR>_>e*o7%qp9Ds!fZ5*M7B8W$t9b8&BT zIwXRPqrK2+`p*}$yOlqCjbP>pLS-#@TJ{e@?A>4npPyg!Dtw}lfte7S7(zifQa;zd zhwH2Rr{8H<m<l;j6BJ<fMXJ}^BV&QP<=Xwl8#o$T(tbd&cU*Csmk(y{W+Q`ah|#V3 z`=CvYW#eOv31Z!c;M0w2o%<}K<3H<Ch5v<P$i%bba>7mWCUFmZL?8&~$ocaPAV8Vi zhrz4T=c94ih7G2qcev^&R{y?R;RbQv00;@`nDrBn)#Q#tr$M{LI$WN(5W82PXeVDE zQ0Zd(?y`jZkj~nkVt&&aq+qrM6C)B}CFDgC<ar|^*}qzI%=PzopE|DZW^v1}O;3-H zek>7O`hE0?TTJ?yw?&iX`e+HAUWsI|)n)B_>JFRfK(4w3OoPMHH)Tz~!^284YB`Zu zl~sL@m1u+Z-1vlquWwJCZ`h8pH+%To_y<qIRgq{AtfJ#BX!d|-?wkB%J{1|(xV;Yc z6G<lL1@r0L5I<iUp>%tvnYRs9)6%+m;0p|Rk?^4Ve^v8OWZ=KRFEJ0h;1qRWKiE?} z4;C5F8BgPo-t+=`V2`aGwe17`2|&l?|1>&)TP5Vz;c_yqsytWLv7cG*{0BRAOXm&1 zRne+;oeoA3bEEkI%OsE)i^4bbtxok^1q4B)RbU2_$Ne}pV~fc=g@Wv7@A~?>355Y5 zYWHo#VqSj9gaDdfkWvu9ne0z`AH@uB0C{oqf-F`U2lYYwFqCEgMqIl8%`vWK|H+dF z*#Fd%Rn&8En#}&eWO+eGUYHF#(YEb!bB3!IJNjpzeA)$GJhyTp{=2x{Uoo)a{X**q z+*hIaa-`-;!qe&9BH%+j^{oyzE=<x`khR3yx;$B@$Fyi8nqDebGaUo4PN4CSFQ;!Q zUr&nI4%_`^oui2=X`C7H7_-0m^nAh)wgG(`(^yb>_%T1B$MV*57)GSJen~n`Xjo)y zf=~K7-Cu3AXY+Ia#XLH!;6r;94npS_s={^wJhn_CN}49iEG_oW@l9Va%{w_s8Inx5 zzi{TJn0}@=nf+-MhUR4B^D4yXox@G{U8$p)gkQ_W?vxLIX$}QS7~CqSBS7ay5Fz=| zV|KJ?m#A4dtUJoBmX-YjsFRU2c6EHfP{_MD*`OLpB04*g(DYQYk<R}Twyr-R{I@Cp z`NbN&@d%Qep+~<G%B&Nx1g%G?8(k(9(bmMTX?}EA)zdq9eu3^QkD4Gh#^z)2yXeP< zVq`1*ey#zWhqg(i-d-P%Dxoqg<I*c<QoOlfqtk;oie7|sRbSxFIi4bbDANhQisi6q zCbET-a;MO{A*Im2wgH(jR#JxB3&)%J8UWTY@YPq*|NIK|Yqx0QNAejo1Q=%y7%iHa zd7wIqK!GklLof*WuQpG-H(3W5yy<E|AM)iq@Q*$IP?ftQ>vMSsihaQw>1DY_22XZO z+8LviXDh<?4`@s+ei;2$4`{&`_L^D@41$35xW%e%?JAFP|L5!JaUc@=Il5c}*yAIi z2~2GsI^>E3@%RqexKg|kWTXftMY_hrF1E;_jnfSwf;6neU@lb943#%Bk}Z@vaITaO zJDfoT>fMvJ5cKAdDnkBwlsAVVNH`Kjm4HmKx!lazj7G_+!*NN3iCOM=e{Kx6@MO$9 zb=8Wc$Po$f9UFw_`h}X7Mu>p85uJ)|VhSIgNU(I#4Sy9MACCxu2nWwO1W1#6;kX^m z_5&AErvnDYI%JsP*C|rRg{lp#z*gG__UGH9%FD+Er!AP%r4BoOjq*o{3f1k5eQMTB zJX~80?n*o+9l4pkiZl0!vAf$&&5Y-cw^x2Ais_pfkO*{{MtT$eW!pdQYRtcLscMmu zeiX?=PLn#bu9S37@07)uaZe!UIdz?M(WtxKlJQX7PxiYMfTbFT6FaL1M>>U$+G65@ zdP($?<!h90=J-KHKyG7q!0_j+#D;Sn*XVp`iq5CmCn1yj;twZ+z^yOCcNPr7;<A}7 z{azL=8Cl0~xAG<SDiAF}ZyE;FJcbDRhbwX>*|3y?Zfym3Tu;eEakk=rbqGd*JYPs_ zpLuV%H8Iz_>9p;~QEZ3|9I%f)0werxV4vVd!lF^Gf45+$gJygO&^j<bL38T|U=KXs zUhYP5d<UWkFUdAe`-;Rv|FzNp$+VLj-`kXnKE}7Rw-;fr?Qvi7AHtB1uDI2af5P-2 znUBI8^}L|lFF94fPMG<;_W_pK4k%vLk`<|}>D4BiC?Wyjg0%kf7Q|=*8$7c#EFIP9 z49Y_Sx62U@=K+6_Hy@h=x3d%vxGRS_RYkB~qdED!XfuvgkjQxP%q1e_I5U-Oj+o<@ z@An^-6z)5ijQjY7`tR(J>FW1Gt;M))IxZj!xYm{xZ^kdpQ!IL@Tf8PjcoLzlh-qI* zISP&Zao0;zhh5n2O9OKGYVV9TKD$))-zccI%EuUON{jBZpURQXGqk?3y)Ar$-O5vW zoDXYZ4%eC~L8eplj*023gWP<5vaPI}D%f={uu-AcqeF_)^MY}?87COyDjHA}=@TI} zjvVOwi~iHaQ8o0^UpEHPK?B?tK@v&$xg{??T}oD0%J@;bGsv=F75M|?&viDQ$&{^K zQFhZQj`{K@UtIcfqJS9c(j4WTbXTh^RqQ)>2Yc}`Y}K(>I+ICS*EJ_Aw6E6c*Pm<8 zCuZFOh4=lK%vbFhNhk4W-*6<PcF&Qnk2pt8T=Ixm{`bMC2@8jS+drx4Znj)kb3GiO zqr9e20=d;ugzuA+;i^e6EB0*{QeHIslJxI7+yRzc;2J_IhBp-`HOq^Pw9-EI#pjNa z{tAjHcuqR8N-E5-kxa3dXfuV0*irf{9b+|L=s6l=kM~zBqC2@EfC9@iuq@{3`Di_X z@ao^)<VcC!-Ce&St#U5*t*L@k*a@qAsXiojIC!f_2{2PO=X*n8jW{13k&+7ednf%W zyAseLK9s&B8ViV^MUn-`{kz>)3)GgCWzufNA4mXN#gCsvQAw(oE*iEtFVRR&?n6Qh z&DLH}=um|$P8qE*dAF!2l;WlAKo?d%wVnlMT3mV}Lkk9!*+yQ!2_`|9YV+{0Y^tD7 zLzk^ax}peBRmXVI>)MoleLW3KAwpweL%Nsmb~m?&6QQhPNIB2|hZ`yblg8&Ix)U+# zz$m|Bm~mVY7##&PIIQl`;_>5S+ZnVHCe`jXGEtG3@8uJ4Esqx&T{#q!k$x0q+?MA? zF!xW$&%>UdzdCtbpM<V9u70pLaD9&r8tW#||AYIVCctS~^*cQT89yRDWi@MPNCpE+ zr`9|=AWo;OL_DZy=<P2e7F4Y8D-R$F49>6lM%NqqQg-Pd=XCFTi)*GJ|4777x^i_? zfzH{McCyf|-E}ERAM>B_?;nZ17#;6K$S>;s6y;7=CP|7=k4DO_w!2cQo^1k<d6f2g z#Yz(WOvt^M_h8);VT_8F$d8O?Y9)B_7h%I_0gsC7Qq_aO%!kK8N|3WfZYc^1#6WN8 z1|5*G)zX_KRMbSbxwS=0mWtU$3l@>`x$<fUT2u=4Kq~Mk&EF6J{-{d}R0~5_y_ALM zSC?fUgm+lWriAQf2m~cQ&-YHTO1`V0u78;QD6M!;edR%CmdAgjwT-~dMcTf>%k4zv z5mPUf>{a)QUzbMR5u6g>09;jB(mb3dfqw@UT5#7P+#}FR0_qxdIZ`Rt09KR_MIs+X zIJ20wuno`ED@@5^{K*hYrYE8ewTe!9bG1LSy4>Q?xP^CLVVkd`2}G~P;u-U)cj%#N zU<f*JZ^Bfm8RDqx?GpVs!gUDXtI@$N{&wMd@>vpfR3Y^%orfU}0x2)_lDncr(i3+} znl5XBtT4_jK}@p`nvq$0f(fAOTW6A`n0`_2+n7n8{L%#h-HuBS64UETs9ozFj}dAw ze=n;c`u=0|d$|ZHMEe~EFY=OmtYp#?x!l67v409#>Nb?JV8HKW2}Ys?SZpljij=IJ z-Zj*S+j9ezzXmu@)IU~Ts-HTkC+GCVM}>YLEJA<&fO@9UK$~)Z@zDvg-r->&1^Mj~ z9y^oW;>9d;7wc(w)DD85>qClj;3bLWg=EJZke`U(Gf}fSjU*zhO~FDZ5npF}zm|;s zPexc7N#N>u3+f3IiiT$3Ub96N)7p53g;Mx6UA5-mfY5R>w;3ozn69aH*=~b|M+?I? z($Y%pg23>w*Ro^iF<^lGUjxc94y^W^6hmVc8ZB6;bT|haoqidQk9Otoo2sx3l{x91 zi&92868OdYZ$OC=b4uh%1tYx}y{|%=356oQ9M2EuSerB*ww(Xj-glTa{yP8&krgSE z<FgJNN4cS*p#)>Xfp3pPG*Xf6-c{`)Rwdijn%)dl#$_Z&W{5%m@YtsSX<7z7S^_Rm zOeS9-@=U&ZQ&$|Xwif_kaf9-}#o5lAu*a7cI@~2+XX(NR3yb*%?-ZkV%e6p1PT0lR zyTRpkdClv4kd9>uhR(m<5+NbmebSUUS%kuU?4rO}oK_a5W%dun!tTe6MDq-S>*piA zBiTe~^1Oh=W%w#kxgLC#4vQ06-5&liJ>T*2RAn}75{P-=Ob<}rDNW@q1OxAAkQNA` z6{H2G?9q&XJS$eGEPWf$10=KJx@RiEnWqGVTXb<0krc1a&ov16TvHW3@}0f_O4}#l z@kqew*!^Qj2}E-<mt4SpMC%eMVtJq#0WRY!y1sIKhSPu`cvPuI`;}^sGcv2#)2cxi z%P#uK*56xhV>EovlW8?pwS@#iw!t%s^R<Rp5X`vP_3Ys?$!EO9Fi$?tyPluDuvB_A z!S;cjNcWnSEI5LF52_}i2k66M3?i?}u_ALIsg;-bLE)QgY-hA?VWArR;3UoyQqSx7 z(ihqaV2Nm~1Z2YHPDm%HEtAg;Yd;yY>r@i{hT!Mef}RJwh}2bb6sVAz4BVX{84Fr% zup>4fn>nUx%HsDp)%$RpQhC6-4)Dgz40EQ}ZsrYR|Aik+T$@?0;z1XC*^ro6p${+f zF+1P@Aj_22<dCdB0tGr)2QEHq-}#O7sC_#r_hmqFN8d0<o^HLA$1dk?omqBwK(HW# zGUr2qg06x}V5SK;h2+($NrL8!+e)2*tuiM8Nubk~8}2GL6xg(x#r>7hTdV^t1#ar; zI@W*X7Z#v-@CN6b+;kzJME|l5fowl)5Ij9{x}wVu#xy6gLOc!{`Z^K=hF1<jg#72b zhIB^#<bRjtHy1y0&a;Gf=!ZuGOUX5YUp|$;9t@n?qT2_OX|A_`z1HM&my7Ei=g#JZ zmr0pAH-1i+H{YlhCoJnR@{z<VBf16!`>+11)8rL>;WzL%yhO;igOpq~$D?OHmDJt> zK5UbKV)7gW*RWrc1sWHI5_&HkmKuv@G#jvK5T9%}jroXwH(r>PslfEKx86crq(-K4 z(uf1Eam%u!;`J9Q0F<?s`prr(qLZAad>;UtGsg;ZmQ>$-62F80@x&ZgXG~Y<6Q%4& zCf`XM<qq<Hs6+l{P!TX2*DRAdL+Tb6NLuS{+EYVBTq5k&j|&a5F&}HvTdut`R*D@( zN7A@UfgBe6<ogFhdk#cWNaK^G=meA^qzNn{q7UVi!J;xzMu=~UjzLNg*KgEXVol-a z<SP|GwCo!IW*>#P%H%<-i(r`Ux=iHwLuc^15xH51b|o7IBn~R)NY<J!yxh=b2t0F; z#k8X<ib1VAoCkIfBHR<G?&F6cd*N}~&JdsyaX~5g^JHg%4c|ZnqyY{ZLL^e;G~~kH z&W8}3j7LYtq|9$&GX!0r@Y$y@_sKyJDJ<eYtbAMMCtM5)F;H5Ju3Vhdv>e25_v_f4 zR;1y1C3}-aZ!1vg`m==}{go6Xf(D}d)T`_*1%VcVyW-ES%o=_zI+2U@OZ~EA<Ma61 z+JDclu5h_qp=`hkQi)Bin2&%Flsw8*k<<0Tdoui&!&(Pa!$irEuN2=`C}`L!Q<SPs zNRGslQW`rUlWtvCJay<7l>L2aO_ms0F)^r)dz0uc%eI(Zi9HO0gssZ~Vh)&)r^`{r z&0x)68mzVrVqomQcR*M$Ai^7`9Ik<_A=v`cgk$rE(){{A!BHf}sl)APu3OM!joOb| zBq=E)zxj+1g+287<ykb8T`IqZQMUo5^W`>upYuFWi?#4-y&L-eF7(YE9MD4ib9c^C zdW$alVyHKkinET4i`KSh@0W0j<ywa;+3^bTU<~=-lFP2;X&_o_-x*fhb|+#XRt2^+ z7p4Ss9-!xYrKSJUtQ;8A=Z9IKo{=U<y!viB@UYC#f`8g}#ccLPzv~G|F}YZbTiZiO zY~~K&bgYD}K{>B2c<9H}-cBftZ_vU;$`HwQRUzf7<P)RJ40zk4|Af#(O_0&f_AfNh zdBc)@??Scd7lnU-Eba7D$xsjwhA{~If+$nl)cVR~*r6AorW|6EfjLu_J@za36v66l zf3nxDNr-%9oIWEpA%RMH1z^2GojYe?vYTzQ=2auo{d3_q1Lg4?Fi7*<{#uaIT^I6@ z8WCD3s7$Ufsd$iW8?b&ENs>b)ApKOb5rNC_Pi6KNY&7ijuQ_vEGwZtqT-gt9nF;U= zpenh`lEm*&DRsb<ni|L`T1f>KH2423L%&xN^LWKbb%JxoIxURs{~c!@b;N<=%%?e% z(AEyeW|&ULO1aLqOx<dhM(fRy6zj}?Ys~EF>%o#b>ej)Zn}c&Clzq-pXVxt4J1&PO zMKew*As&SGA5gMu{!x<14QgaRN@fUvH}c8(WflI;AOhM(4oU@&hM71P99toRmCJfb z9)x*$jKj@6Ji_@2m|jx-B^A@o2<nR0ax-H#=~>1-hmrJ&WFPNK#`notJ01}!olJdN z`4Dxi!iRF@3<qK}!HxMHDeCloi;dC*bWO2ClxC6QT>x2l5uGHvZ~gP@2LbZDP%h}T zbV#?_C;vwp2S>x6kx7y8W>)8i2;59vwv*C5ol?C2?l6wD?}0Ed3(~#x(AO#iV>~fA z*Lagd{0(+7YFB-E1qB?DD&=e;XIr3KH{df&&pxZ<orutsSGj+$N``<N3HRCzc2NxJ z;Dd|R{>+8-@p1?BN{f5{kMHu66btB`uT`jdp@IQAK;B(QiXhs2oA3oJ4B<pa53Mu= zF>m8iaB#x|YC@>;PiQw%Iy3VxluR!II>C(+2L3{qmrOE(9(edupW~cLM6^TyPZr=5 zMa+8k8;kzDtvi7q%BGkMya*&w+~qF^VYRn7)Mm#6p{7SC+3;S?c?$oTi1{2W_!T$@ z1@voxyxTE3&B|=je=QncY<_`C0SM|`$HHKi+w=<iO+0uCeg<N|&HA2d;6%fj-mlFJ zXxSA;z-;LDpX@iX2HTa0Dye7~MzhRjUc8wSU3~0;XmMb)Y}+eqbbg=c{$g<SW5D2n z&>+`&i|Yfm<3fcWzrf>=CGTD@EcsU>3{gRLCphw;y0k9RBibaHfanu!Zb1tg7E)Nm zTfvJy35h!Ekd;;sd2&M7$CJjTf8X&in=G<Un|f_p=KIoLI+3G<Pi<xgpPnC&D8p}0 zCiCb|JD%*D@x}{!Q|huQ$XA}Ce#o1?z20r^raNGw{$nB9E>s!BSS^+jk`X<`i6q!; z&6(`QWPZXAl;k6?c?o`~6T-Drp`Z@g0900#zUY-!`RfB91soB_M+tSHsvJZ3^yhvH zkbKk@J1xfTee3S?ayzu^Q;q(BRiIz%a=`&VP=aCV!wkK?+Cv^-Q(q4mHj#!uisfi{ zfXqk*-0!PGOY2ttN6N(o0a6G#Y;qwo#ogd{2F-}k0)u5!FLK{=(Z4Ki`08ZhJd5c^ z*#^=83;m)8nPn)}^<?WYIwt0J|G6l;*Zp839S#0ckI&Qp<z^l#f6C1jXzBRZA1poD z1`db<7^FkIqdZP?dnG93LL@IwcPS~$;4Xjyyq;!}g&F1qWOFKHHY1{zo1C_`U;YiZ zdhUGJlo(A2dBW-zgG#m~UitJ(2T)VgVP_wJ9DwHk$pI8Wfo%RaCRauFKe?rwdGnm% z1UZtSymLo6+!{16(iz6L>G3&-XkgmrI1e@)87^mZ3)js$qI)Xn*F<MQ=$IjUS2Yv} z(pcifhJOhYN?R$_i6*W(sjYSUr5zN2hs@Z3#KmKWT<A^^@PI3zN2(zfI0^<`&kW3X zMnw>)^hhocgAgcyC)7E{3bOdn1$SlykkfgHTRo%SuZS?QoWUmB%7+v=jm(wo^Gx`; zd47G5TL%lIt38#x1XKVmdV1W;z5g`c8V>Zlb^7p2l21*c^{_d)RPw(<4?S6=w)?5t z3eQh`+?WYS=;-($R*EkCz}Ht9S>EXUyg|q3K3S)t$c}=PCIM1mH-)hsNN^=W8pZ?_ z#&n$(_3=t8apUSDadHO9Mm|D+rhpUFN~_zT2Y&-KBMkxrK4V`m`n6;$o+8HP8M5h5 z(!b~8<#4EzWs*QW2FlRLaA2>cn2IASi3Wo&dyV7mve!M_J$0GY=WTqxIDblPi>a~h zABo{nbsPv>4?Ut7zbyj-D{S3~kGY7UP~psUksUu=LA_qBeXL3q$CzWs3QbVTJ@fOR zre`58U#jchpbj;Tvw_<Hf=&M>XvB_Y2bVqekZGjX$L19pc@ZS=FfiU#ct<4{jFSE2 z{F(%m*dP>(dZ2CZSXHfO@H!xuNokftUY-mue+ZMJMZ<xi32FHc4vP9!V<+2>dk3No zf$1k@+Sk;Oy$P^#&>n%XJnJ9$JTiX*)y&*{{m+IOR1@SY`v~n9i^01HtW!J69#sIG zH`J39mEsa}DDfN}Ofpvh?J}Ce(hE=vBTYOrDX3zb9}i=~qDdL&DUQVn)GB>`r?O!k zrNzg;uLu?<y_a2NNrdhyZ@2HaYg}QDfy~%U7b<Es#$fX41T#~s``or^Q+)@#-SgSx zN(l#Hh;ZP|zVjSVu?MBk1SFAwh%gRbrLh*lKnx+Z({ESGyr;##E*7*k3ns%U3w!X= z0%5-@o8h$aYiL^T8+$utGo#GsJcTT%Gx;#%X1Zm^;M>uU$3u|Q5K2BvU;l*8L5svP z*d#JubCq#A&)HC4wEv%38YB?bKwcs>=_60_GV%V@UI_+>2Io(El1)$y<XPEc>3Z&R zFUv=1`ISc+m@ncM9wTgT694who#%A$tcjyq{?`zVfE5%)y8FCk&@0^&8tf(by~e~9 zpelYVE`HZM))Ru<U2J^kyykZYIKF52=gB9I@F1_{V%0p66rrzGdJtfEh{av#ZbX{Q zOJa@{+<{H6G;{<s>R>m;VqOJ*`-d#c;P)7FW4^1U&+>#?X>r4j%T(<Sru_f07`!&I zK$n7ZFJ|V2kCBDWdJL@$we+lBm>|Qm|JQN(w<s`xhSnm^`hJtOv%NSzM8{?|5<5{Z zdJ9cpg9r$tU-f&}_xz>&Ke(4Ww}9NkMQxYjKHYqws}O11Tf+pCjSoxA$wFqVM;P1& zn%>gG?E6dq^o{*hHeOYhOc@bwM*h`^*X$9pHbt(#<9jxU<6wzn@~uwtV$OofNn7By znSB3e`{~P;o9S6I{>c&OpGev=FSF|?fgUDWxw?XRN)<MB;j(O9HgUrULHOkhvqbEo zi_*e9+W})V%-;<COLP2A$oy3Eh7<qSEan0>$TOZbq38iQXM6cQUFo39Wqgax#|Fn} zFVB_sj$(gPCkNq1wgwtw>1B&la!p$ebw`q4>=vH(n!(L1h<Ejo@A{%T@n0&DrA2PZ z7<~_2M1)@tol;-a8aHjIUFdfOIM99cm^`NYK06eD&Nc`$ezC7CdaFUxb;mVq#l^{6 zFs>L!wI44Wh!*SX!lf-`fCj<D)mel1Vv1#Qy#C&(;eg8GZ!}TQZ-?H<x|fCe1wir5 zZb(0_GhNtvul9KM&|8Iz2~&?e$Z>%6F>)KXRk}2d_iAwEN;A?Ga0JK*)tUYamgFQs zv2<Rxi5Lg#AiUDj(<9eWi5LbD(gmUWKVQ&mAtM1AfPY;_DXC7QeRRMZZ($~npF#lo zS9Jk{Safrmb9Ky(`<n?CK>DOcSi$f|LPNtN_@){!d@3BE^V(5mC^M*Oqp=Yl`i-)0 zJE$s7XNV1!s?NzJn5&p2z99{tU6p|bhR%@V7%=&iGNdktu`TC5khmR&{+uxC`Fo9$ zZ($Ca6Ufh&4a_EG#nCcm=UHdvQ2`N?G>8#6m%l?n>U&}k>VGvYnq+N5MLLE{^@VnN z3lm)cP;{GWl1-s6lrVz`%2MRhu#OKk%CJM&n!-gvWTdN}O6I$;yjdWWSmWpF{sj6( z3?u4y$%b((gJ`}+6yA3oiaG6ou1Ni$RTJ=4U~GOK#n4c=udfe*GtvE3K**qj1TaXy z^XTVVx}H+M8<Yk^GR7M%C!w(Eg=n|hOb6Y;PPQRjfuMSxC9&{DTF#+8PI|r;s2V>Q zgpWlcf?_Eyrai%kmWy?10<uk4FX*c&_eNy0#c_UA3)ng=YP$nKSIbBEE+Ea=wB-b| z^@GzYs$2Y9u2-!&)Lf>lqFbPRnW0OTLJF@8cco%F76y4GFQ~>YFc3_@y6!I_sn6g? z7nPKj7I=J20yB>!)x@KMHNr<5r~2tr!syS~D^@NpJW5J8m>C5=Z?#1d9Gob?cOTjc zDMQu*rk$MTNjO%F<DD(pI-gU_AL#8P;QrLdjX^FWIHc0n@c^#6(A_gl(I^E?2QNRr zZVc_a(JSeH@@{Lw|H!+bfZ*4GSaO!5M7A+KQ<x%oystj(-Zu$aI(%>uM+LQ>L7;<$ zJAeQ>qzWX{aEg>Y?#Ew<G7{H(ucAkdCrDAYo%C8=!M1>3m2nFsu13dK<+MQ*qHO># z9jR-yUQ{IZNni;N6O$6H#uuIPT%Mp3fI>E4fc}9^zhq7bCLd+^(BEkTchr<|%uAQp zcc+W>3}k-Ss)1w8@YCVRM`365%P9xmaw$3k3D`sxF}a|wLlxE8pEymN|C$4U(~ztA zzkuY9`gaCcW=z-tli6-=3{oT-W@Jh9RUc_7)6Hp?^`AoXxnC?1o-?}wX!)_<KW(wS z)gPp8!3ig=#lMSs8RSGcoF`Q^?mrq8Xuv;8X$wiK6_n;5d*oA$eED*57uty!@CQm> zwilD7f`6k?p|7v#OtLcOB;qCn*Q}7%^z7S1>gE0O=7eMkn%7s$9?YjpVgl}b%@Uyk zlEp|S`68nppB>)=gJG8Y+=21_sL->ndL}UptTJ>tx=*pk{mJ9_CXY5zB4xgWt(TzH zrUF%`XmFCdn`~ch6<Mm<C6@kx$=qlVhKoK9QAks?suEqoUHM=SA;)MoOKl^ios6zi z|KtiV8p}<tOUEtR*~l>6slAZQhb0lC=Rz#<{VDQYl%EBh)NKcz-O4V<UJ@-mY&g6- zrT>Ag!rQ({4stnUmcwDC{;~t^^DQI<mt3L$8aG4GAfURUHtu{_M&bcHYy+Gk^S+-i z{U8aYR>t0!=^OO8>w=jlUz0T6zAj=d_R!Q@D#Uz_C_nSXaY(sy@`&F1DT&aYR?9&$ zsVo?a|LwaT1D;vosrd8LG~3Fk|JK6?y`$;#3BgI)IkF@9zSUq!+y(Kb$^nzbwE@c8 zLaZYi4%jFEu))Df#U5XWb)AxL>P`X-wNZcs7#I;q6wgs*H!mUKRa0rAD<Dd<!xyM1 zv0P1fxvE|^p?x&xpZXa~E-E9e=}$rIIH2frD<-mSB~P*b<W7_8d7l-KQv=3R&e5jA zgLM<FcJx7C#J(krV}*8k<Aa-IiiEjA0ZSSmcj6f>`q^P_D*EWsVQuYh{Yfb_m4p=; z8&M$Lv!^@zo+v$-V^`cL1xl`y=!2Zo6()O=Gb|1oUwZhFIo0RQ?15R%KI2+@euN4* z$NFmxe4Lp2tbx0remRugQ|*X&y9gUI-X;WS`_vp>5^pW+3=2UGw}GkmcN8CfM|RA( zAEc*pHdAF|mYR-vg67Pkl|_a2wz?V+HY|AO7Y$?imHvphhNR?JyyFmXhcj0s3{U0S zQ8OEs*sK_5ed|a3zTk4x9noJ(jV#yq<{cz43U_BD-<SK;Vk9Q^H_>H#ggSMpl7|A= z?f-&uZnbYV=d+i-3$){_L4(4IHXRRd_BSUi)H4OW$T?nRmwlG%E$91AI5_T*_bjF( zqB@Jl@%x3Jd=?t@6TUm0xg6pjYkeH=_1_ct+xsFq6K3VP(XDlTI5TuYCeoVn_u@gA z?d7lJ&hjYE${DVQiR+T7*RP$H&UYuiI*Z+tcK&Kd78#NE%OCx5(VjmNIdgBl8f<iT z&%R`doCO~FPv2<QJab21j!)Jrb|-hb_XXU6TnQtaD`WdfRhclcwqu{|R*mO>w45<? zS}bC&g1fALaL^Kcn)P|Lp8SR6BRzY{BDhwYEU1CYQzUmczxZ;xkkE-fq9A$M!KBr0 z)N-|2eXKFkgc6<XBRGG?vR$hybkCotk4SEMTX%U|$zGuv!sb$0zk5c{&~iEB1nkKo z+DH@NI3uh;6seC`6Vzd%M!oP{GiYee;DDpK{;fHKM&x${1SC<W^og($COCAI_$}O% zCE-rp(L}*iybr})fv(l20<;^%e5x0Gd(-Uax|^cGk7*YdUmuzZTyWrSPoQ<}@rdfI zV%On}r@kF$kStsx(_p3G*P5AiB|GB@zxrZiwz!I_WO@huMYl@BkBfH$`_sXXW%0me z`w~ZKF#I;FjS>+mt6D<B+~1150fKGOYi}Uw6TYyHEqfX=p_r&^Ti4USxCev>mTML5 zA|Iocm>BDf0lyFk5f_0>FOIPL(jwO*`d$~yux{kefrc|h5rIS5q4BkG<y&(o4j{(( zuI?`k2{i#87S`7^$XhGV9UI+UdE=@xl(&0egsVq$gWb}4UwGn=rR?6A=dVys?SPki zwacVe0cjB@HE!1^r!pG?RDv`h^jijkNX+$hR|dp4#`zOwcKy7qg=;&=p&)%O=3Wxr zYuEL;NiH@WxI0~H)Xd@T5&n^wgXd@Cu`t=;2j7QA@@|h=yNv)KNJ#^C@omp?WxDGl z4}2i-O$9<n-op?b=naMRev2laDA)B^c6>oyXyX;lc-8VmwYK9VaOy?n4r3t7e7P48 zRk&rN=Y|(PU5j-)nx{PKfpsFXoq31C@8KV6QyDD=@H&>g_Vj@f`Mlpw?Nx@M{(`}O z5D}rACs*QA3j!kFTrRdc|4RMQM1|t0VIi?-kQHb5D!b(y6pN(h+Dx;^PWG=Mi(#M! z<Zvg_^G?bjX*H`Lpo`=`Ni%NU3Q%$S?P9h@*l5o+u)0h~5k6yEZ}}SK*Pp^1B7(Lb zg5L;g|I8y+CvPKM+nmSWT&S{S9p(qE3*IeLKjCiq0DjP+dQ}ZbB&+YmekhKz1|R6s z8{CN)7F;jN_U{1{OGjX|bZbu6fe99Lh~IwFutbBDA@UP1rJOg-S#STt5Z^NC>-7}^ zJUTHK3NSs|eq8?OKPZ@Hv;%lD1}H>j%VqEU>VUDk(i}cRAX5Dy2P6XMn)}E9B+ijv zA2gBlsE}~{MBf{Aqsv#{{&}@$7R~x$B|24F(&W<j>>OBId?8<b?XWWoua(fa{$lZD zEEmqwua5@WDN(<aA7VDGHhSgkb1&}V9x35x+q+mTsL*#E#!{JyeATMIhwW?X#wSyk ziy74Ig*PhXE-uOi8KqQfwVb0~$6li;pFgg0GAi>apGWMu$oWqahE$IxZ$|s{2o6l) z&KiqO&E2t;oZ)!hv`p5o^Q^XEYyeH#w)A(^tpxaV;}tmgYlff~bK|AX0jg4{>5+ss zqR;#&<$5?~^<%nrFdrJ=ZrJ#u=`$&$WCH*?omJ{wFS$(gU~m{%OKr6;VLp$|LpejF z?LR*zB@Jr7zk?TlT1t{y?}=20u;96U;A566l#da4@@pfM&Ca>CLc7De-4tknkioH@ zslT`c4)RzU${pC^!so&3HJ#*}e=b%q3dLEnycIBPc3e?B>yG{ETLx+ccJwP#pg~Y2 zVdVIM;4e+%ih7OZwq2*Wz^u&R{}@b6)gO^?W<6q-o<8%K+rELZ`M(GJLSyQg7{i`$ zUnv=d11T)Fz=8#H<^L3X!cd{T{Xls1+b{La5?$c~Y@xbmVUiFlJ6^5a$<CMglxB!f z7Lm{}s?;^s=u!QTnt+VU$4{9cil2t#6D9q;XUl8of?@`=#v00?^$iJ%n*8+qJ%97l ztXNfU<;zzgJv)~HY)})ru2O@fYiL5`cO#=&a965VYqhJylCw}G&OGf$dnhV6jpNL+ zeFb!vz6Nv`F>fQe_kRK5>7m)~jYQ953+F7m;EAa#@JlrU%T{|Y14xVMXuSOMM_5qq zR}ojQQO&2mJkjyfxRS;z+meNcG0$uN$yQ|3>TNsphZe2nQCKQy0Jhg`bKo~b>P zk>(Vr^^@1Ug_mv|GkafjY#+~1k%GwY?I}*Yj2gbNHz*C7XTYBHy1a7`3)dFaUi8t0 zEyiUhJI`j+CzVW#pc$uDS{gS<U(i~o_s$PjNA3$$fO;lJmafWopV!hgdQHEx;;EN{ zB_S<UO-;4!jL5dmisklijZaSmzaPE91MVe5iY{0hoimu?h{GC9YJR_$S=1Bn5^+xx z_*4KT?44#{Q5G4?m|U>devgDq_?kXu96Ql*F)mKn$&yEol8m75&8!Be)v{hra^asJ z)Po7MN*=C|%?AK2gclbSpw~L5xv|`=7Cy9n1tWDY(2d&j?m>g0j8{9%c9Fm)nWg_= z4U296v~^<V5Y2Mtr{MG9Twp9TRL~4sMF>b(IIsfA<;sXZ{;MCnzt~-tpz%3!052<n z#aIzF6E$i5SKs&qUmQ4_pUJ)|mbjoQkOs~o36J|dr;s)|dhm?cN#P$%y-qfN!3-4g zJi_sIPTaSbV~&(ooSU3qxLf=OzWv32Smyd#bGZmf<?mzT>o~{r_`johSgE$cIj!aC zl68yRE)CslGMENN1JYBl5E~m*z1?aXp?tD0&ECXhOb*Er`_rQwBhwM3-mteeyj453 zG#YiAI)l>&b)EZL0KDV0q9BaKQc@M76Yv)avPIa}zGU279P&n>tu}~3ToUP;VD2KW z+t;m0gv)CpA`|vU+1M!0CvVB44Ci^(g$EsY@2wNyT33Aa^1^dEF(s*i`@p-sC=hBN zc5Dd5JNs_V7TErXDz@E_{MaIU+TJ^&j}4~#t8uHZhpf2xM^8c`zYh<am9}l9W1j*C zOg+Xs=FpQ?mVR^Ldz)=47b+HmT-jZ1_M~7A72<k3O%)GJkJ|hYr;r^GkSE@UvEs6+ zo(O*Tz(-2xhw^D}dw4utoRCtyAynrw{>1oAT9~h6`J>Jp`2Pk6lg%knxE<F;(w1BY z6l7%1_viM|;QWC^YR#bc2Vj&mvB_>M762=bWUcGi*watE#GEES3V6g8-Kw#yJdW@e zI)AWcT?Z;X7@nx-C;D-qLW4~a&oP@SEGbcBid0)ry}!aT=qPIs0yuF#H8nRN)~5() z&_F7OC^HRs7yk{Y1<FeV=CZs)#G7fCblIq)IqTbF5FThTOo&TGsIwyuIjs(2Yic}Q zHWA&F7N7i*amO-d@>-3GJiy<%PqCa(MKUVvEQQ8Ly$FX&8lK8*yqMBpkm<x(GV+!y znNmk=?uQ>*J;w5bBhkY|dfA&%IcyLqyk~lIPpZW*-LS54AAUU0^c1v?bbLbat6Av_ zoylnFjuydQS&CD1`_tA><2x!HkDT|&rNs!K1qV2+T}26QgIFT_CzMg)`vu%3g4r{# zC_fX{(~}L76lYFGhbeW&)A0H}qq$pH$v867ZyJn)x#OBLoP~HFxe=(P`<nE^1w_#+ zZkzl>F|(IZ*<jpk(_|Lwp>-Sjw|*IZiZH<#JqkX$xil^Luxd#E`=WljU??FXb98qj zo1yMi?mgRUvOb5?O8N9?h*@OI=annGcO7s{GK)978f7{$<Ey4K?@VP(C*Hbq9}=5| z$z+*KVH_E63bw=4dDvOtjH`_H(&vBP+2Ee1yJl{|g-7dzP@h$iRXnKCoGyNy&4zrd z<g#Q-!LlLZ$D@Xqpw{c)sG)G`2Dy4I*B<5AprAW+C-Y4%F8)^P8T-g^eo>empKoUr z)?&{JhaMf6MWnmyOH+8SMuJs%l=B_7q;;#>@?dbxoqdxX??t-lEIe)D(ggiF{iH&k zXTZM>&jDqELK~SBL0BhP(tF$LKR*)BbY)J~x(DaFV~Ny&;Rod`Uly*u^bU|nNYFGD z3H_PXO*K#QZtE*PG6;*!&w^Vc`UB#tR@K?b(S&IY7arLL#sAJfp|v(ItEnUkPk|?N zu_OJAk71)28-3J$-`;6Jwil4Po3a+weC;$yI42HUf<Yo&gUCsnXxUDce>JASf3UT5 z5xe@Av{JsAW=d-uWxOZ%b*WdL^9R_F<B#7tmh7HbJLS<8O3RK4irCH%H8e3vN4$k^ zP?%GW)1<ZX7w58<X01^`Wl_IO{%$SW-P-p>yLXVA(HZZJd6pSs#(G+`we*?A5`@S5 z<>nBYC%+8RN{Yw`Y>Jz3?nyr^*FYQEJ)-a{CCAva-1_H1?BB+%Er{!$V!NSDoRrb` z$j3bwJ@j>os4i3x7N-c+I%9RJp~LC1<5fGE7A0@`a{}*j(qG|aS4kWtxmeJ~`)Qco zTwE?Ni&w{aX0Mt@{npCw$<fuH$!cW+FUOsrL0btE<%UVVcu7xF!AxOqw-)&sjF|GT z{A+jL>vKQ2$EyA1{d`J~$(!SAcXL;9*sNSp-JaLOT!Nox3Om*u_H>jwk6pF?p05%A zrNXr1$e$aDZ9Jww(Z2I2=kvt`F<nv<Jc9Hj`I}Z;%Zcf4pUV9^{L5B?J0F!%rQgSs z#M2BHS$d|X8h?QOEdAo}-M`>XE>au&2`u;%g7QT?W{v9=b(N;&XlQ38A|RLxI=e7# z=Fe4&(}RophR4Rk%8nVGTufk0)49rF74pRKNI}R*j9A#i2+~l>z@V}y;4r{GBA}Io z^oDnWVDai+vWaJGJ{yPxE!MNX^p{vJ{zSE<3kt9#wA#ZwCJz%4hB!@(3TC5qBJ=X3 z{rFmC{zs+JnBW)=o4v**-kA=!yZ+f|SV3B2(F=y~Pn9lH)lZD(If0Dvp@G6^en%?6 z36|1__7S0Y7C-D^p&<CBSw4^hPcCr?@E^&=^n+VFo?d;Ncxd`0hc1>J+!4d1;vzws zO71Zrv#1YrVbT`DUtNKGY(82KAIu0s?%y&E7#KJz=}iV3S&}ngtO|a>A4~4(F}<?d z_JF-4mX)+p^gMbix77e~#(Y*}1O$O-U0(Ieo&we5*cQxCHZZ2UW0?$}MKaz{qyi)M zi7eUEL_LI2<*16KQiQ+SJh~{!3l(wT!~YnpVu7LjtMoNEn5e+dJh6$OMhJYPKo<xq z5IQFka<;Sn46|z$K(ZB&I981oNOO=e*uX>af{!l*f8-7gP3jIlN1$3P<8u0Y#YT|t z-w^9J9VpNqb9~G=IbmB^OO=V{m;dL7d^Q{&*6T0*bkkhk(u4KFSsjWW2PX&!DE}Z= zU7A^WHp4Fa#WEAIV*x~A2!OkXlOj*mEiy(u2Ky?l4~I@<Fj;VT!Sg@3N)V{I^I!)E zuEUCQjX}OTMxA`QfLnHonQ9(id5O9DdeP*u>=gQ2`m{f)wmhcirp34yu9B^1)+t)p zloW_aam17!CVmq64D@0Eo6=-GF!4$BT~oaRr%3|m-2?0wI`=WMofXX9mq<kJfLt|; z<qn$qjHp4~pmzR^kU{3I(mRun_(kj;ZKdZaU|WUG0-kdvYG0uTV}*Fj&*S|skuCYS zFB48l^h3qhRnEV#|4$Ymr75j-*J!4EmGmUy<#IXQRHqqago1Z$7_uOP8l%VN50dga zifnaJ22{a_qfgZ=J^|r2O2$$SqLT3~8%)a{YYHrrrW;`|^B>x{C7#6Q7<^SWBX=%$ z75ed%9}J_^>N?vDuD?QuMWVvT1<ykBn^+PmX>U}UV!GH1?WSO#XqJ-C@;YeGkGvX1 z_OBe3{7l`pdv*09bIMj^z$?;O{7&;PQ)YE_@n3daF0z0zuSpL&l9W8giWnQi=adPB z^pn(cL#vO*t&#%z5$Yp+G9xW1_lQ9{8vru^)49*?R`Anklo@ys6k;tF3@8Gg$3sQw za(B{9`LvUv;n|Vd<_L_!ku<@gd~2zn07FBB3MOcRA)hd)0ABMaWYoDr9TpT9lR!oa z=T=Om2CuoYq(U+m<wp-rY@G$Khf3M?L~hDv7MYPLNdQ;32SWZeiL*h?rmTBG>VWq5 z+A!egzEWxzd5NUU#vZ)<)3vWmPq&oASTPNxc@y&RgDVVzZBWpB(U+%Knm?_!z9?ku z=}aZWW&A+ztV%|>!$Q`(Hn@<64#1<azbAQ`8aeZPR7PgAazD_YtmV&iL8~A<q9j`y zCD%%V2Q4xV38Y0OkqC1}0Iz&Hwt|$L@_xoVS2Wav0paJa3=Hox%U5A8N+mlYZ<0fk z$cav3{qBm<Zf7$lJVF>;7KHEn(xA0LZfUz1I`f+*?QFyC8DowMY2JNm&g1YKVpvmU z%_$_H=q0WSvR^(e*v?N`K{YvG@Cu@R-hp{$ZPsnB_*MV}pY<U2E0@;>ahYNFAD`m1 zPcLN#vkDSf2S+V(o7Z-X%tAN6t1ZKhzO)fAuDp>E^(zkaevve2?Ho+G@G6|yi~NLE z(7$y2nq|1Uw~*^Yj(qDkfi9S}sI8_wJl^-E1rI;;yp3O1Ll~shp6#?u;`i&kSzf~R z<a-JdsJQc?fa>+^&bTZ6*_2ax=dSaN!RA2Yn5^X4r`)*_9vxooIIENIru1j~)+aFN z=DpU~nc4a-pAByl)E0cKvx^zCkjg0}NzHog;J<A0h@j<EDR`f!=ZQRuiXG3?r^w_L zerH8JIpf_&PV>jXM0Uvh=kBNB$h7A}l7Cx<0<8Jl6;og`!In%|tRp!&VlE8)!wckg z6;>$Xa`o+v=I=5zA`AkQ7=;K%5`x-<r)+^b#xD&Wmn1{MBr@Hk?1E%Nh{od9&u2UI zMN?k9m!E17s>RZ1rtb|?xlCdBtQ0bFk)qwfJ^{-P>1HgQZ+rY#$7A;99u_IlFqs!2 zvhG=4yIw-$9JL($XD_}J!t}%dnNa%A@bm(pI>Di~iDYCyq7wupal$KQ^D>PEy7p5o z(*&dr2F+~KaB|HI9|3HBoPA}mk<aakWcPw<@p3JCFAD*Rv?l(Ck+t4*hqe$%nPH@m z*UP%nb?)hJ!h9N<pAOb=pRf{DAde_m%k~-f#aJlQq#hUjo3ANx2@!KKN;6!XIrZh> zVaMLT3sJ!_N}huH`_3M@6$Rk*wfE94x=7C7^gz;`9R%#=oDH^1f$@1rD$R{pjjR6r zLd&(%*Ax@tsSdzA?z;~ku!<O%E8B1RTKM>3spRDq6Niij4ySlyDU?@p1hPko5v5x0 z3JMFukjc86XOeINZy#?D7=EA=@PLH1?x6vio>~qCUwFCh9le?+Ii8Vnu6rVZOFH9` zdK=@7+4D{?A~sEKijrsFHW2lUQU8^N#Vr<iMj{LB7$B?g{rzK%su;J+dI_i3X%WGO z*t$$P+?)PLYs5yV6-+v{3P|ua!aL_S#39T+Q&r|o3K>O$E7<^L!^*>W0{u$q3=GNE zU<uTkX=?XbJyknu%OaCtZKcZy^<!qm$DDrLS`xQScUK)V;(Kq6Y@yu7I$1r`kMP1V znSJ=v>Twg4c@gbo8Kt}-l;X^B^AAMb<=aVSV0hf+oi|x}33O|laigw)z(+0}AF}7z z?E7o=9YiH-`@k-bUB9!kF%>QlL8k8o90*a4MY~4AWRiE!Q(>w(R&~l8gJKWHc%PKt zedysUT58n6mt&T0^`6eor<Jq(EKf$@h3OIh9_(*58ld)qptwMm&;f#c%66bC>79Cp zM%;Z`Bp9LM=zB^g@<t*uISqlV@J;xyttOtSBy-U{RhiwiA7+BIZP1}}zt_XCoa$DB zKRnG*T-CtR;lfzs4D%|e8~N@VKJ+jubnx#70hnW>*F4>-yDX|*Z^^KQnLA5Ru)>{% zD3Lt64~i)+);{uLits9{gkcmqe{Wy`-s3t8*2B-Fg4aXb$IRUkR^!dKcNs6a)^+_o z@w;|H$qp-#57^ZFHjnOFRg54BwrE-(BWi1Mnm8k4rAM+?9@SSB=0aiHYMTKQbbE<% z5JvREa~@^t7c5lV^8ld??99?eBSbFyX7XtQ;Wi&w_DTdad(I|iZ8wQl7s6zV_9#hZ zBJ#t>@gPi7vI0B6+qHr}&He%B>SMGZzGd}AMj<D5AakcUTR<^Le%8c!c~`g%mcOHt zceS{{`~{Bl_m4oatp*ENP)%-#7Q|B<)b(MOd^zee1M83IY*ny-HV1SH6*SBq49K>u zucb(HWA^e+MI$XJ;rP!&8}@mp1Hm92jEFtdD^^tWgQt2c%EsfqKm%dt!yPPG#ozyc zz3lnnP6Z3&*KmY_hz$oQd~z-E_iAIg!s$BuWY4$2rSw758U;iRd&9`)l}!hRDxj=` z*7c4ZP4nH|LL4ZEFs!oQS?JbprGKy~D2D~H4>A@E4azKDy!0vaa)%yiEEn&cz~bzv z|NG`|JvUed>c_Gzn;hROjb*~sQY~xtaW{-$y_;+vGVDZ<&x5@N|9%^FVoYHXzE2s5 zj%3}Y6TUw&G%Xaz9ce@z;LO@XmG`h5g&A?xFzRja{oO?8__iX_Jbrm!>zk_Wx`;es zMkckg3t!H3He%A9fPZW9V%rfJ;*N^S(<uGytayDV^l-=2`@Hq51)@6aSz%MX8TBRL z#0DV77XRI^&}##C-5YE%F10`-AH4c$%<Dg{-^qbkf2Sy2n`cKpbvTAb*8AiS-Ra<= z4+ofNoIZ?yH&D&w_Xgr77q5$sm6#X4MX2*pz|UnG&#RCtYj$JDE51`-W77($3CCt- zL9*!7+Lh0@%O&E_z)N`=mMO29UqV_y>dWo=u?L}!ae{dT+MmNWHyPs7(kLmAz#^W@ z_t(=OG6bBE0Fg#Y$(<PpqSIk^^h%*fs?QcdRk9`|up$Ry5AeD-G#X#;$3snE+8U#< zQu6VkX!!er=Kr*z*^C-=_g!o`I<EQS?8f$GkBpr6nRb4o{u3F)On;~}W8`=$Vn$n( zTmKU?+Tt)i10h4m8>T)Ql|WSmR7nkM<yRBWVML)co7Fv;I6E|~5Y$)>oyo)`qjbIL z`a)>Cb|X|8n=R_S=4*yB)IT}EcTMgLR+^nPewM_pGJSe#GMh@7m|JBY^N(68kS7jo z8)a@q`B#o{*OOxSns*(4#6C6cv^}I6cz`f4`Mv^T5Bby0LaExt-V+>!w5x1g*2UEm z6nw!x#X+NVRndCdBZ(h9PuU<r7|Eo&+W-3UG_kx)h34)$LR|;&Gq?uyInkyI^<%;} zg$kpe2g%91kURarOn;b!EQH0pf=`n2jO3gns$7D<_mwDn^lsS%@9*mry(lw+3hcvs zX1AiERj>`GO#<|5q9ZVO3t>RC6`JcpJ&t8z)3QO=O-ydv?xm!z*Lgl!w|sT(k-9%u z4OUcDnz23^@?BdUA)Z@3j@$+W_?9JJ#a87?RF<|N2p%ehWs;K0D38b4(L8dqiFOUl zHE0lSF{j7}(WyUIp%Ii;Z@cTmASEXF`h8!+#y;PIe{DpQ`6Q28x1B38=C$@}&lp<n zKuipZQtI%84p`==>;l@u!m%m#5J<&=UhP<*p(X6-{W$L8Mt-#L9wqf0VS$0(?;-oj z3}^z2C!k?obqx1H#}>rOMQaB<tQ?oy!j8ei+JYwFKt8Tniy))e5gSc=h6#BbR)HLp zts2~g1qAeX-#8T<)t?|=dt=H)<Nrn2TSi6sM}5E7(B0igD%~A|go1=9-6`GOAsr$i z($YwG!;nLFcXxLVXa4td?z5hE=Ou4vE%vp4`x~DfBT3dASwFCmPq@yH>NG~f%zR`B z5`?!Vys;9<_Fwv*W9sXRO8Svl|8KuGLTtiKW9Cy;m3f4u#weRYytm%Z-)S307Q>^W zE6qf(iJS!eXXR_gCQcAx#x7g)dA?q5tJQG6cx`8#9!_(Rl<Gb;Ciic7lfQ6C(%c@% zB42~Rgaom18h_E1Tx89Yv)Uxje(8Xv>Pp#Jb$`8yhj@y5a_)NGLp#OM99Y+hx~Mz? ztsqVt$N@Mu2yEYQ#ZlUt(biVQ1V#ZGJp;_s_eRZxRO{jr0C?P&vvrSzx5&c@F4CW% z3v~{Ih#S#_ZJ4kvoD?U*0Virfm-dnBc+zbZF2F0~nGs)}PjlA6AQc4!gu-7)H)D%) zBGgdrjd~l8hQI+M#*@Ja;beerC|eA=>Ne-})<3BQcYBPJ6dT`n?ktx44bmbre-2b4 z_ypR*h7A6cH0hW8ux&Si+dUZV5-;jf$vezn(ByOBOO^ouiK(rz>f{X&_}Svt_>2-H z-y|rD-DLD*N9=>%I2^tCH21M*qDb7uDx`KL)LHMl`z4s|Dr+&K%^j}{8<Dq<6gWnl z6QqSKcg-W&lMjiRZ`)$1c=lLtI6JQqpEg#x#SuIRiyfLweL*-EnjY$Ut}e(>{iEqp zTltyyZmy5RPD~VWiW)5=d)>b2we?G#8xiAjvH!wEVf+t{=w9ykIV+5*Tv2l`rnR=U zL;npj%`fX0OjNxvv!#lPN&u_`nmmE=GagXhUXGQEez|ee=y1MH>vMTQOCkLA$8;iw zuJZ`rcRSnOqKSw327hWs<xJLWia;VMI|SWBYh_wGvCq2KSX83nRVICCA-x_O!C6#Y zwVOj1iw1KW);xA#o!8~?jbJ2N5iv}G(MGCb%ZQ>95ls8v<kHT_ohyg1ehG>9F!;@> zLrzT_VMOtO{8<`i4qpaUwz3kIu&$oqH;v$S1Y!}r^Li0g_g#W|JAZ7~&o}!CA|!05 ze*ILUDCOG-(+v%@E&dV*XHc;x$D29>88zpq4=>d#E{DQy$3@rnbLD8T<|@1+eLaqV ztVjojX?c$@U!{+qWz1!fgk3e7woSvpu=1?5wA7!;ne3`{mIq|pjO)tU&5geQHCOMZ z+4aHt{`aG{%yijS4*!Fx^cBbkMm_FacW1v3b`g*?x(=CxWqAe8`;ID}-ncxZ<}FNm z#<2%Q54g7YOynY5e@!fx#j(N#d(D>*Q=TYeY8(4LCvaxz1bTYuvLBf*a|DX9Bka@b z3k+;HHz&;9gd23ZkhRV+G&|}$Ol$`8LBugfr*8MG6Q~eNn_ik+_r%$xQk48`IwIBc zuV{0<7~akA;Nkq-$^%3Z*_^VT=T>JKaXXL0Bx9%=YBO+hYvXZfo<53^+$r2i%3?9m zTiu3xWohf^)S?(yXv}hGU7l$pR4<)4L$<vTfkmu<WF<9676N-<9L06?4-ay~id)(+ zlT@J9=#^*}vje-!>F~%*`{$84lqcL+M#EOe+*=jauRac}Z{`6*)_<V?zjc#@N=5c! zTw+-oJ4+gk`hM?om=<TM<z5W+DAWbTT#QKb-DPkx3Bxz)*s$m1_V>B))|^I@a6_l| zP-G{@wE%2%;2-u)uw=Hp-nAvk;sm`eVLY|wFyyg&sMnIk<v8Pks%!RS>P_vGPF}gY z0rf+t{5JH_ny;Cj%lx*zg(xgqCbGSZ%LdnORlEwn?CPGT5$(t>H9#mi;G5JtmMXQd z8YwX!0a@CxP@@-c;Y`>Zt$7TG6c>T%2D!8bqPi(D-Tc^C?WzMrzjP7tq~Dz?8m;dJ zqJ`A>sdtePeT&p__XhxkEu)wEdy{^G8!mdrethQIu)-dE+4VcNIRODbnWykYs@yV( z1ninWxa5gZ17HW7=7`{o8aV4yUkv+Div6hb6S-4t7iA0&j@r#g3!jd+y^GQ%EiyRB zq9pv5QEM5!mE8C95lBESp5Drc*!U*{X=*Oqz<hb!_W1M)#fG@+e1t0xgIAC1o^&o` z;Pb|-p-?UoFtSHpVk@d1@h_PA@1-Hbs`s5(>)j+$2-<422h}wCeYrFy`3FqET&b@a zHqmTx&Uc+78BnM&P!7*kZr5VvU?Xp9YwVwc%f-$6LPqjGlohJW37U4YlJEKMq#H)C z0onF~*oRd}>4mtMRpmyxY6_d<9By)WfPxPQtnV0u|LIq_w#yo4viETR(*0P)-wdg5 zI-?`L28~)~Csc1Q+tl-lt?O5t>$6ULt7m7KM=9I-K;vC6b<K0(msjL#qFjt`30NV? z8CQIQ9rY9}e%BeNN`+O5(J2iP#>1Pg5~R*LCz!T~Hi%ts&s+Ag`XE_8(Hq@z>#)ct zB!$bQ=LZ`T6S-~K=l<bAFgP&y{H~)d_VAGIyQLk3(tSDbuv^Z-al)guW6M|9b0=xO z!9GiHyZC<Qagof_JTGdBP!BkWl)3-mpGB)HSb%c`z0^q5RSRkmc!8IGwAj2<=v$wR zlBF$s1-?=W#X_}w;}cRN>YI@o(-y~Pa$ZVS+o%&NS}7<a^gSkjO{`9UEWAa&Pz(r8 zxRAjkT_ZOy3p!u&t}eHd%2_KJ?-%(rQd;iwxL~|<JL?O0AM8;1s77Gmn<VK*?W-Gc z9qs3EWaos4nCp1H&eT6d&WZ~Op@a3HL>6Xxkzw9o;*A|SwQSh9N1D9Z5Qp`DLTSgD zz!?y>b<$37{Vcz!xp_`*_gk>Cj!w(iOq^?8fu))3%PY;UMu9RU@vXtH8<*3o-or?5 zDkJg58wM1`M&Bp?)~itwLDzq>oV?ID6L8}af$Z#IC6#}*Ey5lz$>%2>c=$R&ZO45& zpF%l=lC>DF*3E4u-E2ACD}q+}`Og%u*ZsOX%th;ha4yTg!6EuPLCEJCJHq|_`dulM zN`+XIRy)PHPF#wg#`W=$rD4PA!d@12syHsSNiSMwmI8}(M1j&&ACFtnDZ8xfTUH@X zO2U$bx!EI)lrZw-$j^B2aYgDBS-+en*Ly(4Q8w}7uSm8gQ)EHvl}QPO+@0Sm6|C&| zQ5O~U^}_W~W~JjsqTN@WiFpacDf~bZa}rh0zmRx!2g^hg1A-(yTW+wFFs)LiXfY-G zqbRRBkIg)1pa-nNF9P-f4Yj4%1Fu1E1t`S4zAnFd8LI->NEiQjJ}Ms{T&Xd+8k-7^ z84c(YYnP{oO}8ZH2nnGNP+>Pye01;;ySkb(YGJB}GvNH+6>o6q|61`XFC~k-)w+E- zJDj{(c4LuoTzRwB26~SJt+vBJ=D&7xO;>fFhms!T<=$PQL5v(YDSwH<{fMTn1prwe zF!geX_w3evE<-=R_dO|=6t`&WzvnBYueI74>~tzl5Z-MWuX(bZ=6-DN(arZ`-8$os zzOrO#qVh2~VK#Mlfje&+_?-M>_(s8l*!n%Xgme2&IaLK@)F)+Nxt6u=P=7mcb3<t( zgXY1=!pPG8qnS+{^*M&v+>3(&a|0{|OEU1y<q~6AV$V&thl64_R&s*#BrOceKo|_! zrCS1hKmgbzOyP0N+k4CP#*d$}37sL_vi~T|bpDlLG$#&ZI`No0#FCC?RW%F@ddPm) zhBf|%5^_e}C(V~qgN6*67&zbDgUN<dYk@RhY$ePmu_F}2ZyMr6P+J87Nm(81PTy$N zE=cg-K7Aq(1r~Fg2^*Fe54>lxg-%gWpK~oC^Qh)3{jZt9r+C8iBMMMJ3^I#jHC=TP z<_@;WW7`Iu!U*MqW&?f_$8hI%i$KU~JYkGty?%AEdK8fWmD8YJncQylf}<(!Wcc4W z*}X;i-0jk`4-Z)yMi*@*#zCMK_yExgm)9=X@eBtm;7>voc)j4ro`)|rc4SHbDdzVp z1;Ik#IgdD0H>OC~0WTgKX836E5he<OTgVZrr^Bpn7k^D{O3`^V+b#qZOQUnyNuKxm zW64I3No%KEsqvn*RjuTP>?^X)_2B*$V7c>-uSokA<@+L52-_sDql#qiPK-%A`j<54 z@b~uHIhHp}ZJ}}#a#0ZWD4FSc<eSIRG0Ifds{QXqY0RSx(2Me(<{Lty(WA!zqQq<$ zEB%Hs)u0OZ^ccRP)fRNZBtj4St+e?{x0)S}ud=Dad*;JkYs#`#HEpZvV09XPM0Ig! z5v&~@bPjXkNf{aa6&%H#9U2`7nmdw}lVjqCUVTm%^+c<)AnVyVoR7dK@xKr}e*NC@ z;dK%<?k6>^q?D2zHg(r}>wCCP3UMEjn3$OA_U2|XOw1S(A#>JMzau>x&oeRJ8NT(= zg}IGT4ue>hLPg0m0g&s+N&iVgOljU%-mG#NuORr*K64lTy3Hx<Tf^r>h4^0yKbq@_ zYTezyGYdb`OU1u`KE`Q0yuL`7zweXft*h-yOAo@@G$=lRRS!^zxnaB@VS&Tr={UE$ z&{ci6D+3JSk>h@nXt5&@l6H&ySIxVOBB<{=^G&k@dR9~}9^Drz`&RA_#=d=wP|F~i zNDEI+HZKmda|-Ds!CanQeD{;)E};ze7DT2^7>!kOEHr6((6+EZ*4EbHx~VSaW{;+0 zw2|X1%WopBb9EJjfxra?$U3P`<HE83QU^J>ydl_^i+i3KKH-&<2yzIyr@u^QcYAlE z5qJ1awaKOfF09c%$m6&WauOP47iwwAT^~ZDg+27W+!xhPLsB}O!$@JpbPSoytyy;x zt9;8R*P3?ab$_$4>DUst%jIic`!RfO2w_0)L!Y2o-#ayf8FN|HEBE?%a3(lN9w&yB z^4P_#-*1YC_oRlq#*_-*Z$=j%-{t3c$<c>%m0(Uj&IvkgH3jx)47;KV2qG~C?p`OC ziR@O|TKb7K(_L@<r&c$jI5v*m<%^0c%Em|a|2bf~EYn4kS#6}ivQT-}NW)ySclQ@t z)lH;8|H;gABMdKik<a1#k>b_E$9W@tI$b7iBSBgGVuWRsE@C?Ns_Pc#xPC+8s0(lN z^W4}7?2xG^(2`dMe#i;H1pa#=kA5Quj#WKR25k|&BH+}iP+aY;Gy#=B4psO7XnndE zkP<f;reQqbuCTq4mEQ{oXx>aBC^oW?^|K5MjIx0OlC|x=Fmu-$t2=Lpi4jrphgdlY zx_2>Csc34@JL%Bf33%A^R30l2ak_i`m9$(TvY@lNZHwUR@I+8B2=BFK7Qf<u^n38m zi9K<sEa6z4BRIbjQTh?>oGD6OqQUn5;2wBttd#bKy;EnIYzzk)fdFV&k!ttQKRzQs zvM;QBxt+)vf}ClZ!6vDlTqV*+Vv3*5Y6sBd1{n1G)v!Cj>iqb8&RQx+VkbEY4{$C& zS<#0H4LM)f0Fpe0l}JZ+<UfSGT8k}tN&^fgB&8gkf#{Pq-n?nVp-QtMDFQ?aY9BIu z5|Fi4Zm?Mjr=$LS*uMFA%9+nNoik(omi(iQ8I=pZ1yXX`1w9dwTwwcbqDgPtRF&Xz zIxi`L8o-%XqbCT!PPaPg4(9oYjVY71o`ZD?X3=!;0a+Ip#F!q`r_cB!Rg@c|$p+0B zEdIA*iP4ol7u1s(oT=8u;ox68SN72=A3yAm48G`ZADPc!@(2unZzjp&5DJ+$`M}m} zPds!lv)b33S+Lh$gb;J(opj-Ye=8W56Q_F3lv8i<vO1$z;p}=kZW<vYhraZ|(chMg znz}dTk8iwFAIGfmLI#gYQ9cBb{Zgj+Q|rUzJJD*>&x$J0CdwL;v6+eQR=?{AD+%`t zz%|Mew48%5Vle_UT_r@&K#JvU@yGo&3FPijz3{b{TLu@mW`|uDF%s8>>B*qw_b)w| zQI!}OO9+e#iUb1ua#C==66)^1HBaDr{oyu?e5OaZf3`R135<*D+5j${c({Bd`7@tq zI5?dgu*ig0>{B4P=S%nwP(e>xB`}=d}GrJ@_~v*tBPYL9PKPN5Z?Fu;INd%`8N; zLgB}^?FfIjWbBAkdQL4BS=-1;X}`nc=H~Qqp<P|n4?MC@dCMMvXaWHzp!irGe*OCG z+XfgivpEcb;v8;SN53+NN^4rc$XfT^EdD*PdNmes%7<AmF%n+pG2)7}^k31t1?H68 zM|kTB!Oyjq2tPFi{&vB*cPPhl7R`y<rl8v|YHH)t)2uglV<#N!{vn}_Y)1tOG$2t~ zWNQany=ND4F%DD8hIkai=2r#=D@LDeolK&qp&!{)ozg+y@$6ZEY^sK#eZ4OG=&c(s zgxlO)s=I;wp&5p8a!ArTo&ZexnK``q9`F~NIk8_?I;8Rxuju5bgV7spouz;tdQ(%= zH*Y%;<8<KR7-Z+;=?w|)q(6UA`(jExo$+L}gsSroiibxps;Q$9)$aQ^C@3hBo`XO1 z?mS+Fh4$lY?o9l4)JeXquAE9-dCYWH)rfA7n5r(K+W4srG0iXBv1poIP3KouW!rYo zB>_&qXBlytXq-257n-y#3Kqi_nSQ6Gqo4j~Tu~51dD#0%3~sy{=c2I^%?<VPZu)$g z_c_v8j9kQy^%v)<ga&Pyz?Hu)@AIrnP5_U3p0U+c^=$Wd=Re>97%b<<Mt9hg>=rDR zPIR=dqQD96vp);b$$2|wKlu!6cE>7W|MJr2O!mVr2@}Y)r!#MuQ>P(9EEUB$)VCi4 z0{r%V)gS^fYr^icUk$GwF=6muzv;A(yw<4X6UaLM>jh9B8$BaMmdt929S9~>01Pqt zMb82K*hQl@c)q1sBWKO|{1%dUYBz0<c^oS;@kZP_Y(?os&m-XbamwkqfG-(4r2yPR zH!_{b(0%1XMCy$K*GoO2Y7=>n^{OltL?w7T4jThK`m;eyoBvzFu!cw`rtEt;B<9<| zm?B>XvPs<}P3I$1R+Lz3cFpjcv}DWp+;Z8kcAoh5(5r8)?!%>@6CCa;h>W#wAC7?i z<u;_dQWQ!s*=6a9W<>Q3*@wlgEz;96I#!?v<nA530u4H}UT!3jw$uLGu^0?wJKFuZ zj&N?i4|RZ;+N}Rtke;f<Jt!!*-bh!)%s@p3l>BkMU-7nE<?Wk@EE0*4lQa`FqGhVT z)nWzE@?sqPDi9dCgBpIf;&j2mq@QL1foX^r)>VZxLl^M(X!DQ_6&)xlZLC>{lrWb6 zoIS7ppHZkyVnW?yIU&YUbu7Z;cu*v2s$<lFm25QI<2g^!J7GiyY8A#$IO8j!hXcZW zSQlz@(?m=pKS%#)A9)ogBL$wL<2qK6fKly;431$LTF9DKaAX5C7PF!w;sw)u>&lhY zGjvY@9T!aWNQ$c&X`K1P`7M^#=l_|EnK#xxGi%P?G5At3;o2YE4ah%T^_$q~DZe(I z)wG?V3$T^xdCN{fm}3LO7a#ismAo>#ox>OvScSFc8Hs@Nc_dc-OYT~5BXe>rnGO2J zVWH6V2)H)Kk%Y?_0m-6}cH~?}c&`dm)2sU!#b6TE3I-YBft{|6-R5O%5jP9K|B_zW zRMeD|u-wj8W2#IbpN1LeI4K9Bc|Z58cM`7)lw`hFS2su(^h3+f&;Rc_nB56KzMLat zg-23aQ2}B2ts4{?iZo3j5&DcvhmifIu?|+jUfWP-GIC`-zPK3S_foB*F&7}d;2T)Z zzAX5Hw)~VK!s+HgWtFz{Gc_qDdi!gwKts;Pv?azUWk_-;lE;#Wqth7^iO^r1(?t5( zMv;m6$!H}DWTYLe0LX@{wE}vqI(7G}uNR+oODl<}6}@l*#doW-t_`(1xb7X|=&q3l zKgw4hXM8-$k11TRZ(V!KXPVmg!AKD%6d-Vg&khSrVQ-O?KBl8H(|CSFZPeA1SNe#X zecXi}hB_}d9(_(i%Ms+NjlmJf#}=6kP;c2fKi)_yIHNya4@fyHp#P#AfQxX<dLHmX zLD=2CPM9NMQlR;<{-<Zds|_yRaSZ`VqQRnC8~w2Dj{rv+$ReL5ahqU<a`hJHCk2kb z1!*#oph^?s7Y0J=<C`~Ho56K{l~nZ!7kzlaX(`M!l$|1oN|vJ`i@e`dvU}iJG*uUq zP<}53r>a?uPk$gD<mx~99azxk1;TEs6o>OFep~#7dP5dbbkOfc-k2@ucR;3`E@`o{ zuU;G2bNXX1*Olw+M~^d@<b>y&k(~U_E_6`l=T%ay?J@kGdsZnc{Ld8Dj)vO${$=yR z7(<5l(r~}t4!phJ6|nE^{jJMdS=d9^vf{)V4xif{*xD+(EO?Y$Bb=;JOD$V10Lq9M z*#A@vF}Pr{IlH1*rfO!m?2??C(4W@5hJCE+Nhn{UB{RKN-U$}!0yEDsd2PbxL3gB< zEh<MNhg{Aq(RI+VCpS@dd{b;xfRPc*)iSoHht%R<50|Bb*zN$(1d0T?TY18K#uu<h zdRPdM3wqQnoVg6a$@18Yu(NHt)1Oj)9a}<$iQIc9;|rJ#gyB*k7VMB_4dT<_hX;S5 z*qy1GZori`buakMaPH<Cag6hCM{&$C7(OK8t##`_xUcn3ScTQm<D;>Ci3-0X+%9Qg zs{{2QacSS`3PLGs->#Ou>in;G>f0Wwx7v?`w56Fz$hC=Ezdfg_rsseCw=AAnZ6njg zKUw?QOX8Y8?~Ai)Iq*bYZXfUrQV;fChn3CZc6g?}4(lJc1$$%;w4yIj_+z-!LmHpf zih6%-@@AXE6Gf-S@O`mIRX@{@n}h>5nZ0$Ycrt5fd)Oo^6VxYtLm<I|44$t;KmKQL z_an-tPLR*oKH=s9V<Ax<pb2QIpy>KUwPcPScei<<c_?ysLjZgS6-1EKkdZfTi!_iv zQJXK1&?#&IKo={t28sNX>c;|yX1a}qUg>`df1Hjif;zz@=2s5$Ls9%=J7P?LL``DY z5OUx2Zp6cgWA<_g$tbyUj<q0GF1~N>wcU8RY;B~GX;;w(5?^};YxDuMn8qY6jd0mt z2lGiZ1hKaIh~99_yW;ZAJIpZ;V-YG?b1Rv1nibs@oWri-J1!y1^*A!L0loj~YPdF( zB=G*v1eHKHOwX5|=z5Ay^75HuNTx987IZ<*`ptUHQ$CkarHd~YvRb-)Cev=GzBMjV z?kF`J`QLGI^iix}an_;q2f|g^QG~P0e@aR<e_`%^Zc?x&2fm}|X6am$sQY)l*!Obq zU>JgkInp`eOuzeBTr9GxM!WX=>`SBl#Y&?mckaCOnn38kv*oxyn1D8=bxV4gq$r`s zJ*=7P)YH@R{(dVC@m&Ev&Bi|%hyos!3N)eb0d?Qs-<Q&}&6RZ2@_ovgS_$-faY9Hm z!Elg~L1a`)XIA?D_9IqaegV2o_f19n<2x8KCp7x{tFA*QA~T62tte^)oF-ppac9O_ zBWi=s&AV-L#=kQ=GO}w>`A_m6q-`mi7c*d7U0jl%u>nu3?2w+J0-7p&B(n6f?^bq1 z^3kwbJcJRmvibrnf3F)p7e@Lm7X^_oPkWo=7h8=s+FWjD3&DSC>?Cg{a^ZG%u8-o3 z=t8$v8dl%0iTffzjWM`E?H5}RbR5qK8Db+C3fWlqa<^b)|Imr9L^&Dk%*#QGGe5h^ zm`!#!COoa&Ws!IBivmk<DFY5FBqH4NH}++0xSt?E2@n$AtgHJZHuxh}wb5lQw}w{l zU|%1isZ+iuScU!kF<{L8G#})M_l*V1j|zn7dxS`|{rF)b))hBB;rmJtLUGi|gdt;> zPjttPmF-vDM!SZ9NU{&itm)vSPV`*g1*BWmpFQ-==#ysSwB^4b%Cq4@pUusw>6w~T zHQZ&5{l9(IR)C=kup{7T{?+3s(zinRohkJQ68631HF^`j2EIKQm1BA@jOdh3GB8|U z#AQstNh|3H%4?zF-TxWiwaLBjHULGzdj}KR<SMZDO`d8|OezvPwtu0f2swuagb%V+ z7Z-no?rJ)&S&U9^BBR$;g!eUzZY~G6XWGENrc#nrzbWv&s|Zol1J3kB`FEBRfD~Dv zL7>xdk5flf2c#2t^)--#0+3&_3vzFBq<xm7xwxvG2iEs2c~9Es(L%m}2jTyoE``1r zuI_E)Qvy3tg!$6TJp-CJ+xo;8Mgdj@XPwG~vn#wH=OD`dpq5;5iUv5K`CX-z6Bm(| z)9euBvdo(+YgB}foYQ{VCXw`x@>bfj13%4q4^6Sj%kis{Q`M+D3$}N%&A%B6YsD=C z>5~O&^r86*)C3}gTc${4g4rjc2cyU&sP<Zxe)a!rqp1$4WH;<2ggCE~QS|*AG&kxJ zwWgALh_mZl^^VLliw7i^n~1_PQv*fm_V>NncoR3BV-{`|w)M#a0#oHF#fj3%dw4@P zc6Fi`U9DTOp>;U^WR|~r=L?GZc)pUe29lyzK`T!WNmSzS3FDOCU%>axUuS}VnA1P) zjE#Ux)FFQ#F0%Wg|0-X3v4<#rFLnrN9+O*+tG<y+psWqlk_)CF5s=yoN+8(bU<2dl znI=Wco`#sairP4fTIJaU`9I8<qqwp765kX^nhLJF&srV(785+YH~IEI@~Neudj<sN zVe&ny+975Lr|?qR_eU#`AmFuUb_?(C9^Xof`{BP7WHyIzHiOcB(~~ZQ4vY^|PJIg` zT<F!L*u@#<=$D&$k3ZtGL}2uA%a$Uss`>HSp^!9SFYIkFImrM>g~i~qN2xSJg9PV^ zg#~WitIWm}z`0k9gUvhLyas{tJ733s6~RqD`G&|BFLx356#h5u0FBSt!^Fx{3O`%2 z^=9~ZTGCTn|J+FX?QM{C`cG$;9HNzmYf7EEw5sp-tfi5>j_AoIL!%GOn@{SZfMj|a z%p0>(>*h<@n;wx@Y~;J`4fQy5jUA(0T%bIP<B&$}kZ5wm4P7R1MC$U0p~ePqLOG1p zMfnkXB{1(Y$$AY#*{tp_mA<YU*^~UYE6%Z29#s*B%LaxeLkZpvq>?XWig|OI_TxkV zjE2cm71)nAL$E&jCe54aDTgLelAmc|u&TN@Ed~<P{OO(HxZPFuYvQ^v1Rb8Guu&HR zj>{)0JS(N?aD~Om*E3qvyu!cv`GhcKgYyMOmHC|(BmHd#hIIL0p@Uzb2lF;5QUvFX zn&(;E$vK(xFK6f#NvK7M|M}A|KPD-sBO;utQ}tTrr1&l~G-UWIud9&i+&B<7^kaD1 z#idDSeB)TsT1`a%>50+D>lvf@3-@`xbw`ke|C3GxZMmoeP-FK<hD9wF)RRZwxY64m zq&ly0L5l{7O%gPfg~Grt7`d`BT@ug>Y*;O^tnQ1x=MLdSarXgU+5WApVTgj7TCQLR zE`_NUTwutPX6Of05SQ@dTX(Ry?^8HF4d3R`$jAtsGM<t#2G`NX5gHj?w(Nb3T`*jZ zXR9G)^qSd<F2eMde<-s)+sf}*KbNg5lzm1Z<99q5;i>Txl<8<*KPYmOyC~T1uyEI{ zPy{IwJ_`xKO37!?mD2&~lOpFnK~W2$7q5XZX14QR<+XO0twr+p5TZLVNRCMt4#Vn& zX1wrLfivEL%Js`c8v-lpYgHWE$VmU-A>GR~xX(0D1r;6-FOS^7?p60;pq)Di*5@Ht zYfi28domdU_%nGFclwfLFDx(9Ly-OVq$Jg*l$;$E$NIrA<VNUU>9EH|&)s3t2*2GN znl9-u@!m0NZK9El#j@iU$|J5x-v~@V_V1e;>>W4~89uj(vA=Ml0#P+Z={zGKNsSvj z`WKFlKeKx(NG%GmozMDzc0M_tdBjSAXik%GQn_bO9UI{Mia*EA-v)7*;6J70$!$X- zML_hrR6lHCYcB)|`|C_73Gv=3VTzNC`#RfYH_*nt7EFzwoui}isq!-TCPgH<XUd$F ziW~i1(WC+IIc+(E#(SU-8Crm&9)j${pnTHvD1w?40(|r`l+y8<HwnNATCtSk8^GR6 z0lgQy0eNkQeMx>K4<1e4`&V_^II7cupC!nSBv|=lUq!_SCeoaR`X1~5K-DM(>k?Xc z7-E`#);1(7E2@pq^`|+%)Di+Fd&k|CD*vrqe@Wy|{A*LFs`Khe_a=bQG1ix8i!=u} z8IYuT?TneH#a#>S<(;fW1|-!uBWY&D?!VtAq=@kM>zBCk5E+OJ@mdYDZsLPpn58T& zu?7b*3{x%hDu~`|K_}HbwigVH;mr-9Y|dP-Ee+Y@iEvTK00|Oa$!av;5Ru6Qx^`)8 zJ%Q2bB=r`ujhYq1?6MFk`X&gZWDt?zpBmL=ct5H212c}THz#b+1!zTarq&B(xcWp> zP~6vxQ7<6}7(STXZ4`^)Vt+9R>>K2^;mkxYg0Oh87XMBCS9euu1vXg$iS@Oo#>k)m zKfeiM+kqpqIJzdeUjkpYn>3+O3@P3*yQTP*2y$zoaOftPJQgs^PI!8`mnA>ra=ysM zXLcD&CDOs^-y$R*UklUX+r8mupLcOtF;lkw?eUy%w%5HMO`L!aVBk3JeWW3VjGvj! z!hX09ONxLo3qT`2v{g|>!2+FAy9ZxxOoR{q<_CKaZ5B)fCjE6IdO(NoV}mcRq9zH_ zigT|JXtwUrJoWvgs;w1Tz0N_HfemDXG$SE=N<QT+*IdycVA$V^>2^>|gI?pCEj1{% z+z|u>Iy=I)%ket?SGqN8EpagtH0`Fi$SnQ6$K}r0J(C?|@47KM#r3mOGNg9<9z=k5 z^);kPDb`H1+YW!|VKhkEXDsvVX3@mTdzrA7rIzqs>g_p4!%E~cZnp#MjT3c6{g(kQ zAR3_JtfXFC(oxmX2`keXL<EKhhl$Q@yBK~OuE}|Gx-NcgeT6>Zy?F0WNs|bh76q6H z`95yAj95Nj#92EY&#OidG3u)7>P9a^U)HUx`<TMS2`w6Pzh$i(*tZ~>gx<=@b$`Sl zOU0%y{Mciorq}l23~%)Ccwcg>So>>x8>T_K5t1;aWJV3*4FYf=`+Hk5tOhqiKf7rm z;<sN1R-sO_%F>1uv={$k^wze2<RH#cLl=vl!MOXVBDcPZDmY9xK*-$>o!W*CBD2+p zI^JMC$8O2<zN$>80c~EM82n$>e{z)K<AA)9QWCRf#QJB&4+;u30Y({mu(gt_S%8N{ zfnpye>aBpdly?XL4>$Mt{4_H_1L74<Fv}~9iqbm`(2b~M@JWUlc<fxFi@w!+uqvY{ zEfcA!`EY@4kckl=BTTYRM+;@(pNu5noZw0i92=I^ooT0+(GZvMktH#~TW_ks2$#Ci zc#Ix}H+r4^rE6zWMU<bk395E+`u$P;tR+C42ZM4ri6^wY1CIoG`%75*Z2wZ&gQ~H2 zJ{5KT@QGIn7#P5E)S%}agyLOqiW>LSHR5!!u!n`<E)X3KAx*8sRZM_Xf}z(%TL^5c zDOIx}1VZhD13#VV#ONrKsJ|K8Y-mO}G1dy2^tq;pn*G9lC+d2bIBakmfkU(Oo(TdA zVy`c}J}qly*zdZ$5SO1euOI=rU*oSbO$<5eVTib$fB#0cXhGo595e^7&&oQ2|GQ+; z1K)`{yxAdVS7@)QYUF_EZ=NBThZt;;FR2U!NJ6`HDz~0wF4vnJm(Ye=+#J87I9$GH zz8>NwZePB2`;O9iNAqS<pa+vvwl@J^<vDkJ%@ErmrWys{UaY&!_vU<JN91y$E_t4u z(R?y}izX8=qUlqIYJ+znZ4zvqS%Y>&)rjkyiFIZB9Q5FEp{&4ZHzcaqzC=w*Jfc{A zTggN{RDTNYikK8il;Fpn@+b51m%%QDtWiy;$4QCPM;FQPwyBu0i6&m22vqBsLc6W2 z@Hk95;r~MPZfzXys}DD6mU_Kc$+EHbI$iGv%A70TB|4kEf2;nw@iCE1@~uL^Dm=OB z6V2a>ccm@%<dIZUCMDe;sGr^t(21?1!Qn}W066C@<ani3MJq+Ji4u;=;3}LM&!5<d z{#Cfjs~bHgbAQq~#G@{FMTS}70(?9UBseN_RIn$uFaV?x{24^*BFZ<$JOtnE4l{c{ zWhe<AFsCGk)*f;XrwWb%jby-xrqZ|S&*^|<h?DOWdBJ0+!~!v0o<<9)LWekd2L_;J za`dy9F8ANyPG0)T-Puyof8z52RNPGo0PjChdz7aJCQ-M}V@ln05R<L$#k6pXNQ8ob zmr0?G4`gBdJ;t{`f;`6l)PR5yJ;5Cun+fr2rJ+y37Yc-aci&$r>`ROL2Glzcgt|Y! z34pmPW{)nLGD){FQC~F?0r)lNyb9WO6cbqAhxdS*$i-#`V|h@iXePv9IxK8~*!i-` z>rOwBh=hd>oDp?^EmH&Ey&TWMz>0Q~ZhJo&?=!&24j4w?iT`1oyZis%<fQG5hMoCB z<#U4K$Oknor<3N<ufpA_<n%beC>3jWtInP)GSAJy{Ky2K5<r79_9PAmb&fZv!?ISl zj~$R%T@*8Naqc_BwM7J?v-B?{+-V}86!Igeza#w9PYolN_8T345fc#y3={7pdWbrn z-stNHW2K#;J;HtL<SzAv^LSY8rH!L2TSG#YEICc9)_aBwFZy7oc2=dAlu;qL3Bmp~ zKx&AQ6)BO{3gwBK`pv7jDzGPDV1B!A4VTrlJTE{0W`(~mW*J*q<Nam?oLUUI1QoKx z3(0TAR)nX!GYHK3hmfp>BO_}i%x}LKjUKA|A4_>Fa)?9DSGuhc6}FvrohWr}9LB{b zAHUZQ!WZzrvD!8(pertc_au&$lF}9?BO~ucE%)!Bpl=kF{7r7_ipjiIiE6;|!r1() zwaC^|%GU&5SZ66-O1`p2CZN2zkH7VNQ1~mwJpmn)Ze+V>uw%hr+^nyDAxGsM`rsxt zi_z@zzf@=TYwX!nCdRPaf)xP~Q6v%ql)d#_3I@;Ap?Dy<d8)~J!GJLq2;3!wN0NTq z6Ely-A4@tX>|)HFx}bgCv#}@Muc|3gkQC}Nf|Yh&aWTS*_F?(i53{q2jCL*|!}nx2 zqE6f4J&0F)U5*Hgg6s&3nxU2Cx!$NpRT8CHSRu>Eue-MkzBRr9G*5E3u>b`z=CQNF zGKT@N_)iB)I)7J)_(&TzUI)u~1{Jnq_-6{3-qeFTo(qAmDGl&?R%U|MHrII=!@04J z3F^;wKHjTE-Me<jryo0u(bIp_)55+R`Jr9X{wOJS+kHaBBz_x1R%NfJm$CVd`81xA zA^`)$|1FVYNL4xl$DCS}%F$qZtoE9>%zt12uW2~N>^5qh<Zf)&0YekH!EA-116KD* zmcV52t^)U7P2vDZ$;ygLU{Xdq|9F4=z}L~6%yyOm^8<6w+4vM*&B1h`;K-2g4`cc^ zh$v-OS=wDfKr{6#6`nwcO_Vu{A&WyMO#49qW;9>!ArgH_8u}3><&Vd<irCcR7*KB* zPT-=SE-t-ripi-4X7sL>bwh>S0Sx}<LV3r1iG1~-dH*{`lV41Esj&*rY>0TPN)B_B zI>BNcdiG4>e3laG<EcprV!Y~<jb_q|B)7ZIKYjBHCTss*zihjz+((=>aX5FHHS9Kl z{qZ+Dj2bat^R@@i=PcC+By!&wMhIhsOH_c$=hA)BXLjyi?2|Wt$2}a4c9^phLC^h` z{e0VrZXhobyp%P;CNxc>gJFFj?6?0XF7j~p?S98A*#A>y>?m4kb1_L&{RasVHvjw2 z`@1n_%&Ofj6&P`Bo~+q=GBu}=XX?@34uU;vtPgcNnvQoato+U?)j2ZLD^&n6DYVZK zGK<2Lypd`DNPSPZQbTr!sUPX7fTBl6wLPb9e3fO;_ph3})SCsTpS9UpC|OL9m_d4B z%Rx2QJR{<+6*CA(|HkZZNtg`1L$gt*F?^4@3qA4~0Y&52o5S-9j7kn@!o-zH#Mkam ze$4a`Rr<;?po;fYKe+eR88nLklAHFs3C?F8W^~Da|0(M&K!TwX?q<!)Brr2;c!Gjd zkr^{^N4AyRl7&1c_F`S?<rm|R@iXq1r!$v-r_VCCeobhJRtJ!4r!!^y3qg`nj60L@ zYLXl1N8TT*gvOJS3~yPEIWuR@ttijj8?H78@Z2wAxE-pGQk0`*2Jc>!(9+bXoN9q4 zQ@}Cm>!p=@l^&pg<&P+Otm)DjEgD9%gi$JXe{JsH;AU5Il83o0h@Amo95O+cN@FW7 zqLM3zaFlI3;q)5{=bV2wxQxR`es&RO=|bed_<j(f`LCioQWFe|ug?5E7u3bE2OP#{ z26pk*p_O|aTBL|T|71zS`V#Tg;s!ncvj-6oOPF+bc_~~#$h+aKEIL;e?=y~eBN=zY z{^R>7T|E_49$;Ltu-{;ivn}#c$U;Q*>Je@DY2r(_Hyf-_sp}K#gB|MSMo0pV3k67W zLTrDvaLK!UpiNl-;DTK$U>*nXi~Y3m$EsVztP$*$04?mJJMvb0Z66`=W^3GM3mo(p zu@dWa&GHt(Q6%Oyt%z!GbCb+5N>_1p4wC46ceWFL$X>e>3X8>$cKeYIbJ|mXhju@M zsqjH~$&LAAK^fqPM_B337wX8{!e8gMuHD8IZ8xg9<i0&dx>@p@x;<*F2|oFZBgPBC zk2bq%sm)dV(`gH}Li-&D?5=`YRQ4f1SLJkV6A936dj0F~GA`zKUYBcs+DN9_wDYa? z`T9(?o`1h4g{IKBq!{i~l}Fs4nFlJ)U=tw?9T9}%FZFQsaI^$8*OmLo?g}9sv<zLJ zL)K8r85kJR`|C|0N}e(7-wj?4H4v>*y&iavSJeV1Ok~mTAt#OJ?y~#4yVu=1X#xth z=c5@Sjw5_?@;z)DP3;RW8%|SZ_AIg(qf#pupLBU1@bbJ{Nv4^|eUWtmWhb;zUVa*` z-oVmp3_*F*TGt$C&)Z`kZx*}9-LmsMVU@Y%@X%0M7aVaH`rM%v5OHf!sc_I5^n&BN z^qXH#FyHz{?$7uc;=)+!ZkV;5*%oG$CqY9)+jg&iXggV2zx6_BPvf=3`<@~tSyWIU z3rHsW!(azJZ1G-I96LKpJ(TfTOMJZiC=PRrv+s8J<RrSh^>Q$CojxwAItRHQSRQPW z_4jKwzu>wI^~)0*{-hzZY~9`_FzDf=6$r8=Tb@NMtkDA`F`E@<^sY!Qj(*-899Y7g zzO@k9(JicUaRE;)zo7iX{Yf{|_u8YP9Ck~P$AsHa9XaalHC=hy18H|K!r%Z&KnoAK z`mhy_IWunPjn&{0>K^g(+R~**u?ib$BGU{$RqtjNB}BNWnu=&8ll|iO8b5Fx{DFRI zAr72_b#uWNR5+aq(7*2b&}zz`plso`)BpU)sU|~ft@4ImDkaK^i+;b~!?ch7Zs>ri zJQ@u~G_w}i+>C-)n;_e!qvBSxj|h#kKyc#N+UwUde^_8<=X=$hubn)NC#3|HCwe^- zc68l}k9D3n(r^W?Db4^&-dq}BH@I4h(1{1-Vq84HrDgqL4n2N+)dt<-f4?0_z}OU* zNJXkGOu(9PScs`33|9@zgaa1ReTMzb*^-x4i#i=1->|dC(u9%8!b9gMs6Op~{a-J@ zusU|CqBlMQA3{qC38jQN8zk9cH&^~-ejz-yn`vSl?#q=djf6%G#F1(#Am4t+WP$R> zEC43v=JJL_d7NzMxO`W&F1mg@|2blO>(@dG@nGH9VOU>Hve8TKnl!4!G4^cLk~mA{ zVY`rK9+iuX5KGSEd5fXAdPgflzHlvl3)%+jR_SVhTsxmgZB61gww%K_L|}ZI))V}E z{T?Y_6S{1YA|b@wqIRR<&Tz>$_HAkebM(v9mau)DN#%7F@x^@W8&mR(_I)^_ZM<GC zZLcYt=qKrt4=P$tz_!WkjCWQ0be#0pc24w!Gkz(DPO&jamj=J_0INT5eoZ~v3?F3x z9ddBk9<2^?5KE?RaHtTvD&Fpf`d4RlzTQorw2P=4kIU0+k1zNq>sB9nr><0<>3EnF zUqn50jPAG`EbY`oYv`=>{Sg{g|E=$yF5X;wxTO_N00GI2p3fA3g=h`2^%;t!qf}#m zXpqrxMwYo~Gh)fvTQrX~v{UVoBXrKgS;?P+gKn38j+GQM@CAr6AP7FNt#59)u$GLz zO*M(ZUZmzT-+F!P2{XU5#Z*+Ogf~(DqY`KKGka^kRyVj@wl4|~jC88;Ah)Z;+P+^8 zB?acc{P-8^vpw}*=(uZthI4VS{vwsf0vV{L9BL@<dyXj3TJYj<MG-iXIezh6ztN;; z*x%HxyJc#;7{$3_wLzQ!TTOrh;+JfxlF0F%Rp!<^&%`c7p{2aS+0g@@qpVV5d35f1 zlt?3#zwtMb7EoxMIb|_MW_6W!hJ@1MU!%Sd^brEn<t@XfzCAMh^BD<u;@B(mFA7pb z6{>L4;rKu}0F0dZm6U&L7Ab*Tk%cMsUo@V=HD~y{-szN4|D}kuFkB#4Ha4ol0=)~g z)UvMqHdAq7kkP6g<q($!pWWVF(|(o~cN6y8di0T^D}&{y_sym}vU0;saz#aMCQp2t zF)3jB&7$o0EtL4Y-8p#=iw9-t8p^F1sWnu25%D91$OtW`fP&@Jmr!Pm72P||^k68I zvAc82;bDaVl;v9F{S1C0%67baw|rM7gH+gobC-$4w6;E`XjNYd7MuI=F^V&T`+|~Z z=xSv?S#xwIzOX~D>pzEU5ZqLU520PVWwNAS$l||$wH!OJz!QRW7)Cd&;xH1n^MB;! zjFCp+k0H|wNGMd6r{D}^YW~Z`pR!ApD@RPz8y}7BcH9$=OLq>l0U2-hMBqU_-CKge zqAqR>Tf+nIwy{UM7)(M9r`JLIHkMtLAYvM}771Zps#-VU`1DN1iS_~ckdk6Tz8SfR z)$x!BgVbntIXE)yR77DH{sx-PlOID%wEa_s5T#A*qc!kFD3PCJ$ge*&;}x%xAOLl@ zYK2KD9Sk#CGCZbmb;p#k6$yQ#8}&Tq*nrHGXrTApAJ>c-!|0qOJm%3h%D*KMo!VZZ zSfDkmuT+xS+Rc(iFc8Q-*J6E14L+7!HQ0U-^s~d+`%soxteG_u{To^*KXz(r8loM! zpkelY-=%NO6WYA&_XvP&LlDl^1;_N6^)LTOmvZnEeGWgH-fW4WL3=srm8DQ?sRAG( znSQ}rC{~6AEnmL->d6+A!UaxUqS^}3qTLW(kPF(qg>Z-L5C|0>8hIZW7NsMgt`=)< z?d~!<hUeLp#$EKg<V{ncxq7I?eKGf4P9BY1<}i9cJ0wGa;hLf<gNRSDtyx=F|7op= zcw-dy9m62uR0-p)gTf|vKIg}4-0bm_+xI^ZSPm{zQh&WUVsE-PR?KuNZj`B3a<n!r zt)$8=U6&~CK1sfvd^oe&@}Dt!DI0z5GRqW!?e2X%Vvyji0`Le)NtJ-e7{U5O(w;71 znw^cGJa8Vfx9)qndR1EJ=KNn6B^qrW$QGma`U?8L9jaoefR!ErB&2t(Z?2H&&@is! z2*Ll|DqFYOYdf#hhv@bgr_<aLT}c-s2L9GclA0LRTGpq1_!RHYcP}|rNQ6h!Fy2y` z)Q`vWSt*3dv-j31&H2g|u);wzq(Z)$iP%HwEuTd3`>e*ZQI1?rW&Z%nqA4w%h)aoz zu1#-^gYxjI&lUR;&$G)Yexi3rDg5t>^n5&=O5yC=uL=AvRYK;Mi)t$u1z?xdqjz1; z7V0J+&!sPu$-X}C;0|+vnXTBzSjhrKW4@s4rpFX5Hi20DM6pYZV<w`PTKRZwFMUd% zd!KP2h7A0_U&s{vYh`z1z4pxs0fbXXUn)aNG9pc+yiD`6*h4odGua~LKO50nQtM>4 zuFdMSDyYYOn9jtQR@7<Qr}m&PtPc;qDLP+5S`DdWsL#G(v-L*O2=v=I(+!j0(3CE` zFwTlX@mcHO&TjWTkm_20!v*}+eR)Tf6|{*woHI#m{IX%zj=b5fKWo>wY26~nzUS{Q zl=-r8lEUAGAZ1nBwL25VIYj>`+TlW)%#j)OYyFDWecyZSV=uR_{?kmX0I=`>s&~2W zGn|sXcJiX}>0H#eh@t{&&P60@>5yFKm0I_OeR+BBb`<7&^Cm3uYo>Yjyz+qqUR&`* z491s(VicI&l^xkv|Ht2JyI$IpDsuC^O{F|VLm~{_ql`xkg**8o=5jg5peAD_T}TH| zDW~9it+J@9bRoMO!RkC5(Y(slYR=`%W%rM65-^B$6c1Q7HI{X5$Kt8*<+=^!PU27m zZ?^=GiR_U9)8z9BkgTLFiEPEYD_y9XNY&kF7dX|eLUNaI0$$-!3p*d10|M{-Nu|ht z0iw}FflYqikL?jtP>#Dr45Ap1aA+2o&8~j__Wbx)W`*KseynDB#1<lOxzC~(nj~=q z?al3jC$HQstQpB@-SUjVFFay*OwiYjl%k_Kamq2j%ev@qknTKft<VZGLmw_zj=6#W z+kNCf;ztL!J6~r5SY%ir;SEpNXc<NGgsuUE*P@H}%{zb-%d7Wk`R|Oy3zS<jG6;`V zw-w`VguCgC)6dVy;ZIB<e0Bv}`&MP;lUPNPwcPDim_%PgMF#<$qIk>CqcIc0`SW{h zE{@$J<>uzh?kiu`Ju4REEWN(}#&{_lJo4`5K_L~SGZ+~$+>pRQRu%~l|KLq>$bVPp z?7oo53f~iJI8MT7c5qb!<fjOYhNMt4GR&QUM@UGxnYm|U+g*R@gh44x@E@Sram96R z;MPT#oZm)paZyiD^#-?ZZ_j9Z-G<&xXyU*|dTqFUKOrM3`4+1YuT_3%@Pm^v-uO;X zVQ)m=RGs|cW%gONu3+`##K8^9{_Izsu-gJ6!C!%WyXL&^jpu1=P^!~f#p?me=#3x5 z8(C?qT{19tJ&fZ*B49^xd$Po2=Z64l^1us7u2+wMzMOYsBjWiy>~IgKd$t8ckBPUC zB{1r}!=ag)va+^Dy!P6Pnd9=jBnU);-Og3@d^OWg4v&uF8SUKIM_@&s)e4{Ud9rrV z<d7w$f<J%${DoNW00oC%fRBzT?4qss3$YP*kRt*rYH1~VGHt0WO6*ecNpHNe`ySo) zrW?Mz+SA@U%whZn(FzU8hI01bV4qDi`SsBw+#*$wiyyYA?Yp-$KV2JLH6(%p$kdB; zb`N%H{j8VnmtU`&7u4&smW^_tYJp)c67)6)7hWIWp?UbU{_pmr0&y^L!69!DkzAU1 zB~{~uc3bfU-mko<Y$hg9<nTfM*5poAWKr2G-YfT_Dv-M{|8gZFicRv^jbbNbI*oVn z*-n|<`O<`2ExOeCD0D{%^mq7QCcJ_#OdwlM=46|sVbt#Jmhb@<#RZW8>Ra2v`eW7l z-dC%C10uI}F9xo1NbiXq9zOxU+SqG#g|Lg=*<_rZh$!wpBVwH$QBqdx7{PXSoCH{- z3Q2;^t*km>B}lU5)54AoY~Zu9sHg<#6ztO0<svNw<r=bT<Pfr^_J)sRP21=Y6I_^m ziC^T{4>Ad-jdjW@=-rxUDj6B**d<b=O#LUrLcSGHramsc^R-1d*7k@fZb`Z&+Pd!F zOH7g(v}lgg`#eTkd6?z2fob<dD5WAE>7z(;;HrduB&RgRXSPgtDK}C58<JgliqYcu zz6128Rd)=lwgxY|_3o!%3u^Jd|Jly5?A~sZGAEVV`w9`CQNOpXEZ-w`x<zzblwz$H z{(YEmb6kP#)tP?LF*b-x@<7JEpAvK07$Z7%Nxc%(c1M6nB+6pQb}7E4o-;@3|Df6K z%CW1Aact!NyGfJqJS%MMps9eVe8)J6{@=;9by86U$EHV2u;6t5b=-znMT2fupVJz| z7ENbXt2ryeN;`y&;wU}B09{j!)eEtnrhPB=`x(cJZAABTTvV;&c=!40GSA+YU@aHB z_CnG;EXM9bgtqJfW9wCWqzX>r+R)Lwzw3DP!hEK~(a_V2VJUBv0t(xOeB%?l1ZR*y zyZcmvumI0748^Qgp!i-EW`bVqFwi|EsZtR9xsGon2Gw`2M!I48=Wujg!nNBK7*Ha; z>CW?HPS+ccM2xSgMj`)E86OxwIhI`dg9M8b1+^di=_hxj#p6+%K*S~^C)=>0MbM0! z-bV1i$8$JVq#ShDcq7yzQSWz7%ii)hG++B*JN$g8fpDM3X$1F<g{8Ny>~@&c#l_9I z|3`PF_gL5_TBF4nm9F<m9o~cY;q+Ta)I4dD209Yi{SufF!UPiAsbk;9kWH5xv>*T% z8jV}P&kB)=DxAsjhLtJi*3cL!2s3f(r??imhA_UKtU*8jKb*Y<P#;0IFZ{<XxCXZb zcXxLP9^8TjcXubaLkR9}!QC~uySux?H@SQ7dt3Wnef4&0imDk3dV0D~A3wjdf}?uF zpaa9jzk&?(wo5K!;BWz5T|xh7=i=f5w?X6G7WVzZrGsj#ghF_1;GrI6D4HzfpOz|; z6?|DeN}Z9cU&M*iyb4ZJGrE%GgpRbkKD--Ui7u&PrB4t@(nQ4lq(}s{Q3Sw!_7b#n zL)yzqUesmY+MPX+h4aKD&Pt>`a|$#8>`H?8YqPq2L?c6e@^$>Oy{ra>Q)PKMI!;W? zKG0pHcQSTaW~Z7^>d)myb!YwWwwX|bfdimTb`IO^ZuhGqQN8lvKu2-0eY+9Q<Fkj> z$mLdeNA$75tJ6H1cA{$w0T{lT>gjNM5qt_4sQ&F#gPi|9o}q-?xx)&Ip99djHug;@ zJxnDmK~*kM;j7eto&NuF`7y+RV}UvuVsQ5>N})!ojrTn<KI#<dV5+k<;e;b)w3wtP zd(_wQGK7p;*OvSK)79DZb)!AVB^U7D;|thnuS_Z_Pi;DTK-yC?Fko|rp>{%+#l^+P zB>jxq9*E8^DuVU6^9=og9u9eDxWd3osNz{ALriP!ahRVxeC|olZmmsXZV^RBmW`nH zg)%S~Xr}gq(DBn}V!jrlICLeD4LF(-zNECA5E|Ns`MK}!3RIr@q+Ht@oDT$C;DeH4 zYW@;gB~eN2wXCe9EPW)My5S??(IwG_KDUZ0Ux@}Ts<AiYMN}Itr}8-+4`OO#1>ihT zr<U71IQn&2ktCuBFk>zcfP}!EOH;Q;XP}XsEOAX=IJV3pAT4EBnF%2EJWkpCpy4FZ zkPJUuO=S1jUhTkvfx*?Ij%^FWMm!%M9rYee8ul{95`XMsdm|TA|N1qU!RK)V{Lk(A zx?Yw5CPk_C8|-{FeKU?do@!F(M-nb@izA|e=*nuO?K{u(D%=KRJh(EdWS(8!fqB^X zkE_QE$a94o!re9}M9X>jP)#;={IaqM%^FGiIrcruRrp}y^&`9X;bbH}rUdX`RrCpt z4f!k)^b9><5o^+p7_wV8dqNBWc>cznIGGs0seiiMU<j}P@GYk9)MKuwl_Uf(!S3?3 zUyhf`Uf+0tESS+5|7S8z>3a$5@w=+@G!OVjBOcDrM>hElq8P`gl~1+s0`HGKeD+1_ z`;QRLo97E_`&^BDj^{h0Y!KC_eSftKTqu9A&Yi<`!GW#g+~RI}3qV3l$N++&Q<s}D zGudPjph#o#Q}4e#>|d`mAQleNXZXnNFwcFBv!Oe+qq`Il_t)XUDv;&$Ul1*;3?63T zrzVU4^1nCGP|*8`-7n|fc%!3o;F`CG@sag&&R`X5KJQ+3!er{I0M<u*p?QpeIV69{ z3oHO<ieAXu3;{I2ky)9k`Tevp9S{-|`;#OF?|9o806gsiQurghS{gP>a>5l^zfmeR z<3uk7RqT-G-JM61tD(ik<4elQ1#?jSO#=9xk2v=9xwUc6ZN+|i6o<b6l%WE{-DX`| z*U&S&Cu(8H!kvm26BidYJz6g4&c5dALNiQrXV9H6Qsp&3pD@<0s(lZ8gi5*Hk#=I~ zX@5aXPoElUb#60YoU9Yv=5fD8qxT5E=KXB-<L*;Ye+`T27{*}u#7fI~JB^pg`l6}7 z&rHY!vCiJX1kfM*0tbwB_q#-AOcm}tY6`i+(0))L{9(a;h`<Y&Ofr2UbKoD?G#wz- zHU}t&e2BNoTE^G;5Q2#J`2zQtWKjGfB77<764(f`js6Z*S-Rzdv{%?-szPC?1u9?p zoF6>go)vyCT3vn-2xliJQ>)i#P&+Kvg{1C_*7Z_;{*ZW0@<-j7!*cRXC^g>xt}6`7 zA_NChg<@DPQf@Fp5(JhiulY!bx3`0Myy{2!CivG|Ti+%lCdlhdRz1@dGO-3$NN>?F z$g76eAEO0{vX#J7@hR%V=|dr)KZr_)%~_j|HFMF!2djXxxa$v}9!4a*gSH3i1`k~s z0@@52mpr)m53b`7LH%0VE$s{m;9#JQ8LkULPvkW+BCl-LDjo}(3pdqHXplf9*|N-& zF@$fM5%G!1zf$7gXHUDoRJ+D<XJV-M8w^2wv_ExidRTWYu1VeF`zN5E=`W1{M3?C9 z6Kr?4>C?S`CCM}gDEd}g%8GXT5|A8{1T*l!`DJ!yV^q!t-jWT7uWCCls(8K(4d8GX z;PXFhKxhM%wF|Xo=oL+SxPGtVk+@Kmr3e&2djqv(nY6p7-5vd@9jS+%_<+XR12h$a zg`l5mI(}Vd#W-oJFiwbdw)uI)d>q&rNXS!4N}G~$elWVOtAt>nWxUjj10Q~WkFzE` zG6bMvZp(Li77hSiXkOx(Seo+B8$)tLn{%MZnvM-~aXIP7J8un9+@{!?*fe|?zCk-# z{S6ZUjk+e?7eaI<eu>$)h0Eb~WL(6nKvm%li3wM6y7rpQ*|q98J>PqIe%5lHlnHq{ zSFRNT^a+z$hXZ;5D%%Y<H8s@`WHW(V2X?E}(&~W0J=qCFWaf{oA5NS0O2wX%&<++E z2%9?U@0<gm4MimtKs9vN!LL<pI7z|LVq5@TK=kM{<RCk$Fj-XrF?WUXnHS`RwlxR7 zdu?UdfhuYb<TB?O<O%E;s<-lG^UBvI2($z;(ZLS55bDB?-d=LBtpqKSF1|Z4Fds|2 z;~jQOqW7=Qd-C+OBkrm%jK}(3mdJixfxVDGg$}~SAool=?53iPf80z)6|rHlY94cg zv6ebf-8UYUmPPCeQ@jO^F}*RvC<LAN1Kc7(QOxW=cDFpJQyQpB9D2%U{?y<pl^h%# z+m{2Gy#p}(XOo7!FxZ{HmcXF}DHz2yq8;u&JFb^w-N-7bJZEE0B7A<BE14x(BG9hJ z4wjRvpB(;GHxS17_BH5Geu8?od&5ekjc}#C^9{0I?+~x#G=dDd4sx!vE~<GDOZUxs zh23$ysee8>re(U}{%HhvIlsTh5{QH#O($>gm#`OGwOCl4Adj2)g;xaIiEC!~kPHaV zQ#Hy7h4_V@$J$By_G}Azm=k5Sn`Y_IIIPhd{#EJq08j?TcK4+^C@Osj-@Ak=pl0;{ zyf_E`Di~aZpzSl6e`FQTJ*1-VBFlH(gp{}|@_5)NUlFbO6Rb1%V=)%cjjhr!?uPYM zVV<;Yn>73Zq{aWfvN)(1_4Vn200Z|2A|_e=0-YA>iM0wamBq!y#=DXEZ}%ZYIYr+| z-`?&!wuA9Zw$fc#Ie44bCv`?+L5(`}_`DB4IP*~RNGT;<>Pic|;H+keHf5AQBRp*0 zx<bm5&4>+F0hs|GfBxL6fl1anI<$A**ttZ15QrA=dp>`Mt8uUwWfs=famTlY(Ye&t z0j+$uaUq?I4JPmq=xX+94{!Cq<n%5ejIU^fER@eoYKHTkJhZvm8Cqy{`_1{rRPk_B zS~-{1=lxpce5widX5DuC73>Pf?@yy{bAQ`qKVIY8)A8ke$D3-su?{4tiB9Jr!2^Gj z>5c3{93^5IXojG@Q42s=>i1qK0_utKk22%*-zKZXv5hBqLhSV-V6Kp}DkoOv=J5RG z+@U8Y?EnmR(29T%JNIt!f*$6ijB6yoExGFDx-4IYtT1E;))&9h4?{(7kGXTgEWii{ zzZ8>t7Jnk)BLfY%t0q+0d6zzD--*@5K5ws6hou+;#ig5<=BOPj$ZQ+#V^VXY^E2E@ z_pUf(Wqsfd1j{c(@0Uamvz6YTzW7jQq*T&$#+(`w%!GqT*z}2DQPIGSeI7ZM2b^Ah zUH^1P$1>u>Cxb$-`B0a=Omw_s4<P69zCB0-5P?@LTz^<5k#m*8Vs;OrMQw7BHylt4 z*g9RT;pXoc>}ii26JT&-hJqLq>_w-+gC2$bb+zv4g94t_JFwxvn~UplmUl|!aB~Cv zb!X4=d{5QCp2}!ifMz)7`h&b+>#Fi76m6nU=1QR`M%V)>>jYGI__Pf+$RRe^d%V@h z;$tXVcI&OZ$RV$;!I7fDp5p60d_{e%G9XVME}bHmKaoo=FNha&GYRdnwGx)gDfN?F zq;d#_-|Ss(O!~-^YX8a_g{!z{i()S=i*mBdypo^RS?;LUBc{rVtkG>wp<JevR991Y z{$=IZQrCX)nrl&X(0MCO{MOyfxmNR~2X^tZ0I4LW{Iu9|lHyuP8w!O+`Kf!)p*Xdb zWMK00V}Ii6^fGy0oma^zZxm$X@$p3avz4pnk+3|WM<k$kce)h<b^aMHBF^4y3qX{t z^0G$juYUEf*9DgfAmKdbv)2Amh5&+SIdV$j^G0I7sYtr(o=a(ZS2b9*LT5DfVz8`O zCI450K(}1*GBMd;?41&GF#56{QVLdHE}dJIn3H=NRo~F)>}<6Kik}QaOp=<8>ti{c z9C$No7AbB2>D|d<K#rZE-D6Ob{tn|NJGctu4y>vjktr@-OlnftpIS#SW7s<`t>s?0 z3oVy76pML2imIPs7oV#7y)H6)X5l2hp>Z!QZ%8?AJp43yF+7GDBw)hI%qZ%bV8WL6 zr0JqNi$5g<+&}f!tJK!sFGDzb^}oD~d_I!=P3e(+8pbiQmRFDV@wqM4>-%NXei(jk z>{dYm+i&U{h@04hKacu>3?vB~8#@?*+^&BS1fFg8KF)WK-+o(e^Wzt>pGY(H6@>vS z_arL4vRxw`-RO5~vtB@!_0C3tJ|BN%HVVCw@0%<s(zTWt^(VMXh$kfB0Ha1cbDh!f z^P7?BTdhF?_rPa)vv#~tMskIxHTo419tLUh4124psw(BP=mW(}4I_-nW(kSaBrsQw z4~_Y~$X5pHlF9!ODCLuIa;iHK;UWXN-gd$;*;~RL*=cjpL#jSDfFmw`?e>Lt-dTsF z<Elt&c+m<#=EDtz`hGpJi2{3rTv^sP!jPOEzx^T(aL3e&_hKOjH~<1jLay7IJbi^< zNj_k?al+}#hI9zDC>7_IES5GxC=hj)oRCh5tc86JG~y9T(l6UoLMb`QFKrc_!u27a z9vZ@lGujFCD7JPln{YlKp`=2e*u9&lQ;<k?3fEC?$S=ve^pgvq6fF%cz3#r8+V?;J zfX7FZW)tG9GgQoGHvSNA{BGG#!*aZVdqstBEsgd^hMfgy%<-}MAN#7PVCg0yY;vG4 zhTQG)$!-c?%YFF`*3n3=6#}66E)Kw-vO4laH}4uX4@r2EPHX2AkqECGpDZ+&9o2-t zrtjR=4V5;C9E09b@lUSmlJS_~wG+uMlCwmDm5OU6&b4x|GssJd;$xqVaZQhc)EG*+ zuFbZKx&nPUemXr4tkQwV3?vB@<fib&>U@|HyfzHt+6iv2hncd+V?`OzbUnb~Iy^4Y z@Eh*F{Ec0>fBhS@(D3TGs9OeYV0*(afdAhV#xx5kcxl^_8QwhH<w?Z=D+`Y0D6{?V zmSHA|IgC8|f(pN_2-t~uB@nswoGsXs@n{t5+qXOq{Z_yH9|y2NP<M^kXy3?SFs2Lb zT?P~}u?(PyGMP;oove2t1AUA!_FI7xHJP%C>BXpmVE2fReDIYv3&hr5Fi7}<mzZiB z7qLAl3XJf%@jQ&o0(za*V@TX1`2boWgq2nKcLygpmBgepQfpP#$RkJRti1=Rm-A<$ z-rpS_U(?oB2(7gI^{lK;Q(JVvWBR}AoARs>X4Q=ZtiL}Z*19Ukve_~&p=sN4vT{Z# zR@$`PVugiQcDA=YGuh8brj>C4&`{7};Y6E)^np!hjoV0mz4UE2O05rD;SW#q9rV>* z>ks`L3V?O|lf`sv)ny%%GVX%dfJN9Ka5ET*fO<nuS2qJ>0(gA-hT<uhzV*URS}ja? z+99U_FcZE>fg1}x))ERaxYhjhfe3KFQEL7SN=hgz^WB}Sk~vii+)z;e`k!0?$XVDb z)Uus+IOyUcJ*bmv9cnD~E{Bq`Fr=>&8Bbb5{*c=X?3hEPId&SlvqGm_$m+q*iu5Mt z=D(34-xEqnz<Br>cKILTD}VE2qLv+Pv=<{j=We-U)=Cb>8J6HfVeSmxp=RW@5DCdg zk&G~QCs!(RSW8%OikF3?Dhs^jW=JC(7374#HB(<GihZVGjI~;7v_pS;YnZpYIjDAU z7e&5{>Y2@GVeIqZ`OdiyvD|Ae2T{oS@a5Vve$c8tMRb7Gi@<;fLX^_mtQjH;{Po3G zAN+uJun(5N-or{SwVbHI0pX#ruiV@=hv-fD`L0e#b9dq>{})g#HghMkAp>z(>wWNi z-4*26Hhou0%!&A2<u15+nk1XwkNg%#-3A<AmmAp}$+e{X$VM%0&uAY4htHabvluKG z9yIfWl|?3R$v-dL5s>*IyzIIKm%2e<_ez3OVR6we-DIgy$XYi9**Kordw{o1JBPi$ zq}BfjGBvkX9A^>)(Tu)|>sWX$Lt|>YEK>jvUpu|};us=eR+(x~+GM{y4dTz(k9=0O z_AJXVq+=vjl-VUMY5}<ua9<3#k)%!%D3t2ye}#I7t123W6Aq${O)29dflr~t$isuP z5r_^%q=~gPTIb@kK286N>Uom}IH4CDmX_Ec>`CyfH-ie={%=S0|NnPsG*EGIXiStg zC{ISlVext`zvb``VPz0;StYfvU^AHBlE>Ru(!cE7ork!rxxu_X?ZU!}anz$zL>b-$ z_1JDdcz*b354NPa+-netf<@B6QfIm$Eh%U(&8&ov1Z~?L8xvaa1f9n31i${=<+DNb zYwmEe#=5q?UQ(OhkG4AiNS@EjC+}HZB>7@VC_!DX>KRy)3jG0(1&NIgF$*Hio>66E zD}>0K(wESHsiKgKK&TGDHX-=MZq@D5eobJx(x|9k1%%^&Km$n3ahYWS6@D|mUJ5a3 z;8W@hKoj}{R9YjAet2}r(xM{4$zG~0Y7YAy$;FIY1rc+p1KGZznh)86!i<ni`5jbJ zMP)CNta$+h24dC&^$uF#4#NbO@74GG7mA54?eC^<JIIi*D2%X_WQzX1Xp!aLpQgXN zTg{!6>pMpd>*7vZ;BA^x)nNT7uVl4glWa?f)J-_D`ZJZ&uS?w=Db^x+LLXMXPz41? zhokTofi@^e9RH`IWqtn-m%|?LGba1l$M+m)2w;+N&AYz;`jYO(zyF-rb{ISH1?z0m zqDC?XXE=vfqgC>8Xbo~VrfUXfccQ~lU{;wrq#Is_lwc8oxH^k>HW@!DA<YR2+}nVL ziIhjuRsvk$NbN8C<UO#_kfrosOlW&iY&XJQL>*E?Bb^khpM37k2>h84^@fVxJop6- zT<K%40+x&tUW}Z%e4r6UUEgl99=*2`fV-P$cQj*$|8~N7ck+k>faJxxT9NB~%w|f7 zWY!M;wvz)wx1|yfstJ1LB<V*8X-kB3BfrR9?-u6k!_%e2$5HRiP<6xj5R#wR_7>EG zL<26!)5hR|k++^-A1mr9B=#WjjSlzR+$JEdu%jwVE)=PUlwV5{ZF<NVAxK-)vJev! zdgycFpaSZZSWY{&F2XDICF$Z0La+!{DP(L-=tPC<a(tlOTg-`p;*D&du7<0mQ_^Wn zpC>pp+&sRDhm-;~X>0~cWh^HhZG_4(lvI&K4trBPRmP=n3>huthjp697&V^BO{*%Y zCs`?5Y^;akHhOV4vWNpwRQs4vhAlq^G-eJ<D7Tq-s|3D}!SA0LymyS{=MciyRSBVU z`}|N*N$ubYBt(Pb(v@KKpH_v|z@+*qJg5`WBZI~ArCALXqpM(JmVBQY8u043VGMX? zke1ihd+M(_s@&wG^9)An8Nog?!a}NpIAImIWPX6GwBN6iJ9>E^bM|_`1<&YYec^z= z=!8rGq3eVH8xMXvuvH*NE^E(ZG4LBvRK9XU$7;|7spOabe|xC^e*FZBJ{Ymf51~(0 z-mmUJv(ofn<0_D?!llFBzcH<U{*<%<;Imx`InE@DmIPjU1U3!}Guc^#pnS=)6BnTW zgKz#j_?Q?tEr=Ie>lD9+i-QCEc&@yMu3;s|f(-#Qp51Sx{PW*j$N!!%j^f`f%1PaR zVck1_J3GJl!!k}xMn+cP54=raInAQ)KU>z$4Rn35jSZGPG|-C2d0SC&v5>d7HwH2m z$o~G{+V6i}SaJzpDBmHw?Up!V1tleaC<Lsm#zq`9ZM&dBKPX=*-yN-gmzw_9=pc2_ z;Hthl+|BJRqQ#>&=f6jk|7#f84ed{z;GGV2yJP4r8X(sUR&up~|B%p0D1ebjB*vgh z;Hp3|&k+CVl!&<i%8`x2TTdkYdxI)D7W^O12q6lD0AgtTOr(Kn0=6+|j$Hqrj^q#m zj5MBJ&&@z*47TC6Sf)+&AD)X~UtpvV5Hq%cEI=G9JpVBT458|S>D#Y7RABtQ2@|wu z{|}G9w(Z~J-^KPgSi*<^lKART#rFR+QsV?{pfCv}I7y&C31k3CpfIS79bXMrsmb}5 z&dY~je_R&Jl8)`gqAwB+y_M03OE*1=9!@_=I<Xj8yUm{$ES1`JGMCmvT9U}xJb(UL zwZ{Iin@KimT_f{WXnh=OLb2Qf85{;0jqTD`c;ryowdVq6^??Ws3xq`ELH`k0#U{M} zM~?gf87!`iOVXNyw+}Dj$d*&^{afGHq2-V8V&R9L{6sI_9VkwU8h*aj3)Tx83opUl zVl_M&6Eqnc@*bIYHl<tL2HVVkpyG={pGIsQ;-2Ym_1b}L3zhfnKas>~So!jIVuXJu zMyNHm2oBt6`u0lw)5hA;qYct@y&T*7^$_V_x1@_GLCnit+pV&8zIK_^o)X28Hlh3z zIeh^06HZu-kG7Ntuq&5CvUou~Rmpg%VRls5NPY%59N0+O6;$Y)(XgC;S<0b<<fcA1 z0%(a~e)=Hi=M7g7`DMcNp$eo+jT)OqglPzba|nUi;UTbBRfYL*A-L=<1RtYV1O0_a zT61n{E~Kz}7KP&|=`rBL?hmEq<wFD(kbj|Yi64nNKX`hP^1bq-wG}}5dsQu4`D4H4 zjvU{LU&_eHpgZNw|3F~M&b*PQLCd?}X`XuamrKdrfnp}UN?IHOmt71`qD@HP8;#|& z_rAfci(gXCXpS7q^~+TWa*d5~<fJ#Jz<NW3aihQ1rV!lznz220+g$YutfVNwh>7n* z4gT^agTC<~mjBJH^ig0Nt8Ql3vnp1C{@9+a1!yU}N5ZorB~dciP_efuhSYqN{&8Sg zKCr&F7@8eRhy*S^7WYrQ12mkm6jfk@O{&Fx4$XV2?xV+))PRJQVX!cQ_*Ip29U-Z6 zBKj8s7MofcT-tBQ6LuJJQ{$d_BHzmO=#$IEi#zuqby_kO5!j&@Zz50r^Q>7#tio7d zDb%;cQ(@WNS{{Q2o();~fXsv+>^%L(rajB+$a<C7urZvIU_PD5g*|YY>lA?sNG$}g zi+$%t0zY0wxtu!>9f>yzTm1+B{K0S{-_-Q!P=lQlF95~(lRO837zG4~{+gzG?@wws zcX!k|EL&`*WB4~WH^hKcCGxsKl|+%erJ|=7*V4kP01D9X1-$W-we5d2W}Y3MpAY0o z#X~-qmC@q!x+=VQ0WbkwA%T7XVl|pE03Y!+FIJDt830#6GX@}+H7>4QdAHgDbv4v6 zp@a4c-<rWKVD3lHM;T$I^%ysZJUeMCUNorEfYH=zQ}AL^!Rsl7sAZMK(MRAIqGbL( zkRcyv{vHDwZ~C-<Ec+N9xJA{fPLL;vfMGYwb<s_kDIAkZr017~f+{Dx2M4|Qp@<gk znrWQnsk7rMSy2vG1I~zY{PAPv$oBGNU6}&v`w-@xb*02uc`4bg+CxdqiG}!B<YeCb zOFM$<@0@D0XSbg7ma1AwtaqwU-v$i1D0Q6P$o6s3{BSLot|6uEXIP`MPbHv=T$A9K zz&_jZqflzMA|bA8__`^xbi*VOx+1kjt9jSp*U^zFo)P>^j%s^`g+J5IOf?xS6`CG# zYUI1esV^(;?5+z?y%(wxV8amCrw^z_TK$a*qni?~Z54UnkmYI3wzM;kZPR^5l&BxZ zt)qrV_*2=hD8tnF-PnnN16<2b?i;wj@2p)<qtchoVbg{L?BS2he&n!uT+>YS9%uz} z>A~Xy@7gDH$b{UX7U30`{+0TSzO}WEjxH|SgR$drlwB`aSMB5;#qoV6j@WP`fi65P z5bPn!t{@EEBW4x@mjV(pGKkg8%+62K1qhSt3rvQwT;>TVMRFOeaI1vTMI$NI8db}d z!V`CwYkanxC*8jZg19r38Sz?N&auF`n#G%81b?OTs!EXxe5(U8V@O`&+Qv{bfz~v# zq0jt}JLmvbuzFQKE62Jg%V*gX-&~1kQVI$f7Lz}ndT&?QT{*vhqhIfjW1lz!AdG+8 zT)3=zaqvH%u*4F<y;CA4$~+Qq+6un39^`~G+HHx(uD5$V_Z|bIh#MG?@W0+DzieT5 zbT-;;_db(Tvmz*4u4#>>W01QiJkRQD$bFMRd%px!J3({U32p9$ZFaUKdwPIbsFQSp z3(_QTj%EQua3d>wH{u_9<%U0L6%x;QAe1j&je_Gll&YKltaI9<wL#+)!S^xh?l=`< zS8IwfT6hGIa$;euPWaJ;$`*57^Y3!pTRho#L<|3X8$zKTxy5RBfZ*oXN|F>GO5)6? zLF)IDKh?qXRRr|H=Ex8!C#h<-h4GPlmY#Yv8g&IOvaEJh5(N0tob48Y+2#2QE;{g3 z+bMcSG-~gZV+!ZzbSCVe{!HdQpZj)X6-hNzcQp&~of>(ht9hyFW$Nm?pPICEwk-6( zo9kX8tyX|XWonEO;+L)5$dSoL)&091<}!8lpkMo=SRw7o%z3O{83CNmRp`t0WfIrQ zT8vel%>ZQ{o+b~v%Hx?ACW#!Xu3PoRs(uPxLNc44@WQ&&OS-q0s>fLGhlEZC$dTnB zSlbmU#mBkjBE>dRf)MN~DLIx)+;x;p-bO>iaO3vQ;N{`6+wd1Ye6py)P0PH8vjVjc z>E}8%&Zl%poSG^rBs>}6UVT{DU|}2qJJP3TuLC|OEVaGye!!O&L>$v=iLK|!ghaqi z4u^w^LU<sVuy=jmvwetVtk|shQ{w{W2@~1rW@+#aB#HWyDxw;rBstK9yqheWpgPAL zb)>YSS-O^pNg;e<P=;tWc4|1IqL#$dn8E&rKT$|vH|9?bw!qV`GqPy!o79sw#k-Z1 z<YbE85XT`xg4t}JaTjFYBO&4a_5f8qa~N~7zd~D*4$Mtg#;PI>4^U5gga8$+M<{(n z1+dX#c>YIY^;1D<?1b_?f*8*rC>o~=8Xnia@(ob}eRq`1uYS`;scp(w{;?{|`O&M- z6;x{rlH*DtB5kTV%Uxw673v%z1jV1f?r)?AkhgNeNL3BVZnTmqECsIGsQ4RQt-WeZ zJjA=t*nAH;E}*6@e<jqm5-Y-qUDJh;5LCNb`BFQ4e3BJL1Ot%3>$HNaNwM;AXnVN% zL~T1#qJv`wTIgbtW6tTLJFUi||Bfd$(iC?d#R=JRomHkVSk`V^TE6q9sH{E?tU3Wl zkN(o5Zr-D5!*x1n{#=_F1)f_F)oFLc<afYZYy+?R&)#p2L*RVB=rAx%RIt1ianVi` zxzXHzP`0rj@-J@xq9u>-=^U<{me(Nu^qx0gWXa`7yDRd3a4r~QSw+Lnvw>pZeVFsS z%WK4xN+t)tkM|+gD^AXL=X5-n6%|~){a|fvjYW7t{9eXPVgVBiR8k%%=COoQRr9J@ z>EV7D**!2^X#tgrZ#}2k5z{SwuO*YFPmPPbf&?eLy(8NR4wiZjZLy+BnGp{Nm>A)| z#sG=z7`5Hso3xMXUH@(A5hry*(Sslr>g@^6+VKxOE!d8ndO#JO{Q@hIi=ex=byC_| zQVh;aNZ+r>LCVan!&PU<c#3Qim~r#dQMdP)hHj-Lz6o$3u!PE<F+|ltHS8t}z7iYt zC=95;FK|C+OqnIW1sHv(TgVtPvO3K`?d?wON;A(x!<l-t&lAScaHb+WcVC)R*N#|v zB^%*4w1Aco+!r3*c539mCtuTRz(00D!iw&y5kO)hW9UvQ!Jz}udU(=gc<B?`rzcr| zMQdu9%eldelnMpGSP<A79O7wBDwM#3pEwzg80Hr#g!t5RyJ%=u(w*(1iHsEg6pVw6 z`>2IAAQy*)IAoR7e-xu0r$7R%2`n}RAv8F~8#_kWZEGQxyBU-%xrq`&)C{<w#tVf< za6FW24W&HNB~3`_r`U9qy`Z1~bI1hjwlDY6hm@jK%9r*OKd`K}uu5QFKOf?J@*{<V z+_e|Ut{TnTMNrH@?aIsmRdsa82f}`So>e2wwwM(bZ7U!Mtzv}CRMO(I0R(>!NIFXr z?e{QADtaTGwGu8iYr(@ea9Mp@*ons33Wxw@wEbbolums#fLZHL?Y7DRmf{2kD#ia; z*!q5e7BNclsVfx9cTXKrxlut$C#a?U2pq|#hvt1Mg1ub7XDd5tS0t|$O~vb)euWqD z;3ZmZVr3?&ck>lg!b{um*@2i_GFa1cT!@;FTE#f;0}>doYwP%ST6x&_F+)hQa&yG< z^scEUkYjgmG^<wb=|^`k9dox2ZLh^wARG>(S}Jk|?o?`p8^K>@(z$np5l%%_o=_#! z6}^FH(U({KvkN(x-kRwxw3YK%clK~-TRXCV!8&yAA~zss4~;mglQeKNkz!bfF_O7j zW-@q~A}9^FpdYXn4`!f9&~%RAahscIo}C#BQec<A!;;)|rE;t~fr=4zN{Alc$IjvB zf}{(|RYgEB1|w|~KkQwvN5OZ7VP<9yG8GKD_+y%^;^T}bEDVN&<`dlQFZ`6QTaY^J z6k{FQ$UB1$%HUhh%_9m`V8|cMAEw12wXvseh*TM{^)NeCMSz$+?I#4mlsZLR%NbMZ zBfaw6oDO`_O@ZXZxCmN2(>}fq2UdT)@{V`kya(_JR17WX|HCT5iG_?qX^0$j|4^VP z#fU2nwy|`2&`iN?X}yP&$kW1@nkNF%;=>^P^Lb*=>QW&bId+Rp`U)n8%EmnW^yig* z;s*(o@UBwweO?Sm@hwj-j9bDkW6ERTZ6S?`!MY&z>mzGkyXl07TSpU87Uyut^L7*3 zRuj1TENHxYUcX0{8#K2Ke#Z~1J1hNMgvus+q+0SY8)hP>Gxn^XMLkpINlG2&t19Q= zgm!ynH@dwBxA6%|Ult=_P9;BY*cx@7BO9ogd<O3#{=B=BHGhn`#Vr;Clhx9qr9u`z z70Z$5i~Ki1ubUt3B37+^GFM`IT3#S%dK1M=GL6;i$uTxq)YrN}%T;lBJhL1Y4jGVU zXPH1+@qxDGOpziGXJQE4h!(Z{FRl9>$ffOm*3<LJM7fgU=AbgNO;tui;+{^sczg}x z=mM~PxBmQO5hmv_zxlp!YR0)t_Twq-O9<@ofh~7FV+X&$iBZEkgC#LfG4Js5^1hh3 z3G`Fz+V{$ku9zw&lwB!>*(C$3j8XdV8*;FmrySef{$yH>gd=L5t8o<Yu6D){Nu;lV z-tORnu@36IMXx$zui6M;Wmu(Ac}ywN48A9?Hsp1*%l7=}`V7AN4#)PZ^cVm;ZB@{8 z51fk!JbtwX3$*{(bj|@-auREv0dr1Uhj@L~1n|xj_#*;Rh#znu9m?WHB%p~vMKh5_ z@~B9CGyXUd>)W=&gQQzI@)<I_gxe7fZKbI9jog8&8NyN@UxLr4y=1)~a0k8h&qtGG zt%UR(U)HKzi;NFZs45|^D@UMI*_86|h%9S1pkmHmpGGNL=7JQjM%TWyu0P?<HAu5X zx@ee^?@oC<cv-Hs^3OR$YY3Ix>u`(?I87JT&u_fF*I`_<TGbk!GV|V>Vut<0&Mvs6 zq-jG`i;5=aX}V{#d~<Tl3?0iuF}~lCc`a#0lEbVxXt=i#cj~bynddEe%Vm<N-Q-R1 zjC@kw0pLyEtip?51>u9RxnGOr`>Lv1p%I2FLuBTX$S3qj+2Z^6TerUNWwq8@_h2D- z&AYEFM~{a>IlkXsTle2iCuAURkn_Ja&@JRdTyw4#6n#jXM2F-hpp#yovkzOpC(9@> zvT%=V4bjA*QE51MTL~XS=Gd+?-F=k#HPpF3g7f=kF9~2cOUHCrPrru=xwiRl)4qn* z^dT^2?v-amUu@NgA3Rcr?}9@4?}*N~y=bf~{caV=4Zt=O6y|6Q4*&+rM%U9E&7Nca zwYG7*#fOEk$&h4@W-VB!NV^WHv|YzvTl&Z;_w+GQy{6{V5|6F!r&RA-T57gOFv40s zR?OY;R4oiCgBqmCG}{4B+7!A<dy{LW8_)8e*13CHvCR44g6Uka)z6|{+_fB(A{sO9 z-e^P(*5ctob%>uW7{i7YSbW;ePo;^^MN`o`^(*6RGfP{&{1!Z%>Q!^S17iJV2#p(? zRO;@tZkMR1A&=?mx&-fxprQI}35qQv=KK84Tnz7}6#C`JZ4%2BkIR^97d)N%#iu?f zH#Q`d3O?6OF|QQ-;e&YQ%{gmOLZ!I8EHEiU^0BVDS)`lfA3FRg2oD>RW$`Cvh|{|j z0jMbAbUsNzxzMre!xUzf0Ov&GGcq;ZZo6MYCv8tl!@q23IH$ckTMY*kSHu2@kHU`o zx9)aZy>R$ko;YAWf}z`z<PVFcnFfDSm^i(fVVqkK0nm~zK)t08ba9MDVF1i=9UYx5 zLNv%YD<J<I+l;c63J!&@katj0UfKMM*}<B|?+QViO0^e$vng@|2MLLg!T7*{o2Qw> z>4{_Htd2@#ZyN#nR9-1pv_Bb~s4)CozGlkw;*2Pr8PWF}Q!?~WKVXKC&?u+a4s-Aw z2?XeSL+m9DAw{ZUVTADl_l2}-S@`Yr7WVb?>Jno5c19;YKaxbuLIqEUbi0+H#|(%x zOM)c*dk>=Y_a^0$^ejK6*N3Nvg9{2#lZOO+_3)ML0^tf`6>~!rFb!b?+OdcTvFf(- z_p)83zs|130ofErA=A?Std!0PlnpVX@0<=)vib+G7&&`Cp=Uf_&HoGzedT3w<+H}O zwCUL^aGz=D#U`fICAwoH+wb3v>oi(~=Y2u;2`FV46|X-*9XSpfSdF3+D3y5CL;y#I z@<&LFp4(homT|mZzB6aZD6>Ec*NPaN)t}CwP>6$YY)uH*G6r2yE8cHED?ZK&%MOi+ z?)jM*>HH>-^E+8BEk%s}Q{3s!t)Twbz7MNNZWw?V&%VFZG~`RNnShnQlCHYx3bCt9 ztz1Vq|A>rK|BiL+Qw4ckmz}l6=B<c0$Lo$gT!FYOyDnCI<xy?GhARh2ChbvtWIVTC zwnp|qOWQU3yFhd){p9*?bD>>eGoZXuzuZjgqgH(C3xeXc3c=Y!JYfI`L=2J=6;h$@ zAPj0M;g>&kHDXv>zriPTlXaLVVk)*(BuJv8?Qw#7Oo_w1{JwR1nNwLxu&m2G4k0PK zQZRqNaog#&A^+XuRcz+hLYcf1;auyrh05rVujzh#ircdJ?+VZkoBr{6M}Tk$439TA z`flkT8@uwQu+!O~LC!1gb|*PD_HZpy!>fgs=&X$|xCV~pUCu6;Mjh^95`2}|x>qkb z%{k`?9ob}{ygT=YUx|%w6(xF8o-<A;=N)h3MLvU;Z;X|>38a|dg0H+0bfJjJxE{XK zetTu`mRfa4PP3nEBV!$M=fjCd-LZnyi!nf&d^cZJ*Hkq^DBAS`YBUxHXRhBw%-RSY zTk8l*z15?!tYEiob>}{c#owQp33<smeY<w%3>Ot4cV8>-n_0ej!I^A+Ri-UZfl*5c zRWLm6B5*xDgsI-qC?{rSzE?k9Jn|NH!N@r(=Jq_lJB}5givmliErp;%oGpr~7NTGL z*75sW(H9@m;J#lKUHwbTij*_t+-hnt^_JQ}yPAGKsLeKW*ow58LG$Cx7u=r;Z#^b1 z&G|~swQL$Gs@LvGS9Cbz|JC~53Tma}lXAv>_smwketV9XJp+cQFwMTcik<-V7c zi+V>9k~6IE=ncf*e+>!Z4k~iXhI4Y+JNDT0XZLD_PJk3}TBl_?8&|1B))m_BS>l`S z+?VOA$-!kUuk1O!+)JuJvh?;=P2=;A;_D{UpnIxq{l=S!I&FG+!2usz`e*WKg*Rlm z+Nwu$x-BfxAUE^#82{l!=Ebre|BqSd=LfcqbK%)C+lrq*r+De^{8Hm&@3VTE1SU}@ z4o~;Znhq~F7Aok}-__d=-?Z8~6#2t@&B!&+k4pA)^K7AO%qppV-{6Z3oUyawc?aXr zKF6Ob8mnLHqMPrT&xKd8&#Wm$iMKhW_HPTU2dxDw(VDSQHaL<wcQ6r6qB$ckc{5_} zTA)|Y>JvP5G1n%~Zu0cezrI3`-fR7;J|fwEoQuoqKhhnXdZYQlR#yaloS_{CHQ)4M z&jGiG(9!!Mbqv33%d!eu{#7V5MT=%12gqdSo}5!5qPddIgF9RfAyKEGsb|+;jcyM> zOH7u24e{)@*dciAw_v}`oO|$4wE$uZ6w1kx>-#g=21BQmX;`M)*}v(L96Rt_R%n+3 zA;uF)IN-lfXtpc*9+h8)mUn)2A=oRPSM%YS!^Sjxd{be>KUm}b)>0bxq=6}If^%No z2II1Uxyt8F8_?Y+=X%%0d5W`Edhc!OVf2b*8owZ7Ip<DW_znCATGe7&)#4P@H+sPH zd*Te!A2EcM@gO-N(apm}&hVpS$AM<^BjXPC8c05qpN{t}_MR7hWO>;G%M8hMAwX9F z7UbdK5%fI<GWh0srg$2N<x^>UUiNL(S<5$E)N(i-scfD`x8B7*MDfDMbxv$whWZ$Z zFycIJh4tEW=}W>wQPC~h1BFZQsAT!_^77bs;kJ#=c%J0+C&v;d?%ekM@(IJEgPr*- z^nKOxQnd$ay&*eLF_tm!U4;JY`#p`-+kvK{Xxwod@`0b~@u(j};}?X<my`=p?ZQ4G z2VdfjVr6ZN47bIB7)U`kFzy;4oRCa>;nbzLw_-m0&)i>?(lY{!S+St)6*~&r2mc`* zeCHrEmH(P|8!P0UgrM<JXC9j}AkOACouG~S*|)n7uljP}nrzM1@u%zL<JoxCOTDHg zlYW8ckPJ!tTRQ=s&nx8KejiUZ^fx~K1Jf^hzHgqhN`J!Nk~r9_3nA#7FpIp`B+GEP zP*7o3(|=tYpC?PLecF-1%aP^(o-MM3rx$qKS64(8#^7w*p%u+ztwo3QhM;EM-G83k zw}0$nIKUFF_yj@LTw@0uR5P-S##JCmcy5`-k5NM!4{uF5n61Nxd6&$5`?PnD2ut5U zc#TUbz9XNV1aFmR;z5wgoGm133j1mjMnGKohZ|7?C5X19s~?*#qBy|nVNqn4iT&3X zr_%cEKQ0J<83gL-T4C<-c+#oPxphk1*0=xVv^L4<LSsEO7c(ZDSX7GgH(y+jjSay) zhM{Z*FQx?3r{lE|2+!~Pj2<fF@vA0Wicty5H~srEH~go3O{D!e&_vL19bWa_a?m6p z>NZ<kA;EDnU9UX>s>jJ@4&G@Cvtkh@<-zXxso-@EsiC6(qNZ83;o;qR4(7tmRS#vj z3l3gl2liP*MlXSj<Z+y%29cqXyQ)A_1(=rJv^xW9WsHXfopi?}&S{s_N>ZSDR}m-Q zW!D=LF~iB}M6c}l*lkg}U6V;A3o_#Q3$9Eh3o5tywR1!E-B&LI8O!x>0sdu<lYVqe z6N`?1Uso>`3DK>!dA}2l$Is6QXpZ&S&Rr(jHU@HNSbgXZ6VGlk)rXPX35P*1GXx&i zmTqMjm=?Qjy5^9+#`0DY=%aMvIo~4bGIWj=y#nehac)fId6tm&bB&@*?hDrBcj?5A zmk}wMmXAwLFY0qIo4?KAhNg{5<a@(gWFmqpyD~)N8?&|I68R2b7c((znh85Jj5n{R z3M4KX!sm|vI8-~>Xe)~8ewtH%_yguTS*&Gp^G5A-M=@Qht^Ty<%({~IQzTwnBA0GL zYvdbI7-NH`58<V2>tIxABhtRCN91!@wYEeN=M<FhO%vtbwJoo{E=T>#4w6dQ)Mag1 z3v@#dPdVe$b-mDA|1;z@R@p~?r<&_k_6TZvp$e1q(2pa#7FDl7xEPwN?7fEq1#I$< z8MNA@qe30(cr;6qhA|!<WLWFeUV5xW;DVz3Y9*s~9d(c_=P{nC$2t{-^@jIb-9-(( ze2Bl5Ybyyl*EFk#gYqlipq+NV-h1jcY8@-O7p}dfGUvb4=Tz{{d-}j2^YYznShMnB zfl{M{zc7+RO7iZY=-$n2Dh(NCtdayRChB2lTSI_da==04qcjPT)a1?|=CI!IyS>ZE z%b@$yJpGy){w9oCGJhD+9CDUBf1n-VUC7!csNg!7tI&4!X_@$)4x#m+FpXkYh+R?h zNy2zqULqBpqy-TylPFsd<gBGGDUnzU_V(s`VJmq^#c<{Q{r936!QcoH9O2OC7P%{s zWH*gZ$4;>V><3k~S_uI>%YOQ|E!X$l4^o6Us32)Ez&$iPk>woQqaIHo$wgk5=n+CH zCohj2MI^wVmBaaR?t5`LDobntjt|XgVB`sb{=f1=x><sue6e+ZIYf@jgBwTNh{fY; zPEGsO%P|;wh2yW4p%^32Zg{*`fj<4tv#D(JNUgr0k#Q9B9Zqh2UY=lY7j<0}k*9EO zo%C0GJ2iB4b_6{>Qnub%ue4Rk!pR-3&PN2zAM8sRHz!$j&q?%<@@>BEI@MabbK%2( zfmddI|K(yRRDI$X+{%xUtIdV;wIN*^^e~4N@!ov1(>TBCNAO;axU9J@LGc52Hk%9+ zOrK|I<&iR*QCXK`Y294>`j{y9x(e^-w8{2S<!aC{&mNVqfXgvj!rOq(!kg<4loHp~ z)9=eSxVmpu1ZZKxE0&AaB?0{o&~7y5ZXZWCZ5=Vj@=q*WvdtBLZf#N$YB@0JS!PE2 zL_gV%Bi!GqU99}BEb10BTN-YGC=HiUw0WH1W_wKLYe2`t4uV43aWZ(eaDCKc4-xq+ zZSZ(jQPg|7b135IUOrd|{|l*1<R@p=eRrEF%#tR@HXGNUd{|UxZ1eUe&?mQ8JLSv7 zPt7E6v~D0;o6foYq;G_gREvB2WR?gcYFT?NB}_3he&)So!q2~<D7`5&2FB4WSEj=r zS-QPMFVj#=Gia^4&p4<zNl_<PNNE+9R;5F^!%3x_F2fr8BBQ((2Mg_JT5DS)lC{<( z1~!o#<%b7Ox|eO|(;EykXnC2?OVl;t#Y;dFgAWd3pabF2;B|6(|0#k2G=vdSOftta zI(6pXr1<=cO8Yn$ev~uUes!dYD&6R7R##w~f=E;&Rd(YAgZTQ3NDSQUw4#%*n$^!6 z@F2Qh*k5o)rQEA6d#o*|f~D$XswcTE+s>u79d2{AE;onWu#jxn#6OOjx$EZ9&PYfJ zBhk^q@Ajgs%!XRn6h&f+#U7ldLz|7KOysW}BWi<i>Nq4jkzViQItj%<g+#cse=u08 z0~TN1&k;y=wyFj-bvZZ!dwhaL$kyws;Elx$nEZw^3^z!8B|6_kKaqZpmZ|J`f?r!% zE<V|>tZc<|NgmD=iP+=%Ss%m~DgHq^lce7Adq2%)TLDIQHTBW8%1LYfl3xDITdzmr z+e6sB8=W8X4ex$eB;Ea}XrBz+j^RcdS1f+7X)sTCmFTvgB{>2pw;e&Us0RA9aGCIj z(TUje^n8x1@yj5DJ6ChCU3vtXWa2+u=F#u9x|W!6PcNUHDXG@tgMuDy=006yN#${0 zX*)julK3XpVb|<`=ZF2<E|+3YWW}o~<GaEgZVGiU#G)2DK16kG5J_Hx3xTBf5vc~~ zdo~#7P!_r^w>ZMNeT^wANvm=zo)n4iVNO*8JCEBs0<}Mfh9}2?_z^}Hq9F}MtX1Jf z+m4RhaWU2CS?59-)4?ehnUUj8-Gsc8{lW%<Fr3s0GW6f5qwDiipqdbzu!1W$IV$mw zk3;AQJto*0i1Hr1VGomMj@`$npV-LzBk@8q2(Mx&70EAQ7e#fkAi$(}rHo^7BD|4< zC~YV_+r2jvnP@CN00{zP8K<g{@#LU{C7M7M)0RH@pCOvP#dpqyuR32C%1HeT)r*Sv zN#q%boR&*R@T1yMDrIZZ8<p^e2<fQWXvq@;GvYWHG>D7Nv~E&Y<{YDG@ABq%I}UZZ zY$hqXx70N-s1Z<iYm8!PZ^wZEv8Ui*ku}*+>83Ar4+o2%gD+^*g*;|I9FEb?A^xxP z_MdgIScIQ~Zs^V(Dsaj1fnId#o-TC;MVz+=#Bj?dYagGD>h7p)#$h6h+WQ6#^*`dS znZbKZ|F{<OIpjX^WP5>f$7lGG^D+Eu)~%XT+&)GR!$e(34PmW7#|MPuKDgTwF7o>` zi>|E>4*h)o!8?zQOH(qQ=|Pr|nMdtJxrH0cd`HQu4yav+Qm3GAGV7fF!Ac~bW-fQ~ z&IajK+N<Ek*T{aX+;n{S%9m)<_bko%+z2ixwgKg6T_V_(!@2h1np#o$sQ+o-n86kc z`WyU}3!OzIEHkoASG<dwex1<4u4Ier<eMi~Sn{btL>@#zxeH-W{5^dHIykFlRpWLw ze!@}k5E~CHy~uQhT(<+^?Qv2cW)VC5K=~az6N<r9#Vuu{K~wcTF4sw12YR{=eWN`X z%cTBnC9?kNyn|m#E70zbl1<A~K4P+)IhSipm?2RDUNf3COLY5|thy&&y3E7lQw0$+ zu_63b&o`w$X!xG`bDXCH?B>h2R3%zP0%r<pM%+UZ-`Q=B0=ia0M?%iv_A;szrcq+r zswkA<1Vv7xd^CT}LiChduT#3jam&78w;Tf|<FA%QeB*CO_~ERy%`RoahY)m|mRq5L zFS@QPFm`_+A~M+_nwkm2XSx$G7al@dn10!hW%zlPb951Ma3f7(-(J;WGx!*jVCZGi zG~^slh7yl1&;AHF3*G$K^k{qdquJd#i@$+2E_%=#7RtBx@InZmC*F^WB~tkC=v0Q) zV0(w3VtXjn-*c7GO7~#&y}(O;lODm54QAdO{?+@#s=X1_zU!ZqpQU&?%uC1SoQ5o5 zSwZbYvkh|7E!DekKZ_Pn+Vsp^&qZj{@k-+^PAq!rk?(W1Z9i)}REiJDaj)eDnwnfy zadti`aU>A)^=^qj-?6`#sZq2}Uokx|{Yr%SHdA-tSqu(!UwqFi1q*T#W5Ez^LbM_v zOygbo@yColV)&;Y5c)7{)kIy_(re61pyp{!x|h0a<3-X26)pWnntl`Y-|mX4o9$m~ zp4~cW%=kEZ?{&<-6iV%G3ucn33}3x9%AqKcal4{b<!J&nM`K0!{F8$1j$*DDUafu$ z&?!T*Nt3Y&80f@rz374srpgny{Lk>?dI{Bi2*T=xb@!R=O*<2FE6;L5c59JeQ{aBq z8p>0tp0j9Di+~2uOWgQuiMWHUBL)&=9BxGxj=a|D0kg_|Q|vQyB&5Am9g!m5mXp#f zAE}4uZNRq@NN<LfmZgcgwWu$Z2#-)fjT&yQiiy@f2-JID@x-+m@v*5^<NL6)sh-<T zs0K3&_O}!?&-F4mVqPoWM7Sq2^Bub%g?+|9H6E7V9<hD;^Z};6!MS`X3b{iI=ebHk z4Q6R+srnvt3I%WHWcK5#(=<>1Ak=<4Qo@bsqfJBzi~I>oS>56<WhOsSIL?!)93jF} z%9k@B4ie-mbvH<{FHvc1Z2ZHvjdZJ=j}%w7_K!*)2O4OY@O_7|Q*o;fCC21;58JC! z#PDDYq$d)Ldz&t56sO@I97um5N2g3tVvOEEIP^f6ZmQ{moc$X!qsXzq^?hsue=1o! zH8t$1bhGZB&71JT?&W2g)<@$=g7C4iFE@`*Oy)O~M$vfTley`_A0GPl^@zz>(5DOK z2Y?c}zVXRimY{tR_z=%6(PR|-sdMr(Zuc7me1Wqrz`nltTlor$Va2{k_6?TL^h*th z@k@vj0_cYiQ0wzO1ZX7_{Woj_DG$#icPiC71mqS$!BfeRWE`5hxHP~z$&nODsY{=V zZ00-I+l%53M+<*d)<}q2%dJfy%Fp+ZWR!gTlFBNzBe5BJxC9_3_y$9`mF@gx!`YuY zpCYq&NAsEdRDdX_KDC*>E*$y>6!|~2Qv*nC_3Jh3nLqiAg>$?(RBJXb1mD}q=30aj zKo=V(Dt|O^-bapGxh+@Q!LKQM2P?#lRuxJO^0;TJpF}-%A?kgqFoJGYW6nqnZVXaB zWk)|{iE&v*O{b+YBqO%171e~gVliK+XAe(HP88M^9nC_ht9>z-Y!kT`LIF|hF}ma! zTZ5I*dEEWxWQ9)aI1=p7N#>ZZ0a{0DL~D|Dr57JMEgU61HJTpV%f5>5sI%K!yaa57 zx<I@-M=)i30=^(_B8>l!sc#C816;eEsIew#Y#U7*+i2J{Y-2l(ZQDs>v$1V9wrx%{ zan5w_{XfsSn7g^j#jJeqVn&mp7*F_xqOeivEypsUzc-wE`+898&R16<ji~+g@A1{F z(XJn3mpy6>zoW^LemmrYg%(D#v^ud?*?;WmfSc!FB$KQBn$ANb!oUwG`!vtjUPHDP zMay=5wj6mU<b!&7X(lq13N-3k#Ssi_qU*191X%B1v1r-l&G8m_e}FH8ypgkX!>Ad* zQ(Uyme&(-3+H9fcoJ&&6uo?~(O%!T`jj6CkM%LdA)Ls19RdGuYQSn_9pBTmczCNe3 zh*viDM{_fxe2f~yhI5kD?O?#bePrcF;(FU&rwjF|hbtg4yJJ0`z%SbuH?nw^G>qsE zuQEnuv{^2>zvd@v?%Qq*#AHv;qUdfPi`;D5uWti1uC1(&`shTukZ{J6c$&oF)f6o} zE7!s)<%SGb>&mZ&4SCU7rUEdk<_Fwo`I_<f9dIOte&|sFZrf^hAKm#Ml<GdyPPw}4 zTW4Gik({|Ua`L`9lsk%5wrQ8M-zd!gEn{rI$vLlCRjNc~PE!vn(iMo1B@Yk(!M-yX zcqljTt+8(M0o~&$Jk3D-4+z#*$I-?IZd_>7pP1B25?l{--LUS9L~WZc1F;=@cR+Jo zPWz<xI?bw7G!tuFE9EDR3>y6I2g_K91jTXnsv-a=_faO_0s+4T*F@3pO88?NgffG6 zlH8Bv@4dnS{eKg3GF(0qWR3QZq5oM7g*ZU;PtKZ_GJ8jM!ZT%JJ1*~1@5U?;CA0Xj zHr~UbqlW%u;Vpb$_RSXhct1gGY<K4EWrPGk?N7MM*)4Qe-7LOP{4bFT-W#e&s_*>i zA?LN1o6GG_3BJE8@p0w(-G{C_V4PYFKV(OVGQcY%;l^A2_;}}PJ@jmLj29Ds##w(3 z>)0`aFVJ1sW-^3XJwS{{zm|X>wgcgDny<B|vm+wZ^k&D<rTF38`D%6xCHWtGTi>ZV zHw(+O@VQ1|Oe{D*h}u8iSk8HWK7s1M{!}0e+|WMtSpc<b$E@0D|4G|Ky<bw!9=hwJ zil_!v3Hb+sOIC;fN6zS9cKz-ggcdF@2Nn~4g{}p}!pc%f@_9Z~V+<IZL{q>!Q&6#l zrAnhniE;rEW~dRb^7=MtOlX4|<?rMBLo8UGPcnuH3By{~E++GP;lB|SuLrM<;Pz}T z#zfwtz(RXJyh1sGGyK<+X<+qUp@cl4x=QMVFod;CJ`iEQEp5ig6)6rCLk4F2*`K%= z0>u3Ujd*9bzdFcnM_~Ggw0~H!-qAIY{P1ap3aW6Ad6I=+IxdsyA^p=n1v!8UJtA?z zVKkr|sj}BkQLu+z5#95Rtg_hvhnJVPcVlA-CTBh?9|sVRQB_}$jr$WKbZx}Jcb-<Z zDTH2ogWEO{K_quB%VYZo<B%P+X^MXv%fVy&{t%HJBBx`{G(dJ|$WJIQ{i(RAw@KZ8 zF)=Y=i)tcW%5`0?x8c$%X7$@bR>17vGk6@7R8^^To|h-RO&S<lk0BusGEYwqEa`B- zDOY^&AQ!tI=0CR<Wgb4u4@y_47Q59fOYbZUrS{Tkk(UNKufMXXnZqefndzg-)pS}K z*q8vV_Z?nil6}>2QTW?GNmM>Fd{nAlP}cJf;U{C-KUsO%f93(x(LM)>^=n~UC)xC0 zaP{W>DPqDFz{o7U4r-t#Pw=$eD|NlRci&qpd$0x~s*pfy@Lbhs9Eyj`2;Zn@ohTMe z(pnf<x!(j_y2AIwv0fOWE$yTh)&I#lqO?h($n}bPZe6SD-F<=KskhA#b4%+8J7l#! zDh@3*+4$wikaX1y_ha(B|3c!CDifQWi#o=2<Oe0>{-L3(c9k{-DUFS8XRhofifS_g zK3_!}w|loJfhR&V>@x>DA|>YvS-&3jAMhbpSASo<|KR4_p#NC7&rl_&_8cj(AnVLh z@odIbW@3IFL))y5=s)i=;L2RTl%-~gBU9}2fJX^S2#xLw>c0uzrdL;xc$^KJ=dFcT zUN5F(Sh(~s*`4)gCP3%hLG$4wsEfe7OAV?7OhrT&Az=&Te2gYUurn|IxceH7^ckVB zsTf~VH|%dkO$bPMEw<6kvf9fO6=^;<q`?a7BcQAunbA@HKE&NWz^o=EE_RrE&wRfe zeu|1@CG<zu`Caq5+IenQkYKD;JQY~xM8KlLMKLMVP?w{&QpVYsc;gk(5zOkI1OKEH zU@=jD&Gvn*QSGiTaV1*=zHaY)?ov|wC;jN6)+0Ydk}cI62U44jO+!y}6!<E|557ZO zEDdS3V&Z4=f+g~EM7z^cOF2^g>33aFU|t;jf~t$zp&SfU&h{Z*fR}8@#G(ETXML)H z@F|tv+R!bS-(EoC)V*-lgKfrOeTSy5k#<%)-5l++XR2%<lWrKjw)%EYuw?xJKdf1< z(8-eZF-PDAK_!?tw&zWM<S$bHU_&VUG=W%LKw(W8gItyFpqG;RCDe!czJd>iYjq7c z-@0<&uY{M8+iH$Uo=BLV3?Q$CLDEBZC1@3dtyrob$RC1Sgn*^fmwWp${4lcQ@?O2# zzi(Tqg!Ai1bYWVSH2`!W&eZ7*+dd-;Z#gm0M-&{)#IIhj(sGJ0ng%Ys7-z`7KOW+I zC$}AQHd$K&T?&fBl!l{~q<8e2kUyyC8OfmFpMl8*m{H#_*5$<u`RUtj=`gU5_ok|D zX=<oM@R!Z&Li!cyVgLNBF5*A_VnBov@nN4+B?NGBdZ~}@YtNgj1(4oRxIU74_4lT& z^6F0&ccU82=ZstR>(35BBkqMbU4o91HuCL7tc8z{Y285i7@faDw?c7;utfP~MY|vc zVaVvdRM=GZTTPvJ%vMX)B7rGIx9^YH?`ba>c}uwTSCGH)b7A($)Wk0hGsX|WbUBU8 zp}y<zreyLh)H)<4kEb21A$mpkbp%h`Td9F>k<d%fyBG*7Tj*JmMd0QmctIc5PqVZ+ zlbi%l4}t5>Mo{D<$YrcQfjp~XP_SY;1@MY}xcq(??sOL%UgT7-C@THYf}l3}zxmtk z1xGW!<5hp9_PP>YIA=11U6c`DKcgBlSvkYkW<V_wr`bW0px7X7--8fuUBHGC4$<+f ze)bK<O9=Yzd)qEe`>HcSGe4>!5yS`6hMiDrLjE8F&;OHHcsQ!_8*bk{2+Y3V10>fD zo_Qlz(gld-vBY`j-lC`1D@b$bHHUNlt}3XHYm9@EcA(j}Y+8;@Ho+B|oR7F8JhT|A zS^o<77nAUZ#3Yc1t9K52)4ID6`RlMu%WlX!|Bf?D)aw%Lo_*AhJHSY}P}-Q~Gvgdp zc{EU!vZGuLRj_)Kgu=0D(6F9Q$;@Q^n6o8#ryqZUY?jG;l$^6<ww0-PSmflx9Z<%z zN1TJ&@NG>0BAePky@D<8!=I1^gcw10oxmOCFxqRm7J$<0fcqlaXTbsxhF;AhN&+g| z`){sjJ=7p2h3ZN4Ijf+$?H(6?`}CKrtf30-Wcm=>Fyv)yP`Dp1|3F>PFEUI_YJ5bl zlZ|7bDAOw#-d)3{n>@^(kjGPg<|fr(6afb?csEC9@+<RdfR~?%#6pv|z0U6F4{fwx zTK9MAis;+;qdW1*&gPr5eC_FmPr!S%JxjN&#ry9O6-lcE)$4ViwO+(?Ck)yxBvUA3 zgzn1OoggrHaHCH?`kBPP@=>7z+^kV!o5xh~*XQIjs3TaSJyG(o99$jHxYzqDDrKPj zVra#fAjY59OI#h>kXO*~^t{zvurj>}t+Wo{#43%BEzXkJAY3)RTM^T0$focFB#v<o z9SDp_{y#5(7Cfa#dT6GNm1YZ&m6Xe7b5-qg?k8E;^3wF6M=Ayv<0^c&`L=TW2*M_O zLi@)KjkZs`1?G;~3%W43B!fywnhnIJo!WTXMF?LyaEZ_1r(3}C^<Gy{oL!bbsf-0p zDCy%jXzBmTY;i*b+I+b$J{Y~flm6+#VAV?7CO5A?XV1gCdS`uV3(_N{s;_KNiVX+% zv?f8+P-MpD^Q(M6N|vt(`IWb45EGVzSG4JvTn#v7OYesMEcfZQk_>--PEb7$3QYTl zqLyVF8HP{z^gGKxz8FegiaEmhf&|B;`a6`%7lN6v*R#L!p<VNqK11rDO^mD<)m&Gn zU%IvMs_4{rHfYtwJuc+kbxZ$veDe5o7Z4fu@`007^C*T_-r9Ukcr&8vo}+l958uR4 z`x8BW@b;(%K{>Bwb$HP8AFT>29ut0y&PJd-SbWU&V@=iu9+wwDjkV&F#7F6M*RSIx z2R~TEp&O?(xHAM{rMrQ@dV?Kd12|y=1Pe@;FcD%k7>HkAH>yj-nAZpiphBo1T@HRk zKP@hOv@m0tRH)E>rD90@)>%Tvh+R)tcFb_-Z*AM<UOPES-4&mIKiM|W$+3u4x@5nf z<sbs?VAZZIEz<MggkTOc%7~1#OBG{NgqBUpd)XU^we)|iHAd%0&e!HCO~bT&U;t2g z+)m^f^F=*n{ic4+BB6*$Cg*1Vpc6vnodD+v2~VVewnIpFAfG{Wp9isj8>iP<knF}) zue1{xdIVK-K^H`pq556Gf8_Fq_?CCwbRjwSHsZ=hn=|ir@aPgIP)`}}c*tB4kWjn< z$ll$N{uWr^CI)<pZ=4PhKKeX!?jv$J(ih4tlypD^OPsSQt+(O;X)h>PJm-ZLHY(b# z`lu_qVMd4nnYh{Oom?5xJDGeZ&Xq~nzDf|EdY}MpYF730={fXjR-=7`6zopDk`&>p zZz~SHbb~k_I86I^2K?6Oca`q$Ko6kzWhf7q4};+6>C9uPr>+gZ&uvt{3gr+00hrs_ zXCJ>Ymlb`k1t?iqcF3^N(G!a~Z*Qy8<@c#e2JdEkgsSy6B&);O9D@x``DYGId56>G zWhKM)#MJ{Fa{Glol*6QJuMW)eCs#uJzd9-9jIPp>N;o|Ip#m9dXcSm)K>q6iC;m9U znkIJCFjoo*7&D}ZS7y3YZDPa-BLto-1O~)Q(_cKJxLq}#3FfSI9`zgC?Ic`i7jIZA zd@G>01?#0+8MI>a(xw3_0_nF>!KuVZM)74xji<*wEMPfR`KZ@5YW^RQwhx%@g?Gy1 zJ}>80y>#_LUYXR`=Y*jK{}p42$Ec-;))G*RjuXSV6H%(5Q!*~5So?g9!m|Y34J#gN zfhh*e>Y`{MX@M5Lf#Ht`al}DyU?Seo#5g+&Tl#xwchjm-t0-{Bv}ECwsD-0FihqJc zz<g`VXl+a#r7$3lH?!hVlVkRwcF3%qc@T<y4_X-c89~mAsR~w()DsW9A&AaV%Mn+4 zFOFNa&5Q&XA2KB`J0X=E7vQ24;#zfobk~u`vUcdW1>JKOJ)R<J{fWtvmL2C!*}|Lu z$Vp=;nb@psd%=!%dP3TI`g;f5-C;@iJKG!fjv0n8GHfMk7`=+>tdw;o*`2~K@w`iN z?~ST4=<lhe_2wdHju*nRv9V85<ZBpeY}pgd8ozueElkT}P_ug_@-pvDv5PuoWk)XO z#32oCa%byDr~Q_i9U(=&g-!LyefABHKP#4<rc>i1y#Y|k_XKK(EVC_NTF;{nWF6uf z1-WKhHU5M!c+B$u;naVqTh6IW0Fel`m|~%|D+QbBRwCk)Dp={;a+!I2>S*8zn@mu? zr{-#80wW7dx+&`@I<?~wB5bQPRW&dyMEP2{UZNyV$QN~qZ|0xXV68U=)hUx0eK#J1 z?)Ga!K8%Hi?qRp%4UnF+%WGOhZd*spuEOPPLq{vddh<@lfQnz_xc0{NLX84U9o`_a zT4GKH#D~y#V070Ob6!_VZY<YBlLHsb|0KUB7jnC+%B%tv_fkT+l@tNe#$~!(ql%0M zhERGh>|`Fdlu%@Ms6CpYNqHUXg?d!fi9u_uA=&`x!>Rbg$ykcc{O~DPE}+LKg+Qz6 zSG5oB>@eytF<le_fCu7r?uW57;SzNatkib2(9;p6=lk>K(8+vx&_fIhQenH#yEkY< zz3b`w$Zpmot+&e3ev3olKzcjfhFu@3vS+E4#Uvz2_^>wgaVO$c#np6Fn?z`ib;ETR z^#v^86X8(=&AQ3=@&0yMRtIXFN*_H_q8d#1VtU`hE_<C=j6;<$t|<6efWZTq-s`~) z#{qm0dzIa|xZDVenDAzL6Fka@#`p5@eM96<C+;@OMn@=wDkhTlX(KeWTDL!4T)hkt z!UzmVblOE?GaT>Azd4Q?ZvTW{yz$J;HUa11&g)<I_5mxruG%b_G;OzTs~)_QvTDWs zFx2O}%XU_^8Nx0YLnn6%QhZ_Vz`XIUxBn&mkTc_g%^IyA;|Bqm>pe3uN%wwjBT*Q$ zRIEC0!&E}w2vcYnGDxx%s(V)(UcnbP){kS4D7D)T7#esgKZBInXT@QkY9nLc?<BL2 z%Od{P>$(Kzn~bguF9X0E!us*a^UvD1`v;oOOblXzVH@=+o5(S3FsnLRF|?<@r?bSt za-2RlFw5eR^y1^l@+EB?x?sRJu3{s806`$6d&T?{JSS$H?%xOHUMBMnbMs#4s&I{x zP#9DJZB3pW1yR`aKs&JL6~N5f*ANstF#}c4aGPH?JGi8`U9EA6G4<*WXR=X8Jz>XI z6|vtZ(SnWKs70E6a4)f6sNUE_9L4i{s!|K4qCP3<^KZ|we__{wpy5Uxed_&KWB_w0 z=<Z%Z**UqY=N{KWDOEMdumg&A4Sbz!Fq`f~mu~XY4Bwm}0#dJdt_eJ+EIM}Lr>34x z$@$ny%Pk4tPMU1Z`4RBDYN*oIw%=B5JY?(_mdA9<G3Lv8-W?9fXZDcv7eV?@DX3)t zrTt^`y)#9FmfsHT)v&&;0<2X)`7U>yq`J?U0+qOKke`0dN7O>z>oSPxjFoQaB=g{P zjXP-L_gYwT3tUO`q4HF3hM{?9Q*2E2x}!~@_`x%BN6Tbe9VQQ#BwR#HkFgeR`JK|f z)$ihY6XFY}U)|ZOd*P5(%&+TNUu~_O4R10zYV1M>8Wx^|qPx+3f$o}8WF?1jTuvx` z=Vs;=lDtjEwxu+?<dB=T*X5hLL%`#qRCz$+EW6(xA~&(2xa;ciENf33Wk_7sMPSoA zcIQhH^n<6!!_yhJ$2|%p&KBvb>%95-bFWZ~8ibL?-4O%cj*yf@!unE;k}JnDO-#p! z(e8X}cRJoGc&^VQbNZzDl(z_UpUdNaDSZnCLXD=CMw&qB8F*#7#&OG`p~}0QB1&P6 zeR-T)xlb6d8#&-sLifcE)@qc&xsPMs%T!bZlqiTn^J_nueJ$e+nieFZM0m*PK4e|l za)?$5459*9+1d{E1|fsSbl+4E04Xd#!v_Z?E3_Jr7}YDW{l!|%)>O2;u19E_U#`a_ zNLCxI`^LF8i2_2;DD`#QProiOxuSQXw*|ESmIZEtH$2d(si}K!a`QK$DI2=yYL<N| zDFBYbK>ATI_f&-MIk&&50+a&%?WZJp|3Nv{4%NBK+z^uZUg=d13=~C#>x?`cKyVog zRL0&Jpj)WRuTJjmLq6#PwYzRJeE!=zErynM$YiaQq2!HVWK0~R)M6v;*(>_qPuqKR z%%hR+{Q=!xUBMSd(T)&5CPJ1`mVv{RN%4jKZ}zVh-k#=KtTQwU-RY16CBWxou>VZP zuIrT|gO3y^tz3*1UaW_%%4;+c8x5<fanK~8<4;+^9MubQnHaR33+ymu&UkRe-#Irk zd1n-A2T};RlsgD!^Nafrxs*@LqQM9um-N!J82^z=olAV}a1BnZlnQ#7uLR&0kl$c> z`bT?>uO<N$fXF~#>lU1ExO#Xl2vB09yD0y?qztmO+Pj>}Zup_dtex5o-B#q)`lC$n zF*I;|^F?^!WXoCqIDK{6E};M#^iLY|Sq)wkoCEjf2X+y~0;c$x@_K}Wo&(0s<UV8n zUbD?>rv-#J#X>Amc74}$Jw4$~ZA$7HVMj1Y|8te;5t)R+`4$PVhV`kA&OY^|tw7(1 z8OE(ZLQ>R(OmmZ}8HLEotg1ij5r*QuPTHB5ELO5)p&^&it$RrA!49mPjyF?dv4L!c zn2l`=7lDXLMR7YhE<o!FP;%%-ZE&bkPht^@Hch)Ya~h<6Zq%C=mU`*J><;)WsK?yX zDr6-(Pn5|T-LMZc90?la2EzHe?_z~Q+)Xeicq`tjzTu{Qh*(7Vt-F1fLF%(n^5aX3 zkr{+3AqmvHjo(`izvo>Hf%C7+gY5P-l%d^g{;9TQf#9M>0xD_mY;5zfo{xaH#ilDt z8y_I@Yz8GV0ItFK5BIgJBb{~k|9lHtmBwbS#fWlMv&wpHt4bc0wfa5@OYdg#v&eO& zX*bO0U;fAcI4G%X^e_dUHfW)Ll#=uOO52E8t#IOQp<wd!RM^3WeedHy{Ru>9!#~S( z>TOG3NxJn`Z)Jy^<hVPyJKJ^ce|>DZEb{nIk6jBD>HF*kn4{(qBm@-a>hZ%?47Gf{ z&(@`s><-;uCoMqy8o@UTfo*UO+=y7x_<pzb%2&_yYxyv*uYyJ<MST}2dTO1>Xd$Q} zLVW%i88S<Crd3x~5*q+(&NjOb#&t5iXgvH>_({?ws^v*!wm&%u!|bW5tbe(x2#}|| zWHCLcctBF$FVb5S0|kjhT4A~p#szkn<eC*g;J&h;Y!+G@Mje7O3ZS?zOjzmq_9M0k z2PL`KfMpLE5gH%#4hcQ0@(-o!Sn3fvYl@5#rg}{NSHDnr<|RGcc4~Zb#KMUT9xR+= z*lE%nbal*_&=ZWhlU7R~^|}O~#o%IrMKJ&tD=;xmBVs~3NH2;vesC-;$s2DzW+(9B zBQpVu7^|)m!gpCI=yty!r5J!w{<$5&6I1tXpZSgV+S*!->Sz090aJ+wyGPy!WLhg{ zBx(}uzsShQK`C9EZ}&~jkn-B3SjglYgpE>EjM=eQ!U3r0+zKwU*{pF(gcci1hz__e z9#1<=`5bM=N%oplsk;ITTa%KLcXZ$HboG%R0qIyi-X26O*$MDcD=Y<%zBa3>Mtm__ zM`@+Q1U}Hq0xiBbWTM|<a`Yw^t3ALrg-c&77Z5Oampi{nBfEok-aCQFZ$-F<zr3!V z-QzA`qrp&|x@a_yZF=R5ePJNdZM$6(Pe``{V4(xq$Q#Ae8<yJ{@E{b0z*Eciru&8! z&5mz>N{bBea;E)s&=EXEtIf{KNGMQ@P7(VB(R`P6C~54X_ZX{~eZn+k_EKtaewV#t zF(O(_(DBWbv=!_OooQ?M_fQCNG6J(FYYjdyW!TQ+>Gf5k(F#Ay{e<3gpHa8xyZX-{ z$UmM4XA2t}Ni8jc@Q4We5y&|G?pReQ&$l+t;q3sam~h=LzsRVb_LMuq0GX5<6X*ar z2!kFlmg2xg-i?glf=Od%gJsuIP1ts64<*1?&D(^1M_-~)2IuQ)LOY>)2!q{fV}qHj zfx|8#y4W8)TSvh;(=FYbklNeZ`)xtR9CTJDa+>=^)K!n<`qPRtb$zA+AMLEpDDEsy zKeqeNGDvPRd43~iHKJhZr@P`NdI96$m{8i&$x5DU4-Bs^#OUD#;*W(o@FJfOvD3kF zzAOtwHpzv77nQ%%Ns{XN&O_%FIWxTR5yeWg9uYo^QLK`;Al?(h1jA&c{c^0a2ELoJ z{By`2&Y<2ecy1iDs8Y>;^iXY2uYOIX^iT(!oQYb_a>?^4$$<p&0n>8v#HRnB1*v=p zIUfAvPe0HXX4CUOl3bz-zb;wBN|6WmXU*D#BvV@x4)gDZmEW!$$~g9Pr;TmO2)}qp zU$4slLzZ<a2&->RM-Lh!E0?48Sk%N&&4F)wk)HT!-1bG8Jk?I+)D`J?Az=6<8vpRR z+<R0ztUDsZ>RG(JW?&&%_Ed*V{c%y>d3(Is`@#zQU{dl8g&1n?pVW)7X_-<w0<hTN z_Wx42>>G4P%^+0hb8?CP7tUU-VmA7_lO}}L32Rty?^L_@svkm`6bjo4lTGh8C24>x z!I`E~q0VKN-|-tK>yLZLm!uJ{g5jUol<W81cX90gV<%->GZ*#-&@iw@Eo#c$bj-Jm z&A40Zqs^p0?_4a>e^}u?Tl)_8<Ve!OZ}u&suVO(gDS%qgWZjCYB4KK^IPF~MFN4XO zw*}bf$+B*ln~sS={8@o=^9|=IU*QYZ3GV;M|9sI1m%M#=Vmh}USjn10j9wP_!HkBG zhZjTTv!>KxF5e9ara~@b?SeaKaj$3$QxDxYxzwRogeo>UIa;q9s*Rc0+Xqk`*BljS zi3SV(TA)R)Nhm5pn4usuC*~uU*A;s8mC<Sj3%#(GK#~Mdio);=k@E*lv%QJ}y$Tmc z+Oh;NATxWQUToQv<OA&9c0;Kca+ej=hX5#7ev)nb*j|JP_u)KYAvaowQ1HvE;McTI z5(v8d#r)h@*M`3?Bq(%&1aZS9|CQiw@4yjP`L_gNnbP%17mhnqJpsc+UywLVCWL)_ zgr3|xq!s1*O1~Aeaau+WkDb2}VGSu_b1G-DwjNOs@i~9R)VYUuH-z=gtK7yI`E-N) z9gsRI$c5*I+60jby=sTJIM99f!fZF%-Jtt+1|lGnE36ddw$L<dF0j!`7$WKDEdr!F zF<o!JXN2gPqgY$#90GYWnwEd$-b)u>Ogd(#0jf<Mq1v<GNYJihi(91&?srMwH3F$O z>P*p*SUQoeVDgJs?CytEmx{83m{Gai52$EdlKQe1!UeTyM2`lR!psfYXC!n`M$*aM zAY1Ma-e=bD$k)Y_Vw-e&*Gn=F6{gTxFUl-gnq8!sA;tRs=P}h@hmsGUL=l!>q;;RL z^v>?O3$VCPS7WBpnR?SK4-FlMF4;l4Xx*GNI(omh9BsSwGI2)52fqmQkFcVVS)XV; zC`<$h?6OsAI|&KCyD@ftzC?-~ZzG!M*395d3R4_%x1TPZURu0^YkjV}8i)|;O`X)i z5H<4P7H>@D=rvFWvOT|9Mwk8hGXM$Pg0=!S`}i)~1M;QTcP`CmS(4jH!<EhztTtXO z*PK_an@`Gy6DWG<z~%7>?y5yH2!}m*j`YI`cZBr5!<uY<`V{}VhM*@0WMN&QwzDAR zb@tF@eXaKmi+K<5Pa9*vQeze9a@QT+`ER#_8+``Ms-n>reZ64?GDN|sZ2%0VKo^1- zE6}RcM>JDi4x~y=;C_ufreA#br*Z_juY}r3x_Kde%5H7{RquY9$ikJxQJ`F_!xF*V zCR2jpBX*Xd5CO_z^6<Zvl981(DlKg*<YiKYW{YTAHvel#gL>Q&5uD;U3&7MihLWO+ zaovGsG`xn!1)PvrH0HDOc^@qXqD>?!=tIuN|2+OGh;UBXh50dU@P9j712<^%S)vY+ z<?c&4stwAMplD{q2P2=7?~Ch{+Es+GIw11WLW}a|bDX6nW8;vk#ti215#rjKwvs>{ zG&6gVxcG5g6K~BUA)H3@mxYTsasX`mGsH3dn>sYfO3K42YL09tOcqnJv<&yzSL8vy z17^|B9iU1Q8j82|s`urW&9s}R7-n?&ssR-e;QMLh%G|%S5pXhH9iM@bZz}Jj&Zrv| zukHznv&VFeK6&^B7tTW)17qCgOx|pE9{6`$Sy~7{G7Gu#HPe34ZLvwa#>pBn&p)R~ zwxkfjAGk_OZ`siU!*}4%J(f@;&0Tv>Tho}n$hDCr*}!rXstTn1FDGSRF>Kj=-!wM0 zT#ppPzW^*|B^+=2-4ZSe*Y(20;MAV&4sOr`ZK@B2PGA`pDEwgs1UA8pM}$|4(?ZTR z0_5g@c8rPP6La$_eJ3A%^LJxoR$Mnd1$jRb47$!g%Ejj>D_@`8hAjkCgS2)G7pf`s zGgX7=)zdB8-w}#O%f*eok+tHHYSNzs(yjryt-v>h`n7Mq76OE0i~5Jb3}1Qb;l@$N z3`rxU4Z7qcXjfQo`<tmWrh?Zayr#(RP~chv?-u}jA;)=7yogp2%AE@jZLPJVvX1pf z<4sS7{GeAzf!lZyske_A0yi-}nLKIOjAy6L1B@4dNSF?F?`Xn=mObZNAYw9w*-Bst z?Z`LWK)mQcQYyOy@c<}Lr`8z<-j^_3=u~kLESj&~5C_;t5a#k00@Ut|q&_4HOYxO$ zS=s?&an8)lJZcJw{Squn0Urcr4{sI~8j2>4P(&w&e!NU~*iYhq8?e89_DscN2?&%f z4tT}muwim{pV+D$W5F^IG7u5X70dQ!2$cQy%RxfZeBv{a;0u0hG$}60)UV<L3R+VN zX<rFw;mHvjd!ewmHL3MxGZhwv3~urh(YuqA6JS?DCKG@ta^s7mTQn?G4&FRxI>I=k z?q`;{4c23)yXV@g2^(<lbT(XeUvQ+}2hRzT*eN-j^XV61ogL?kwJ=>s*^oxH9u$e! zt@7Ufepr{w*%Enp;_R$Op8Zuq_KSGnTp<Wkk<5$+aC`V8;=;?e@3=amhA!piVK-*C zW{3pqX5rEs%(v!wvls+F*=y+sr~3}9d`<6b26f2~3aL4EJNzQz?DWFXk@_&`?#^ak zwik5sr)i@X@?p59((%&a;_SNq(D?@56c4rqcHUA8p%L9}J%BJ2+-SG5-#}E}FI~ly zhdw&NLW-Rz>Ko72MA-=eYu%3BixC1LjryaC-r>{7Uc<gvSZ~HcXNG%#ohPq&SYO9w z7-v}4M;1v%#_rM$bbI?1*ROV-(eI$7x>Wv!Xm;G6;p~;=+kRLc9<+uFN6HU>)50<Y zg(SVM(URX@upaK;QOIEf(^Ut)6|K{_38MxD4t;}^mhqQ_b0UUF;ASaMgNre@P1)$i zJ49XaCn)hc6*ZU;3728ErpCYg077EJKu81FFGV~xNUZ>o+6$zaQX0w+Sn*u){Tj*0 zeaYfab0RVzw>Az9Hyn~WIDlibrPta-gv__xZN>NNFCkz6M4eJ+S|I+<h#im2d>lp( z8(L15Q7M{sGoL3d?5a6W`-;)o@FC*G|GMsb9dvs)^y`1pAr>vT>vJdByp{D;2c#>r zo96cPbd(ib%c?rpi<7d9x@iMN%0|D^z_R(qA3EnbVLq;~2?3--<1`JTq`C|zWyrmE z-F%gLS;NFmW3H~^J|r5YLk1WlN05I25Cmd$2teA()C@ySITF;}vbS4bPk?G@Q6U>J zWOJt?s+)ItH-9AOgjA~{XL}_qr>@LC$`%a-PtHv^A#%v>=<#hR%`#?-CV&6?2W=8! zcd8(YNlxaZC(Oq%zHt8hZp5BEys-sIDA(T?Yq%*28hFwi|A~^!N>vSs#_UPh5GnO* zruU@Fs4@>HM~5P^fxUcVHhTg6nj71x$z!N+Ye)OeC8J}W&yw^Y31NyZ<C;+Z`CZF2 zSCE==oh^6>zQaM@sE&cCQ<(QKI1*osLZ~srMz?yTbz9N+e0~PK(8UPUuQ}xy-vyND zt`-4vo0V#<;7*d)g4|}Gc8Ef01$9rtRH0aTH?0RxNSUN=6h4OJG0b_rdz3)lCiua5 zDiJp&MPrB{(H@a{Yj;e=w|Y!#UXP8Ej#N*dGFab}$IWX&8KCzR9{9qdzk#b?utbj~ zlw&p4Y=cz!IYDD}{FKl~5o;M7r}3<nC}?sYtA@zH*fu?rch~t}=pH=(es=;@!H7Qg z&121M^Nm2qa@n7m)!NU9*sY<WzoTJHiAQQEy-@2mRXrf8%NzRU#!*zCbj|;1NQcvn zZZH6?@CT#UUtxfB6T|{$Y%P$?m^Ub@DlqTcdIH=VOvOFbADi*C{fFu-jhyhulU}|a zrW{!>8^8+mNw3QE<h%=?KXcY~sgrPOr*UWQW^;)UaF480ydkj?a}Z-rwpEIm6;+)V zioEpl5WMDy3@QS7T#}uQL@t<A5n9XNm3Wo#e9B4@@N<fp2$92w*J*a?jHc~U|8q-P zE42M;1B4d#g31iex(Kie=$@)(75B-C@lF-KTTfZB>VhY(s_YFwoqmQUNMR)T8Qd1` zFl|b<Hh-riyILW@tZ^4}XXeS(-ibY*WA2st*8Ua5&1sZ-<jr_PSF8^mAl0o;%G{5a zFUdD`3EqM*gh0WKHqv$4C$`xy@U*Q8+qcKxM6cNQcOnAe`G8&06k9nMaPrxLKN05k z?8+f7tw`VoYVe&Tv@kF~77!OGMI}9lg!$~zvEv2Yo|Yh~^7kW~nVH=>Jq;MQ!EGFa z<^yu6kWgVGEnC?I-xOr4Zt9T%OtlC+oymmtKlSB$AJb-n!Z7||cXFReOo_P7`k?W> zh{nPO2FA|NUVPkteCd5VJF~j=c*aDM)|o4rIGGxBw6%T5zXx#R5nF{`6VXEpmsQ5W z3%kd(|0IF*$|<?MJsyHOF1-}Vu@!Tq3<F_(v7t3^Fa%$&`g#pXf-n|>QGB-i;Q!SH z)A{fC`$N|^HAS$OyQCoko_~c;y{2rE3lNq4nApvJJI)q<e}Q841~2$*wN`CHOR*8> z3V*QaFyZxnE{;)V!*6y)x@r^hLRC0?Mp!xM#djq{eXmCXue*@`8y+x6L;Mh=*Hm@M z(SAR}3fjCVlUOE>z4<>cKr1U&=5t1gh8+><>p=7v4V?Yv`|v;js_^}LM#SuHj6nq# z?vRcr)HgwIcvIFkxctcnzmQJ9i8J%mX@^mWx$qz;E#)UNxK!}gwT|sR{D&vC9X1J= zCF2OyKvavMNbzf*KjER?Lj6c}%!FuH6RywOE%sZ77ioL3|HFKkCf@q1heWEB4j{n! zcyk$x79_EVOM(3YX}z!;PpKLZs(Pfi>3VgB^bQ*CJRl;xr7T@a2|dL<fYUeYcP<ZD zF|uTfb=<=+d~kkxeX+tnuD&Z5Ao!pO;1<6@!R>=I^aVnc+ZL|>uL!ar*!P6q@bYck zbuT(dgH%fI@abOirO2Ce<zg1>AL|aKcbhO(#2KFw`p?#Ce`Q0JEW5+Tgjn;tWs%Do z>-X}$XrBkE!SRn$8@>g#{9E`zitgT|Kdv{*^hPD1ZyRNO<dbM~?_iY*HPT<@@^j(b zxBa$ms7tpfSJyB#<Yf7l<=0b-^TGQm$%Y+CB$@s%KOv#rzDpdW+>pZnN!3jiOD1S0 zEx(1u6Qy_weVlh3<ZN^wkxKq?Tbvmg%6@4T03KooBeAgLa^8?UQR;&J{rySvM#SH^ zlpJ&Q@~fPM<rx%3iH}H`m@yiyV8*OO-s$Ul!X_UVl27tM@g`o`vf%~nx9){s=peop zOm)qxIc(gVH}YTCA+%3fJHxQHG3pxeJTzEZilxbD8HOkN=Tl2%uEX)DYUmND{YJk& z!Xlf}^t-(9rfmE$8xeHUQM3L+sz(u2neuVETF3Qut~za)U)q1gLK-Mc>8IW-+?8VU z@m1vglNRA!N1!;EUGG1=m~cn#6jXlw98s=rmokvL`2F+mB~R|T(cGe}865-Ora|R# z(kfo8pdfqQuw}6$H+yowCG99Pt4F-N!8+U=3uSyH!+EmSyvM+&EI;_KKy&^kn{+Dw zG-r;B*8}Lpz2i`eTmDxqU|dNKs>)L>uCw8+0LyDKD%jLKeoVYbi|*)Lcx(qrb;uR^ zt3hW$h?KXYzf(X9CI958!yn$H!*%x;q5BC~h03zOtCQ;%$0q{Ejx$E)KxyH?>R}2b zDC|BOvkZ}7d<pEZCmCT?PGbO9w}=t`N9>*wm`d&wln5j|B@8xUVKQ<=&EbXP+l_{e z^K`JPx{FgG*inq^(BeH_b=~8FXR<~6o8s$cg5sM=42rU=Daz0dKqfFPnugQL=5qC? z!HF-m@3ZdnVciw-VfEBAbJHyroz$=E?$oRVnvpM-c5cS5<TgfLr`nb-?t;rLmwhoV z&8%Orscq1o*A|D<T-L_GZ^k6VF`K=`icH>>#3MKJ8c#yQo-$9H-{ew-md;I=%vo?q zQtZHt>h^;GiudaA+e)^Xz?<BO)%XrnkC>q75Z2=D*MU|rLc(9kCr|b~OAtbp$bfDJ zA;Os*c+{^`oO{L|``lI)+}DHVyS^>R6MtCWd$TSKZb&x%apU*x!@HMfY)#BN2R@3M zEz8TBvb!$Jt*vi;_q5Pu^i})uP(d7Fwrkvg*Y`DN3eF|mWg36-$ctqyr~AY<S5Ov* zIn%3w_@p#a7x?_;St0m4*z>o<VG<P-+D%)+lb7M};r2`P&>P>`aMhB#yu2PabTq#D zh<8o17{hvR>7@@VYx@;2os*N@c=W4<<w@8;zHB$9pVa7yEJfC#2V{UEK{}BUN~vEs zPK0U9==t7+N^lCp!8$Qwn8|N+=R`YvZ1F%29h}t6?5)^1>}F$2FB=ylyV*qXc%9jp z$bRqjonVgr+*3<;Yj^1pIq1@Z;f@U$QMM77n=3A|+!PP<Ix~~;2+Z&J&N6U9XmqR_ zsj7zL-jwiZ;5Eh5f1z70^sqq;kGx;S8a6mYUzReMVbux<_1Hvi7(HB$SEPt1$&MlD zWv*Kr16?%}-vg&yo_I)CtX`!fnxoN5h)hJCdeN)W{;mR5-MrlE5x)W+QS|;L?vd#5 zeTG3I8cY9yZ}Sn2^!;JzJM>mCDq$iv-AH<np(W%*`U<Jp9r2;)-SE5_|KT_-aned@ zjZ%+73n;QgD|9;dqWYW4JA^D(1vqk(HaE1GJV=o%1~m;eg3dTHAANcIV8z~cb2IXI z@|3j;f0g-s@B`u*^BklaURwkHg<3w6;){VOs25;3l>F`O4jdoRBObDbZob3Y4_j94 z5IfTyM^qN>EPGse-@>fqlRF8m3rBtVd}1R5_>4lpSXNSEy_HtPU3WNPlGWv3l4kf= zWJ9AKRFJ_#WL34_9{@I~Ds5oWzDJ5Nl3zQ|^t`%SelZFdDN4yc$wW>{G$X)EmN|{a z*>Kz2etEqdGq<+huI`J`TR)jU(Sit*@8J^fw~DYL!w!>7hr|%ev{dI!CV!hJk9Ly{ zrLuDA1#$NK%Yf&5CExrPF2{X~Bt@97iO0ZhO5U_v+26i2Y&Nj<0B##PCox0v9JuZp zrP)<8=r&Tn&cx>SAGdn~axHHYw%2-b2%PVUavCo!4i8t;QL-7M{62ie?KcM3P)A;4 zfe5~@@n_dwKb#l2THZY5p5v7dn6@%vSSEZtbi7>C^<O*G?M|d@NXhUGP)LKLM5qXS zpfF<5&EH&^k=^~j?4_@A{dB_GY_DRK$#JYSbBos&bb?MnS5YZ>2-tvH#)-F4NRvv+ z)Ss7IO$9d&LKz2du#Yv(k-pn{-v?yhM0iBZdiciI7seIgk5)u0K1VS<zV`j_5QW-d z@O}<RZ+RV(7@EyRZrR&S`8Cl+w47j~#1QZ?B7srE{kZt?Yu9IZeACUQqohbm+KE&+ z;YYR{R(&br&6xL$!p+W(&9!eUmw%CLeBP&jygV#b@pXiG2Z^9)M^_#N;67fWbBfV? zIPl=Cb*N?S$q6vl6-fJ5dCGHfm@(3jLOL*d!(w6%QW~<`xafq|vj^^B+-O456^-bs zQV+SHP(fdk?GTszhicdAUmkrV`vFwz(Z8qZo_MXYje>eq)Sj$=Fc6~0f8shr3t_S3 z)c`7WnaIicqqj}^sk`O_0a6R=D5pO5?C=@do)Vh9UW6VqK~f9S?+wlku+>z0f?lkL zC`un3jMkS0<N$}yf{}B)a{&0S?j);sweMceMyfZK#u}iGZ`@DF1BwHb?a?^rMOBd( zX7?Qq;o$g9+wB#sxkVujr$q|1S1U#LqtNvAN1kI`E}aQ^E^Of19=_?}VL@(Z>Zf)L zuAPay%4R-+?8JNT2M`)9AbPK*Dh}>2t8ZtL=^!$Ts^hPmoTlT0sk;#<PDnSZ^BrbV zz3aAXT9N)$ZW1kHkEhjyRv1831QXzOY#}~LK<U+qH+{26S1HnmC>jvu#&+yduuEs* zBJLTS`LezxxV$=4BUp_3wy7CR^d{Z;z$Oj@LrXAu82@~ESY`;%z6)<{8*4hw&VLzw z+}wPouT^<gs!{!o)J5U&?5D9P9?mN`BA2H6%4)rCBGqRxHw<2gFI~drZgbh6k@O&I zEP9Ox({st8%odIr5DlHI<J60=q!t6fi-?tVi5)2l8_LWAcH?Bx7W&-OYKy!vQ0=9S zCLw?4`SG3PQwk+P1U<g^90&bJo|QtSygEm|V=;S~nI0fO!XJxXdgg}8ugtNAikK~> z@AFsaNz;waX9IkiQys6QLCw0Ovy=WYlhX7b#euoje80^vFAAJzsI=TiuSQEmF^^>j zX{&CTy`c5H*K_6EqLaVrdo7;!A{bMM15m21NEefC#nRvdLMcDQ{mqs3p<w%sSCs#T z0;4!?UV5wkqNTsl0N`H0Cvb0D{|+EJHY-eQq_R#Xp&eMoRbfXy#TIWjNK;*)r*c6` zNMcmKzMWNcfLsFLB73yC;%(UOy^Mq-*K3<IvTOt`jXie?`t%te89e^8EA&ITR6=IF zEE$X<#Qj!vDgbYE>5QU;0+Cr9i2r`ckO@K$71s_>0D?_^L=8M&eGXkIdrfjU_+&VX z<p0-*fs#ks7;*Q*G8x(14bc~c)7Wq1)V{`D9HXQ5y=ZDKJnhfb`Dyxp4wDvF+(0Kj zTj%>qoexIQnJWW`&uYKs;zH~WVH9i6g5h1CGi065xH4DD=+~Nl{k-f<3}rqp_$7m^ z>ZR*Mj9H@rYb^$Qn5Fs+6AlLYZ0fJ>zG%zNe#5@f$nc}Y!nf67Q-U&i2rSNE$yXI4 znnCYM3M2dO2CHy=#(~xX5Fvl*h@z?X0BStkJvW2CA&1L00RpIq93hy9`?@;tDwlVU zVwndkY_9Y4(4m-=s7Y`{IHm*7c+nbK$I9?{@4)&LHzN6JVu3<24Z+TtQl5yGQ&Z}F zO(aAf>doFsE7#c5ck5|3dgv&ow~_bjC<(WgIv32w_=5T8XM-5kv>$&XRHB_}({kfD zY+KXQCo&bkk6fm9Y^t&z>&`03P>W@f?k;;%MqD<hl*`H)qB-)*<jt!q8c)l=j#Yip zab!i;ZK-BmW|-}HQg4cbD+B+Q@cN!rl));uI%yE*=~~MOo%7jwv|-Jq?~y5WUPwy< z#4N9Oq|tMZn>jwfM@<=ZO`sYt{W)G``u2ItSfI=69V+9eYO?boN#s=q)2nYStw?^X zW8=5YK?v+kK$9`;4bom1fJDT+Fcx*O31{I=+pH0{Iw^}m2`=`RUrg^2Hv33tDdcn= z7Fu9v)*uLoC%8mX8G>x<n$adG;4_SV;H<!;Iotr=9DW>1{?P`%nl^mX^z$#h7}Zd? zk@w}RdW~I4Kea7f6RG=W+^TcAOak6B`o1zLb@scZw_T5QxbBO)ib>8HIvHaz7L`xe z1UQ*ZH@FA{lkE{6T`oloPP}vRZpQfKC%9}~531|NP)Y^mS*k1BgHyGU#^=ZyY{ktf zZFK;;*RvMZ_d3sIy=I=#F4leQuJ@pCA0GYtj;d11rbRC50`8@g_6d(%@q;|`354P; zNgq+=qVWpNrf;d5JR2Y6NK7G5R2PRq9f8QKmLQp-AA+B9UKa=+c+9&Kzq=_s#nfr4 z#$LlOtzL<);kEt;O&xt6K+(bgCZZUw%+0QhSG}%m0SCTA5(j&kvO9$AD#`VCzr%9S zU(3gfc|M_HG@&;9-z2Ys*@7+H9d=xp06w*9s~ditNa0SB6PG<q0n5nSM}u~_ZuTF~ z!R>F+jzkjhgP{*7K4cvr@QAk;(Y}M0qUJ(RmU;-uo2yX5$9v9Ej~ljkVw3vGHbXv^ zaG<JOZc?c8>t+^NaK3xv#p$$}&!V#K9?=euPxpH==afj2xxv5z-i_Q$0R(8`kz;jC z^AI(hb(RtWD^<(15m}4KySTY!w~_li!?QefsQsfEG#NjINPF-2-X?a8%L%G=2L3@H zD}-{RB$Czvthw#_izg}q>OBS;{D8;ewWTF=#T^~_y3jed+Jj_>zGc`|af<Kde@b&( zTGHqfEUKB(9T|es$1zzW5=M-VWee@{Fn=vqFx)V%j;OTTcIi6mmLimdM#Xj?sX25c z#yg<IJzpi-VF4-G7^+b)xwSFir`WB2sHB=;k1-6@Uhm>b-!n#9lQjk{1~WYKwql+w zTgq7+R5D>DK`=sa#GY&sjpr~trD7k0-IFNa-|OwsUgz<cuexk=LZ?`uKiPw3TfHNs zDf^1K);?rjNB}Q}N-mjcdqLZFKUv#m8!P((w(I@%lIOIdPNUh5+~=W>)H(iSPvdV2 z1*xaKke$H#y9aVh5$^S&)i!M`)nt1JXQ2(v`7!U;$-ZJ_O6eW=pB7#mw}|2KU-zG; zmY2)!wV9~L9-6F{^G2b;tb8{51UP>Be$-+9h!derpiNS4rNV+d!SmQLF`7+s%`-ga zdn%fD_fKEmD8-@`fq?zd+RIzb{`m0<tMi>XF#;avclUUnfP4A$()8tSL0ci;yQ+5C zhTWSiaQ5FpYfX~pzITQ`+pfODIxjhR+>N(%!5W_7Sa~WsxgbZW0`XSAIAroG5HS{I zLKh}%qnr|n-vv{mgmk@!>#sjyVCmf~M1|00YvC`h`oc@pLqYimbrh9Y04ev%<GasL z@_L>KW>9vX+$U;-(hwjvge~Tpg>_bkc9_^JtNPi`gM4r|D%bJz?vrEt6V?0c>)7L8 z@YBqJY{;iL=$w@l*?jH4kneoceZn`F!YWte?>^UkLTN%*8&v!9DHy$PkPIlF3Md(z z8upK1*`9F_?2fA|e@f|3Xjy6Z7us|nRQGgZL;Q6ZVD~0vvsV@|Y0x8l-q9LaxTy1Y zpCaL-28!B((*$&~=Y@*keP=-0cikDTWoyNElJ+}?48H!F&qwB;vd&3cQ!l-}*h#q! zNCY}{Hf{D@-LJb^9?Nm-9IJO_RNibl6NBLAFPQ`yD-4#`7wtjDU0b)$O?Kz52)+Ui zJ_kvgTX``=L+wxxCR%Esy-S<J>&Xorm1w&&+^mgw=?x^CQr_R&-~A~-`b+)Y)0qhY zUd?Nu(Ez5`nY=fOVZ4deb#1`k?B@vE)&y!(5}92<mh@1tF%vV;VDP?Y8DSs^(+eQ* zhUn`hb?u4se%Qby_$qxMPp~Ca6m`}4#X{2XLC=HARCkxwc5h-bb0Dtn!*30lPGXG> zOa2>%PWv7nBCc*H$Pa~DT%B2aR9?5!MA+Wvu#<T&-lK9q4~%N}6T7JDr84^~&-<(k zsADp7;>E9^C;2-+-D1x;=`QH>n)(=d?34vCDsY-g%6=X^#(fwFMa5ASP;~hIcSgHv z>vwMdan|YEG5kEZ3taZB4PQ>8GwP(fG&&?ZHWD2IpnHz(pA{L3%{_kHw0{jc{PZ3o zGm)mv-`3U!SejLrLF~L16|^hhk3jQ0C^5~*Ui<8Cnlb&8_4%G=QbXN-{t-E?YY{NX z{)iRvUGWu+F_{5*4=1D4fR?C#{Cd=6;?^UHg88}VzHqtJ9^UnOVN&_nJCk{FH!!jx z56&Dr^LZPPW)Xp@Ot_pJ`rxTBT3=y0pzG6PP1)Rt!rCA8C!%fkMh1isOnQj`*ByT- z$V2kX9AtWOsoVDjCfS3e?~)&Ty$SwxXLRc3%R8mI{jt>KUb7gXi+3l>hU$883aE~- zYI|pf%Gwzh$__t;%QN^)X;LR${c6jFmDC9B8ir)LZcsX#Rr2=bOR}XBWzZ(OGw;Hj z0E?K^Y}s~I7bUUObPXGYAZ5qb_Bike)Dzv}ba~~Ezr8&ZA((<y(MAuu;IC@6O}XBt zEd1~Mf^z~jM`(QEhwC*YxE+W!ufcKKBUK7Jfv3SO-chR#)*x?5u+@6gzUM^CHUkU) zE8Rho&O0)r)8`t4g2_jLNexqCzJ89k9fvUQj>E2>*r+1NzLY#Lcf45g-FDX$a!ds3 zg`A8GjGzwR9}`1Y4o0<^bBl|!YwZE_--@PIek&Hl@BOK)OavYq#ZfV1p7vwZe`RDv zjLyB0WjmE2VzOdU$wlBSbF8x7b=!`G)+3itN;+Y-9<x_f$!(`a^i~P3Q;JrRbqpq7 zqJaNh1XTT{g0v)D7@$c(8~#v2HSm_7a4V2>y;yZ?8$(x8|2s_c2Wtd*saE{8>BF9A zM5za9@84x9hE@96jyT*DA;}+6%mL<n+|KyXKc(+Z7>k(<85GorWC0ne(`RmfY#{3^ zDgTeMw~UIj>$XG-2^y?$cXtUc!2*T51cJM}Yl6E=aDux9mkJu(-QC^&)_ZQB+u!LP z-S<1=`SHN0KQL<VC3DR+C*127gaB7pSD7?sCW;>Hn2c^ujLZC>Jjul!UrUB@^u<=- zks14bZ>q<mxiacwKq#Rvib&d@{u~X=g-0rZMLoYApG0TPH$R9jrPJ%}JlbE&W?1mb zz&XX#Du{m;B$!17$!jjZja`b=yNf61#8|99yCJ)k$sz{i%}Yvibaj#Ofc>OYmjqb> zAt{N9)11H!Sfx#+)rMp@YyJ=_%%|TS&*>+X1uc7YTa%b!ruIZv4+mp6Nd%}U!VVA1 z+SBP~5sRbWJFGni1W>_Y1MIc*<t31DuHtlKN1}hnhOW~oh+ijTFbH*WC{DK1jn!W- z3(Z35W!Q+yT>?auNbSMZjlaA;TA$cf)72J(%PL)W;IFu|=KuO(&XDF!T)lTKgZd#6 zWVg<epRo~l(?-9HUifIA;rZB8=~3*4`JRI`^(A7#G0Q`7=oWYAH=tQ|ziUkka{~5@ zA|&?zGB0YvllrF!mr84;mp5plghXvgDJ9b281=3LO;nHj!y_M@GFTqaF+GE9<Fm_! z>oI7%*4&|2Pq{85XR9gpPO*$omKN!BvNl2=D;bwWR%b*Tj4w5VnXL9BoHwPv{B_N( z-$RhNHIB3J&80ECSZ0_c7IEb-H^F=h!6J)$;%~39_xbdDI}VT8=(QHjcY<xlHUSii z)F+i@(i<)glKHA{N8>Cux-RmnoB|QYX79!nveT+vri&207}Ga;N&3j1EbF$3^V)ld zIA$p_(i_6%w3yV+{el;IUex<x<?nd2FHv=;t46m8##WkV)oo54Cj*{I`#V)mOsn^Q z@t8KwQqQ)dwB-do)@*QA>&rV17CYHUd%hv}Te`QV2O?s{gkO5?<v5HTJ$eXBb(s5G zAqiOfr$47wdpN(nX?U#p4~uvwuWYXs?7!N%=bX5|$Zgd3NC+n;M;VUH=ZBwcd+09E zl=vHq(8!K~+)nwr)}1FaZeB=YE$3|82N4!1j)Ic<hNTPZMl!qs5Pk0U#=}o$<C$O7 z3&Z@rH8eD^8TWrohNW}Tr8+`~Wr4U<nxC!sTG-nDs;d(#M6_FJj+gtgll4|=KuNv5 z;HF1&0y@dyG>-v(%+a~btV6P8Y*k%c5?iKNlzx|pA}DFM5>-pO5m0Yja8=i#AbiY| z;sTNzEowDZ_S;Gl`H0o&DS$wUH1bAL&YWhkxm3^5yr?OG35cBOAE*4+k=47iZB&(& zMVW96A%BV$5yN9y{`aC&dAW6K{>sYJqfdvCH{Tl51wHGGSdPQf=ugX%exu6`tL@4% z53Bj2`ikg(o#8?_g?;Yw#+cq~&loeo{ZbUJne7+XIIl-$CXf~b60|Zfq{N8%AgYpp zfef7+1(J}(C_t*l2Cm5rH^#Uq+|S$wr2<F2cDVUi)S(MaOCMPfejD%BmqX_gX@0P* ze(<4ZWIR4qDLr8@jyJBW!J=w6VxQ|D;Ia9B^t$l;K&a(^UfRn*kluLUS=YT&jjQ7O zP*_j_$Nk0?&q|N%bDgoi17U%v7P=LpT@^Qo#6>Y2qtOCF_TM#yOULCg3#QT*723zB z%%qT->hY_~QM%f&6Hc`bS#-N#DF32T0Ajwp3{S^Tb=A>9Daim50h}?0vql-%uo_t1 z9wLrfe8Y{Amc8`*{vm=~R8VZB!vqjpr<hjyTbuRP2-Q6W<9AE!k!5#o&ixUJzow6m z?}FXr*JjQy^yW32$>wSNws41MEMIx-w}Pzw#Ks(wu$YaqHSLW$zK&jwN?jKZGG6Xi z8Sj-fDL?<<D#zhT{N#kUU%dIOig<A`Zb{>0PTV4%!8XrJlq?v(f-EoC_HI^j@8;Zp zj#DRi$-wD8a}nE0!#}K9`p_qlt^go9ZmDjXhUE&Z#h8HJSb!)v^@j)G00s~X?7l$a z2&AC={6Am)p<o19@a1B>oh0T0F{1A9HnD8l`W4y!m|pL~^}E|Z?V+$GGz2Kkh2Q}H z@j3~Im18WDIg7AKlxdxj&z3RQgg<nloj#)Fw4QUBtNJ$FU^$%>MQN!|5lT-U9Y-wi zHEBjeTf21VcxeACGqZq&Z7T351iY~fpHP|W1No*T<6fCyD3=w{yt~4Kh=+@x2D`k5 z=F8llWX@#tC7OYbRh1pg?+Os1)q$~808XBCKY8Sh=TyO<gj}KolLAea2FQO>D`~Eg zTcxEU!D7yK4LtKyYU0e7OhLzyYb#*0)DXT{PZ-bDRHqenRfhx&hqYy{+?nEQ<gr(! zBOoA1x|yAs>DBW-O~$3C#DM$@#X%zJKd!Ev^n5NQCA^pl@(?xg6O$s7eamjddX&Cz z%Q8aj=qY5NU6|pAj?=t%EDKKH>ij-?PM}n>*6!|#U^W}@<6P3o04gfViYhDR!?UD_ z9AP0_GiqW>725S4cZ=rFg-|$DY!G1Wj6r#WW}ucI%R8p+=*Y^I2#fYGx@z}jsf_`E zBkTVIF`zET2+@HIsz&Qg)iQwGLxVtM?yrEto3P@W9fnz7VEeJJf3N&oU~(5<=nvuc z%%tDA<F7va+=qG~6`8Z2Dim{ZQ*+r?!%Bsf*QJ?#!w%57O%MC9RJA*q3XeghI8kRT z?RUgMrKlBWyCzPcml&o`#H&ZL8-5nIDX+=0QU>Bvfk8pg1aVkADpjI5RIPdZL8I(p zUTlj$Mok^0k+S7K3&P_Q0<~c{7c>uDi4%XOPp0hrrib5lQD+ELta8^l*sb;si8bf7 zO8Zp%r#yJ@*%vVYx|G(D>m#458})UOg3)__>BzD<|6t}gjG~}oQDv5-IZ^DsY5FHq z*4A&a>ek#Bm!vOwJcVjs2f6TiH8c%F`0Aw05H(sx4l)&QiRtGu=Rted%WU>(-B9Is zo4c=b2|`Wj2WZ7{LLQ8FOLU<$>jO?C#cy+T0xZi4EI8dvp+{Y#TfI915Ar?Z>Q`3U zf+Ax)%lWU-Jj+psZ&uL0kg-5XYzR+MKxbfk-ox$Kr~h(oAeSgN3391!*=uPrn-7E= zeSDz=z4%aQ*Xw8#CyeL+%PsSWM6Vh74#1;LzDb(R|GpRX@yh`tp8^g>w8Rspr9yHT zm#rK<i{*Zyh_>K5<(34T+%YiFwnj22&q#FQ{+k%69$Ea>E04%NkIF(cfRRO0XQi=% z7JBV7V!+h9*ilYG@zSi}e{um*yoRpJYJ=ett*qI_!}u}y+u9BkiXFDtA=}5p#XF!a zeRECR-@kv$EMSDQB#$a<f2$mVjjS;NZKaY<EY8JX*8cU<-W$s*R{=;CthCj}M^|?g z^>z`DR?4_w9opX>&31r(OeuoMPfkwMfF`om$lg3>^6pJxGU$;53k|-=3Kqss6sXz- z(FmbAUO21$R8!gV#=m<KySiX#>$AWY2wA+f(nP}-rDavS1&In<<|5Dd``O-h_UWea zg6FNrRcm!)!F;K{R!|Nuw4Fqx6b?8E#D!6J*3}*TYu@LTdv}GYdIaBoP+Kb|0kou7 z84=uroonL|_>`axx~kI2p)e}Ifovd)B|OoXk{q&amkn89_H^`aAgP+cr0S4H)o1ed zZJpu??8EN6{ATX<_MJ_V<0_E=2(r8Kc)tNp0VqP4%8Ik2Jh2Ehf!CWytsD0L^|E0b zPS;<z&hC1P<Me!jVkn$$ckOsyxW}rf>UIDnc>k#A*sEE+-O{mlao1?4OG)*(l5-g& zM8N8hb~SN+$bUxF*n5;Vdj;IowCjKEpD*z{@q?y>7~VXNby=gvP$l=H1u7l!@8Z(8 ztX<=N6#4b`Rh``>{GiH3&+N=r+(eABJ3QKyi;ChzpfaK#U$vw(Yvi2dO&}{>A;y3I z57B-0wxxbob`i1d%Ej`)<M7cbUJ(`Ip6}szK-xvIgUj^V%USModdoH$gWdVw>~-6v za05&`ded_5ORTF4>ze3E3_r(plR<U3gUgYGo<gUzHHGA2l!glIN&Oz(+_c!;sdX(+ zUR6CmltZe5e@87OAw&iKlU4xo_8fly4AK0UTxI_?QT#`~U_<@qBUE%(OnVJz^S3MY zGk)s+x?uv|-8r6PI+w2h<yr*_L&m<e2ryfwj_S}0T$Dk9@LzDI|I*q$@@XdDV=sOg zT7nZw2&1|U?=vJI=i@0JQev1KY`D<H*kq#a*&V)$u%VSz{I0q7Nx3dO$P2WkCu$s@ zkkCl{N7GUtE|0a)(bOArI$^58b5kjtRq`sbT_X-=_uP-nH0+r+1Y4%M3<$=cWrZ0M zo@vaJSxR*M2zp4Es>C3ihowXa^9W=>IT_-=YJ_4R{)6n3pu&QSHXLpw6PX=pJD^so zw~S>btcO?P8^OE%msikpRP*?m;Z!bU+b{$tADWNhbOK&SZ8$);pB9Ina=$2Sz^KgT zsQ*;Qp`NAD&=8M&ae{)Wd=LC9W}pUG;rRwyIkl#*FYI+p0fW$^Q;gG9xEEA>BvcYj zL_uGY#;K{pm4d`UTv&@rDoC=jfK;d1{TVQ91hs~`S?m6Tin$nG=O$u6Pcnd{<fXb@ zgK0ix==)>6AQ(*ZV|2y2@#^SXs8LPuBB`zUwtw=uk6y^ew!_RUZCvJz<dRz$uWDG6 zxpaS<mggU1JO;OFe}YX&;&`sj+4}HJYmv*Z4xe(i3KpDOp3JuRWselCOg0QdL#*`& zadFOPTdmNRn|&81;jG^G7ZL&Ns{_gRUc;u>1l+rfp||p%C0rD+uv&u+Kq7j7LKk~- zRXfb%3$5Ge>(aI}ky80W3;i3=*X`tyw?(wYi}=L!%VCjCNui_q&<T8chD4H`51;8P zW5_wUXVe-$dRl=H4P28?=-DeZ?qJrg8y9D!T1%@Vrr26yECj{o?)e^aA5UHz`CM$4 zKQGU@%~k0So1giiQpO#p>i+OnfjtK6lMd)6kULwW%!$~WKaHd1-Q7_!;<_jB)#5*g zqyHKs*VT`?ueGZvO!k0pG^j-8E87;5nCBI2y0==xSNJ8|A>yv_9)T}PJ-M=GQ}P-K z1h_)yb~;%>{{$b)Lz=c~9><QZf38Rg8p6NUUjI>vEmZyk?lt{HT}_`)1yhT7X4VsE zUj8y3liYvr=sdYy`>*vHO-KL`fEb?Kcc@TUQl2A5lb&B*pBQ2}eQ<I>wwIRFN3kFz zmU|q^8&Bs)6KNQn23$0SgYC>=9VZMMp)rz;U*U*2lO;$qPkRU{a0uRUZ3e76T%bgT z<)j+-u3)q%rF7>|Oop!%ONdmPcjWuxPQj{2<eAcoD&l}Fk)8O&mes^edK(;}E$6{a z^132qTjCak1u!|%2#su)d5l?9z-UZ7d?#Klt(o2e3CAcCg&{8)kl{sT`+)^~h}F8Q zFYr@xnqJD7OQ-z2oN<9~yT$h-tt2&;;N67>(HL;F0W6MX7ba$Gi7JRAxuB!`M^r{n z4U?Qej!FsBXm(*7I*tEO8uh2DxC*ToJrc`U02L@i(x27VnvC5BOSOHu`pGL=aR_ie z#G#BBKoMAWT_%yseDhlkGCvUTJsu7Qo82vf=2ldHND7!eVlf;k7Ws~jyA#wUwF|wq zx+ijT5~+Ek^JMvAhORv6DOd`|(CT|86?eWY1f+#v0;Wk@VS3KMe_cK^gy*b?PRv5D zo<0m}@N>T<YoXe70Sj(CD@8}5r-_P6RKq<Utrxt?L%i(E`I~ay$C^9_%)1I;!9^3M zjBv3e&P+Ma)4ytVfO^fZ$L*_WBPr4-3T{G)C@?%65WfcNpxsCAdWFv&0yzo->z$e7 z`JeY>0p55C2Z(C(4Je)-Hz|NI#gtYWFKx7*^j>`UIrjS23^s>{o<!@gCzf!nAgA<n z=@0h)Qq0rV<quP=nsI$+%#Y0Sra<9PpDVWPj%RH%(oeBhEr?N><0<Bi9NQD=?aepT zBaK*#9I>zO>*Vb>zlwP;D5b8ph#A@1P*A@*v87kCl#}>pw~z|OX%&O2n80ju6%9R+ zJVNDFqF(_k$@Tj7<&Z|<|Kn0b5kf&qTtb=Exc}Ke{Et2&3jUvu;3Zc>{<n`H42%zf zDo_q8t0vU3u8mEcg;l7~IVH9#B#{ZjW@=WMhB8Pwiu{X(L3MQzGB0eo0?9PTyO=j} z`Uxjb#pls3V7P=Y)TJJcR^mH&ATV-`x=J=ZcNWtRgaE7eqSC2XnbbU3a3&!-UMEAP z4o)<%73zz@h89LbRu-PhDA&<Mx;$p059c&hqKt8BA6+c1w3z@ntPI#@>iA>gleF2l zkuWM`xCq&}QDsA^1DoT3FmcqJs}ib{KDHP1@|6N-Z^At6LP4B7&RKbFra(;gg9B+! zPbZ;OmHwHyo6n)T?h#R`zgm7%=fIjRT8VIk20K-Hs(IE{YXO+r^*pMZKVBQ`CL<rG zL>SutmH=<nm33R@_cuX2yW_KQV5*wRp*Jir0muU*O4I?@16f4T+>IGVSDwPQ?rNO( zC(#w2M&yU`<M)}Jj~wgWODKkK?lIfo9pRN*$SRJ<J^Uh8Zw=5=<Go9YE$kyNd=Fy4 zU~rR>7O_?f%ij|+xhAnX?5_G~wrPds6l@78G5`T9Yv>6#uMGxQF@p6qVn9}&RJ7#; zevn#Go_9`qQdeUj8F1j`ZuFwGPemZJLUmpd;PMN~b@2^4SLRJMV1NdIGerY4-@|Rh zH6k2ES>(n+xl}o&+ObE)Ib>bSNU1g+6+gDue9)CbiQC9_^PFmz>a>|a!vJhzus$;m zg5r~%QWCcTxkH!)Lxx_co%jZDa8;+q&k4C!d$KVZ2JkVhRb^`Ge5rD>h3|uRmuVfc z1Mh^tYwvj0=&roFeuAqoA&qbq=M3`+G?XvQ;s*~e)&DIH<M~57<2dwV+)701jB#Ji zbPQ{Wym?PEL!$V<G{67j?8=crj;GSpp3O8xmK-ozBJ3-TYoaw`9e%-9HL1*3J=pPk zb`%l)e4d&MXc#6;k()~tQbvS018^-<LTf53f{j72-+62UHDW+E`3Dbp96({FUG0Mg zgB=Pr;Ad4}Xr#62;Lj?8SZpl`i7zgNSk;wNK<6(3%+!&@gtQ+onP3FC5LSq)42_n# zLsC^$AhM(-z#-TaFQFSB=yBR3t)QYnT(5-~@gd}JEu6em@(VHD<v~s^D%(klIF7$6 zd$<`KAOx<04qiT<NWv$Z#kC;%Wm$T|kICP)w2(M53L-&#>k<@sKr~tEt}Tu(@xu3L zQ-xb@7|ewl!ycBrMRll}xE<Q-Z%nr!Xo%_RuXdI#1H*6--%*0fiptnLRrHU*@+x?A zJkzuyDkB_)^-g28rKo2X@AWGvCQ6Wjr$on~;PvDBRxplRv-8j52964V#{$pAP^;s2 z;<!^Xx!;?hM|}|NNJFBHm*gzPxRR{AH?m%EW}<13UqY4Bk5&`myz0`j%u;y)1Paum zRPrdQB*23cUR@Wa=>Yb=@_XMox*9>VDB)y`)%QBA<FcdlEH_WPYPdZcujD-tT)oaS z5YTo?f){)v;`;5HY-Bj#lX{jo2`K|q4eg_1*7#?ZM0M(R0fB_}*P6tIt~*kqub;xx zIg3<83Iiot`sVI%{GJ}*{O*g*XWzPWSuZ*LEl1yVrj)#6Vd!VqC~a``jZKToqP$`+ zD&HX3cpUUHZSWlmEh|7~=s3fE@~uC^e#|BIQ{b9;{?DI3*@d&M!v5o!^2B{JFVXp5 zL7M+s0{rW53+bOr0TyXAdFPDr61_l-i=*P1TTBNZ{h_y|prRbsPsci1MIdw!gCIP& zlAr`Kwxk=Ht#ne@jzUlMt<>YPt2T-P>@`e~MBxI+Ev;bpLm<QHvFxneM?sNLTY<8Z zD&V7<;l|5Ab1)E`--SK(j`YkzavKMoYd>Y_ro!$Iyjz=f5r7K3fzcoI1WuUl2oeo+ z^N>?tWwUjI*{KJI!1qF8h6Y+l(Ut^dbT#4fbN3g_7(u$!^CiqCBi|=SViCtRo%9q` zP$fB%-qYbQdb$T8di}Pcv`r9ejaos%`Ek%6lSXd)0pOnrx+JVq)|;JTPBmLib#;2G zsnG9#DJziLsi<qp%VjTF!@kMr5s^*SPJFra{t)kwuX3#yd#zQ#y_q|OB`J6-=|=o+ z>J9{$c1Eg_ArHtMmdGYj!wa&AWymdzMs$h9nl2FeJOsM9o6;$&T~z&w-P+5r->d0C zRUO!t=UMGlmLl#8RrD3<dOI9{94B2FVtqd*A@SI<RDa?>?F|p*ixD{Eb(O;zGd!Gk zfHr8oL~5^NsrkzO!%X@&Ce<?HG@o?S^lXa)VgLp%KShEz0=7104<f?1^yimbYV)tW z%?wcEKwPb%OhPz;A>T&LKkf3S57_h^+L3cXipIDul6ivoA1EU;Q@%Mm2u1#slO~69 zP=Zq0IU>VL2WWAKc3NXbijBz|@8!e({*>u{z!kG(55#Viry?<4Y((IB-$~Vq5f5W5 zbG2s-cK$lr71c#ssrW4?vI?qi-|svV%LJT#DgijLt|k+>qfSWad-m<{cu}lDv{HU1 z#Dvx0DMxHag>`}6V2dLpAmBa7{juP_?wc;`%MZbx#X7OcB7Lks=ST9`F7-mhqW;;P zSgbQ0K4!DE&-!*i_*ciA<yQJ%kM95NkS}B*Bq0UJ6eM2NcE+-P&o*ZB{VHU(feGuU zNWYArcYv8jqsJm8XTmKzliq${zQA2%nlKt(lgfH|@JJGKTGCZ+LLU$9+oj2$c<VH! z!4#5lT`MU&xX1R9uqU320~7i%Hk#BdDGV4EN6`&ZrZ*U<OV*_uw3yO6<VXUfaS65_ z`O@UDB@%~Y(X+~?6Kif6a*@!cesmQ3k!BmuF0PKmX%4Sd6~;`?M>?ebH7C|u%5fx) zEm;{9NH%B=6@SH17bwM_OuZ?guJAKdItZ!-oJhU}C!9QqkS(1IgvAN4+{J{#6pe~0 z99KD<N53XonNUZx)@kCoMGAO4>CO89h8*qhI-)O_<kzd`emu;~%z_UaKRTR0Y4NRW zIe`m}lxig!1c=WmPlq4(bH-a;j~CiKuY(5tr&4*o0+Pn_cAJ^LA?=!kCi2Sew`egW zZ-a37Iwk0sSy?sD!1(5we@Ndh;FEdj6#hW$N{90$Ba;^HqwRfu_&=ulE02j9>S!xg zAqP7*@n$(S!}i`qpaEm&H@`Fj;RI?{?KoDMslHRC>!!4#rrwoE3LbAg)8}ibUH%Pz zv<?jpj#V6qh`)B031f^*iXWja1lM|v_x4IwY0HRcROi;A?fN@14XGn;W0~T)Y%kyt zUw$2W)qtpM?#tF$(59r50f*y<e|o6MtlpK%aiMwsrQxhn!3vK4+q)>2G7*Ilo{V9V zsHIU-6&f%7c`mJc#Ik;&eb<ymv8>?N?@Il{_4WW_qjZgTuC8nnX#xXb;~G}P8V8|N zk;vf9PK6A~DT5p(U1>zQUSmojYWMQnhOSy2`Ovc{8a9T1CTp<s-#;MpzCCQG^VqMI z1XO+f9U(>H8Du(~5^dEc<Z243AXLruVs-u}i2i>))`8*FN(_KG#jJ?)R*2=3k|s~O zNBS?BcelphO7YSLH&i38#dQ_S&Du_n2)-EN;BX008{C2;#SX8*nq2Y~ZKU*Pic&1$ zdl{;s!?QD$D?L-wLI(P>-V9yTaTLT=A{>%VLu2Y8^}}_SI?PajK!X<$Anv&R1OW$e zLD-nJ@=HweT!b=!8%`Ex6nq9n%L3|@ypc%EQT`y6CEhX)guw;6Kh+--KlhvIG$i&# zE%erL7eSVb>Lq$$JJTs|geoRzcAJwPX<}dpKO{7o8in9sENkQ&&dFeE(Ing9(@zgL z3BG`HISAEF!xA+DNC!7}#iB^N<kWe?>ncEV7wVv`TBHC9CD1}-%}*h3?)!EBcZE9j zE{U2gjvS#AQ@==R(c~4ay0u=CzU}qao34(ItYBnZ1`G!>ke%RNYa3F)Haj=Qc;`bO z>lGLVt;XlkN!^P-U5;V#e95|ccS0OZz3p+--tSjC6zGF)y;*d^2Q<Np&waX8giba? ze9R(!)E2wCBnkkVOm`wh5hqr=k1F4^hlYPilow%e+xMmMqu3A7%vP6rkD9FhRENyq zuWy{k*~$%Df8Mt^@0VGp-H2AHLiUr}Pi^hDA?TxuulM6_D&Ix`Oid;4`s0|b;Pr^p zS@Uu6%XS~G=W?g2r>ze1@qDAxu4c9AqrP4)a|@Ax3p?=q&$&;M$Bl)`pX~^7c_aR; zL3zCJABc(m)Hotxbso!cs_~A#FJx-Fe}bhZW)U&q&DTO}xkco?kF7rH48iK~x~UBY zB&#RORaP1I+|hKCP1D|%X3h#bHj}+zbFwm5>-nsuj>(g=*Ian5w<aLb(U+n}9s$AI zj#Y=;kV9&)0|6nlx{oe;(Dwh?NlW8%-up|BTC)dnCwiQ%_UnUqly}IUw$Jj+L2u~z zhTJ~<Ur+YGAmSdz{{-wr8buY5%II>2W!hQ*W-X*DwqucG0+N4(78Eh@c19j$&SF@! zTW@jpFuf%hVx(0TFhzwYu8({6d&)VPR?3rciMUbK)GXc+!ElohbELpXhTB_c^!m0F z2N{e|f9pf}F_vQ1ZNYbHMvW56M735!s=eMj)=<0IX|MVXNBPiSPtkHt2?AVmoq%wO zqV|-ab0r==eKIK(G_~g_8lX1!`H4pAK%hNu{+P0#E^G^2f6QsqUayNLW$jF1e80A; zdOlGndMvDW7!5f0yJ2{{J3{ii+xKqSuRFhj@ZdqJ%WhSC?+kCZA}l+-Em97Bi?~KR zVq()<fuZlc-P;P#tiw4xf`gR)-bu@2uLRc1O?A-<eh)p%Ew|m(HJ_G;zWhoYe;Eii zq1ae^gr1$j7~Ye0YBdDU?M>1G&YIreOr|W06tc>ChpW!)G^%t<_nOs~=&^lehQT;p ztb;Lq-78>vr(mOTn9&)f^A6#CP~Q8w_xiKPQE9PPBGZ8PxqSnG&Y5yw|BwhJc|$An zMeF5Wg}d+S+;#rjzz1C2Tt6!H%UJ)HU%*$1&O}%+n(u+Q)pfQ1>#?rKW^e~$b}*Hg zr(zX#-=V*Xa64C4T?3jQdZFbqa#}5&Ulq|XhqPQesP55}f(ija4atxrF;9@B_}8x= z7J@|uX31sq&O$8*`H@KtS~@zi?(XiLE}r9#RWjDgrXA25St3u^u&y30=4?QztNj80 zzip^q0(J(Q(&?KM15Ey`egiomS#8H*T3{{P8*BLG5u^P^InPT9ME4_&{}v$UypJ`# z#V&(n#lK%#FjHp{<hj2(p2$NaUeOpBHUDSF<HM@0{Em+%H5<}3gh0b#dcM6_bHr+r zDE}IV-LIo-rmaDj@{9zrXl{!`&{~l$rPAW3HMB7J>iIa1g?u63Y~jBx&uiH_{PQy! z1e(AhM%vGECpq^V_wK*l@Hof|ZQhO%=>I+1q+<L8cct-DUI^!Z>mvUTMU5LNG)A$U z>zAO|%wvX0aagv;Ch9|%QY_VD8p8~z+OS_k(6ZsfF=H%C`~rO+H^=?`g6?zt_+v#b zdB%jF*FDZ!u(iH?-X8J6R~!hxsEzfF5_!2q`$vW((`RZ>u>Ax>LHN;x#QTIj`NehJ z_rA2Qe*OLJ{_*c3>E;0pDlJDTlK;E=q{GYp;1}!gN%?fbnr+f9>gNMAwe&HvI0&GO z6a^&6V;Hgwdc4G<ox~19O9vc0H_UnRp6A5ad+GWu1&>?-eeUz#jf|}XL^`iD&K~;w zYt06@{XG6OJq|IaUXaRGnRhWN_C(>WJm!^q+|1%OUq9;C$7&D2q^^qVR7J}A`+f3X zx#Ce+Kep(+$dhfp36VVr^L|<W6S+|C$I#_@aPM=SKm2(0ZQf~>Z~kggfTb7N`5}7{ zSMi-`z3W|JE@-s9d7E1OE7#pHbFaXVqYsRT%Vl=}^9Lxl5n7K@4sgPp*3SIj6&b7a zuoMc#)<9WF!9N8{Uv<}w`y$_STZ;$;;*xsMr$>q-=nbbGy-evWrFLkwsVr-?h7#s? zi^&wRRlp|1x2;JWZbUD-Je~OJA2g_8m~hk5vSV2XvNpE~FuLCv5eY9<U?~tm_!g{@ zmP<!ziFdyGy|gnv!}&v+vD+$fTN3D)k2Vx3kU~stMS{Y0)o*`T$!Ohz_ayU;TdQ=T zb86%00Xt8#N>WJV>Rjw+@ryPuiPTi;<2Bk=cO<LfrndqaL9`+DUH7q`R6|*|u4bf6 zd(yFPo^Hzv{gqLzE?svH!tm7^b*gT@3HTr8ERoNJz`@zkkUnkkjB?lgp9ZdCu;Rvk z_5g!OO4sWnt*+xP3X^_k#9Yd{VF){gDQz4`XhhXte_T0qw3`RT3KPCI?@+WzLH}={ z^RJ3;^=?!>lx%WD^+;`305;9(PEXDvTypHD(n^~G*Xe6sg^$&B2~Mry1HW9(?=il+ zvMMd!d^9v8{H7pTy+iwHpb)F($)6773zMk@7bH6AT_-d7^dmWjTMkBcH0QM_`Q1dN zp^H6VT(!CY@gxP3lj!2>KYbc%B&}FEM`mpYM_@B*b$ES(2uiB%wJ{kb3^#qbTXomp z8_%iU@`C?bz*Hl+()1gJ*tkuHgdB5)-WMj_0Nm>N@7~5cC1};7V#Yif6A@5gqT~)r z{Qizqd(6>Q5D;L?i8hFa@^yJ>ajBgcl<W0!Iq*-5bMAZY9gk#CmnA8^U7;;g5T8_C z?RQ&#;tz)MxrpMNvG(`bF;oz^RZD)L{yqzdr`FhF6x5$YUM6FmUS23m%j|QX7V6WS z4i0-QH+zbShtT|ghwKz#S3LK93Nlon)=xM5i7sVzOz}OON-jK215f;N1{Hz@*@Y0R z`c!b50gaq?OZ9hPoY&<O*So88nqyVho8m}Uoq4Q(HaRQ@H(i~tcgAH1-!r4OykJcs z#<mIHn5I-}{}CErlcfl|{)OBn)na<RMmYAzapSc<X7ef5CwaD#QCl;mXt#9K=OAmq zP->{<6jx+pvC5U{b)o5TkWwUn@YJC1DD`nKlyy6=>pgtG?)c$UgoG?o@<ubG<fKX| z+>l~6S`vUolVWQW>KUjYgV)t+2!oA{%`1wKBCcZ|YNVyEUYIbsH<JDfwuD%~?IuFB zTl<NuTDE0oKL>YFdJmdfa?qOseQ-bP%F`L59};M(e1@lWiDyPfZ>=O?t4|%VSL4_n z#osRhNOCH5!dhyCNmtPGw*8e5x|4>|(;igv0W5U0RTx@{*e(j&&~*tHINvr4+aCxf zVFe8JESRQ#<2D%758wBNZ0avS8qzQ&9xg72DG;sWRygfhL+6Va*=5&P=#$tl>z}{4 zSR5w*yCn~Vkq64{gaEX`VY&&>G$2h10F5fB_uiS)vW#(vo;4EPgHI5I$Ytx+&^S4@ zR+W&?FCfrzJEx-!p|}r_`nM<aTUnP$_imLj(?35S=)ZM0R_b^@<b|qv&FSZOe4kbn zi1vTK_utPt_rg^ac`Qg6Fj<u}&*|&#iS3S=nc&!_+w*r|FV1O1>+;{gZf%Ft^S<~p zBF-iH@jtl$>i6PlJ?u723Fu#kU@;w8xtKm>iy=-KQHdi4=*6i*8{9M;YBl@VO#&&j zn-A}s5(m9>AM?g*4c0abU}BkxzcIb;p1$nw+Zm`2Ggh3e3>BC}Y1iKu3AJVEv$o~H zn3E3OlrfAw4Hi<_<lLY8a^>(|QwTqtzki`QyDr2WH}@)t=<2xQI2W-aZ+g8$J$vb` z6l~nKZ0!i}_Inh!dzqQnUY(SvU;HDv-i9?Ck=VBVp{O+x;et)fdIUPxGDxnpLisvr z2(qC!B|9@C1DzWP?{gNZuat9ax7w;69thl{pjJ9>zgD1r3}=Jb)P(P+bDEcpdx~6! zE7IXB#Xy04lg5Mofh7LGlaA1eJc8b?=DUo(Vr0KA>+{|ID8_hFrcum@&=yK<um>6` z?YSDptLEpLE}C@2f#p?>O%|6LK8aN4^}c<uvV!b#3?=GSS3%|*Z4#fK3EP4c?JE%5 z^I-2hpe~NetJmls&u2CDO%JCE+pmTgjein7!u{pj&+Iu_tbev;1qIZJblhM}@Syv0 z{SO%V-+0Nv20nG%DJSTO0+^EQu<;$7Y(IV3Fof-t0Z?72wTzhX4>uN_+SsjC9SIA+ z{H2t+@mgM9>+k65Or?ww{C*_CH>;jpW>X~XOZs{s)dJbKXnuP-PG+OA^f&i?U}Dj7 zf`TV;L9gE**~}5SA&(K+gdKaDM{`=q8&Fc6{VeN)qq_ErF?6>`%4xRU_`CLOty*=h z19g44l;d~Eygc65GBumL8<RX(2g}EyJlM}GM5C%OkkS2bRajf7yo^6qVMZUgH8g|j zxL{L2p;Rb8`7#w^$yQM?Lct7_3Ac_XMCm2c$%uj?(d-@Hb^9sj&cv7glyE}ap?lpP zc(u`f<r7r@N~~Gwwu_95rVW>VTn&p}%%ldgA8<K8)B}UEe?0f3rV-1LBlxb65!C}0 zYUa7}LqNlgrw@kUr^<}diVBG$g6XX*R{wBF-MejtYCe+oC$;Ov^tMwvo8l$>g%)T) zleqZ}a>>SppDSdLnUYXmN6dwLG&`@bsZT)CQ6rx1ObV{MCU371!)gA1-xd^@G3W&Z zAJOjwZlp<c-YDW{P-A|Iq@rXr8TJo_X{uqO)w@*qMpWI6LIgp|uksA>4uIgv0|{Lm zmkh`-fejYw)c&AH9Mj_(xbW)(_<Br0Q78(VRZ;LV=m}@s;P<i=|Lhgm_s<91i!t}k z`gIyKp&NAf6~_VT4A0@}VtX?CNBTLKng7Bu`acw&kYKifLO#Lf%+kq9q24KH&4i;4 z3Rtv>d1@sPTOWuw5fYIy^~8seSn*QCy`^w<8hPTKojo^^>13%&s>=G^Z1%XujF$J9 zW!@mIKQSm86H4)pvRZa2_l4fnXje++gRGNo|8+P7uLzN{kQ(f}qrfchL*rD#<Fi-} zinpcxC|@_lLf&af9vsRn$aE;DNWVQb&KZgY;I!l?B&wJ;o4}UGfMfsILwjlx=1ud3 z4uudF&Lae**83Ms1s(u{KT$AznnbE^HVeblG9ivl+s8C0C*^Foi2jH#I3z~6j5a7i zl;0^ecgH>>EHtzdS3wMvj?4?j5AjG*6eOnfy|*edDPxNUup+==1Cohph0Y#T7m%Fe zZ%n$Ok%vwZiWn&ow7X0()n{iJzKyfVRW(yU5{J)e{kSlbcAbPRV-7Lv*M_iEh(3vj zpn|nEW6sk|u^LBil2^)YP#cwy3_~uF;`QFBs`E?Bxc-Q_$gB2U)+c02V1nx}xpclC zxmNxh5+zygR62T(@X@N)gK%(xmPTK;BnBsc@7bF)zKSQ~G|H($X4Sbzuwb5@sXX^G z#FJV`Dytn(=pcE}2>_EY0!aKGHg$b2`(BHbc0?ZC#ynWA(6tz#AgcP&g0DBz+btP9 zwmOimq$rDj)$!l0gWRm4Rf|Tu?|qntA*%ajRG%@xNxZlr&5IvhKg~)jYf;`LgZDoq z*zHg7nl}RPBu>hztIbD$eyaG^mZDv6hEdD>vq@Hrtc<Fnf%Z58mhM=mDERz-Fz~8V z=9=>({ae``v7=3$w&tK71}E9RY4{hT2TNSsA8a*V5(1>-SnT6}`co;uRyhd@nynup z#SV)LmCsi3SV1|zI7>qq90{L5bmiTLm@<CCEr@;;R3#XU1jZ(xsQ*j%tQ7PYU1uRp zIOU>Oqxz}H;UWx=;#L&B_U}_55Fqa(DE`I3Fw|fR1CK@&k9vzR%t|XOYVzhdS?-d7 zeTA#abRz^x=VwL@mbo~)+R-|M*b+5>jBd-06I<`}TCS$1US?ZJOh4`expR{%D;0b4 zV!Dv}qhSEe@8U;0MC@GdCs#PLPGiYcCk0@r%hb;_etwL1`{V7K-}C8!{`-?Ai&kCG zezuNioV?>n_&K$*hOGRm$w<T(CulBq#HR8r-~05@BHLw1l~CL9JKAH0Ji(5l<yD=U z3Nqv0_iq3+>*yP~>~jS+5kX=_`)-jMngtp~%>YsW@DKClXt3nan@q!X70r7xiNF>5 z)9-5EN`1bKXhI$*$lk=6Xz1dG_$(yP;Qbp3=07Kzuuwf=CF5@rQJ9XhZ%L9Muaw|( zPr1sB3K;+{EJQpC0s7)c0E7}dgo&s-Uf9;AQ&<nOTu`gi`CS+!X32`6wy2>k0gLr0 zF9S2YZxHN@^RyY9kWWjHDXNfgbP@n|cKnV9p$6iunq)eCT&HUA$<LNGfO`lD4(c8h z-n}099;Pv3O9yG>o`UkE2GnA6m%v;@VQu8}0|N-e(9^Vg!H-<RoMfkIRz!{VMp_hd z`M~FqiQX$1jv*W@yD1o*@Bj@w1N;Oyi!CWrQf|E^^{X7w&tn`l9SBpp1`iJ@jOpKH zI2y!bM;h(QI6lE<*Ng%^p#0Ed^Z>ACBNpIe8CA0d28@ey*3QqSuF2ilKWWr||F&Y0 zJQ0M9IxMWLRBWhk?O&g6%XaFMUXw*2MTLa1F=e@C^_h^{(9lpxRn-^adm#uWsOD9G z5E4ja9ylJ6T&_-G*c+~-Cy*r_3$`E>t{UkaF;)Q5+KLH;<k%Fu4m7^BGeEKB=$3u} zhc|N^a6|ZT25itv>k|VZG#7i+HBv|c$T&<&%A<Y55Pjx8#_Dzsa!x+?Gu^6|y`O%z z>ktTlNvF|9?C##oN^Sk~np}P1bJ>4Vwf}#<esD%;fNh^QKOu+hSC|YQdzJTW2t3Pt zT3Ntpc|<#}q)b8^Hw8}rSaceeRn#jw95s=3L={grP)jVxBhR1Sk05sS=uM+xu|;^* z1fX=dl!rlv7b9Iq$5v2Tp(0h3*$I*UqdQo`Nj*N!<!Hp62G^pN5LR$RZkts4NsP1i zBea-m!~z^FAIx(2MrbggT}&mDYAYDeOd3!6o!LgVV4woxUE_wudQk%t|179xrhj1Y zfrbzHJ6lc^9iQKn{^A#vcN=jaia3P{^%44dvZFM=Au21wHufNE1nXgtUVte<K@XAg zF!`=I2oIzE^U#Y|S|Bn82(IB$m(&JRPVrRsqY!=$lGI0vpp;S-d~tofQRIM-1fJ0~ z*w6Y?2=A<6eRq;25_A1AylR^2^p<1vk-!HMJ#I-`Pi*V?ieGhQKf!f~-R-)?CPJ1x zq&8`+_e}J0o#iT&*MHa(`01RpL}-vKV}iRPFSO%0sFNq_J~AzX(QNVM^fu~=KHX0> zM$MpI+X`q1^Ko$5sK+d^iBSWF-jKQvB(iLSm54C#CB2A_^BJVj>TGno3@b*<P9^eZ zBO!d5_RfELou{ig?`hcnL@)_GK+pGfb|izRIu)YR`yhqAEEqpLAoAvjjsHzcqw;I; zjj^Ks4T_1P2=vXv|H8Ta7Z~@yRuO4<&=kd<*~K#LV`=O^<TLbCcb$tBvLZIqJnV3I zGWtIX9UT{KJVPz&#z<3r;aHU9BB0FzZMKlqO2ewE9IpiE(u7idcw$gu)2GpdWsT2E z`iK{yMni3Pz3ViqIH8K8iEjv(hhTvxQGrl|oiIcb{*@+>E4P4C)`xetNXsM-1HFE` z%)eGEN{u1BROV{vtylXa;whjf(g>Ej(RAa{lFf%npo$j@Cw^URJo@_#Tq9;5y5VGy z9F4rXC-%22kUERIlWis&*Ps~;^?+eS1Fnh=XYi=b&kLp!r+kws`tFioV>}b+SR}^$ zpuY`Nv@}DPP9#N^sv63o&feufILU6z+UlCWT1b)SZ9zqUQcjn#SPfO^pqS|WD9-r& z*48nhCZZM~XM>S^BA%j0BLLGqDd>J_DOycK4TB$p`twg<amf%=XxZqNB-aQuY4U-^ zUa*j%#d7@G{SK?l2Bzm!V=}@)>!RQ3t-XlI*mps#*7fg6nsn4cYstqE1H5|B8%pM9 zAt+xVOLmMIcIudEypZ6K#@pCxDsPaFc;X0cATAEG{xsM0<oNosFEXCOtV5G@OZa;o zk$8retID2i8=%aS_iqM-0Gb-iz_3IJsY{n9^td%GVa#0n(S%1lsEP?i^*CG$j(vbU z!}+rCrTW}h$_P(7{3}Ky)v3bNt(sD%)xZU{{5Zs)I-RkausJ2n^wBP?MzdWSDL1K2 z{hYo}aW=niAQ2An2l{lK`lHrwtlln?U?n}LeD>~%fm)P=L8>B4Lz(XEFbiN9t*BqZ z5N_H6j)x!4I-3JzB0J8cCZCEB5J-gyN3MEAGdZ`E!Wv8%uf|LN=NJ=~1$#HSSx?XG zM8R#NmBcl%c(UCXKJZXkQ(c@Ut3OOq+RbH)kVgHIH!qz$zJx04X0QOpXPlOB?*c`! zkYVpxzvc~z!l1L=;o$KHQb0;Pt1^=a2YeNV(GvIX*;$#tF3=#YkCz`)B`E%sThFU# zYfI8SCvl7jQRuP9LgyGkDItb_d22?5Cf#Mkam3<Nq5^+MphFDklND_k<{Xa<3Z9qw z(AC{84bfNH@W@%~fHr84s`D_K*b9|;Agod(<gOsJOD12RM-2FXd&;QrfIFW4AbEQT zJca{%#|w4w4^ckTdF(Lwy&IYJ0y3xFc1@3BtZM!agC<zxt}mO)vKt6b;_>aSqwP#$ z{j=MA`sC}>zuO>;%7ZzK8Pes0ghBS0j@3$av!kZ$(QyzZfv}|_;Iu?*LJ&Xw;L#&o zQ5MyWSiUkQ53Pcp81+@lmza`-@v9Hcm1N+=1wQ&F!T@t#hT1U=jvR<*n*iDcUD>OD z7iT^5q8fA%jl^fA76KM-3F-(<N-a7uHKwq9EbRD5Xoh}W<iF#QVG#z~Mo>_!5qio@ z(rV}u69IIhG6#rppP%N^-{0lx25C-cWTi_u$9ocM1e}NVllT&^$Mz#NarFF2+Jh*q zBhEh4e&(0F&ix5%K<goatOpV$3xxK=wDSq`r$7VkP*!20r(-69B(ZNNnR2yn!5vR| zVJ?~c6&4(p&Fv)ZUwLUFv8#*K6g7!L1pq0*OW1~yA3oEG!C8}_mF<CzW*xkPpY!n5 z!J!ESp_n-Q2=1SS)ano^x=*lhlPSW{+wu<*zJpkuh4*S4xCX^Q${0u#Ty=!80d(q| z8lzD~q0~5tKZnRc@d3D_%-y8$ZUC-u2k<UxcsG}FfdO}VSY*Ux4_4cV8P?`lNokM{ zv&~vvaM*z~SN(Tw%$(FfuRyU=4S0a$JI3pm8|oaLJVkNG4m1GPVfv^kOK@j{wG#kq z{*hFePB93G!xG@-u?5F}gbbKLVg5m+E$|Ug6ZmsndQK_#4;I@)G+g4G^aA8(Y~E7< zIF!UI>>oG<;rZ?P{2Ib0;Ax(q_;Fm_l`U}A{EMO*n^EIph_RX|v0ZUSE{gDP_!7sL zmX9C)JCB0h2e}B8*nvm~ASO6*SRFrG9cR;C$Zl&p!vF`IMbfP~Cn_5GDf56=fLSNp zp$_^$g|9{=wxU8X4x3ny6QoCw@oA|c>c@gbdjevll;L#iEmkQ9$*g>846#F-Y<!Q6 z#FFjH%dy#t0{&=);hopR^ZF9yA~O~)Q7_fv;6n2U?b<`K>?6lxKrV<~6X05=A(x5_ zgi5u0+;{U@s3AwL{t8FY->=2Tna5YQ43&T!s<S&T|I8j7yy@C@tJJ)O01NO^X3xM< z+q|MppJ-<pJDefNSPg+k#1AIcUZ!Jq*mkh=_|RV>%@rM+r#?*cgfAIfsD;Hz$ZaDr z2P;i)oT5gQkP39iz}0gg`NnFYI4|2)=c|eO0e+Q9?}1*Y$#%L2KO<SXon(@LqNq+& z$yXHWbKraUQHji=;-sJ1qQtKfIyp1sF()RKFa1{a5G2zqKc6xlOBpkLxb0iNB<?q= zUW3`8<S<{I&8y-bKMz-c;sF(z(B)zn2Ia#}qT)gukJP(@PmzG+Pq`;gh#eEF?NY<$ z?R@cZUQwU&>Y-u~+TAzW4dEQ`T<KpQm6(tHA$SN=b=MpJ^Zj`>uyxU&3l8ZU(b0W= zdpCya4r4bcG!(gMfTLJ^v!71PF!fJNF4Fz5Q>wVKn<GNjjUQDI?)I12n{kQ7N)6<0 zWtH19lT$V^K+XzhiSpC5GSrWCUSgfqlIzlZuq8a8^P(HM0dflSUsY697a<#j?3UvY zPb`RcgGT&(46y*7fZGZC;IqVNZ*yQ~3A1t1uoC#c@oem9fD3{S(NhA_d*3!1ZFOA# zGROrLVUv5Rvrb~T$t5_%CeqV8k};Z%-~<n<_Fu;Cz^?Rh;6(PHAG@)WnR4BgSm>7Z zcfvd`JkRq~=)Zo*s%l2pj@e5s)bU`kCGbC8?8|<A=4-IVUibeUghM=*D?ZSu>pqH5 z=eD!SjmY{L7kPiQU{;&`WT_>KyK-#%XSREdv!Y|VceW8+b-?9NK9sjQZt6Eb2-w3L zmty-f*Mr*WUi@80YC~gGI-(adc4Zia=i5-{H-T_VV5Ch%?sKwxetM<HDuu8^`Y+vF zbZ`V{hn`%PVx|&-{KT+tNU>HDCsE%g%t40<Sy*eNoOOIt2`b5}y}@Gn`}~?mObRpe z$$CyG2(>5ce6NhL`j@2|rmok5@qvq>dA8>z{YsTkroV=&S}|cY)}OhNtOm<TU}$|% z(|YDWTfMMYys?94``-wJ$%-R|2=6=7W07DMFX^>9nFGVvKE=x(id0|o*eD5gGTkYq zRR%L_JUwl*=NMuMDM=%2lE|{511ZwofB1E!#o1d~?rY@2!r7g^&r_Yg-g;SY44$5z zg10lUs6>BvGweGzAu}%NP}qTJZ{1jKTw>x;$Szoj!?E{Hywt&BJ*{f7!Y;(=l!Bf< z+^{DE6BBb3;&<Az8AAAXY^+G9Y1rfGu($=XVn#<tw^30)HYF+&pCZjkN%=$M?cqnE zZ0b=>9$m(QEVeJVlJtgw;rH?o;wo4S-(QRHBoWu$-L^rCwk3Mi!Zagh5Q8O{NmAGa z+N+Cb^3~BP9XN)R;3*A8F#^WA10K`&c>!hufjT$RSy-bWfH1>jR3yrWqk@1x_A?;v zZ3^)~OtHXeRDjR(X%iwES~a@=!9?B@^syF^va<3>CSN^8`PP<E$VYr9raEE6Yc@MF zTAOLS51d$R|BZ*Y6dRp9;6n)&88g%?#KGtwF2O+v(;#tvn}UTKPO^EO-c-R38sJiH zr|0#k+<I>jRR5WLg{Iy*HPK&Jh{#$3tFI6Kk>%C*YnEZ3nOnr?`j@NM9G~l3(h;wF ze*=#CXD~_Q>lJyUG;+jNw~6wB|1>POJ?kH1cvVaK>ouQ*e&TM6DY~D`)=iTyFK3zS zg|udUF$Li@9j1Z)*nQ%5dL)aBA{30CSVT)bF{1*tQm!W8N;K62r3;U&sFrG;`ETwd z7@M2YW*FVPDQB8%p*FE#<*zsjTL0wb?=+TN5z$2ry@6#iTFfMVx}Qh~>u@F6$*q-{ z(yp0VU!P&FB28sJ(N>T7#gE}OZEpmATcF5C)XZ;o2gBH`-r#D)BEnDnGB^LCh$j_T zABS3L%--URph?x9koD^AyjZhmPQYU+QO-HG*;f5db_$_#MtWrgN9NOM8UU0G{3#-; zQDLoe5y&R;4Z<UfK06u3#J5~jTraj-!6@Sh=y2Opaxf4iem`@#Kll|3F%dyaX*u!i z_(;kv2M;BA)5sqCs=D4|J6C}}E_f~Xp@GN!EL1K>IP3d&G2(^c!9m0A{%C&Pr`=Tj zgq)mlG?9Yi+>O(w^)X1icS#kUgm*t%8T8zzJ|Z&^6N5fHJajo*!N;gn2=Igcg0=5{ zx|9qF+EEbU<?Bf)(!*Ev^YYy@?@p*gwD(7{j?X`4_l*wTv(9~15tUpW=UPr(X}dVb z1rtYgxSdU>l9Q5>E+7n`Ns7)7862FhHHt~p92^PV-C{sY%ty{^#qRE&!=+oG@Y@4s zhn}OOBfrIRt1DrOU%H>#btn{oB-y9GF9h0E1-!v?M3vzfp9e<F`zN-KrE?Y!5dw`a zsc{$ww$SaxeJ=jMV{3;8Pk{qrVkPHjZAki2c7kjPei?*7|92kR-_T~N&8P~=Ey<S6 zt1KPDM&k-#V+uLT>!N6vzY0M~>L&P21LZwltQ~?W)(JYw9^mjI&%b=R4zI3g<T{n@ zyq>T^-fn+PCu@F=5G}-w>f<l22<(AIHlyj7LssG4YmO3eEhnkIKR7Qt8C+|eb)CC% zn+iCltIZ?`cD~ynF#|Ial51nW!`O{=?8t<~JmRkVUNdes@~)t=0$H&723N&Zc&mN6 z=5LzgeEF8+sR(hF@u}_!WIDw~{~yNQDLl?LY!{xWQDZf>ZKE+7+fEwWnAo;$+iILP zwr$&3^M339cK)q(%;sQYj_1aCo%;AP49vx0_ajhmk(e>5GNkA)(3&|&;O)Z<R>ydV zQ)K%C7GXbfyc4a;_Mx?NSQ6@-Y(ggHtv4Qm5UJ4bsMrL<$G}PmY|6UXE6KA&mG5DS z(QDNm(C7Wyu3E%j0r`eF^?X9f?*vAIvSGNtbL$)c1$%zhFG*=Qlj=adS>T%r&ybM~ z1su|dDZxKnH&)>Jmv9tHIb&&YSk<)t3?B%jf&K;%^BT)&lM_!?&1$=*p*gzm&XAMR zrM4h$JlP|p(nyht8W_yc^@53v5NDNH9>)|Hc#gYVT`H77!vBlQYW95~1Yu6(Lwrc| z^wJmn6PMqU4fK5CwQdQ-ffPC*A)macs3?=&CLewfT0W2v)SMx@-@4Lh-UtLDPVqnC zVd=S}z+;Xt5f6xjBGw!H0Z&M%nI-1k;dlo1899Ook~*6;j{jsYulFZ`Oo^I3-tCu= zRF82>wfeOK75@DnuOe9m@^3m{6-diMfIO}dXv_>73WlC@VLm-18?9F2D+7X~ET0&H zpYr>JSQ{{vLx1&wAH|gPd6JPs1z&5Kjj60_6v$|31Amh%+s+&Q-EV;sdu1!tsx_|v zj7YEpe*m@>$INxCsT3%ozWWx+HDF_5!(}1E{Q%^F7Q|A_?{%S=%6IX@|DI}z3ZYIi zPklV3PN3P$lct2{gA~x$s1}_^{3wyz4Hlcy$0iEy$N$4C>lAJ@L6!3x$|aDbs@yL} zl*^!AP!&^JtynXWi?08Nys`_^bY*!*=4K@;MVzyR7ha4`fB)|DN3G9&`wiG7-h6Ho z<>esWrKobheVZ!cg>u_=S7umDOn;??22;JE9j2Bo&lde_m=j}n5LavR+LcermMeki zV_A}h^vd&_b`Uj%uU12bOzr8PSGyiiCWvj3;ylJ6heh<^1FG#!f|tEurmMG9(Motl zx%JvL7KIGg4vMSilW!KpkS)4Nj_*CgtNxc8hs}z(N)o=63R^0rpx+XHw2|x1aKJ?2 zHZ!*aHS!MPKxMoA>bgcZoY}%JSR7k1zfgh}n`g!hoe1re`rkNrho61MXeBqpGV+P* zm9&`~1S*x8T;oN+=Ja^dPpP!A7+AE5(j;Oe9g$jMAB&YTW{;Plebb}H^F3z@*&KiM zhud}KC#GG0fwuV3t!$CKL;Cc)9mZeYo*kF(N4LM-O~bnni2YQ_x<AmRhWBX15F3>O z;GOPZJY#TwSp-D;P^5nP1W6c91VOQlDTOy^uC&?EqRiB5m|)bdO-%0~U4wL%q+=|( z3|d74K*9IxKmzdRn9j>0ucym(;MWIF9;FT#5*}9`FC^Tk&B5PfPkj{oEp>e#F%X@k z+4MX9GKRA6&ws>|%h}>d-uA<i{uG)#Up_?O24imk>m-**=<y&o=zVJK7Te;wJU>tf zO#Nf4zLcEYVNK`dE=Wyy=cMt!T7avsdxd_l$MbTScHC3<Y66@#9z3egD|iUH;Sj3Q zAGqL2E}a`4!@GD}E&@+KZ@Ql+_ozW{3M`Gp|E5iq`I>~rjIatm+nK@p25@IP#a_aJ zo0kP$;>$8^hgCzsDFeVu@d3}ENI%2YHQFY@9Adv<mj-v*eP;m>WIS1a72iOBlB0k^ z{n5Vdq~t|zK+D)-{DwMfdp^=cPpQm*s<Ei2tZ}obfLi#k_Gv%y=Fp%cT2pBRGWy^D z8_>kj1B+a#5s?NLN3F4Xd%O@~rUu<LQ^EZ8IBy*4-Lnv@Qdo}1E*`d3`Md5<A!~ZN z=reZbbw4>SxCTd|a}I#H-9HUa1gvK$q_Yf12WR(YGwm@_z?AiB5yWmAY@S?ipL~b% zFEYm%=_z<xpb9^^qxCt?hsgjO(i(SbxB+}*>!!wAHQm<hT{#4tIwNm)sW;<A?PV2E zt;U44z46ks3)xhgz_>6NUJm6Sz13rR7L645mmiS946untyPrw4Cq4%&q9I~RyDq3} z_54_r8-WGGJNKC3LL>cO$dQM`<blFmn5mhlnYfA8q$J~r4dUgEFqKlfOZtbqG(3G* zXFy_*Oyb#obIE#QbE@pk_78!X>BA)c`^UJ`O2-E>#9M4pSsmoUg;@M}TQ-Bh$F58N zUg7V}!3c_Ezs01x$u`79dbrlsAn|%VU(F8`F=(f;mCR^0rM`}dp(vkS3>9`bO~(T1 zRYO4D>5Y*UhE(ZW4f*NrV$xs4tO(Kig8bhkwson$TeEW|dL+CRxppvv>9rf{B!-OC z*x2}abg<jZI5KJb&tCmFrQ%&edBK`r@b0})4!ra2hg`q|(E75TH=t8rd!9n~2F<}U z8q@wx-W^caV0jgTJEMKfU=oz%9tEDi4}3;AeZ-!|ZN*1XD1HM1rm;}h1d)JCKNSh` zgQ;4}YOk)duL1!+(|L@8_G*hW*wmn1I=-pGp(bDGgUa9<_o1*bJ|e&GMq#@N0-*1{ z1Etk!tDEm)X<1=w=uH>%zpyj8E`R`pIzgOb(8K@;b=JumqmL`(?V$hYi9?X5oEaAk zU3VrBY$asHWmqbdd1=SkkCCqO`|=LwRx3hro7gXuc?;_03Fgi;o9Q%t2ry&*8kYO6 z=NUyiZHlZ+!S^dyW)+$6Vu1ONV$#%Ob1u_eILf$=SJXcf6LTtiVJfDiU?88o5}pb0 zi!1xv{8AK8Fa~$vF^tJ%bm3ar0BxrI79FNsTew-fOxiqf+X5g?$$Aq>{ayOI@m|)> zJ(Iz4AugD*dYo70=0F<$R`iTSs@8@2Qbz7fPjlq&EQfWB->Jf<jfFpw=Hq`?BH$w8 z4Xv1XvqwvWj9YV+9%_wDIjA2(QVEfW=x2{kXENkRZ-h*cty1J(R30*0jJqG^A~GUn z1F8+scQj}e-n8l&iluyQnU%k}QCJUze(yD73+?q>RIu9WNP1N1KD^gK!*4aubQMW| zFr?ueGH*1I7W^j1&!e%ca*-_F{T=GG!Vd=Q9HK$1#d@qpw-W{liIRZ<v6CM!b}e}6 zppQgmxylT`pT;3+_p#06<$<lHn*~g{EnwfFfwwg&t?W=ENn}46kA$y;`3*?}oAnlI zvHBHbsE|05jPFvCZ0ygaF7K!YD8=(atI=TsXR@b@*T;@vDi_y{q>`wTV9_Rf>UBXd zarwl%$H$yQJ@!Y`p~G%mm2=OrtxgQnY7@)dMQbgI42@R3_~WI``DSx!T^-D-D_7*d z+8_QRs`ec^?{}AH?e%xq+w*aSHiK>-yyp7O@P<l!46$gXRm1^rTB-;b*s?9e9(+_0 zSfxfk{p=!^qRBk!s8Ow!CiCsD^nOJ^Se>~q)^13K4m#ES72`s}Kr@RR`AN2<=R`OJ zWeXR18&4KT2GuHKv>f)?#8-$N?~0oswbwY+v)4J)O9YFk$nNyGLhnv|!GSX}g61O5 z`>D~HqsxnUdu)vM2R|?sRizyjpfaAqGA*Z8*A!iN7lbaoR+i)m7sm#lfgVy+9t0~i zZD_o4{e@gEYTP(#z10+aT_#QyVc(k=M=s{pg=Ua>ObY&d_otvAN~zCg*9)v01Ts&1 z-|~1Ja;C_qp3<pOkx<dMUI0RblBEL<n+?uGJ6Cx}PWyKUw6iEgd85jBfBN4RU38w; zKL_QR2?l#XL2{L;GVgc(VI)YomAOF8!Iz%tRRO@XTem!PJ(e%qf7l}0bGR9VEtLPm z7A2Vu$@zWZdH-Pxf%|C@XHc%0@Egchk~<~%^`6!gT<6{cl4{f3YSkMB+hY6h5Q5-^ zv#n3zWob1y61~|}5t+A{V+Z2PNtE48qy=Re6>0DCz~H5-w2s=WY-9bG&mgSU=_?H= z%?dO1kDzL-_v}b>-V$?HG<lTP=q&8mpt>V)r2E%HaYKAee%}l&Q^JrJMFKj)%T{cu z*wkx=BJGji_|v&Fwpw=)HQhQ-<o<KR)Lm*!$x!qI6d^%34MIYH5eB+ol17d*MdO7o z*TNMfLO~(p47L?@Pa__H4^wL~1++{NR@cRMAM%7c<LN#<Nu&<$Y!}e+t2`-U2og_; zbA_blIec-b))FaKOiF5V2J)OB7}XjNp9<!-?-NUT#HA3Rgq8AInvEpGRd_8(Xm2GF ze$%{hIi+MXAgRfh<}dcRP+w7dPFS>4@c2$~P{X&dRI0yB@N;I*RC{H&F^=UF=x&xR zmRI|cL?ZW@3MKj_f+F>O;mZCUI2L&FH-*^+>^~SNk>NYf64ND)&!3c&>2JVI6cKrC za1}A3(^0MdWW$!$-Ra_bVKwV*j$;xNzH^^3K|tEkz+mibXt{li%K!djIal@TEkNdV zT_`t`vhHLm`!@kb>&Va{{@319ZSRhqy52aWzR$n*RDC&(BG^)+z24kv^ZB|`&G(b< z419u^V|&F#qNI#=ND(C{xLD8>tXTTagvAwQsoKy0ubd6^=IP*Bu7DJEox%3h4S!Xe zfWvr)6(L6~V-ySpQxN=t$BM5IFR$835W4YHAZKi-xINO(b@;s}j?-)tGg4uwB<rpM z8>=(!zr|`XTfjO%m^mJMg3FZIFS_flf@J#X$-&nCql-ueye5$;6P;`VLXVPSY#<cg z92refbk9uIULyBTtG*f2qrXF$9zr8dh>X+T3_ifgnM*MUu$a%KDxx&bWkkmCwPcf& zgAo#eRcj(FGJNh|w^4lVam%`%05w#V(C9+BqgYQBQ3T;v(K;S3&$SxP<`b8Rcs!PX zIQXJ->n)Ticuu*^=1_gbM+kZ3v~<_L^HQ@Qkx_B76y^*?b}X~yR%5M1BYgFmCzvaf zM`h)M|0$I3_a*wnAlFLY#r)@2$D4upmt!Q$OHK7>Cm3K+Jreum2OJ(R2-fT^TiEQI zP$_J|Ww`>j|8tV${S2gW*6H=-2Q4^npEDe$Zjhig3nXN#-R%Uyw>!}Ig5dv07vL!P zCn5uWrPZe(@MI}GaPi{-XgSp?7C(RR0v^*QSD^xrf1rOtIHoWa*a(_&8a%NlaG-NJ zVEitVonGZ|Nlg1ZGy3L2rF_`rhx>kIELJHQdG)9K5^62)<5L4dtogva$u5wiHU4>q z_Ii1#y~q^}zQCKsOxEaKW=?V|LGm_D@mCiCLAxarLP**Ihi^=eC#4IVR3k?n7de=H z+`|GJg<#_Fc{3~-0>Ria3M^e`S*}AbSGo2wmA3(ur8e!N80VMyw1I(>NVU(I(x&o# z#+;+9^Lvg>f?1Vm{neG6_Tk*w`?s##+ydRjvXp!wS-7+$mbx)$j~9b#7JHeX2vzPv zF;;%-suIt?38?mIhdae5v5DTg+Fcby%hqjdxSg(-1-fS?R27l>OXs^OpYr*VhG{o> z7MOey@UcY($>^?^%ff~?vF?$Mnx7A?WDi#&TRmvYZMKvZheO5f%Pkj9YQT4DEOIxI z#^A(uTUOX`diyaBM9jAIn^|Z+K|`*|0G-=Axaa3R#`Y_JF9j2%&ekgfpdQ%MmS8q& zY{=Y&!TWUP%LsRLc!RjoHg&%05<FMwnaya8hCQ#v3`qd%l!eq~jt^UOv;;gSv5X!a zL9~tLTDawULbKJ9^6mqwMXZ6(AxVSpYdi-Q<>~fj$pSW;JXhvui3456D@psIyI$I> z{&)hu>YM^QWd>PbQ2@@j24%@A5$_1I0lGe(G5=1YTwsj!&a1za=-`kMlKKmU4}DBO zCLhl|?D(TSnTbj)u0I+aK!G{k8K3}t!8Rjj_A5c!Py<EX`}zm8HF;3x1o|%du+5+N zp6K0l!9B&QG*W}3k_*uk2*3W~>9ZRp4Gl?0M-~vyXOEAMhe?%mcu#Lf>D-V5fd-dQ zp`DP_#KgkTcu>)C>}49IUl(Zd;4sO36qlV{{l(DNMj@LqU8TwD`+7oYWMp*j3<7XM zk(l(O8$h9{fmA&QDQ3(@F~O_z#woLthO4mX=mmTlABBR^DZ;wST9p6pr2qq;;<Mbz z$BVUC8qEQ)>#}`T1`hPHMDTCDij*r+k>8=@V4&o90Sa_ApC4C1b(Akqg-vOXhSlhv z`@veAOGRu`G_Isi+3zAlD*FU#dsJ{g<h}_~!N7Ep4rb3AsS+T5L?)9Zv&>vV7^9m3 za%Kj1<lHf{0nP{wmF$6;+cn(2H+w*f55jvbqO7%!qcqjDLS`PZ^=S+4-@zMQ3)kP| z$|GzB$75(^*$E@EM~jc3)nPJw2%QFNmpM5*qZ_`1Oj~+yFu49o{ch~Ebo$cpBGR$$ z8etGRf<pyI+^e<L>YFhqIi!$>2&d9vbl|-j+tP|pfZm809^xwnvqyP9DA&wNt6PX? zRqF5uV=s1v=S4+%wrpywL<q)es6(ZE$@tfm8>01Bz}VC{5>pP2<%M=?e@@2|UMssI zM0K%<W%=Htbz<N2k<tkcFfMscg4M}JvY1_t1vDs!Q3OK)Uv`5D`+H<Yp#$jFLsE=K z5e;5b2(rtPOZJz*kn=}X*7r)N^lVw!>6us|ALNuV7`d!&vRJ{ZJS-_%mhKFy437*O zDYEpG)Q%ksr;$oyZuB@(ThB@6ig<J~7-7(Awvy=0%sq^C>2#nWFo{j1*UYWATQiG* zM{+!T!E&_i6sTHjh%;*bk+~AEpTcBC4hoRTSPZ*Eo!onh7Ti^h6#cHL68r0DGSH!d zg^H#yWPLO`wRyx6j<iA%-3uPR?Q?OYo_gX>bL`8NZ2mxS^|T2ZwqQ-kooROZ+aEgH zP9J0|ppHbUE$4LW)kf7?Q}pt&IGy%8YHzhhe=w(Bpek$QXC)zbuR4oWkH%l9C0A0X zBY~PuPpUFk{E{RSSTJ3ZcA<rfZ}AR$%$YYGCMFX@k3L?bYj?DdbtHUdoV{iT_Ihh- z%NuYPYx)vtcoO9jVyLo5*N{*Eu^-#JvqqCRv)L(uwf$aYfE6Q>solW>$#d@;tNx`V zgA}?l4lGS=H&pBuNjFdQpYC=YCln>}xs$gC|G3|>oZ5D8|E;8@k3}5(Yd=nil=}5+ zA9Qy!2Ms`AkS{<yju|L7;QnMTwBC56!Q;*h{}ZiGuTVT1d6;qcsq?BQ6U5qxKtl#| zkAqmk<K=o%Tu$5l8;3oQr|u_>PBVmRt>#_O6nkN39z+J!+ivh^<;+C*e!Sj*wD~7r zSl2s#U=a7dXYlxVMoYC1Y!HAdRgyhO5&t=*|0qfN%#E^p>i?l6BV4^e#L+`=$`!Jm zOBd*HLs%_(T6aQP(s7a%BS=qA_vDs)`VSah^7oZ}S(Nul!2%*uP%rTV+YTBam%F1p zt|lpb{#nci=q7krZ&zobImHQLO`6^AMj30osH7b74U?m&HjaM@MCb5RCK9ij^()lq z2;?*skJM?1tAS=JN#F?0u&Y9u9h6C~2nuNtUb-J4GP$2t4(V&V<>&$boqHoZz2A=Y z#1l&E!CUD~&a}q{m3y6JMk8?cO23uU?2P}<H59X<VmKW1d+p#OR@KWOM3&gaEtkB@ zIj!}o5<gNFn(vq27f(whqqZR>+tvW$0gk^Q?a8BfLG*kBP``!Xl;bZ!354ISjx2cW zn(S&Ll9T3CBg`GTqmX65+Fo%USL(1sy(pELBmBnu{T{{ecdrDd37ThKz7i!B>rsMd zS}$IPktazd>Ie#*Gn3aRS<``zZuIo5<t(|+zgmz<b?<?($DVKeWKHcksb3#Iy6xK0 zVL20EO3xnhs14U$M|ziU*R<5$uTijjKS#HC+{BsJ+Pl_7_Ayd-XR@MjHd7S`yqxUy z3FIVT31oLel16U03d0iMJodJX;|Ji5ofk09SCho%)S~0Z5$Q1DJ0JIF8)mlJ4oke2 z+e=|4%9#(!!PqRUcXx4Xi|,-RJvG)Y};H-t0g%$2G%UbZg?)1Ke8fB)9Nz}2fQ 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�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 OpX(|bS8^_!1^qvpz@Fg% literal 0 HcmV?d00001 diff --git a/public/screenshots/p2_small.png b/public/screenshots/p2_small.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8d6730cd99ef0f2bcf014c870847e13b384dfa GIT binary patch literal 206329 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 IY8do?0C2_uN&o-= literal 0 HcmV?d00001 From 722f4f760e33eb66830626bdff1d6797da397777 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:37 +0530 Subject: [PATCH 113/147] feat(manifest): update icons & screenshots --- src/app/manifest.ts | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 204e58f..792e752 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -10,17 +10,45 @@ export default function manifest(): MetadataRoute.Manifest { display: 'standalone', background_color: '#0a0a0a', theme_color: '#0a0a0a', + screenshots: [ + { + src: '/screenshots/p1.png', + form_factor: 'wide', + sizes: '2560x1600', + }, + { + src: '/screenshots/p2.png', + form_factor: 'wide', + sizes: '2560x1600', + }, + { + src: '/screenshots/p1_small.png', + form_factor: 'narrow', + sizes: '828x1792', + }, + { + src: '/screenshots/p2_small.png', + form_factor: 'narrow', + sizes: '828x1792', + }, + ], icons: [ { - src: '/icons8-search-50.png', + src: '/icon-50.png', sizes: '50x50', type: 'image/png' as const, }, { - src: '/icons8-search-100.png', + src: '/icon-100.png', sizes: '100x100', type: 'image/png', }, + { + src: '/icon.png', + sizes: '440x440', + type: 'image/png', + purpose: 'any', + }, ], }; } From b7546410586908b5187bed18e4a8797dc037046e Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:45:44 +0530 Subject: [PATCH 114/147] feat(gitignore): add certificates --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c95173d..9fb5e4c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ Thumbs.db # Db db.sqlite /searxng + +certificates \ No newline at end of file From e6ebf892c54d6614a0e1e074c593192f3cb8626b Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:47:20 +0530 Subject: [PATCH 115/147] feat(styles): update globals.css --- src/app/globals.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/globals.css b/src/app/globals.css index a8e6ae1..6bdc1a8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -12,7 +12,6 @@ } } -/* Add Fix for IOS to allow PWA and stop zooming on the page */ @media screen and (-webkit-min-device-pixel-ratio: 0) { select, textarea, From 57407112fbc16425bf89dc7b60c9e70eded3de78 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:39:50 +0530 Subject: [PATCH 116/147] feat(package): bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f62543b..999740d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "perplexica-frontend", - "version": "1.11.0-rc1", + "version": "1.11.0-rc2", "license": "MIT", "author": "ItzCrazyKns", "scripts": { From f7b4e322182cac1cb123755cdb750978af6ad88e Mon Sep 17 00:00:00 2001 From: amoshydra <8733840+amoshydra@users.noreply.github.com> Date: Thu, 17 Jul 2025 02:01:45 +0800 Subject: [PATCH 117/147] fix(discover): provide language when fetching some engines provide empty response when no language is provided. fix #618 --- src/app/api/discover/route.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index b1c761d..3bf79f0 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -36,6 +36,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, + language: "en", }, ) ).results; @@ -49,7 +50,11 @@ export const GET = async (req: Request) => { data = ( await searchSearxng( `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, - { engines: ['bing news'], pageno: 1 }, + { + engines: ['bing news'], + pageno: 1, + language: "en" + }, ) ).results; } From 26e1d5fec3d126092d56c771276896453dbf2549 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 17 Jul 2025 22:23:11 +0530 Subject: [PATCH 118/147] feat(routes): lint & beautify --- src/app/api/discover/route.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 3bf79f0..d0e56a6 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -36,7 +36,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, - language: "en", + language: 'en', }, ) ).results; @@ -53,7 +53,7 @@ export const GET = async (req: Request) => { { engines: ['bing news'], pageno: 1, - language: "en" + language: 'en', }, ) ).results; From 94e6db10bbb577184cc443cdf371cf6cfc1e6c4a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 18 Jul 2025 21:09:32 +0530 Subject: [PATCH 119/147] feat(weather): add other measurement units, closes #821 #790 --- src/app/api/weather/route.ts | 7 +++++-- src/app/settings/page.tsx | 31 +++++++++++++++++++++++++++++-- src/components/WeatherWidget.tsx | 6 +++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts index 7594aa9..1f9867f 100644 --- a/src/app/api/weather/route.ts +++ b/src/app/api/weather/route.ts @@ -1,6 +1,7 @@ export const POST = async (req: Request) => { try { - const body: { lat: number; lng: number } = await req.json(); + const body: { lat: number; lng: number; temperatureUnit: 'C' | 'F' } = + await req.json(); if (!body.lat || !body.lng) { return Response.json( @@ -12,7 +13,7 @@ export const POST = async (req: Request) => { } const res = await fetch( - `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto`, + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${body.temperatureUnit === 'C' ? '' : '&temperature_unit=fahrenheit'}`, ); const data = await res.json(); @@ -33,12 +34,14 @@ export const POST = async (req: Request) => { humidity: number; windSpeed: number; icon: string; + temperatureUnit: 'C' | 'F'; } = { temperature: data.current.temperature_2m, condition: '', humidity: data.current.relative_humidity_2m, windSpeed: data.current.wind_speed_10m, icon: '', + temperatureUnit: body.temperatureUnit, }; const code = data.current.weather_code; diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index b91519e..045226c 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -148,6 +148,7 @@ const Page = () => { const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); + const [temperatureUnit, setTemperatureUnit] = useState<'C' | 'F'>('C'); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -210,6 +211,8 @@ const Page = () => { setSystemInstructions(localStorage.getItem('systemInstructions')!); + setTemperatureUnit(localStorage.getItem('temperatureUnit')! as 'C' | 'F'); + setIsLoading(false); }; @@ -368,6 +371,8 @@ const Page = () => { localStorage.setItem('embeddingModel', value); } else if (key === 'systemInstructions') { localStorage.setItem('systemInstructions', value); + } else if (key === 'temperatureUnit') { + localStorage.setItem('temperatureUnit', value.toString()); } } catch (err) { console.error('Failed to save:', err); @@ -416,13 +421,35 @@ const Page = () => { ) : ( config && ( <div className="flex flex-col space-y-6 pb-28 lg:pb-8"> - <SettingsSection title="Appearance"> + <SettingsSection title="Preferences"> <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> Theme </p> <ThemeSwitcher /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Temperature Unit + </p> + <Select + value={temperatureUnit ?? undefined} + onChange={(e) => { + setTemperatureUnit(e.target.value as 'C' | 'F'); + saveConfig('temperatureUnit', e.target.value); + }} + options={[ + { + label: 'Celsius', + value: 'C', + }, + { + label: 'Fahrenheit', + value: 'F', + }, + ]} + /> + </div> </SettingsSection> <SettingsSection title="Automatic Search"> @@ -516,7 +543,7 @@ const Page = () => { <SettingsSection title="System Instructions"> <div className="flex flex-col space-y-4"> <Textarea - value={systemInstructions} + value={systemInstructions ?? undefined} isSaving={savingStates['systemInstructions']} onChange={(e) => { setSystemInstructions(e.target.value); diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index d308bb4..669b9ff 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -9,7 +9,9 @@ const WeatherWidget = () => { humidity: 0, windSpeed: 0, icon: '', + temperatureUnit: 'C', }); + const [loading, setLoading] = useState(true); useEffect(() => { @@ -73,6 +75,7 @@ const WeatherWidget = () => { body: JSON.stringify({ lat: location.latitude, lng: location.longitude, + temperatureUnit: localStorage.getItem('temperatureUnit') ?? 'C', }), }); @@ -91,6 +94,7 @@ const WeatherWidget = () => { humidity: data.humidity, windSpeed: data.windSpeed, icon: data.icon, + temperatureUnit: data.temperatureUnit, }); setLoading(false); }); @@ -125,7 +129,7 @@ const WeatherWidget = () => { className="h-10 w-auto" /> <span className="text-base font-semibold text-black dark:text-white"> - {data.temperature}°C + {data.temperature}°{data.temperatureUnit} </span> </div> <div className="flex flex-col justify-between flex-1 h-full py-1"> From cddc7939150f7d577bccb6a75f03e6743da61bb8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:52:14 +0530 Subject: [PATCH 120/147] feat(videoSearch): use XML parsing, use few shot prompting --- src/lib/chains/videoSearchAgent.ts | 72 +++++++++++++++++++----------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index f7cb156..8e158f5 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -3,33 +3,19 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; import { searchSearxng } from '../searxng'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import LineOutputParser from '../outputParsers/lineOutputParser'; -const VideoSearchChainPrompt = ` - You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. - You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - - Example: - 1. Follow up question: How does a car work? - Rephrased: How does a car work? - - 2. Follow up question: What is the theory of relativity? - Rephrased: What is theory of relativity - - 3. Follow up question: How does an AC work? - Rephrased: How does an AC work - - Conversation: - {chat_history} - - Follow up question: {query} - Rephrased question: - `; +const videoSearchChainPrompt = ` +You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search Youtube for videos. +You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. +Output only the rephrased query wrapped in an XML <query> element. Do not include any explanation or additional text. +`; type VideoSearchChainInput = { chat_history: BaseMessage[]; @@ -55,12 +41,46 @@ const createVideoSearchChain = (llm: BaseChatModel) => { return input.query; }, }), - PromptTemplate.fromTemplate(VideoSearchChainPrompt), + ChatPromptTemplate.fromMessages([ + ['system', videoSearchChainPrompt], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>' + ], + [ + 'assistant', + '<query>How does a car work?</query>' + ], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>' + ], + [ + 'assistant', + '<query>Theory of relativity</query>' + ], + [ + 'user', + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>' + ], + [ + 'assistant', + '<query>AC working</query>' + ], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' + ] + ]), llm, strParser, RunnableLambda.from(async (input: string) => { - input = input.replace(/<think>.*?<\/think>/g, ''); - + const queryParser = new LineOutputParser({ + key: 'query' + }); + return (await queryParser.parse(input)); + }), + RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { engines: ['youtube'], }); @@ -92,8 +112,8 @@ const handleVideoSearch = ( input: VideoSearchChainInput, llm: BaseChatModel, ) => { - const VideoSearchChain = createVideoSearchChain(llm); - return VideoSearchChain.invoke(input); + const videoSearchChain = createVideoSearchChain(llm); + return videoSearchChain.invoke(input); }; export default handleVideoSearch; From b48b0eeb0e5cfea3a8de9f7d2f1052119f8af9ec Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:52:30 +0530 Subject: [PATCH 121/147] feat(imageSearch): use XML parsing, implement few shot prompting --- src/lib/chains/imageSearchAgent.ts | 60 ++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index 4fd684f..993cba9 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -3,32 +3,18 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; import { searchSearxng } from '../searxng'; import type { BaseChatModel } from '@langchain/core/language_models/chat_models'; +import LineOutputParser from '../outputParsers/lineOutputParser'; const imageSearchChainPrompt = ` You will be given a conversation below and a follow up question. You need to rephrase the follow-up question so it is a standalone question that can be used by the LLM to search the web for images. You need to make sure the rephrased question agrees with the conversation and is relevant to the conversation. - -Example: -1. Follow up question: What is a cat? -Rephrased: A cat - -2. Follow up question: What is a car? How does it works? -Rephrased: Car working - -3. Follow up question: How does an AC work? -Rephrased: AC working - -Conversation: -{chat_history} - -Follow up question: {query} -Rephrased question: +Output only the rephrased query wrapped in an XML <query> element. Do not include any explanation or additional text. `; type ImageSearchChainInput = { @@ -54,12 +40,48 @@ const createImageSearchChain = (llm: BaseChatModel) => { return input.query; }, }), - PromptTemplate.fromTemplate(imageSearchChainPrompt), + ChatPromptTemplate.fromMessages([ + ['system', imageSearchChainPrompt], + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>" + ], + [ + "assistant", + "<query>A cat</query>" + ], + + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>" + ], + [ + "assistant", + "<query>Car working</query>" + ], + [ + "user", + "<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>" + ], + [ + "assistant", + "<query>AC working</query>" + ], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' + ] + ]), llm, strParser, RunnableLambda.from(async (input: string) => { - input = input.replace(/<think>.*?<\/think>/g, ''); + const queryParser = new LineOutputParser({ + key: 'query' + }) + return (await queryParser.parse(input)) + }), + RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { engines: ['bing images', 'google images'], }); From 7c4aa683a244137626c7d820c322f50c87fb79f7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 17:57:32 +0530 Subject: [PATCH 122/147] feat(chains): remove unused imports --- src/lib/chains/imageSearchAgent.ts | 43 ++++++++++++------------------ src/lib/chains/videoSearchAgent.ts | 31 ++++++++------------- 2 files changed, 28 insertions(+), 46 deletions(-) diff --git a/src/lib/chains/imageSearchAgent.ts b/src/lib/chains/imageSearchAgent.ts index 993cba9..a91b7bb 100644 --- a/src/lib/chains/imageSearchAgent.ts +++ b/src/lib/chains/imageSearchAgent.ts @@ -3,7 +3,7 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; @@ -43,43 +43,34 @@ const createImageSearchChain = (llm: BaseChatModel) => { ChatPromptTemplate.fromMessages([ ['system', imageSearchChainPrompt], [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>" - ], - [ - "assistant", - "<query>A cat</query>" + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is a cat?\n</follow_up>', ], + ['assistant', '<query>A cat</query>'], [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>" - ], - [ - "assistant", - "<query>Car working</query>" - ], - [ - "user", - "<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>" - ], - [ - "assistant", - "<query>AC working</query>" + 'user', + '<conversation>\n</conversation>\n<follow_up>\nWhat is a car? How does it work?\n</follow_up>', ], + ['assistant', '<query>Car working</query>'], [ 'user', - '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' - ] + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>', + ], + ['assistant', '<query>AC working</query>'], + [ + 'user', + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>', + ], ]), llm, strParser, RunnableLambda.from(async (input: string) => { const queryParser = new LineOutputParser({ - key: 'query' - }) + key: 'query', + }); - return (await queryParser.parse(input)) + return await queryParser.parse(input); }), RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { diff --git a/src/lib/chains/videoSearchAgent.ts b/src/lib/chains/videoSearchAgent.ts index 8e158f5..3f878a8 100644 --- a/src/lib/chains/videoSearchAgent.ts +++ b/src/lib/chains/videoSearchAgent.ts @@ -3,7 +3,7 @@ import { RunnableMap, RunnableLambda, } from '@langchain/core/runnables'; -import { ChatPromptTemplate, PromptTemplate } from '@langchain/core/prompts'; +import { ChatPromptTemplate } from '@langchain/core/prompts'; import formatChatHistoryAsString from '../utils/formatHistory'; import { BaseMessage } from '@langchain/core/messages'; import { StringOutputParser } from '@langchain/core/output_parsers'; @@ -45,40 +45,31 @@ const createVideoSearchChain = (llm: BaseChatModel) => { ['system', videoSearchChainPrompt], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>' - ], - [ - 'assistant', - '<query>How does a car work?</query>' + '<conversation>\n</conversation>\n<follow_up>\nHow does a car work?\n</follow_up>', ], + ['assistant', '<query>How does a car work?</query>'], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>' - ], - [ - 'assistant', - '<query>Theory of relativity</query>' + '<conversation>\n</conversation>\n<follow_up>\nWhat is the theory of relativity?\n</follow_up>', ], + ['assistant', '<query>Theory of relativity</query>'], [ 'user', - '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>' - ], - [ - 'assistant', - '<query>AC working</query>' + '<conversation>\n</conversation>\n<follow_up>\nHow does an AC work?\n</follow_up>', ], + ['assistant', '<query>AC working</query>'], [ 'user', - '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>' - ] + '<conversation>{chat_history}</conversation>\n<follow_up>\n{query}\n</follow_up>', + ], ]), llm, strParser, RunnableLambda.from(async (input: string) => { const queryParser = new LineOutputParser({ - key: 'query' + key: 'query', }); - return (await queryParser.parse(input)); + return await queryParser.parse(input); }), RunnableLambda.from(async (input: string) => { const res = await searchSearxng(input, { From 7f629073850b7c80a528001c7cf2db6e3d5fe5d3 Mon Sep 17 00:00:00 2001 From: Willie Zutz <boarder2@bit-shift.com> Date: Sat, 19 Jul 2025 08:53:11 -0600 Subject: [PATCH 123/147] feat(weather): update measurement units to Imperial/Metric --- src/app/api/weather/route.ts | 15 +++++++++++---- src/app/settings/page.tsx | 28 ++++++++++++++++------------ src/components/WeatherWidget.tsx | 6 ++++-- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/app/api/weather/route.ts b/src/app/api/weather/route.ts index 1f9867f..afaf8a6 100644 --- a/src/app/api/weather/route.ts +++ b/src/app/api/weather/route.ts @@ -1,7 +1,10 @@ export const POST = async (req: Request) => { try { - const body: { lat: number; lng: number; temperatureUnit: 'C' | 'F' } = - await req.json(); + const body: { + lat: number; + lng: number; + measureUnit: 'Imperial' | 'Metric'; + } = await req.json(); if (!body.lat || !body.lng) { return Response.json( @@ -13,7 +16,9 @@ export const POST = async (req: Request) => { } const res = await fetch( - `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${body.temperatureUnit === 'C' ? '' : '&temperature_unit=fahrenheit'}`, + `https://api.open-meteo.com/v1/forecast?latitude=${body.lat}&longitude=${body.lng}¤t=weather_code,temperature_2m,is_day,relative_humidity_2m,wind_speed_10m&timezone=auto${ + body.measureUnit === 'Metric' ? '' : '&temperature_unit=fahrenheit' + }${body.measureUnit === 'Metric' ? '' : '&wind_speed_unit=mph'}`, ); const data = await res.json(); @@ -35,13 +40,15 @@ export const POST = async (req: Request) => { windSpeed: number; icon: string; temperatureUnit: 'C' | 'F'; + windSpeedUnit: 'm/s' | 'mph'; } = { temperature: data.current.temperature_2m, condition: '', humidity: data.current.relative_humidity_2m, windSpeed: data.current.wind_speed_10m, icon: '', - temperatureUnit: body.temperatureUnit, + temperatureUnit: body.measureUnit === 'Metric' ? 'C' : 'F', + windSpeedUnit: body.measureUnit === 'Metric' ? 'm/s' : 'mph', }; const code = data.current.weather_code; diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 045226c..1b13c9c 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -148,7 +148,9 @@ const Page = () => { const [automaticImageSearch, setAutomaticImageSearch] = useState(false); const [automaticVideoSearch, setAutomaticVideoSearch] = useState(false); const [systemInstructions, setSystemInstructions] = useState<string>(''); - const [temperatureUnit, setTemperatureUnit] = useState<'C' | 'F'>('C'); + const [measureUnit, setMeasureUnit] = useState<'Imperial' | 'Metric'>( + 'Metric', + ); const [savingStates, setSavingStates] = useState<Record<string, boolean>>({}); useEffect(() => { @@ -211,7 +213,9 @@ const Page = () => { setSystemInstructions(localStorage.getItem('systemInstructions')!); - setTemperatureUnit(localStorage.getItem('temperatureUnit')! as 'C' | 'F'); + setMeasureUnit( + localStorage.getItem('measureUnit')! as 'Imperial' | 'Metric', + ); setIsLoading(false); }; @@ -371,8 +375,8 @@ const Page = () => { localStorage.setItem('embeddingModel', value); } else if (key === 'systemInstructions') { localStorage.setItem('systemInstructions', value); - } else if (key === 'temperatureUnit') { - localStorage.setItem('temperatureUnit', value.toString()); + } else if (key === 'measureUnit') { + localStorage.setItem('measureUnit', value.toString()); } } catch (err) { console.error('Failed to save:', err); @@ -430,22 +434,22 @@ const Page = () => { </div> <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> - Temperature Unit + Measurement Units </p> <Select - value={temperatureUnit ?? undefined} + value={measureUnit ?? undefined} onChange={(e) => { - setTemperatureUnit(e.target.value as 'C' | 'F'); - saveConfig('temperatureUnit', e.target.value); + setMeasureUnit(e.target.value as 'Imperial' | 'Metric'); + saveConfig('measureUnit', e.target.value); }} options={[ { - label: 'Celsius', - value: 'C', + label: 'Metric', + value: 'Metric', }, { - label: 'Fahrenheit', - value: 'F', + label: 'Imperial', + value: 'Imperial', }, ]} /> diff --git a/src/components/WeatherWidget.tsx b/src/components/WeatherWidget.tsx index 669b9ff..8eaf871 100644 --- a/src/components/WeatherWidget.tsx +++ b/src/components/WeatherWidget.tsx @@ -10,6 +10,7 @@ const WeatherWidget = () => { windSpeed: 0, icon: '', temperatureUnit: 'C', + windSpeedUnit: 'm/s', }); const [loading, setLoading] = useState(true); @@ -75,7 +76,7 @@ const WeatherWidget = () => { body: JSON.stringify({ lat: location.latitude, lng: location.longitude, - temperatureUnit: localStorage.getItem('temperatureUnit') ?? 'C', + measureUnit: localStorage.getItem('measureUnit') ?? 'Metric', }), }); @@ -95,6 +96,7 @@ const WeatherWidget = () => { windSpeed: data.windSpeed, icon: data.icon, temperatureUnit: data.temperatureUnit, + windSpeedUnit: data.windSpeedUnit, }); setLoading(false); }); @@ -139,7 +141,7 @@ const WeatherWidget = () => { </span> <span className="flex items-center text-xs text-black/60 dark:text-white/60"> <Wind className="w-3 h-3 mr-1" /> - {data.windSpeed} km/h + {data.windSpeed} {data.windSpeedUnit} </span> </div> <span className="text-xs text-black/60 dark:text-white/60 mt-1"> From 543f1df5ce7045be7178e5f122932ff66747ec35 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:08:45 +0530 Subject: [PATCH 124/147] feat(modules): update langchain packages --- package.json | 13 +- yarn.lock | 680 ++++++++++++++++++++++----------------------------- 2 files changed, 296 insertions(+), 397 deletions(-) diff --git a/package.json b/package.json index 999740d..9e9137f 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,12 @@ "@headlessui/react": "^2.2.0", "@iarna/toml": "^2.2.5", "@icons-pack/react-simple-icons": "^12.3.0", - "@langchain/anthropic": "^0.3.15", - "@langchain/community": "^0.3.36", - "@langchain/core": "^0.3.42", - "@langchain/google-genai": "^0.1.12", - "@langchain/openai": "^0.0.25", + "@langchain/anthropic": "^0.3.24", + "@langchain/community": "^0.3.49", + "@langchain/core": "^0.3.66", + "@langchain/google-genai": "^0.2.15", + "@langchain/ollama": "^0.2.3", + "@langchain/openai": "^0.6.2", "@langchain/textsplitters": "^0.1.0", "@tailwindcss/typography": "^0.5.12", "@xenova/transformers": "^2.17.2", @@ -31,7 +32,7 @@ "drizzle-orm": "^0.40.1", "html-to-text": "^9.0.5", "jspdf": "^3.0.1", - "langchain": "^0.1.30", + "langchain": "^0.3.30", "lucide-react": "^0.363.0", "mammoth": "^1.9.1", "markdown-to-jsx": "^7.7.2", diff --git a/yarn.lock b/yarn.lock index f2b847c..b8893e7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,33 +12,10 @@ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== -"@anthropic-ai/sdk@^0.37.0": - version "0.37.0" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.37.0.tgz#0018127404ecb9b8a12968068e0c4b3e8bbd6386" - integrity sha512-tHjX2YbkUBwEgg0JZU3EFSSAQPoK4qQR/NFYa8Vtzd5UAyXzZksCw2In69Rml4R/TyHPBfRYaLK35XiOe33pjw== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - -"@anthropic-ai/sdk@^0.9.1": - version "0.9.1" - resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.9.1.tgz#b2d2b7bf05c90dce502c9a2e869066870f69ba88" - integrity sha512-wa1meQ2WSfoY8Uor3EdrJq0jTiZJoKoSii2ZVWRY1oN4Tlr5s59pADg9T79FTbPe1/se5c3pBeZgJL63wmuoBA== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - digest-fetch "^1.3.0" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" +"@anthropic-ai/sdk@^0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@anthropic-ai/sdk/-/sdk-0.56.0.tgz#8b6366d5d22235c3ec978c05b2c9420fdf426ed9" + integrity sha512-SLCB8M8+VMg1cpCucnA1XWHGWqVSZtIWzmOdDOEu3eTFZMB+A0sGZ1ESO5MHDnqrNTXz3safMrWx9x4rMZSOqA== "@babel/runtime@^7.12.5", "@babel/runtime@^7.26.7": version "7.27.3" @@ -393,9 +370,32 @@ integrity sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig== "@google/generative-ai@^0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.0.tgz#4d27af7d944c924a27a593c17ad1336535d53846" - integrity sha512-fnEITCGEB7NdX0BhoYZ/cq/7WPZ1QS5IzJJfC3Tg/OwkvBetMiVJciyaan297OvE4B9Jg1xvo0zIazX/9sGu1Q== + version "0.24.1" + resolved "https://registry.yarnpkg.com/@google/generative-ai/-/generative-ai-0.24.1.tgz#634a3c06f8ea7a6125c1b0d6c1e66bb11afb52c9" + integrity sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q== + +"@graphql-typed-document-node/core@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.2.0.tgz#5f3d96ec6b2354ad6d8a28bf216a1d97b5426861" + integrity sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ== + +"@grpc/grpc-js@^1.13.1": + version "1.13.4" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.4.tgz#922fbc496e229c5fa66802d2369bf181c1df1c5a" + integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.15" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.15.tgz#4cdfbf35a35461fc843abe8b9e2c0770b5095e60" + integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" "@headlessui/react@^2.2.0": version "2.2.0" @@ -598,120 +598,77 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@langchain/anthropic@^0.3.15": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.15.tgz#0244cdb345cb492eb40aedd681881ebadfbb73f2" - integrity sha512-Ar2viYcZ64idgV7EtCBCb36tIkNtPAhQRxSaMTWPHGspFgMfvwRoleVri9e90sCpjpS9xhlHsIQ0LlUS/Atsrw== - dependencies: - "@anthropic-ai/sdk" "^0.37.0" - fast-xml-parser "^4.4.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.4" +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== -"@langchain/community@^0.3.36": - version "0.3.36" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.36.tgz#e4c13b8f928b17e0f9257395f43be2246dfada40" - integrity sha512-4jBB4yqux8CGfCwlBbtXck5qP0yJPwDvtwI4KUN2j/At+zSZn1FyTL11G75ctG2b5GO7u+cR6QatDXIPooJphA== +"@langchain/anthropic@^0.3.24": + version "0.3.24" + resolved "https://registry.yarnpkg.com/@langchain/anthropic/-/anthropic-0.3.24.tgz#bc64ccab419fa61f0e3a1abb733046cc12bfadb4" + integrity sha512-Gi1TwXu5vkCxUMToiXaiwTTWq9v3WMyU3ldB/VEWjzbkr3nKF5kcp+HLqhvV7WWOFVTTNgG+pzfq8JALecq5MA== dependencies: - "@langchain/openai" ">=0.2.0 <0.5.0" + "@anthropic-ai/sdk" "^0.56.0" + fast-xml-parser "^4.4.1" + +"@langchain/community@^0.3.49": + version "0.3.49" + resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.3.49.tgz#9e67791c686cfbd378439afb7044cec571dca0f4" + integrity sha512-1AAo9mvr1FmqYHUpXhYI8P4NBPC4t9TfUAuvefEImrtb3gZ60fPelVu17ljWlKJcHC1hPSHYpPJWm0Yx7yRvrw== + dependencies: + "@langchain/openai" ">=0.2.0 <0.7.0" + "@langchain/weaviate" "^0.2.0" binary-extensions "^2.2.0" expr-eval "^2.0.2" flat "^5.0.2" js-yaml "^4.1.0" langchain ">=0.2.3 <0.3.0 || >=0.3.4 <0.4.0" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.33" uuid "^10.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" + zod "^3.25.32" -"@langchain/community@~0.0.41": - version "0.0.44" - resolved "https://registry.yarnpkg.com/@langchain/community/-/community-0.0.44.tgz#b4f3453e3fd0b7a8c704fc35b004d7d738bd3416" - integrity sha512-II9Hz90jJmfWRICtxTg1auQWzFw0npqacWiiOpaxNhzs6rptdf56gyfC48Z6n1ii4R8FfAlfX6YxhOE7lGGKXg== - dependencies: - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.19" - expr-eval "^2.0.2" - flat "^5.0.2" - langsmith "~0.1.1" - uuid "^9.0.0" - zod "^3.22.3" - zod-to-json-schema "^3.22.5" - -"@langchain/core@^0.3.42": - version "0.3.42" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.42.tgz#f1fa38425626d8efe9fe2ee51d36c91506632363" - integrity sha512-pT/jC5lqWK3YGDq8dQwgKoa6anqAhMtG1x5JbnrOj9NdaLeBbCKBDQ+/Ykzk3nZ8o+0UMsaXNZo7IVL83VVjHg== +"@langchain/core@^0.3.66": + version "0.3.66" + resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.3.66.tgz#cd20687f29a07148436cd8b72b88c66d076c500c" + integrity sha512-d3SgSDOlgOjdIbReIXVQl9HaQzKqO/5+E+o3kJwoKXLGP9dxi7+lMyaII7yv7G8/aUxMWLwFES9zc1jFoeJEZw== dependencies: "@cfworker/json-schema" "^4.0.2" ansi-styles "^5.0.0" camelcase "6" decamelize "1.2.0" js-tiktoken "^1.0.12" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.46" mustache "^4.2.0" p-queue "^6.6.2" p-retry "4" uuid "^10.0.0" - zod "^3.22.4" + zod "^3.25.32" zod-to-json-schema "^3.22.3" -"@langchain/core@~0.1.44", "@langchain/core@~0.1.45": - version "0.1.54" - resolved "https://registry.yarnpkg.com/@langchain/core/-/core-0.1.54.tgz#63dfbd5c116798f6d080fbe675a68a87d84a1be4" - integrity sha512-87pQ8dnWY8P1Kgnu/SgnRijLRNSEzTzkjBK6O/Z1klXf/eQTXAG5O5cKwe3lwM6Afn+4U2byzSMYjwViAYuR4g== - dependencies: - ansi-styles "^5.0.0" - camelcase "6" - decamelize "1.2.0" - js-tiktoken "^1.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/google-genai@^0.1.12": - version "0.1.12" - resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.1.12.tgz#6727253bda6f0d87cd74cf0bb6b1e0f398f60f32" - integrity sha512-0Ea0E2g63ejCuormVxbuoyJQ5BYN53i2/fb6WP8bMKzyh+y43R13V8JqOtr3e/GmgNyv3ou/VeaZjx7KAvu/0g== +"@langchain/google-genai@^0.2.15": + version "0.2.15" + resolved "https://registry.yarnpkg.com/@langchain/google-genai/-/google-genai-0.2.15.tgz#bf8c7f14ee5a0c16aaafc71f902ad8619e8089f2" + integrity sha512-fAD3xjzd5TxWQCKlttNeEc+b5tUX43hBqKH3rk3g+wbl1ToLqe3ocWawKRmGotEuI5jhDVmoHjDxoNMifFDgmg== dependencies: "@google/generative-ai" "^0.24.0" - zod-to-json-schema "^3.22.4" + uuid "^11.1.0" -"@langchain/openai@>=0.1.0 <0.5.0", "@langchain/openai@>=0.2.0 <0.5.0": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.4.5.tgz#d18e207c3ec3f2ecaa4698a5a5888092f643da52" - integrity sha512-S/sqC71GVsCDiFGU0A0VQDFGNrjcuz72FxlfuSxwOuo955qad/0Yp0hRhWJilPOjgDByGwaeZkOaxC/oE9ABdQ== +"@langchain/ollama@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@langchain/ollama/-/ollama-0.2.3.tgz#4868e66db4fc480f08c42fc652274abbab0416f0" + integrity sha512-1Obe45jgQspqLMBVlayQbGdywFmri8DgmGRdzNu0li56cG5RReYlRCFVDZBRMMvF9JhsP5eXRyfyivtKfITHWQ== + dependencies: + ollama "^0.5.12" + uuid "^10.0.0" + +"@langchain/openai@>=0.1.0 <0.7.0", "@langchain/openai@>=0.2.0 <0.7.0", "@langchain/openai@^0.6.2": + version "0.6.2" + resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.6.2.tgz#fb68fa7305ef419e772a56c29146810c0923513d" + integrity sha512-OjdSfGENdz4tR9TPN4KTat7vJIE6cgt7vT0z69qU1J1aHCs9MyNwqdaQFF++LVlZAae9aTpyCyqeODyge42oKw== dependencies: js-tiktoken "^1.0.12" - openai "^4.87.3" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@^0.0.25": - version "0.0.25" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.25.tgz#8332abea1e3acb9b1169f90636e518c0ee90622e" - integrity sha512-cD9xPDDXK2Cjs6yYg27BpdzBnQZvBb1yaNgMoGLWIT27UQVRyT96PLC1OVMQOmMmHaKDBCj/1bW4GQQgX7+d2Q== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.26.0" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -"@langchain/openai@~0.0.19", "@langchain/openai@~0.0.26": - version "0.0.26" - resolved "https://registry.yarnpkg.com/@langchain/openai/-/openai-0.0.26.tgz#ab989085e03f8bcc26a40d4d5abe9a2b73e5f2a8" - integrity sha512-FpqYvVRP2CkFFjTLrj2tbXeY6JTIgbq8tRoi0rvGzmhRpoi6cWHlfgclSzDm+e6P9DqKBkzDjo6SPTJgTOabNA== - dependencies: - "@langchain/core" "~0.1.45" - js-tiktoken "^1.0.7" - openai "^4.32.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" + openai "^5.3.0" + zod "^3.25.32" "@langchain/textsplitters@>=0.0.0 <0.2.0", "@langchain/textsplitters@^0.1.0": version "0.1.0" @@ -720,6 +677,14 @@ dependencies: js-tiktoken "^1.0.12" +"@langchain/weaviate@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@langchain/weaviate/-/weaviate-0.2.1.tgz#51ad20cf6d40e63d6149e5d01f91597cdff66744" + integrity sha512-rlfAKF+GB0A5MUrol34oDrBkl4q6AefARk9KDW+LfzhV/74pZZLZyIPYPxvE4XwI3gvpwp024DNsDxK/4UW0/g== + dependencies: + uuid "^10.0.0" + weaviate-client "^3.5.2" + "@next/env@15.2.2": version "15.2.2" resolved "https://registry.yarnpkg.com/@next/env/-/env-15.2.2.tgz#6345352365a811c523cecf284874ff489b675e59" @@ -983,14 +948,6 @@ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== -"@types/node-fetch@^2.6.4": - version "2.6.11" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" - integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== - dependencies: - "@types/node" "*" - form-data "^4.0.0" - "@types/node@*", "@types/node@^20": version "20.12.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.5.tgz#74c4f31ab17955d0b5808cdc8fd2839526ad00b3" @@ -1005,13 +962,6 @@ dependencies: undici-types "~6.20.0" -"@types/node@^18.11.18": - version "18.19.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.30.tgz#0b1e6f824ed7ce37ef6e56f8f0d7d0ec2847b327" - integrity sha512-453z1zPuJLVDbyahaa1sSD5C2sht6ZpHp5rgJNs+H8YGqhluCXcuOUmBYsAo0Tos0cHySJ3lVUGbGgLlqIkpyg== - dependencies: - undici-types "~5.26.4" - "@types/pdf-parse@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@types/pdf-parse/-/pdf-parse-1.1.4.tgz#21a539efd2f16009d08aeed3350133948b5d7ed1" @@ -1062,11 +1012,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-10.0.0.tgz#e9c07fe50da0f53dc24970cca94d619ff03f6f6d" integrity sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ== -"@types/uuid@^9.0.1": - version "9.0.8" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" - integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== - "@typescript-eslint/parser@^5.4.2 || ^6.0.0": version "6.21.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" @@ -1134,12 +1079,10 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" +abort-controller-x@^0.4.0, abort-controller-x@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/abort-controller-x/-/abort-controller-x-0.4.3.tgz#ff269788386fabd58a7b6eeaafcb6cf55c2958e0" + integrity sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA== acorn-jsx@^5.3.2: version "5.3.2" @@ -1151,13 +1094,6 @@ acorn@^8.9.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== -agentkeepalive@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" - integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== - dependencies: - humanize-ms "^1.2.1" - ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -1439,11 +1375,6 @@ bare-stream@^2.0.0: dependencies: streamx "^2.21.0" -base-64@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base-64/-/base-64-0.1.0.tgz#780a99c84e7d600260361511c4877613bf24f6bb" - integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== - base64-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -1467,11 +1398,6 @@ binary-extensions@^2.0.0, binary-extensions@^2.2.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -binary-search@^1.3.5: - version "1.3.6" - resolved "https://registry.yarnpkg.com/binary-search/-/binary-search-1.3.6.tgz#e32426016a0c5092f0f3598836a1c7da3560565c" - integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== - bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -1608,11 +1534,6 @@ chalk@^4.0.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - chokidar@^3.5.3: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" @@ -1638,6 +1559,15 @@ client-only@0.0.1: resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clsx@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" @@ -1711,11 +1641,6 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - commander@^4.0.0: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" @@ -1753,9 +1678,9 @@ concat-map@0.0.1: integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== console-table-printer@^2.12.1: - version "2.12.1" - resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" - integrity sha512-wKGOQRRvdnd89pCeH96e2Fn4wkbenSP6LMHfjfyNLMbGuHEFbMqQNuxXqd0oXG9caIOQ1FTvc5Uijp9/4jujnQ== + version "2.14.6" + resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.14.6.tgz#edfe0bf311fa2701922ed509443145ab51e06436" + integrity sha512-MCBl5HNVaFuuHW6FGbL/4fB7N/ormCy+tQ+sxTrF6QtSbSNETvPuOVbkJBhzDgYhvjWGrTma4eYJa37ZuoQsPw== dependencies: simple-wcswidth "^1.0.1" @@ -1769,6 +1694,13 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cross-fetch@^3.1.5: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.2.0.tgz#34e9192f53bc757d6614304d9e5e6fb4edb782e3" + integrity sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q== + dependencies: + node-fetch "^2.7.0" + cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -1778,11 +1710,6 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - css-line-break@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" @@ -1911,14 +1838,6 @@ didyoumean@^1.2.2: resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== -digest-fetch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/digest-fetch/-/digest-fetch-1.3.0.tgz#898e69264d00012a23cf26e8a3e40320143fc661" - integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== - dependencies: - base-64 "^0.1.0" - md5 "^2.3.0" - dingbat-to-unicode@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dingbat-to-unicode/-/dingbat-to-unicode-1.0.1.tgz#5091dd673241453e6b5865e26e5a4452cdef5c83" @@ -2458,11 +2377,6 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - eventemitter3@^4.0.4: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -2609,11 +2523,6 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" -form-data-encoder@1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.2.tgz#1f1ae3dccf58ed4690b86d87e4f57c654fbab040" - integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== - form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -2623,14 +2532,6 @@ form-data@^4.0.0: combined-stream "^1.0.8" mime-types "^2.1.12" -formdata-node@^4.3.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/formdata-node/-/formdata-node-4.4.1.tgz#23f6a5cb9cb55315912cbec4ff7b0f59bbd191e2" - integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== - dependencies: - node-domexception "1.0.0" - web-streams-polyfill "4.0.0-beta.3" - fraction.js@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" @@ -2683,6 +2584,11 @@ gel@^2.0.0: shell-quote "^1.8.1" which "^4.0.0" +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" @@ -2813,6 +2719,19 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +graphql-request@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-6.1.0.tgz#f4eb2107967af3c7a5907eb3131c671eac89be4f" + integrity sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw== + dependencies: + "@graphql-typed-document-node/core" "^3.2.0" + cross-fetch "^3.1.5" + +graphql@^16.11.0: + version "16.11.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" + integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== + guid-typescript@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" @@ -2888,13 +2807,6 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== - dependencies: - ms "^2.0.0" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -2950,11 +2862,6 @@ internal-slot@^1.0.7: hasown "^2.0.0" side-channel "^1.0.4" -is-any-array@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" - integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== - is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" @@ -2997,11 +2904,6 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" @@ -3198,16 +3100,9 @@ jiti@^1.21.0: integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-tiktoken@^1.0.12: - version "1.0.19" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.19.tgz#0298b584382f1d47d4b45cb93d382f11780eab78" - integrity sha512-XC63YQeEcS47Y53gg950xiZ4IWmkfMe4p2V9OSaBt26q+p47WHn18izuXzSclCI73B7yGqtfRsT6jcZQI0y08g== - dependencies: - base64-js "^1.5.1" - -js-tiktoken@^1.0.7, js-tiktoken@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.10.tgz#2b343ec169399dcee8f9ef9807dbd4fafd3b30dc" - integrity sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA== + version "1.0.20" + resolved "https://registry.yarnpkg.com/js-tiktoken/-/js-tiktoken-1.0.20.tgz#fa2733bf147acaf1bdcf9ab8a878e79c581c95f2" + integrity sha512-Xlaqhhs8VfCd6Sh7a1cFkZHQbYTLCwVJJWiHVxBYzLPxW0XsoxBy1hitmjkdIjD3Aon5BXLHFwU5O8WUx6HH+A== dependencies: base64-js "^1.5.1" @@ -3297,56 +3192,27 @@ kuler@^2.0.0: resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== -"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0": - version "0.3.19" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.19.tgz#a0329036c4c870018897b91af2ac442c1f07294b" - integrity sha512-aGhoTvTBS5ulatA67RHbJ4bcV5zcYRYdm5IH+hpX99RYSFXG24XF3ghSjhYi6sxW+SUnEQ99fJhA5kroVpKNhw== +"langchain@>=0.2.3 <0.3.0 || >=0.3.4 <0.4.0", langchain@^0.3.30: + version "0.3.30" + resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.3.30.tgz#9fc0467007009dc5e799d1f8fb9dd1137654e387" + integrity sha512-UyVsfwHDpHbrnWrjWuhJHqi8Non+Zcsf2kdpDTqyJF8NXrHBOpjdHT5LvPuW9fnE7miDTWf5mLcrWAGZgcrznQ== dependencies: - "@langchain/openai" ">=0.1.0 <0.5.0" + "@langchain/openai" ">=0.1.0 <0.7.0" "@langchain/textsplitters" ">=0.0.0 <0.2.0" js-tiktoken "^1.0.12" js-yaml "^4.1.0" jsonpointer "^5.0.1" - langsmith ">=0.2.8 <0.4.0" + langsmith "^0.3.33" openapi-types "^12.1.3" p-retry "4" uuid "^10.0.0" yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" + zod "^3.25.32" -langchain@^0.1.30: - version "0.1.31" - resolved "https://registry.yarnpkg.com/langchain/-/langchain-0.1.31.tgz#4f3a0e84a00d77214b325156e661762f945f33ae" - integrity sha512-J2iZZL48Nwdo1XDU5cS5YYm91b2L6sL3a8hH1gBljvDzCY7jbtUOTuIoRVx5iHN3DXuuLnszS4lhqg0u9hQxBQ== - dependencies: - "@anthropic-ai/sdk" "^0.9.1" - "@langchain/community" "~0.0.41" - "@langchain/core" "~0.1.44" - "@langchain/openai" "~0.0.26" - binary-extensions "^2.2.0" - js-tiktoken "^1.0.7" - js-yaml "^4.1.0" - jsonpointer "^5.0.1" - langchainhub "~0.0.8" - langsmith "~0.1.7" - ml-distance "^4.0.0" - openapi-types "^12.1.3" - p-retry "4" - uuid "^9.0.0" - yaml "^2.2.1" - zod "^3.22.4" - zod-to-json-schema "^3.22.3" - -langchainhub@~0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/langchainhub/-/langchainhub-0.0.8.tgz#fd4b96dc795e22e36c1a20bad31b61b0c33d3110" - integrity sha512-Woyb8YDHgqqTOZvWIbm2CaFDGfZ4NTSyXV687AG4vXEfoNo7cGQp7nhl7wL3ehenKWmNEmcxCLgOZzW8jE6lOQ== - -"langsmith@>=0.2.8 <0.4.0": - version "0.3.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.14.tgz#4dfde17d77f8d80c69c28fb647dbe310c2352e6f" - integrity sha512-MzoxdRkFFV/6140vpP5V2e2fkTG6x/0zIjw77bsRwAXEMjPRTUyDazfXeSyrS5uJvbLgxAXc+MF1h6vPWe6SXQ== +langsmith@^0.3.33, langsmith@^0.3.46: + version "0.3.46" + resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.3.46.tgz#6d369f2c91aa771f49a5f7c4e4e67c12763cf737" + integrity sha512-Hhi4/cMjhWIGpu0DW5eQrXBbeeKQWPYYQyJCYzhFjod+xinMry4i8QR0gxrrgjGOgfMuU6nyK79YqjGTEPVbDA== dependencies: "@types/uuid" "^10.0.0" chalk "^4.1.2" @@ -3356,17 +3222,6 @@ langchainhub@~0.0.8: semver "^7.6.3" uuid "^10.0.0" -langsmith@~0.1.1, langsmith@~0.1.7: - version "0.1.14" - resolved "https://registry.yarnpkg.com/langsmith/-/langsmith-0.1.14.tgz#2b889dbcfb49547614df276a4a5a063092a1585d" - integrity sha512-iEzQLLB7/0nRpAwNBAR7B7N64fyByg5UsNjSvLaCCkQ9AS68PSafjB8xQkyI8QXXrGjU1dEqDRoa8m4SUuRdUw== - dependencies: - "@types/uuid" "^9.0.1" - commander "^10.0.1" - p-queue "^6.6.2" - p-retry "4" - uuid "^9.0.0" - language-subtag-registry@^0.3.20: version "0.3.22" resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" @@ -3421,6 +3276,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.castarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz#c02513515e309daddd4c24c60cfddcf5976d9115" @@ -3453,6 +3313,11 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== +long@^5.0.0, long@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" + integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== + loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -3507,15 +3372,6 @@ markdown-to-jsx@^7.7.2: resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -3582,48 +3438,12 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== -ml-array-mean@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-mean/-/ml-array-mean-1.1.6.tgz#d951a700dc8e3a17b3e0a583c2c64abd0c619c56" - integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== - dependencies: - ml-array-sum "^1.1.6" - -ml-array-sum@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/ml-array-sum/-/ml-array-sum-1.1.6.tgz#d1d89c20793cd29c37b09d40e85681aa4515a955" - integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== - dependencies: - is-any-array "^2.0.0" - -ml-distance-euclidean@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz#3a668d236649d1b8fec96380b9435c6f42c9a817" - integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== - -ml-distance@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ml-distance/-/ml-distance-4.0.1.tgz#4741d17a1735888c5388823762271dfe604bd019" - integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== - dependencies: - ml-array-mean "^1.1.6" - ml-distance-euclidean "^2.0.0" - ml-tree-similarity "^1.0.0" - -ml-tree-similarity@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz#24705a107e32829e24d945e87219e892159c53f0" - integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== - dependencies: - binary-search "^1.3.5" - num-sort "^2.0.0" - ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@^2.0.0, ms@^2.1.1: +ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3690,6 +3510,30 @@ next@^15.2.2: "@next/swc-win32-x64-msvc" "15.2.2" sharp "^0.33.5" +nice-grpc-client-middleware-retry@^3.1.11: + version "3.1.11" + resolved "https://registry.yarnpkg.com/nice-grpc-client-middleware-retry/-/nice-grpc-client-middleware-retry-3.1.11.tgz#4fc0128b891d184b6c98af3bfd6aca1b608a3fd1" + integrity sha512-xW/imz/kNG2g0DwTfH2eYEGrg1chSLrXtvGp9fg2qkhTgGFfAS/Pq3+t+9G8KThcC4hK/xlEyKvZWKk++33S6A== + dependencies: + abort-controller-x "^0.4.0" + nice-grpc-common "^2.0.2" + +nice-grpc-common@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/nice-grpc-common/-/nice-grpc-common-2.0.2.tgz#e6aeebb2bd19d87114b351e291e30d79dd38acf7" + integrity sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ== + dependencies: + ts-error "^1.0.6" + +nice-grpc@^2.1.12: + version "2.1.12" + resolved "https://registry.yarnpkg.com/nice-grpc/-/nice-grpc-2.1.12.tgz#56ffdcc4d5bc3d0271c176210680c4bd10c5149b" + integrity sha512-J1n4Wg+D3IhRhGQb+iqh2OpiM0GzTve/kf2lnlW4S+xczmIEd0aHUDV1OsJ5a3q8GSTqJf+s4Rgg1M8uJltarw== + dependencies: + "@grpc/grpc-js" "^1.13.1" + abort-controller-x "^0.4.0" + nice-grpc-common "^2.0.2" + node-abi@^3.3.0: version "3.74.0" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.74.0.tgz#5bfb4424264eaeb91432d2adb9da23c63a301ed0" @@ -3702,17 +3546,12 @@ node-addon-api@^6.1.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== -node-domexception@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" - integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== - node-ensure@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7" integrity sha512-DRI60hzo2oKN1ma0ckc6nQWlHU69RH6xN0sjQTjMpChPfTYvKZdcQFfdYK2RWbJcKyUizSIy/l8OTGxMAM1QDw== -node-fetch@^2.6.7: +node-fetch@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -3734,11 +3573,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -num-sort@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/num-sort/-/num-sort-2.1.0.tgz#1cbb37aed071329fdf41151258bc011898577a9b" - integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== - object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -3815,6 +3649,13 @@ object.values@^1.1.6, object.values@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" +ollama@^0.5.12: + version "0.5.16" + resolved "https://registry.yarnpkg.com/ollama/-/ollama-0.5.16.tgz#cb695b4aab6f6c07236a04b3aee40160f4f9e892" + integrity sha512-OEbxxOIUZtdZgOaTPAULo051F5y+Z1vosxEYOoABPnQKeW7i4O8tJNlxCB+xioyoorVqgjkdj+TA1f1Hy2ug/w== + dependencies: + whatwg-fetch "^3.6.20" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -3860,32 +3701,10 @@ onnxruntime-web@1.14.0: onnxruntime-common "~1.14.0" platform "^1.3.6" -openai@^4.26.0, openai@^4.32.1: - version "4.33.0" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.33.0.tgz#8c33da687d4a7f3dd7576179318341615394c79d" - integrity sha512-Sh4KvplkvkAREuhb8yZpohqsOo08cBBu6LNWLD8YyMxe8yCxbE+ouJYUs1X2oDPrzQGANj0rFNQYiwW9gWLBOg== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" - web-streams-polyfill "^3.2.1" - -openai@^4.87.3: - version "4.87.4" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.87.4.tgz#f9d8da366a1ded2c7aa92cb9f2256755d0e58902" - integrity sha512-lsfM20jZY4A0lNexfoUAkfmrEXxaTXvv8OKYicpeAJUNHObpRgkvC7pxPgMnB6gc9ID8OCwzzhEhBpNy69UR7w== - dependencies: - "@types/node" "^18.11.18" - "@types/node-fetch" "^2.6.4" - abort-controller "^3.0.0" - agentkeepalive "^4.2.1" - form-data-encoder "1.7.2" - formdata-node "^4.3.2" - node-fetch "^2.6.7" +openai@^5.3.0: + version "5.10.1" + resolved "https://registry.yarnpkg.com/openai/-/openai-5.10.1.tgz#4535a9603f4d03b2392bb2ca41a618a80fdcfacd" + integrity sha512-fq6xVfv1/gpLbsj8fArEt3b6B9jBxdhAK+VJ+bDvbUvNd+KTLlA3bnDeYZaBsGH9LUhJ1M1yXfp9sEyBLMx6eA== openapi-types@^12.1.3: version "12.1.3" @@ -4183,6 +4002,24 @@ protobufjs@^6.8.8: "@types/node" ">=13.7.0" long "^4.0.0" +protobufjs@^7.2.5: + version "7.5.3" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.3.tgz#13f95a9e3c84669995ec3652db2ac2fb00b89363" + integrity sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -4326,6 +4163,11 @@ regexp.prototype.flags@^1.5.2: es-errors "^1.3.0" set-function-name "^2.0.1" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4572,9 +4414,9 @@ simple-swizzle@^0.2.2: is-arrayish "^0.3.1" simple-wcswidth@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" - integrity sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz#66722f37629d5203f9b47c5477b1225b85d6525b" + integrity sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw== slash@^3.0.0: version "3.0.0" @@ -4648,7 +4490,7 @@ streamx@^2.15.0, streamx@^2.21.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^4.1.0: +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4950,6 +4792,11 @@ ts-api-utils@^1.0.1: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== +ts-error@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/ts-error/-/ts-error-1.0.6.tgz#277496f2a28de6c184cfce8dfd5cdd03a4e6b0fc" + integrity sha512-tLJxacIQUM82IR7JO1UUkKlYuUTmoY9HBJAmNWFzheSlDS5SPMcNIepejHJa4BpPQLAcbRhRf3GDJzyj6rbKvA== + ts-interface-checker@^0.1.9: version "0.1.13" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" @@ -5112,7 +4959,12 @@ uuid@^10.0.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-10.0.0.tgz#5a95aa454e6e002725c79055fd42aaba30ca6294" integrity sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ== -uuid@^9.0.0: +uuid@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.0.tgz#9549028be1753bb934fc96e2bca09bb4105ae912" + integrity sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== + +uuid@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== @@ -5127,21 +4979,30 @@ validate.io-function@^1.0.2: resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" integrity sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ== -web-streams-polyfill@4.0.0-beta.3: - version "4.0.0-beta.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz#2898486b74f5156095e473efe989dcf185047a38" - integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== - -web-streams-polyfill@^3.2.1: - version "3.3.3" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" - integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== +weaviate-client@^3.5.2: + version "3.7.0" + resolved "https://registry.yarnpkg.com/weaviate-client/-/weaviate-client-3.7.0.tgz#cf11ccbc90ee1849869d6bebb79ec4a33056b722" + integrity sha512-q888bkHWJBdPgPHFoIc2GiFig42WbxHOgiSBVYYQUqJGA9VszaOpU/7Ip1fVATyyVjhjzRDvMebmRltirvpfMg== + dependencies: + abort-controller-x "^0.4.3" + graphql "^16.11.0" + graphql-request "^6.1.0" + long "^5.3.2" + nice-grpc "^2.1.12" + nice-grpc-client-middleware-retry "^3.1.11" + nice-grpc-common "^2.0.2" + uuid "^9.0.1" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +whatwg-fetch@^3.6.20: + version "3.6.20" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" + integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== + whatwg-url@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" @@ -5249,6 +5110,15 @@ winston@^3.17.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -5268,16 +5138,44 @@ xmlbuilder@^10.0.0: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-10.1.1.tgz#8cae6688cc9b38d850b7c8d3c0a4161dcaf475b0" integrity sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg== +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^2.2.1, yaml@^2.3.4: +yaml@^2.2.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== + +yaml@^2.3.4: version "2.4.1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yet-another-react-lightbox@^3.17.2: version "3.17.2" resolved "https://registry.yarnpkg.com/yet-another-react-lightbox/-/yet-another-react-lightbox-3.17.2.tgz#00474b83189ec4d81302792211ca31ffb808554c" @@ -5288,17 +5186,17 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zod-to-json-schema@^3.22.3, zod-to-json-schema@^3.22.5: - version "3.22.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.22.5.tgz#3646e81cfc318dbad2a22519e5ce661615418673" - integrity sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q== +zod-to-json-schema@^3.22.3: + version "3.24.6" + resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz#5920f020c4d2647edfbb954fa036082b92c9e12d" + integrity sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg== -zod-to-json-schema@^3.22.4: - version "3.24.5" - resolved "https://registry.yarnpkg.com/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz#d1095440b147fb7c2093812a53c54df8d5df50a3" - integrity sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g== - -zod@^3.22.3, zod@^3.22.4: +zod@^3.22.4: version "3.22.4" resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff" integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== + +zod@^3.25.32: + version "3.25.76" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34" + integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ== From 8e0ae9b8672ac2c417f4dcd978e73e601aad2fd7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:09:21 +0530 Subject: [PATCH 125/147] feat(providers): switch to `apiKey` key --- src/lib/providers/deepseek.ts | 2 +- src/lib/providers/groq.ts | 5 ++++- src/lib/providers/lmstudio.ts | 4 ++-- src/lib/providers/openai.ts | 4 ++-- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lib/providers/deepseek.ts b/src/lib/providers/deepseek.ts index 46f2398..9c9ef5a 100644 --- a/src/lib/providers/deepseek.ts +++ b/src/lib/providers/deepseek.ts @@ -31,7 +31,7 @@ export const loadDeepseekChatModels = async () => { chatModels[model.key] = { displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey: deepseekApiKey, + apiKey: deepseekApiKey, modelName: model.key, temperature: 0.7, configuration: { diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 5435de4..6a196ee 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -29,12 +29,15 @@ export const loadGroqChatModels = async () => { chatModels[model.id] = { displayName: model.id, model: new ChatOpenAI({ - openAIApiKey: groqApiKey, + apiKey: groqApiKey, modelName: model.id, temperature: 0.7, configuration: { baseURL: 'https://api.groq.com/openai/v1', }, + metadata: { + 'model-type': 'groq', + }, }) as unknown as BaseChatModel, }; }); diff --git a/src/lib/providers/lmstudio.ts b/src/lib/providers/lmstudio.ts index 811208f..f79c0aa 100644 --- a/src/lib/providers/lmstudio.ts +++ b/src/lib/providers/lmstudio.ts @@ -47,7 +47,7 @@ export const loadLMStudioChatModels = async () => { chatModels[model.id] = { displayName: model.name || model.id, model: new ChatOpenAI({ - openAIApiKey: 'lm-studio', + apiKey: 'lm-studio', configuration: { baseURL: ensureV1Endpoint(endpoint), }, @@ -83,7 +83,7 @@ export const loadLMStudioEmbeddingsModels = async () => { embeddingsModels[model.id] = { displayName: model.name || model.id, model: new OpenAIEmbeddings({ - openAIApiKey: 'lm-studio', + apiKey: 'lm-studio', configuration: { baseURL: ensureV1Endpoint(endpoint), }, diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index e68e574..c857b0e 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -67,7 +67,7 @@ export const loadOpenAIChatModels = async () => { chatModels[model.key] = { displayName: model.displayName, model: new ChatOpenAI({ - openAIApiKey: openaiApiKey, + apiKey: openaiApiKey, modelName: model.key, temperature: 0.7, }) as unknown as BaseChatModel, @@ -93,7 +93,7 @@ export const loadOpenAIEmbeddingModels = async () => { embeddingModels[model.key] = { displayName: model.displayName, model: new OpenAIEmbeddings({ - openAIApiKey: openaiApiKey, + apiKey: openaiApiKey, modelName: model.key, }) as unknown as Embeddings, }; From 77870b39cc361a6c819ab17b788d592c22c68164 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:09:46 +0530 Subject: [PATCH 126/147] feat(ollama): use `@langchain/ollama` library --- src/lib/providers/ollama.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index cca2142..d5c7899 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -6,8 +6,8 @@ export const PROVIDER_INFO = { key: 'ollama', displayName: 'Ollama', }; -import { ChatOllama } from '@langchain/community/chat_models/ollama'; -import { OllamaEmbeddings } from '@langchain/community/embeddings/ollama'; +import { ChatOllama } from '@langchain/ollama'; +import { OllamaEmbeddings } from '@langchain/ollama'; export const loadOllamaChatModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); From 829b4e71347b28a2ac1daa6e6373eff305418eb0 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 19 Jul 2025 16:14:46 +0530 Subject: [PATCH 127/147] feat(custom-openai): use `apiKey` instead of `openAIApiKey` --- src/app/api/chat/route.ts | 2 +- src/app/api/images/route.ts | 2 +- src/app/api/search/route.ts | 2 +- src/app/api/suggestions/route.ts | 2 +- src/app/api/videos/route.ts | 2 +- src/lib/providers/aimlapi.ts | 4 ++-- src/lib/providers/index.ts | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index e566edb..2d53b75 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -223,7 +223,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/images/route.ts b/src/app/api/images/route.ts index db39d9f..e02854d 100644 --- a/src/app/api/images/route.ts +++ b/src/app/api/images/route.ts @@ -49,7 +49,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 970ec42..16325de 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -81,7 +81,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ modelName: body.chatModel?.name || getCustomOpenaiModelName(), - openAIApiKey: + apiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { diff --git a/src/app/api/suggestions/route.ts b/src/app/api/suggestions/route.ts index e92e5ec..99179d2 100644 --- a/src/app/api/suggestions/route.ts +++ b/src/app/api/suggestions/route.ts @@ -48,7 +48,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/app/api/videos/route.ts b/src/app/api/videos/route.ts index 34ae7fd..7e8288b 100644 --- a/src/app/api/videos/route.ts +++ b/src/app/api/videos/route.ts @@ -49,7 +49,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ - openAIApiKey: getCustomOpenaiApiKey(), + apiKey: getCustomOpenaiApiKey(), modelName: getCustomOpenaiModelName(), temperature: 0.7, configuration: { diff --git a/src/lib/providers/aimlapi.ts b/src/lib/providers/aimlapi.ts index e934362..9c982fe 100644 --- a/src/lib/providers/aimlapi.ts +++ b/src/lib/providers/aimlapi.ts @@ -38,7 +38,7 @@ export const loadAimlApiChatModels = async () => { chatModels[model.id] = { displayName: model.name || model.id, model: new ChatOpenAI({ - openAIApiKey: apiKey, + apiKey: apiKey, modelName: model.id, temperature: 0.7, configuration: { @@ -76,7 +76,7 @@ export const loadAimlApiEmbeddingModels = async () => { embeddingModels[model.id] = { displayName: model.name || model.id, model: new OpenAIEmbeddings({ - openAIApiKey: apiKey, + apiKey: apiKey, modelName: model.id, configuration: { baseURL: API_URL, diff --git a/src/lib/providers/index.ts b/src/lib/providers/index.ts index 4b8a090..1b6bb2f 100644 --- a/src/lib/providers/index.ts +++ b/src/lib/providers/index.ts @@ -118,7 +118,7 @@ export const getAvailableChatModelProviders = async () => { [customOpenAiModelName]: { displayName: customOpenAiModelName, model: new ChatOpenAI({ - openAIApiKey: customOpenAiApiKey, + apiKey: customOpenAiApiKey, modelName: customOpenAiModelName, temperature: 0.7, configuration: { From 58c7be6e9589e3b1a849a59411312c5a1a797173 Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 20 Jul 2025 09:17:20 -0700 Subject: [PATCH 128/147] Update Gemini 2.5 Models --- src/lib/providers/gemini.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b84e899..1d210e7 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -14,16 +14,12 @@ import { Embeddings } from '@langchain/core/embeddings'; const geminiChatModels: Record<string, string>[] = [ { - displayName: 'Gemini 2.5 Flash Preview 05-20', - key: 'gemini-2.5-flash-preview-05-20', + displayName: 'Gemini 2.5 Flash', + key: 'gemini-2.5-flash', }, { - displayName: 'Gemini 2.5 Pro Preview', - key: 'gemini-2.5-pro-preview-05-06', - }, - { - displayName: 'Gemini 2.5 Pro Experimental', - key: 'gemini-2.5-pro-preview-05-06', + displayName: 'Gemini 2.5 Pro', + key: 'gemini-2.5-pro', }, { displayName: 'Gemini 2.0 Flash', From 3f2a8f862cbc64adc739c08d9f5cf98a8886999b Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 20 Jul 2025 09:20:39 -0700 Subject: [PATCH 129/147] Fix name of provider in embeddings models error message --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index b84e899..f64b271 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -108,7 +108,7 @@ export const loadGeminiEmbeddingModels = async () => { return embeddingModels; } catch (err) { - console.error(`Error loading OpenAI embeddings models: ${err}`); + console.error(`Error loading Gemini embeddings models: ${err}`); return {}; } }; From 37022fb11efacb2348a92c17e46e42cedb20cbcc Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:20:16 +0530 Subject: [PATCH 130/147] feat(format-history): update role determination --- src/lib/utils/formatHistory.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/lib/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts index 6d0d309..6fdede6 100644 --- a/src/lib/utils/formatHistory.ts +++ b/src/lib/utils/formatHistory.ts @@ -1,8 +1,11 @@ -import { BaseMessage } from '@langchain/core/messages'; +import { BaseMessage, isAIMessage } from '@langchain/core/messages'; const formatChatHistoryAsString = (history: BaseMessage[]) => { return history - .map((message) => `${message._getType()}: ${message.content}`) + .map( + (message) => + `${isAIMessage(message) ? 'AI' : 'User:'}: ${message.content}`, + ) .join('\n'); }; From 11a828b0734dc7fb24a04f73a6657d152eec164a Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:21:09 +0530 Subject: [PATCH 131/147] feat(message-box): close think box after thinking process ends --- src/components/MessageBox.tsx | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index a7c46ec..dc43aa2 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -21,8 +21,16 @@ import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; import ThinkBox from './ThinkBox'; -const ThinkTagProcessor = ({ children }: { children: React.ReactNode }) => { - return <ThinkBox content={children as string} />; +const ThinkTagProcessor = ({ + children, + thinkingEnded, +}: { + children: React.ReactNode; + thinkingEnded: boolean; +}) => { + return ( + <ThinkBox content={children as string} thinkingEnded={thinkingEnded} /> + ); }; const MessageBox = ({ @@ -46,6 +54,7 @@ const MessageBox = ({ }) => { const [parsedMessage, setParsedMessage] = useState(message.content); const [speechMessage, setSpeechMessage] = useState(message.content); + const [thinkingEnded, setThinkingEnded] = useState(false); useEffect(() => { const citationRegex = /\[([^\]]+)\]/g; @@ -61,6 +70,10 @@ const MessageBox = ({ } } + if (message.role === 'assistant' && message.content.includes('</think>')) { + setThinkingEnded(true); + } + if ( message.role === 'assistant' && message?.sources && @@ -88,7 +101,7 @@ const MessageBox = ({ if (url) { return `<a href="${url}" target="_blank" className="bg-light-secondary dark:bg-dark-secondary px-1 rounded ml-1 no-underline text-xs text-black/70 dark:text-white/70 relative">${numStr}</a>`; } else { - return `[${numStr}]`; + return ``; } }) .join(''); @@ -99,6 +112,14 @@ const MessageBox = ({ ); setSpeechMessage(message.content.replace(regex, '')); return; + } else if ( + message.role === 'assistant' && + message?.sources && + message.sources.length === 0 + ) { + setParsedMessage(processedMessage.replace(regex, '')); + setSpeechMessage(message.content.replace(regex, '')); + return; } setSpeechMessage(message.content.replace(regex, '')); @@ -111,6 +132,9 @@ const MessageBox = ({ overrides: { think: { component: ThinkTagProcessor, + props: { + thinkingEnded: thinkingEnded, + }, }, }, }; From 6ea17d54c62389afc0fa29cf422255480c44268c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 22 Jul 2025 21:21:49 +0530 Subject: [PATCH 132/147] feat(chat-window): fix wrong history while rewriting --- src/components/ChatWindow.tsx | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 67a5d0c..6ff7d22 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -354,7 +354,11 @@ const ChatWindow = ({ id }: { id?: string }) => { } }, [isMessagesLoaded, isConfigReady]); - const sendMessage = async (message: string, messageId?: string) => { + const sendMessage = async ( + message: string, + messageId?: string, + rewrite = false, + ) => { if (loading) return; if (!isConfigReady) { toast.error('Cannot send message before the configuration is ready'); @@ -482,6 +486,8 @@ const ChatWindow = ({ id }: { id?: string }) => { } }; + const messageIndex = messages.findIndex((m) => m.messageId === messageId); + const res = await fetch('/api/chat', { method: 'POST', headers: { @@ -498,7 +504,9 @@ const ChatWindow = ({ id }: { id?: string }) => { files: fileIds, focusMode: focusMode, optimizationMode: optimizationMode, - history: chatHistory, + history: rewrite + ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) + : chatHistory, chatModel: { name: chatModelProvider.name, provider: chatModelProvider.provider, @@ -552,7 +560,7 @@ const ChatWindow = ({ id }: { id?: string }) => { return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; }); - sendMessage(message.content, message.messageId); + sendMessage(message.content, message.messageId, true); }; useEffect(() => { From 9d89a4413bd34f15f9dc22dec164fbf9d83c7c43 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:20:49 +0530 Subject: [PATCH 133/147] feat(format-history): remove extra `:` --- src/app/api/search/route.ts | 3 +-- src/lib/utils/formatHistory.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/app/api/search/route.ts b/src/app/api/search/route.ts index 16325de..5f752ec 100644 --- a/src/app/api/search/route.ts +++ b/src/app/api/search/route.ts @@ -81,8 +81,7 @@ export const POST = async (req: Request) => { if (body.chatModel?.provider === 'custom_openai') { llm = new ChatOpenAI({ modelName: body.chatModel?.name || getCustomOpenaiModelName(), - apiKey: - body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), + apiKey: body.chatModel?.customOpenAIKey || getCustomOpenaiApiKey(), temperature: 0.7, configuration: { baseURL: diff --git a/src/lib/utils/formatHistory.ts b/src/lib/utils/formatHistory.ts index 6fdede6..733ffc0 100644 --- a/src/lib/utils/formatHistory.ts +++ b/src/lib/utils/formatHistory.ts @@ -4,7 +4,7 @@ const formatChatHistoryAsString = (history: BaseMessage[]) => { return history .map( (message) => - `${isAIMessage(message) ? 'AI' : 'User:'}: ${message.content}`, + `${isAIMessage(message) ? 'AI' : 'User'}: ${message.content}`, ) .join('\n'); }; From 70a61ee1eb097a2b65d63d12b6a325fe8582f734 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:21:07 +0530 Subject: [PATCH 134/147] feat(think-box): handle thinkingEnded --- src/components/ThinkBox.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/components/ThinkBox.tsx b/src/components/ThinkBox.tsx index 9c6a576..f830945 100644 --- a/src/components/ThinkBox.tsx +++ b/src/components/ThinkBox.tsx @@ -1,15 +1,23 @@ 'use client'; -import { useState } from 'react'; -import { cn } from '@/lib/utils'; +import { useEffect, useState } from 'react'; import { ChevronDown, ChevronUp, BrainCircuit } from 'lucide-react'; interface ThinkBoxProps { content: string; + thinkingEnded: boolean; } -const ThinkBox = ({ content }: ThinkBoxProps) => { - const [isExpanded, setIsExpanded] = useState(false); +const ThinkBox = ({ content, thinkingEnded }: ThinkBoxProps) => { + const [isExpanded, setIsExpanded] = useState(true); + + useEffect(() => { + if (thinkingEnded) { + setIsExpanded(false); + } else { + setIsExpanded(true); + } + }, [thinkingEnded]); return ( <div className="my-4 bg-light-secondary/50 dark:bg-dark-secondary/50 rounded-xl border border-light-200 dark:border-dark-200 overflow-hidden"> From 81a91da743f026361c96f5eaa09f94f839e2ecf2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:22:26 +0530 Subject: [PATCH 135/147] feat(gemini): use `model` instead of `modelName` --- src/lib/providers/gemini.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index f64b271..1538412 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -75,7 +75,7 @@ export const loadGeminiChatModels = async () => { displayName: model.displayName, model: new ChatGoogleGenerativeAI({ apiKey: geminiApiKey, - modelName: model.key, + model: model.key, temperature: 0.7, }) as unknown as BaseChatModel, }; From 3bee01cfa7ad65d957feb762f558975a53a747f4 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Mon, 28 Jul 2025 20:39:50 +0530 Subject: [PATCH 136/147] feat(discover): add topic selection --- src/app/discover/page.tsx | 198 +++++++++++++++++++++++--------------- 1 file changed, 122 insertions(+), 76 deletions(-) diff --git a/src/app/discover/page.tsx b/src/app/discover/page.tsx index eb7de7f..c7dce37 100644 --- a/src/app/discover/page.tsx +++ b/src/app/discover/page.tsx @@ -4,6 +4,7 @@ import { Search } from 'lucide-react'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { toast } from 'sonner'; +import { cn } from '@/lib/utils'; interface Discover { title: string; @@ -12,60 +13,67 @@ interface Discover { thumbnail: string; } +const topics: { key: string; display: string }[] = [ + { + display: 'Tech & Science', + key: 'tech', + }, + { + display: 'Finance', + key: 'finance', + }, + { + display: 'Art & Culture', + key: 'art', + }, + { + display: 'Sports', + key: 'sports', + }, + { + display: 'Entertainment', + key: 'entertainment', + }, +]; + const Page = () => { const [discover, setDiscover] = useState<Discover[] | null>(null); const [loading, setLoading] = useState(true); + const [activeTopic, setActiveTopic] = useState<string>(topics[0].key); + + const fetchArticles = async (topic: string) => { + setLoading(true); + console.log(topic); + try { + const res = await fetch(`/api/discover?topic=${topic}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + const data = await res.json(); + + if (!res.ok) { + throw new Error(data.message); + } + + data.blogs = data.blogs.filter((blog: Discover) => blog.thumbnail); + + setDiscover(data.blogs); + } catch (err: any) { + console.error('Error fetching data:', err.message); + toast.error('Error fetching data'); + } finally { + setLoading(false); + } + }; useEffect(() => { - const fetchData = async () => { - try { - const res = await fetch(`/api/discover`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); + fetchArticles(activeTopic); + }, [activeTopic]); - const data = await res.json(); - - if (!res.ok) { - throw new Error(data.message); - } - - data.blogs = data.blogs.filter((blog: Discover) => blog.thumbnail); - - setDiscover(data.blogs); - } catch (err: any) { - console.error('Error fetching data:', err.message); - toast.error('Error fetching data'); - } finally { - setLoading(false); - } - }; - - fetchData(); - }, []); - - return loading ? ( - <div className="flex flex-row items-center justify-center min-h-screen"> - <svg - aria-hidden="true" - className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" - viewBox="0 0 100 101" - fill="none" - xmlns="http://www.w3.org/2000/svg" - > - <path - d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" - fill="currentColor" - /> - <path - d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" - fill="currentFill" - /> - </svg> - </div> - ) : ( + return ( <> <div> <div className="flex flex-col pt-4"> @@ -76,35 +84,73 @@ const Page = () => { <hr className="border-t border-[#2B2C2C] my-4 w-full" /> </div> - <div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 lg:pb-8 w-full justify-items-center lg:justify-items-start"> - {discover && - discover?.map((item, i) => ( - <Link - href={`/?q=Summary: ${item.url}`} - key={i} - className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" - target="_blank" - > - <img - className="object-cover w-full aspect-video" - src={ - new URL(item.thumbnail).origin + - new URL(item.thumbnail).pathname + - `?id=${new URL(item.thumbnail).searchParams.get('id')}` - } - alt={item.title} - /> - <div className="px-6 py-4"> - <div className="font-bold text-lg mb-2"> - {item.title.slice(0, 100)}... - </div> - <p className="text-black-70 dark:text-white/70 text-sm"> - {item.content.slice(0, 100)}... - </p> - </div> - </Link> - ))} + <div className="flex flex-row items-center space-x-2 overflow-x-auto"> + {topics.map((t, i) => ( + <div + key={i} + className={cn( + 'border-[0.1px] rounded-full text-sm px-3 py-1 text-nowrap transition duration-200 cursor-pointer', + activeTopic === t.key + ? 'text-cyan-300 bg-cyan-300/30 border-cyan-300/60' + : 'border-white/30 text-white/70 hover:text-white hover:border-white/40 hover:bg-white/5', + )} + onClick={() => setActiveTopic(t.key)} + > + <span>{t.display}</span> + </div> + ))} </div> + + {loading ? ( + <div className="flex flex-row items-center justify-center min-h-screen"> + <svg + aria-hidden="true" + className="w-8 h-8 text-light-200 fill-light-secondary dark:text-[#202020] animate-spin dark:fill-[#ffffff3b]" + viewBox="0 0 100 101" + fill="none" + xmlns="http://www.w3.org/2000/svg" + > + <path + d="M100 50.5908C100.003 78.2051 78.1951 100.003 50.5908 100C22.9765 99.9972 0.997224 78.018 1 50.4037C1.00281 22.7993 22.8108 0.997224 50.4251 1C78.0395 1.00281 100.018 22.8108 100 50.4251ZM9.08164 50.594C9.06312 73.3997 27.7909 92.1272 50.5966 92.1457C73.4023 92.1642 92.1298 73.4365 92.1483 50.6308C92.1669 27.8251 73.4392 9.0973 50.6335 9.07878C27.8278 9.06026 9.10003 27.787 9.08164 50.594Z" + fill="currentColor" + /> + <path + d="M93.9676 39.0409C96.393 38.4037 97.8624 35.9116 96.9801 33.5533C95.1945 28.8227 92.871 24.3692 90.0681 20.348C85.6237 14.1775 79.4473 9.36872 72.0454 6.45794C64.6435 3.54717 56.3134 2.65431 48.3133 3.89319C45.869 4.27179 44.3768 6.77534 45.014 9.20079C45.6512 11.6262 48.1343 13.0956 50.5786 12.717C56.5073 11.8281 62.5542 12.5399 68.0406 14.7911C73.527 17.0422 78.2187 20.7487 81.5841 25.4923C83.7976 28.5886 85.4467 32.059 86.4416 35.7474C87.1273 38.1189 89.5423 39.6781 91.9676 39.0409Z" + fill="currentFill" + /> + </svg> + </div> + ) : ( + <div className="grid lg:grid-cols-3 sm:grid-cols-2 grid-cols-1 gap-4 pb-28 pt-5 lg:pb-8 w-full justify-items-center lg:justify-items-start"> + {discover && + discover?.map((item, i) => ( + <Link + href={`/?q=Summary: ${item.url}`} + key={i} + className="max-w-sm rounded-lg overflow-hidden bg-light-secondary dark:bg-dark-secondary hover:-translate-y-[1px] transition duration-200" + target="_blank" + > + <img + className="object-cover w-full aspect-video" + src={ + new URL(item.thumbnail).origin + + new URL(item.thumbnail).pathname + + `?id=${new URL(item.thumbnail).searchParams.get('id')}` + } + alt={item.title} + /> + <div className="px-6 py-4"> + <div className="font-bold text-lg mb-2"> + {item.title.slice(0, 100)}... + </div> + <p className="text-black-70 dark:text-white/70 text-sm"> + {item.content.slice(0, 100)}... + </p> + </div> + </Link> + ))} + </div> + )} </div> </> ); From 45b51ab1561b869c6641beac56d09952a890c6a8 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:17:07 +0530 Subject: [PATCH 137/147] feat(discover-api): handle topics --- src/app/api/discover/route.ts | 48 ++++++++++++++++++++++------------- src/app/discover/page.tsx | 1 - 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index d0e56a6..4f141eb 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -1,37 +1,52 @@ import { searchSearxng } from '@/lib/searxng'; -const articleWebsites = [ - 'yahoo.com', - 'www.exchangewire.com', - 'businessinsider.com', - /* 'wired.com', - 'mashable.com', - 'theverge.com', - 'gizmodo.com', - 'cnet.com', - 'venturebeat.com', */ -]; +const websitesForTopic = { + tech: { + query: ['technology news', 'latest tech', 'AI', 'science and innovation'], + links: ['techcrunch.com', 'wired.com', 'theverge.com'], + }, + finance: { + query: ['finance news', 'economy', 'stock market', 'investing'], + links: ['bloomberg.com', 'cnbc.com', 'marketwatch.com'], + }, + art: { + query: ['art news', 'culture', 'modern art', 'cultural events'], + links: ['artnews.com', 'hyperallergic.com', 'theartnewspaper.com'], + }, + sports: { + query: ['sports news', 'latest sports', 'cricket football tennis'], + links: ['espn.com', 'bbc.com/sport', 'skysports.com'], + }, + entertainment: { + query: ['entertainment news', 'movies', 'TV shows', 'celebrities'], + links: ['hollywoodreporter.com', 'variety.com', 'deadline.com'], + }, +}; -const topics = ['AI', 'tech']; /* TODO: Add UI to customize this */ +type Topic = keyof typeof websitesForTopic; export const GET = async (req: Request) => { try { const params = new URL(req.url).searchParams; + const mode: 'normal' | 'preview' = (params.get('mode') as 'normal' | 'preview') || 'normal'; + const topic: Topic = (params.get('topic') as Topic) || 'tech'; + + const selectedTopic = websitesForTopic[topic]; let data = []; if (mode === 'normal') { data = ( await Promise.all([ - ...new Array(articleWebsites.length * topics.length) + ...new Array(selectedTopic.links.length * selectedTopic.query.length) .fill(0) .map(async (_, i) => { return ( await searchSearxng( - `site:${articleWebsites[i % articleWebsites.length]} ${ - topics[i % topics.length] + `site:${selectedTopic.links[i % selectedTopic.links.length]} ${ + selectedTopic.query[i % selectedTopic.query.length] }`, { engines: ['bing news'], @@ -45,11 +60,10 @@ export const GET = async (req: Request) => { ) .map((result) => result) .flat() - .sort(() => Math.random() - 0.5); } else { data = ( await searchSearxng( - `site:${articleWebsites[Math.floor(Math.random() * articleWebsites.length)]} ${topics[Math.floor(Math.random() * topics.length)]}`, + `site:${selectedTopic.links[Math.floor(Math.random() * selectedTopic.links.length)]} ${selectedTopic.query[Math.floor(Math.random() * selectedTopic.query.length)]}`, { engines: ['bing news'], pageno: 1, diff --git a/src/app/discover/page.tsx b/src/app/discover/page.tsx index c7dce37..8e20e50 100644 --- a/src/app/discover/page.tsx +++ b/src/app/discover/page.tsx @@ -43,7 +43,6 @@ const Page = () => { const fetchArticles = async (topic: string) => { setLoading(true); - console.log(topic); try { const res = await fetch(`/api/discover?topic=${topic}`, { method: 'GET', From 88be3a045bac4f0336f50050840213ce4cc7d421 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 29 Jul 2025 13:18:36 +0530 Subject: [PATCH 138/147] feat(discover): randomly sort results --- src/app/api/discover/route.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index 4f141eb..c02d95c 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -60,6 +60,7 @@ export const GET = async (req: Request) => { ) .map((result) => result) .flat() + .sort(() => Math.random() - 0.5); } else { data = ( await searchSearxng( From 37cd6d3ab57cbe7c4fbb62750fd764cda953d9c7 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Fri, 1 Aug 2025 20:41:07 +0530 Subject: [PATCH 139/147] feat(discover): prevent duplicate articles --- src/app/api/discover/route.ts | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/app/api/discover/route.ts b/src/app/api/discover/route.ts index c02d95c..415aee8 100644 --- a/src/app/api/discover/route.ts +++ b/src/app/api/discover/route.ts @@ -38,28 +38,30 @@ export const GET = async (req: Request) => { let data = []; if (mode === 'normal') { + const seenUrls = new Set(); + data = ( - await Promise.all([ - ...new Array(selectedTopic.links.length * selectedTopic.query.length) - .fill(0) - .map(async (_, i) => { + await Promise.all( + selectedTopic.links.flatMap((link) => + selectedTopic.query.map(async (query) => { return ( - await searchSearxng( - `site:${selectedTopic.links[i % selectedTopic.links.length]} ${ - selectedTopic.query[i % selectedTopic.query.length] - }`, - { - engines: ['bing news'], - pageno: 1, - language: 'en', - }, - ) + await searchSearxng(`site:${link} ${query}`, { + engines: ['bing news'], + pageno: 1, + language: 'en', + }) ).results; }), - ]) + ), + ) ) - .map((result) => result) .flat() + .filter((item) => { + const url = item.url?.toLowerCase().trim(); + if (seenUrls.has(url)) return false; + seenUrls.add(url); + return true; + }) .sort(() => Math.random() - 0.5); } else { data = ( From eadbedb713d1bd26773ea357b4d5cd42563fde8c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Sat, 2 Aug 2025 17:14:34 +0530 Subject: [PATCH 140/147] feat(groq): switch to `@langchain/groq` for better handling --- package.json | 1 + src/lib/providers/groq.ts | 12 +++--------- yarn.lock | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 9e9137f..5715c2a 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@langchain/community": "^0.3.49", "@langchain/core": "^0.3.66", "@langchain/google-genai": "^0.2.15", + "@langchain/groq": "^0.2.3", "@langchain/ollama": "^0.2.3", "@langchain/openai": "^0.6.2", "@langchain/textsplitters": "^0.1.0", diff --git a/src/lib/providers/groq.ts b/src/lib/providers/groq.ts index 6a196ee..4e7db51 100644 --- a/src/lib/providers/groq.ts +++ b/src/lib/providers/groq.ts @@ -1,4 +1,4 @@ -import { ChatOpenAI } from '@langchain/openai'; +import { ChatGroq } from '@langchain/groq'; import { getGroqApiKey } from '../config'; import { ChatModel } from '.'; @@ -28,16 +28,10 @@ export const loadGroqChatModels = async () => { groqChatModels.forEach((model: any) => { chatModels[model.id] = { displayName: model.id, - model: new ChatOpenAI({ + model: new ChatGroq({ apiKey: groqApiKey, - modelName: model.id, + model: model.id, temperature: 0.7, - configuration: { - baseURL: 'https://api.groq.com/openai/v1', - }, - metadata: { - 'model-type': 'groq', - }, }) as unknown as BaseChatModel, }; }); diff --git a/yarn.lock b/yarn.lock index b8893e7..8a6859a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -653,6 +653,14 @@ "@google/generative-ai" "^0.24.0" uuid "^11.1.0" +"@langchain/groq@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@langchain/groq/-/groq-0.2.3.tgz#3bfcbfc827cf469df3a1b5bb9799f4b0212b4625" + integrity sha512-r+yjysG36a0IZxTlCMr655Feumfb4IrOyA0jLLq4l7gEhVyMpYXMwyE6evseyU2LRP+7qOPbGRVpGqAIK0MsUA== + dependencies: + groq-sdk "^0.19.0" + zod "^3.22.4" + "@langchain/ollama@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@langchain/ollama/-/ollama-0.2.3.tgz#4868e66db4fc480f08c42fc652274abbab0416f0" @@ -2732,6 +2740,19 @@ graphql@^16.11.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.11.0.tgz#96d17f66370678027fdf59b2d4c20b4efaa8a633" integrity sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw== +groq-sdk@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/groq-sdk/-/groq-sdk-0.19.0.tgz#564ce018172dc3e2e2793398e0227a035a357d09" + integrity sha512-vdh5h7ORvwvOvutA80dKF81b0gPWHxu6K/GOJBOM0n6p6CSqAVLhFfeS79Ef0j/yCycDR09jqY7jkYz9dLiS6w== + dependencies: + "@types/node" "^18.11.18" + "@types/node-fetch" "^2.6.4" + abort-controller "^3.0.0" + agentkeepalive "^4.2.1" + form-data-encoder "1.7.2" + formdata-node "^4.3.2" + node-fetch "^2.6.7" + guid-typescript@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/guid-typescript/-/guid-typescript-1.0.9.tgz#e35f77003535b0297ea08548f5ace6adb1480ddc" From 113299710874842d9ce69a8835b1868593d105d8 Mon Sep 17 00:00:00 2001 From: Samuel Dockery <samueldockery@gmail.com> Date: Sun, 10 Aug 2025 07:50:31 -0700 Subject: [PATCH 141/147] feat: Add support for latest AI models from Anthropic, Google, & OpenAI --- src/lib/providers/anthropic.ts | 12 ++++++++++++ src/lib/providers/gemini.ts | 4 ++++ src/lib/providers/openai.ts | 14 +++++++++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/providers/anthropic.ts b/src/lib/providers/anthropic.ts index 2b0f2cc..6af2115 100644 --- a/src/lib/providers/anthropic.ts +++ b/src/lib/providers/anthropic.ts @@ -9,6 +9,18 @@ export const PROVIDER_INFO = { import { BaseChatModel } from '@langchain/core/language_models/chat_models'; const anthropicChatModels: Record<string, string>[] = [ + { + displayName: 'Claude 4.1 Opus', + key: 'claude-opus-4-1-20250805', + }, + { + displayName: 'Claude 4 Opus', + key: 'claude-opus-4-20250514', + }, + { + displayName: 'Claude 4 Sonnet', + key: 'claude-sonnet-4-20250514', + }, { displayName: 'Claude 3.7 Sonnet', key: 'claude-3-7-sonnet-20250219', diff --git a/src/lib/providers/gemini.ts b/src/lib/providers/gemini.ts index a9ef4d5..418e0a4 100644 --- a/src/lib/providers/gemini.ts +++ b/src/lib/providers/gemini.ts @@ -17,6 +17,10 @@ const geminiChatModels: Record<string, string>[] = [ displayName: 'Gemini 2.5 Flash', key: 'gemini-2.5-flash', }, + { + displayName: 'Gemini 2.5 Flash-Lite', + key: 'gemini-2.5-flash-lite', + }, { displayName: 'Gemini 2.5 Pro', key: 'gemini-2.5-pro', diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index c857b0e..a672e53 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -42,6 +42,18 @@ const openaiChatModels: Record<string, string>[] = [ displayName: 'GPT 4.1', key: 'gpt-4.1', }, + { + displayName: 'GPT 5 nano', + key: 'gpt-5-nano', + }, + { + displayName: 'GPT 5 mini', + key: 'gpt-5-mini', + }, + { + displayName: 'GPT 5', + key: 'gpt-5', + }, ]; const openaiEmbeddingModels: Record<string, string>[] = [ @@ -69,7 +81,7 @@ export const loadOpenAIChatModels = async () => { model: new ChatOpenAI({ apiKey: openaiApiKey, modelName: model.key, - temperature: 0.7, + temperature: 1, }) as unknown as BaseChatModel, }; }); From 3edd7d44dd5acfe7dbc416db8eb588b71cedb597 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Tue, 12 Aug 2025 21:39:14 +0530 Subject: [PATCH 142/147] feat(openai): conditionally set temperature --- src/lib/providers/openai.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/providers/openai.ts b/src/lib/providers/openai.ts index a672e53..7e26763 100644 --- a/src/lib/providers/openai.ts +++ b/src/lib/providers/openai.ts @@ -81,7 +81,7 @@ export const loadOpenAIChatModels = async () => { model: new ChatOpenAI({ apiKey: openaiApiKey, modelName: model.key, - temperature: 1, + temperature: model.key.includes('gpt-5') ? 1 : 0.7, }) as unknown as BaseChatModel, }; }); From 8fc78086547e414358dbbeb1d4f9d286fa2d0618 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:20:50 +0530 Subject: [PATCH 143/147] feat(hooks): implement useChat hook --- src/lib/hooks/useChat.tsx | 643 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 643 insertions(+) create mode 100644 src/lib/hooks/useChat.tsx diff --git a/src/lib/hooks/useChat.tsx b/src/lib/hooks/useChat.tsx new file mode 100644 index 0000000..573ac6b --- /dev/null +++ b/src/lib/hooks/useChat.tsx @@ -0,0 +1,643 @@ +'use client'; + +import { Message } from '@/components/ChatWindow'; +import { createContext, useContext, useEffect, useRef, useState } from 'react'; +import crypto from 'crypto'; +import { useSearchParams } from 'next/navigation'; +import { toast } from 'sonner'; +import { Document } from '@langchain/core/documents'; +import { getSuggestions } from '../actions'; + +type ChatContext = { + messages: Message[]; + chatHistory: [string, string][]; + files: File[]; + fileIds: string[]; + focusMode: string; + chatId: string | undefined; + optimizationMode: string; + isMessagesLoaded: boolean; + loading: boolean; + notFound: boolean; + messageAppeared: boolean; + isReady: boolean; + hasError: boolean; + setOptimizationMode: (mode: string) => void; + setFocusMode: (mode: string) => void; + setFiles: (files: File[]) => void; + setFileIds: (fileIds: string[]) => void; + sendMessage: ( + message: string, + messageId?: string, + rewrite?: boolean, + ) => Promise<void>; + rewrite: (messageId: string) => void; +}; + +export interface File { + fileName: string; + fileExtension: string; + fileId: string; +} + +interface ChatModelProvider { + name: string; + provider: string; +} + +interface EmbeddingModelProvider { + name: string; + provider: string; +} + +const checkConfig = async ( + setChatModelProvider: (provider: ChatModelProvider) => void, + setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, + setIsConfigReady: (ready: boolean) => void, + setHasError: (hasError: boolean) => void, +) => { + try { + let chatModel = localStorage.getItem('chatModel'); + let chatModelProvider = localStorage.getItem('chatModelProvider'); + let embeddingModel = localStorage.getItem('embeddingModel'); + let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (!autoImageSearch) { + localStorage.setItem('autoImageSearch', 'true'); + } + + if (!autoVideoSearch) { + localStorage.setItem('autoVideoSearch', 'false'); + } + + const providers = await fetch(`/api/models`, { + headers: { + 'Content-Type': 'application/json', + }, + }).then(async (res) => { + if (!res.ok) + throw new Error( + `Failed to fetch models: ${res.status} ${res.statusText}`, + ); + return res.json(); + }); + + if ( + !chatModel || + !chatModelProvider || + !embeddingModel || + !embeddingModelProvider + ) { + if (!chatModel || !chatModelProvider) { + const chatModelProviders = providers.chatModelProviders; + const chatModelProvidersKeys = Object.keys(chatModelProviders); + + if (!chatModelProviders || chatModelProvidersKeys.length === 0) { + return toast.error('No chat models available'); + } else { + chatModelProvider = + chatModelProvidersKeys.find( + (provider) => + Object.keys(chatModelProviders[provider]).length > 0, + ) || chatModelProvidersKeys[0]; + } + + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + + chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; + } + + if (!embeddingModel || !embeddingModelProvider) { + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + !embeddingModelProviders || + Object.keys(embeddingModelProviders).length === 0 + ) + return toast.error('No embedding models available'); + + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + } + + localStorage.setItem('chatModel', chatModel!); + localStorage.setItem('chatModelProvider', chatModelProvider); + localStorage.setItem('embeddingModel', embeddingModel!); + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } else { + const chatModelProviders = providers.chatModelProviders; + const embeddingModelProviders = providers.embeddingModelProviders; + + if ( + Object.keys(chatModelProviders).length > 0 && + (!chatModelProviders[chatModelProvider] || + Object.keys(chatModelProviders[chatModelProvider]).length === 0) + ) { + const chatModelProvidersKeys = Object.keys(chatModelProviders); + chatModelProvider = + chatModelProvidersKeys.find( + (key) => Object.keys(chatModelProviders[key]).length > 0, + ) || chatModelProvidersKeys[0]; + + localStorage.setItem('chatModelProvider', chatModelProvider); + } + + if ( + chatModelProvider && + !chatModelProviders[chatModelProvider][chatModel] + ) { + if ( + chatModelProvider === 'custom_openai' && + Object.keys(chatModelProviders[chatModelProvider]).length === 0 + ) { + toast.error( + "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", + ); + return setHasError(true); + } + + chatModel = Object.keys( + chatModelProviders[ + Object.keys(chatModelProviders[chatModelProvider]).length > 0 + ? chatModelProvider + : Object.keys(chatModelProviders)[0] + ], + )[0]; + + localStorage.setItem('chatModel', chatModel); + } + + if ( + Object.keys(embeddingModelProviders).length > 0 && + !embeddingModelProviders[embeddingModelProvider] + ) { + embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; + localStorage.setItem('embeddingModelProvider', embeddingModelProvider); + } + + if ( + embeddingModelProvider && + !embeddingModelProviders[embeddingModelProvider][embeddingModel] + ) { + embeddingModel = Object.keys( + embeddingModelProviders[embeddingModelProvider], + )[0]; + localStorage.setItem('embeddingModel', embeddingModel); + } + } + + setChatModelProvider({ + name: chatModel!, + provider: chatModelProvider, + }); + + setEmbeddingModelProvider({ + name: embeddingModel!, + provider: embeddingModelProvider, + }); + + setIsConfigReady(true); + } catch (err) { + console.error('An error occurred while checking the configuration:', err); + setIsConfigReady(false); + setHasError(true); + } +}; + +const loadMessages = async ( + chatId: string, + setMessages: (messages: Message[]) => void, + setIsMessagesLoaded: (loaded: boolean) => void, + setChatHistory: (history: [string, string][]) => void, + setFocusMode: (mode: string) => void, + setNotFound: (notFound: boolean) => void, + setFiles: (files: File[]) => void, + setFileIds: (fileIds: string[]) => void, +) => { + const res = await fetch(`/api/chats/${chatId}`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (res.status === 404) { + setNotFound(true); + setIsMessagesLoaded(true); + return; + } + + const data = await res.json(); + + const messages = data.messages.map((msg: any) => { + return { + ...msg, + ...JSON.parse(msg.metadata), + }; + }) as Message[]; + + setMessages(messages); + + const history = messages.map((msg) => { + return [msg.role, msg.content]; + }) as [string, string][]; + + console.debug(new Date(), 'app:messages_loaded'); + + document.title = messages[0].content; + + const files = data.chat.files.map((file: any) => { + return { + fileName: file.name, + fileExtension: file.name.split('.').pop(), + fileId: file.fileId, + }; + }); + + setFiles(files); + setFileIds(files.map((file: File) => file.fileId)); + + setChatHistory(history); + setFocusMode(data.chat.focusMode); + setIsMessagesLoaded(true); +}; + +export const chatContext = createContext<ChatContext>({ + chatHistory: [], + chatId: '', + fileIds: [], + files: [], + focusMode: '', + hasError: false, + isMessagesLoaded: false, + isReady: false, + loading: false, + messageAppeared: false, + messages: [], + notFound: false, + optimizationMode: '', + rewrite: () => {}, + sendMessage: async () => {}, + setFileIds: () => {}, + setFiles: () => {}, + setFocusMode: () => {}, + setOptimizationMode: () => {}, +}); + +export const ChatProvider = ({ + children, + id, +}: { + children: React.ReactNode; + id?: string; +}) => { + const searchParams = useSearchParams(); + const initialMessage = searchParams.get('q'); + + const [chatId, setChatId] = useState<string | undefined>(id); + const [newChatCreated, setNewChatCreated] = useState(false); + + const [loading, setLoading] = useState(false); + const [messageAppeared, setMessageAppeared] = useState(false); + + const [chatHistory, setChatHistory] = useState<[string, string][]>([]); + const [messages, setMessages] = useState<Message[]>([]); + + const [files, setFiles] = useState<File[]>([]); + const [fileIds, setFileIds] = useState<string[]>([]); + + const [focusMode, setFocusMode] = useState('webSearch'); + const [optimizationMode, setOptimizationMode] = useState('speed'); + + const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); + + const [notFound, setNotFound] = useState(false); + + const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( + { + name: '', + provider: '', + }, + ); + + const [embeddingModelProvider, setEmbeddingModelProvider] = + useState<EmbeddingModelProvider>({ + name: '', + provider: '', + }); + + const [isConfigReady, setIsConfigReady] = useState(false); + const [hasError, setHasError] = useState(false); + const [isReady, setIsReady] = useState(false); + + const messagesRef = useRef<Message[]>([]); + + useEffect(() => { + checkConfig( + setChatModelProvider, + setEmbeddingModelProvider, + setIsConfigReady, + setHasError, + ); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + if ( + chatId && + !newChatCreated && + !isMessagesLoaded && + messages.length === 0 + ) { + loadMessages( + chatId, + setMessages, + setIsMessagesLoaded, + setChatHistory, + setFocusMode, + setNotFound, + setFiles, + setFileIds, + ); + } else if (!chatId) { + setNewChatCreated(true); + setIsMessagesLoaded(true); + setChatId(crypto.randomBytes(20).toString('hex')); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + useEffect(() => { + messagesRef.current = messages; + }, [messages]); + + useEffect(() => { + if (isMessagesLoaded && isConfigReady) { + setIsReady(true); + console.debug(new Date(), 'app:ready'); + } else { + setIsReady(false); + } + }, [isMessagesLoaded, isConfigReady]); + + const rewrite = (messageId: string) => { + const index = messages.findIndex((msg) => msg.messageId === messageId); + + if (index === -1) return; + + const message = messages[index - 1]; + + setMessages((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); + setChatHistory((prev) => { + return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; + }); + + sendMessage(message.content, message.messageId, true); + }; + + useEffect(() => { + if (isReady && initialMessage && isConfigReady) { + if (!isConfigReady) { + toast.error('Cannot send message before the configuration is ready'); + return; + } + sendMessage(initialMessage); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [isConfigReady, isReady, initialMessage]); + + const sendMessage: ChatContext['sendMessage'] = async ( + message, + messageId, + rewrite = false, + ) => { + if (loading) return; + setLoading(true); + setMessageAppeared(false); + + let sources: Document[] | undefined = undefined; + let recievedMessage = ''; + let added = false; + + messageId = messageId ?? crypto.randomBytes(7).toString('hex'); + + setMessages((prevMessages) => [ + ...prevMessages, + { + content: message, + messageId: messageId, + chatId: chatId!, + role: 'user', + createdAt: new Date(), + }, + ]); + + const messageHandler = async (data: any) => { + if (data.type === 'error') { + toast.error(data.data); + setLoading(false); + return; + } + + if (data.type === 'sources') { + sources = data.data; + if (!added) { + setMessages((prevMessages) => [ + ...prevMessages, + { + content: '', + messageId: data.messageId, + chatId: chatId!, + role: 'assistant', + sources: sources, + createdAt: new Date(), + }, + ]); + added = true; + } + setMessageAppeared(true); + } + + if (data.type === 'message') { + if (!added) { + setMessages((prevMessages) => [ + ...prevMessages, + { + content: data.data, + messageId: data.messageId, + chatId: chatId!, + role: 'assistant', + sources: sources, + createdAt: new Date(), + }, + ]); + added = true; + } + + setMessages((prev) => + prev.map((message) => { + if (message.messageId === data.messageId) { + return { ...message, content: message.content + data.data }; + } + + return message; + }), + ); + + recievedMessage += data.data; + setMessageAppeared(true); + } + + if (data.type === 'messageEnd') { + setChatHistory((prevHistory) => [ + ...prevHistory, + ['human', message], + ['assistant', recievedMessage], + ]); + + setLoading(false); + + const lastMsg = messagesRef.current[messagesRef.current.length - 1]; + + const autoImageSearch = localStorage.getItem('autoImageSearch'); + const autoVideoSearch = localStorage.getItem('autoVideoSearch'); + + if (autoImageSearch === 'true') { + document + .getElementById(`search-images-${lastMsg.messageId}`) + ?.click(); + } + + if (autoVideoSearch === 'true') { + document + .getElementById(`search-videos-${lastMsg.messageId}`) + ?.click(); + } + + if ( + lastMsg.role === 'assistant' && + lastMsg.sources && + lastMsg.sources.length > 0 && + !lastMsg.suggestions + ) { + const suggestions = await getSuggestions(messagesRef.current); + setMessages((prev) => + prev.map((msg) => { + if (msg.messageId === lastMsg.messageId) { + return { ...msg, suggestions: suggestions }; + } + return msg; + }), + ); + } + } + }; + + const messageIndex = messages.findIndex((m) => m.messageId === messageId); + + const res = await fetch('/api/chat', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + content: message, + message: { + messageId: messageId, + chatId: chatId!, + content: message, + }, + chatId: chatId!, + files: fileIds, + focusMode: focusMode, + optimizationMode: optimizationMode, + history: rewrite + ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) + : chatHistory, + chatModel: { + name: chatModelProvider.name, + provider: chatModelProvider.provider, + }, + embeddingModel: { + name: embeddingModelProvider.name, + provider: embeddingModelProvider.provider, + }, + systemInstructions: localStorage.getItem('systemInstructions'), + }), + }); + + if (!res.body) throw new Error('No response body'); + + const reader = res.body?.getReader(); + const decoder = new TextDecoder('utf-8'); + + let partialChunk = ''; + + while (true) { + const { value, done } = await reader.read(); + if (done) break; + + partialChunk += decoder.decode(value, { stream: true }); + + try { + const messages = partialChunk.split('\n'); + for (const msg of messages) { + if (!msg.trim()) continue; + const json = JSON.parse(msg); + messageHandler(json); + } + partialChunk = ''; + } catch (error) { + console.warn('Incomplete JSON, waiting for next chunk...'); + } + } + }; + + return ( + <chatContext.Provider + value={{ + messages, + chatHistory, + files, + fileIds, + focusMode, + chatId, + hasError, + isMessagesLoaded, + isReady, + loading, + messageAppeared, + notFound, + optimizationMode, + setFileIds, + setFiles, + setFocusMode, + setOptimizationMode, + rewrite, + sendMessage, + }} + > + {children} + </chatContext.Provider> + ); +}; + +export const useChat = () => { + const ctx = useContext(chatContext); + return ctx; +}; From 0b15bfbe3254ebd0d92a4c591789db9f28cb27f9 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:21:06 +0530 Subject: [PATCH 144/147] feat(app): switch to useChat hook --- src/app/c/[chatId]/page.tsx | 18 +- src/app/page.tsx | 5 +- src/components/Chat.tsx | 38 +- src/components/ChatWindow.tsx | 575 +----------------- src/components/EmptyChat.tsx | 34 +- src/components/EmptyChatMessageInput.tsx | 44 +- src/components/MessageBox.tsx | 11 +- src/components/MessageInput.tsx | 35 +- src/components/MessageInputActions/Attach.tsx | 17 +- .../MessageInputActions/AttachSmall.tsx | 15 +- src/components/MessageInputActions/Focus.tsx | 11 +- .../MessageInputActions/Optimization.tsx | 11 +- src/components/Navbar.tsx | 13 +- 13 files changed, 68 insertions(+), 759 deletions(-) diff --git a/src/app/c/[chatId]/page.tsx b/src/app/c/[chatId]/page.tsx index aac125a..672107a 100644 --- a/src/app/c/[chatId]/page.tsx +++ b/src/app/c/[chatId]/page.tsx @@ -1,9 +1,17 @@ -import ChatWindow from '@/components/ChatWindow'; -import React from 'react'; +'use client'; -const Page = ({ params }: { params: Promise<{ chatId: string }> }) => { - const { chatId } = React.use(params); - return <ChatWindow id={chatId} />; +import ChatWindow from '@/components/ChatWindow'; +import { useParams } from 'next/navigation'; +import React from 'react'; +import { ChatProvider } from '@/lib/hooks/useChat'; + +const Page = () => { + const { chatId }: { chatId: string } = useParams(); + return ( + <ChatProvider id={chatId}> + <ChatWindow /> + </ChatProvider> + ); }; export default Page; diff --git a/src/app/page.tsx b/src/app/page.tsx index e18aca9..25981b5 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,4 +1,5 @@ import ChatWindow from '@/components/ChatWindow'; +import { ChatProvider } from '@/lib/hooks/useChat'; import { Metadata } from 'next'; import { Suspense } from 'react'; @@ -11,7 +12,9 @@ const Home = () => { return ( <div> <Suspense> - <ChatWindow /> + <ChatProvider> + <ChatWindow /> + </ChatProvider> </Suspense> </div> ); diff --git a/src/components/Chat.tsx b/src/components/Chat.tsx index 0cf125b..a5d8cf9 100644 --- a/src/components/Chat.tsx +++ b/src/components/Chat.tsx @@ -5,28 +5,11 @@ import MessageInput from './MessageInput'; import { File, Message } from './ChatWindow'; import MessageBox from './MessageBox'; import MessageBoxLoading from './MessageBoxLoading'; +import { useChat } from '@/lib/hooks/useChat'; + +const Chat = () => { + const { messages, loading, messageAppeared } = useChat(); -const Chat = ({ - loading, - messages, - sendMessage, - messageAppeared, - rewrite, - fileIds, - setFileIds, - files, - setFiles, -}: { - messages: Message[]; - sendMessage: (message: string) => void; - loading: boolean; - messageAppeared: boolean; - rewrite: (messageId: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { const [dividerWidth, setDividerWidth] = useState(0); const dividerRef = useRef<HTMLDivElement | null>(null); const messageEnd = useRef<HTMLDivElement | null>(null); @@ -72,12 +55,8 @@ const Chat = ({ key={i} message={msg} messageIndex={i} - history={messages} - loading={loading} dividerRef={isLast ? dividerRef : undefined} isLast={isLast} - rewrite={rewrite} - sendMessage={sendMessage} /> {!isLast && msg.role === 'assistant' && ( <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary" /> @@ -92,14 +71,7 @@ const Chat = ({ className="bottom-24 lg:bottom-10 fixed z-40" style={{ width: dividerWidth }} > - <MessageInput - loading={loading} - sendMessage={sendMessage} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <MessageInput /> </div> )} </div> diff --git a/src/components/ChatWindow.tsx b/src/components/ChatWindow.tsx index 6ff7d22..0d40c83 100644 --- a/src/components/ChatWindow.tsx +++ b/src/components/ChatWindow.tsx @@ -1,17 +1,13 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; import { Document } from '@langchain/core/documents'; import Navbar from './Navbar'; import Chat from './Chat'; import EmptyChat from './EmptyChat'; -import crypto from 'crypto'; -import { toast } from 'sonner'; -import { useSearchParams } from 'next/navigation'; -import { getSuggestions } from '@/lib/actions'; import { Settings } from 'lucide-react'; import Link from 'next/link'; import NextError from 'next/error'; +import { useChat } from '@/lib/hooks/useChat'; export type Message = { messageId: string; @@ -29,547 +25,8 @@ export interface File { fileId: string; } -interface ChatModelProvider { - name: string; - provider: string; -} - -interface EmbeddingModelProvider { - name: string; - provider: string; -} - -const checkConfig = async ( - setChatModelProvider: (provider: ChatModelProvider) => void, - setEmbeddingModelProvider: (provider: EmbeddingModelProvider) => void, - setIsConfigReady: (ready: boolean) => void, - setHasError: (hasError: boolean) => void, -) => { - try { - let chatModel = localStorage.getItem('chatModel'); - let chatModelProvider = localStorage.getItem('chatModelProvider'); - let embeddingModel = localStorage.getItem('embeddingModel'); - let embeddingModelProvider = localStorage.getItem('embeddingModelProvider'); - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (!autoImageSearch) { - localStorage.setItem('autoImageSearch', 'true'); - } - - if (!autoVideoSearch) { - localStorage.setItem('autoVideoSearch', 'false'); - } - - const providers = await fetch(`/api/models`, { - headers: { - 'Content-Type': 'application/json', - }, - }).then(async (res) => { - if (!res.ok) - throw new Error( - `Failed to fetch models: ${res.status} ${res.statusText}`, - ); - return res.json(); - }); - - if ( - !chatModel || - !chatModelProvider || - !embeddingModel || - !embeddingModelProvider - ) { - if (!chatModel || !chatModelProvider) { - const chatModelProviders = providers.chatModelProviders; - const chatModelProvidersKeys = Object.keys(chatModelProviders); - - if (!chatModelProviders || chatModelProvidersKeys.length === 0) { - return toast.error('No chat models available'); - } else { - chatModelProvider = - chatModelProvidersKeys.find( - (provider) => - Object.keys(chatModelProviders[provider]).length > 0, - ) || chatModelProvidersKeys[0]; - } - - if ( - chatModelProvider === 'custom_openai' && - Object.keys(chatModelProviders[chatModelProvider]).length === 0 - ) { - toast.error( - "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", - ); - return setHasError(true); - } - - chatModel = Object.keys(chatModelProviders[chatModelProvider])[0]; - } - - if (!embeddingModel || !embeddingModelProvider) { - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - !embeddingModelProviders || - Object.keys(embeddingModelProviders).length === 0 - ) - return toast.error('No embedding models available'); - - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - } - - localStorage.setItem('chatModel', chatModel!); - localStorage.setItem('chatModelProvider', chatModelProvider); - localStorage.setItem('embeddingModel', embeddingModel!); - localStorage.setItem('embeddingModelProvider', embeddingModelProvider); - } else { - const chatModelProviders = providers.chatModelProviders; - const embeddingModelProviders = providers.embeddingModelProviders; - - if ( - Object.keys(chatModelProviders).length > 0 && - (!chatModelProviders[chatModelProvider] || - Object.keys(chatModelProviders[chatModelProvider]).length === 0) - ) { - const chatModelProvidersKeys = Object.keys(chatModelProviders); - chatModelProvider = - chatModelProvidersKeys.find( - (key) => Object.keys(chatModelProviders[key]).length > 0, - ) || chatModelProvidersKeys[0]; - - localStorage.setItem('chatModelProvider', chatModelProvider); - } - - if ( - chatModelProvider && - !chatModelProviders[chatModelProvider][chatModel] - ) { - if ( - chatModelProvider === 'custom_openai' && - Object.keys(chatModelProviders[chatModelProvider]).length === 0 - ) { - toast.error( - "Looks like you haven't configured any chat model providers. Please configure them from the settings page or the config file.", - ); - return setHasError(true); - } - - chatModel = Object.keys( - chatModelProviders[ - Object.keys(chatModelProviders[chatModelProvider]).length > 0 - ? chatModelProvider - : Object.keys(chatModelProviders)[0] - ], - )[0]; - - localStorage.setItem('chatModel', chatModel); - } - - if ( - Object.keys(embeddingModelProviders).length > 0 && - !embeddingModelProviders[embeddingModelProvider] - ) { - embeddingModelProvider = Object.keys(embeddingModelProviders)[0]; - localStorage.setItem('embeddingModelProvider', embeddingModelProvider); - } - - if ( - embeddingModelProvider && - !embeddingModelProviders[embeddingModelProvider][embeddingModel] - ) { - embeddingModel = Object.keys( - embeddingModelProviders[embeddingModelProvider], - )[0]; - localStorage.setItem('embeddingModel', embeddingModel); - } - } - - setChatModelProvider({ - name: chatModel!, - provider: chatModelProvider, - }); - - setEmbeddingModelProvider({ - name: embeddingModel!, - provider: embeddingModelProvider, - }); - - setIsConfigReady(true); - } catch (err) { - console.error('An error occurred while checking the configuration:', err); - setIsConfigReady(false); - setHasError(true); - } -}; - -const loadMessages = async ( - chatId: string, - setMessages: (messages: Message[]) => void, - setIsMessagesLoaded: (loaded: boolean) => void, - setChatHistory: (history: [string, string][]) => void, - setFocusMode: (mode: string) => void, - setNotFound: (notFound: boolean) => void, - setFiles: (files: File[]) => void, - setFileIds: (fileIds: string[]) => void, -) => { - const res = await fetch(`/api/chats/${chatId}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - - if (res.status === 404) { - setNotFound(true); - setIsMessagesLoaded(true); - return; - } - - const data = await res.json(); - - const messages = data.messages.map((msg: any) => { - return { - ...msg, - ...JSON.parse(msg.metadata), - }; - }) as Message[]; - - setMessages(messages); - - const history = messages.map((msg) => { - return [msg.role, msg.content]; - }) as [string, string][]; - - console.debug(new Date(), 'app:messages_loaded'); - - document.title = messages[0].content; - - const files = data.chat.files.map((file: any) => { - return { - fileName: file.name, - fileExtension: file.name.split('.').pop(), - fileId: file.fileId, - }; - }); - - setFiles(files); - setFileIds(files.map((file: File) => file.fileId)); - - setChatHistory(history); - setFocusMode(data.chat.focusMode); - setIsMessagesLoaded(true); -}; - -const ChatWindow = ({ id }: { id?: string }) => { - const searchParams = useSearchParams(); - const initialMessage = searchParams.get('q'); - - const [chatId, setChatId] = useState<string | undefined>(id); - const [newChatCreated, setNewChatCreated] = useState(false); - - const [chatModelProvider, setChatModelProvider] = useState<ChatModelProvider>( - { - name: '', - provider: '', - }, - ); - - const [embeddingModelProvider, setEmbeddingModelProvider] = - useState<EmbeddingModelProvider>({ - name: '', - provider: '', - }); - - const [isConfigReady, setIsConfigReady] = useState(false); - const [hasError, setHasError] = useState(false); - const [isReady, setIsReady] = useState(false); - - useEffect(() => { - checkConfig( - setChatModelProvider, - setEmbeddingModelProvider, - setIsConfigReady, - setHasError, - ); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const [loading, setLoading] = useState(false); - const [messageAppeared, setMessageAppeared] = useState(false); - - const [chatHistory, setChatHistory] = useState<[string, string][]>([]); - const [messages, setMessages] = useState<Message[]>([]); - - const [files, setFiles] = useState<File[]>([]); - const [fileIds, setFileIds] = useState<string[]>([]); - - const [focusMode, setFocusMode] = useState('webSearch'); - const [optimizationMode, setOptimizationMode] = useState('speed'); - - const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); - - const [notFound, setNotFound] = useState(false); - - useEffect(() => { - if ( - chatId && - !newChatCreated && - !isMessagesLoaded && - messages.length === 0 - ) { - loadMessages( - chatId, - setMessages, - setIsMessagesLoaded, - setChatHistory, - setFocusMode, - setNotFound, - setFiles, - setFileIds, - ); - } else if (!chatId) { - setNewChatCreated(true); - setIsMessagesLoaded(true); - setChatId(crypto.randomBytes(20).toString('hex')); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const messagesRef = useRef<Message[]>([]); - - useEffect(() => { - messagesRef.current = messages; - }, [messages]); - - useEffect(() => { - if (isMessagesLoaded && isConfigReady) { - setIsReady(true); - console.debug(new Date(), 'app:ready'); - } else { - setIsReady(false); - } - }, [isMessagesLoaded, isConfigReady]); - - const sendMessage = async ( - message: string, - messageId?: string, - rewrite = false, - ) => { - if (loading) return; - if (!isConfigReady) { - toast.error('Cannot send message before the configuration is ready'); - return; - } - - setLoading(true); - setMessageAppeared(false); - - let sources: Document[] | undefined = undefined; - let recievedMessage = ''; - let added = false; - - messageId = messageId ?? crypto.randomBytes(7).toString('hex'); - - setMessages((prevMessages) => [ - ...prevMessages, - { - content: message, - messageId: messageId, - chatId: chatId!, - role: 'user', - createdAt: new Date(), - }, - ]); - - const messageHandler = async (data: any) => { - if (data.type === 'error') { - toast.error(data.data); - setLoading(false); - return; - } - - if (data.type === 'sources') { - sources = data.data; - if (!added) { - setMessages((prevMessages) => [ - ...prevMessages, - { - content: '', - messageId: data.messageId, - chatId: chatId!, - role: 'assistant', - sources: sources, - createdAt: new Date(), - }, - ]); - added = true; - } - setMessageAppeared(true); - } - - if (data.type === 'message') { - if (!added) { - setMessages((prevMessages) => [ - ...prevMessages, - { - content: data.data, - messageId: data.messageId, - chatId: chatId!, - role: 'assistant', - sources: sources, - createdAt: new Date(), - }, - ]); - added = true; - } - - setMessages((prev) => - prev.map((message) => { - if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data }; - } - - return message; - }), - ); - - recievedMessage += data.data; - setMessageAppeared(true); - } - - if (data.type === 'messageEnd') { - setChatHistory((prevHistory) => [ - ...prevHistory, - ['human', message], - ['assistant', recievedMessage], - ]); - - setLoading(false); - - const lastMsg = messagesRef.current[messagesRef.current.length - 1]; - - const autoImageSearch = localStorage.getItem('autoImageSearch'); - const autoVideoSearch = localStorage.getItem('autoVideoSearch'); - - if (autoImageSearch === 'true') { - document - .getElementById(`search-images-${lastMsg.messageId}`) - ?.click(); - } - - if (autoVideoSearch === 'true') { - document - .getElementById(`search-videos-${lastMsg.messageId}`) - ?.click(); - } - - if ( - lastMsg.role === 'assistant' && - lastMsg.sources && - lastMsg.sources.length > 0 && - !lastMsg.suggestions - ) { - const suggestions = await getSuggestions(messagesRef.current); - setMessages((prev) => - prev.map((msg) => { - if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions }; - } - return msg; - }), - ); - } - } - }; - - const messageIndex = messages.findIndex((m) => m.messageId === messageId); - - const res = await fetch('/api/chat', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - content: message, - message: { - messageId: messageId, - chatId: chatId!, - content: message, - }, - chatId: chatId!, - files: fileIds, - focusMode: focusMode, - optimizationMode: optimizationMode, - history: rewrite - ? chatHistory.slice(0, messageIndex === -1 ? undefined : messageIndex) - : chatHistory, - chatModel: { - name: chatModelProvider.name, - provider: chatModelProvider.provider, - }, - embeddingModel: { - name: embeddingModelProvider.name, - provider: embeddingModelProvider.provider, - }, - systemInstructions: localStorage.getItem('systemInstructions'), - }), - }); - - if (!res.body) throw new Error('No response body'); - - const reader = res.body?.getReader(); - const decoder = new TextDecoder('utf-8'); - - let partialChunk = ''; - - while (true) { - const { value, done } = await reader.read(); - if (done) break; - - partialChunk += decoder.decode(value, { stream: true }); - - try { - const messages = partialChunk.split('\n'); - for (const msg of messages) { - if (!msg.trim()) continue; - const json = JSON.parse(msg); - messageHandler(json); - } - partialChunk = ''; - } catch (error) { - console.warn('Incomplete JSON, waiting for next chunk...'); - } - } - }; - - const rewrite = (messageId: string) => { - const index = messages.findIndex((msg) => msg.messageId === messageId); - - if (index === -1) return; - - const message = messages[index - 1]; - - setMessages((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); - setChatHistory((prev) => { - return [...prev.slice(0, messages.length > 2 ? index - 1 : 0)]; - }); - - sendMessage(message.content, message.messageId, true); - }; - - useEffect(() => { - if (isReady && initialMessage && isConfigReady) { - sendMessage(initialMessage); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [isConfigReady, isReady, initialMessage]); - +const ChatWindow = () => { + const { hasError, isReady, notFound, messages } = useChat(); if (hasError) { return ( <div className="relative"> @@ -594,31 +51,11 @@ const ChatWindow = ({ id }: { id?: string }) => { <div> {messages.length > 0 ? ( <> - <Navbar chatId={chatId!} messages={messages} /> - <Chat - loading={loading} - messages={messages} - sendMessage={sendMessage} - messageAppeared={messageAppeared} - rewrite={rewrite} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <Navbar /> + <Chat /> </> ) : ( - <EmptyChat - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <EmptyChat /> )} </div> ) diff --git a/src/components/EmptyChat.tsx b/src/components/EmptyChat.tsx index 0eb76ac..e40a338 100644 --- a/src/components/EmptyChat.tsx +++ b/src/components/EmptyChat.tsx @@ -5,27 +5,7 @@ import Link from 'next/link'; import WeatherWidget from './WeatherWidget'; import NewsArticleWidget from './NewsArticleWidget'; -const EmptyChat = ({ - sendMessage, - focusMode, - setFocusMode, - optimizationMode, - setOptimizationMode, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - focusMode: string; - setFocusMode: (mode: string) => void; - optimizationMode: string; - setOptimizationMode: (mode: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { +const EmptyChat = () => { return ( <div className="relative"> <div className="absolute w-full flex flex-row items-center justify-end mr-5 mt-5"> @@ -38,17 +18,7 @@ const EmptyChat = ({ <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> Research begins here. </h2> - <EmptyChatMessageInput - sendMessage={sendMessage} - focusMode={focusMode} - setFocusMode={setFocusMode} - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <EmptyChatMessageInput /> </div> <div className="flex flex-col w-full gap-4 mt-2 sm:flex-row sm:justify-center"> <div className="flex-1 w-full"> diff --git a/src/components/EmptyChatMessageInput.tsx b/src/components/EmptyChatMessageInput.tsx index 43d1e28..3c5ff6b 100644 --- a/src/components/EmptyChatMessageInput.tsx +++ b/src/components/EmptyChatMessageInput.tsx @@ -1,34 +1,15 @@ import { ArrowRight } from 'lucide-react'; import { useEffect, useRef, useState } from 'react'; import TextareaAutosize from 'react-textarea-autosize'; -import CopilotToggle from './MessageInputActions/Copilot'; import Focus from './MessageInputActions/Focus'; import Optimization from './MessageInputActions/Optimization'; import Attach from './MessageInputActions/Attach'; -import { File } from './ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; -const EmptyChatMessageInput = ({ - sendMessage, - focusMode, - setFocusMode, - optimizationMode, - setOptimizationMode, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - focusMode: string; - setFocusMode: (mode: string) => void; - optimizationMode: string; - setOptimizationMode: (mode: string) => void; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { - const [copilotEnabled, setCopilotEnabled] = useState(false); +const EmptyChatMessageInput = () => { + const { sendMessage } = useChat(); + + /* const [copilotEnabled, setCopilotEnabled] = useState(false); */ const [message, setMessage] = useState(''); const inputRef = useRef<HTMLTextAreaElement | null>(null); @@ -84,20 +65,11 @@ const EmptyChatMessageInput = ({ /> <div className="flex flex-row items-center justify-between mt-4"> <div className="flex flex-row items-center space-x-2 lg:space-x-4"> - <Focus focusMode={focusMode} setFocusMode={setFocusMode} /> - <Attach - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - showText - /> + <Focus /> + <Attach showText /> </div> <div className="flex flex-row items-center space-x-1 sm:space-x-4"> - <Optimization - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - /> + <Optimization /> <button disabled={message.trim().length === 0} className="bg-[#24A0ED] text-white disabled:text-black/50 dark:disabled:text-white/50 disabled:bg-[#e0e0dc] dark:disabled:bg-[#ececec21] hover:bg-opacity-85 transition duration-100 rounded-full p-2" diff --git a/src/components/MessageBox.tsx b/src/components/MessageBox.tsx index dc43aa2..ab6acab 100644 --- a/src/components/MessageBox.tsx +++ b/src/components/MessageBox.tsx @@ -20,6 +20,7 @@ import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; import { useSpeech } from 'react-text-to-speech'; import ThinkBox from './ThinkBox'; +import { useChat } from '@/lib/hooks/useChat'; const ThinkTagProcessor = ({ children, @@ -36,22 +37,16 @@ const ThinkTagProcessor = ({ const MessageBox = ({ message, messageIndex, - history, - loading, dividerRef, isLast, - rewrite, - sendMessage, }: { message: Message; messageIndex: number; - history: Message[]; - loading: boolean; dividerRef?: MutableRefObject<HTMLDivElement | null>; isLast: boolean; - rewrite: (messageId: string) => void; - sendMessage: (message: string) => void; }) => { + const { loading, messages: history, sendMessage, rewrite } = useChat(); + const [parsedMessage, setParsedMessage] = useState(message.content); const [speechMessage, setSpeechMessage] = useState(message.content); const [thinkingEnded, setThinkingEnded] = useState(false); diff --git a/src/components/MessageInput.tsx b/src/components/MessageInput.tsx index b6b1d96..9949c64 100644 --- a/src/components/MessageInput.tsx +++ b/src/components/MessageInput.tsx @@ -6,22 +6,11 @@ import Attach from './MessageInputActions/Attach'; import CopilotToggle from './MessageInputActions/Copilot'; import { File } from './ChatWindow'; import AttachSmall from './MessageInputActions/AttachSmall'; +import { useChat } from '@/lib/hooks/useChat'; + +const MessageInput = () => { + const { loading, sendMessage } = useChat(); -const MessageInput = ({ - sendMessage, - loading, - fileIds, - setFileIds, - files, - setFiles, -}: { - sendMessage: (message: string) => void; - loading: boolean; - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: File[]; - setFiles: (files: File[]) => void; -}) => { const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const [textareaRows, setTextareaRows] = useState(1); @@ -79,14 +68,7 @@ const MessageInput = ({ mode === 'multi' ? 'flex-col rounded-lg' : 'flex-row rounded-full', )} > - {mode === 'single' && ( - <AttachSmall - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> - )} + {mode === 'single' && <AttachSmall />} <TextareaAutosize ref={inputRef} value={message} @@ -113,12 +95,7 @@ const MessageInput = ({ )} {mode === 'multi' && ( <div className="flex flex-row items-center justify-between w-full pt-2"> - <AttachSmall - fileIds={fileIds} - setFileIds={setFileIds} - files={files} - setFiles={setFiles} - /> + <AttachSmall /> <div className="flex flex-row items-center space-x-4"> <CopilotToggle copilotEnabled={copilotEnabled} diff --git a/src/components/MessageInputActions/Attach.tsx b/src/components/MessageInputActions/Attach.tsx index 7e2f7f2..fe33a4e 100644 --- a/src/components/MessageInputActions/Attach.tsx +++ b/src/components/MessageInputActions/Attach.tsx @@ -8,20 +8,11 @@ import { import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { File as FileType } from '../ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; + +const Attach = ({ showText }: { showText?: boolean }) => { + const { files, setFiles, setFileIds, fileIds } = useChat(); -const Attach = ({ - fileIds, - setFileIds, - showText, - files, - setFiles, -}: { - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - showText?: boolean; - files: FileType[]; - setFiles: (files: FileType[]) => void; -}) => { const [loading, setLoading] = useState(false); const fileInputRef = useRef<any>(); diff --git a/src/components/MessageInputActions/AttachSmall.tsx b/src/components/MessageInputActions/AttachSmall.tsx index 044b652..834b3f4 100644 --- a/src/components/MessageInputActions/AttachSmall.tsx +++ b/src/components/MessageInputActions/AttachSmall.tsx @@ -8,18 +8,11 @@ import { import { CopyPlus, File, LoaderCircle, Plus, Trash } from 'lucide-react'; import { Fragment, useRef, useState } from 'react'; import { File as FileType } from '../ChatWindow'; +import { useChat } from '@/lib/hooks/useChat'; + +const AttachSmall = () => { + const { files, setFiles, setFileIds, fileIds } = useChat(); -const AttachSmall = ({ - fileIds, - setFileIds, - files, - setFiles, -}: { - fileIds: string[]; - setFileIds: (fileIds: string[]) => void; - files: FileType[]; - setFiles: (files: FileType[]) => void; -}) => { const [loading, setLoading] = useState(false); const fileInputRef = useRef<any>(); diff --git a/src/components/MessageInputActions/Focus.tsx b/src/components/MessageInputActions/Focus.tsx index 875dbf7..9256aa7 100644 --- a/src/components/MessageInputActions/Focus.tsx +++ b/src/components/MessageInputActions/Focus.tsx @@ -15,6 +15,7 @@ import { } from '@headlessui/react'; import { SiReddit, SiYoutube } from '@icons-pack/react-simple-icons'; import { Fragment } from 'react'; +import { useChat } from '@/lib/hooks/useChat'; const focusModes = [ { @@ -55,13 +56,9 @@ const focusModes = [ }, ]; -const Focus = ({ - focusMode, - setFocusMode, -}: { - focusMode: string; - setFocusMode: (mode: string) => void; -}) => { +const Focus = () => { + const { focusMode, setFocusMode } = useChat(); + return ( <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg mt-[6.5px]"> <PopoverButton diff --git a/src/components/MessageInputActions/Optimization.tsx b/src/components/MessageInputActions/Optimization.tsx index ac8a7b0..fc812ad 100644 --- a/src/components/MessageInputActions/Optimization.tsx +++ b/src/components/MessageInputActions/Optimization.tsx @@ -7,6 +7,7 @@ import { Transition, } from '@headlessui/react'; import { Fragment } from 'react'; +import { useChat } from '@/lib/hooks/useChat'; const OptimizationModes = [ { @@ -34,13 +35,9 @@ const OptimizationModes = [ }, ]; -const Optimization = ({ - optimizationMode, - setOptimizationMode, -}: { - optimizationMode: string; - setOptimizationMode: (mode: string) => void; -}) => { +const Optimization = () => { + const { optimizationMode, setOptimizationMode } = useChat(); + return ( <Popover className="relative w-full max-w-[15rem] md:max-w-md lg:max-w-lg"> <PopoverButton diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx index e406ade..b0e8ea6 100644 --- a/src/components/Navbar.tsx +++ b/src/components/Navbar.tsx @@ -10,6 +10,7 @@ import { Transition, } from '@headlessui/react'; import jsPDF from 'jspdf'; +import { useChat } from '@/lib/hooks/useChat'; const downloadFile = (filename: string, content: string, type: string) => { const blob = new Blob([content], { type }); @@ -118,16 +119,12 @@ const exportAsPDF = (messages: Message[], title: string) => { doc.save(`${title || 'chat'}.pdf`); }; -const Navbar = ({ - chatId, - messages, -}: { - messages: Message[]; - chatId: string; -}) => { +const Navbar = () => { const [title, setTitle] = useState<string>(''); const [timeAgo, setTimeAgo] = useState<string>(''); + const { messages, chatId } = useChat(); + useEffect(() => { if (messages.length > 0) { const newTitle = @@ -206,7 +203,7 @@ const Navbar = ({ </PopoverPanel> </Transition> </Popover> - <DeleteChat redirect chatId={chatId} chats={[]} setChats={() => {}} /> + <DeleteChat redirect chatId={chatId!} chats={[]} setChats={() => {}} /> </div> </div> ); From f680188905edf60494bdb4254c3dd1b8f276afc2 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Wed, 20 Aug 2025 20:32:13 +0530 Subject: [PATCH 145/147] feat(ollama): add ability to provide api key --- src/app/api/config/route.ts | 3 +++ src/app/settings/page.tsx | 20 ++++++++++++++++++++ src/lib/config.ts | 3 +++ src/lib/providers/ollama.ts | 10 +++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/app/api/config/route.ts b/src/app/api/config/route.ts index 0c11b23..f117cce 100644 --- a/src/app/api/config/route.ts +++ b/src/app/api/config/route.ts @@ -11,6 +11,7 @@ import { getAimlApiKey, getLMStudioApiEndpoint, updateConfig, + getOllamaApiKey, } from '@/lib/config'; import { getAvailableChatModelProviders, @@ -53,6 +54,7 @@ export const GET = async (req: Request) => { config['openaiApiKey'] = getOpenaiApiKey(); config['ollamaApiUrl'] = getOllamaApiEndpoint(); + config['ollamaApiKey'] = getOllamaApiKey(); config['lmStudioApiUrl'] = getLMStudioApiEndpoint(); config['anthropicApiKey'] = getAnthropicApiKey(); config['groqApiKey'] = getGroqApiKey(); @@ -93,6 +95,7 @@ export const POST = async (req: Request) => { }, OLLAMA: { API_URL: config.ollamaApiUrl, + API_KEY: config.ollamaApiKey, }, DEEPSEEK: { API_KEY: config.deepseekApiKey, diff --git a/src/app/settings/page.tsx b/src/app/settings/page.tsx index 1b13c9c..6fb8255 100644 --- a/src/app/settings/page.tsx +++ b/src/app/settings/page.tsx @@ -21,6 +21,7 @@ interface SettingsType { anthropicApiKey: string; geminiApiKey: string; ollamaApiUrl: string; + ollamaApiKey: string; lmStudioApiUrl: string; deepseekApiKey: string; aimlApiKey: string; @@ -818,6 +819,25 @@ const Page = () => { /> </div> + <div className="flex flex-col space-y-1"> + <p className="text-black/70 dark:text-white/70 text-sm"> + Ollama API Key (Can be left blank) + </p> + <Input + type="text" + placeholder="Ollama API Key" + value={config.ollamaApiKey} + isSaving={savingStates['ollamaApiKey']} + onChange={(e) => { + setConfig((prev) => ({ + ...prev!, + ollamaApiKey: e.target.value, + })); + }} + onSave={(value) => saveConfig('ollamaApiKey', value)} + /> + </div> + <div className="flex flex-col space-y-1"> <p className="text-black/70 dark:text-white/70 text-sm"> GROQ API Key diff --git a/src/lib/config.ts b/src/lib/config.ts index d885e13..79d69dc 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -31,6 +31,7 @@ interface Config { }; OLLAMA: { API_URL: string; + API_KEY: string; }; DEEPSEEK: { API_KEY: string; @@ -86,6 +87,8 @@ export const getSearxngApiEndpoint = () => export const getOllamaApiEndpoint = () => loadConfig().MODELS.OLLAMA.API_URL; +export const getOllamaApiKey = () => loadConfig().MODELS.OLLAMA.API_KEY; + export const getDeepseekApiKey = () => loadConfig().MODELS.DEEPSEEK.API_KEY; export const getAimlApiKey = () => loadConfig().MODELS.AIMLAPI.API_KEY; diff --git a/src/lib/providers/ollama.ts b/src/lib/providers/ollama.ts index d5c7899..cb0b848 100644 --- a/src/lib/providers/ollama.ts +++ b/src/lib/providers/ollama.ts @@ -1,5 +1,5 @@ import axios from 'axios'; -import { getKeepAlive, getOllamaApiEndpoint } from '../config'; +import { getKeepAlive, getOllamaApiEndpoint, getOllamaApiKey } from '../config'; import { ChatModel, EmbeddingModel } from '.'; export const PROVIDER_INFO = { @@ -11,6 +11,7 @@ import { OllamaEmbeddings } from '@langchain/ollama'; export const loadOllamaChatModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); + const ollamaApiKey = getOllamaApiKey(); if (!ollamaApiEndpoint) return {}; @@ -33,6 +34,9 @@ export const loadOllamaChatModels = async () => { model: model.model, temperature: 0.7, keepAlive: getKeepAlive(), + ...(ollamaApiKey + ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } } + : {}), }), }; }); @@ -46,6 +50,7 @@ export const loadOllamaChatModels = async () => { export const loadOllamaEmbeddingModels = async () => { const ollamaApiEndpoint = getOllamaApiEndpoint(); + const ollamaApiKey = getOllamaApiKey(); if (!ollamaApiEndpoint) return {}; @@ -66,6 +71,9 @@ export const loadOllamaEmbeddingModels = async () => { model: new OllamaEmbeddings({ baseUrl: ollamaApiEndpoint, model: model.model, + ...(ollamaApiKey + ? { headers: { Authorization: `Bearer ${ollamaApiKey}` } } + : {}), }), }; }); From 72f26b4370bd2b6206cbc5db37273920203aea8c Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 21 Aug 2025 17:47:49 +0530 Subject: [PATCH 146/147] feat(upload): save files uploaded after chat created --- src/app/api/chat/route.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 2d53b75..8798075 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -1,11 +1,7 @@ -import prompts from '@/lib/prompts'; -import MetaSearchAgent from '@/lib/search/metaSearchAgent'; import crypto from 'crypto'; import { AIMessage, BaseMessage, HumanMessage } from '@langchain/core/messages'; import { EventEmitter } from 'stream'; import { - chatModelProviders, - embeddingModelProviders, getAvailableChatModelProviders, getAvailableEmbeddingModelProviders, } from '@/lib/providers'; @@ -138,6 +134,8 @@ const handleHistorySave = async ( where: eq(chats.id, message.chatId), }); + const fileData = files.map(getFileDetails); + if (!chat) { await db .insert(chats) @@ -146,9 +144,16 @@ const handleHistorySave = async ( title: message.content, createdAt: new Date().toString(), focusMode: focusMode, - files: files.map(getFileDetails), + files: fileData, }) .execute(); + } else if (JSON.stringify(chat.files ?? []) != JSON.stringify(fileData)) { + db + .update(chats) + .set({ + files: files.map(getFileDetails), + }) + .where(eq(chats.id, message.chatId)); } const messageExists = await db.query.messages.findFirst({ From 8dc54efbdd3cac2da3092e2864dfd52bd5dc92d1 Mon Sep 17 00:00:00 2001 From: ItzCrazyKns <95534749+ItzCrazyKns@users.noreply.github.com> Date: Thu, 21 Aug 2025 17:48:55 +0530 Subject: [PATCH 147/147] feat(chat-route): lint & beautify --- src/app/api/chat/route.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/api/chat/route.ts b/src/app/api/chat/route.ts index 8798075..ba88da6 100644 --- a/src/app/api/chat/route.ts +++ b/src/app/api/chat/route.ts @@ -148,8 +148,7 @@ const handleHistorySave = async ( }) .execute(); } else if (JSON.stringify(chat.files ?? []) != JSON.stringify(fileData)) { - db - .update(chats) + db.update(chats) .set({ files: files.map(getFileDetails), })