diff --git a/VERSION b/VERSION index da44c7f3..3baec790 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.1.50 +1.1.51 diff --git a/scripts/test-claude-console-url.js b/scripts/test-claude-console-url.js new file mode 100755 index 00000000..868315b6 --- /dev/null +++ b/scripts/test-claude-console-url.js @@ -0,0 +1,28 @@ +#!/usr/bin/env node + +// 测试Claude Console账号URL处理 + +const testUrls = [ + 'https://api.example.com', + 'https://api.example.com/', + 'https://api.example.com/v1/messages', + 'https://api.example.com/v1/messages/', + 'https://api.example.com:8080', + 'https://api.example.com:8080/v1/messages' +]; + +console.log('🧪 Testing Claude Console URL handling:\n'); + +testUrls.forEach(url => { + // 模拟账号服务的URL处理逻辑 + const cleanUrl = url.replace(/\/$/, ''); // 移除末尾斜杠 + const apiEndpoint = cleanUrl.endsWith('/v1/messages') + ? cleanUrl + : `${cleanUrl}/v1/messages`; + + console.log(`Input: ${url}`); + console.log(`Output: ${apiEndpoint}`); + console.log('---'); +}); + +console.log('\n✅ URL normalization logic test completed'); \ No newline at end of file diff --git a/src/routes/admin.js b/src/routes/admin.js index e3d118e8..b0bd8dd3 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -1,6 +1,7 @@ const express = require('express'); const apiKeyService = require('../services/apiKeyService'); const claudeAccountService = require('../services/claudeAccountService'); +const claudeConsoleAccountService = require('../services/claudeConsoleAccountService'); const geminiAccountService = require('../services/geminiAccountService'); const redis = require('../models/redis'); const { authenticateAdmin } = require('../middleware/auth'); @@ -703,7 +704,8 @@ router.post('/claude-accounts', authenticateAdmin, async (req, res) => { refreshToken, claudeAiOauth, proxy, - accountType + accountType, + priority } = req.body; if (!name) { @@ -715,6 +717,11 @@ router.post('/claude-accounts', authenticateAdmin, async (req, res) => { return res.status(400).json({ error: 'Invalid account type. Must be "shared" or "dedicated"' }); } + // 验证priority的有效性 + if (priority !== undefined && (typeof priority !== 'number' || priority < 1 || priority > 100)) { + return res.status(400).json({ error: 'Priority must be a number between 1 and 100' }); + } + const newAccount = await claudeAccountService.createAccount({ name, description, @@ -723,7 +730,8 @@ router.post('/claude-accounts', authenticateAdmin, async (req, res) => { refreshToken, claudeAiOauth, proxy, - accountType: accountType || 'shared' // 默认为共享类型 + accountType: accountType || 'shared', // 默认为共享类型 + priority: priority || 50 // 默认优先级为50 }); logger.success(`🏢 Admin created new Claude account: ${name} (${accountType || 'shared'})`); @@ -740,6 +748,11 @@ router.put('/claude-accounts/:accountId', authenticateAdmin, async (req, res) => const { accountId } = req.params; const updates = req.body; + // 验证priority的有效性 + if (updates.priority !== undefined && (typeof updates.priority !== 'number' || updates.priority < 1 || updates.priority > 100)) { + return res.status(400).json({ error: 'Priority must be a number between 1 and 100' }); + } + await claudeAccountService.updateAccount(accountId, updates); logger.success(`📝 Admin updated Claude account: ${accountId}`); @@ -780,6 +793,198 @@ router.post('/claude-accounts/:accountId/refresh', authenticateAdmin, async (req } }); +// 切换Claude账户调度状态 +router.put('/claude-accounts/:accountId/toggle-schedulable', authenticateAdmin, async (req, res) => { + try { + const { accountId } = req.params; + + const accounts = await claudeAccountService.getAllAccounts(); + const account = accounts.find(acc => acc.id === accountId); + + if (!account) { + return res.status(404).json({ error: 'Account not found' }); + } + + const newSchedulable = !account.schedulable; + await claudeAccountService.updateAccount(accountId, { schedulable: newSchedulable }); + + logger.success(`🔄 Admin toggled Claude account schedulable status: ${accountId} -> ${newSchedulable ? 'schedulable' : 'not schedulable'}`); + res.json({ success: true, schedulable: newSchedulable }); + } catch (error) { + logger.error('❌ Failed to toggle Claude account schedulable status:', error); + res.status(500).json({ error: 'Failed to toggle schedulable status', message: error.message }); + } +}); + +// 🎮 Claude Console 账户管理 + +// 获取所有Claude Console账户 +router.get('/claude-console-accounts', authenticateAdmin, async (req, res) => { + try { + const accounts = await claudeConsoleAccountService.getAllAccounts(); + + // 为每个账户添加使用统计信息 + const accountsWithStats = await Promise.all(accounts.map(async (account) => { + try { + const usageStats = await redis.getAccountUsageStats(account.id); + return { + ...account, + usage: { + daily: usageStats.daily, + total: usageStats.total, + averages: usageStats.averages + } + }; + } catch (statsError) { + logger.warn(`⚠️ Failed to get usage stats for Claude Console account ${account.id}:`, statsError.message); + return { + ...account, + usage: { + daily: { tokens: 0, requests: 0, allTokens: 0 }, + total: { tokens: 0, requests: 0, allTokens: 0 }, + averages: { rpm: 0, tpm: 0 } + } + }; + } + })); + + res.json({ success: true, data: accountsWithStats }); + } catch (error) { + logger.error('❌ Failed to get Claude Console accounts:', error); + res.status(500).json({ error: 'Failed to get Claude Console accounts', message: error.message }); + } +}); + +// 创建新的Claude Console账户 +router.post('/claude-console-accounts', authenticateAdmin, async (req, res) => { + try { + const { + name, + description, + apiUrl, + apiKey, + priority, + supportedModels, + userAgent, + rateLimitDuration, + proxy, + accountType + } = req.body; + + if (!name || !apiUrl || !apiKey) { + return res.status(400).json({ error: 'Name, API URL and API Key are required' }); + } + + // 验证priority的有效性(1-100) + if (priority !== undefined && (priority < 1 || priority > 100)) { + return res.status(400).json({ error: 'Priority must be between 1 and 100' }); + } + + // 验证accountType的有效性 + if (accountType && !['shared', 'dedicated'].includes(accountType)) { + return res.status(400).json({ error: 'Invalid account type. Must be "shared" or "dedicated"' }); + } + + const newAccount = await claudeConsoleAccountService.createAccount({ + name, + description, + apiUrl, + apiKey, + priority: priority || 50, + supportedModels: supportedModels || [], + userAgent, + rateLimitDuration: rateLimitDuration || 60, + proxy, + accountType: accountType || 'shared' + }); + + logger.success(`🎮 Admin created Claude Console account: ${name}`); + res.json({ success: true, data: newAccount }); + } catch (error) { + logger.error('❌ Failed to create Claude Console account:', error); + res.status(500).json({ error: 'Failed to create Claude Console account', message: error.message }); + } +}); + +// 更新Claude Console账户 +router.put('/claude-console-accounts/:accountId', authenticateAdmin, async (req, res) => { + try { + const { accountId } = req.params; + const updates = req.body; + + // 验证priority的有效性(1-100) + if (updates.priority !== undefined && (updates.priority < 1 || updates.priority > 100)) { + return res.status(400).json({ error: 'Priority must be between 1 and 100' }); + } + + await claudeConsoleAccountService.updateAccount(accountId, updates); + + logger.success(`📝 Admin updated Claude Console account: ${accountId}`); + res.json({ success: true, message: 'Claude Console account updated successfully' }); + } catch (error) { + logger.error('❌ Failed to update Claude Console account:', error); + res.status(500).json({ error: 'Failed to update Claude Console account', message: error.message }); + } +}); + +// 删除Claude Console账户 +router.delete('/claude-console-accounts/:accountId', authenticateAdmin, async (req, res) => { + try { + const { accountId } = req.params; + + await claudeConsoleAccountService.deleteAccount(accountId); + + logger.success(`🗑️ Admin deleted Claude Console account: ${accountId}`); + res.json({ success: true, message: 'Claude Console account deleted successfully' }); + } catch (error) { + logger.error('❌ Failed to delete Claude Console account:', error); + res.status(500).json({ error: 'Failed to delete Claude Console account', message: error.message }); + } +}); + + +// 切换Claude Console账户状态 +router.put('/claude-console-accounts/:accountId/toggle', authenticateAdmin, async (req, res) => { + try { + const { accountId } = req.params; + + const account = await claudeConsoleAccountService.getAccount(accountId); + if (!account) { + return res.status(404).json({ error: 'Account not found' }); + } + + const newStatus = !account.isActive; + await claudeConsoleAccountService.updateAccount(accountId, { isActive: newStatus }); + + logger.success(`🔄 Admin toggled Claude Console account status: ${accountId} -> ${newStatus ? 'active' : 'inactive'}`); + res.json({ success: true, isActive: newStatus }); + } catch (error) { + logger.error('❌ Failed to toggle Claude Console account status:', error); + res.status(500).json({ error: 'Failed to toggle account status', message: error.message }); + } +}); + +// 切换Claude Console账户调度状态 +router.put('/claude-console-accounts/:accountId/toggle-schedulable', authenticateAdmin, async (req, res) => { + try { + const { accountId } = req.params; + + const account = await claudeConsoleAccountService.getAccount(accountId); + if (!account) { + return res.status(404).json({ error: 'Account not found' }); + } + + const newSchedulable = !account.schedulable; + await claudeConsoleAccountService.updateAccount(accountId, { schedulable: newSchedulable }); + + logger.success(`🔄 Admin toggled Claude Console account schedulable status: ${accountId} -> ${newSchedulable ? 'schedulable' : 'not schedulable'}`); + res.json({ success: true, schedulable: newSchedulable }); + } catch (error) { + logger.error('❌ Failed to toggle Claude Console account schedulable status:', error); + res.status(500).json({ error: 'Failed to toggle schedulable status', message: error.message }); + } +}); + // 🤖 Gemini 账户管理 // 生成 Gemini OAuth 授权 URL diff --git a/src/routes/api.js b/src/routes/api.js index 3027de5e..a9184db0 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -1,9 +1,12 @@ const express = require('express'); const claudeRelayService = require('../services/claudeRelayService'); +const claudeConsoleRelayService = require('../services/claudeConsoleRelayService'); +const unifiedClaudeScheduler = require('../services/unifiedClaudeScheduler'); const apiKeyService = require('../services/apiKeyService'); const { authenticateApiKey } = require('../middleware/auth'); const logger = require('../utils/logger'); const redis = require('../models/redis'); +const sessionHelper = require('../utils/sessionHelper'); const router = express.Router(); @@ -56,8 +59,17 @@ async function handleMessagesRequest(req, res) { let usageDataCaptured = false; - // 使用自定义流处理器来捕获usage数据 - await claudeRelayService.relayStreamRequestWithUsageCapture(req.body, req.apiKey, res, req.headers, (usageData) => { + // 生成会话哈希用于sticky会话 + const sessionHash = sessionHelper.generateSessionHash(req.body); + + // 使用统一调度选择账号(传递请求的模型) + const requestedModel = req.body.model; + const { accountId, accountType } = await unifiedClaudeScheduler.selectAccountForApiKey(req.apiKey, sessionHash, requestedModel); + + // 根据账号类型选择对应的转发服务并调用 + if (accountType === 'claude-official') { + // 官方Claude账号使用原有的转发服务(会自己选择账号) + await claudeRelayService.relayStreamRequestWithUsageCapture(req.body, req.apiKey, res, req.headers, (usageData) => { // 回调函数:当检测到完整usage数据时记录真实token使用量 logger.info('🎯 Usage callback triggered with complete data:', JSON.stringify(usageData, null, 2)); @@ -88,7 +100,42 @@ async function handleMessagesRequest(req, res) { } else { logger.warn('⚠️ Usage callback triggered but data is incomplete:', JSON.stringify(usageData)); } - }); + }); + } else { + // Claude Console账号使用Console转发服务(需要传递accountId) + await claudeConsoleRelayService.relayStreamRequestWithUsageCapture(req.body, req.apiKey, res, req.headers, (usageData) => { + // 回调函数:当检测到完整usage数据时记录真实token使用量 + logger.info('🎯 Usage callback triggered with complete data:', JSON.stringify(usageData, null, 2)); + + if (usageData && usageData.input_tokens !== undefined && usageData.output_tokens !== undefined) { + const inputTokens = usageData.input_tokens || 0; + const outputTokens = usageData.output_tokens || 0; + const cacheCreateTokens = usageData.cache_creation_input_tokens || 0; + const cacheReadTokens = usageData.cache_read_input_tokens || 0; + const model = usageData.model || 'unknown'; + + // 记录真实的token使用量(包含模型信息和所有4种token以及账户ID) + const usageAccountId = usageData.accountId; + apiKeyService.recordUsage(req.apiKey.id, inputTokens, outputTokens, cacheCreateTokens, cacheReadTokens, model, usageAccountId).catch(error => { + logger.error('❌ Failed to record stream usage:', error); + }); + + // 更新时间窗口内的token计数 + if (req.rateLimitInfo) { + const totalTokens = inputTokens + outputTokens + cacheCreateTokens + cacheReadTokens; + redis.getClient().incrby(req.rateLimitInfo.tokenCountKey, totalTokens).catch(error => { + logger.error('❌ Failed to update rate limit token count:', error); + }); + logger.api(`📊 Updated rate limit token count: +${totalTokens} tokens`); + } + + usageDataCaptured = true; + logger.api(`📊 Stream usage recorded (real) - Model: ${model}, Input: ${inputTokens}, Output: ${outputTokens}, Cache Create: ${cacheCreateTokens}, Cache Read: ${cacheReadTokens}, Total: ${inputTokens + outputTokens + cacheCreateTokens + cacheReadTokens} tokens`); + } else { + logger.warn('⚠️ Usage callback triggered but data is incomplete:', JSON.stringify(usageData)); + } + }, accountId); + } // 流式请求完成后 - 如果没有捕获到usage数据,记录警告但不进行估算 setTimeout(() => { @@ -103,7 +150,27 @@ async function handleMessagesRequest(req, res) { apiKeyName: req.apiKey.name }); - const response = await claudeRelayService.relayRequest(req.body, req.apiKey, req, res, req.headers); + // 生成会话哈希用于sticky会话 + const sessionHash = sessionHelper.generateSessionHash(req.body); + + // 使用统一调度选择账号(传递请求的模型) + const requestedModel = req.body.model; + const { accountId, accountType } = await unifiedClaudeScheduler.selectAccountForApiKey(req.apiKey, sessionHash, requestedModel); + + // 根据账号类型选择对应的转发服务 + let response; + logger.debug(`[DEBUG] Request query params: ${JSON.stringify(req.query)}`); + logger.debug(`[DEBUG] Request URL: ${req.url}`); + logger.debug(`[DEBUG] Request path: ${req.path}`); + + if (accountType === 'claude-official') { + // 官方Claude账号使用原有的转发服务 + response = await claudeRelayService.relayRequest(req.body, req.apiKey, req, res, req.headers); + } else { + // Claude Console账号使用Console转发服务 + logger.debug(`[DEBUG] Calling claudeConsoleRelayService.relayRequest with accountId: ${accountId}`); + response = await claudeConsoleRelayService.relayRequest(req.body, req.apiKey, req, res, req.headers, accountId); + } logger.info('📡 Claude API response received', { statusCode: response.statusCode, diff --git a/src/services/claudeAccountService.js b/src/services/claudeAccountService.js index 247236be..467aa5b1 100644 --- a/src/services/claudeAccountService.js +++ b/src/services/claudeAccountService.js @@ -37,7 +37,9 @@ class ClaudeAccountService { claudeAiOauth = null, // Claude标准格式的OAuth数据 proxy = null, // { type: 'socks5', host: 'localhost', port: 1080, username: '', password: '' } isActive = true, - accountType = 'shared' // 'dedicated' or 'shared' + accountType = 'shared', // 'dedicated' or 'shared' + priority = 50, // 调度优先级 (1-100,数字越小优先级越高) + schedulable = true // 是否可被调度 } = options; const accountId = uuidv4(); @@ -60,11 +62,13 @@ class ClaudeAccountService { proxy: proxy ? JSON.stringify(proxy) : '', isActive: isActive.toString(), accountType: accountType, // 账号类型:'dedicated' 或 'shared' + priority: priority.toString(), // 调度优先级 createdAt: new Date().toISOString(), lastUsedAt: '', lastRefreshAt: '', status: 'active', // 有OAuth数据的账户直接设为active - errorMessage: '' + errorMessage: '', + schedulable: schedulable.toString() // 是否可被调度 }; } else { // 兼容旧格式 @@ -81,11 +85,13 @@ class ClaudeAccountService { proxy: proxy ? JSON.stringify(proxy) : '', isActive: isActive.toString(), accountType: accountType, // 账号类型:'dedicated' 或 'shared' + priority: priority.toString(), // 调度优先级 createdAt: new Date().toISOString(), lastUsedAt: '', lastRefreshAt: '', status: 'created', // created, active, expired, error - errorMessage: '' + errorMessage: '', + schedulable: schedulable.toString() // 是否可被调度 }; } @@ -101,6 +107,7 @@ class ClaudeAccountService { isActive, proxy, accountType, + priority, status: accountData.status, createdAt: accountData.createdAt, expiresAt: accountData.expiresAt, @@ -305,6 +312,7 @@ class ClaudeAccountService { status: account.status, errorMessage: account.errorMessage, accountType: account.accountType || 'shared', // 兼容旧数据,默认为共享 + priority: parseInt(account.priority) || 50, // 兼容旧数据,默认优先级50 createdAt: account.createdAt, lastUsedAt: account.lastUsedAt, lastRefreshAt: account.lastRefreshAt, @@ -323,7 +331,9 @@ class ClaudeAccountService { progress: 0, remainingTime: null, lastRequestTime: null - } + }, + // 添加调度状态 + schedulable: account.schedulable !== 'false' // 默认为true,兼容历史数据 }; })); @@ -343,7 +353,7 @@ class ClaudeAccountService { throw new Error('Account not found'); } - const allowedUpdates = ['name', 'description', 'email', 'password', 'refreshToken', 'proxy', 'isActive', 'claudeAiOauth', 'accountType']; + const allowedUpdates = ['name', 'description', 'email', 'password', 'refreshToken', 'proxy', 'isActive', 'claudeAiOauth', 'accountType', 'priority', 'schedulable']; const updatedData = { ...accountData }; // 检查是否新增了 refresh token @@ -355,6 +365,8 @@ class ClaudeAccountService { updatedData[field] = this._encryptSensitiveData(value); } else if (field === 'proxy') { updatedData[field] = value ? JSON.stringify(value) : ''; + } else if (field === 'priority') { + updatedData[field] = value.toString(); } else if (field === 'claudeAiOauth') { // 更新 Claude AI OAuth 数据 if (value) { @@ -1008,7 +1020,7 @@ class ClaudeAccountService { } } - logger.success(`✅ Session window initialization completed:`); + logger.success('✅ Session window initialization completed:'); logger.success(` 📊 Total accounts: ${accounts.length}`); logger.success(` ✅ Initialized: ${initializedCount}`); logger.success(` ⏭️ Skipped (existing): ${skippedCount}`); diff --git a/src/services/claudeConsoleAccountService.js b/src/services/claudeConsoleAccountService.js new file mode 100644 index 00000000..a6b4072e --- /dev/null +++ b/src/services/claudeConsoleAccountService.js @@ -0,0 +1,493 @@ +const { v4: uuidv4 } = require('uuid'); +const crypto = require('crypto'); +const { SocksProxyAgent } = require('socks-proxy-agent'); +const { HttpsProxyAgent } = require('https-proxy-agent'); +const redis = require('../models/redis'); +const logger = require('../utils/logger'); +const config = require('../../config/config'); + +class ClaudeConsoleAccountService { + constructor() { + // 加密相关常量 + this.ENCRYPTION_ALGORITHM = 'aes-256-cbc'; + this.ENCRYPTION_SALT = 'claude-console-salt'; + + // Redis键前缀 + this.ACCOUNT_KEY_PREFIX = 'claude_console_account:'; + this.SHARED_ACCOUNTS_KEY = 'shared_claude_console_accounts'; + } + + // 🏢 创建Claude Console账户 + async createAccount(options = {}) { + const { + name = 'Claude Console Account', + description = '', + apiUrl = '', + apiKey = '', + priority = 50, // 默认优先级50(1-100) + supportedModels = [], // 支持的模型列表,空数组表示支持所有 + userAgent = 'claude-cli/1.0.61 (console, cli)', + rateLimitDuration = 60, // 限流时间(分钟) + proxy = null, + isActive = true, + accountType = 'shared', // 'dedicated' or 'shared' + schedulable = true // 是否可被调度 + } = options; + + // 验证必填字段 + if (!apiUrl || !apiKey) { + throw new Error('API URL and API Key are required for Claude Console account'); + } + + const accountId = uuidv4(); + + const accountData = { + id: accountId, + platform: 'claude-console', + name, + description, + apiUrl: apiUrl, + apiKey: this._encryptSensitiveData(apiKey), + priority: priority.toString(), + supportedModels: JSON.stringify(supportedModels), + userAgent, + rateLimitDuration: rateLimitDuration.toString(), + proxy: proxy ? JSON.stringify(proxy) : '', + isActive: isActive.toString(), + accountType, + createdAt: new Date().toISOString(), + lastUsedAt: '', + status: 'active', + errorMessage: '', + // 限流相关 + rateLimitedAt: '', + rateLimitStatus: '', + // 调度控制 + schedulable: schedulable.toString() + }; + + const client = redis.getClientSafe(); + logger.debug(`[DEBUG] Saving account data to Redis with key: ${this.ACCOUNT_KEY_PREFIX}${accountId}`); + logger.debug(`[DEBUG] Account data to save: ${JSON.stringify(accountData, null, 2)}`); + + await client.hset( + `${this.ACCOUNT_KEY_PREFIX}${accountId}`, + accountData + ); + + // 如果是共享账户,添加到共享账户集合 + if (accountType === 'shared') { + await client.sadd(this.SHARED_ACCOUNTS_KEY, accountId); + } + + logger.success(`🏢 Created Claude Console account: ${name} (${accountId})`); + + return { + id: accountId, + name, + description, + apiUrl, + priority, + supportedModels, + userAgent, + rateLimitDuration, + isActive, + proxy, + accountType, + status: 'active', + createdAt: accountData.createdAt + }; + } + + // 📋 获取所有Claude Console账户 + async getAllAccounts() { + try { + const client = redis.getClientSafe(); + const keys = await client.keys(`${this.ACCOUNT_KEY_PREFIX}*`); + const accounts = []; + + for (const key of keys) { + const accountData = await client.hgetall(key); + if (accountData && Object.keys(accountData).length > 0) { + // 获取限流状态信息 + const rateLimitInfo = this._getRateLimitInfo(accountData); + + accounts.push({ + id: accountData.id, + platform: accountData.platform, + name: accountData.name, + description: accountData.description, + apiUrl: accountData.apiUrl, + priority: parseInt(accountData.priority) || 50, + supportedModels: JSON.parse(accountData.supportedModels || '[]'), + userAgent: accountData.userAgent, + rateLimitDuration: parseInt(accountData.rateLimitDuration) || 60, + isActive: accountData.isActive === 'true', + proxy: accountData.proxy ? JSON.parse(accountData.proxy) : null, + accountType: accountData.accountType || 'shared', + status: accountData.status, + errorMessage: accountData.errorMessage, + createdAt: accountData.createdAt, + lastUsedAt: accountData.lastUsedAt, + rateLimitStatus: rateLimitInfo, + schedulable: accountData.schedulable !== 'false' // 默认为true,只有明确设置为false才不可调度 + }); + } + } + + return accounts; + } catch (error) { + logger.error('❌ Failed to get Claude Console accounts:', error); + throw error; + } + } + + // 🔍 获取单个账户(内部使用,包含敏感信息) + async getAccount(accountId) { + const client = redis.getClientSafe(); + logger.debug(`[DEBUG] Getting account data for ID: ${accountId}`); + const accountData = await client.hgetall(`${this.ACCOUNT_KEY_PREFIX}${accountId}`); + + if (!accountData || Object.keys(accountData).length === 0) { + logger.debug(`[DEBUG] No account data found for ID: ${accountId}`); + return null; + } + + logger.debug(`[DEBUG] Raw account data keys: ${Object.keys(accountData).join(', ')}`); + logger.debug(`[DEBUG] Raw supportedModels value: ${accountData.supportedModels}`); + + // 解密敏感字段(只解密apiKey,apiUrl不加密) + const decryptedKey = this._decryptSensitiveData(accountData.apiKey); + logger.debug(`[DEBUG] URL exists: ${!!accountData.apiUrl}, Decrypted key exists: ${!!decryptedKey}`); + + accountData.apiKey = decryptedKey; + + // 解析JSON字段 + const parsedModels = JSON.parse(accountData.supportedModels || '[]'); + logger.debug(`[DEBUG] Parsed supportedModels: ${JSON.stringify(parsedModels)}`); + + accountData.supportedModels = parsedModels; + accountData.priority = parseInt(accountData.priority) || 50; + accountData.rateLimitDuration = parseInt(accountData.rateLimitDuration) || 60; + accountData.isActive = accountData.isActive === 'true'; + accountData.schedulable = accountData.schedulable !== 'false'; // 默认为true + + if (accountData.proxy) { + accountData.proxy = JSON.parse(accountData.proxy); + } + + logger.debug(`[DEBUG] Final account data - name: ${accountData.name}, hasApiUrl: ${!!accountData.apiUrl}, hasApiKey: ${!!accountData.apiKey}, supportedModels: ${JSON.stringify(accountData.supportedModels)}`); + + return accountData; + } + + // 📝 更新账户 + async updateAccount(accountId, updates) { + try { + const existingAccount = await this.getAccount(accountId); + if (!existingAccount) { + throw new Error('Account not found'); + } + + const client = redis.getClientSafe(); + const updatedData = {}; + + // 处理各个字段的更新 + logger.debug(`[DEBUG] Update request received with fields: ${Object.keys(updates).join(', ')}`); + logger.debug(`[DEBUG] Updates content: ${JSON.stringify(updates, null, 2)}`); + + if (updates.name !== undefined) updatedData.name = updates.name; + if (updates.description !== undefined) updatedData.description = updates.description; + if (updates.apiUrl !== undefined) { + logger.debug(`[DEBUG] Updating apiUrl from frontend: ${updates.apiUrl}`); + updatedData.apiUrl = updates.apiUrl; + } + if (updates.apiKey !== undefined) { + logger.debug(`[DEBUG] Updating apiKey (length: ${updates.apiKey?.length})`); + updatedData.apiKey = this._encryptSensitiveData(updates.apiKey); + } + if (updates.priority !== undefined) updatedData.priority = updates.priority.toString(); + if (updates.supportedModels !== undefined) { + logger.debug(`[DEBUG] Updating supportedModels: ${JSON.stringify(updates.supportedModels)}`); + updatedData.supportedModels = JSON.stringify(updates.supportedModels); + } + if (updates.userAgent !== undefined) updatedData.userAgent = updates.userAgent; + if (updates.rateLimitDuration !== undefined) updatedData.rateLimitDuration = updates.rateLimitDuration.toString(); + if (updates.proxy !== undefined) updatedData.proxy = updates.proxy ? JSON.stringify(updates.proxy) : ''; + if (updates.isActive !== undefined) updatedData.isActive = updates.isActive.toString(); + if (updates.schedulable !== undefined) updatedData.schedulable = updates.schedulable.toString(); + + // 处理账户类型变更 + if (updates.accountType && updates.accountType !== existingAccount.accountType) { + updatedData.accountType = updates.accountType; + + if (updates.accountType === 'shared') { + await client.sadd(this.SHARED_ACCOUNTS_KEY, accountId); + } else { + await client.srem(this.SHARED_ACCOUNTS_KEY, accountId); + } + } + + updatedData.updatedAt = new Date().toISOString(); + + logger.debug(`[DEBUG] Final updatedData to save: ${JSON.stringify(updatedData, null, 2)}`); + logger.debug(`[DEBUG] Updating Redis key: ${this.ACCOUNT_KEY_PREFIX}${accountId}`); + + await client.hset( + `${this.ACCOUNT_KEY_PREFIX}${accountId}`, + updatedData + ); + + logger.success(`📝 Updated Claude Console account: ${accountId}`); + + return { success: true }; + } catch (error) { + logger.error('❌ Failed to update Claude Console account:', error); + throw error; + } + } + + // 🗑️ 删除账户 + async deleteAccount(accountId) { + try { + const client = redis.getClientSafe(); + const account = await this.getAccount(accountId); + + if (!account) { + throw new Error('Account not found'); + } + + // 从Redis删除 + await client.del(`${this.ACCOUNT_KEY_PREFIX}${accountId}`); + + // 从共享账户集合中移除 + if (account.accountType === 'shared') { + await client.srem(this.SHARED_ACCOUNTS_KEY, accountId); + } + + logger.success(`🗑️ Deleted Claude Console account: ${accountId}`); + + return { success: true }; + } catch (error) { + logger.error('❌ Failed to delete Claude Console account:', error); + throw error; + } + } + + + // 🚫 标记账号为限流状态 + async markAccountRateLimited(accountId) { + try { + const client = redis.getClientSafe(); + const account = await this.getAccount(accountId); + + if (!account) { + throw new Error('Account not found'); + } + + const updates = { + rateLimitedAt: new Date().toISOString(), + rateLimitStatus: 'limited' + }; + + await client.hset( + `${this.ACCOUNT_KEY_PREFIX}${accountId}`, + updates + ); + + logger.warn(`🚫 Claude Console account marked as rate limited: ${account.name} (${accountId})`); + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to mark Claude Console account as rate limited: ${accountId}`, error); + throw error; + } + } + + // ✅ 移除账号的限流状态 + async removeAccountRateLimit(accountId) { + try { + const client = redis.getClientSafe(); + + await client.hdel( + `${this.ACCOUNT_KEY_PREFIX}${accountId}`, + 'rateLimitedAt', + 'rateLimitStatus' + ); + + logger.success(`✅ Rate limit removed for Claude Console account: ${accountId}`); + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to remove rate limit for Claude Console account: ${accountId}`, error); + throw error; + } + } + + // 🔍 检查账号是否处于限流状态 + async isAccountRateLimited(accountId) { + try { + const account = await this.getAccount(accountId); + if (!account) { + return false; + } + + if (account.rateLimitStatus === 'limited' && account.rateLimitedAt) { + const rateLimitedAt = new Date(account.rateLimitedAt); + const now = new Date(); + const minutesSinceRateLimit = (now - rateLimitedAt) / (1000 * 60); + + // 使用账户配置的限流时间 + const rateLimitDuration = account.rateLimitDuration || 60; + + if (minutesSinceRateLimit >= rateLimitDuration) { + await this.removeAccountRateLimit(accountId); + return false; + } + + return true; + } + + return false; + } catch (error) { + logger.error(`❌ Failed to check rate limit status for Claude Console account: ${accountId}`, error); + return false; + } + } + + // 🚫 标记账号为封锁状态(模型不支持等原因) + async blockAccount(accountId, reason) { + try { + const client = redis.getClientSafe(); + + const updates = { + status: 'blocked', + errorMessage: reason, + blockedAt: new Date().toISOString() + }; + + await client.hset( + `${this.ACCOUNT_KEY_PREFIX}${accountId}`, + updates + ); + + logger.warn(`🚫 Claude Console account blocked: ${accountId} - ${reason}`); + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to block Claude Console account: ${accountId}`, error); + throw error; + } + } + + // 🌐 创建代理agent + _createProxyAgent(proxyConfig) { + if (!proxyConfig) { + return null; + } + + try { + const proxy = typeof proxyConfig === 'string' ? JSON.parse(proxyConfig) : proxyConfig; + + if (proxy.type === 'socks5') { + const auth = proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ''; + const socksUrl = `socks5://${auth}${proxy.host}:${proxy.port}`; + return new SocksProxyAgent(socksUrl); + } else if (proxy.type === 'http' || proxy.type === 'https') { + const auth = proxy.username && proxy.password ? `${proxy.username}:${proxy.password}@` : ''; + const httpUrl = `${proxy.type}://${auth}${proxy.host}:${proxy.port}`; + return new HttpsProxyAgent(httpUrl); + } + } catch (error) { + logger.warn('⚠️ Invalid proxy configuration:', error); + } + + return null; + } + + // 🔐 加密敏感数据 + _encryptSensitiveData(data) { + if (!data) return ''; + + try { + const key = this._generateEncryptionKey(); + const iv = crypto.randomBytes(16); + + const cipher = crypto.createCipheriv(this.ENCRYPTION_ALGORITHM, key, iv); + let encrypted = cipher.update(data, 'utf8', 'hex'); + encrypted += cipher.final('hex'); + + return iv.toString('hex') + ':' + encrypted; + } catch (error) { + logger.error('❌ Encryption error:', error); + return data; + } + } + + // 🔓 解密敏感数据 + _decryptSensitiveData(encryptedData) { + if (!encryptedData) return ''; + + try { + if (encryptedData.includes(':')) { + const parts = encryptedData.split(':'); + if (parts.length === 2) { + const key = this._generateEncryptionKey(); + const iv = Buffer.from(parts[0], 'hex'); + const encrypted = parts[1]; + + const decipher = crypto.createDecipheriv(this.ENCRYPTION_ALGORITHM, key, iv); + let decrypted = decipher.update(encrypted, 'hex', 'utf8'); + decrypted += decipher.final('utf8'); + return decrypted; + } + } + + return encryptedData; + } catch (error) { + logger.error('❌ Decryption error:', error); + return encryptedData; + } + } + + // 🔑 生成加密密钥 + _generateEncryptionKey() { + return crypto.scryptSync(config.security.encryptionKey, this.ENCRYPTION_SALT, 32); + } + + // 🎭 掩码API URL + _maskApiUrl(apiUrl) { + if (!apiUrl) return ''; + + try { + const url = new URL(apiUrl); + return `${url.protocol}//${url.hostname}/***`; + } catch { + return '***'; + } + } + + // 📊 获取限流信息 + _getRateLimitInfo(accountData) { + if (accountData.rateLimitStatus === 'limited' && accountData.rateLimitedAt) { + const rateLimitedAt = new Date(accountData.rateLimitedAt); + const now = new Date(); + const minutesSinceRateLimit = Math.floor((now - rateLimitedAt) / (1000 * 60)); + const rateLimitDuration = parseInt(accountData.rateLimitDuration) || 60; + const minutesRemaining = Math.max(0, rateLimitDuration - minutesSinceRateLimit); + + return { + isRateLimited: minutesRemaining > 0, + rateLimitedAt: accountData.rateLimitedAt, + minutesSinceRateLimit, + minutesRemaining + }; + } + + return { + isRateLimited: false, + rateLimitedAt: null, + minutesSinceRateLimit: 0, + minutesRemaining: 0 + }; + } +} + +module.exports = new ClaudeConsoleAccountService(); \ No newline at end of file diff --git a/src/services/claudeConsoleRelayService.js b/src/services/claudeConsoleRelayService.js new file mode 100644 index 00000000..71455151 --- /dev/null +++ b/src/services/claudeConsoleRelayService.js @@ -0,0 +1,496 @@ +const axios = require('axios'); +const claudeConsoleAccountService = require('./claudeConsoleAccountService'); +const logger = require('../utils/logger'); +const config = require('../../config/config'); + +class ClaudeConsoleRelayService { + constructor() { + this.defaultUserAgent = 'claude-cli/1.0.61 (console, cli)'; + } + + // 🚀 转发请求到Claude Console API + async relayRequest(requestBody, apiKeyData, clientRequest, clientResponse, clientHeaders, accountId, options = {}) { + let abortController = null; + + try { + // 获取账户信息 + const account = await claudeConsoleAccountService.getAccount(accountId); + if (!account) { + throw new Error('Claude Console Claude account not found'); + } + + logger.info(`📤 Processing Claude Console API request for key: ${apiKeyData.name || apiKeyData.id}, account: ${account.name} (${accountId})`); + logger.debug(`🌐 Account API URL: ${account.apiUrl}`); + logger.debug(`🔍 Account supportedModels: ${JSON.stringify(account.supportedModels)}`); + logger.debug(`🔑 Account has apiKey: ${!!account.apiKey}`); + logger.debug(`📝 Request model: ${requestBody.model}`); + + // 模型兼容性检查已经在调度器中完成,这里不需要再检查 + + // 创建代理agent + const proxyAgent = claudeConsoleAccountService._createProxyAgent(account.proxy); + + // 创建AbortController用于取消请求 + abortController = new AbortController(); + + // 设置客户端断开监听器 + const handleClientDisconnect = () => { + logger.info('🔌 Client disconnected, aborting Claude Console Claude request'); + if (abortController && !abortController.signal.aborted) { + abortController.abort(); + } + }; + + // 监听客户端断开事件 + if (clientRequest) { + clientRequest.once('close', handleClientDisconnect); + } + if (clientResponse) { + clientResponse.once('close', handleClientDisconnect); + } + + // 构建完整的API URL + const cleanUrl = account.apiUrl.replace(/\/$/, ''); // 移除末尾斜杠 + const apiEndpoint = cleanUrl.endsWith('/v1/messages') + ? cleanUrl + : `${cleanUrl}/v1/messages`; + + logger.debug(`🎯 Final API endpoint: ${apiEndpoint}`); + logger.debug(`[DEBUG] Options passed to relayRequest: ${JSON.stringify(options)}`); + logger.debug(`[DEBUG] Client headers received: ${JSON.stringify(clientHeaders)}`); + + // 过滤客户端请求头 + const filteredHeaders = this._filterClientHeaders(clientHeaders); + logger.debug(`[DEBUG] Filtered client headers: ${JSON.stringify(filteredHeaders)}`); + + // 准备请求配置 + const requestConfig = { + method: 'POST', + url: apiEndpoint, + data: requestBody, + headers: { + 'Content-Type': 'application/json', + 'x-api-key': account.apiKey, + 'anthropic-version': '2023-06-01', + 'User-Agent': account.userAgent || this.defaultUserAgent, + ...filteredHeaders + }, + httpsAgent: proxyAgent, + timeout: config.proxy.timeout || 60000, + signal: abortController.signal, + validateStatus: () => true // 接受所有状态码 + }; + + logger.debug(`[DEBUG] Initial headers before beta: ${JSON.stringify(requestConfig.headers, null, 2)}`); + + // 添加beta header如果需要 + if (options.betaHeader) { + logger.debug(`[DEBUG] Adding beta header: ${options.betaHeader}`); + requestConfig.headers['anthropic-beta'] = options.betaHeader; + } else { + logger.debug(`[DEBUG] No beta header to add`); + } + + // 发送请求 + logger.debug(`📤 Sending request to Claude Console API with headers:`, JSON.stringify(requestConfig.headers, null, 2)); + const response = await axios(requestConfig); + + // 移除监听器(请求成功完成) + if (clientRequest) { + clientRequest.removeListener('close', handleClientDisconnect); + } + if (clientResponse) { + clientResponse.removeListener('close', handleClientDisconnect); + } + + logger.debug(`🔗 Claude Console API response: ${response.status}`); + logger.debug(`[DEBUG] Response headers: ${JSON.stringify(response.headers)}`); + logger.debug(`[DEBUG] Response data type: ${typeof response.data}`); + logger.debug(`[DEBUG] Response data length: ${response.data ? (typeof response.data === 'string' ? response.data.length : JSON.stringify(response.data).length) : 0}`); + logger.debug(`[DEBUG] Response data preview: ${typeof response.data === 'string' ? response.data.substring(0, 200) : JSON.stringify(response.data).substring(0, 200)}`); + + // 检查是否为限流错误 + if (response.status === 429) { + logger.warn(`🚫 Rate limit detected for Claude Console account ${accountId}`); + await claudeConsoleAccountService.markAccountRateLimited(accountId); + } else if (response.status === 200 || response.status === 201) { + // 如果请求成功,检查并移除限流状态 + const isRateLimited = await claudeConsoleAccountService.isAccountRateLimited(accountId); + if (isRateLimited) { + await claudeConsoleAccountService.removeAccountRateLimit(accountId); + } + } + + // 更新最后使用时间 + await this._updateLastUsedTime(accountId); + + const responseBody = typeof response.data === 'string' ? response.data : JSON.stringify(response.data); + logger.debug(`[DEBUG] Final response body to return: ${responseBody}`); + + return { + statusCode: response.status, + headers: response.headers, + body: responseBody, + accountId + }; + + } catch (error) { + // 处理特定错误 + if (error.name === 'AbortError' || error.code === 'ECONNABORTED') { + logger.info('Request aborted due to client disconnect'); + throw new Error('Client disconnected'); + } + + logger.error('❌ Claude Console Claude relay request failed:', error.message); + + // 不再因为模型不支持而block账号 + + throw error; + } + } + + // 🌊 处理流式响应 + async relayStreamRequestWithUsageCapture(requestBody, apiKeyData, responseStream, clientHeaders, usageCallback, accountId, streamTransformer = null, options = {}) { + try { + // 获取账户信息 + const account = await claudeConsoleAccountService.getAccount(accountId); + if (!account) { + throw new Error('Claude Console Claude account not found'); + } + + logger.info(`📡 Processing streaming Claude Console API request for key: ${apiKeyData.name || apiKeyData.id}, account: ${account.name} (${accountId})`); + logger.debug(`🌐 Account API URL: ${account.apiUrl}`); + + // 模型兼容性检查已经在调度器中完成,这里不需要再检查 + + // 创建代理agent + const proxyAgent = claudeConsoleAccountService._createProxyAgent(account.proxy); + + // 发送流式请求 + await this._makeClaudeConsoleStreamRequest( + requestBody, + account, + proxyAgent, + clientHeaders, + responseStream, + accountId, + usageCallback, + streamTransformer, + options + ); + + // 更新最后使用时间 + await this._updateLastUsedTime(accountId); + + } catch (error) { + logger.error('❌ Claude Console Claude stream relay failed:', error); + throw error; + } + } + + // 🌊 发送流式请求到Claude Console API + async _makeClaudeConsoleStreamRequest(body, account, proxyAgent, clientHeaders, responseStream, accountId, usageCallback, streamTransformer = null, requestOptions = {}) { + return new Promise((resolve, reject) => { + let aborted = false; + + // 构建完整的API URL + const cleanUrl = account.apiUrl.replace(/\/$/, ''); // 移除末尾斜杠 + const apiEndpoint = cleanUrl.endsWith('/v1/messages') + ? cleanUrl + : `${cleanUrl}/v1/messages`; + + logger.debug(`🎯 Final API endpoint for stream: ${apiEndpoint}`); + + // 准备请求配置 + const requestConfig = { + method: 'POST', + url: apiEndpoint, + data: body, + headers: { + 'Content-Type': 'application/json', + 'x-api-key': account.apiKey, + 'anthropic-version': '2023-06-01', + 'User-Agent': account.userAgent || this.defaultUserAgent, + ...this._filterClientHeaders(clientHeaders) + }, + httpsAgent: proxyAgent, + timeout: config.proxy.timeout || 60000, + responseType: 'stream' + }; + + // 添加beta header如果需要 + if (requestOptions.betaHeader) { + requestConfig.headers['anthropic-beta'] = requestOptions.betaHeader; + } + + // 发送请求 + const request = axios(requestConfig); + + request.then(response => { + logger.debug(`🌊 Claude Console Claude stream response status: ${response.status}`); + + // 错误响应处理 + if (response.status !== 200) { + logger.error(`❌ Claude Console API returned error status: ${response.status}`); + + if (response.status === 429) { + claudeConsoleAccountService.markAccountRateLimited(accountId); + } + + // 收集错误数据 + let errorData = ''; + response.data.on('data', chunk => { + errorData += chunk.toString(); + }); + + response.data.on('end', () => { + if (!responseStream.destroyed) { + responseStream.write('event: error\n'); + responseStream.write(`data: ${JSON.stringify({ + error: 'Claude Console API error', + status: response.status, + details: errorData, + timestamp: new Date().toISOString() + })}\n\n`); + responseStream.end(); + } + reject(new Error(`Claude Console API error: ${response.status}`)); + }); + return; + } + + // 成功响应,检查并移除限流状态 + claudeConsoleAccountService.isAccountRateLimited(accountId).then(isRateLimited => { + if (isRateLimited) { + claudeConsoleAccountService.removeAccountRateLimit(accountId); + } + }); + + // 设置响应头 + if (!responseStream.headersSent) { + responseStream.writeHead(200, { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + 'Connection': 'keep-alive', + 'X-Accel-Buffering': 'no' + }); + } + + let buffer = ''; + let finalUsageReported = false; + let collectedUsageData = {}; + + // 处理流数据 + response.data.on('data', chunk => { + try { + if (aborted) return; + + const chunkStr = chunk.toString(); + buffer += chunkStr; + + // 处理完整的SSE行 + const lines = buffer.split('\n'); + buffer = lines.pop() || ''; + + // 转发数据并解析usage + if (lines.length > 0 && !responseStream.destroyed) { + const linesToForward = lines.join('\n') + (lines.length > 0 ? '\n' : ''); + + // 应用流转换器如果有 + if (streamTransformer) { + const transformed = streamTransformer(linesToForward); + if (transformed) { + responseStream.write(transformed); + } + } else { + responseStream.write(linesToForward); + } + + // 解析SSE数据寻找usage信息 + for (const line of lines) { + if (line.startsWith('data: ') && line.length > 6) { + try { + const jsonStr = line.slice(6); + const data = JSON.parse(jsonStr); + + // 收集usage数据 + if (data.type === 'message_start' && data.message && data.message.usage) { + collectedUsageData.input_tokens = data.message.usage.input_tokens || 0; + collectedUsageData.cache_creation_input_tokens = data.message.usage.cache_creation_input_tokens || 0; + collectedUsageData.cache_read_input_tokens = data.message.usage.cache_read_input_tokens || 0; + collectedUsageData.model = data.message.model; + } + + if (data.type === 'message_delta' && data.usage && data.usage.output_tokens !== undefined) { + collectedUsageData.output_tokens = data.usage.output_tokens || 0; + + if (collectedUsageData.input_tokens !== undefined && !finalUsageReported) { + usageCallback({ ...collectedUsageData, accountId }); + finalUsageReported = true; + } + } + + // 不再因为模型不支持而block账号 + } catch (e) { + // 忽略解析错误 + } + } + } + } + } catch (error) { + logger.error('❌ Error processing Claude Console stream data:', error); + if (!responseStream.destroyed) { + responseStream.write('event: error\n'); + responseStream.write(`data: ${JSON.stringify({ + error: 'Stream processing error', + message: error.message, + timestamp: new Date().toISOString() + })}\n\n`); + } + } + }); + + response.data.on('end', () => { + try { + // 处理缓冲区中剩余的数据 + if (buffer.trim() && !responseStream.destroyed) { + if (streamTransformer) { + const transformed = streamTransformer(buffer); + if (transformed) { + responseStream.write(transformed); + } + } else { + responseStream.write(buffer); + } + } + + // 确保流正确结束 + if (!responseStream.destroyed) { + responseStream.end(); + } + + logger.debug('🌊 Claude Console Claude stream response completed'); + resolve(); + } catch (error) { + logger.error('❌ Error processing stream end:', error); + reject(error); + } + }); + + response.data.on('error', error => { + logger.error('❌ Claude Console stream error:', error); + if (!responseStream.destroyed) { + responseStream.write('event: error\n'); + responseStream.write(`data: ${JSON.stringify({ + error: 'Stream error', + message: error.message, + timestamp: new Date().toISOString() + })}\n\n`); + responseStream.end(); + } + reject(error); + }); + + }).catch(error => { + if (aborted) return; + + logger.error('❌ Claude Console Claude stream request error:', error.message); + + // 检查是否是429错误 + if (error.response && error.response.status === 429) { + claudeConsoleAccountService.markAccountRateLimited(accountId); + } + + // 发送错误响应 + if (!responseStream.headersSent) { + responseStream.writeHead(error.response?.status || 500, { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + 'Connection': 'keep-alive' + }); + } + + if (!responseStream.destroyed) { + responseStream.write('event: error\n'); + responseStream.write(`data: ${JSON.stringify({ + error: error.message, + code: error.code, + timestamp: new Date().toISOString() + })}\n\n`); + responseStream.end(); + } + + reject(error); + }); + + // 处理客户端断开连接 + responseStream.on('close', () => { + logger.debug('🔌 Client disconnected, cleaning up Claude Console stream'); + aborted = true; + }); + }); + } + + // 🔧 过滤客户端请求头 + _filterClientHeaders(clientHeaders) { + const sensitiveHeaders = [ + 'x-api-key', + 'authorization', + 'host', + 'content-length', + 'connection', + 'proxy-authorization', + 'content-encoding', + 'transfer-encoding' + ]; + + const filteredHeaders = {}; + + Object.keys(clientHeaders || {}).forEach(key => { + const lowerKey = key.toLowerCase(); + if (!sensitiveHeaders.includes(lowerKey)) { + filteredHeaders[key] = clientHeaders[key]; + } + }); + + return filteredHeaders; + } + + // 🕐 更新最后使用时间 + async _updateLastUsedTime(accountId) { + try { + const client = require('../models/redis').getClientSafe(); + await client.hset( + `claude_console_account:${accountId}`, + 'lastUsedAt', + new Date().toISOString() + ); + } catch (error) { + logger.warn(`⚠️ Failed to update last used time for Claude Console account ${accountId}:`, error.message); + } + } + + // 🎯 健康检查 + async healthCheck() { + try { + const accounts = await claudeConsoleAccountService.getAllAccounts(); + const activeAccounts = accounts.filter(acc => acc.isActive && acc.status === 'active'); + + return { + healthy: activeAccounts.length > 0, + activeAccounts: activeAccounts.length, + totalAccounts: accounts.length, + timestamp: new Date().toISOString() + }; + } catch (error) { + logger.error('❌ Claude Console Claude health check failed:', error); + return { + healthy: false, + error: error.message, + timestamp: new Date().toISOString() + }; + } + } +} + +module.exports = new ClaudeConsoleRelayService(); \ No newline at end of file diff --git a/src/services/unifiedClaudeScheduler.js b/src/services/unifiedClaudeScheduler.js new file mode 100644 index 00000000..a961782d --- /dev/null +++ b/src/services/unifiedClaudeScheduler.js @@ -0,0 +1,319 @@ +const claudeAccountService = require('./claudeAccountService'); +const claudeConsoleAccountService = require('./claudeConsoleAccountService'); +const redis = require('../models/redis'); +const logger = require('../utils/logger'); + +class UnifiedClaudeScheduler { + constructor() { + this.SESSION_MAPPING_PREFIX = 'unified_claude_session_mapping:'; + } + + // 🎯 统一调度Claude账号(官方和Console) + async selectAccountForApiKey(apiKeyData, sessionHash = null, requestedModel = null) { + try { + // 如果API Key绑定了专属账户,优先使用 + if (apiKeyData.claudeAccountId) { + const boundAccount = await redis.getClaudeAccount(apiKeyData.claudeAccountId); + if (boundAccount && boundAccount.isActive === 'true' && boundAccount.status !== 'error') { + logger.info(`🎯 Using bound dedicated Claude account: ${boundAccount.name} (${apiKeyData.claudeAccountId}) for API key ${apiKeyData.name}`); + return { + accountId: apiKeyData.claudeAccountId, + accountType: 'claude-official' + }; + } else { + logger.warn(`⚠️ Bound Claude account ${apiKeyData.claudeAccountId} is not available, falling back to pool`); + } + } + + // 如果有会话哈希,检查是否有已映射的账户 + if (sessionHash) { + const mappedAccount = await this._getSessionMapping(sessionHash); + if (mappedAccount) { + // 验证映射的账户是否仍然可用 + const isAvailable = await this._isAccountAvailable(mappedAccount.accountId, mappedAccount.accountType); + if (isAvailable) { + logger.info(`🎯 Using sticky session account: ${mappedAccount.accountId} (${mappedAccount.accountType}) for session ${sessionHash}`); + return mappedAccount; + } else { + logger.warn(`⚠️ Mapped account ${mappedAccount.accountId} is no longer available, selecting new account`); + await this._deleteSessionMapping(sessionHash); + } + } + } + + // 获取所有可用账户(传递请求的模型进行过滤) + const availableAccounts = await this._getAllAvailableAccounts(apiKeyData, requestedModel); + + if (availableAccounts.length === 0) { + // 提供更详细的错误信息 + if (requestedModel) { + throw new Error(`No available Claude accounts support the requested model: ${requestedModel}`); + } else { + throw new Error('No available Claude accounts (neither official nor console)'); + } + } + + // 按优先级和最后使用时间排序 + const sortedAccounts = this._sortAccountsByPriority(availableAccounts); + + // 选择第一个账户 + const selectedAccount = sortedAccounts[0]; + + // 如果有会话哈希,建立新的映射 + if (sessionHash) { + await this._setSessionMapping(sessionHash, selectedAccount.accountId, selectedAccount.accountType); + logger.info(`🎯 Created new sticky session mapping: ${selectedAccount.name} (${selectedAccount.accountId}, ${selectedAccount.accountType}) for session ${sessionHash}`); + } + + logger.info(`🎯 Selected account: ${selectedAccount.name} (${selectedAccount.accountId}, ${selectedAccount.accountType}) with priority ${selectedAccount.priority} for API key ${apiKeyData.name}`); + + return { + accountId: selectedAccount.accountId, + accountType: selectedAccount.accountType + }; + } catch (error) { + logger.error('❌ Failed to select account for API key:', error); + throw error; + } + } + + // 📋 获取所有可用账户(合并官方和Console) + async _getAllAvailableAccounts(apiKeyData, requestedModel = null) { + const availableAccounts = []; + + // 如果API Key绑定了专属Claude账户,优先返回 + if (apiKeyData.claudeAccountId) { + const boundAccount = await redis.getClaudeAccount(apiKeyData.claudeAccountId); + if (boundAccount && boundAccount.isActive === 'true' && boundAccount.status !== 'error' && boundAccount.status !== 'blocked') { + const isRateLimited = await claudeAccountService.isAccountRateLimited(boundAccount.id); + if (!isRateLimited) { + logger.info(`🎯 Using bound dedicated Claude account: ${boundAccount.name} (${apiKeyData.claudeAccountId})`); + return [{ + ...boundAccount, + accountId: boundAccount.id, + accountType: 'claude-official', + priority: parseInt(boundAccount.priority) || 50, + lastUsedAt: boundAccount.lastUsedAt || '0' + }]; + } + } else { + logger.warn(`⚠️ Bound Claude account ${apiKeyData.claudeAccountId} is not available`); + } + } + + // 获取官方Claude账户(共享池) + const claudeAccounts = await redis.getAllClaudeAccounts(); + for (const account of claudeAccounts) { + if (account.isActive === 'true' && + account.status !== 'error' && + account.status !== 'blocked' && + (account.accountType === 'shared' || !account.accountType) && // 兼容旧数据 + account.schedulable !== 'false') { // 检查是否可调度 + + // 检查是否被限流 + const isRateLimited = await claudeAccountService.isAccountRateLimited(account.id); + if (!isRateLimited) { + availableAccounts.push({ + ...account, + accountId: account.id, + accountType: 'claude-official', + priority: parseInt(account.priority) || 50, // 默认优先级50 + lastUsedAt: account.lastUsedAt || '0' + }); + } + } + } + + // 获取Claude Console账户 + const consoleAccounts = await claudeConsoleAccountService.getAllAccounts(); + logger.info(`📋 Found ${consoleAccounts.length} total Claude Console accounts`); + + for (const account of consoleAccounts) { + logger.info(`🔍 Checking Claude Console account: ${account.name} - isActive: ${account.isActive}, status: ${account.status}, accountType: ${account.accountType}, schedulable: ${account.schedulable}`); + + // 注意:getAllAccounts返回的isActive是布尔值 + if (account.isActive === true && + account.status === 'active' && + account.accountType === 'shared' && + account.schedulable !== false) { // 检查是否可调度 + + // 检查模型支持(如果有请求的模型) + if (requestedModel && account.supportedModels && account.supportedModels.length > 0) { + if (!account.supportedModels.includes(requestedModel)) { + logger.info(`🚫 Claude Console account ${account.name} does not support model ${requestedModel}`); + continue; + } + } + + // 检查是否被限流 + const isRateLimited = await claudeConsoleAccountService.isAccountRateLimited(account.id); + if (!isRateLimited) { + availableAccounts.push({ + ...account, + accountId: account.id, + accountType: 'claude-console', + priority: parseInt(account.priority) || 50, + lastUsedAt: account.lastUsedAt || '0' + }); + logger.info(`✅ Added Claude Console account to available pool: ${account.name} (priority: ${account.priority})`); + } else { + logger.warn(`⚠️ Claude Console account ${account.name} is rate limited`); + } + } else { + logger.info(`❌ Claude Console account ${account.name} not eligible - isActive: ${account.isActive}, status: ${account.status}, accountType: ${account.accountType}, schedulable: ${account.schedulable}`); + } + } + + logger.info(`📊 Total available accounts: ${availableAccounts.length} (Claude: ${availableAccounts.filter(a => a.accountType === 'claude-official').length}, Console: ${availableAccounts.filter(a => a.accountType === 'claude-console').length})`); + return availableAccounts; + } + + // 🔢 按优先级和最后使用时间排序账户 + _sortAccountsByPriority(accounts) { + return accounts.sort((a, b) => { + // 首先按优先级排序(数字越小优先级越高) + if (a.priority !== b.priority) { + return a.priority - b.priority; + } + + // 优先级相同时,按最后使用时间排序(最久未使用的优先) + const aLastUsed = new Date(a.lastUsedAt || 0).getTime(); + const bLastUsed = new Date(b.lastUsedAt || 0).getTime(); + return aLastUsed - bLastUsed; + }); + } + + // 🔍 检查账户是否可用 + async _isAccountAvailable(accountId, accountType) { + try { + if (accountType === 'claude-official') { + const account = await redis.getClaudeAccount(accountId); + if (!account || account.isActive !== 'true' || account.status === 'error') { + return false; + } + // 检查是否可调度 + if (account.schedulable === 'false') { + logger.info(`🚫 Account ${accountId} is not schedulable`); + return false; + } + return !(await claudeAccountService.isAccountRateLimited(accountId)); + } else if (accountType === 'claude-console') { + const account = await claudeConsoleAccountService.getAccount(accountId); + if (!account || !account.isActive || account.status !== 'active') { + return false; + } + // 检查是否可调度 + if (account.schedulable === false) { + logger.info(`🚫 Claude Console account ${accountId} is not schedulable`); + return false; + } + return !(await claudeConsoleAccountService.isAccountRateLimited(accountId)); + } + return false; + } catch (error) { + logger.warn(`⚠️ Failed to check account availability: ${accountId}`, error); + return false; + } + } + + // 🔗 获取会话映射 + async _getSessionMapping(sessionHash) { + const client = redis.getClientSafe(); + const mappingData = await client.get(`${this.SESSION_MAPPING_PREFIX}${sessionHash}`); + + if (mappingData) { + try { + return JSON.parse(mappingData); + } catch (error) { + logger.warn('⚠️ Failed to parse session mapping:', error); + return null; + } + } + + return null; + } + + // 💾 设置会话映射 + async _setSessionMapping(sessionHash, accountId, accountType) { + const client = redis.getClientSafe(); + const mappingData = JSON.stringify({ accountId, accountType }); + + // 设置1小时过期 + await client.setex( + `${this.SESSION_MAPPING_PREFIX}${sessionHash}`, + 3600, + mappingData + ); + } + + // 🗑️ 删除会话映射 + async _deleteSessionMapping(sessionHash) { + const client = redis.getClientSafe(); + await client.del(`${this.SESSION_MAPPING_PREFIX}${sessionHash}`); + } + + // 🚫 标记账户为限流状态 + async markAccountRateLimited(accountId, accountType, sessionHash = null) { + try { + if (accountType === 'claude-official') { + await claudeAccountService.markAccountRateLimited(accountId, sessionHash); + } else if (accountType === 'claude-console') { + await claudeConsoleAccountService.markAccountRateLimited(accountId); + } + + // 删除会话映射 + if (sessionHash) { + await this._deleteSessionMapping(sessionHash); + } + + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to mark account as rate limited: ${accountId} (${accountType})`, error); + throw error; + } + } + + // ✅ 移除账户的限流状态 + async removeAccountRateLimit(accountId, accountType) { + try { + if (accountType === 'claude-official') { + await claudeAccountService.removeAccountRateLimit(accountId); + } else if (accountType === 'claude-console') { + await claudeConsoleAccountService.removeAccountRateLimit(accountId); + } + + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to remove rate limit for account: ${accountId} (${accountType})`, error); + throw error; + } + } + + // 🔍 检查账户是否处于限流状态 + async isAccountRateLimited(accountId, accountType) { + try { + if (accountType === 'claude-official') { + return await claudeAccountService.isAccountRateLimited(accountId); + } else if (accountType === 'claude-console') { + return await claudeConsoleAccountService.isAccountRateLimited(accountId); + } + return false; + } catch (error) { + logger.error(`❌ Failed to check rate limit status: ${accountId} (${accountType})`, error); + return false; + } + } + + // 🚫 标记Claude Console账户为封锁状态(模型不支持) + async blockConsoleAccount(accountId, reason) { + try { + await claudeConsoleAccountService.blockAccount(accountId, reason); + return { success: true }; + } catch (error) { + logger.error(`❌ Failed to block console account: ${accountId}`, error); + throw error; + } + } +} + +module.exports = new UnifiedClaudeScheduler(); \ No newline at end of file diff --git a/web/admin-spa/dist/assets/AccountsView-B3VuC3-p.js b/web/admin-spa/dist/assets/AccountsView-B3VuC3-p.js new file mode 100644 index 00000000..d0c60d61 --- /dev/null +++ b/web/admin-spa/dist/assets/AccountsView-B3VuC3-p.js @@ -0,0 +1,15 @@ +import{r as T,aR as Te,o as O,V as Ae,x as u,y as i,z as e,L as $,K as w,al as xe,aY as te,aX as we,aq as j,aZ as Ue,C as G,O as h,c as se,P as U,I as le,a5 as ke,R as ne,an as H,u as W,q as Ve,Y as Ie,Q as je,ac as Se,B as ve}from"./vue-vendor-CKToUHZx.js";import{s as V}from"./toast-BvwA7Mwb.js";import{a as K,_ as Me}from"./index-hS0iOrU-.js";import"./element-plus-B8Fs_0jW.js";import"./vendor-BDiMbLwQ.js";const oe=T(!1),ye=T({title:"",message:"",confirmText:"继续",cancelText:"取消"}),J=T(null);function he(){return{showConfirmModal:oe,confirmOptions:ye,showConfirm:(g,d,S="继续",I="取消")=>new Promise(C=>{ye.value={title:g,message:d,confirmText:S,cancelText:I},J.value=C,oe.value=!0}),handleConfirm:()=>{oe.value=!1,J.value&&(J.value(!0),J.value=null)},handleCancel:()=>{oe.value=!1,J.value&&(J.value(!1),J.value=null)}}}const $e=Te("accounts",()=>{const L=T([]),E=T([]),m=T([]),g=T(!1),d=T(null),S=T(""),I=T("asc"),C=async()=>{g.value=!0,d.value=null;try{const x=await K.get("/admin/claude-accounts");if(x.success)L.value=x.data||[];else throw new Error(x.message||"获取Claude账户失败")}catch(x){throw d.value=x.message,x}finally{g.value=!1}},A=async()=>{g.value=!0,d.value=null;try{const x=await K.get("/admin/claude-console-accounts");if(x.success)E.value=x.data||[];else throw new Error(x.message||"获取Claude Console账户失败")}catch(x){throw d.value=x.message,x}finally{g.value=!1}},y=async()=>{g.value=!0,d.value=null;try{const x=await K.get("/admin/gemini-accounts");if(x.success)m.value=x.data||[];else throw new Error(x.message||"获取Gemini账户失败")}catch(x){throw d.value=x.message,x}finally{g.value=!1}};return{claudeAccounts:L,claudeConsoleAccounts:E,geminiAccounts:m,loading:g,error:d,sortBy:S,sortOrder:I,fetchClaudeAccounts:C,fetchClaudeConsoleAccounts:A,fetchGeminiAccounts:y,fetchAllAccounts:async()=>{g.value=!0,d.value=null;try{await Promise.all([C(),A(),y()])}catch(x){throw d.value=x.message,x}finally{g.value=!1}},createClaudeAccount:async x=>{g.value=!0,d.value=null;try{const c=await K.post("/admin/claude-accounts",x);if(c.success)return await C(),c.data;throw new Error(c.message||"创建Claude账户失败")}catch(c){throw d.value=c.message,c}finally{g.value=!1}},createClaudeConsoleAccount:async x=>{g.value=!0,d.value=null;try{const c=await K.post("/admin/claude-console-accounts",x);if(c.success)return await A(),c.data;throw new Error(c.message||"创建Claude Console账户失败")}catch(c){throw d.value=c.message,c}finally{g.value=!1}},createGeminiAccount:async x=>{g.value=!0,d.value=null;try{const c=await K.post("/admin/gemini-accounts",x);if(c.success)return await y(),c.data;throw new Error(c.message||"创建Gemini账户失败")}catch(c){throw d.value=c.message,c}finally{g.value=!1}},updateClaudeAccount:async(x,c)=>{g.value=!0,d.value=null;try{const b=await K.put(`/admin/claude-accounts/${x}`,c);if(b.success)return await C(),b;throw new Error(b.message||"更新Claude账户失败")}catch(b){throw d.value=b.message,b}finally{g.value=!1}},updateClaudeConsoleAccount:async(x,c)=>{g.value=!0,d.value=null;try{const b=await K.put(`/admin/claude-console-accounts/${x}`,c);if(b.success)return await A(),b;throw new Error(b.message||"更新Claude Console账户失败")}catch(b){throw d.value=b.message,b}finally{g.value=!1}},updateGeminiAccount:async(x,c)=>{g.value=!0,d.value=null;try{const b=await K.put(`/admin/gemini-accounts/${x}`,c);if(b.success)return await y(),b;throw new Error(b.message||"更新Gemini账户失败")}catch(b){throw d.value=b.message,b}finally{g.value=!1}},toggleAccount:async(x,c)=>{g.value=!0,d.value=null;try{let b;x==="claude"?b=`/admin/claude-accounts/${c}/toggle`:x==="claude-console"?b=`/admin/claude-console-accounts/${c}/toggle`:b=`/admin/gemini-accounts/${c}/toggle`;const q=await K.put(b);if(q.success)return x==="claude"?await C():x==="claude-console"?await A():await y(),q;throw new Error(q.message||"切换状态失败")}catch(b){throw d.value=b.message,b}finally{g.value=!1}},deleteAccount:async(x,c)=>{g.value=!0,d.value=null;try{let b;x==="claude"?b=`/admin/claude-accounts/${c}`:x==="claude-console"?b=`/admin/claude-console-accounts/${c}`:b=`/admin/gemini-accounts/${c}`;const q=await K.delete(b);if(q.success)return x==="claude"?await C():x==="claude-console"?await A():await y(),q;throw new Error(q.message||"删除失败")}catch(b){throw d.value=b.message,b}finally{g.value=!1}},refreshClaudeToken:async x=>{g.value=!0,d.value=null;try{const c=await K.post(`/admin/claude-accounts/${x}/refresh`);if(c.success)return await C(),c;throw new Error(c.message||"Token刷新失败")}catch(c){throw d.value=c.message,c}finally{g.value=!1}},generateClaudeAuthUrl:async x=>{try{const c=await K.post("/admin/claude-accounts/generate-auth-url",x);if(c.success)return c.data;throw new Error(c.message||"生成授权URL失败")}catch(c){throw d.value=c.message,c}},exchangeClaudeCode:async x=>{try{const c=await K.post("/admin/claude-accounts/exchange-code",x);if(c.success)return c.data;throw new Error(c.message||"交换授权码失败")}catch(c){throw d.value=c.message,c}},generateGeminiAuthUrl:async x=>{try{const c=await K.post("/admin/gemini-accounts/generate-auth-url",x);if(c.success)return c.data;throw new Error(c.message||"生成授权URL失败")}catch(c){throw d.value=c.message,c}},exchangeGeminiCode:async x=>{try{const c=await K.post("/admin/gemini-accounts/exchange-code",x);if(c.success)return c.data;throw new Error(c.message||"交换授权码失败")}catch(c){throw d.value=c.message,c}},sortAccounts:x=>{S.value===x?I.value=I.value==="asc"?"desc":"asc":(S.value=x,I.value="asc")},reset:()=>{L.value=[],E.value=[],m.value=[],g.value=!1,d.value=null,S.value="",I.value="asc"}}}),Ke={class:"space-y-4"},Pe={class:"flex items-center justify-between"},Re={class:"flex items-center cursor-pointer"},Ge={key:0,class:"bg-gray-50 p-4 rounded-lg border border-gray-200 space-y-4"},Le={class:"grid grid-cols-2 gap-4"},De={class:"space-y-4"},Oe={class:"flex items-center"},Ee={key:0,class:"grid grid-cols-2 gap-4"},ze={class:"relative"},We=["type"],ge={__name:"ProxyConfig",props:{modelValue:{type:Object,default:()=>({enabled:!1,type:"socks5",host:"",port:"",username:"",password:""})}},emits:["update:modelValue"],setup(L,{emit:E}){const m=L,g=E,d=T({...m.modelValue}),S=T(!!(d.value.username||d.value.password)),I=T(!1);O(()=>m.modelValue,y=>{JSON.stringify(y)!==JSON.stringify(d.value)&&(d.value={...y},S.value=!!(y.username||y.password))},{deep:!0}),O(()=>d.value.enabled,y=>{A()}),O(()=>d.value.type,y=>{A()}),O(()=>d.value.host,y=>{A()}),O(()=>d.value.port,y=>{A()}),O(()=>d.value.username,y=>{A()}),O(()=>d.value.password,y=>{A()}),O(S,y=>{y||(d.value.username="",d.value.password="",A())});let C=null;function A(){C&&clearTimeout(C),C=setTimeout(()=>{const y={...d.value};S.value||(y.username="",y.password=""),g("update:modelValue",y)},100)}return Ae(()=>{C&&clearTimeout(C)}),(y,f)=>(i(),u("div",Ke,[e("div",Pe,[f[9]||(f[9]=e("h4",{class:"text-sm font-semibold text-gray-700"},"代理设置 (可选)",-1)),e("label",Re,[w(e("input",{type:"checkbox","onUpdate:modelValue":f[0]||(f[0]=M=>d.value.enabled=M),class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[xe,d.value.enabled]]),f[8]||(f[8]=e("span",{class:"ml-2 text-sm text-gray-700"},"启用代理",-1))])]),d.value.enabled?(i(),u("div",Ge,[f[17]||(f[17]=te('

配置代理以访问受限的网络资源。支持 SOCKS5 和 HTTP 代理。

请确保代理服务器稳定可用,否则会影响账户的正常使用。

',1)),e("div",null,[f[11]||(f[11]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"代理类型",-1)),w(e("select",{"onUpdate:modelValue":f[1]||(f[1]=M=>d.value.type=M),class:"form-input w-full"},f[10]||(f[10]=[e("option",{value:"socks5"},"SOCKS5",-1),e("option",{value:"http"},"HTTP",-1),e("option",{value:"https"},"HTTPS",-1)]),512),[[we,d.value.type]])]),e("div",Le,[e("div",null,[f[12]||(f[12]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"主机地址",-1)),w(e("input",{"onUpdate:modelValue":f[2]||(f[2]=M=>d.value.host=M),type:"text",placeholder:"例如: 192.168.1.100",class:"form-input w-full"},null,512),[[j,d.value.host]])]),e("div",null,[f[13]||(f[13]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"端口",-1)),w(e("input",{"onUpdate:modelValue":f[3]||(f[3]=M=>d.value.port=M),type:"number",placeholder:"例如: 1080",class:"form-input w-full"},null,512),[[j,d.value.port]])])]),e("div",De,[e("div",Oe,[w(e("input",{type:"checkbox","onUpdate:modelValue":f[4]||(f[4]=M=>S.value=M),id:"proxyAuth",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[xe,S.value]]),f[14]||(f[14]=e("label",{for:"proxyAuth",class:"ml-2 text-sm text-gray-700 cursor-pointer"}," 需要身份验证 ",-1))]),S.value?(i(),u("div",Ee,[e("div",null,[f[15]||(f[15]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"用户名",-1)),w(e("input",{"onUpdate:modelValue":f[5]||(f[5]=M=>d.value.username=M),type:"text",placeholder:"代理用户名",class:"form-input w-full"},null,512),[[j,d.value.username]])]),e("div",null,[f[16]||(f[16]=e("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"密码",-1)),e("div",ze,[w(e("input",{"onUpdate:modelValue":f[6]||(f[6]=M=>d.value.password=M),type:I.value?"text":"password",placeholder:"代理密码",class:"form-input w-full pr-10"},null,8,We),[[Ue,d.value.password]]),e("button",{type:"button",onClick:f[7]||(f[7]=M=>I.value=!I.value),class:"absolute inset-y-0 right-0 pr-3 flex items-center text-gray-400 hover:text-gray-600"},[e("i",{class:G(I.value?"fas fa-eye-slash":"fas fa-eye")},null,2)])])])])):$("",!0)]),f[18]||(f[18]=e("div",{class:"bg-blue-50 p-3 rounded-lg border border-blue-200"},[e("p",{class:"text-xs text-blue-700"},[e("i",{class:"fas fa-info-circle mr-1"}),e("strong",null,"提示:"),h("代理设置将用于所有与此账户相关的API请求。请确保代理服务器支持HTTPS流量转发。 ")])],-1))])):$("",!0)]))}},qe={class:"space-y-6"},Be={key:0},Ne={class:"bg-blue-50 p-6 rounded-lg border border-blue-200"},Fe={class:"flex items-start gap-4"},He={class:"flex-1"},_e={class:"space-y-4"},Je={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},Ye={class:"flex items-start gap-3"},Qe={class:"flex-1"},Xe=["disabled"],Ze={key:0,class:"fas fa-link mr-2"},et={key:1,class:"loading-spinner mr-2"},tt={key:1,class:"space-y-3"},st={class:"flex items-center gap-2"},lt=["value"],at={class:"bg-white/80 rounded-lg p-4 border border-blue-300"},ot={class:"flex items-start gap-3"},nt={class:"flex-1"},rt={class:"space-y-3"},it={key:1},ut={class:"bg-green-50 p-6 rounded-lg border border-green-200"},dt={class:"flex items-start gap-4"},pt={class:"flex-1"},ct={class:"space-y-4"},mt={class:"bg-white/80 rounded-lg p-4 border border-green-300"},ft={class:"flex items-start gap-3"},xt={class:"flex-1"},vt=["disabled"],yt={key:0,class:"fas fa-link mr-2"},gt={key:1,class:"loading-spinner mr-2"},bt={key:1,class:"space-y-3"},wt={class:"flex items-center gap-2"},kt=["value"],ht={class:"bg-white/80 rounded-lg p-4 border border-green-300"},$t={class:"flex items-start gap-3"},Ct={class:"flex-1"},Tt={class:"space-y-3"},At={class:"flex gap-3 pt-4"},Ut=["disabled"],Vt={key:0,class:"loading-spinner mr-2"},It={__name:"OAuthFlow",props:{platform:{type:String,required:!0},proxy:{type:Object,default:null}},emits:["success","back"],setup(L,{emit:E}){const m=L,g=E,d=$e(),S=T(!1),I=T(!1),C=T(""),A=T(""),y=T(!1),f=T(""),M=se(()=>C.value&&A.value.trim());O(A,v=>{if(!v||typeof v!="string")return;const r=v.trim();if(!r)return;if(r.startsWith("http://")||r.startsWith("https://"))if(r.startsWith("http://localhost:45462"))try{const B=new URL(r).searchParams.get("code");B?(A.value=B,V("成功提取授权码!","success"),console.log("Successfully extracted authorization code from URL")):V("URL 中未找到授权码参数,请检查链接是否正确","error")}catch(N){console.error("Failed to parse URL:",N),V("链接格式错误,请检查是否为完整的 URL","error")}else if(m.platform==="gemini")try{const B=new URL(r).searchParams.get("code");B&&(A.value=B,V("成功提取授权码!","success"))}catch{}else V("请粘贴以 http://localhost:45462 开头的链接","error")});const D=async()=>{var v;S.value=!0;try{const r=(v=m.proxy)!=null&&v.enabled?{proxy:{type:m.proxy.type,host:m.proxy.host,port:parseInt(m.proxy.port),username:m.proxy.username||null,password:m.proxy.password||null}}:{};if(m.platform==="claude"){const R=await d.generateClaudeAuthUrl(r);C.value=R.authUrl,f.value=R.sessionId}else if(m.platform==="gemini"){const R=await d.generateGeminiAuthUrl(r);C.value=R.authUrl,f.value=R.sessionId}}catch(r){V(r.message||"生成授权链接失败","error")}finally{S.value=!1}},P=()=>{C.value="",A.value="",D()},_=async()=>{try{await navigator.clipboard.writeText(C.value),y.value=!0,V("链接已复制","success"),setTimeout(()=>{y.value=!1},2e3)}catch{const r=document.createElement("input");r.value=C.value,document.body.appendChild(r),r.select(),document.execCommand("copy"),document.body.removeChild(r),y.value=!0,V("链接已复制","success"),setTimeout(()=>{y.value=!1},2e3)}},s=async()=>{var v;if(M.value){I.value=!0;try{let r={};m.platform==="claude"?r={sessionId:f.value,callbackUrl:A.value.trim()}:m.platform==="gemini"&&(r={code:A.value.trim(),sessionId:f.value}),(v=m.proxy)!=null&&v.enabled&&(r.proxy={type:m.proxy.type,host:m.proxy.host,port:parseInt(m.proxy.port),username:m.proxy.username||null,password:m.proxy.password||null});let R;m.platform==="claude"?R=await d.exchangeClaudeCode(r):m.platform==="gemini"&&(R=await d.exchangeGeminiCode(r)),g("success",R)}catch(r){V(r.message||"授权失败,请检查授权码是否正确","error")}finally{I.value=!1}}};return(v,r)=>(i(),u("div",qe,[L.platform==="claude"?(i(),u("div",Be,[e("div",Ne,[e("div",Fe,[r[14]||(r[14]=e("div",{class:"w-10 h-10 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-link text-white"})],-1)),e("div",He,[r[12]||(r[12]=e("h4",{class:"font-semibold text-blue-900 mb-3"},"Claude 账户授权",-1)),r[13]||(r[13]=e("p",{class:"text-sm text-blue-800 mb-4"}," 请按照以下步骤完成 Claude 账户的授权: ",-1)),e("div",_e,[e("div",Je,[e("div",Ye,[r[5]||(r[5]=e("div",{class:"w-6 h-6 bg-blue-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"},"1",-1)),e("div",Qe,[r[4]||(r[4]=e("p",{class:"font-medium text-blue-900 mb-2"},"点击下方按钮生成授权链接",-1)),C.value?(i(),u("div",tt,[e("div",st,[e("input",{type:"text",value:C.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,lt),e("button",{onClick:_,class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接"},[e("i",{class:G(y.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{onClick:P,class:"text-xs text-blue-600 hover:text-blue-700"},r[3]||(r[3]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),h("重新生成 ",-1)]))])):(i(),u("button",{key:0,onClick:D,disabled:S.value,class:"btn btn-primary px-4 py-2 text-sm"},[S.value?(i(),u("div",et)):(i(),u("i",Ze)),h(" "+U(S.value?"生成中...":"生成授权链接"),1)],8,Xe))])])]),r[11]||(r[11]=te('
2

在浏览器中打开链接并完成授权

请在新标签页中打开授权链接,登录您的 Claude 账户并授权。

注意:如果您设置了代理,请确保浏览器也使用相同的代理访问授权页面。

',1)),e("div",at,[e("div",ot,[r[10]||(r[10]=e("div",{class:"w-6 h-6 bg-blue-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"},"3",-1)),e("div",nt,[r[8]||(r[8]=e("p",{class:"font-medium text-blue-900 mb-2"},"输入 Authorization Code",-1)),r[9]||(r[9]=e("p",{class:"text-sm text-blue-700 mb-3"},[h(" 授权完成后,页面会显示一个 "),e("strong",null,"Authorization Code"),h(",请将其复制并粘贴到下方输入框: ")],-1)),e("div",rt,[e("div",null,[r[6]||(r[6]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[e("i",{class:"fas fa-key text-blue-500 mr-2"}),h("Authorization Code ")],-1)),w(e("textarea",{"onUpdate:modelValue":r[0]||(r[0]=R=>A.value=R),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴从Claude页面获取的Authorization Code..."},null,512),[[j,A.value]])]),r[7]||(r[7]=e("p",{class:"text-xs text-gray-500 mt-2"},[e("i",{class:"fas fa-info-circle mr-1"}),h(" 请粘贴从Claude页面复制的Authorization Code ")],-1))])])])])])])])])])):L.platform==="gemini"?(i(),u("div",it,[e("div",ut,[e("div",dt,[r[26]||(r[26]=e("div",{class:"w-10 h-10 bg-green-500 rounded-lg flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-robot text-white"})],-1)),e("div",pt,[r[24]||(r[24]=e("h4",{class:"font-semibold text-green-900 mb-3"},"Gemini 账户授权",-1)),r[25]||(r[25]=e("p",{class:"text-sm text-green-800 mb-4"}," 请按照以下步骤完成 Gemini 账户的授权: ",-1)),e("div",ct,[e("div",mt,[e("div",ft,[r[17]||(r[17]=e("div",{class:"w-6 h-6 bg-green-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"},"1",-1)),e("div",xt,[r[16]||(r[16]=e("p",{class:"font-medium text-green-900 mb-2"},"点击下方按钮生成授权链接",-1)),C.value?(i(),u("div",bt,[e("div",wt,[e("input",{type:"text",value:C.value,readonly:"",class:"form-input flex-1 text-xs font-mono bg-gray-50"},null,8,kt),e("button",{onClick:_,class:"px-3 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors",title:"复制链接"},[e("i",{class:G(y.value?"fas fa-check text-green-500":"fas fa-copy")},null,2)])]),e("button",{onClick:P,class:"text-xs text-green-600 hover:text-green-700"},r[15]||(r[15]=[e("i",{class:"fas fa-sync-alt mr-1"},null,-1),h("重新生成 ",-1)]))])):(i(),u("button",{key:0,onClick:D,disabled:S.value,class:"btn btn-primary px-4 py-2 text-sm"},[S.value?(i(),u("div",gt)):(i(),u("i",yt)),h(" "+U(S.value?"生成中...":"生成授权链接"),1)],8,vt))])])]),r[23]||(r[23]=te('
2

在浏览器中打开链接并完成授权

  1. 点击上方的授权链接,在新页面中完成Google账号登录
  2. 点击“登录”按钮后可能会加载很慢(这是正常的)
  3. 如果超过1分钟还在加载,请按 F5 刷新页面
  4. 授权完成后会跳转到 http://localhost:45462 (可能显示无法访问)

提示:如果页面一直无法跳转,可以打开浏览器开发者工具(F12),F5刷新一下授权页再点击页面的登录按钮,在“网络”标签中找到以 localhost:45462 开头的请求,复制其完整URL。

',1)),e("div",ht,[e("div",$t,[r[22]||(r[22]=e("div",{class:"w-6 h-6 bg-green-600 text-white rounded-full flex items-center justify-center text-xs font-bold flex-shrink-0"},"3",-1)),e("div",Ct,[r[20]||(r[20]=e("p",{class:"font-medium text-green-900 mb-2"},"复制oauth后的链接",-1)),r[21]||(r[21]=e("p",{class:"text-sm text-green-700 mb-3"}," 复制浏览器地址栏的完整链接并粘贴到下方输入框: ",-1)),e("div",Tt,[e("div",null,[r[18]||(r[18]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[e("i",{class:"fas fa-key text-green-500 mr-2"}),h("复制oauth后的链接 ")],-1)),w(e("textarea",{"onUpdate:modelValue":r[1]||(r[1]=R=>A.value=R),rows:"3",class:"form-input w-full resize-none font-mono text-sm",placeholder:"粘贴以 http://localhost:45462 开头的完整链接..."},null,512),[[j,A.value]])]),r[19]||(r[19]=te('

支持粘贴完整链接,系统会自动提取授权码

也可以直接粘贴授权码(code参数的值)

',1))])])])])])])])])])):$("",!0),e("div",At,[e("button",{type:"button",onClick:r[2]||(r[2]=R=>v.$emit("back")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 上一步 "),e("button",{type:"button",onClick:s,disabled:!M.value||I.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[I.value?(i(),u("div",Vt)):$("",!0),h(" "+U(I.value?"验证中...":"完成授权"),1)],8,Ut)])]))}},jt={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},St={class:"modal-content w-full max-w-md p-6 mx-auto"},Mt={class:"flex items-start gap-4 mb-6"},Kt={class:"flex-1"},Pt={class:"text-lg font-bold text-gray-900 mb-2"},Rt={class:"text-gray-600 text-sm leading-relaxed whitespace-pre-line"},Gt={class:"flex gap-3"},Ce={__name:"ConfirmModal",props:{show:{type:Boolean,required:!0},title:{type:String,default:""},message:{type:String,default:""},confirmText:{type:String,default:"继续"},cancelText:{type:String,default:"取消"}},emits:["confirm","cancel"],setup(L){return(E,m)=>(i(),le(ke,{to:"body"},[L.show?(i(),u("div",jt,[e("div",St,[e("div",Mt,[m[2]||(m[2]=e("div",{class:"w-12 h-12 bg-gradient-to-br from-yellow-400 to-yellow-500 rounded-full flex items-center justify-center flex-shrink-0"},[e("i",{class:"fas fa-exclamation text-white text-xl"})],-1)),e("div",Kt,[e("h3",Pt,U(L.title),1),e("p",Rt,U(L.message),1)])]),e("div",Gt,[e("button",{onClick:m[0]||(m[0]=g=>E.$emit("cancel")),class:"flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-xl font-medium hover:bg-gray-200 transition-colors"},U(L.cancelText),1),e("button",{onClick:m[1]||(m[1]=g=>E.$emit("confirm")),class:"flex-1 px-4 py-2.5 bg-gradient-to-r from-yellow-500 to-orange-500 text-white rounded-xl font-medium hover:from-yellow-600 hover:to-orange-600 transition-colors shadow-sm"},U(L.confirmText),1)])])])):$("",!0)]))}},Lt={key:0,class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Dt={class:"modal-content w-full max-w-2xl p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},Ot={class:"flex items-center justify-between mb-6"},Et={class:"flex items-center gap-3"},zt={class:"text-xl font-bold text-gray-900"},Wt={key:0,class:"flex items-center justify-center mb-8"},qt={class:"flex items-center space-x-4"},Bt={class:"flex items-center"},Nt={class:"flex items-center"},Ft={key:1},Ht={class:"space-y-6"},_t={key:0},Jt={class:"flex gap-4"},Yt={class:"flex items-center cursor-pointer"},Qt={class:"flex items-center cursor-pointer"},Xt={class:"flex items-center cursor-pointer"},Zt={key:1},es={class:"flex gap-4"},ts={class:"flex items-center cursor-pointer"},ss={class:"flex items-center cursor-pointer"},ls={key:0,class:"text-red-500 text-xs mt-1"},as={class:"flex gap-4"},os={class:"flex items-center cursor-pointer"},ns={class:"flex items-center cursor-pointer"},rs={key:2},is={key:3,class:"space-y-4"},us={key:0,class:"text-red-500 text-xs mt-1"},ds={key:0,class:"text-red-500 text-xs mt-1"},ps={class:"mb-2 flex gap-2"},cs={key:4},ms={key:5,class:"space-y-4 bg-blue-50 p-4 rounded-lg border border-blue-200"},fs={class:"flex items-start gap-3 mb-4"},xs={key:0,class:"text-sm text-blue-800 mb-2"},vs={key:1,class:"text-sm text-blue-800 mb-2"},ys={class:"bg-white/80 rounded-lg p-3 mt-2 mb-2 border border-blue-300"},gs={key:0,class:"text-xs text-blue-800"},bs={key:1,class:"text-xs text-blue-800"},ws={key:0,class:"text-red-500 text-xs mt-1"},ks={class:"flex gap-3 pt-4"},hs=["disabled"],$s=["disabled"],Cs={key:0,class:"loading-spinner mr-2"},Ts={key:3,class:"space-y-6"},As={class:"flex gap-4"},Us={class:"flex items-center cursor-pointer"},Vs={class:"flex items-center cursor-pointer"},Is={key:0},js={key:1},Ss={key:2,class:"space-y-4"},Ms={class:"mb-2 flex gap-2"},Ks={key:3,class:"bg-amber-50 p-4 rounded-lg border border-amber-200"},Ps={class:"space-y-4"},Rs={class:"flex gap-3 pt-4"},Gs=["disabled"],Ls={key:0,class:"loading-spinner mr-2"},be={__name:"AccountForm",props:{account:{type:Object,default:null}},emits:["close","success"],setup(L,{emit:E}){var X,Z,ee,x,c,b,q,ae,p,l,o,k;const m=L,g=E,d=$e(),{showConfirmModal:S,confirmOptions:I,showConfirm:C,handleConfirm:A,handleCancel:y}=he(),f=se(()=>!!m.account),M=T(!0),D=T(1),P=T(!1),_=()=>{var n;return(n=m.account)!=null&&n.proxy&&m.account.proxy.host&&m.account.proxy.port?{enabled:!0,type:m.account.proxy.type||"socks5",host:m.account.proxy.host,port:m.account.proxy.port,username:m.account.proxy.username||"",password:m.account.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""}},s=T({platform:((X=m.account)==null?void 0:X.platform)||"claude",addType:"oauth",name:((Z=m.account)==null?void 0:Z.name)||"",description:((ee=m.account)==null?void 0:ee.description)||"",accountType:((x=m.account)==null?void 0:x.accountType)||"shared",projectId:((c=m.account)==null?void 0:c.projectId)||"",accessToken:"",refreshToken:"",proxy:_(),apiUrl:((b=m.account)==null?void 0:b.apiUrl)||"",apiKey:((q=m.account)==null?void 0:q.apiKey)||"",priority:((ae=m.account)==null?void 0:ae.priority)||50,supportedModels:((l=(p=m.account)==null?void 0:p.supportedModels)==null?void 0:l.join(` +`))||"",userAgent:((o=m.account)==null?void 0:o.userAgent)||"",rateLimitDuration:((k=m.account)==null?void 0:k.rateLimitDuration)||60}),v=T({name:"",accessToken:"",apiUrl:"",apiKey:""}),r=se(()=>{var n;return((n=s.value.name)==null?void 0:n.trim())&&s.value.platform});se(()=>{var n,t,a;return s.value.addType==="manual"?((n=s.value.name)==null?void 0:n.trim())&&((t=s.value.accessToken)==null?void 0:t.trim()):(a=s.value.name)==null?void 0:a.trim()});const R=async()=>{if(v.value.name="",!r.value){(!s.value.name||s.value.name.trim()==="")&&(v.value.name="请填写账户名称");return}s.value.platform==="gemini"&&D.value===1&&s.value.addType==="oauth"&&(!s.value.projectId||s.value.projectId.trim()==="")&&!await C("项目编号未填写",`您尚未填写项目编号。 + +如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目编号。 +如果您使用的是普通个人账号,可以继续不填写。`,"继续","返回填写")||(D.value=2)},N=async n=>{P.value=!0;try{const t={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};s.value.platform==="claude"?(t.claudeAiOauth=n.claudeAiOauth||n,t.priority=s.value.priority||50):s.value.platform==="gemini"&&(t.geminiOauth=n.tokens||n,s.value.projectId&&(t.projectId=s.value.projectId));let a;s.value.platform==="claude"?a=await d.createClaudeAccount(t):a=await d.createGeminiAccount(t),g("success",a)}catch(t){V(t.message||"账户创建失败","error")}finally{P.value=!1}},B=async()=>{v.value.name="",v.value.accessToken="",v.value.apiUrl="",v.value.apiKey="";let n=!1;if((!s.value.name||s.value.name.trim()==="")&&(v.value.name="请填写账户名称",n=!0),s.value.platform==="claude-console"?((!s.value.apiUrl||s.value.apiUrl.trim()==="")&&(v.value.apiUrl="请填写 API URL",n=!0),(!s.value.apiKey||s.value.apiKey.trim()==="")&&(v.value.apiKey="请填写 API Key",n=!0)):s.value.addType==="manual"&&(!s.value.accessToken||s.value.accessToken.trim()==="")&&(v.value.accessToken="请填写 Access Token",n=!0),!n){P.value=!0;try{const t={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};if(s.value.platform==="claude"){const z=s.value.refreshToken?6e5:31536e6;t.claudeAiOauth={accessToken:s.value.accessToken,refreshToken:s.value.refreshToken||"",expiresAt:Date.now()+z,scopes:["user:inference"]},t.priority=s.value.priority||50}else if(s.value.platform==="gemini"){const z=s.value.refreshToken?6e5:31536e6;t.geminiOauth={access_token:s.value.accessToken,refresh_token:s.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+z},s.value.projectId&&(t.projectId=s.value.projectId)}else s.value.platform==="claude-console"&&(t.apiUrl=s.value.apiUrl,t.apiKey=s.value.apiKey,t.priority=s.value.priority||50,t.supportedModels=s.value.supportedModels?s.value.supportedModels.split(` +`).filter(z=>z.trim()):[],t.userAgent=s.value.userAgent||null,t.rateLimitDuration=s.value.rateLimitDuration||60);let a;s.value.platform==="claude"?a=await d.createClaudeAccount(t):s.value.platform==="claude-console"?a=await d.createClaudeConsoleAccount(t):a=await d.createGeminiAccount(t),g("success",a)}catch(t){V(t.message||"账户创建失败","error")}finally{P.value=!1}}},Q=async()=>{if(v.value.name="",!s.value.name||s.value.name.trim()===""){v.value.name="请填写账户名称";return}if(!(s.value.platform==="gemini"&&(!s.value.projectId||s.value.projectId.trim()==="")&&!await C("项目编号未填写",`您尚未填写项目编号。 + +如果您的Google账号绑定了Google Cloud或被识别为Workspace账号,需要提供项目编号。 +如果您使用的是普通个人账号,可以继续不填写。`,"继续保存","返回填写"))){P.value=!0;try{const n={name:s.value.name,description:s.value.description,accountType:s.value.accountType,proxy:s.value.proxy.enabled?{type:s.value.proxy.type,host:s.value.proxy.host,port:parseInt(s.value.proxy.port),username:s.value.proxy.username||null,password:s.value.proxy.password||null}:null};if(s.value.accessToken||s.value.refreshToken){if(m.account.platform==="claude"){const t=s.value.refreshToken?6e5:31536e6;n.claudeAiOauth={accessToken:s.value.accessToken||"",refreshToken:s.value.refreshToken||"",expiresAt:Date.now()+t,scopes:["user:inference"]}}else if(m.account.platform==="gemini"){const t=s.value.refreshToken?6e5:31536e6;n.geminiOauth={access_token:s.value.accessToken||"",refresh_token:s.value.refreshToken||"",scope:"https://www.googleapis.com/auth/cloud-platform",token_type:"Bearer",expiry_date:Date.now()+t}}}m.account.platform==="gemini"&&s.value.projectId&&(n.projectId=s.value.projectId),m.account.platform==="claude"&&(n.priority=s.value.priority||50),m.account.platform==="claude-console"&&(n.apiUrl=s.value.apiUrl,s.value.apiKey&&(n.apiKey=s.value.apiKey),n.priority=s.value.priority||50,n.supportedModels=s.value.supportedModels?s.value.supportedModels.split(` +`).filter(t=>t.trim()):[],n.userAgent=s.value.userAgent||null,n.rateLimitDuration=s.value.rateLimitDuration||60),m.account.platform==="claude"?await d.updateClaudeAccount(m.account.id,n):m.account.platform==="claude-console"?await d.updateClaudeConsoleAccount(m.account.id,n):await d.updateGeminiAccount(m.account.id,n),g("success")}catch(n){V(n.message||"账户更新失败","error")}finally{P.value=!1}}};O(()=>s.value.name,()=>{var n;v.value.name&&((n=s.value.name)!=null&&n.trim())&&(v.value.name="")}),O(()=>s.value.accessToken,()=>{var n;v.value.accessToken&&((n=s.value.accessToken)!=null&&n.trim())&&(v.value.accessToken="")}),O(()=>s.value.apiUrl,()=>{var n;v.value.apiUrl&&((n=s.value.apiUrl)!=null&&n.trim())&&(v.value.apiUrl="")}),O(()=>s.value.apiKey,()=>{var n;v.value.apiKey&&((n=s.value.apiKey)!=null&&n.trim())&&(v.value.apiKey="")}),O(()=>s.value.platform,n=>{n==="claude-console"&&(s.value.addType="manual")});const F=n=>{const t=s.value.supportedModels?s.value.supportedModels.split(` +`).filter(a=>a.trim()):[];if(t.includes(n)){V(`模型 ${n} 已存在`,"info");return}t.push(n),s.value.supportedModels=t.join(` +`),V(`已添加模型 ${n}`,"success")};return O(()=>m.account,n=>{var t;if(n){const a=n.proxy&&n.proxy.host&&n.proxy.port?{enabled:!0,type:n.proxy.type||"socks5",host:n.proxy.host,port:n.proxy.port,username:n.proxy.username||"",password:n.proxy.password||""}:{enabled:!1,type:"socks5",host:"",port:"",username:"",password:""};s.value={platform:n.platform,addType:"oauth",name:n.name,description:n.description||"",accountType:n.accountType||"shared",projectId:n.projectId||"",accessToken:"",refreshToken:"",proxy:a,apiUrl:n.apiUrl||"",apiKey:"",priority:n.priority||50,supportedModels:((t=n.supportedModels)==null?void 0:t.join(` +`))||"",userAgent:n.userAgent||"",rateLimitDuration:n.rateLimitDuration||60}}},{immediate:!0}),(n,t)=>(i(),le(ke,{to:"body"},[M.value?(i(),u("div",Lt,[e("div",Dt,[e("div",Ot,[e("div",Et,[t[43]||(t[43]=e("div",{class:"w-10 h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[e("i",{class:"fas fa-user-circle text-white"})],-1)),e("h3",zt,U(f.value?"编辑账户":"添加账户"),1)]),e("button",{onClick:t[0]||(t[0]=a=>n.$emit("close")),class:"text-gray-400 hover:text-gray-600 transition-colors"},t[44]||(t[44]=[e("i",{class:"fas fa-times text-xl"},null,-1)]))]),!f.value&&s.value.addType==="oauth"?(i(),u("div",Wt,[e("div",qt,[e("div",Bt,[e("div",{class:G(["w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold",D.value>=1?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 1 ",2),t[45]||(t[45]=e("span",{class:"ml-2 text-sm font-medium text-gray-700"},"基本信息",-1))]),t[47]||(t[47]=e("div",{class:"w-8 h-0.5 bg-gray-300"},null,-1)),e("div",Nt,[e("div",{class:G(["w-8 h-8 rounded-full flex items-center justify-center text-sm font-semibold",D.value>=2?"bg-blue-500 text-white":"bg-gray-200 text-gray-500"])}," 2 ",2),t[46]||(t[46]=e("span",{class:"ml-2 text-sm font-medium text-gray-700"},"授权认证",-1))])])])):$("",!0),D.value===1&&!f.value?(i(),u("div",Ft,[e("div",Ht,[f.value?$("",!0):(i(),u("div",_t,[t[51]||(t[51]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"平台",-1)),e("div",Jt,[e("label",Yt,[w(e("input",{type:"radio","onUpdate:modelValue":t[1]||(t[1]=a=>s.value.platform=a),value:"claude",class:"mr-2"},null,512),[[H,s.value.platform]]),t[48]||(t[48]=e("span",{class:"text-sm text-gray-700"},"Claude",-1))]),e("label",Qt,[w(e("input",{type:"radio","onUpdate:modelValue":t[2]||(t[2]=a=>s.value.platform=a),value:"claude-console",class:"mr-2"},null,512),[[H,s.value.platform]]),t[49]||(t[49]=e("span",{class:"text-sm text-gray-700"},"Claude Console",-1))]),e("label",Xt,[w(e("input",{type:"radio","onUpdate:modelValue":t[3]||(t[3]=a=>s.value.platform=a),value:"gemini",class:"mr-2"},null,512),[[H,s.value.platform]]),t[50]||(t[50]=e("span",{class:"text-sm text-gray-700"},"Gemini",-1))])])])),!f.value&&s.value.platform!=="claude-console"?(i(),u("div",Zt,[t[54]||(t[54]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"添加方式",-1)),e("div",es,[e("label",ts,[w(e("input",{type:"radio","onUpdate:modelValue":t[4]||(t[4]=a=>s.value.addType=a),value:"oauth",class:"mr-2"},null,512),[[H,s.value.addType]]),t[52]||(t[52]=e("span",{class:"text-sm text-gray-700"},"OAuth 授权 (推荐)",-1))]),e("label",ss,[w(e("input",{type:"radio","onUpdate:modelValue":t[5]||(t[5]=a=>s.value.addType=a),value:"manual",class:"mr-2"},null,512),[[H,s.value.addType]]),t[53]||(t[53]=e("span",{class:"text-sm text-gray-700"},"手动输入 Access Token",-1))])])])):$("",!0),e("div",null,[t[55]||(t[55]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),w(e("input",{"onUpdate:modelValue":t[6]||(t[6]=a=>s.value.name=a),type:"text",required:"",class:G(["form-input w-full",{"border-red-500":v.value.name}]),placeholder:"为账户设置一个易识别的名称"},null,2),[[j,s.value.name]]),v.value.name?(i(),u("p",ls,U(v.value.name),1)):$("",!0)]),e("div",null,[t[56]||(t[56]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),w(e("textarea",{"onUpdate:modelValue":t[7]||(t[7]=a=>s.value.description=a),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[j,s.value.description]])]),e("div",null,[t[59]||(t[59]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",as,[e("label",os,[w(e("input",{type:"radio","onUpdate:modelValue":t[8]||(t[8]=a=>s.value.accountType=a),value:"shared",class:"mr-2"},null,512),[[H,s.value.accountType]]),t[57]||(t[57]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",ns,[w(e("input",{type:"radio","onUpdate:modelValue":t[9]||(t[9]=a=>s.value.accountType=a),value:"dedicated",class:"mr-2"},null,512),[[H,s.value.accountType]]),t[58]||(t[58]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))])]),t[60]||(t[60]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用 ",-1))]),s.value.platform==="gemini"?(i(),u("div",rs,[t[61]||(t[61]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目编号 (可选)",-1)),w(e("input",{"onUpdate:modelValue":t[10]||(t[10]=a=>s.value.projectId=a),type:"text",class:"form-input w-full",placeholder:"例如:123456789012(纯数字)"},null,512),[[j,s.value.projectId]]),t[62]||(t[62]=e("div",{class:"mt-2 p-3 bg-yellow-50 border border-yellow-200 rounded-lg"},[e("div",{class:"flex items-start gap-2"},[e("i",{class:"fas fa-info-circle text-yellow-600 mt-0.5"}),e("div",{class:"text-xs text-yellow-700"},[e("p",{class:"font-medium mb-1"},"Google Cloud/Workspace 账号需要提供项目编号"),e("p",null,"某些 Google 账号(特别是绑定了 Google Cloud 的账号)会被识别为 Workspace 账号,需要提供额外的项目编号。"),e("div",{class:"mt-2 p-2 bg-white rounded border border-yellow-300"},[e("p",{class:"font-medium mb-1"},"如何获取项目编号:"),e("ol",{class:"list-decimal list-inside space-y-1 ml-2"},[e("li",null,[h("访问 "),e("a",{href:"https://console.cloud.google.com/welcome",target:"_blank",class:"text-blue-600 hover:underline font-medium"},"Google Cloud Console")]),e("li",null,[h("复制"),e("span",{class:"font-semibold text-red-600"},"项目编号(Project Number)"),h(",通常是12位纯数字")]),e("li",{class:"text-red-600"},"⚠️ 注意:不要复制项目ID(Project ID),要复制项目编号!")])]),e("p",{class:"mt-2"},[e("strong",null,"提示:"),h("如果您的账号是普通个人账号(未绑定 Google Cloud),请留空此字段。")])])])],-1))])):$("",!0),s.value.platform==="claude-console"&&!f.value?(i(),u("div",is,[e("div",null,[t[63]||(t[63]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API URL *",-1)),w(e("input",{"onUpdate:modelValue":t[11]||(t[11]=a=>s.value.apiUrl=a),type:"text",required:"",class:G(["form-input w-full",{"border-red-500":v.value.apiUrl}]),placeholder:"例如:https://api.example.com"},null,2),[[j,s.value.apiUrl]]),v.value.apiUrl?(i(),u("p",us,U(v.value.apiUrl),1)):$("",!0)]),e("div",null,[t[64]||(t[64]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API Key *",-1)),w(e("input",{"onUpdate:modelValue":t[12]||(t[12]=a=>s.value.apiKey=a),type:"password",required:"",class:G(["form-input w-full",{"border-red-500":v.value.apiKey}]),placeholder:"请输入API Key"},null,2),[[j,s.value.apiKey]]),v.value.apiKey?(i(),u("p",ds,U(v.value.apiKey),1)):$("",!0)]),e("div",null,[t[65]||(t[65]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"支持的模型 (可选)--注意,ClaudeCode必须加上hiku模型!",-1)),e("div",ps,[e("button",{type:"button",onClick:t[13]||(t[13]=a=>F("claude-sonnet-4-20250514")),class:"px-3 py-1 text-xs bg-blue-100 text-blue-700 rounded-lg hover:bg-blue-200 transition-colors"}," + claude-sonnet-4-20250514 "),e("button",{type:"button",onClick:t[14]||(t[14]=a=>F("claude-opus-4-20250514")),class:"px-3 py-1 text-xs bg-purple-100 text-purple-700 rounded-lg hover:bg-purple-200 transition-colors"}," + claude-opus-4-20250514 "),e("button",{type:"button",onClick:t[15]||(t[15]=a=>F("claude-3-5-haiku-20241022")),class:"px-3 py-1 text-xs bg-green-100 text-green-700 rounded-lg hover:bg-purple-200 transition-colors"}," + claude-3-5-haiku-20241022 ")]),w(e("textarea",{"onUpdate:modelValue":t[16]||(t[16]=a=>s.value.supportedModels=a),rows:"3",class:"form-input w-full resize-none",placeholder:"每行一个模型,留空表示支持所有模型。特别注意,ClaudeCode必须加上hiku模型!"},null,512),[[j,s.value.supportedModels]]),t[66]||(t[66]=e("p",{class:"text-xs text-gray-500 mt-1"},"留空表示支持所有模型。如果指定模型,请求中的模型不在列表内将不会调度到此账号",-1))]),e("div",null,[t[67]||(t[67]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"自定义 User-Agent (可选)",-1)),w(e("input",{"onUpdate:modelValue":t[17]||(t[17]=a=>s.value.userAgent=a),type:"text",class:"form-input w-full",placeholder:"默认:claude-cli/1.0.61 (console, cli)"},null,512),[[j,s.value.userAgent]])]),e("div",null,[t[68]||(t[68]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"限流时间 (分钟)",-1)),w(e("input",{"onUpdate:modelValue":t[18]||(t[18]=a=>s.value.rateLimitDuration=a),type:"number",min:"1",class:"form-input w-full",placeholder:"默认60分钟"},null,512),[[j,s.value.rateLimitDuration,void 0,{number:!0}]]),t[69]||(t[69]=e("p",{class:"text-xs text-gray-500 mt-1"},"当账号返回429错误时,暂停调度的时间(分钟)",-1))])])):$("",!0),s.value.platform==="claude"||s.value.platform==="claude-console"?(i(),u("div",cs,[t[70]||(t[70]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"调度优先级 (1-100)",-1)),w(e("input",{"onUpdate:modelValue":t[19]||(t[19]=a=>s.value.priority=a),type:"number",min:"1",max:"100",class:"form-input w-full",placeholder:"数字越小优先级越高,默认50"},null,512),[[j,s.value.priority,void 0,{number:!0}]]),t[71]||(t[71]=e("p",{class:"text-xs text-gray-500 mt-1"},"数字越小优先级越高,建议范围:1-100",-1))])):$("",!0),s.value.addType==="manual"&&s.value.platform!=="claude-console"?(i(),u("div",ms,[e("div",fs,[t[77]||(t[77]=e("div",{class:"w-8 h-8 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0 mt-1"},[e("i",{class:"fas fa-info text-white text-sm"})],-1)),e("div",null,[t[75]||(t[75]=e("h5",{class:"font-semibold text-blue-900 mb-2"},"手动输入 Token",-1)),s.value.platform==="claude"?(i(),u("p",xs," 请输入有效的 Claude Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):s.value.platform==="gemini"?(i(),u("p",vs," 请输入有效的 Gemini Access Token。如果您有 Refresh Token,建议也一并填写以支持自动刷新。 ")):$("",!0),e("div",ys,[t[74]||(t[74]=e("p",{class:"text-sm text-blue-900 font-medium mb-1"},[e("i",{class:"fas fa-folder-open mr-1"}),h(" 获取 Access Token 的方法: ")],-1)),s.value.platform==="claude"?(i(),u("p",gs,t[72]||(t[72]=[h(" 请从已登录 Claude Code 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.claude/.credentials.json",-1),h(" 文件中的凭证, 请勿使用 Claude 官网 API Keys 页面的密钥。 ",-1)]))):s.value.platform==="gemini"?(i(),u("p",bs,t[73]||(t[73]=[h(" 请从已登录 Gemini CLI 的机器上获取 ",-1),e("code",{class:"bg-blue-100 px-1 py-0.5 rounded font-mono"},"~/.config/gemini/credentials.json",-1),h(" 文件中的凭证。 ",-1)]))):$("",!0)]),t[76]||(t[76]=e("p",{class:"text-xs text-blue-600"},"💡 如果未填写 Refresh Token,Token 过期后需要手动更新。",-1))])]),e("div",null,[t[78]||(t[78]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Access Token *",-1)),w(e("textarea",{"onUpdate:modelValue":t[20]||(t[20]=a=>s.value.accessToken=a),rows:"4",required:"",class:G(["form-input w-full resize-none font-mono text-xs",{"border-red-500":v.value.accessToken}]),placeholder:"请输入 Access Token..."},null,2),[[j,s.value.accessToken]]),v.value.accessToken?(i(),u("p",ws,U(v.value.accessToken),1)):$("",!0)]),e("div",null,[t[79]||(t[79]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"Refresh Token (可选)",-1)),w(e("textarea",{"onUpdate:modelValue":t[21]||(t[21]=a=>s.value.refreshToken=a),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"请输入 Refresh Token..."},null,512),[[j,s.value.refreshToken]])])])):$("",!0),ne(ge,{modelValue:s.value.proxy,"onUpdate:modelValue":t[22]||(t[22]=a=>s.value.proxy=a)},null,8,["modelValue"]),e("div",ks,[e("button",{type:"button",onClick:t[23]||(t[23]=a=>n.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),s.value.addType==="oauth"&&s.value.platform!=="claude-console"?(i(),u("button",{key:0,type:"button",onClick:R,disabled:P.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"}," 下一步 ",8,hs)):(i(),u("button",{key:1,type:"button",onClick:B,disabled:P.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[P.value?(i(),u("div",Cs)):$("",!0),h(" "+U(P.value?"创建中...":"创建"),1)],8,$s))])])])):$("",!0),D.value===2&&s.value.addType==="oauth"?(i(),le(It,{key:2,platform:s.value.platform,proxy:s.value.proxy,onSuccess:N,onBack:t[24]||(t[24]=a=>D.value=1)},null,8,["platform","proxy"])):$("",!0),f.value?(i(),u("div",Ts,[e("div",null,[t[80]||(t[80]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户名称",-1)),w(e("input",{"onUpdate:modelValue":t[25]||(t[25]=a=>s.value.name=a),type:"text",required:"",class:"form-input w-full",placeholder:"为账户设置一个易识别的名称"},null,512),[[j,s.value.name]])]),e("div",null,[t[81]||(t[81]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"描述 (可选)",-1)),w(e("textarea",{"onUpdate:modelValue":t[26]||(t[26]=a=>s.value.description=a),rows:"3",class:"form-input w-full resize-none",placeholder:"账户用途说明..."},null,512),[[j,s.value.description]])]),e("div",null,[t[84]||(t[84]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"账户类型",-1)),e("div",As,[e("label",Us,[w(e("input",{type:"radio","onUpdate:modelValue":t[27]||(t[27]=a=>s.value.accountType=a),value:"shared",class:"mr-2"},null,512),[[H,s.value.accountType]]),t[82]||(t[82]=e("span",{class:"text-sm text-gray-700"},"共享账户",-1))]),e("label",Vs,[w(e("input",{type:"radio","onUpdate:modelValue":t[28]||(t[28]=a=>s.value.accountType=a),value:"dedicated",class:"mr-2"},null,512),[[H,s.value.accountType]]),t[83]||(t[83]=e("span",{class:"text-sm text-gray-700"},"专属账户",-1))])]),t[85]||(t[85]=e("p",{class:"text-xs text-gray-500 mt-2"}," 共享账户:供所有API Key使用;专属账户:仅供特定API Key使用 ",-1))]),s.value.platform==="gemini"?(i(),u("div",Is,[t[86]||(t[86]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"项目编号 (可选)",-1)),w(e("input",{"onUpdate:modelValue":t[29]||(t[29]=a=>s.value.projectId=a),type:"text",class:"form-input w-full",placeholder:"例如:123456789012(纯数字)"},null,512),[[j,s.value.projectId]]),t[87]||(t[87]=e("p",{class:"text-xs text-gray-500 mt-2"}," Google Cloud/Workspace 账号可能需要提供项目编号 ",-1))])):$("",!0),s.value.platform==="claude"||s.value.platform==="claude-console"?(i(),u("div",js,[t[88]||(t[88]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"调度优先级 (1-100)",-1)),w(e("input",{"onUpdate:modelValue":t[30]||(t[30]=a=>s.value.priority=a),type:"number",min:"1",max:"100",class:"form-input w-full",placeholder:"数字越小优先级越高"},null,512),[[j,s.value.priority,void 0,{number:!0}]]),t[89]||(t[89]=e("p",{class:"text-xs text-gray-500 mt-1"},"数字越小优先级越高,建议范围:1-100",-1))])):$("",!0),s.value.platform==="claude-console"?(i(),u("div",Ss,[e("div",null,[t[90]||(t[90]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API URL",-1)),w(e("input",{"onUpdate:modelValue":t[31]||(t[31]=a=>s.value.apiUrl=a),type:"text",required:"",class:"form-input w-full",placeholder:"例如:https://api.example.com"},null,512),[[j,s.value.apiUrl]])]),e("div",null,[t[91]||(t[91]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"API Key",-1)),w(e("input",{"onUpdate:modelValue":t[32]||(t[32]=a=>s.value.apiKey=a),type:"password",class:"form-input w-full",placeholder:"留空表示不更新"},null,512),[[j,s.value.apiKey]]),t[92]||(t[92]=e("p",{class:"text-xs text-gray-500 mt-1"},"留空表示不更新 API Key",-1))]),e("div",null,[t[93]||(t[93]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"支持的模型 (可选)",-1)),e("div",Ms,[e("button",{type:"button",onClick:t[33]||(t[33]=a=>F("claude-sonnet-4-20250514")),class:"px-3 py-1 text-xs bg-blue-100 text-blue-700 rounded-lg hover:bg-blue-200 transition-colors"}," + claude-sonnet-4-20250514 "),e("button",{type:"button",onClick:t[34]||(t[34]=a=>F("claude-opus-4-20250514")),class:"px-3 py-1 text-xs bg-purple-100 text-purple-700 rounded-lg hover:bg-purple-200 transition-colors"}," + claude-opus-4-20250514 "),e("button",{type:"button",onClick:t[35]||(t[35]=a=>F("claude-3-5-haiku-20241022")),class:"px-3 py-1 text-xs bg-green-100 text-green-700 rounded-lg hover:bg-purple-200 transition-colors"}," + claude-3-5-haiku-20241022 ")]),w(e("textarea",{"onUpdate:modelValue":t[36]||(t[36]=a=>s.value.supportedModels=a),rows:"3",class:"form-input w-full resize-none",placeholder:"每行一个模型,留空表示支持所有模型。特别注意,ClaudeCode必须加上hiku模型!"},null,512),[[j,s.value.supportedModels]])]),e("div",null,[t[94]||(t[94]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"自定义 User-Agent (可选)",-1)),w(e("input",{"onUpdate:modelValue":t[37]||(t[37]=a=>s.value.userAgent=a),type:"text",class:"form-input w-full",placeholder:"默认:claude-cli/1.0.61 (console, cli)"},null,512),[[j,s.value.userAgent]])]),e("div",null,[t[95]||(t[95]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"限流时间 (分钟)",-1)),w(e("input",{"onUpdate:modelValue":t[38]||(t[38]=a=>s.value.rateLimitDuration=a),type:"number",min:"1",class:"form-input w-full"},null,512),[[j,s.value.rateLimitDuration,void 0,{number:!0}]])])])):$("",!0),s.value.platform!=="claude-console"?(i(),u("div",Ks,[t[98]||(t[98]=e("div",{class:"flex items-start gap-3 mb-4"},[e("div",{class:"w-8 h-8 bg-amber-500 rounded-lg flex items-center justify-center flex-shrink-0 mt-1"},[e("i",{class:"fas fa-key text-white text-sm"})]),e("div",null,[e("h5",{class:"font-semibold text-amber-900 mb-2"},"更新 Token"),e("p",{class:"text-sm text-amber-800 mb-2"},"可以更新 Access Token 和 Refresh Token。为了安全起见,不会显示当前的 Token 值。"),e("p",{class:"text-xs text-amber-600"},"💡 留空表示不更新该字段。")])],-1)),e("div",Ps,[e("div",null,[t[96]||(t[96]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Access Token",-1)),w(e("textarea",{"onUpdate:modelValue":t[39]||(t[39]=a=>s.value.accessToken=a),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[j,s.value.accessToken]])]),e("div",null,[t[97]||(t[97]=e("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"新的 Refresh Token",-1)),w(e("textarea",{"onUpdate:modelValue":t[40]||(t[40]=a=>s.value.refreshToken=a),rows:"4",class:"form-input w-full resize-none font-mono text-xs",placeholder:"留空表示不更新..."},null,512),[[j,s.value.refreshToken]])])])])):$("",!0),ne(ge,{modelValue:s.value.proxy,"onUpdate:modelValue":t[41]||(t[41]=a=>s.value.proxy=a)},null,8,["modelValue"]),e("div",Rs,[e("button",{type:"button",onClick:t[42]||(t[42]=a=>n.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),e("button",{type:"button",onClick:Q,disabled:P.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[P.value?(i(),u("div",Ls)):$("",!0),h(" "+U(P.value?"更新中...":"更新"),1)],8,Gs)])])):$("",!0)])])):$("",!0),ne(Ce,{show:W(S),title:W(I).title,message:W(I).message,"confirm-text":W(I).confirmText,"cancel-text":W(I).cancelText,onConfirm:W(A),onCancel:W(y)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"])]))}},Ds={class:"accounts-container"},Os={class:"card p-6"},Es={class:"flex flex-col md:flex-row justify-between items-center gap-4 mb-6"},zs={class:"flex gap-2"},Ws={key:0,class:"text-center py-12"},qs={key:1,class:"text-center py-12"},Bs={key:2,class:"table-container"},Ns={class:"min-w-full"},Fs={class:"bg-gray-50/80 backdrop-blur-sm"},Hs={key:1,class:"fas fa-sort ml-1 text-gray-400"},_s={key:1,class:"fas fa-sort ml-1 text-gray-400"},Js={key:1,class:"fas fa-sort ml-1 text-gray-400"},Ys={key:1,class:"fas fa-sort ml-1 text-gray-400"},Qs={key:1,class:"fas fa-sort ml-1 text-gray-400"},Xs={class:"divide-y divide-gray-200/50"},Zs={class:"px-6 py-4 whitespace-nowrap"},el={class:"flex items-center"},tl={class:"flex items-center gap-2"},sl={class:"text-sm font-semibold text-gray-900"},ll={key:0,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800"},al={key:1,class:"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800"},ol={class:"text-xs text-gray-500"},nl={class:"px-6 py-4 whitespace-nowrap"},rl={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-yellow-100 text-yellow-800"},il={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-purple-100 text-purple-800"},ul={key:2,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-indigo-100 text-indigo-800"},dl={class:"px-6 py-4 whitespace-nowrap"},pl={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-green-100 text-green-800"},cl={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-blue-100 text-blue-800"},ml={key:2,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-orange-100 text-orange-800"},fl={class:"px-6 py-4 whitespace-nowrap"},xl={class:"flex flex-col gap-1"},vl={key:0,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-yellow-100 text-yellow-800"},yl={key:1,class:"inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold bg-gray-100 text-gray-700"},gl=["title"],bl={key:3,class:"text-xs text-gray-500"},wl={class:"px-6 py-4 whitespace-nowrap"},kl={key:0,class:"flex items-center gap-2"},hl={class:"w-16 bg-gray-200 rounded-full h-2"},$l={class:"text-xs text-gray-700 font-medium min-w-[20px]"},Cl={key:1,class:"text-gray-400 text-sm"},Tl={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-600"},Al={key:0,class:"text-xs bg-blue-50 px-2 py-1 rounded font-mono"},Ul={key:1,class:"text-gray-400"},Vl={class:"px-6 py-4 whitespace-nowrap text-sm"},Il={key:0,class:"space-y-1"},jl={class:"flex items-center gap-2"},Sl={class:"text-sm font-medium text-gray-900"},Ml={class:"flex items-center gap-2"},Kl={class:"text-xs text-gray-600"},Pl={key:0,class:"text-xs text-gray-500"},Rl={key:1,class:"text-gray-400 text-xs"},Gl={class:"px-6 py-4 whitespace-nowrap"},Ll={key:0,class:"space-y-2"},Dl={class:"flex items-center gap-2"},Ol={class:"w-24 bg-gray-200 rounded-full h-2"},El={class:"text-xs text-gray-700 font-medium min-w-[32px]"},zl={class:"text-xs text-gray-600"},Wl={key:0,class:"text-indigo-600 font-medium"},ql={key:1,class:"text-gray-400 text-sm"},Bl={key:2,class:"text-gray-400 text-sm"},Nl={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-600"},Fl={class:"px-6 py-4 whitespace-nowrap text-sm font-medium"},Hl={class:"flex items-center gap-2"},_l=["onClick","disabled","title"],Jl=["onClick","disabled","title"],Yl=["onClick"],Ql=["onClick"],Xl={__name:"AccountsView",setup(L){const{showConfirmModal:E,confirmOptions:m,showConfirm:g,handleConfirm:d,handleCancel:S}=he(),I=T([]),C=T(!1),A=T("name"),y=T(""),f=T("asc"),M=T([]),D=T(!1),P=T(!1),_=T(null),s=se(()=>y.value?[...I.value].sort((l,o)=>{var t,a,z,Y,re,ie,ue,de,pe,ce,me,fe;let k=l[y.value],n=o[y.value];return y.value==="dailyTokens"?(k=((a=(t=l.usage)==null?void 0:t.daily)==null?void 0:a.allTokens)||0,n=((Y=(z=o.usage)==null?void 0:z.daily)==null?void 0:Y.allTokens)||0):y.value==="dailyRequests"?(k=((ie=(re=l.usage)==null?void 0:re.daily)==null?void 0:ie.requests)||0,n=((de=(ue=o.usage)==null?void 0:ue.daily)==null?void 0:de.requests)||0):y.value==="totalTokens"&&(k=((ce=(pe=l.usage)==null?void 0:pe.total)==null?void 0:ce.allTokens)||0,n=((fe=(me=o.usage)==null?void 0:me.total)==null?void 0:fe.allTokens)||0),y.value==="lastUsed"&&(k=l.lastUsedAt?new Date(l.lastUsedAt).getTime():0,n=o.lastUsedAt?new Date(o.lastUsedAt).getTime():0),y.value==="status"&&(k=l.isActive?1:0,n=o.isActive?1:0),kn?f.value==="asc"?1:-1:0}):I.value),v=async()=>{C.value=!0;try{const[p,l,o,k]=await Promise.all([K.get("/admin/claude-accounts"),K.get("/admin/claude-console-accounts"),K.get("/admin/gemini-accounts"),K.get("/admin/api-keys")]);k.success&&(M.value=k.data||[]);const n=[];if(p.success){const t=(p.data||[]).map(a=>{const z=M.value.filter(Y=>Y.claudeAccountId===a.id).length;return{...a,platform:"claude",boundApiKeysCount:z}});n.push(...t)}if(l.success){const t=(l.data||[]).map(a=>({...a,platform:"claude-console",boundApiKeysCount:0}));n.push(...t)}if(o.success){const t=(o.data||[]).map(a=>{const z=M.value.filter(Y=>Y.geminiAccountId===a.id).length;return{...a,platform:"gemini",boundApiKeysCount:z}});n.push(...t)}I.value=n}catch{V("加载账户失败","error")}finally{C.value=!1}},r=p=>{p&&(y.value===p?f.value=f.value==="asc"?"desc":"asc":(y.value=p,f.value="asc"))},R=p=>{if(p==null)return"0";const l=Number(p);return l>=1e6?Math.floor(l/1e6).toLocaleString()+"M":l.toLocaleString()},N=p=>{if(!p)return"从未使用";const l=new Date(p),k=new Date-l;return k<6e4?"刚刚":k<36e5?`${Math.floor(k/6e4)} 分钟前`:k<864e5?`${Math.floor(k/36e5)} 小时前`:k<6048e5?`${Math.floor(k/864e5)} 天前`:l.toLocaleDateString("zh-CN")},B=async()=>{try{const p=await K.get("/admin/api-keys");p.success&&(M.value=p.data)}catch(p){console.error("Failed to load API keys:",p)}},Q=p=>{if(!p||!p.host||!p.port)return null;let l=`${p.type}://${p.host}:${p.port}`;if(p.username){const o=p.username.length>2?p.username[0]+"***"+p.username[p.username.length-1]:"***",k=p.password?"****":"";l=`${p.type}://${o}:${k}@${p.host}:${p.port}`}return l},F=(p,l)=>{if(!p||!l)return"--";const o=new Date(p),k=new Date(l),n=o.getHours().toString().padStart(2,"0"),t=o.getMinutes().toString().padStart(2,"0"),a=k.getHours().toString().padStart(2,"0"),z=k.getMinutes().toString().padStart(2,"0");return`${n}:${t} - ${a}:${z}`},X=p=>{if(!p||p<=0)return"已结束";const l=Math.floor(p/60),o=p%60;return l>0?`${l}小时${o}分钟`:`${o}分钟`},Z=()=>{D.value=!0},ee=p=>{_.value=p,P.value=!0},x=async p=>{const l=M.value.filter(k=>k.claudeAccountId===p.id||k.geminiAccountId===p.id).length;if(l>0){V(`无法删除此账号,有 ${l} 个API Key绑定到此账号,请先解绑所有API Key`,"error");return}if(await g("删除账户",`确定要删除账户 "${p.name}" 吗? + +此操作不可恢复。`,"删除","取消"))try{let k;p.platform==="claude"?k=`/admin/claude-accounts/${p.id}`:p.platform==="claude-console"?k=`/admin/claude-console-accounts/${p.id}`:k=`/admin/gemini-accounts/${p.id}`;const n=await K.delete(k);n.success?(V("账户已删除","success"),v()):V(n.message||"删除失败","error")}catch{V("删除失败","error")}},c=async p=>{if(!p.isRefreshing)try{p.isRefreshing=!0;const l=await K.post(`/admin/claude-accounts/${p.id}/refresh`);l.success?(V("Token刷新成功","success"),v()):V(l.message||"Token刷新失败","error")}catch{V("Token刷新失败","error")}finally{p.isRefreshing=!1}},b=async p=>{if(!p.isTogglingSchedulable)try{p.isTogglingSchedulable=!0;let l;if(p.platform==="claude")l=`/admin/claude-accounts/${p.id}/toggle-schedulable`;else if(p.platform==="claude-console")l=`/admin/claude-console-accounts/${p.id}/toggle-schedulable`;else{V("Gemini账户暂不支持调度控制","warning");return}const o=await K.put(l);o.success?(p.schedulable=o.schedulable,V(o.schedulable?"已启用调度":"已禁用调度","success")):V(o.message||"操作失败","error")}catch{V("切换调度状态失败","error")}finally{p.isTogglingSchedulable=!1}},q=()=>{D.value=!1,V("账户创建成功","success"),v()},ae=()=>{P.value=!1,V("账户更新成功","success"),v()};return O(A,p=>{const l={name:"name",dailyTokens:"dailyTokens",dailyRequests:"dailyRequests",totalTokens:"totalTokens",lastUsed:"lastUsed"};l[p]&&r(l[p])}),Ve(()=>{v(),B()}),(p,l)=>(i(),u("div",Ds,[e("div",Os,[e("div",Es,[l[11]||(l[11]=e("div",null,[e("h3",{class:"text-xl font-bold text-gray-900 mb-2"},"账户管理"),e("p",{class:"text-gray-600"},"管理您的 Claude 和 Gemini 账户及代理配置")],-1)),e("div",zs,[w(e("select",{"onUpdate:modelValue":l[0]||(l[0]=o=>A.value=o),onChange:l[1]||(l[1]=o=>r()),class:"form-input px-3 py-2 text-sm"},l[9]||(l[9]=[te('',5)]),544),[[we,A.value]]),e("button",{onClick:Ie(Z,["stop"]),class:"btn btn-success px-6 py-3 flex items-center gap-2"},l[10]||(l[10]=[e("i",{class:"fas fa-plus"},null,-1),h("添加账户 ",-1)]))])]),C.value?(i(),u("div",Ws,l[12]||(l[12]=[e("div",{class:"loading-spinner mx-auto mb-4"},null,-1),e("p",{class:"text-gray-500"},"正在加载账户...",-1)]))):s.value.length===0?(i(),u("div",qs,l[13]||(l[13]=[e("div",{class:"w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center"},[e("i",{class:"fas fa-user-circle text-gray-400 text-xl"})],-1),e("p",{class:"text-gray-500 text-lg"},"暂无账户",-1),e("p",{class:"text-gray-400 text-sm mt-2"},"点击上方按钮添加您的第一个账户",-1)]))):(i(),u("div",Bs,[e("table",Ns,[e("thead",Fs,[e("tr",null,[e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[2]||(l[2]=o=>r("name"))},[l[14]||(l[14]=h(" 名称 ",-1)),y.value==="name"?(i(),u("i",{key:0,class:G(["fas",f.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),u("i",Hs))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[3]||(l[3]=o=>r("platform"))},[l[15]||(l[15]=h(" 平台 ",-1)),y.value==="platform"?(i(),u("i",{key:0,class:G(["fas",f.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),u("i",_s))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[4]||(l[4]=o=>r("accountType"))},[l[16]||(l[16]=h(" 类型 ",-1)),y.value==="accountType"?(i(),u("i",{key:0,class:G(["fas",f.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),u("i",Js))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[5]||(l[5]=o=>r("status"))},[l[17]||(l[17]=h(" 状态 ",-1)),y.value==="status"?(i(),u("i",{key:0,class:G(["fas",f.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),u("i",Ys))]),e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:l[6]||(l[6]=o=>r("priority"))},[l[18]||(l[18]=h(" 优先级 ",-1)),y.value==="priority"?(i(),u("i",{key:0,class:G(["fas",f.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),u("i",Qs))]),l[19]||(l[19]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"代理",-1)),l[20]||(l[20]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"今日使用",-1)),l[21]||(l[21]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"会话窗口",-1)),l[22]||(l[22]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"最后使用",-1)),l[23]||(l[23]=e("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"操作",-1))])]),e("tbody",Xs,[(i(!0),u(je,null,Se(s.value,o=>(i(),u("tr",{key:o.id,class:"table-row"},[e("td",Zs,[e("div",el,[l[26]||(l[26]=e("div",{class:"w-8 h-8 bg-gradient-to-br from-green-500 to-green-600 rounded-lg flex items-center justify-center mr-3"},[e("i",{class:"fas fa-user-circle text-white text-xs"})],-1)),e("div",null,[e("div",tl,[e("div",sl,U(o.name),1),o.accountType==="dedicated"?(i(),u("span",ll,l[24]||(l[24]=[e("i",{class:"fas fa-lock mr-1"},null,-1),h("专属 ",-1)]))):(i(),u("span",al,l[25]||(l[25]=[e("i",{class:"fas fa-share-alt mr-1"},null,-1),h("共享 ",-1)])))]),e("div",ol,U(o.id),1)])])]),e("td",nl,[o.platform==="gemini"?(i(),u("span",rl,l[27]||(l[27]=[e("i",{class:"fas fa-robot mr-1"},null,-1),h("Gemini ",-1)]))):o.platform==="claude-console"?(i(),u("span",il,l[28]||(l[28]=[e("i",{class:"fas fa-terminal mr-1"},null,-1),h("Claude Console ",-1)]))):(i(),u("span",ul,l[29]||(l[29]=[e("i",{class:"fas fa-brain mr-1"},null,-1),h("Claude ",-1)])))]),e("td",dl,[o.platform==="claude-console"?(i(),u("span",pl,l[30]||(l[30]=[e("i",{class:"fas fa-key mr-1"},null,-1),h("API Key ",-1)]))):o.scopes&&o.scopes.length>0?(i(),u("span",cl,l[31]||(l[31]=[e("i",{class:"fas fa-lock mr-1"},null,-1),h("OAuth ",-1)]))):(i(),u("span",ml,l[32]||(l[32]=[e("i",{class:"fas fa-key mr-1"},null,-1),h("传统 ",-1)])))]),e("td",fl,[e("div",xl,[e("span",{class:G(["inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold",o.status==="blocked"?"bg-orange-100 text-orange-800":o.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[e("div",{class:G(["w-2 h-2 rounded-full mr-2",o.status==="blocked"?"bg-orange-500":o.isActive?"bg-green-500":"bg-red-500"])},null,2),h(" "+U(o.status==="blocked"?"已封锁":o.isActive?"正常":"异常"),1)],2),o.rateLimitStatus&&o.rateLimitStatus.isRateLimited?(i(),u("span",vl,[l[33]||(l[33]=e("i",{class:"fas fa-exclamation-triangle mr-1"},null,-1)),h(" 限流中 ("+U(o.rateLimitStatus.minutesRemaining)+"分钟) ",1)])):$("",!0),o.schedulable===!1?(i(),u("span",yl,l[34]||(l[34]=[e("i",{class:"fas fa-pause-circle mr-1"},null,-1),h(" 不可调度 ",-1)]))):$("",!0),o.status==="blocked"&&o.errorMessage?(i(),u("span",{key:2,class:"text-xs text-gray-500 mt-1 max-w-xs truncate",title:o.errorMessage},U(o.errorMessage),9,gl)):$("",!0),o.accountType==="dedicated"?(i(),u("span",bl," 绑定: "+U(o.boundApiKeysCount||0)+" 个API Key ",1)):$("",!0)])]),e("td",wl,[o.platform==="claude"||o.platform==="claude-console"?(i(),u("div",kl,[e("div",hl,[e("div",{class:"bg-gradient-to-r from-green-500 to-blue-600 h-2 rounded-full transition-all duration-300",style:ve({width:101-(o.priority||50)+"%"})},null,4)]),e("span",$l,U(o.priority||50),1)])):(i(),u("div",Cl,l[35]||(l[35]=[e("span",{class:"text-xs"},"N/A",-1)])))]),e("td",Tl,[Q(o.proxy)?(i(),u("div",Al,U(Q(o.proxy)),1)):(i(),u("div",Ul,"无代理"))]),e("td",Vl,[o.usage&&o.usage.daily?(i(),u("div",Il,[e("div",jl,[l[36]||(l[36]=e("div",{class:"w-2 h-2 bg-green-500 rounded-full"},null,-1)),e("span",Sl,U(o.usage.daily.requests||0)+" 次",1)]),e("div",Ml,[l[37]||(l[37]=e("div",{class:"w-2 h-2 bg-blue-500 rounded-full"},null,-1)),e("span",Kl,U(R(o.usage.daily.allTokens||0))+" tokens",1)]),o.usage.averages&&o.usage.averages.rpm>0?(i(),u("div",Pl," 平均 "+U(o.usage.averages.rpm.toFixed(2))+" RPM ",1)):$("",!0)])):(i(),u("div",Rl,"暂无数据"))]),e("td",Gl,[o.platform==="claude"&&o.sessionWindow&&o.sessionWindow.hasActiveWindow?(i(),u("div",Ll,[e("div",Dl,[e("div",Ol,[e("div",{class:"bg-gradient-to-r from-blue-500 to-indigo-600 h-2 rounded-full transition-all duration-300",style:ve({width:o.sessionWindow.progress+"%"})},null,4)]),e("span",El,U(o.sessionWindow.progress)+"% ",1)]),e("div",zl,[e("div",null,U(F(o.sessionWindow.windowStart,o.sessionWindow.windowEnd)),1),o.sessionWindow.remainingTime>0?(i(),u("div",Wl," 剩余 "+U(X(o.sessionWindow.remainingTime)),1)):$("",!0)])])):o.platform==="claude"?(i(),u("div",ql,l[38]||(l[38]=[e("i",{class:"fas fa-minus"},null,-1)]))):(i(),u("div",Bl,l[39]||(l[39]=[e("span",{class:"text-xs"},"N/A",-1)])))]),e("td",Nl,U(N(o.lastUsedAt)),1),e("td",Fl,[e("div",Hl,[o.platform==="claude"&&o.scopes?(i(),u("button",{key:0,onClick:k=>c(o),disabled:o.isRefreshing,class:G(["px-3 py-1.5 rounded-lg text-xs font-medium transition-colors",o.isRefreshing?"bg-gray-100 text-gray-400 cursor-not-allowed":"bg-blue-100 text-blue-700 hover:bg-blue-200"]),title:o.isRefreshing?"刷新中...":"刷新Token"},[e("i",{class:G(["fas fa-sync-alt",o.isRefreshing?"animate-spin":""])},null,2)],10,_l)):$("",!0),e("button",{onClick:k=>b(o),disabled:o.isTogglingSchedulable,class:G(["px-3 py-1.5 rounded-lg text-xs font-medium transition-colors",o.isTogglingSchedulable?"bg-gray-100 text-gray-400 cursor-not-allowed":o.schedulable?"bg-green-100 text-green-700 hover:bg-green-200":"bg-gray-100 text-gray-700 hover:bg-gray-200"]),title:o.schedulable?"点击禁用调度":"点击启用调度"},[e("i",{class:G(["fas",o.schedulable?"fa-toggle-on":"fa-toggle-off"])},null,2)],10,Jl),e("button",{onClick:k=>ee(o),class:"px-3 py-1.5 bg-blue-100 text-blue-700 rounded-lg text-xs font-medium hover:bg-blue-200 transition-colors"},l[40]||(l[40]=[e("i",{class:"fas fa-edit"},null,-1)]),8,Yl),e("button",{onClick:k=>x(o),class:"px-3 py-1.5 bg-red-100 text-red-700 rounded-lg text-xs font-medium hover:bg-red-200 transition-colors"},l[41]||(l[41]=[e("i",{class:"fas fa-trash"},null,-1)]),8,Ql)])])]))),128))])])]))]),D.value?(i(),le(be,{key:0,onClose:l[7]||(l[7]=o=>D.value=!1),onSuccess:q})):$("",!0),P.value?(i(),le(be,{key:1,account:_.value,onClose:l[8]||(l[8]=o=>P.value=!1),onSuccess:ae},null,8,["account"])):$("",!0),ne(Ce,{show:W(E),title:W(m).title,message:W(m).message,"confirm-text":W(m).confirmText,"cancel-text":W(m).cancelText,onConfirm:W(d),onCancel:W(S)},null,8,["show","title","message","confirm-text","cancel-text","onConfirm","onCancel"])]))}},aa=Me(Xl,[["__scopeId","data-v-d6375019"]]);export{aa as default}; diff --git a/web/admin-spa/dist/assets/AccountsView-CzMsrxvN.css b/web/admin-spa/dist/assets/AccountsView-CzMsrxvN.css deleted file mode 100644 index 468e8e5e..00000000 --- a/web/admin-spa/dist/assets/AccountsView-CzMsrxvN.css +++ /dev/null @@ -1 +0,0 @@ -.accounts-container[data-v-aec45f3e]{min-height:calc(100vh - 300px)}.table-container[data-v-aec45f3e]{overflow-x:auto;border-radius:12px;border:1px solid rgba(0,0,0,.05)}.table-row[data-v-aec45f3e]{transition:all .2s ease}.table-row[data-v-aec45f3e]:hover{background-color:#00000005} diff --git a/web/admin-spa/dist/assets/AccountsView-VvEhuISz.css b/web/admin-spa/dist/assets/AccountsView-VvEhuISz.css new file mode 100644 index 00000000..06f78dac --- /dev/null +++ b/web/admin-spa/dist/assets/AccountsView-VvEhuISz.css @@ -0,0 +1 @@ +.accounts-container[data-v-d6375019]{min-height:calc(100vh - 300px)}.table-container[data-v-d6375019]{overflow-x:auto;border-radius:12px;border:1px solid rgba(0,0,0,.05)}.table-row[data-v-d6375019]{transition:all .2s ease}.table-row[data-v-d6375019]:hover{background-color:#00000005} diff --git a/web/admin-spa/dist/assets/ApiKeysView-DemJuKGs.js b/web/admin-spa/dist/assets/ApiKeysView-DemJuKGs.js new file mode 100644 index 00000000..f07c95b2 --- /dev/null +++ b/web/admin-spa/dist/assets/ApiKeysView-DemJuKGs.js @@ -0,0 +1,9 @@ +import{E as Mt}from"./element-plus-B8Fs_0jW.js";import{aR as Rt,r as C,_ as it,q as at,c as rt,I as z,y as i,z as t,Y as H,K as b,x as r,L as $,O as g,aq as R,C as U,P as u,Q as _,ac as T,aa as et,aX as N,an as B,al as G,a5 as st,R as St,B as Pt}from"./vue-vendor-CKToUHZx.js";import{s as I}from"./toast-BvwA7Mwb.js";import{a as W,_ as J,u as dt}from"./index-hS0iOrU-.js";import"./vendor-BDiMbLwQ.js";const ut=Rt("clients",{state:()=>({supportedClients:[],loading:!1,error:null}),actions:{async loadSupportedClients(){if(this.supportedClients.length>0)return this.supportedClients;this.loading=!0,this.error=null;try{const k=await W.get("/admin/supported-clients");return k.success?this.supportedClients=k.data||[]:(this.error=k.message||"加载支持的客户端失败",console.error("Failed to load supported clients:",this.error)),this.supportedClients}catch(k){return this.error=k.message||"加载支持的客户端失败",console.error("Error loading supported clients:",k),[]}finally{this.loading=!1}}}}),_t={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Tt={class:"modal-content w-full max-w-lg p-6 mx-auto max-h-[90vh] flex flex-col"},Et={class:"flex items-center justify-between mb-4"},Vt={key:0,class:"text-red-500 text-xs mt-1"},jt={class:"space-y-2"},Ut={key:0,class:"flex flex-wrap gap-2"},qt=["onClick"],Ft={class:"flex gap-2"},Ot=["onKeypress"],Wt={class:"bg-blue-50 border border-blue-200 rounded-lg p-3"},Yt={class:"space-y-2"},zt={class:"grid grid-cols-1 lg:grid-cols-3 gap-2"},Nt={class:"space-y-2"},Ht={class:"flex gap-2"},Bt={key:0,class:"mt-3"},Gt=["min"],Qt={key:1,class:"text-xs text-gray-500 mt-2"},Xt={class:"flex gap-4"},Jt={class:"flex items-center cursor-pointer"},Zt={class:"flex items-center cursor-pointer"},te={class:"flex items-center cursor-pointer"},ee={class:"grid grid-cols-1 gap-3"},se=["disabled"],le=["value"],oe=["disabled"],ne=["value"],ie={class:"flex items-center mb-2"},ae={key:0,class:"space-y-2 bg-red-50 border border-red-200 rounded-lg p-3"},re={class:"flex flex-wrap gap-1 mb-2 min-h-[24px]"},de=["onClick"],ue={key:0,class:"text-gray-400 text-xs"},me={class:"flex gap-2"},pe=["onKeydown"],ce={class:"flex items-center mb-2"},xe={key:0,class:"bg-green-50 border border-green-200 rounded-lg p-3"},fe={class:"space-y-1"},ge=["id","value"],ye=["for"],be={class:"text-sm font-medium text-gray-700"},ve={class:"text-xs text-gray-500 block"},we={class:"flex gap-3 pt-2"},$e=["disabled"],Ce={key:0,class:"loading-spinner mr-2"},Ae={key:1,class:"fas fa-plus mr-2"},Ke={__name:"CreateApiKeyModal",props:{accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success"],setup(k,{emit:O}){const w=O;dt();const P=ut(),D=C(!1),f=C({name:""}),L=C(""),h=C([]),e=it({name:"",description:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",expireDuration:"",customExpireDate:"",expiresAt:null,permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]});at(async()=>{h.value=await P.loadSupportedClients()});const V=rt(()=>{const v=new Date;return v.setMinutes(v.getMinutes()+1),v.toISOString().slice(0,16)}),A=()=>{if(!e.expireDuration){e.expiresAt=null;return}if(e.expireDuration==="custom")return;const v=new Date,d=e.expireDuration.match(/(\d+)([dhmy])/);if(d){const[,q,Q]=d,F=parseInt(q);switch(Q){case"d":v.setDate(v.getDate()+F);break;case"h":v.setHours(v.getHours()+F);break;case"m":v.setMonth(v.getMonth()+F);break;case"y":v.setFullYear(v.getFullYear()+F);break}e.expiresAt=v.toISOString()}},c=()=>{e.customExpireDate&&(e.expiresAt=new Date(e.customExpireDate).toISOString())},y=v=>new Date(v).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),S=()=>{e.modelInput&&!e.restrictedModels.includes(e.modelInput)&&(e.restrictedModels.push(e.modelInput),e.modelInput="")},K=v=>{e.restrictedModels.splice(v,1)},n=()=>{if(L.value&&L.value.trim()){const v=L.value.trim();e.tags.includes(v)||e.tags.push(v),L.value=""}},m=v=>{e.tags.splice(v,1)},j=async()=>{if(f.value.name="",!e.name||!e.name.trim()){f.value.name="请输入API Key名称";return}D.value=!0;try{const v={name:e.name,description:e.description||void 0,tokenLimit:e.tokenLimit!==""&&e.tokenLimit!==null?parseInt(e.tokenLimit):null,rateLimitWindow:e.rateLimitWindow!==""&&e.rateLimitWindow!==null?parseInt(e.rateLimitWindow):null,rateLimitRequests:e.rateLimitRequests!==""&&e.rateLimitRequests!==null?parseInt(e.rateLimitRequests):null,concurrencyLimit:e.concurrencyLimit!==""&&e.concurrencyLimit!==null?parseInt(e.concurrencyLimit):0,dailyCostLimit:e.dailyCostLimit!==""&&e.dailyCostLimit!==null?parseFloat(e.dailyCostLimit):0,expiresAt:e.expiresAt||void 0,permissions:e.permissions,claudeAccountId:e.claudeAccountId||void 0,geminiAccountId:e.geminiAccountId||void 0,tags:e.tags.length>0?e.tags:void 0};v.enableModelRestriction=e.enableModelRestriction,v.restrictedModels=e.restrictedModels,v.enableClientRestriction=e.enableClientRestriction,v.allowedClients=e.allowedClients;const o=await W.post("/admin/api-keys",v);o.success?(I("API Key 创建成功","success"),w("success",o.data),w("close")):I(o.message||"创建失败","error")}catch{I("创建失败","error")}finally{D.value=!1}};return(v,o)=>(i(),z(st,{to:"body"},[t("div",_t,[t("div",Tt,[t("div",Et,[o[27]||(o[27]=t("div",{class:"flex items-center gap-3"},[t("div",{class:"w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center"},[t("i",{class:"fas fa-key text-white"})]),t("h3",{class:"text-xl font-bold text-gray-900"},"创建新的 API Key")],-1)),t("button",{onClick:o[0]||(o[0]=d=>v.$emit("close")),class:"text-gray-400 hover:text-gray-600 transition-colors"},o[26]||(o[26]=[t("i",{class:"fas fa-times text-xl"},null,-1)]))]),t("form",{onSubmit:H(j,["prevent"]),class:"space-y-4 modal-scroll-content custom-scrollbar flex-1"},[t("div",null,[o[28]||(o[28]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},[g("名称 "),t("span",{class:"text-red-500"},"*")],-1)),b(t("input",{"onUpdate:modelValue":o[1]||(o[1]=d=>e.name=d),type:"text",required:"",class:U(["form-input w-full",{"border-red-500":f.value.name}]),placeholder:"为您的 API Key 取一个名称",onInput:o[2]||(o[2]=d=>f.value.name="")},null,34),[[R,e.name]]),f.value.name?(i(),r("p",Vt,u(f.value.name),1)):$("",!0)]),t("div",null,[o[32]||(o[32]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"标签",-1)),t("div",jt,[e.tags.length>0?(i(),r("div",Ut,[(i(!0),r(_,null,T(e.tags,(d,q)=>(i(),r("span",{key:q,class:"inline-flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full"},[g(u(d)+" ",1),t("button",{type:"button",onClick:Q=>m(q),class:"ml-1 hover:text-blue-900"},o[29]||(o[29]=[t("i",{class:"fas fa-times text-xs"},null,-1)]),8,qt)]))),128))])):$("",!0),t("div",Ft,[b(t("input",{"onUpdate:modelValue":o[3]||(o[3]=d=>L.value=d),type:"text",class:"form-input flex-1",placeholder:"输入新标签名称",onKeypress:et(H(n,["prevent"]),["enter"])},null,40,Ot),[[R,L.value]]),t("button",{type:"button",onClick:n,class:"px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors"},o[30]||(o[30]=[t("i",{class:"fas fa-plus"},null,-1)]))]),o[31]||(o[31]=t("p",{class:"text-xs text-gray-500"},"用于标记不同团队或用途,方便筛选管理",-1))])]),t("div",Wt,[o[40]||(o[40]=t("div",{class:"flex items-center gap-2 mb-2"},[t("div",{class:"w-6 h-6 bg-blue-500 rounded flex items-center justify-center flex-shrink-0"},[t("i",{class:"fas fa-tachometer-alt text-white text-xs"})]),t("h4",{class:"font-semibold text-gray-800 text-sm"},"速率限制设置 (可选)")],-1)),t("div",Yt,[t("div",zt,[t("div",null,[o[33]||(o[33]=t("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"时间窗口 (分钟)",-1)),b(t("input",{"onUpdate:modelValue":o[4]||(o[4]=d=>e.rateLimitWindow=d),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[R,e.rateLimitWindow]]),o[34]||(o[34]=t("p",{class:"text-xs text-gray-500 mt-0.5"},"时间段单位",-1))]),t("div",null,[o[35]||(o[35]=t("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"请求次数限制",-1)),b(t("input",{"onUpdate:modelValue":o[5]||(o[5]=d=>e.rateLimitRequests=d),type:"number",min:"1",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[R,e.rateLimitRequests]]),o[36]||(o[36]=t("p",{class:"text-xs text-gray-500 mt-0.5"},"窗口内最大请求",-1))]),t("div",null,[o[37]||(o[37]=t("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"Token 限制",-1)),b(t("input",{"onUpdate:modelValue":o[6]||(o[6]=d=>e.tokenLimit=d),type:"number",placeholder:"无限制",class:"form-input w-full text-sm"},null,512),[[R,e.tokenLimit]]),o[38]||(o[38]=t("p",{class:"text-xs text-gray-500 mt-0.5"},"窗口内最大Token",-1))])]),o[39]||(o[39]=t("div",{class:"bg-blue-100 rounded-lg p-2"},[t("h5",{class:"text-xs font-semibold text-blue-800 mb-1"},"💡 使用示例"),t("div",{class:"text-xs text-blue-700 space-y-0.5"},[t("div",null,[t("strong",null,"示例1:"),g(" 时间窗口=60,请求次数=1000 → 每60分钟最多1000次请求")]),t("div",null,[t("strong",null,"示例2:"),g(" 时间窗口=1,Token=10000 → 每分钟最多10,000个Token")]),t("div",null,[t("strong",null,"示例3:"),g(" 窗口=30,请求=50,Token=100000 → 每30分钟50次请求且不超10万Token")])])],-1))])]),t("div",null,[o[42]||(o[42]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"每日费用限制 (美元)",-1)),t("div",Nt,[t("div",Ht,[t("button",{type:"button",onClick:o[7]||(o[7]=d=>e.dailyCostLimit="50"),class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium"},"$50"),t("button",{type:"button",onClick:o[8]||(o[8]=d=>e.dailyCostLimit="100"),class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium"},"$100"),t("button",{type:"button",onClick:o[9]||(o[9]=d=>e.dailyCostLimit="200"),class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium"},"$200"),t("button",{type:"button",onClick:o[10]||(o[10]=d=>e.dailyCostLimit=""),class:"px-2 py-1 bg-gray-100 hover:bg-gray-200 rounded text-xs font-medium"},"自定义")]),b(t("input",{"onUpdate:modelValue":o[11]||(o[11]=d=>e.dailyCostLimit=d),type:"number",min:"0",step:"0.01",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[R,e.dailyCostLimit]]),o[41]||(o[41]=t("p",{class:"text-xs text-gray-500"},"设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制",-1))])]),t("div",null,[o[43]||(o[43]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"并发限制 (可选)",-1)),b(t("input",{"onUpdate:modelValue":o[12]||(o[12]=d=>e.concurrencyLimit=d),type:"number",min:"0",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[R,e.concurrencyLimit]]),o[44]||(o[44]=t("p",{class:"text-xs text-gray-500 mt-2"},"设置此 API Key 可同时处理的最大请求数,0 或留空表示无限制",-1))]),t("div",null,[o[45]||(o[45]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"备注 (可选)",-1)),b(t("textarea",{"onUpdate:modelValue":o[13]||(o[13]=d=>e.description=d),rows:"2",class:"form-input w-full resize-none text-sm",placeholder:"描述此 API Key 的用途..."},null,512),[[R,e.description]])]),t("div",null,[o[47]||(o[47]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"有效期限",-1)),b(t("select",{"onUpdate:modelValue":o[14]||(o[14]=d=>e.expireDuration=d),onChange:A,class:"form-input w-full"},o[46]||(o[46]=[t("option",{value:""},"永不过期",-1),t("option",{value:"1d"},"1 天",-1),t("option",{value:"7d"},"7 天",-1),t("option",{value:"30d"},"30 天",-1),t("option",{value:"90d"},"90 天",-1),t("option",{value:"180d"},"180 天",-1),t("option",{value:"365d"},"365 天",-1),t("option",{value:"custom"},"自定义日期",-1)]),544),[[N,e.expireDuration]]),e.expireDuration==="custom"?(i(),r("div",Bt,[b(t("input",{"onUpdate:modelValue":o[15]||(o[15]=d=>e.customExpireDate=d),type:"datetime-local",class:"form-input w-full",min:V.value,onChange:c},null,40,Gt),[[R,e.customExpireDate]])])):$("",!0),e.expiresAt?(i(),r("p",Qt," 将于 "+u(y(e.expiresAt))+" 过期 ",1)):$("",!0)]),t("div",null,[o[51]||(o[51]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"服务权限",-1)),t("div",Xt,[t("label",Jt,[b(t("input",{type:"radio","onUpdate:modelValue":o[16]||(o[16]=d=>e.permissions=d),value:"all",class:"mr-2"},null,512),[[B,e.permissions]]),o[48]||(o[48]=t("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),t("label",Zt,[b(t("input",{type:"radio","onUpdate:modelValue":o[17]||(o[17]=d=>e.permissions=d),value:"claude",class:"mr-2"},null,512),[[B,e.permissions]]),o[49]||(o[49]=t("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),t("label",te,[b(t("input",{type:"radio","onUpdate:modelValue":o[18]||(o[18]=d=>e.permissions=d),value:"gemini",class:"mr-2"},null,512),[[B,e.permissions]]),o[50]||(o[50]=t("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),o[52]||(o[52]=t("p",{class:"text-xs text-gray-500 mt-2"},"控制此 API Key 可以访问哪些服务",-1))]),t("div",null,[o[57]||(o[57]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"专属账号绑定 (可选)",-1)),t("div",ee,[t("div",null,[o[54]||(o[54]=t("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Claude 专属账号",-1)),b(t("select",{"onUpdate:modelValue":o[19]||(o[19]=d=>e.claudeAccountId=d),class:"form-input w-full",disabled:e.permissions==="gemini"},[o[53]||(o[53]=t("option",{value:""},"使用共享账号池",-1)),(i(!0),r(_,null,T(k.accounts.claude.filter(d=>d.isDedicated),d=>(i(),r("option",{key:d.id,value:d.id},u(d.name)+" ("+u(d.status==="active"?"正常":"异常")+") ",9,le))),128))],8,se),[[N,e.claudeAccountId]])]),t("div",null,[o[56]||(o[56]=t("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Gemini 专属账号",-1)),b(t("select",{"onUpdate:modelValue":o[20]||(o[20]=d=>e.geminiAccountId=d),class:"form-input w-full",disabled:e.permissions==="claude"},[o[55]||(o[55]=t("option",{value:""},"使用共享账号池",-1)),(i(!0),r(_,null,T(k.accounts.gemini.filter(d=>d.isDedicated),d=>(i(),r("option",{key:d.id,value:d.id},u(d.name)+" ("+u(d.status==="active"?"正常":"异常")+") ",9,ne))),128))],8,oe),[[N,e.geminiAccountId]])])]),o[58]||(o[58]=t("p",{class:"text-xs text-gray-500 mt-2"},"选择专属账号后,此API Key将只使用该账号,不选择则使用共享账号池",-1))]),t("div",null,[t("div",ie,[b(t("input",{type:"checkbox","onUpdate:modelValue":o[21]||(o[21]=d=>e.enableModelRestriction=d),id:"enableModelRestriction",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[G,e.enableModelRestriction]]),o[59]||(o[59]=t("label",{for:"enableModelRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用模型限制 ",-1))]),e.enableModelRestriction?(i(),r("div",ae,[t("div",null,[o[62]||(o[62]=t("label",{class:"block text-xs font-medium text-gray-700 mb-1"},"限制的模型列表",-1)),t("div",re,[(i(!0),r(_,null,T(e.restrictedModels,(d,q)=>(i(),r("span",{key:q,class:"inline-flex items-center px-2 py-1 rounded-full text-xs bg-red-100 text-red-800"},[g(u(d)+" ",1),t("button",{type:"button",onClick:Q=>K(q),class:"ml-1 text-red-600 hover:text-red-800"},o[60]||(o[60]=[t("i",{class:"fas fa-times text-xs"},null,-1)]),8,de)]))),128)),e.restrictedModels.length===0?(i(),r("span",ue," 暂无限制的模型 ")):$("",!0)]),t("div",me,[b(t("input",{"onUpdate:modelValue":o[22]||(o[22]=d=>e.modelInput=d),onKeydown:et(H(S,["prevent"]),["enter"]),type:"text",placeholder:"输入模型名称,按回车添加",class:"form-input flex-1 text-sm"},null,40,pe),[[R,e.modelInput]]),t("button",{type:"button",onClick:S,class:"px-3 py-1.5 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors text-sm"},o[61]||(o[61]=[t("i",{class:"fas fa-plus"},null,-1)]))]),o[63]||(o[63]=t("p",{class:"text-xs text-gray-500 mt-1"},"例如:claude-opus-4-20250514",-1))])])):$("",!0)]),t("div",null,[t("div",ce,[b(t("input",{type:"checkbox","onUpdate:modelValue":o[23]||(o[23]=d=>e.enableClientRestriction=d),id:"enableClientRestriction",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[G,e.enableClientRestriction]]),o[64]||(o[64]=t("label",{for:"enableClientRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用客户端限制 ",-1))]),e.enableClientRestriction?(i(),r("div",xe,[t("div",null,[o[65]||(o[65]=t("label",{class:"block text-xs font-medium text-gray-700 mb-2"},"允许的客户端",-1)),t("div",fe,[(i(!0),r(_,null,T(h.value,d=>(i(),r("div",{key:d.id,class:"flex items-start"},[b(t("input",{type:"checkbox",id:`client_${d.id}`,value:d.id,"onUpdate:modelValue":o[24]||(o[24]=q=>e.allowedClients=q),class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 mt-0.5"},null,8,ge),[[G,e.allowedClients]]),t("label",{for:`client_${d.id}`,class:"ml-2 flex-1 cursor-pointer"},[t("span",be,u(d.name),1),t("span",ve,u(d.description),1)],8,ye)]))),128))])])])):$("",!0)]),t("div",we,[t("button",{type:"button",onClick:o[25]||(o[25]=d=>v.$emit("close")),class:"flex-1 px-4 py-2.5 bg-gray-100 text-gray-700 rounded-lg font-semibold hover:bg-gray-200 transition-colors text-sm"}," 取消 "),t("button",{type:"submit",disabled:D.value,class:"btn btn-primary flex-1 py-2.5 px-4 font-semibold text-sm"},[D.value?(i(),r("div",Ce)):(i(),r("i",Ae)),g(" "+u(D.value?"创建中...":"创建"),1)],8,$e)])],32)])])]))}},ke=J(Ke,[["__scopeId","data-v-060c3f39"]]),Le={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},De={class:"modal-content w-full max-w-md p-8 mx-auto max-h-[90vh] flex flex-col"},Ie={class:"flex items-center justify-between mb-6"},he=["value"],Me={class:"space-y-3"},Re={key:0,class:"flex flex-wrap gap-2"},Se=["onClick"],Pe={class:"flex gap-2"},_e=["onKeypress"],Te={class:"bg-blue-50 border border-blue-200 rounded-lg p-4 space-y-4"},Ee={class:"space-y-3"},Ve={class:"flex gap-2"},je={class:"flex gap-4"},Ue={class:"flex items-center cursor-pointer"},qe={class:"flex items-center cursor-pointer"},Fe={class:"flex items-center cursor-pointer"},Oe={class:"grid grid-cols-1 gap-3"},We=["disabled"],Ye=["value"],ze=["disabled"],Ne=["value"],He={class:"flex items-center mb-3"},Be={key:0,class:"space-y-3"},Ge={class:"flex flex-wrap gap-2 mb-3 min-h-[32px] p-2 bg-gray-50 rounded-lg border border-gray-200"},Qe=["onClick"],Xe={key:0,class:"text-gray-400 text-sm"},Je={class:"flex gap-2"},Ze=["onKeydown"],ts={class:"flex items-center mb-3"},es={key:0,class:"space-y-3"},ss={class:"space-y-2"},ls=["id","value"],os=["for"],ns={class:"text-sm font-medium text-gray-700"},is={class:"text-xs text-gray-500 block"},as={class:"flex gap-3 pt-4"},rs=["disabled"],ds={key:0,class:"loading-spinner mr-2"},us={key:1,class:"fas fa-save mr-2"},ms={__name:"EditApiKeyModal",props:{apiKey:{type:Object,required:!0},accounts:{type:Object,default:()=>({claude:[],gemini:[]})}},emits:["close","success"],setup(k,{emit:O}){const w=k,P=O;dt();const D=ut(),f=C(!1),L=C([]),h=C(""),e=it({name:"",tokenLimit:"",rateLimitWindow:"",rateLimitRequests:"",concurrencyLimit:"",dailyCostLimit:"",permissions:"all",claudeAccountId:"",geminiAccountId:"",enableModelRestriction:!1,restrictedModels:[],modelInput:"",enableClientRestriction:!1,allowedClients:[],tags:[]}),V=()=>{e.modelInput&&!e.restrictedModels.includes(e.modelInput)&&(e.restrictedModels.push(e.modelInput),e.modelInput="")},A=K=>{e.restrictedModels.splice(K,1)},c=()=>{if(h.value&&h.value.trim()){const K=h.value.trim();e.tags.includes(K)||e.tags.push(K),h.value=""}},y=K=>{e.tags.splice(K,1)},S=async()=>{f.value=!0;try{const K={tokenLimit:e.tokenLimit!==""&&e.tokenLimit!==null?parseInt(e.tokenLimit):0,rateLimitWindow:e.rateLimitWindow!==""&&e.rateLimitWindow!==null?parseInt(e.rateLimitWindow):0,rateLimitRequests:e.rateLimitRequests!==""&&e.rateLimitRequests!==null?parseInt(e.rateLimitRequests):0,concurrencyLimit:e.concurrencyLimit!==""&&e.concurrencyLimit!==null?parseInt(e.concurrencyLimit):0,dailyCostLimit:e.dailyCostLimit!==""&&e.dailyCostLimit!==null?parseFloat(e.dailyCostLimit):0,permissions:e.permissions,claudeAccountId:e.claudeAccountId||null,geminiAccountId:e.geminiAccountId||null,tags:e.tags};K.enableModelRestriction=e.enableModelRestriction,K.restrictedModels=e.restrictedModels,K.enableClientRestriction=e.enableClientRestriction,K.allowedClients=e.allowedClients;const n=await W.put(`/admin/api-keys/${w.apiKey.id}`,K);n.success?(P("success"),P("close")):I(n.message||"更新失败","error")}catch{I("更新失败","error")}finally{f.value=!1}};return at(async()=>{L.value=await D.loadSupportedClients(),e.name=w.apiKey.name,e.tokenLimit=w.apiKey.tokenLimit||"",e.rateLimitWindow=w.apiKey.rateLimitWindow||"",e.rateLimitRequests=w.apiKey.rateLimitRequests||"",e.concurrencyLimit=w.apiKey.concurrencyLimit||"",e.dailyCostLimit=w.apiKey.dailyCostLimit||"",e.permissions=w.apiKey.permissions||"all",e.claudeAccountId=w.apiKey.claudeAccountId||"",e.geminiAccountId=w.apiKey.geminiAccountId||"",e.restrictedModels=w.apiKey.restrictedModels||[],e.allowedClients=w.apiKey.allowedClients||[],e.tags=w.apiKey.tags||[],e.enableModelRestriction=e.restrictedModels.length>0,e.enableClientRestriction=e.allowedClients.length>0}),(K,n)=>(i(),z(st,{to:"body"},[t("div",Le,[t("div",De,[t("div",Ie,[n[22]||(n[22]=t("div",{class:"flex items-center gap-3"},[t("div",{class:"w-10 h-10 bg-gradient-to-br from-blue-500 to-blue-600 rounded-xl flex items-center justify-center"},[t("i",{class:"fas fa-edit text-white"})]),t("h3",{class:"text-xl font-bold text-gray-900"},"编辑 API Key")],-1)),t("button",{onClick:n[0]||(n[0]=m=>K.$emit("close")),class:"text-gray-400 hover:text-gray-600 transition-colors"},n[21]||(n[21]=[t("i",{class:"fas fa-times text-xl"},null,-1)]))]),t("form",{onSubmit:H(S,["prevent"]),class:"space-y-6 modal-scroll-content custom-scrollbar flex-1"},[t("div",null,[n[23]||(n[23]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"名称",-1)),t("input",{value:e.name,type:"text",disabled:"",class:"form-input w-full bg-gray-100 cursor-not-allowed"},null,8,he),n[24]||(n[24]=t("p",{class:"text-xs text-gray-500 mt-2"},"名称不可修改",-1))]),t("div",null,[n[28]||(n[28]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"标签",-1)),t("div",Me,[e.tags.length>0?(i(),r("div",Re,[(i(!0),r(_,null,T(e.tags,(m,j)=>(i(),r("span",{key:j,class:"inline-flex items-center gap-1 px-3 py-1 bg-blue-100 text-blue-800 text-sm rounded-full"},[g(u(m)+" ",1),t("button",{type:"button",onClick:v=>y(j),class:"ml-1 hover:text-blue-900"},n[25]||(n[25]=[t("i",{class:"fas fa-times text-xs"},null,-1)]),8,Se)]))),128))])):$("",!0),t("div",Pe,[b(t("input",{"onUpdate:modelValue":n[1]||(n[1]=m=>h.value=m),type:"text",class:"form-input flex-1",placeholder:"输入新标签名称",onKeypress:et(H(c,["prevent"]),["enter"])},null,40,_e),[[R,h.value]]),t("button",{type:"button",onClick:c,class:"px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors"},n[26]||(n[26]=[t("i",{class:"fas fa-plus"},null,-1)]))]),n[27]||(n[27]=t("p",{class:"text-xs text-gray-500"},"用于标记不同团队或用途,方便筛选管理",-1))])]),t("div",Te,[n[35]||(n[35]=t("div",{class:"flex items-start gap-3 mb-3"},[t("div",{class:"w-8 h-8 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"},[t("i",{class:"fas fa-tachometer-alt text-white text-sm"})]),t("div",{class:"flex-1"},[t("h4",{class:"font-semibold text-gray-800 mb-1"},"速率限制设置"),t("p",{class:"text-sm text-gray-600"},"控制 API Key 的使用频率和资源消耗")])],-1)),t("div",null,[n[29]||(n[29]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"时间窗口 (分钟)",-1)),b(t("input",{"onUpdate:modelValue":n[2]||(n[2]=m=>e.rateLimitWindow=m),type:"number",min:"1",placeholder:"留空表示无限制",class:"form-input w-full"},null,512),[[R,e.rateLimitWindow]]),n[30]||(n[30]=t("p",{class:"text-xs text-gray-500 mt-2"},"设置一个时间段(以分钟为单位),用于计算速率限制",-1))]),t("div",null,[n[31]||(n[31]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"时间窗口内的请求次数限制",-1)),b(t("input",{"onUpdate:modelValue":n[3]||(n[3]=m=>e.rateLimitRequests=m),type:"number",min:"1",placeholder:"留空表示无限制",class:"form-input w-full"},null,512),[[R,e.rateLimitRequests]]),n[32]||(n[32]=t("p",{class:"text-xs text-gray-500 mt-2"},"在时间窗口内允许的最大请求次数(需要先设置时间窗口)",-1))]),t("div",null,[n[33]||(n[33]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"时间窗口内的 Token 使用量限制",-1)),b(t("input",{"onUpdate:modelValue":n[4]||(n[4]=m=>e.tokenLimit=m),type:"number",min:"0",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[R,e.tokenLimit]]),n[34]||(n[34]=t("p",{class:"text-xs text-gray-500 mt-2"},"在时间窗口内允许消耗的最大 Token 数量(需要先设置时间窗口),0 或留空表示无限制",-1))]),n[36]||(n[36]=t("div",{class:"bg-blue-100 rounded-lg p-3 mt-3"},[t("h5",{class:"text-sm font-semibold text-blue-800 mb-2"},"💡 使用示例"),t("div",{class:"text-xs text-blue-700 space-y-1"},[t("p",null,[t("strong",null,"示例1:"),g(" 时间窗口=60,请求次数限制=100")]),t("p",{class:"ml-4"},"→ 每60分钟内最多允许100次请求"),t("p",{class:"mt-2"},[t("strong",null,"示例2:"),g(" 时间窗口=10,Token限制=50000")]),t("p",{class:"ml-4"},"→ 每10分钟内最多消耗50,000个Token"),t("p",{class:"mt-2"},[t("strong",null,"示例3:"),g(" 时间窗口=30,请求次数限制=50,Token限制=100000")]),t("p",{class:"ml-4"},"→ 每30分钟内最多50次请求且总Token不超过100,000")])],-1))]),t("div",null,[n[38]||(n[38]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"每日费用限制 (美元)",-1)),t("div",Ee,[t("div",Ve,[t("button",{type:"button",onClick:n[5]||(n[5]=m=>e.dailyCostLimit="50"),class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium"},"$50"),t("button",{type:"button",onClick:n[6]||(n[6]=m=>e.dailyCostLimit="100"),class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium"},"$100"),t("button",{type:"button",onClick:n[7]||(n[7]=m=>e.dailyCostLimit="200"),class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium"},"$200"),t("button",{type:"button",onClick:n[8]||(n[8]=m=>e.dailyCostLimit=""),class:"px-3 py-1 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm font-medium"},"自定义")]),b(t("input",{"onUpdate:modelValue":n[9]||(n[9]=m=>e.dailyCostLimit=m),type:"number",min:"0",step:"0.01",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[R,e.dailyCostLimit]]),n[37]||(n[37]=t("p",{class:"text-xs text-gray-500"},"设置此 API Key 每日的费用限制,超过限制将拒绝请求,0 或留空表示无限制",-1))])]),t("div",null,[n[39]||(n[39]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"并发限制",-1)),b(t("input",{"onUpdate:modelValue":n[10]||(n[10]=m=>e.concurrencyLimit=m),type:"number",min:"0",placeholder:"0 表示无限制",class:"form-input w-full"},null,512),[[R,e.concurrencyLimit]]),n[40]||(n[40]=t("p",{class:"text-xs text-gray-500 mt-2"},"设置此 API Key 可同时处理的最大请求数",-1))]),t("div",null,[n[44]||(n[44]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"服务权限",-1)),t("div",je,[t("label",Ue,[b(t("input",{type:"radio","onUpdate:modelValue":n[11]||(n[11]=m=>e.permissions=m),value:"all",class:"mr-2"},null,512),[[B,e.permissions]]),n[41]||(n[41]=t("span",{class:"text-sm text-gray-700"},"全部服务",-1))]),t("label",qe,[b(t("input",{type:"radio","onUpdate:modelValue":n[12]||(n[12]=m=>e.permissions=m),value:"claude",class:"mr-2"},null,512),[[B,e.permissions]]),n[42]||(n[42]=t("span",{class:"text-sm text-gray-700"},"仅 Claude",-1))]),t("label",Fe,[b(t("input",{type:"radio","onUpdate:modelValue":n[13]||(n[13]=m=>e.permissions=m),value:"gemini",class:"mr-2"},null,512),[[B,e.permissions]]),n[43]||(n[43]=t("span",{class:"text-sm text-gray-700"},"仅 Gemini",-1))])]),n[45]||(n[45]=t("p",{class:"text-xs text-gray-500 mt-2"},"控制此 API Key 可以访问哪些服务",-1))]),t("div",null,[n[50]||(n[50]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"专属账号绑定",-1)),t("div",Oe,[t("div",null,[n[47]||(n[47]=t("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Claude 专属账号",-1)),b(t("select",{"onUpdate:modelValue":n[14]||(n[14]=m=>e.claudeAccountId=m),class:"form-input w-full",disabled:e.permissions==="gemini"},[n[46]||(n[46]=t("option",{value:""},"使用共享账号池",-1)),(i(!0),r(_,null,T(k.accounts.claude,m=>(i(),r("option",{key:m.id,value:m.id},u(m.name)+" ("+u(m.status==="active"?"正常":"异常")+") ",9,Ye))),128))],8,We),[[N,e.claudeAccountId]])]),t("div",null,[n[49]||(n[49]=t("label",{class:"block text-sm font-medium text-gray-600 mb-1"},"Gemini 专属账号",-1)),b(t("select",{"onUpdate:modelValue":n[15]||(n[15]=m=>e.geminiAccountId=m),class:"form-input w-full",disabled:e.permissions==="claude"},[n[48]||(n[48]=t("option",{value:""},"使用共享账号池",-1)),(i(!0),r(_,null,T(k.accounts.gemini,m=>(i(),r("option",{key:m.id,value:m.id},u(m.name)+" ("+u(m.status==="active"?"正常":"异常")+") ",9,Ne))),128))],8,ze),[[N,e.geminiAccountId]])])]),n[51]||(n[51]=t("p",{class:"text-xs text-gray-500 mt-2"},"修改绑定账号将影响此API Key的请求路由",-1))]),t("div",null,[t("div",He,[b(t("input",{type:"checkbox","onUpdate:modelValue":n[16]||(n[16]=m=>e.enableModelRestriction=m),id:"editEnableModelRestriction",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[G,e.enableModelRestriction]]),n[52]||(n[52]=t("label",{for:"editEnableModelRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用模型限制 ",-1))]),e.enableModelRestriction?(i(),r("div",Be,[t("div",null,[n[55]||(n[55]=t("label",{class:"block text-sm font-medium text-gray-600 mb-2"},"限制的模型列表",-1)),t("div",Ge,[(i(!0),r(_,null,T(e.restrictedModels,(m,j)=>(i(),r("span",{key:j,class:"inline-flex items-center px-3 py-1 rounded-full text-sm bg-red-100 text-red-800"},[g(u(m)+" ",1),t("button",{type:"button",onClick:v=>A(j),class:"ml-2 text-red-600 hover:text-red-800"},n[53]||(n[53]=[t("i",{class:"fas fa-times text-xs"},null,-1)]),8,Qe)]))),128)),e.restrictedModels.length===0?(i(),r("span",Xe," 暂无限制的模型 ")):$("",!0)]),t("div",Je,[b(t("input",{"onUpdate:modelValue":n[17]||(n[17]=m=>e.modelInput=m),onKeydown:et(H(V,["prevent"]),["enter"]),type:"text",placeholder:"输入模型名称,按回车添加",class:"form-input flex-1"},null,40,Ze),[[R,e.modelInput]]),t("button",{type:"button",onClick:V,class:"px-4 py-2 bg-red-500 text-white rounded-lg hover:bg-red-600 transition-colors"},n[54]||(n[54]=[t("i",{class:"fas fa-plus"},null,-1)]))]),n[56]||(n[56]=t("p",{class:"text-xs text-gray-500 mt-2"},"设置此API Key无法访问的模型,例如:claude-opus-4-20250514",-1))])])):$("",!0)]),t("div",null,[t("div",ts,[b(t("input",{type:"checkbox","onUpdate:modelValue":n[18]||(n[18]=m=>e.enableClientRestriction=m),id:"editEnableClientRestriction",class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500"},null,512),[[G,e.enableClientRestriction]]),n[57]||(n[57]=t("label",{for:"editEnableClientRestriction",class:"ml-2 text-sm font-semibold text-gray-700 cursor-pointer"}," 启用客户端限制 ",-1))]),e.enableClientRestriction?(i(),r("div",es,[t("div",null,[n[58]||(n[58]=t("label",{class:"block text-sm font-medium text-gray-600 mb-2"},"允许的客户端",-1)),n[59]||(n[59]=t("p",{class:"text-xs text-gray-500 mb-3"},"勾选允许使用此API Key的客户端",-1)),t("div",ss,[(i(!0),r(_,null,T(L.value,m=>(i(),r("div",{key:m.id,class:"flex items-start"},[b(t("input",{type:"checkbox",id:`edit_client_${m.id}`,value:m.id,"onUpdate:modelValue":n[19]||(n[19]=j=>e.allowedClients=j),class:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 mt-0.5"},null,8,ls),[[G,e.allowedClients]]),t("label",{for:`edit_client_${m.id}`,class:"ml-2 flex-1 cursor-pointer"},[t("span",ns,u(m.name),1),t("span",is,u(m.description),1)],8,os)]))),128))])])])):$("",!0)]),t("div",as,[t("button",{type:"button",onClick:n[20]||(n[20]=m=>K.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),t("button",{type:"submit",disabled:f.value,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[f.value?(i(),r("div",ds)):(i(),r("i",us)),g(" "+u(f.value?"保存中...":"保存修改"),1)],8,rs)])],32)])])]))}},ps=J(ms,[["__scopeId","data-v-35ae96db"]]),cs={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},xs={class:"modal-content w-full max-w-md p-8 mx-auto max-h-[90vh] flex flex-col"},fs={class:"flex items-center justify-between mb-6"},gs={class:"space-y-6 modal-scroll-content custom-scrollbar flex-1"},ys={class:"bg-blue-50 border border-blue-200 rounded-lg p-4"},bs={class:"flex items-start gap-3"},vs={class:"text-sm text-gray-700"},ws={class:"text-xs text-gray-600 mt-1"},$s={key:0,class:"mt-3"},Cs=["min"],As={key:1,class:"text-xs text-gray-500 mt-2"},Ks={class:"flex gap-3 pt-4"},ks=["disabled"],Ls={key:0,class:"loading-spinner mr-2"},Ds={key:1,class:"fas fa-clock mr-2"},Is={__name:"RenewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close","success"],setup(k,{emit:O}){const w=k,P=O;dt();const D=C(!1),f=it({renewDuration:"30d",customExpireDate:"",newExpiresAt:null}),L=rt(()=>{const c=new Date;return w.apiKey.expiresAt&&new Date(w.apiKey.expiresAt)>c?new Date(w.apiKey.expiresAt).toISOString().slice(0,16):(c.setMinutes(c.getMinutes()+1),c.toISOString().slice(0,16))}),h=c=>new Date(c).toLocaleString("zh-CN",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}),e=()=>{if(!f.renewDuration){f.newExpiresAt=null;return}if(f.renewDuration==="permanent"){f.newExpiresAt=null;return}if(f.renewDuration==="custom")return;const c=w.apiKey.expiresAt&&new Date(w.apiKey.expiresAt)>new Date?new Date(w.apiKey.expiresAt):new Date,S=f.renewDuration.match(/(\d+)([dhmy])/);if(S){const[,K,n]=S,m=parseInt(K);switch(n){case"d":c.setDate(c.getDate()+m);break;case"h":c.setHours(c.getHours()+m);break;case"m":c.setMonth(c.getMonth()+m);break;case"y":c.setFullYear(c.getFullYear()+m);break}f.newExpiresAt=c.toISOString()}},V=()=>{f.customExpireDate&&(f.newExpiresAt=new Date(f.customExpireDate).toISOString())},A=async()=>{D.value=!0;try{const c={expiresAt:f.renewDuration==="permanent"?null:f.newExpiresAt},y=await W.put(`/admin/api-keys/${w.apiKey.id}/renew`,c);y.success?(I("API Key 续期成功","success"),P("success"),P("close")):I(y.message||"续期失败","error")}catch{I("续期失败","error")}finally{D.value=!1}};return e(),(c,y)=>(i(),z(st,{to:"body"},[t("div",cs,[t("div",xs,[t("div",fs,[y[5]||(y[5]=t("div",{class:"flex items-center gap-3"},[t("div",{class:"w-10 h-10 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[t("i",{class:"fas fa-clock text-white"})]),t("h3",{class:"text-xl font-bold text-gray-900"},"续期 API Key")],-1)),t("button",{onClick:y[0]||(y[0]=S=>c.$emit("close")),class:"text-gray-400 hover:text-gray-600 transition-colors"},y[4]||(y[4]=[t("i",{class:"fas fa-times text-xl"},null,-1)]))]),t("div",gs,[t("div",ys,[t("div",bs,[y[7]||(y[7]=t("div",{class:"w-8 h-8 bg-blue-500 rounded-lg flex items-center justify-center flex-shrink-0"},[t("i",{class:"fas fa-info text-white text-sm"})],-1)),t("div",null,[y[6]||(y[6]=t("h4",{class:"font-semibold text-gray-800 mb-1"},"API Key 信息",-1)),t("p",vs,u(k.apiKey.name),1),t("p",ws," 当前过期时间:"+u(k.apiKey.expiresAt?h(k.apiKey.expiresAt):"永不过期"),1)])])]),t("div",null,[y[9]||(y[9]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-3"},"续期时长",-1)),b(t("select",{"onUpdate:modelValue":y[1]||(y[1]=S=>f.renewDuration=S),onChange:e,class:"form-input w-full"},y[8]||(y[8]=[t("option",{value:"7d"},"延长 7 天",-1),t("option",{value:"30d"},"延长 30 天",-1),t("option",{value:"90d"},"延长 90 天",-1),t("option",{value:"180d"},"延长 180 天",-1),t("option",{value:"365d"},"延长 365 天",-1),t("option",{value:"custom"},"自定义日期",-1),t("option",{value:"permanent"},"设为永不过期",-1)]),544),[[N,f.renewDuration]]),f.renewDuration==="custom"?(i(),r("div",$s,[b(t("input",{"onUpdate:modelValue":y[2]||(y[2]=S=>f.customExpireDate=S),type:"datetime-local",class:"form-input w-full",min:L.value,onChange:V},null,40,Cs),[[R,f.customExpireDate]])])):$("",!0),f.newExpiresAt?(i(),r("p",As," 新的过期时间:"+u(h(f.newExpiresAt)),1)):$("",!0)])]),t("div",Ks,[t("button",{type:"button",onClick:y[3]||(y[3]=S=>c.$emit("close")),class:"flex-1 px-6 py-3 bg-gray-100 text-gray-700 rounded-xl font-semibold hover:bg-gray-200 transition-colors"}," 取消 "),t("button",{type:"button",onClick:A,disabled:D.value||!f.renewDuration,class:"btn btn-primary flex-1 py-3 px-6 font-semibold"},[D.value?(i(),r("div",Ls)):(i(),r("i",Ds)),g(" "+u(D.value?"续期中...":"确认续期"),1)],8,ks)])])])]))}},hs=J(Is,[["__scopeId","data-v-5486ec2f"]]),Ms={class:"fixed inset-0 modal z-50 flex items-center justify-center p-4"},Rs={class:"modal-content w-full max-w-lg p-8 mx-auto max-h-[90vh] overflow-y-auto custom-scrollbar"},Ss={class:"space-y-4 mb-6"},Ps={class:"p-3 bg-gray-50 rounded-lg border"},_s={class:"text-gray-900 font-medium"},Ts={key:0},Es={class:"p-3 bg-gray-50 rounded-lg border"},Vs={class:"text-gray-700"},js={class:"relative"},Us={class:"p-4 pr-14 bg-gray-900 rounded-lg border font-mono text-sm text-white break-all min-h-[60px] flex items-center"},qs={class:"absolute top-3 right-3"},Fs=["title"],Os={__name:"NewApiKeyModal",props:{apiKey:{type:Object,required:!0}},emits:["close"],setup(k,{emit:O}){const w=k,P=O,D=C(!1),f=()=>{D.value=!D.value},L=()=>{const A=w.apiKey.apiKey||w.apiKey.key||"";return A?D.value||A.length<=12?A:A.substring(0,8)+"●".repeat(Math.max(0,A.length-12))+A.substring(A.length-4):""},h=async()=>{const A=w.apiKey.apiKey||w.apiKey.key||"";if(!A){I("API Key 不存在","error");return}try{await navigator.clipboard.writeText(A),I("API Key 已复制到剪贴板","success")}catch(c){console.error("Failed to copy:",c);const y=document.createElement("textarea");y.value=A,document.body.appendChild(y),y.select();try{document.execCommand("copy"),I("API Key 已复制到剪贴板","success")}catch{I("复制失败,请手动复制","error")}finally{document.body.removeChild(y)}}},e=async()=>{window.showConfirm?await window.showConfirm("关闭提醒",`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。 + +确定要关闭吗?`,"确定关闭","取消")&&P("close"):confirm(`关闭后将无法再次查看完整的API Key,请确保已经妥善保存。 + +确定要关闭吗?`)&&P("close")},V=async()=>{window.showConfirm?await window.showConfirm("确定要关闭吗?",`您还没有保存API Key,关闭后将无法再次查看。 + +建议您先复制API Key再关闭。`,"仍然关闭","返回复制")&&P("close"):confirm(`您还没有保存API Key,关闭后将无法再次查看。 + +确定要关闭吗?`)&&P("close")};return(A,c)=>(i(),z(st,{to:"body"},[t("div",Ms,[t("div",Rs,[t("div",{class:"flex items-center justify-between mb-6"},[c[1]||(c[1]=t("div",{class:"flex items-center gap-3"},[t("div",{class:"w-12 h-12 bg-gradient-to-br from-green-500 to-green-600 rounded-xl flex items-center justify-center"},[t("i",{class:"fas fa-check text-white text-lg"})]),t("div",null,[t("h3",{class:"text-xl font-bold text-gray-900"},"API Key 创建成功"),t("p",{class:"text-sm text-gray-600"},"请妥善保存您的 API Key")])],-1)),t("button",{onClick:V,class:"text-gray-400 hover:text-gray-600 transition-colors",title:"直接关闭(不推荐)"},c[0]||(c[0]=[t("i",{class:"fas fa-times text-xl"},null,-1)]))]),c[7]||(c[7]=t("div",{class:"bg-amber-50 border-l-4 border-amber-400 p-4 mb-6"},[t("div",{class:"flex items-start"},[t("div",{class:"w-6 h-6 bg-amber-400 rounded-lg flex items-center justify-center flex-shrink-0 mt-0.5"},[t("i",{class:"fas fa-exclamation-triangle text-white text-sm"})]),t("div",{class:"ml-3"},[t("h5",{class:"font-semibold text-amber-900 mb-1"},"重要提醒"),t("p",{class:"text-sm text-amber-800"}," 这是您唯一能看到完整 API Key 的机会。关闭此窗口后,系统将不再显示完整的 API Key。请立即复制并妥善保存。 ")])])],-1)),t("div",Ss,[t("div",null,[c[2]||(c[2]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"API Key 名称",-1)),t("div",Ps,[t("span",_s,u(k.apiKey.name),1)])]),k.apiKey.description?(i(),r("div",Ts,[c[3]||(c[3]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"备注",-1)),t("div",Es,[t("span",Vs,u(k.apiKey.description||"无描述"),1)])])):$("",!0),t("div",null,[c[4]||(c[4]=t("label",{class:"block text-sm font-semibold text-gray-700 mb-2"},"API Key",-1)),t("div",js,[t("div",Us,u(L()),1),t("div",qs,[t("button",{onClick:f,type:"button",class:"btn-icon-sm hover:bg-gray-800 bg-gray-700",title:D.value?"隐藏API Key":"显示完整API Key"},[t("i",{class:U(["fas",D.value?"fa-eye-slash":"fa-eye","text-gray-300"])},null,2)],8,Fs)])]),c[5]||(c[5]=t("p",{class:"text-xs text-gray-500 mt-2"}," 点击眼睛图标切换显示模式,使用下方按钮复制完整 API Key ",-1))])]),t("div",{class:"flex gap-3"},[t("button",{onClick:h,class:"flex-1 btn btn-primary py-3 px-6 font-semibold flex items-center justify-center gap-2"},c[6]||(c[6]=[t("i",{class:"fas fa-copy"},null,-1),g(" 复制 API Key ",-1)])),t("button",{onClick:e,class:"px-6 py-3 bg-gray-200 text-gray-800 rounded-xl font-semibold hover:bg-gray-300 transition-colors border border-gray-300"}," 我已保存 ")])])])]))}},Ws=J(Os,[["__scopeId","data-v-3d91f349"]]),Ys={class:"tab-content"},zs={class:"card p-6"},Ns={class:"flex flex-col md:flex-row justify-between items-center gap-4 mb-6"},Hs={class:"flex items-center gap-3"},Bs=["value"],Gs={key:0,class:"text-center py-12"},Qs={key:1,class:"text-center py-12"},Xs={key:2,class:"table-container"},Js={class:"min-w-full"},Zs={class:"bg-gray-50/80 backdrop-blur-sm"},tl={key:1,class:"fas fa-sort ml-1 text-gray-400"},el={key:1,class:"fas fa-sort ml-1 text-gray-400"},sl={class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},ll={key:1,class:"fas fa-sort ml-1 text-gray-400"},ol={key:1,class:"fas fa-sort ml-1 text-gray-400"},nl={key:1,class:"fas fa-sort ml-1 text-gray-400"},il={class:"divide-y divide-gray-200/50"},al={class:"table-row"},rl={class:"px-6 py-4 whitespace-nowrap"},dl={class:"flex items-center"},ul={class:"text-sm font-semibold text-gray-900"},ml={class:"text-xs text-gray-500"},pl={class:"text-xs text-gray-500 mt-1"},cl={key:0},xl={key:1},fl={class:"px-6 py-4"},gl={class:"flex flex-wrap gap-1"},yl={key:0,class:"text-xs text-gray-400"},bl={class:"px-6 py-4 whitespace-nowrap"},vl={class:"text-sm font-mono text-gray-600 bg-gray-50 px-3 py-1 rounded-lg"},wl={class:"px-6 py-4 whitespace-nowrap"},$l={class:"px-6 py-4"},Cl={class:"space-y-1"},Al={class:"flex justify-between text-sm"},Kl={class:"font-medium text-gray-900"},kl={class:"flex justify-between text-sm"},Ll={class:"font-medium text-gray-900"},Dl={class:"flex justify-between text-sm"},Il={class:"font-medium text-green-600"},hl={key:0,class:"flex justify-between text-sm"},Ml={class:"flex justify-between text-sm"},Rl={class:"font-medium text-purple-600"},Sl={class:"flex justify-between text-sm"},Pl={key:0,class:"text-xs text-gray-500"},_l={key:1,class:"flex justify-between text-sm"},Tl={class:"font-medium text-indigo-600"},El={key:2,class:"flex justify-between text-sm"},Vl={class:"font-medium text-indigo-600"},jl={class:"flex justify-between text-xs text-gray-500"},Ul={key:3,class:"flex justify-between text-xs text-orange-500"},ql={class:"flex justify-between text-xs text-blue-600"},Fl={class:"pt-1 border-t border-gray-100"},Ol={class:"flex justify-between text-xs text-green-600"},Wl={class:"pt-2"},Yl=["onClick"],zl={class:"px-6 py-4 whitespace-nowrap text-sm text-gray-500"},Nl={class:"px-6 py-4 whitespace-nowrap text-sm"},Hl={key:0},Bl={key:0,class:"text-red-600"},Gl={key:1,class:"text-orange-600"},Ql={key:2,class:"text-gray-600"},Xl={key:1,class:"text-gray-400"},Jl={class:"px-6 py-4 whitespace-nowrap text-sm"},Zl={class:"flex gap-2"},to=["onClick"],eo=["onClick"],so=["onClick"],lo=["onClick"],oo={key:0},no={colspan:"7",class:"px-6 py-4 bg-gray-50"},io={key:0,class:"text-center py-4"},ao={class:"space-y-4"},ro={class:"flex items-center justify-between mb-4"},uo={class:"flex items-center gap-2"},mo={key:0,class:"text-xs text-gray-500 bg-gray-100 px-2 py-1 rounded-full"},po={class:"flex gap-1 items-center"},co={class:"flex gap-1 bg-gray-100 rounded p-1"},xo=["onClick"],fo={key:0,class:"text-center py-8"},go={class:"flex items-center justify-center gap-2 mb-3"},yo=["onClick"],bo={key:1,class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"},vo={class:"flex justify-between items-start mb-3"},wo={class:"flex-1"},$o={class:"text-sm font-semibold text-gray-800 block mb-1"},Co={class:"text-xs text-gray-500 bg-blue-50 px-2 py-1 rounded-full"},Ao={class:"space-y-2 mb-3"},Ko={class:"flex justify-between items-center text-sm"},ko={class:"font-semibold text-gray-900"},Lo={class:"flex justify-between items-center text-sm"},Do={class:"font-semibold text-green-600"},Io={class:"pt-2 mt-2 border-t border-gray-100"},ho={class:"flex justify-between items-center text-xs text-gray-500"},Mo={class:"font-medium"},Ro={class:"flex justify-between items-center text-xs text-gray-500"},So={class:"font-medium"},Po={key:0,class:"flex justify-between items-center text-xs text-purple-600"},_o={class:"font-medium"},To={key:1,class:"flex justify-between items-center text-xs text-purple-600"},Eo={class:"font-medium"},Vo={class:"w-full bg-gray-200 rounded-full h-2 mt-3"},jo={class:"text-right mt-1"},Uo={class:"text-xs font-medium text-indigo-600"},qo={key:2,class:"mt-4 p-3 bg-gradient-to-r from-indigo-50 to-purple-50 rounded-lg border border-indigo-100"},Fo={class:"flex items-center justify-between text-sm"},Oo={class:"flex gap-4 text-xs"},Wo={class:"text-gray-600"},Yo={class:"font-semibold text-gray-800"},zo={class:"text-gray-600"},No={class:"font-semibold text-gray-800"},Ho={__name:"ApiKeysView",setup(k){const O=ut(),w=C([]),P=C(!1),D=C("today"),f=C(""),L=C("asc"),h=C({}),e=C({}),V=C({}),A=C([new Date(2e3,1,1,0,0,0),new Date(2e3,2,1,23,59,59)]),c=C({claude:[],gemini:[]}),y=C(""),S=C([]),K=C(!1),n=C(!1),m=C(!1),j=C(!1),v=C(null),o=C(null),d=C(null),q=rt(()=>{let a=w.value;return y.value&&(a=w.value.filter(x=>x.tags&&x.tags.includes(y.value))),f.value?[...a].sort((x,l)=>{let p=x[f.value],M=l[f.value];return f.value==="status"?(p=x.isActive?1:0,M=l.isActive?1:0):f.value==="cost"?(p=parseFloat(lt(x.usage).replace("$","")),M=parseFloat(lt(l.usage).replace("$",""))):(f.value==="createdAt"||f.value==="expiresAt")&&(p=p?new Date(p).getTime():0,M=M?new Date(M).getTime():0),pM?L.value==="asc"?1:-1:0}):a}),Q=async()=>{try{const[a,s]=await Promise.all([W.get("/admin/claude-accounts"),W.get("/admin/gemini-accounts")]);a.success&&(c.value.claude=a.data||[]),s.success&&(c.value.gemini=s.data||[])}catch(a){console.error("加载账户列表失败:",a)}},F=async()=>{P.value=!0;try{const a=await W.get(`/admin/api-keys?timeRange=${D.value}`);if(a.success){w.value=a.data||[];const s=new Set;w.value.forEach(x=>{x.tags&&Array.isArray(x.tags)&&x.tags.forEach(l=>s.add(l))}),S.value=Array.from(s).sort()}}catch{I("加载 API Keys 失败","error")}finally{P.value=!1}},X=a=>{f.value===a?L.value=L.value==="asc"?"desc":"asc":(f.value=a,L.value="asc")},E=a=>!a&&a!==0?"0":a.toLocaleString("zh-CN"),lt=a=>!a||!a.total?"$0.0000":`$${(a.total.cost||0).toFixed(4)}`,gt=a=>{if(!a)return"未知账户";const s=c.value.claude.find(l=>l.id===a);if(s)return s.name;const x=c.value.gemini.find(l=>l.id===a);return x?x.name:`账户-${a.substring(0,8)}`},ot=a=>a?new Date(a)!a||ot(a)?!1:(new Date(a)-new Date)/(1e3*60*60*24)<=7,pt=a=>a?new Date(a).toLocaleDateString("zh-CN"):"",yt=async a=>{h.value[a]?h.value[a]=!1:(h.value[a]=!0,V.value[a]||xt(a),await Z(a,!0))},Z=async(a,s=!1)=>{if(!s&&e.value[a]&&e.value[a].length>0)return;const x=Y(a);try{let l=`/admin/api-keys/${a}/model-stats`;const p=new URLSearchParams;if(x.customStart&&x.customEnd)p.append("startDate",x.customStart),p.append("endDate",x.customEnd),p.append("period","custom");else{const tt=x.preset==="today"?"daily":"monthly";p.append("period",tt)}l+="?"+p.toString();const M=await W.get(l);M.success&&(e.value[a]=M.data||[])}catch{I("加载模型统计失败","error"),e.value[a]=[]}},ct=(a,s)=>{const x=s.reduce((l,p)=>l+(p.allTokens||0),0);return x===0?0:Math.round(a/x*100)},bt=a=>a.formatted&&a.formatted.total?a.formatted.total:a.cost!==void 0?`$${a.cost.toFixed(6)}`:"$0.000000",xt=a=>{const s=new Date,x=new Date(s);x.setDate(s.getDate()-6),V.value[a]={type:"preset",preset:"7days",customStart:x.toISOString().split("T")[0],customEnd:s.toISOString().split("T")[0],customRange:null,presetOptions:[{value:"today",label:"今日",days:1},{value:"7days",label:"7天",days:7},{value:"30days",label:"30天",days:30}]}},Y=a=>(V.value[a]||xt(a),V.value[a]),ft=(a,s)=>{const x=Y(s);x.type="preset",x.preset=a;const l=x.presetOptions.find(p=>p.value===a);if(l){const p=new Date,M=new Date(p);M.setDate(p.getDate()-(l.days-1)),x.customStart=M.toISOString().split("T")[0],x.customEnd=p.toISOString().split("T")[0];const tt=nt=>nt.getFullYear()+"-"+String(nt.getMonth()+1).padStart(2,"0")+"-"+String(nt.getDate()).padStart(2,"0")+" 00:00:00";x.customRange=[tt(M),tt(p)]}Z(s,!0)},vt=(a,s)=>{const x=Y(a);s&&s.length===2?(x.type="custom",x.preset="",x.customRange=s,x.customStart=s[0].split(" ")[0],x.customEnd=s[1].split(" ")[0],Z(a,!0)):s===null&&ft("7days",a)},wt=a=>a>new Date,$t=a=>{const s=Y(a);s.type="preset",s.preset="7days";const x=new Date,l=new Date(x);l.setDate(x.getDate()-6),s.customStart=l.toISOString().split("T")[0],s.customEnd=x.toISOString().split("T")[0],s.customRange=null,Z(a,!0),I("已重置筛选条件并刷新数据","info")},Ct=()=>{K.value=!0},At=a=>{v.value=a,n.value=!0},Kt=a=>{o.value=a,m.value=!0},kt=a=>{K.value=!1,d.value=a,j.value=!0,F()},Lt=()=>{n.value=!1,I("API Key 更新成功","success"),F()},Dt=()=>{m.value=!1,I("API Key 续期成功","success"),F()},It=async a=>{let s=!1;if(window.showConfirm?s=await window.showConfirm("删除 API Key","确定要删除这个 API Key 吗?此操作不可恢复。","确定删除","取消"):s=confirm("确定要删除这个 API Key 吗?此操作不可恢复。"),!!s)try{const x=await W.delete(`/admin/api-keys/${a}`);x.success?(I("API Key 已删除","success"),F()):I(x.message||"删除失败","error")}catch{I("删除失败","error")}},ht=a=>{const x=`${window.location.origin}/admin/api-stats?apiId=${a.id}`,l=document.createElement("textarea");l.value=x,l.style.position="fixed",l.style.opacity="0",l.style.left="-9999px",document.body.appendChild(l),l.select(),l.setSelectionRange(0,99999);try{document.execCommand("copy")?I("已复制统计页面链接","success"):(I("复制失败,请手动复制","error"),console.log("统计页面链接:",x))}catch(p){I("复制失败,请手动复制","error"),console.error("复制错误:",p),console.log("统计页面链接:",x)}finally{document.body.removeChild(l)}};return at(async()=>{await Promise.all([O.loadSupportedClients(),Q(),F()])}),(a,s)=>{const x=Mt;return i(),r("div",Ys,[t("div",zs,[t("div",Ns,[s[15]||(s[15]=t("div",null,[t("h3",{class:"text-xl font-bold text-gray-900 mb-2"},"API Keys 管理"),t("p",{class:"text-gray-600"},"管理和监控您的 API 密钥")],-1)),t("div",Hs,[b(t("select",{"onUpdate:modelValue":s[0]||(s[0]=l=>D.value=l),onChange:s[1]||(s[1]=l=>F()),class:"form-input px-3 py-2 text-sm"},s[12]||(s[12]=[t("option",{value:"today"},"今日",-1),t("option",{value:"7days"},"最近7天",-1),t("option",{value:"monthly"},"本月",-1),t("option",{value:"all"},"全部时间",-1)]),544),[[N,D.value]]),b(t("select",{"onUpdate:modelValue":s[2]||(s[2]=l=>y.value=l),class:"form-input px-3 py-2 text-sm"},[s[13]||(s[13]=t("option",{value:""},"所有标签",-1)),(i(!0),r(_,null,T(S.value,l=>(i(),r("option",{key:l,value:l},u(l),9,Bs))),128))],512),[[N,y.value]]),t("button",{onClick:H(Ct,["stop"]),class:"btn btn-primary px-6 py-3 flex items-center gap-2"},s[14]||(s[14]=[t("i",{class:"fas fa-plus"},null,-1),g("创建新 Key ",-1)]))])]),P.value?(i(),r("div",Gs,s[16]||(s[16]=[t("div",{class:"loading-spinner mx-auto mb-4"},null,-1),t("p",{class:"text-gray-500"},"正在加载 API Keys...",-1)]))):w.value.length===0?(i(),r("div",Qs,s[17]||(s[17]=[t("div",{class:"w-16 h-16 mx-auto mb-4 bg-gray-100 rounded-full flex items-center justify-center"},[t("i",{class:"fas fa-key text-gray-400 text-xl"})],-1),t("p",{class:"text-gray-500 text-lg"},"暂无 API Keys",-1),t("p",{class:"text-gray-400 text-sm mt-2"},"点击上方按钮创建您的第一个 API Key",-1)]))):(i(),r("div",Xs,[t("table",Js,[t("thead",Zs,[t("tr",null,[t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[3]||(s[3]=l=>X("name"))},[s[18]||(s[18]=g(" 名称 ",-1)),f.value==="name"?(i(),r("i",{key:0,class:U(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),r("i",tl))]),s[25]||(s[25]=t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"标签",-1)),s[26]||(s[26]=t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"API Key",-1)),t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[4]||(s[4]=l=>X("status"))},[s[19]||(s[19]=g(" 状态 ",-1)),f.value==="status"?(i(),r("i",{key:0,class:U(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),r("i",el))]),t("th",sl,[s[22]||(s[22]=g(" 使用统计 ",-1)),t("span",{class:"cursor-pointer hover:bg-gray-100 px-2 py-1 rounded",onClick:s[5]||(s[5]=l=>X("cost"))},[s[20]||(s[20]=g(" (费用 ",-1)),f.value==="cost"?(i(),r("i",{key:0,class:U(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),r("i",ll)),s[21]||(s[21]=g(") ",-1))])]),t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[6]||(s[6]=l=>X("createdAt"))},[s[23]||(s[23]=g(" 创建时间 ",-1)),f.value==="createdAt"?(i(),r("i",{key:0,class:U(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),r("i",ol))]),t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider cursor-pointer hover:bg-gray-100",onClick:s[7]||(s[7]=l=>X("expiresAt"))},[s[24]||(s[24]=g(" 过期时间 ",-1)),f.value==="expiresAt"?(i(),r("i",{key:0,class:U(["fas",L.value==="asc"?"fa-sort-up":"fa-sort-down","ml-1"])},null,2)):(i(),r("i",nl))]),s[27]||(s[27]=t("th",{class:"px-6 py-4 text-left text-xs font-bold text-gray-700 uppercase tracking-wider"},"操作",-1))])]),t("tbody",il,[(i(!0),r(_,null,T(q.value,l=>(i(),r(_,{key:l.id},[t("tr",al,[t("td",rl,[t("div",dl,[s[30]||(s[30]=t("div",{class:"w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center mr-3"},[t("i",{class:"fas fa-key text-white text-xs"})],-1)),t("div",null,[t("div",ul,u(l.name),1),t("div",ml,u(l.id),1),t("div",pl,[l.claudeAccountId?(i(),r("span",cl,[s[28]||(s[28]=t("i",{class:"fas fa-link mr-1"},null,-1)),g(" 绑定: "+u(gt(l.claudeAccountId)),1)])):(i(),r("span",xl,s[29]||(s[29]=[t("i",{class:"fas fa-share-alt mr-1"},null,-1),g(" 使用共享池 ",-1)])))])])])]),t("td",fl,[t("div",gl,[(i(!0),r(_,null,T(l.tags||[],p=>(i(),r("span",{key:p,class:"inline-flex items-center px-2 py-0.5 bg-blue-100 text-blue-800 text-xs rounded-full"},u(p),1))),128)),!l.tags||l.tags.length===0?(i(),r("span",yl,"无标签")):$("",!0)])]),t("td",bl,[t("div",vl,u((l.apiKey||"").substring(0,20))+"... ",1)]),t("td",wl,[t("span",{class:U(["inline-flex items-center px-3 py-1 rounded-full text-xs font-semibold",l.isActive?"bg-green-100 text-green-800":"bg-red-100 text-red-800"])},[t("div",{class:U(["w-2 h-2 rounded-full mr-2",l.isActive?"bg-green-500":"bg-red-500"])},null,2),g(" "+u(l.isActive?"活跃":"禁用"),1)],2)]),t("td",$l,[t("div",Cl,[t("div",Al,[s[31]||(s[31]=t("span",{class:"text-gray-600"},"请求数:",-1)),t("span",Kl,u(E(l.usage&&l.usage.total&&l.usage.total.requests||0)),1)]),t("div",kl,[s[32]||(s[32]=t("span",{class:"text-gray-600"},"Token:",-1)),t("span",Ll,u(E(l.usage&&l.usage.total&&l.usage.total.tokens||0)),1)]),t("div",Dl,[s[33]||(s[33]=t("span",{class:"text-gray-600"},"费用:",-1)),t("span",Il,u(lt(l.usage)),1)]),l.dailyCostLimit>0?(i(),r("div",hl,[s[34]||(s[34]=t("span",{class:"text-gray-600"},"今日费用:",-1)),t("span",{class:U(["font-medium",(l.dailyCost||0)>=l.dailyCostLimit?"text-red-600":"text-blue-600"])}," $"+u((l.dailyCost||0).toFixed(2))+" / $"+u(l.dailyCostLimit.toFixed(2)),3)])):$("",!0),t("div",Ml,[s[35]||(s[35]=t("span",{class:"text-gray-600"},"并发限制:",-1)),t("span",Rl,u(l.concurrencyLimit>0?l.concurrencyLimit:"无限制"),1)]),t("div",Sl,[s[36]||(s[36]=t("span",{class:"text-gray-600"},"当前并发:",-1)),t("span",{class:U(["font-medium",l.currentConcurrency>0?"text-orange-600":"text-gray-600"])},[g(u(l.currentConcurrency||0)+" ",1),l.concurrencyLimit>0?(i(),r("span",Pl,"/ "+u(l.concurrencyLimit),1)):$("",!0)],2)]),l.rateLimitWindow>0?(i(),r("div",_l,[s[37]||(s[37]=t("span",{class:"text-gray-600"},"时间窗口:",-1)),t("span",Tl,u(l.rateLimitWindow)+" 分钟",1)])):$("",!0),l.rateLimitRequests>0?(i(),r("div",El,[s[38]||(s[38]=t("span",{class:"text-gray-600"},"请求限制:",-1)),t("span",Vl,u(l.rateLimitRequests)+" 次/窗口",1)])):$("",!0),t("div",jl,[t("span",null,"输入: "+u(E(l.usage&&l.usage.total&&l.usage.total.inputTokens||0)),1),t("span",null,"输出: "+u(E(l.usage&&l.usage.total&&l.usage.total.outputTokens||0)),1)]),(l.usage&&l.usage.total&&l.usage.total.cacheCreateTokens||0)>0||(l.usage&&l.usage.total&&l.usage.total.cacheReadTokens||0)>0?(i(),r("div",Ul,[t("span",null,"缓存创建: "+u(E(l.usage&&l.usage.total&&l.usage.total.cacheCreateTokens||0)),1),t("span",null,"缓存读取: "+u(E(l.usage&&l.usage.total&&l.usage.total.cacheReadTokens||0)),1)])):$("",!0),t("div",ql,[t("span",null,"RPM: "+u(l.usage&&l.usage.averages&&l.usage.averages.rpm||0),1),t("span",null,"TPM: "+u(l.usage&&l.usage.averages&&l.usage.averages.tpm||0),1)]),t("div",Fl,[t("div",Ol,[t("span",null,"今日: "+u(E(l.usage&&l.usage.daily&&l.usage.daily.requests||0))+"次",1),t("span",null,u(E(l.usage&&l.usage.daily&&l.usage.daily.tokens||0))+"T",1)])]),t("div",Wl,[l&&l.id?(i(),r("button",{key:0,onClick:p=>yt(l.id),class:"text-xs text-indigo-600 hover:text-indigo-800 font-medium"},[t("i",{class:U(["fas",h.value[l.id]?"fa-chevron-up":"fa-chevron-down","mr-1"])},null,2),s[39]||(s[39]=g(" 模型使用分布 ",-1))],8,Yl)):$("",!0)])])]),t("td",zl,u(new Date(l.createdAt).toLocaleDateString()),1),t("td",Nl,[l.expiresAt?(i(),r("div",Hl,[ot(l.expiresAt)?(i(),r("div",Bl,s[40]||(s[40]=[t("i",{class:"fas fa-exclamation-circle mr-1"},null,-1),g(" 已过期 ",-1)]))):mt(l.expiresAt)?(i(),r("div",Gl,[s[41]||(s[41]=t("i",{class:"fas fa-clock mr-1"},null,-1)),g(" "+u(pt(l.expiresAt)),1)])):(i(),r("div",Ql,u(pt(l.expiresAt)),1))])):(i(),r("div",Xl,s[42]||(s[42]=[t("i",{class:"fas fa-infinity mr-1"},null,-1),g(" 永不过期 ",-1)])))]),t("td",Jl,[t("div",Zl,[t("button",{onClick:p=>ht(l),class:"text-purple-600 hover:text-purple-900 font-medium hover:bg-purple-50 px-3 py-1 rounded-lg transition-colors",title:"复制统计页面链接"},s[43]||(s[43]=[t("i",{class:"fas fa-chart-bar mr-1"},null,-1),g("统计 ",-1)]),8,to),t("button",{onClick:p=>At(l),class:"text-blue-600 hover:text-blue-900 font-medium hover:bg-blue-50 px-3 py-1 rounded-lg transition-colors"},s[44]||(s[44]=[t("i",{class:"fas fa-edit mr-1"},null,-1),g("编辑 ",-1)]),8,eo),l.expiresAt&&(ot(l.expiresAt)||mt(l.expiresAt))?(i(),r("button",{key:0,onClick:p=>Kt(l),class:"text-green-600 hover:text-green-900 font-medium hover:bg-green-50 px-3 py-1 rounded-lg transition-colors"},s[45]||(s[45]=[t("i",{class:"fas fa-clock mr-1"},null,-1),g("续期 ",-1)]),8,so)):$("",!0),t("button",{onClick:p=>It(l.id),class:"text-red-600 hover:text-red-900 font-medium hover:bg-red-50 px-3 py-1 rounded-lg transition-colors"},s[46]||(s[46]=[t("i",{class:"fas fa-trash mr-1"},null,-1),g("删除 ",-1)]),8,lo)])])]),l&&l.id&&h.value[l.id]?(i(),r("tr",oo,[t("td",no,[e.value[l.id]?$("",!0):(i(),r("div",io,s[47]||(s[47]=[t("div",{class:"loading-spinner mx-auto"},null,-1),t("p",{class:"text-sm text-gray-500 mt-2"},"加载模型统计...",-1)]))),t("div",ao,[t("div",ro,[s[48]||(s[48]=t("h5",{class:"text-sm font-semibold text-gray-700 flex items-center"},[t("i",{class:"fas fa-chart-pie text-indigo-500 mr-2"}),g(" 模型使用分布 ")],-1)),t("div",uo,[e.value[l.id]&&e.value[l.id].length>0?(i(),r("span",mo,u(e.value[l.id].length)+" 个模型 ",1)):$("",!0),t("div",po,[t("div",co,[(i(!0),r(_,null,T(Y(l.id).presetOptions,p=>(i(),r("button",{key:p.value,onClick:M=>ft(p.value,l.id),class:U(["px-2 py-1 rounded text-xs font-medium transition-colors",Y(l.id).preset===p.value&&Y(l.id).type==="preset"?"bg-white text-blue-600 shadow-sm":"text-gray-600 hover:text-gray-900"])},u(p.label),11,xo))),128))]),St(x,{"model-value":Y(l.id).customRange,"onUpdate:modelValue":p=>vt(l.id,p),type:"datetimerange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期",format:"YYYY-MM-DD HH:mm:ss","value-format":"YYYY-MM-DD HH:mm:ss","disabled-date":wt,"default-time":A.value,size:"small",style:{width:"280px"},class:"api-key-date-picker",clearable:!0,"unlink-panels":!1},null,8,["model-value","onUpdate:modelValue","default-time"])])])]),e.value[l.id]&&e.value[l.id].length===0?(i(),r("div",fo,[t("div",go,[s[50]||(s[50]=t("i",{class:"fas fa-chart-line text-gray-400 text-lg"},null,-1)),s[51]||(s[51]=t("p",{class:"text-sm text-gray-500"},"暂无模型使用数据",-1)),t("button",{onClick:p=>$t(l.id),class:"text-blue-500 hover:text-blue-700 text-sm ml-2 flex items-center gap-1 transition-colors",title:"重置筛选条件并刷新"},s[49]||(s[49]=[t("i",{class:"fas fa-sync-alt text-xs"},null,-1),t("span",{class:"text-xs"},"刷新",-1)]),8,yo)]),s[52]||(s[52]=t("p",{class:"text-xs text-gray-400"},"尝试调整时间范围或点击刷新重新加载数据",-1))])):e.value[l.id]&&e.value[l.id].length>0?(i(),r("div",bo,[(i(!0),r(_,null,T(e.value[l.id],p=>(i(),r("div",{key:p.model,class:"bg-gradient-to-br from-white to-gray-50 rounded-xl p-4 border border-gray-200 hover:border-indigo-300 hover:shadow-lg transition-all duration-200"},[t("div",vo,[t("div",wo,[t("span",$o,u(p.model),1),t("span",Co,u(p.requests)+" 次请求",1)])]),t("div",Ao,[t("div",Ko,[s[53]||(s[53]=t("span",{class:"text-gray-600 flex items-center"},[t("i",{class:"fas fa-coins text-yellow-500 mr-1 text-xs"}),g(" 总Token: ")],-1)),t("span",ko,u(E(p.allTokens)),1)]),t("div",Lo,[s[54]||(s[54]=t("span",{class:"text-gray-600 flex items-center"},[t("i",{class:"fas fa-dollar-sign text-green-500 mr-1 text-xs"}),g(" 费用: ")],-1)),t("span",Do,u(bt(p)),1)]),t("div",Io,[t("div",ho,[s[55]||(s[55]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-arrow-down text-green-500 mr-1"}),g(" 输入: ")],-1)),t("span",Mo,u(E(p.inputTokens)),1)]),t("div",Ro,[s[56]||(s[56]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-arrow-up text-blue-500 mr-1"}),g(" 输出: ")],-1)),t("span",So,u(E(p.outputTokens)),1)]),p.cacheCreateTokens>0?(i(),r("div",Po,[s[57]||(s[57]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-save mr-1"}),g(" 缓存创建: ")],-1)),t("span",_o,u(E(p.cacheCreateTokens)),1)])):$("",!0),p.cacheReadTokens>0?(i(),r("div",To,[s[58]||(s[58]=t("span",{class:"flex items-center"},[t("i",{class:"fas fa-download mr-1"}),g(" 缓存读取: ")],-1)),t("span",Eo,u(E(p.cacheReadTokens)),1)])):$("",!0)])]),t("div",Vo,[t("div",{class:"bg-gradient-to-r from-indigo-500 to-purple-600 h-2 rounded-full transition-all duration-500",style:Pt({width:ct(p.allTokens,e.value[l.id])+"%"})},null,4)]),t("div",jo,[t("span",Uo,u(ct(p.allTokens,e.value[l.id]))+"% ",1)])]))),128))])):$("",!0),e.value[l.id]&&e.value[l.id].length>0?(i(),r("div",qo,[t("div",Fo,[s[61]||(s[61]=t("span",{class:"font-semibold text-gray-700 flex items-center"},[t("i",{class:"fas fa-calculator text-indigo-500 mr-2"}),g(" 总计统计 ")],-1)),t("div",Oo,[t("span",Wo,[s[59]||(s[59]=g(" 总请求: ",-1)),t("span",Yo,u(e.value[l.id].reduce((p,M)=>p+M.requests,0)),1)]),t("span",zo,[s[60]||(s[60]=g(" 总Token: ",-1)),t("span",No,u(E(e.value[l.id].reduce((p,M)=>p+M.allTokens,0))),1)])])])])):$("",!0)])])])):$("",!0)],64))),128))])])]))]),K.value?(i(),z(ke,{key:0,accounts:c.value,onClose:s[8]||(s[8]=l=>K.value=!1),onSuccess:kt},null,8,["accounts"])):$("",!0),n.value?(i(),z(ps,{key:1,apiKey:v.value,accounts:c.value,onClose:s[9]||(s[9]=l=>n.value=!1),onSuccess:Lt},null,8,["apiKey","accounts"])):$("",!0),m.value?(i(),z(hs,{key:2,apiKey:o.value,onClose:s[10]||(s[10]=l=>m.value=!1),onSuccess:Dt},null,8,["apiKey"])):$("",!0),j.value?(i(),z(Ws,{key:3,apiKey:d.value,onClose:s[11]||(s[11]=l=>j.value=!1)},null,8,["apiKey"])):$("",!0)])}}},Zo=J(Ho,[["__scopeId","data-v-518dfd83"]]);export{Zo as default}; diff --git a/web/admin-spa/dist/assets/index-Bv1yS6pY.css b/web/admin-spa/dist/assets/index-Ce1o7Q_r.css similarity index 69% rename from web/admin-spa/dist/assets/index-Bv1yS6pY.css rename to web/admin-spa/dist/assets/index-Ce1o7Q_r.css index 7dab8f08..1155af0f 100644 --- a/web/admin-spa/dist/assets/index-Bv1yS6pY.css +++ b/web/admin-spa/dist/assets/index-Ce1o7Q_r.css @@ -1,5 +1,5 @@ -.toast-container[data-v-383c6781]{position:fixed;top:20px;right:20px;z-index:9999;display:flex;flex-direction:column;gap:12px;pointer-events:none}.toast[data-v-383c6781]{min-width:320px;max-width:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid #e5e7eb;overflow:hidden;position:relative;pointer-events:auto;cursor:pointer;transform:translate(100%);opacity:0;transition:all .3s cubic-bezier(.4,0,.2,1)}.toast-show[data-v-383c6781]{transform:translate(0);opacity:1}.toast-hide[data-v-383c6781]{transform:translate(100%);opacity:0}.toast-content[data-v-383c6781]{display:flex;align-items:flex-start;padding:16px;gap:12px}.toast-icon[data-v-383c6781]{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:14px}.toast-body[data-v-383c6781]{flex:1}.toast-title[data-v-383c6781]{font-weight:600;font-size:14px;line-height:1.4;margin-bottom:4px}.toast-message[data-v-383c6781]{font-size:14px;line-height:1.5;word-wrap:break-word}.toast-close[data-v-383c6781]{flex-shrink:0;width:24px;height:24px;border:none;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;color:#9ca3af;transition:all .2s ease}.toast-close[data-v-383c6781]:hover{background:#f3f4f6;color:#6b7280}.toast-progress[data-v-383c6781]{position:absolute;bottom:0;left:0;height:3px;background:currentColor;opacity:.3;animation:toast-progress-383c6781 linear forwards}@keyframes toast-progress-383c6781{0%{width:100%}to{width:0%}}.toast-success[data-v-383c6781]{border-left:4px solid #10b981}.toast-success .toast-icon[data-v-383c6781]{color:#10b981;background:#d1fae5}.toast-success .toast-title[data-v-383c6781]{color:#065f46}.toast-success .toast-message[data-v-383c6781]{color:#047857}.toast-success .toast-progress[data-v-383c6781]{background:#10b981}.toast-error[data-v-383c6781]{border-left:4px solid #ef4444}.toast-error .toast-icon[data-v-383c6781]{color:#ef4444;background:#fee2e2}.toast-error .toast-title[data-v-383c6781]{color:#991b1b}.toast-error .toast-message[data-v-383c6781]{color:#dc2626}.toast-error .toast-progress[data-v-383c6781]{background:#ef4444}.toast-warning[data-v-383c6781]{border-left:4px solid #f59e0b}.toast-warning .toast-icon[data-v-383c6781]{color:#f59e0b;background:#fef3c7}.toast-warning .toast-title[data-v-383c6781]{color:#92400e}.toast-warning .toast-message[data-v-383c6781]{color:#d97706}.toast-warning .toast-progress[data-v-383c6781]{background:#f59e0b}.toast-info[data-v-383c6781]{border-left:4px solid #3b82f6}.toast-info .toast-icon[data-v-383c6781]{color:#3b82f6;background:#dbeafe}.toast-info .toast-title[data-v-383c6781]{color:#1e40af}.toast-info .toast-message[data-v-383c6781]{color:#2563eb}.toast-info .toast-progress[data-v-383c6781]{background:#3b82f6}@media (max-width: 640px){.toast-container[data-v-383c6781]{top:10px;right:10px;left:10px}.toast[data-v-383c6781]{min-width:auto;max-width:none}}.toast-list-enter-active[data-v-383c6781],.toast-list-leave-active[data-v-383c6781]{transition:all .3s ease}.toast-list-enter-from[data-v-383c6781],.toast-list-leave-to[data-v-383c6781]{opacity:0;transform:translate(100%)}.toast-list-move[data-v-383c6781]{transition:transform .3s ease}.modal[data-v-70e604e3]{background:#00000080;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.modal-content[data-v-70e604e3]{background:#fff;border-radius:16px;box-shadow:0 20px 64px #00000026;border:1px solid #e5e7eb;max-height:90vh;overflow-y:auto}.btn[data-v-70e604e3]{display:inline-flex;align-items:center;justify-content:center;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn[data-v-70e604e3]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-danger[data-v-70e604e3]{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.btn-danger[data-v-70e604e3]:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.btn-danger[data-v-70e604e3]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.btn-warning[data-v-70e604e3]{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.btn-warning[data-v-70e604e3]:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.btn-warning[data-v-70e604e3]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity, 1))}.loading-spinner[data-v-70e604e3]{height:1rem;width:1rem}@keyframes spin-70e604e3{to{transform:rotate(360deg)}}.loading-spinner[data-v-70e604e3]{animation:spin-70e604e3 1s linear infinite;border-radius:9999px;border-width:2px;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-top-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.modal-enter-active[data-v-70e604e3],.modal-leave-active[data-v-70e604e3]{transition:all .3s ease}.modal-enter-from[data-v-70e604e3],.modal-leave-to[data-v-70e604e3]{opacity:0}.modal-enter-active .modal-content[data-v-70e604e3],.modal-leave-active .modal-content[data-v-70e604e3]{transition:transform .3s ease}.modal-enter-from .modal-content[data-v-70e604e3],.modal-leave-to .modal-content[data-v-70e604e3]{transform:scale(.9) translateY(-20px)}.modal-content[data-v-70e604e3]::-webkit-scrollbar{width:6px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-thumb:hover{background:#94a3b8}#app[data-v-5cba45f5]{min-height:100vh}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-3{top:.75rem}.top-full{top:100%}.z-50{z-index:50}.z-\[100\]{z-index:100}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-8{margin-right:2rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-row{display:table-row}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-\[300px\]{max-height:300px}.max-h-\[90vh\]{max-height:90vh}.min-h-\[24px\]{min-height:24px}.min-h-\[32px\]{min-height:32px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[32px\]{min-width:32px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.divide-gray-200\/50>:not([hidden])~:not([hidden]){border-color:#e5e7eb80}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-blue-100{--tw-border-opacity: 1;border-color:rgb(219 234 254 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-300\/30{border-color:#d1d5db4d}.border-green-100{--tw-border-opacity: 1;border-color:rgb(220 252 231 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-green-600{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-indigo-100{--tw-border-opacity: 1;border-color:rgb(224 231 255 / var(--tw-border-opacity, 1))}.border-orange-100{--tw-border-opacity: 1;border-color:rgb(255 237 213 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-purple-100{--tw-border-opacity: 1;border-color:rgb(243 232 255 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/30{border-color:#ef44444d}.border-white\/20{border-color:#fff3}.border-yellow-100{--tw-border-opacity: 1;border-color:rgb(254 249 195 / var(--tw-border-opacity, 1))}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-300{--tw-border-opacity: 1;border-color:rgb(253 224 71 / var(--tw-border-opacity, 1))}.border-t-blue-600{--tw-border-opacity: 1;border-top-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-t-white{--tw-border-opacity: 1;border-top-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-300\/50{background-color:#d1d5db80}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-50\/80{background-color:#f9fafbcc}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/20{background-color:#ef444433}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/80{background-color:#fffc}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-500{--tw-gradient-from: #f59e0b var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-50{--tw-gradient-from: #eff6ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500\/20{--tw-gradient-from: rgb(59 130 246 / .2) var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from: #06b6d4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(6 182 212 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-emerald-500{--tw-gradient-from: #10b981 var(--tw-gradient-from-position);--tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-gray-50{--tw-gradient-from: #f9fafb var(--tw-gradient-from-position);--tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-50{--tw-gradient-from: #f0fdf4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 253 244 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-50{--tw-gradient-from: #eef2ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from: #6366f1 var(--tw-gradient-from-position);--tw-gradient-to: rgb(99 102 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-50{--tw-gradient-from: #fff7ed var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 247 237 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-500{--tw-gradient-from: #f97316 var(--tw-gradient-from-position);--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from: #faf5ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 245 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from: #a855f7 var(--tw-gradient-from-position);--tw-gradient-to: rgb(168 85 247 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-500{--tw-gradient-from: #ef4444 var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-rose-500{--tw-gradient-from: #f43f5e var(--tw-gradient-from-position);--tw-gradient-to: rgb(244 63 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-white{--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-400{--tw-gradient-from: #facc15 var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 204 21 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-50{--tw-gradient-from: #fefce8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(254 252 232 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-500{--tw-gradient-from: #eab308 var(--tw-gradient-from-position);--tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-amber-50{--tw-gradient-to: #fffbeb var(--tw-gradient-to-position)}.to-amber-600{--tw-gradient-to: #d97706 var(--tw-gradient-to-position)}.to-blue-500{--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position)}.to-blue-600{--tw-gradient-to: #2563eb var(--tw-gradient-to-position)}.to-emerald-50{--tw-gradient-to: #ecfdf5 var(--tw-gradient-to-position)}.to-emerald-500{--tw-gradient-to: #10b981 var(--tw-gradient-to-position)}.to-emerald-600{--tw-gradient-to: #059669 var(--tw-gradient-to-position)}.to-gray-50{--tw-gradient-to: #f9fafb var(--tw-gradient-to-position)}.to-green-600{--tw-gradient-to: #16a34a var(--tw-gradient-to-position)}.to-indigo-50{--tw-gradient-to: #eef2ff var(--tw-gradient-to-position)}.to-indigo-600{--tw-gradient-to: #4f46e5 var(--tw-gradient-to-position)}.to-orange-500{--tw-gradient-to: #f97316 var(--tw-gradient-to-position)}.to-orange-600{--tw-gradient-to: #ea580c var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to: #fdf2f8 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to: #ec4899 var(--tw-gradient-to-position)}.to-purple-50{--tw-gradient-to: #faf5ff var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to: #a855f7 var(--tw-gradient-to-position)}.to-purple-500\/20{--tw-gradient-to: rgb(168 85 247 / .2) var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.to-red-50{--tw-gradient-to: #fef2f2 var(--tw-gradient-to-position)}.to-rose-600{--tw-gradient-to: #e11d48 var(--tw-gradient-to-position)}.to-slate-50{--tw-gradient-to: #f8fafc var(--tw-gradient-to-position)}.to-yellow-50{--tw-gradient-to: #fefce8 var(--tw-gradient-to-position)}.to-yellow-500{--tw-gradient-to: #eab308 var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pr-10{padding-right:2.5rem}.pr-14{padding-right:3.5rem}.pr-3{padding-right:.75rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-blue-100{--tw-text-opacity: 1;color:rgb(219 234 254 / var(--tw-text-opacity, 1))}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-800{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/70{color:#ffffffb3}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.form-input{background:#ffffffe6;border:2px solid rgba(255,255,255,.3);border-radius:12px;padding:8px 12px;font-size:14px;transition:all .3s ease;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}/*! +.toast-container[data-v-383c6781]{position:fixed;top:20px;right:20px;z-index:9999;display:flex;flex-direction:column;gap:12px;pointer-events:none}.toast[data-v-383c6781]{min-width:320px;max-width:500px;background:#fff;border-radius:12px;box-shadow:0 8px 32px #0000001f;border:1px solid #e5e7eb;overflow:hidden;position:relative;pointer-events:auto;cursor:pointer;transform:translate(100%);opacity:0;transition:all .3s cubic-bezier(.4,0,.2,1)}.toast-show[data-v-383c6781]{transform:translate(0);opacity:1}.toast-hide[data-v-383c6781]{transform:translate(100%);opacity:0}.toast-content[data-v-383c6781]{display:flex;align-items:flex-start;padding:16px;gap:12px}.toast-icon[data-v-383c6781]{flex-shrink:0;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:14px}.toast-body[data-v-383c6781]{flex:1}.toast-title[data-v-383c6781]{font-weight:600;font-size:14px;line-height:1.4;margin-bottom:4px}.toast-message[data-v-383c6781]{font-size:14px;line-height:1.5;word-wrap:break-word}.toast-close[data-v-383c6781]{flex-shrink:0;width:24px;height:24px;border:none;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;color:#9ca3af;transition:all .2s ease}.toast-close[data-v-383c6781]:hover{background:#f3f4f6;color:#6b7280}.toast-progress[data-v-383c6781]{position:absolute;bottom:0;left:0;height:3px;background:currentColor;opacity:.3;animation:toast-progress-383c6781 linear forwards}@keyframes toast-progress-383c6781{0%{width:100%}to{width:0%}}.toast-success[data-v-383c6781]{border-left:4px solid #10b981}.toast-success .toast-icon[data-v-383c6781]{color:#10b981;background:#d1fae5}.toast-success .toast-title[data-v-383c6781]{color:#065f46}.toast-success .toast-message[data-v-383c6781]{color:#047857}.toast-success .toast-progress[data-v-383c6781]{background:#10b981}.toast-error[data-v-383c6781]{border-left:4px solid #ef4444}.toast-error .toast-icon[data-v-383c6781]{color:#ef4444;background:#fee2e2}.toast-error .toast-title[data-v-383c6781]{color:#991b1b}.toast-error .toast-message[data-v-383c6781]{color:#dc2626}.toast-error .toast-progress[data-v-383c6781]{background:#ef4444}.toast-warning[data-v-383c6781]{border-left:4px solid #f59e0b}.toast-warning .toast-icon[data-v-383c6781]{color:#f59e0b;background:#fef3c7}.toast-warning .toast-title[data-v-383c6781]{color:#92400e}.toast-warning .toast-message[data-v-383c6781]{color:#d97706}.toast-warning .toast-progress[data-v-383c6781]{background:#f59e0b}.toast-info[data-v-383c6781]{border-left:4px solid #3b82f6}.toast-info .toast-icon[data-v-383c6781]{color:#3b82f6;background:#dbeafe}.toast-info .toast-title[data-v-383c6781]{color:#1e40af}.toast-info .toast-message[data-v-383c6781]{color:#2563eb}.toast-info .toast-progress[data-v-383c6781]{background:#3b82f6}@media (max-width: 640px){.toast-container[data-v-383c6781]{top:10px;right:10px;left:10px}.toast[data-v-383c6781]{min-width:auto;max-width:none}}.toast-list-enter-active[data-v-383c6781],.toast-list-leave-active[data-v-383c6781]{transition:all .3s ease}.toast-list-enter-from[data-v-383c6781],.toast-list-leave-to[data-v-383c6781]{opacity:0;transform:translate(100%)}.toast-list-move[data-v-383c6781]{transition:transform .3s ease}.modal[data-v-70e604e3]{background:#00000080;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.modal-content[data-v-70e604e3]{background:#fff;border-radius:16px;box-shadow:0 20px 64px #00000026;border:1px solid #e5e7eb;max-height:90vh;overflow-y:auto}.btn[data-v-70e604e3]{display:inline-flex;align-items:center;justify-content:center;border-radius:.5rem;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s}.btn[data-v-70e604e3]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-offset-width: 2px}.btn-danger[data-v-70e604e3]{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.btn-danger[data-v-70e604e3]:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.btn-danger[data-v-70e604e3]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.btn-warning[data-v-70e604e3]{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.btn-warning[data-v-70e604e3]:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.btn-warning[data-v-70e604e3]:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity, 1))}.loading-spinner[data-v-70e604e3]{height:1rem;width:1rem}@keyframes spin-70e604e3{to{transform:rotate(360deg)}}.loading-spinner[data-v-70e604e3]{animation:spin-70e604e3 1s linear infinite;border-radius:9999px;border-width:2px;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-border-opacity: 1;border-top-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.modal-enter-active[data-v-70e604e3],.modal-leave-active[data-v-70e604e3]{transition:all .3s ease}.modal-enter-from[data-v-70e604e3],.modal-leave-to[data-v-70e604e3]{opacity:0}.modal-enter-active .modal-content[data-v-70e604e3],.modal-leave-active .modal-content[data-v-70e604e3]{transition:transform .3s ease}.modal-enter-from .modal-content[data-v-70e604e3],.modal-leave-to .modal-content[data-v-70e604e3]{transform:scale(.9) translateY(-20px)}.modal-content[data-v-70e604e3]::-webkit-scrollbar{width:6px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-track{background:#f1f5f9;border-radius:3px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.modal-content[data-v-70e604e3]::-webkit-scrollbar-thumb:hover{background:#94a3b8}#app[data-v-5cba45f5]{min-height:100vh}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.right-0{right:0}.right-3{right:.75rem}.top-0{top:0}.top-3{top:.75rem}.top-full{top:100%}.z-50{z-index:50}.z-\[100\]{z-index:100}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-8{margin-right:2rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-row{display:table-row}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-2{height:.5rem}.h-20{height:5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-full{height:100%}.max-h-\[300px\]{max-height:300px}.max-h-\[90vh\]{max-height:90vh}.min-h-\[24px\]{min-height:24px}.min-h-\[32px\]{min-height:32px}.min-h-\[48px\]{min-height:48px}.min-h-\[60px\]{min-height:60px}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-4{width:1rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[20px\]{min-width:20px}.min-w-\[32px\]{min-width:32px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.divide-gray-200\/50>:not([hidden])~:not([hidden]){border-color:#e5e7eb80}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-blue-100{--tw-border-opacity: 1;border-color:rgb(219 234 254 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-gray-300\/30{border-color:#d1d5db4d}.border-green-100{--tw-border-opacity: 1;border-color:rgb(220 252 231 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-green-300{--tw-border-opacity: 1;border-color:rgb(134 239 172 / var(--tw-border-opacity, 1))}.border-green-600{--tw-border-opacity: 1;border-color:rgb(22 163 74 / var(--tw-border-opacity, 1))}.border-indigo-100{--tw-border-opacity: 1;border-color:rgb(224 231 255 / var(--tw-border-opacity, 1))}.border-orange-100{--tw-border-opacity: 1;border-color:rgb(255 237 213 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-purple-100{--tw-border-opacity: 1;border-color:rgb(243 232 255 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-500\/30{border-color:#ef44444d}.border-white\/20{border-color:#fff3}.border-yellow-100{--tw-border-opacity: 1;border-color:rgb(254 249 195 / var(--tw-border-opacity, 1))}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-yellow-300{--tw-border-opacity: 1;border-color:rgb(253 224 71 / var(--tw-border-opacity, 1))}.border-t-blue-600{--tw-border-opacity: 1;border-top-color:rgb(37 99 235 / var(--tw-border-opacity, 1))}.border-t-white{--tw-border-opacity: 1;border-top-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-300{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.bg-gray-300\/50{background-color:#d1d5db80}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-50\/80{background-color:#f9fafbcc}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-orange-200{--tw-bg-opacity: 1;background-color:rgb(254 215 170 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/20{background-color:#ef444433}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/80{background-color:#fffc}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-500{--tw-gradient-from: #f59e0b var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-50{--tw-gradient-from: #eff6ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500\/20{--tw-gradient-from: rgb(59 130 246 / .2) var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from: #06b6d4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(6 182 212 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-emerald-500{--tw-gradient-from: #10b981 var(--tw-gradient-from-position);--tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-gray-50{--tw-gradient-from: #f9fafb var(--tw-gradient-from-position);--tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-50{--tw-gradient-from: #f0fdf4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(240 253 244 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-green-500{--tw-gradient-from: #22c55e var(--tw-gradient-from-position);--tw-gradient-to: rgb(34 197 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-50{--tw-gradient-from: #eef2ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(238 242 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-indigo-500{--tw-gradient-from: #6366f1 var(--tw-gradient-from-position);--tw-gradient-to: rgb(99 102 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-50{--tw-gradient-from: #fff7ed var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 247 237 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-orange-500{--tw-gradient-from: #f97316 var(--tw-gradient-from-position);--tw-gradient-to: rgb(249 115 22 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-50{--tw-gradient-from: #faf5ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 245 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-500{--tw-gradient-from: #a855f7 var(--tw-gradient-from-position);--tw-gradient-to: rgb(168 85 247 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-red-500{--tw-gradient-from: #ef4444 var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 68 68 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-rose-500{--tw-gradient-from: #f43f5e var(--tw-gradient-from-position);--tw-gradient-to: rgb(244 63 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-white{--tw-gradient-from: #fff var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-400{--tw-gradient-from: #facc15 var(--tw-gradient-from-position);--tw-gradient-to: rgb(250 204 21 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-50{--tw-gradient-from: #fefce8 var(--tw-gradient-from-position);--tw-gradient-to: rgb(254 252 232 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-yellow-500{--tw-gradient-from: #eab308 var(--tw-gradient-from-position);--tw-gradient-to: rgb(234 179 8 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-amber-50{--tw-gradient-to: #fffbeb var(--tw-gradient-to-position)}.to-amber-600{--tw-gradient-to: #d97706 var(--tw-gradient-to-position)}.to-blue-500{--tw-gradient-to: #3b82f6 var(--tw-gradient-to-position)}.to-blue-600{--tw-gradient-to: #2563eb var(--tw-gradient-to-position)}.to-emerald-50{--tw-gradient-to: #ecfdf5 var(--tw-gradient-to-position)}.to-emerald-500{--tw-gradient-to: #10b981 var(--tw-gradient-to-position)}.to-emerald-600{--tw-gradient-to: #059669 var(--tw-gradient-to-position)}.to-gray-50{--tw-gradient-to: #f9fafb var(--tw-gradient-to-position)}.to-green-600{--tw-gradient-to: #16a34a var(--tw-gradient-to-position)}.to-indigo-50{--tw-gradient-to: #eef2ff var(--tw-gradient-to-position)}.to-indigo-600{--tw-gradient-to: #4f46e5 var(--tw-gradient-to-position)}.to-orange-500{--tw-gradient-to: #f97316 var(--tw-gradient-to-position)}.to-orange-600{--tw-gradient-to: #ea580c var(--tw-gradient-to-position)}.to-pink-50{--tw-gradient-to: #fdf2f8 var(--tw-gradient-to-position)}.to-pink-500{--tw-gradient-to: #ec4899 var(--tw-gradient-to-position)}.to-purple-50{--tw-gradient-to: #faf5ff var(--tw-gradient-to-position)}.to-purple-500{--tw-gradient-to: #a855f7 var(--tw-gradient-to-position)}.to-purple-500\/20{--tw-gradient-to: rgb(168 85 247 / .2) var(--tw-gradient-to-position)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.to-red-50{--tw-gradient-to: #fef2f2 var(--tw-gradient-to-position)}.to-rose-600{--tw-gradient-to: #e11d48 var(--tw-gradient-to-position)}.to-slate-50{--tw-gradient-to: #f8fafc var(--tw-gradient-to-position)}.to-yellow-50{--tw-gradient-to: #fefce8 var(--tw-gradient-to-position)}.to-yellow-500{--tw-gradient-to: #eab308 var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pr-10{padding-right:2.5rem}.pr-14{padding-right:3.5rem}.pr-3{padding-right:.75rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-amber-900{--tw-text-opacity: 1;color:rgb(120 53 15 / var(--tw-text-opacity, 1))}.text-blue-100{--tw-text-opacity: 1;color:rgb(219 234 254 / var(--tw-text-opacity, 1))}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-blue-900{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-green-900{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.text-indigo-500{--tw-text-opacity: 1;color:rgb(99 102 241 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-800{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-rose-600{--tw-text-opacity: 1;color:rgb(225 29 72 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/70{color:#ffffffb3}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.text-yellow-800{--tw-text-opacity: 1;color:rgb(133 77 14 / var(--tw-text-opacity, 1))}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-90{opacity:.9}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline{outline-style:solid}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-filter{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.form-input{background:#ffffffe6;border:2px solid rgba(255,255,255,.3);border-radius:12px;padding:8px 12px;font-size:14px;transition:all .3s ease;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}/*! * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) * Copyright 2024 Fonticons, Inc. - */.fa{font-family:var(--fa-style-family, "Font Awesome 6 Free");font-weight:var(--fa-style, 900)}.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display, inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fas:before,.far:before,.fab:before,.fa-solid:before,.fa-regular:before,.fa-brands:before,.fa:before{content:var(--fa)}.fa-classic,.fas,.fa-solid,.far,.fa-regular{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin, 2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(-1 * var(--fa-li-width, 2em));position:absolute;text-align:center;width:var(--fa-li-width, 2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color, #eee);border-radius:var(--fa-border-radius, .1em);border-style:var(--fa-border-style, solid);border-width:var(--fa-border-width, .08em);padding:var(--fa-border-padding, .2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin, .3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin, .3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.28, .84, .42, 1))}.fa-fade{animation-name:fa-fade;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-beat-fade{animation-name:fa-beat-fade;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-shake{animation-name:fa-shake;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 2s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin-reverse{--fa-animation-direction: reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, steps(8))}@media (prefers-reduced-motion: reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale, 1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound, -.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity, .4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity, .4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale, 1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle, 0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index, auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse, #fff)}.fa-0{--fa: "0"}.fa-1{--fa: "1"}.fa-2{--fa: "2"}.fa-3{--fa: "3"}.fa-4{--fa: "4"}.fa-5{--fa: "5"}.fa-6{--fa: "6"}.fa-7{--fa: "7"}.fa-8{--fa: "8"}.fa-9{--fa: "9"}.fa-fill-drip{--fa: ""}.fa-arrows-to-circle{--fa: ""}.fa-circle-chevron-right,.fa-chevron-circle-right{--fa: ""}.fa-at{--fa: "@"}.fa-trash-can,.fa-trash-alt{--fa: ""}.fa-text-height{--fa: ""}.fa-user-xmark,.fa-user-times{--fa: ""}.fa-stethoscope{--fa: ""}.fa-message,.fa-comment-alt{--fa: ""}.fa-info{--fa: ""}.fa-down-left-and-up-right-to-center,.fa-compress-alt{--fa: ""}.fa-explosion{--fa: ""}.fa-file-lines,.fa-file-alt,.fa-file-text{--fa: ""}.fa-wave-square{--fa: ""}.fa-ring{--fa: ""}.fa-building-un{--fa: ""}.fa-dice-three{--fa: ""}.fa-calendar-days,.fa-calendar-alt{--fa: ""}.fa-anchor-circle-check{--fa: ""}.fa-building-circle-arrow-right{--fa: ""}.fa-volleyball,.fa-volleyball-ball{--fa: ""}.fa-arrows-up-to-line{--fa: ""}.fa-sort-down,.fa-sort-desc{--fa: ""}.fa-circle-minus,.fa-minus-circle{--fa: ""}.fa-door-open{--fa: ""}.fa-right-from-bracket,.fa-sign-out-alt{--fa: ""}.fa-atom{--fa: ""}.fa-soap{--fa: ""}.fa-icons,.fa-heart-music-camera-bolt{--fa: ""}.fa-microphone-lines-slash,.fa-microphone-alt-slash{--fa: ""}.fa-bridge-circle-check{--fa: ""}.fa-pump-medical{--fa: ""}.fa-fingerprint{--fa: ""}.fa-hand-point-right{--fa: ""}.fa-magnifying-glass-location,.fa-search-location{--fa: ""}.fa-forward-step,.fa-step-forward{--fa: ""}.fa-face-smile-beam,.fa-smile-beam{--fa: ""}.fa-flag-checkered{--fa: ""}.fa-football,.fa-football-ball{--fa: ""}.fa-school-circle-exclamation{--fa: ""}.fa-crop{--fa: ""}.fa-angles-down,.fa-angle-double-down{--fa: ""}.fa-users-rectangle{--fa: ""}.fa-people-roof{--fa: ""}.fa-people-line{--fa: ""}.fa-beer-mug-empty,.fa-beer{--fa: ""}.fa-diagram-predecessor{--fa: ""}.fa-arrow-up-long,.fa-long-arrow-up{--fa: ""}.fa-fire-flame-simple,.fa-burn{--fa: ""}.fa-person,.fa-male{--fa: ""}.fa-laptop{--fa: ""}.fa-file-csv{--fa: ""}.fa-menorah{--fa: ""}.fa-truck-plane{--fa: ""}.fa-record-vinyl{--fa: ""}.fa-face-grin-stars,.fa-grin-stars{--fa: ""}.fa-bong{--fa: ""}.fa-spaghetti-monster-flying,.fa-pastafarianism{--fa: ""}.fa-arrow-down-up-across-line{--fa: ""}.fa-spoon,.fa-utensil-spoon{--fa: ""}.fa-jar-wheat{--fa: ""}.fa-envelopes-bulk,.fa-mail-bulk{--fa: ""}.fa-file-circle-exclamation{--fa: ""}.fa-circle-h,.fa-hospital-symbol{--fa: ""}.fa-pager{--fa: ""}.fa-address-book,.fa-contact-book{--fa: ""}.fa-strikethrough{--fa: ""}.fa-k{--fa: "K"}.fa-landmark-flag{--fa: ""}.fa-pencil,.fa-pencil-alt{--fa: ""}.fa-backward{--fa: ""}.fa-caret-right{--fa: ""}.fa-comments{--fa: ""}.fa-paste,.fa-file-clipboard{--fa: ""}.fa-code-pull-request{--fa: ""}.fa-clipboard-list{--fa: ""}.fa-truck-ramp-box,.fa-truck-loading{--fa: ""}.fa-user-check{--fa: ""}.fa-vial-virus{--fa: ""}.fa-sheet-plastic{--fa: ""}.fa-blog{--fa: ""}.fa-user-ninja{--fa: ""}.fa-person-arrow-up-from-line{--fa: ""}.fa-scroll-torah,.fa-torah{--fa: ""}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa: ""}.fa-toggle-off{--fa: ""}.fa-box-archive,.fa-archive{--fa: ""}.fa-person-drowning{--fa: ""}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa: ""}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa: ""}.fa-spray-can{--fa: ""}.fa-truck-monster{--fa: ""}.fa-w{--fa: "W"}.fa-earth-africa,.fa-globe-africa{--fa: ""}.fa-rainbow{--fa: ""}.fa-circle-notch{--fa: ""}.fa-tablet-screen-button,.fa-tablet-alt{--fa: ""}.fa-paw{--fa: ""}.fa-cloud{--fa: ""}.fa-trowel-bricks{--fa: ""}.fa-face-flushed,.fa-flushed{--fa: ""}.fa-hospital-user{--fa: ""}.fa-tent-arrow-left-right{--fa: ""}.fa-gavel,.fa-legal{--fa: ""}.fa-binoculars{--fa: ""}.fa-microphone-slash{--fa: ""}.fa-box-tissue{--fa: ""}.fa-motorcycle{--fa: ""}.fa-bell-concierge,.fa-concierge-bell{--fa: ""}.fa-pen-ruler,.fa-pencil-ruler{--fa: ""}.fa-people-arrows,.fa-people-arrows-left-right{--fa: ""}.fa-mars-and-venus-burst{--fa: ""}.fa-square-caret-right,.fa-caret-square-right{--fa: ""}.fa-scissors,.fa-cut{--fa: ""}.fa-sun-plant-wilt{--fa: ""}.fa-toilets-portable{--fa: ""}.fa-hockey-puck{--fa: ""}.fa-table{--fa: ""}.fa-magnifying-glass-arrow-right{--fa: ""}.fa-tachograph-digital,.fa-digital-tachograph{--fa: ""}.fa-users-slash{--fa: ""}.fa-clover{--fa: ""}.fa-reply,.fa-mail-reply{--fa: ""}.fa-star-and-crescent{--fa: ""}.fa-house-fire{--fa: ""}.fa-square-minus,.fa-minus-square{--fa: ""}.fa-helicopter{--fa: ""}.fa-compass{--fa: ""}.fa-square-caret-down,.fa-caret-square-down{--fa: ""}.fa-file-circle-question{--fa: ""}.fa-laptop-code{--fa: ""}.fa-swatchbook{--fa: ""}.fa-prescription-bottle{--fa: ""}.fa-bars,.fa-navicon{--fa: ""}.fa-people-group{--fa: ""}.fa-hourglass-end,.fa-hourglass-3{--fa: ""}.fa-heart-crack,.fa-heart-broken{--fa: ""}.fa-square-up-right,.fa-external-link-square-alt{--fa: ""}.fa-face-kiss-beam,.fa-kiss-beam{--fa: ""}.fa-film{--fa: ""}.fa-ruler-horizontal{--fa: ""}.fa-people-robbery{--fa: ""}.fa-lightbulb{--fa: ""}.fa-caret-left{--fa: ""}.fa-circle-exclamation,.fa-exclamation-circle{--fa: ""}.fa-school-circle-xmark{--fa: ""}.fa-arrow-right-from-bracket,.fa-sign-out{--fa: ""}.fa-circle-chevron-down,.fa-chevron-circle-down{--fa: ""}.fa-unlock-keyhole,.fa-unlock-alt{--fa: ""}.fa-cloud-showers-heavy{--fa: ""}.fa-headphones-simple,.fa-headphones-alt{--fa: ""}.fa-sitemap{--fa: ""}.fa-circle-dollar-to-slot,.fa-donate{--fa: ""}.fa-memory{--fa: ""}.fa-road-spikes{--fa: ""}.fa-fire-burner{--fa: ""}.fa-flag{--fa: ""}.fa-hanukiah{--fa: ""}.fa-feather{--fa: ""}.fa-volume-low,.fa-volume-down{--fa: ""}.fa-comment-slash{--fa: ""}.fa-cloud-sun-rain{--fa: ""}.fa-compress{--fa: ""}.fa-wheat-awn,.fa-wheat-alt{--fa: ""}.fa-ankh{--fa: ""}.fa-hands-holding-child{--fa: ""}.fa-asterisk{--fa: "*"}.fa-square-check,.fa-check-square{--fa: ""}.fa-peseta-sign{--fa: ""}.fa-heading,.fa-header{--fa: ""}.fa-ghost{--fa: ""}.fa-list,.fa-list-squares{--fa: ""}.fa-square-phone-flip,.fa-phone-square-alt{--fa: ""}.fa-cart-plus{--fa: ""}.fa-gamepad{--fa: ""}.fa-circle-dot,.fa-dot-circle{--fa: ""}.fa-face-dizzy,.fa-dizzy{--fa: ""}.fa-egg{--fa: ""}.fa-house-medical-circle-xmark{--fa: ""}.fa-campground{--fa: ""}.fa-folder-plus{--fa: ""}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa: ""}.fa-paintbrush,.fa-paint-brush{--fa: ""}.fa-lock{--fa: ""}.fa-gas-pump{--fa: ""}.fa-hot-tub-person,.fa-hot-tub{--fa: ""}.fa-map-location,.fa-map-marked{--fa: ""}.fa-house-flood-water{--fa: ""}.fa-tree{--fa: ""}.fa-bridge-lock{--fa: ""}.fa-sack-dollar{--fa: ""}.fa-pen-to-square,.fa-edit{--fa: ""}.fa-car-side{--fa: ""}.fa-share-nodes,.fa-share-alt{--fa: ""}.fa-heart-circle-minus{--fa: ""}.fa-hourglass-half,.fa-hourglass-2{--fa: ""}.fa-microscope{--fa: ""}.fa-sink{--fa: ""}.fa-bag-shopping,.fa-shopping-bag{--fa: ""}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa: ""}.fa-mitten{--fa: ""}.fa-person-rays{--fa: ""}.fa-users{--fa: ""}.fa-eye-slash{--fa: ""}.fa-flask-vial{--fa: ""}.fa-hand,.fa-hand-paper{--fa: ""}.fa-om{--fa: ""}.fa-worm{--fa: ""}.fa-house-circle-xmark{--fa: ""}.fa-plug{--fa: ""}.fa-chevron-up{--fa: ""}.fa-hand-spock{--fa: ""}.fa-stopwatch{--fa: ""}.fa-face-kiss,.fa-kiss{--fa: ""}.fa-bridge-circle-xmark{--fa: ""}.fa-face-grin-tongue,.fa-grin-tongue{--fa: ""}.fa-chess-bishop{--fa: ""}.fa-face-grin-wink,.fa-grin-wink{--fa: ""}.fa-ear-deaf,.fa-deaf,.fa-deafness,.fa-hard-of-hearing{--fa: ""}.fa-road-circle-check{--fa: ""}.fa-dice-five{--fa: ""}.fa-square-rss,.fa-rss-square{--fa: ""}.fa-land-mine-on{--fa: ""}.fa-i-cursor{--fa: ""}.fa-stamp{--fa: ""}.fa-stairs{--fa: ""}.fa-i{--fa: "I"}.fa-hryvnia-sign,.fa-hryvnia{--fa: ""}.fa-pills{--fa: ""}.fa-face-grin-wide,.fa-grin-alt{--fa: ""}.fa-tooth{--fa: ""}.fa-v{--fa: "V"}.fa-bangladeshi-taka-sign{--fa: ""}.fa-bicycle{--fa: ""}.fa-staff-snake,.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius{--fa: ""}.fa-head-side-cough-slash{--fa: ""}.fa-truck-medical,.fa-ambulance{--fa: ""}.fa-wheat-awn-circle-exclamation{--fa: ""}.fa-snowman{--fa: ""}.fa-mortar-pestle{--fa: ""}.fa-road-barrier{--fa: ""}.fa-school{--fa: ""}.fa-igloo{--fa: ""}.fa-joint{--fa: ""}.fa-angle-right{--fa: ""}.fa-horse{--fa: ""}.fa-q{--fa: "Q"}.fa-g{--fa: "G"}.fa-notes-medical{--fa: ""}.fa-temperature-half,.fa-temperature-2,.fa-thermometer-2,.fa-thermometer-half{--fa: ""}.fa-dong-sign{--fa: ""}.fa-capsules{--fa: ""}.fa-poo-storm,.fa-poo-bolt{--fa: ""}.fa-face-frown-open,.fa-frown-open{--fa: ""}.fa-hand-point-up{--fa: ""}.fa-money-bill{--fa: ""}.fa-bookmark{--fa: ""}.fa-align-justify{--fa: ""}.fa-umbrella-beach{--fa: ""}.fa-helmet-un{--fa: ""}.fa-bullseye{--fa: ""}.fa-bacon{--fa: ""}.fa-hand-point-down{--fa: ""}.fa-arrow-up-from-bracket{--fa: ""}.fa-folder,.fa-folder-blank{--fa: ""}.fa-file-waveform,.fa-file-medical-alt{--fa: ""}.fa-radiation{--fa: ""}.fa-chart-simple{--fa: ""}.fa-mars-stroke{--fa: ""}.fa-vial{--fa: ""}.fa-gauge,.fa-dashboard,.fa-gauge-med,.fa-tachometer-alt-average{--fa: ""}.fa-wand-magic-sparkles,.fa-magic-wand-sparkles{--fa: ""}.fa-e{--fa: "E"}.fa-pen-clip,.fa-pen-alt{--fa: ""}.fa-bridge-circle-exclamation{--fa: ""}.fa-user{--fa: ""}.fa-school-circle-check{--fa: ""}.fa-dumpster{--fa: ""}.fa-van-shuttle,.fa-shuttle-van{--fa: ""}.fa-building-user{--fa: ""}.fa-square-caret-left,.fa-caret-square-left{--fa: ""}.fa-highlighter{--fa: ""}.fa-key{--fa: ""}.fa-bullhorn{--fa: ""}.fa-globe{--fa: ""}.fa-synagogue{--fa: ""}.fa-person-half-dress{--fa: ""}.fa-road-bridge{--fa: ""}.fa-location-arrow{--fa: ""}.fa-c{--fa: "C"}.fa-tablet-button{--fa: ""}.fa-building-lock{--fa: ""}.fa-pizza-slice{--fa: ""}.fa-money-bill-wave{--fa: ""}.fa-chart-area,.fa-area-chart{--fa: ""}.fa-house-flag{--fa: ""}.fa-person-circle-minus{--fa: ""}.fa-ban,.fa-cancel{--fa: ""}.fa-camera-rotate{--fa: ""}.fa-spray-can-sparkles,.fa-air-freshener{--fa: ""}.fa-star{--fa: ""}.fa-repeat{--fa: ""}.fa-cross{--fa: ""}.fa-box{--fa: ""}.fa-venus-mars{--fa: ""}.fa-arrow-pointer,.fa-mouse-pointer{--fa: ""}.fa-maximize,.fa-expand-arrows-alt{--fa: ""}.fa-charging-station{--fa: ""}.fa-shapes,.fa-triangle-circle-square{--fa: ""}.fa-shuffle,.fa-random{--fa: ""}.fa-person-running,.fa-running{--fa: ""}.fa-mobile-retro{--fa: ""}.fa-grip-lines-vertical{--fa: ""}.fa-spider{--fa: ""}.fa-hands-bound{--fa: ""}.fa-file-invoice-dollar{--fa: ""}.fa-plane-circle-exclamation{--fa: ""}.fa-x-ray{--fa: ""}.fa-spell-check{--fa: ""}.fa-slash{--fa: ""}.fa-computer-mouse,.fa-mouse{--fa: ""}.fa-arrow-right-to-bracket,.fa-sign-in{--fa: ""}.fa-shop-slash,.fa-store-alt-slash{--fa: ""}.fa-server{--fa: ""}.fa-virus-covid-slash{--fa: ""}.fa-shop-lock{--fa: ""}.fa-hourglass-start,.fa-hourglass-1{--fa: ""}.fa-blender-phone{--fa: ""}.fa-building-wheat{--fa: ""}.fa-person-breastfeeding{--fa: ""}.fa-right-to-bracket,.fa-sign-in-alt{--fa: ""}.fa-venus{--fa: ""}.fa-passport{--fa: ""}.fa-thumbtack-slash,.fa-thumb-tack-slash{--fa: ""}.fa-heart-pulse,.fa-heartbeat{--fa: ""}.fa-people-carry-box,.fa-people-carry{--fa: ""}.fa-temperature-high{--fa: ""}.fa-microchip{--fa: ""}.fa-crown{--fa: ""}.fa-weight-hanging{--fa: ""}.fa-xmarks-lines{--fa: ""}.fa-file-prescription{--fa: ""}.fa-weight-scale,.fa-weight{--fa: ""}.fa-user-group,.fa-user-friends{--fa: ""}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa: ""}.fa-chess-knight{--fa: ""}.fa-face-laugh-squint,.fa-laugh-squint{--fa: ""}.fa-wheelchair{--fa: ""}.fa-circle-arrow-up,.fa-arrow-circle-up{--fa: ""}.fa-toggle-on{--fa: ""}.fa-person-walking,.fa-walking{--fa: ""}.fa-l{--fa: "L"}.fa-fire{--fa: ""}.fa-bed-pulse,.fa-procedures{--fa: ""}.fa-shuttle-space,.fa-space-shuttle{--fa: ""}.fa-face-laugh,.fa-laugh{--fa: ""}.fa-folder-open{--fa: ""}.fa-heart-circle-plus{--fa: ""}.fa-code-fork{--fa: ""}.fa-city{--fa: ""}.fa-microphone-lines,.fa-microphone-alt{--fa: ""}.fa-pepper-hot{--fa: ""}.fa-unlock{--fa: ""}.fa-colon-sign{--fa: ""}.fa-headset{--fa: ""}.fa-store-slash{--fa: ""}.fa-road-circle-xmark{--fa: ""}.fa-user-minus{--fa: ""}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa: ""}.fa-champagne-glasses,.fa-glass-cheers{--fa: ""}.fa-clipboard{--fa: ""}.fa-house-circle-exclamation{--fa: ""}.fa-file-arrow-up,.fa-file-upload{--fa: ""}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa: ""}.fa-bath,.fa-bathtub{--fa: ""}.fa-underline{--fa: ""}.fa-user-pen,.fa-user-edit{--fa: ""}.fa-signature{--fa: ""}.fa-stroopwafel{--fa: ""}.fa-bold{--fa: ""}.fa-anchor-lock{--fa: ""}.fa-building-ngo{--fa: ""}.fa-manat-sign{--fa: ""}.fa-not-equal{--fa: ""}.fa-border-top-left,.fa-border-style{--fa: ""}.fa-map-location-dot,.fa-map-marked-alt{--fa: ""}.fa-jedi{--fa: ""}.fa-square-poll-vertical,.fa-poll{--fa: ""}.fa-mug-hot{--fa: ""}.fa-car-battery,.fa-battery-car{--fa: ""}.fa-gift{--fa: ""}.fa-dice-two{--fa: ""}.fa-chess-queen{--fa: ""}.fa-glasses{--fa: ""}.fa-chess-board{--fa: ""}.fa-building-circle-check{--fa: ""}.fa-person-chalkboard{--fa: ""}.fa-mars-stroke-right,.fa-mars-stroke-h{--fa: ""}.fa-hand-back-fist,.fa-hand-rock{--fa: ""}.fa-square-caret-up,.fa-caret-square-up{--fa: ""}.fa-cloud-showers-water{--fa: ""}.fa-chart-bar,.fa-bar-chart{--fa: ""}.fa-hands-bubbles,.fa-hands-wash{--fa: ""}.fa-less-than-equal{--fa: ""}.fa-train{--fa: ""}.fa-eye-low-vision,.fa-low-vision{--fa: ""}.fa-crow{--fa: ""}.fa-sailboat{--fa: ""}.fa-window-restore{--fa: ""}.fa-square-plus,.fa-plus-square{--fa: ""}.fa-torii-gate{--fa: ""}.fa-frog{--fa: ""}.fa-bucket{--fa: ""}.fa-image{--fa: ""}.fa-microphone{--fa: ""}.fa-cow{--fa: ""}.fa-caret-up{--fa: ""}.fa-screwdriver{--fa: ""}.fa-folder-closed{--fa: ""}.fa-house-tsunami{--fa: ""}.fa-square-nfi{--fa: ""}.fa-arrow-up-from-ground-water{--fa: ""}.fa-martini-glass,.fa-glass-martini-alt{--fa: ""}.fa-square-binary{--fa: ""}.fa-rotate-left,.fa-rotate-back,.fa-rotate-backward,.fa-undo-alt{--fa: ""}.fa-table-columns,.fa-columns{--fa: ""}.fa-lemon{--fa: ""}.fa-head-side-mask{--fa: ""}.fa-handshake{--fa: ""}.fa-gem{--fa: ""}.fa-dolly,.fa-dolly-box{--fa: ""}.fa-smoking{--fa: ""}.fa-minimize,.fa-compress-arrows-alt{--fa: ""}.fa-monument{--fa: ""}.fa-snowplow{--fa: ""}.fa-angles-right,.fa-angle-double-right{--fa: ""}.fa-cannabis{--fa: ""}.fa-circle-play,.fa-play-circle{--fa: ""}.fa-tablets{--fa: ""}.fa-ethernet{--fa: ""}.fa-euro-sign,.fa-eur,.fa-euro{--fa: ""}.fa-chair{--fa: ""}.fa-circle-check,.fa-check-circle{--fa: ""}.fa-circle-stop,.fa-stop-circle{--fa: ""}.fa-compass-drafting,.fa-drafting-compass{--fa: ""}.fa-plate-wheat{--fa: ""}.fa-icicles{--fa: ""}.fa-person-shelter{--fa: ""}.fa-neuter{--fa: ""}.fa-id-badge{--fa: ""}.fa-marker{--fa: ""}.fa-face-laugh-beam,.fa-laugh-beam{--fa: ""}.fa-helicopter-symbol{--fa: ""}.fa-universal-access{--fa: ""}.fa-circle-chevron-up,.fa-chevron-circle-up{--fa: ""}.fa-lari-sign{--fa: ""}.fa-volcano{--fa: ""}.fa-person-walking-dashed-line-arrow-right{--fa: ""}.fa-sterling-sign,.fa-gbp,.fa-pound-sign{--fa: ""}.fa-viruses{--fa: ""}.fa-square-person-confined{--fa: ""}.fa-user-tie{--fa: ""}.fa-arrow-down-long,.fa-long-arrow-down{--fa: ""}.fa-tent-arrow-down-to-line{--fa: ""}.fa-certificate{--fa: ""}.fa-reply-all,.fa-mail-reply-all{--fa: ""}.fa-suitcase{--fa: ""}.fa-person-skating,.fa-skating{--fa: ""}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa: ""}.fa-camera-retro{--fa: ""}.fa-circle-arrow-down,.fa-arrow-circle-down{--fa: ""}.fa-file-import,.fa-arrow-right-to-file{--fa: ""}.fa-square-arrow-up-right,.fa-external-link-square{--fa: ""}.fa-box-open{--fa: ""}.fa-scroll{--fa: ""}.fa-spa{--fa: ""}.fa-location-pin-lock{--fa: ""}.fa-pause{--fa: ""}.fa-hill-avalanche{--fa: ""}.fa-temperature-empty,.fa-temperature-0,.fa-thermometer-0,.fa-thermometer-empty{--fa: ""}.fa-bomb{--fa: ""}.fa-registered{--fa: ""}.fa-address-card,.fa-contact-card,.fa-vcard{--fa: ""}.fa-scale-unbalanced-flip,.fa-balance-scale-right{--fa: ""}.fa-subscript{--fa: ""}.fa-diamond-turn-right,.fa-directions{--fa: ""}.fa-burst{--fa: ""}.fa-house-laptop,.fa-laptop-house{--fa: ""}.fa-face-tired,.fa-tired{--fa: ""}.fa-money-bills{--fa: ""}.fa-smog{--fa: ""}.fa-crutch{--fa: ""}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa: ""}.fa-palette{--fa: ""}.fa-arrows-turn-right{--fa: ""}.fa-vest{--fa: ""}.fa-ferry{--fa: ""}.fa-arrows-down-to-people{--fa: ""}.fa-seedling,.fa-sprout{--fa: ""}.fa-left-right,.fa-arrows-alt-h{--fa: ""}.fa-boxes-packing{--fa: ""}.fa-circle-arrow-left,.fa-arrow-circle-left{--fa: ""}.fa-group-arrows-rotate{--fa: ""}.fa-bowl-food{--fa: ""}.fa-candy-cane{--fa: ""}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa: ""}.fa-cloud-bolt,.fa-thunderstorm{--fa: ""}.fa-text-slash,.fa-remove-format{--fa: ""}.fa-face-smile-wink,.fa-smile-wink{--fa: ""}.fa-file-word{--fa: ""}.fa-file-powerpoint{--fa: ""}.fa-arrows-left-right,.fa-arrows-h{--fa: ""}.fa-house-lock{--fa: ""}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa: ""}.fa-children{--fa: ""}.fa-chalkboard,.fa-blackboard{--fa: ""}.fa-user-large-slash,.fa-user-alt-slash{--fa: ""}.fa-envelope-open{--fa: ""}.fa-handshake-simple-slash,.fa-handshake-alt-slash{--fa: ""}.fa-mattress-pillow{--fa: ""}.fa-guarani-sign{--fa: ""}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa: ""}.fa-fire-extinguisher{--fa: ""}.fa-cruzeiro-sign{--fa: ""}.fa-greater-than-equal{--fa: ""}.fa-shield-halved,.fa-shield-alt{--fa: ""}.fa-book-atlas,.fa-atlas{--fa: ""}.fa-virus{--fa: ""}.fa-envelope-circle-check{--fa: ""}.fa-layer-group{--fa: ""}.fa-arrows-to-dot{--fa: ""}.fa-archway{--fa: ""}.fa-heart-circle-check{--fa: ""}.fa-house-chimney-crack,.fa-house-damage{--fa: ""}.fa-file-zipper,.fa-file-archive{--fa: ""}.fa-square{--fa: ""}.fa-martini-glass-empty,.fa-glass-martini{--fa: ""}.fa-couch{--fa: ""}.fa-cedi-sign{--fa: ""}.fa-italic{--fa: ""}.fa-table-cells-column-lock{--fa: ""}.fa-church{--fa: ""}.fa-comments-dollar{--fa: ""}.fa-democrat{--fa: ""}.fa-z{--fa: "Z"}.fa-person-skiing,.fa-skiing{--fa: ""}.fa-road-lock{--fa: ""}.fa-a{--fa: "A"}.fa-temperature-arrow-down,.fa-temperature-down{--fa: ""}.fa-feather-pointed,.fa-feather-alt{--fa: ""}.fa-p{--fa: "P"}.fa-snowflake{--fa: ""}.fa-newspaper{--fa: ""}.fa-rectangle-ad,.fa-ad{--fa: ""}.fa-circle-arrow-right,.fa-arrow-circle-right{--fa: ""}.fa-filter-circle-xmark{--fa: ""}.fa-locust{--fa: ""}.fa-sort,.fa-unsorted{--fa: ""}.fa-list-ol,.fa-list-1-2,.fa-list-numeric{--fa: ""}.fa-person-dress-burst{--fa: ""}.fa-money-check-dollar,.fa-money-check-alt{--fa: ""}.fa-vector-square{--fa: ""}.fa-bread-slice{--fa: ""}.fa-language{--fa: ""}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa: ""}.fa-filter{--fa: ""}.fa-question{--fa: "?"}.fa-file-signature{--fa: ""}.fa-up-down-left-right,.fa-arrows-alt{--fa: ""}.fa-house-chimney-user{--fa: ""}.fa-hand-holding-heart{--fa: ""}.fa-puzzle-piece{--fa: ""}.fa-money-check{--fa: ""}.fa-star-half-stroke,.fa-star-half-alt{--fa: ""}.fa-code{--fa: ""}.fa-whiskey-glass,.fa-glass-whiskey{--fa: ""}.fa-building-circle-exclamation{--fa: ""}.fa-magnifying-glass-chart{--fa: ""}.fa-arrow-up-right-from-square,.fa-external-link{--fa: ""}.fa-cubes-stacked{--fa: ""}.fa-won-sign,.fa-krw,.fa-won{--fa: ""}.fa-virus-covid{--fa: ""}.fa-austral-sign{--fa: ""}.fa-f{--fa: "F"}.fa-leaf{--fa: ""}.fa-road{--fa: ""}.fa-taxi,.fa-cab{--fa: ""}.fa-person-circle-plus{--fa: ""}.fa-chart-pie,.fa-pie-chart{--fa: ""}.fa-bolt-lightning{--fa: ""}.fa-sack-xmark{--fa: ""}.fa-file-excel{--fa: ""}.fa-file-contract{--fa: ""}.fa-fish-fins{--fa: ""}.fa-building-flag{--fa: ""}.fa-face-grin-beam,.fa-grin-beam{--fa: ""}.fa-object-ungroup{--fa: ""}.fa-poop{--fa: ""}.fa-location-pin,.fa-map-marker{--fa: ""}.fa-kaaba{--fa: ""}.fa-toilet-paper{--fa: ""}.fa-helmet-safety,.fa-hard-hat,.fa-hat-hard{--fa: ""}.fa-eject{--fa: ""}.fa-circle-right,.fa-arrow-alt-circle-right{--fa: ""}.fa-plane-circle-check{--fa: ""}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa: ""}.fa-object-group{--fa: ""}.fa-chart-line,.fa-line-chart{--fa: ""}.fa-mask-ventilator{--fa: ""}.fa-arrow-right{--fa: ""}.fa-signs-post,.fa-map-signs{--fa: ""}.fa-cash-register{--fa: ""}.fa-person-circle-question{--fa: ""}.fa-h{--fa: "H"}.fa-tarp{--fa: ""}.fa-screwdriver-wrench,.fa-tools{--fa: ""}.fa-arrows-to-eye{--fa: ""}.fa-plug-circle-bolt{--fa: ""}.fa-heart{--fa: ""}.fa-mars-and-venus{--fa: ""}.fa-house-user,.fa-home-user{--fa: ""}.fa-dumpster-fire{--fa: ""}.fa-house-crack{--fa: ""}.fa-martini-glass-citrus,.fa-cocktail{--fa: ""}.fa-face-surprise,.fa-surprise{--fa: ""}.fa-bottle-water{--fa: ""}.fa-circle-pause,.fa-pause-circle{--fa: ""}.fa-toilet-paper-slash{--fa: ""}.fa-apple-whole,.fa-apple-alt{--fa: ""}.fa-kitchen-set{--fa: ""}.fa-r{--fa: "R"}.fa-temperature-quarter,.fa-temperature-1,.fa-thermometer-1,.fa-thermometer-quarter{--fa: ""}.fa-cube{--fa: ""}.fa-bitcoin-sign{--fa: ""}.fa-shield-dog{--fa: ""}.fa-solar-panel{--fa: ""}.fa-lock-open{--fa: ""}.fa-elevator{--fa: ""}.fa-money-bill-transfer{--fa: ""}.fa-money-bill-trend-up{--fa: ""}.fa-house-flood-water-circle-arrow-right{--fa: ""}.fa-square-poll-horizontal,.fa-poll-h{--fa: ""}.fa-circle{--fa: ""}.fa-backward-fast,.fa-fast-backward{--fa: ""}.fa-recycle{--fa: ""}.fa-user-astronaut{--fa: ""}.fa-plane-slash{--fa: ""}.fa-trademark{--fa: ""}.fa-basketball,.fa-basketball-ball{--fa: ""}.fa-satellite-dish{--fa: ""}.fa-circle-up,.fa-arrow-alt-circle-up{--fa: ""}.fa-mobile-screen-button,.fa-mobile-alt{--fa: ""}.fa-volume-high,.fa-volume-up{--fa: ""}.fa-users-rays{--fa: ""}.fa-wallet{--fa: ""}.fa-clipboard-check{--fa: ""}.fa-file-audio{--fa: ""}.fa-burger,.fa-hamburger{--fa: ""}.fa-wrench{--fa: ""}.fa-bugs{--fa: ""}.fa-rupee-sign,.fa-rupee{--fa: ""}.fa-file-image{--fa: ""}.fa-circle-question,.fa-question-circle{--fa: ""}.fa-plane-departure{--fa: ""}.fa-handshake-slash{--fa: ""}.fa-book-bookmark{--fa: ""}.fa-code-branch{--fa: ""}.fa-hat-cowboy{--fa: ""}.fa-bridge{--fa: ""}.fa-phone-flip,.fa-phone-alt{--fa: ""}.fa-truck-front{--fa: ""}.fa-cat{--fa: ""}.fa-anchor-circle-exclamation{--fa: ""}.fa-truck-field{--fa: ""}.fa-route{--fa: ""}.fa-clipboard-question{--fa: ""}.fa-panorama{--fa: ""}.fa-comment-medical{--fa: ""}.fa-teeth-open{--fa: ""}.fa-file-circle-minus{--fa: ""}.fa-tags{--fa: ""}.fa-wine-glass{--fa: ""}.fa-forward-fast,.fa-fast-forward{--fa: ""}.fa-face-meh-blank,.fa-meh-blank{--fa: ""}.fa-square-parking,.fa-parking{--fa: ""}.fa-house-signal{--fa: ""}.fa-bars-progress,.fa-tasks-alt{--fa: ""}.fa-faucet-drip{--fa: ""}.fa-cart-flatbed,.fa-dolly-flatbed{--fa: ""}.fa-ban-smoking,.fa-smoking-ban{--fa: ""}.fa-terminal{--fa: ""}.fa-mobile-button{--fa: ""}.fa-house-medical-flag{--fa: ""}.fa-basket-shopping,.fa-shopping-basket{--fa: ""}.fa-tape{--fa: ""}.fa-bus-simple,.fa-bus-alt{--fa: ""}.fa-eye{--fa: ""}.fa-face-sad-cry,.fa-sad-cry{--fa: ""}.fa-audio-description{--fa: ""}.fa-person-military-to-person{--fa: ""}.fa-file-shield{--fa: ""}.fa-user-slash{--fa: ""}.fa-pen{--fa: ""}.fa-tower-observation{--fa: ""}.fa-file-code{--fa: ""}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa: ""}.fa-bus{--fa: ""}.fa-heart-circle-xmark{--fa: ""}.fa-house-chimney,.fa-home-lg{--fa: ""}.fa-window-maximize{--fa: ""}.fa-face-frown,.fa-frown{--fa: ""}.fa-prescription{--fa: ""}.fa-shop,.fa-store-alt{--fa: ""}.fa-floppy-disk,.fa-save{--fa: ""}.fa-vihara{--fa: ""}.fa-scale-unbalanced,.fa-balance-scale-left{--fa: ""}.fa-sort-up,.fa-sort-asc{--fa: ""}.fa-comment-dots,.fa-commenting{--fa: ""}.fa-plant-wilt{--fa: ""}.fa-diamond{--fa: ""}.fa-face-grin-squint,.fa-grin-squint{--fa: ""}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa: ""}.fa-chart-diagram{--fa: ""}.fa-bacterium{--fa: ""}.fa-hand-pointer{--fa: ""}.fa-drum-steelpan{--fa: ""}.fa-hand-scissors{--fa: ""}.fa-hands-praying,.fa-praying-hands{--fa: ""}.fa-arrow-rotate-right,.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-redo{--fa: ""}.fa-biohazard{--fa: ""}.fa-location-crosshairs,.fa-location{--fa: ""}.fa-mars-double{--fa: ""}.fa-child-dress{--fa: ""}.fa-users-between-lines{--fa: ""}.fa-lungs-virus{--fa: ""}.fa-face-grin-tears,.fa-grin-tears{--fa: ""}.fa-phone{--fa: ""}.fa-calendar-xmark,.fa-calendar-times{--fa: ""}.fa-child-reaching{--fa: ""}.fa-head-side-virus{--fa: ""}.fa-user-gear,.fa-user-cog{--fa: ""}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa: ""}.fa-door-closed{--fa: ""}.fa-shield-virus{--fa: ""}.fa-dice-six{--fa: ""}.fa-mosquito-net{--fa: ""}.fa-file-fragment{--fa: ""}.fa-bridge-water{--fa: ""}.fa-person-booth{--fa: ""}.fa-text-width{--fa: ""}.fa-hat-wizard{--fa: ""}.fa-pen-fancy{--fa: ""}.fa-person-digging,.fa-digging{--fa: ""}.fa-trash{--fa: ""}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa: ""}.fa-book-medical{--fa: ""}.fa-poo{--fa: ""}.fa-quote-right,.fa-quote-right-alt{--fa: ""}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa: ""}.fa-cubes{--fa: ""}.fa-divide{--fa: ""}.fa-tenge-sign,.fa-tenge{--fa: ""}.fa-headphones{--fa: ""}.fa-hands-holding{--fa: ""}.fa-hands-clapping{--fa: ""}.fa-republican{--fa: ""}.fa-arrow-left{--fa: ""}.fa-person-circle-xmark{--fa: ""}.fa-ruler{--fa: ""}.fa-align-left{--fa: ""}.fa-dice-d6{--fa: ""}.fa-restroom{--fa: ""}.fa-j{--fa: "J"}.fa-users-viewfinder{--fa: ""}.fa-file-video{--fa: ""}.fa-up-right-from-square,.fa-external-link-alt{--fa: ""}.fa-table-cells,.fa-th{--fa: ""}.fa-file-pdf{--fa: ""}.fa-book-bible,.fa-bible{--fa: ""}.fa-o{--fa: "O"}.fa-suitcase-medical,.fa-medkit{--fa: ""}.fa-user-secret{--fa: ""}.fa-otter{--fa: ""}.fa-person-dress,.fa-female{--fa: ""}.fa-comment-dollar{--fa: ""}.fa-business-time,.fa-briefcase-clock{--fa: ""}.fa-table-cells-large,.fa-th-large{--fa: ""}.fa-book-tanakh,.fa-tanakh{--fa: ""}.fa-phone-volume,.fa-volume-control-phone{--fa: ""}.fa-hat-cowboy-side{--fa: ""}.fa-clipboard-user{--fa: ""}.fa-child{--fa: ""}.fa-lira-sign{--fa: ""}.fa-satellite{--fa: ""}.fa-plane-lock{--fa: ""}.fa-tag{--fa: ""}.fa-comment{--fa: ""}.fa-cake-candles,.fa-birthday-cake,.fa-cake{--fa: ""}.fa-envelope{--fa: ""}.fa-angles-up,.fa-angle-double-up{--fa: ""}.fa-paperclip{--fa: ""}.fa-arrow-right-to-city{--fa: ""}.fa-ribbon{--fa: ""}.fa-lungs{--fa: ""}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa: ""}.fa-litecoin-sign{--fa: ""}.fa-border-none{--fa: ""}.fa-circle-nodes{--fa: ""}.fa-parachute-box{--fa: ""}.fa-indent{--fa: ""}.fa-truck-field-un{--fa: ""}.fa-hourglass,.fa-hourglass-empty{--fa: ""}.fa-mountain{--fa: ""}.fa-user-doctor,.fa-user-md{--fa: ""}.fa-circle-info,.fa-info-circle{--fa: ""}.fa-cloud-meatball{--fa: ""}.fa-camera,.fa-camera-alt{--fa: ""}.fa-square-virus{--fa: ""}.fa-meteor{--fa: ""}.fa-car-on{--fa: ""}.fa-sleigh{--fa: ""}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa: ""}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa: ""}.fa-water{--fa: ""}.fa-calendar-check{--fa: ""}.fa-braille{--fa: ""}.fa-prescription-bottle-medical,.fa-prescription-bottle-alt{--fa: ""}.fa-landmark{--fa: ""}.fa-truck{--fa: ""}.fa-crosshairs{--fa: ""}.fa-person-cane{--fa: ""}.fa-tent{--fa: ""}.fa-vest-patches{--fa: ""}.fa-check-double{--fa: ""}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa: ""}.fa-money-bill-wheat{--fa: ""}.fa-cookie{--fa: ""}.fa-arrow-rotate-left,.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-undo{--fa: ""}.fa-hard-drive,.fa-hdd{--fa: ""}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa: ""}.fa-dumbbell{--fa: ""}.fa-rectangle-list,.fa-list-alt{--fa: ""}.fa-tarp-droplet{--fa: ""}.fa-house-medical-circle-check{--fa: ""}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa: ""}.fa-calendar-plus{--fa: ""}.fa-plane-arrival{--fa: ""}.fa-circle-left,.fa-arrow-alt-circle-left{--fa: ""}.fa-train-subway,.fa-subway{--fa: ""}.fa-chart-gantt{--fa: ""}.fa-indian-rupee-sign,.fa-indian-rupee,.fa-inr{--fa: ""}.fa-crop-simple,.fa-crop-alt{--fa: ""}.fa-money-bill-1,.fa-money-bill-alt{--fa: ""}.fa-left-long,.fa-long-arrow-alt-left{--fa: ""}.fa-dna{--fa: ""}.fa-virus-slash{--fa: ""}.fa-minus,.fa-subtract{--fa: ""}.fa-chess{--fa: ""}.fa-arrow-left-long,.fa-long-arrow-left{--fa: ""}.fa-plug-circle-check{--fa: ""}.fa-street-view{--fa: ""}.fa-franc-sign{--fa: ""}.fa-volume-off{--fa: ""}.fa-hands-asl-interpreting,.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting{--fa: ""}.fa-gear,.fa-cog{--fa: ""}.fa-droplet-slash,.fa-tint-slash{--fa: ""}.fa-mosque{--fa: ""}.fa-mosquito{--fa: ""}.fa-star-of-david{--fa: ""}.fa-person-military-rifle{--fa: ""}.fa-cart-shopping,.fa-shopping-cart{--fa: ""}.fa-vials{--fa: ""}.fa-plug-circle-plus{--fa: ""}.fa-place-of-worship{--fa: ""}.fa-grip-vertical{--fa: ""}.fa-hexagon-nodes{--fa: ""}.fa-arrow-turn-up,.fa-level-up{--fa: ""}.fa-u{--fa: "U"}.fa-square-root-variable,.fa-square-root-alt{--fa: ""}.fa-clock,.fa-clock-four{--fa: ""}.fa-backward-step,.fa-step-backward{--fa: ""}.fa-pallet{--fa: ""}.fa-faucet{--fa: ""}.fa-baseball-bat-ball{--fa: ""}.fa-s{--fa: "S"}.fa-timeline{--fa: ""}.fa-keyboard{--fa: ""}.fa-caret-down{--fa: ""}.fa-house-chimney-medical,.fa-clinic-medical{--fa: ""}.fa-temperature-three-quarters,.fa-temperature-3,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa: ""}.fa-mobile-screen,.fa-mobile-android-alt{--fa: ""}.fa-plane-up{--fa: ""}.fa-piggy-bank{--fa: ""}.fa-battery-half,.fa-battery-3{--fa: ""}.fa-mountain-city{--fa: ""}.fa-coins{--fa: ""}.fa-khanda{--fa: ""}.fa-sliders,.fa-sliders-h{--fa: ""}.fa-folder-tree{--fa: ""}.fa-network-wired{--fa: ""}.fa-map-pin{--fa: ""}.fa-hamsa{--fa: ""}.fa-cent-sign{--fa: ""}.fa-flask{--fa: ""}.fa-person-pregnant{--fa: ""}.fa-wand-sparkles{--fa: ""}.fa-ellipsis-vertical,.fa-ellipsis-v{--fa: ""}.fa-ticket{--fa: ""}.fa-power-off{--fa: ""}.fa-right-long,.fa-long-arrow-alt-right{--fa: ""}.fa-flag-usa{--fa: ""}.fa-laptop-file{--fa: ""}.fa-tty,.fa-teletype{--fa: ""}.fa-diagram-next{--fa: ""}.fa-person-rifle{--fa: ""}.fa-house-medical-circle-exclamation{--fa: ""}.fa-closed-captioning{--fa: ""}.fa-person-hiking,.fa-hiking{--fa: ""}.fa-venus-double{--fa: ""}.fa-images{--fa: ""}.fa-calculator{--fa: ""}.fa-people-pulling{--fa: ""}.fa-n{--fa: "N"}.fa-cable-car,.fa-tram{--fa: ""}.fa-cloud-rain{--fa: ""}.fa-building-circle-xmark{--fa: ""}.fa-ship{--fa: ""}.fa-arrows-down-to-line{--fa: ""}.fa-download{--fa: ""}.fa-face-grin,.fa-grin{--fa: ""}.fa-delete-left,.fa-backspace{--fa: ""}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa: ""}.fa-file-circle-check{--fa: ""}.fa-forward{--fa: ""}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa: ""}.fa-face-meh,.fa-meh{--fa: ""}.fa-align-center{--fa: ""}.fa-book-skull,.fa-book-dead{--fa: ""}.fa-id-card,.fa-drivers-license{--fa: ""}.fa-outdent,.fa-dedent{--fa: ""}.fa-heart-circle-exclamation{--fa: ""}.fa-house,.fa-home,.fa-home-alt,.fa-home-lg-alt{--fa: ""}.fa-calendar-week{--fa: ""}.fa-laptop-medical{--fa: ""}.fa-b{--fa: "B"}.fa-file-medical{--fa: ""}.fa-dice-one{--fa: ""}.fa-kiwi-bird{--fa: ""}.fa-arrow-right-arrow-left,.fa-exchange{--fa: ""}.fa-rotate-right,.fa-redo-alt,.fa-rotate-forward{--fa: ""}.fa-utensils,.fa-cutlery{--fa: ""}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa: ""}.fa-mill-sign{--fa: ""}.fa-bowl-rice{--fa: ""}.fa-skull{--fa: ""}.fa-tower-broadcast,.fa-broadcast-tower{--fa: ""}.fa-truck-pickup{--fa: ""}.fa-up-long,.fa-long-arrow-alt-up{--fa: ""}.fa-stop{--fa: ""}.fa-code-merge{--fa: ""}.fa-upload{--fa: ""}.fa-hurricane{--fa: ""}.fa-mound{--fa: ""}.fa-toilet-portable{--fa: ""}.fa-compact-disc{--fa: ""}.fa-file-arrow-down,.fa-file-download{--fa: ""}.fa-caravan{--fa: ""}.fa-shield-cat{--fa: ""}.fa-bolt,.fa-zap{--fa: ""}.fa-glass-water{--fa: ""}.fa-oil-well{--fa: ""}.fa-vault{--fa: ""}.fa-mars{--fa: ""}.fa-toilet{--fa: ""}.fa-plane-circle-xmark{--fa: ""}.fa-yen-sign,.fa-cny,.fa-jpy,.fa-rmb,.fa-yen{--fa: ""}.fa-ruble-sign,.fa-rouble,.fa-rub,.fa-ruble{--fa: ""}.fa-sun{--fa: ""}.fa-guitar{--fa: ""}.fa-face-laugh-wink,.fa-laugh-wink{--fa: ""}.fa-horse-head{--fa: ""}.fa-bore-hole{--fa: ""}.fa-industry{--fa: ""}.fa-circle-down,.fa-arrow-alt-circle-down{--fa: ""}.fa-arrows-turn-to-dots{--fa: ""}.fa-florin-sign{--fa: ""}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa: ""}.fa-less-than{--fa: "<"}.fa-angle-down{--fa: ""}.fa-car-tunnel{--fa: ""}.fa-head-side-cough{--fa: ""}.fa-grip-lines{--fa: ""}.fa-thumbs-down{--fa: ""}.fa-user-lock{--fa: ""}.fa-arrow-right-long,.fa-long-arrow-right{--fa: ""}.fa-anchor-circle-xmark{--fa: ""}.fa-ellipsis,.fa-ellipsis-h{--fa: ""}.fa-chess-pawn{--fa: ""}.fa-kit-medical,.fa-first-aid{--fa: ""}.fa-person-through-window{--fa: ""}.fa-toolbox{--fa: ""}.fa-hands-holding-circle{--fa: ""}.fa-bug{--fa: ""}.fa-credit-card,.fa-credit-card-alt{--fa: ""}.fa-car,.fa-automobile{--fa: ""}.fa-hand-holding-hand{--fa: ""}.fa-book-open-reader,.fa-book-reader{--fa: ""}.fa-mountain-sun{--fa: ""}.fa-arrows-left-right-to-line{--fa: ""}.fa-dice-d20{--fa: ""}.fa-truck-droplet{--fa: ""}.fa-file-circle-xmark{--fa: ""}.fa-temperature-arrow-up,.fa-temperature-up{--fa: ""}.fa-medal{--fa: ""}.fa-bed{--fa: ""}.fa-square-h,.fa-h-square{--fa: ""}.fa-podcast{--fa: ""}.fa-temperature-full,.fa-temperature-4,.fa-thermometer-4,.fa-thermometer-full{--fa: ""}.fa-bell{--fa: ""}.fa-superscript{--fa: ""}.fa-plug-circle-xmark{--fa: ""}.fa-star-of-life{--fa: ""}.fa-phone-slash{--fa: ""}.fa-paint-roller{--fa: ""}.fa-handshake-angle,.fa-hands-helping{--fa: ""}.fa-location-dot,.fa-map-marker-alt{--fa: ""}.fa-file{--fa: ""}.fa-greater-than{--fa: ">"}.fa-person-swimming,.fa-swimmer{--fa: ""}.fa-arrow-down{--fa: ""}.fa-droplet,.fa-tint{--fa: ""}.fa-eraser{--fa: ""}.fa-earth-americas,.fa-earth,.fa-earth-america,.fa-globe-americas{--fa: ""}.fa-person-burst{--fa: ""}.fa-dove{--fa: ""}.fa-battery-empty,.fa-battery-0{--fa: ""}.fa-socks{--fa: ""}.fa-inbox{--fa: ""}.fa-section{--fa: ""}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa: ""}.fa-envelope-open-text{--fa: ""}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa: ""}.fa-wine-bottle{--fa: ""}.fa-chess-rook{--fa: ""}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa: ""}.fa-dharmachakra{--fa: ""}.fa-hotdog{--fa: ""}.fa-person-walking-with-cane,.fa-blind{--fa: ""}.fa-drum{--fa: ""}.fa-ice-cream{--fa: ""}.fa-heart-circle-bolt{--fa: ""}.fa-fax{--fa: ""}.fa-paragraph{--fa: ""}.fa-check-to-slot,.fa-vote-yea{--fa: ""}.fa-star-half{--fa: ""}.fa-boxes-stacked,.fa-boxes,.fa-boxes-alt{--fa: ""}.fa-link,.fa-chain{--fa: ""}.fa-ear-listen,.fa-assistive-listening-systems{--fa: ""}.fa-tree-city{--fa: ""}.fa-play{--fa: ""}.fa-font{--fa: ""}.fa-table-cells-row-lock{--fa: ""}.fa-rupiah-sign{--fa: ""}.fa-magnifying-glass,.fa-search{--fa: ""}.fa-table-tennis-paddle-ball,.fa-ping-pong-paddle-ball,.fa-table-tennis{--fa: ""}.fa-person-dots-from-line,.fa-diagnoses{--fa: ""}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa: ""}.fa-naira-sign{--fa: ""}.fa-cart-arrow-down{--fa: ""}.fa-walkie-talkie{--fa: ""}.fa-file-pen,.fa-file-edit{--fa: ""}.fa-receipt{--fa: ""}.fa-square-pen,.fa-pen-square,.fa-pencil-square{--fa: ""}.fa-suitcase-rolling{--fa: ""}.fa-person-circle-exclamation{--fa: ""}.fa-chevron-down{--fa: ""}.fa-battery-full,.fa-battery,.fa-battery-5{--fa: ""}.fa-skull-crossbones{--fa: ""}.fa-code-compare{--fa: ""}.fa-list-ul,.fa-list-dots{--fa: ""}.fa-school-lock{--fa: ""}.fa-tower-cell{--fa: ""}.fa-down-long,.fa-long-arrow-alt-down{--fa: ""}.fa-ranking-star{--fa: ""}.fa-chess-king{--fa: ""}.fa-person-harassing{--fa: ""}.fa-brazilian-real-sign{--fa: ""}.fa-landmark-dome,.fa-landmark-alt{--fa: ""}.fa-arrow-up{--fa: ""}.fa-tv,.fa-television,.fa-tv-alt{--fa: ""}.fa-shrimp{--fa: ""}.fa-list-check,.fa-tasks{--fa: ""}.fa-jug-detergent{--fa: ""}.fa-circle-user,.fa-user-circle{--fa: ""}.fa-user-shield{--fa: ""}.fa-wind{--fa: ""}.fa-car-burst,.fa-car-crash{--fa: ""}.fa-y{--fa: "Y"}.fa-person-snowboarding,.fa-snowboarding{--fa: ""}.fa-truck-fast,.fa-shipping-fast{--fa: ""}.fa-fish{--fa: ""}.fa-user-graduate{--fa: ""}.fa-circle-half-stroke,.fa-adjust{--fa: ""}.fa-clapperboard{--fa: ""}.fa-circle-radiation,.fa-radiation-alt{--fa: ""}.fa-baseball,.fa-baseball-ball{--fa: ""}.fa-jet-fighter-up{--fa: ""}.fa-diagram-project,.fa-project-diagram{--fa: ""}.fa-copy{--fa: ""}.fa-volume-xmark,.fa-volume-mute,.fa-volume-times{--fa: ""}.fa-hand-sparkles{--fa: ""}.fa-grip,.fa-grip-horizontal{--fa: ""}.fa-share-from-square,.fa-share-square{--fa: ""}.fa-child-combatant,.fa-child-rifle{--fa: ""}.fa-gun{--fa: ""}.fa-square-phone,.fa-phone-square{--fa: ""}.fa-plus,.fa-add{--fa: "+"}.fa-expand{--fa: ""}.fa-computer{--fa: ""}.fa-xmark,.fa-close,.fa-multiply,.fa-remove,.fa-times{--fa: ""}.fa-arrows-up-down-left-right,.fa-arrows{--fa: ""}.fa-chalkboard-user,.fa-chalkboard-teacher{--fa: ""}.fa-peso-sign{--fa: ""}.fa-building-shield{--fa: ""}.fa-baby{--fa: ""}.fa-users-line{--fa: ""}.fa-quote-left,.fa-quote-left-alt{--fa: ""}.fa-tractor{--fa: ""}.fa-trash-arrow-up,.fa-trash-restore{--fa: ""}.fa-arrow-down-up-lock{--fa: ""}.fa-lines-leaning{--fa: ""}.fa-ruler-combined{--fa: ""}.fa-copyright{--fa: ""}.fa-equals{--fa: "="}.fa-blender{--fa: ""}.fa-teeth{--fa: ""}.fa-shekel-sign,.fa-ils,.fa-shekel,.fa-sheqel,.fa-sheqel-sign{--fa: ""}.fa-map{--fa: ""}.fa-rocket{--fa: ""}.fa-photo-film,.fa-photo-video{--fa: ""}.fa-folder-minus{--fa: ""}.fa-hexagon-nodes-bolt{--fa: ""}.fa-store{--fa: ""}.fa-arrow-trend-up{--fa: ""}.fa-plug-circle-minus{--fa: ""}.fa-sign-hanging,.fa-sign{--fa: ""}.fa-bezier-curve{--fa: ""}.fa-bell-slash{--fa: ""}.fa-tablet,.fa-tablet-android{--fa: ""}.fa-school-flag{--fa: ""}.fa-fill{--fa: ""}.fa-angle-up{--fa: ""}.fa-drumstick-bite{--fa: ""}.fa-holly-berry{--fa: ""}.fa-chevron-left{--fa: ""}.fa-bacteria{--fa: ""}.fa-hand-lizard{--fa: ""}.fa-notdef{--fa: ""}.fa-disease{--fa: ""}.fa-briefcase-medical{--fa: ""}.fa-genderless{--fa: ""}.fa-chevron-right{--fa: ""}.fa-retweet{--fa: ""}.fa-car-rear,.fa-car-alt{--fa: ""}.fa-pump-soap{--fa: ""}.fa-video-slash{--fa: ""}.fa-battery-quarter,.fa-battery-2{--fa: ""}.fa-radio{--fa: ""}.fa-baby-carriage,.fa-carriage-baby{--fa: ""}.fa-traffic-light{--fa: ""}.fa-thermometer{--fa: ""}.fa-vr-cardboard{--fa: ""}.fa-hand-middle-finger{--fa: ""}.fa-percent,.fa-percentage{--fa: "%"}.fa-truck-moving{--fa: ""}.fa-glass-water-droplet{--fa: ""}.fa-display{--fa: ""}.fa-face-smile,.fa-smile{--fa: ""}.fa-thumbtack,.fa-thumb-tack{--fa: ""}.fa-trophy{--fa: ""}.fa-person-praying,.fa-pray{--fa: ""}.fa-hammer{--fa: ""}.fa-hand-peace{--fa: ""}.fa-rotate,.fa-sync-alt{--fa: ""}.fa-spinner{--fa: ""}.fa-robot{--fa: ""}.fa-peace{--fa: ""}.fa-gears,.fa-cogs{--fa: ""}.fa-warehouse{--fa: ""}.fa-arrow-up-right-dots{--fa: ""}.fa-splotch{--fa: ""}.fa-face-grin-hearts,.fa-grin-hearts{--fa: ""}.fa-dice-four{--fa: ""}.fa-sim-card{--fa: ""}.fa-transgender,.fa-transgender-alt{--fa: ""}.fa-mercury{--fa: ""}.fa-arrow-turn-down,.fa-level-down{--fa: ""}.fa-person-falling-burst{--fa: ""}.fa-award{--fa: ""}.fa-ticket-simple,.fa-ticket-alt{--fa: ""}.fa-building{--fa: ""}.fa-angles-left,.fa-angle-double-left{--fa: ""}.fa-qrcode{--fa: ""}.fa-clock-rotate-left,.fa-history{--fa: ""}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa: ""}.fa-file-export,.fa-arrow-right-from-file{--fa: ""}.fa-shield,.fa-shield-blank{--fa: ""}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa: ""}.fa-comment-nodes{--fa: ""}.fa-house-medical{--fa: ""}.fa-golf-ball-tee,.fa-golf-ball{--fa: ""}.fa-circle-chevron-left,.fa-chevron-circle-left{--fa: ""}.fa-house-chimney-window{--fa: ""}.fa-pen-nib{--fa: ""}.fa-tent-arrow-turn-left{--fa: ""}.fa-tents{--fa: ""}.fa-wand-magic,.fa-magic{--fa: ""}.fa-dog{--fa: ""}.fa-carrot{--fa: ""}.fa-moon{--fa: ""}.fa-wine-glass-empty,.fa-wine-glass-alt{--fa: ""}.fa-cheese{--fa: ""}.fa-yin-yang{--fa: ""}.fa-music{--fa: ""}.fa-code-commit{--fa: ""}.fa-temperature-low{--fa: ""}.fa-person-biking,.fa-biking{--fa: ""}.fa-broom{--fa: ""}.fa-shield-heart{--fa: ""}.fa-gopuram{--fa: ""}.fa-earth-oceania,.fa-globe-oceania{--fa: ""}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa: ""}.fa-hashtag{--fa: "#"}.fa-up-right-and-down-left-from-center,.fa-expand-alt{--fa: ""}.fa-oil-can{--fa: ""}.fa-t{--fa: "T"}.fa-hippo{--fa: ""}.fa-chart-column{--fa: ""}.fa-infinity{--fa: ""}.fa-vial-circle-check{--fa: ""}.fa-person-arrow-down-to-line{--fa: ""}.fa-voicemail{--fa: ""}.fa-fan{--fa: ""}.fa-person-walking-luggage{--fa: ""}.fa-up-down,.fa-arrows-alt-v{--fa: ""}.fa-cloud-moon-rain{--fa: ""}.fa-calendar{--fa: ""}.fa-trailer{--fa: ""}.fa-bahai,.fa-haykal{--fa: ""}.fa-sd-card{--fa: ""}.fa-dragon{--fa: ""}.fa-shoe-prints{--fa: ""}.fa-circle-plus,.fa-plus-circle{--fa: ""}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa: ""}.fa-hand-holding{--fa: ""}.fa-plug-circle-exclamation{--fa: ""}.fa-link-slash,.fa-chain-broken,.fa-chain-slash,.fa-unlink{--fa: ""}.fa-clone{--fa: ""}.fa-person-walking-arrow-loop-left{--fa: ""}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa: ""}.fa-fire-flame-curved,.fa-fire-alt{--fa: ""}.fa-tornado{--fa: ""}.fa-file-circle-plus{--fa: ""}.fa-book-quran,.fa-quran{--fa: ""}.fa-anchor{--fa: ""}.fa-border-all{--fa: ""}.fa-face-angry,.fa-angry{--fa: ""}.fa-cookie-bite{--fa: ""}.fa-arrow-trend-down{--fa: ""}.fa-rss,.fa-feed{--fa: ""}.fa-draw-polygon{--fa: ""}.fa-scale-balanced,.fa-balance-scale{--fa: ""}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa: ""}.fa-shower{--fa: ""}.fa-desktop,.fa-desktop-alt{--fa: ""}.fa-m{--fa: "M"}.fa-table-list,.fa-th-list{--fa: ""}.fa-comment-sms,.fa-sms{--fa: ""}.fa-book{--fa: ""}.fa-user-plus{--fa: ""}.fa-check{--fa: ""}.fa-battery-three-quarters,.fa-battery-4{--fa: ""}.fa-house-circle-check{--fa: ""}.fa-angle-left{--fa: ""}.fa-diagram-successor{--fa: ""}.fa-truck-arrow-right{--fa: ""}.fa-arrows-split-up-and-left{--fa: ""}.fa-hand-fist,.fa-fist-raised{--fa: ""}.fa-cloud-moon{--fa: ""}.fa-briefcase{--fa: ""}.fa-person-falling{--fa: ""}.fa-image-portrait,.fa-portrait{--fa: ""}.fa-user-tag{--fa: ""}.fa-rug{--fa: ""}.fa-earth-europe,.fa-globe-europe{--fa: ""}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa: ""}.fa-rectangle-xmark,.fa-rectangle-times,.fa-times-rectangle,.fa-window-close{--fa: ""}.fa-baht-sign{--fa: ""}.fa-book-open{--fa: ""}.fa-book-journal-whills,.fa-journal-whills{--fa: ""}.fa-handcuffs{--fa: ""}.fa-triangle-exclamation,.fa-exclamation-triangle,.fa-warning{--fa: ""}.fa-database{--fa: ""}.fa-share,.fa-mail-forward{--fa: ""}.fa-bottle-droplet{--fa: ""}.fa-mask-face{--fa: ""}.fa-hill-rockslide{--fa: ""}.fa-right-left,.fa-exchange-alt{--fa: ""}.fa-paper-plane{--fa: ""}.fa-road-circle-exclamation{--fa: ""}.fa-dungeon{--fa: ""}.fa-align-right{--fa: ""}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa: ""}.fa-life-ring{--fa: ""}.fa-hands,.fa-sign-language,.fa-signing{--fa: ""}.fa-calendar-day{--fa: ""}.fa-water-ladder,.fa-ladder-water,.fa-swimming-pool{--fa: ""}.fa-arrows-up-down,.fa-arrows-v{--fa: ""}.fa-face-grimace,.fa-grimace{--fa: ""}.fa-wheelchair-move,.fa-wheelchair-alt{--fa: ""}.fa-turn-down,.fa-level-down-alt{--fa: ""}.fa-person-walking-arrow-right{--fa: ""}.fa-square-envelope,.fa-envelope-square{--fa: ""}.fa-dice{--fa: ""}.fa-bowling-ball{--fa: ""}.fa-brain{--fa: ""}.fa-bandage,.fa-band-aid{--fa: ""}.fa-calendar-minus{--fa: ""}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa: ""}.fa-gifts{--fa: ""}.fa-hotel{--fa: ""}.fa-earth-asia,.fa-globe-asia{--fa: ""}.fa-id-card-clip,.fa-id-card-alt{--fa: ""}.fa-magnifying-glass-plus,.fa-search-plus{--fa: ""}.fa-thumbs-up{--fa: ""}.fa-user-clock{--fa: ""}.fa-hand-dots,.fa-allergies{--fa: ""}.fa-file-invoice{--fa: ""}.fa-window-minimize{--fa: ""}.fa-mug-saucer,.fa-coffee{--fa: ""}.fa-brush{--fa: ""}.fa-file-half-dashed{--fa: ""}.fa-mask{--fa: ""}.fa-magnifying-glass-minus,.fa-search-minus{--fa: ""}.fa-ruler-vertical{--fa: ""}.fa-user-large,.fa-user-alt{--fa: ""}.fa-train-tram{--fa: ""}.fa-user-nurse{--fa: ""}.fa-syringe{--fa: ""}.fa-cloud-sun{--fa: ""}.fa-stopwatch-20{--fa: ""}.fa-square-full{--fa: ""}.fa-magnet{--fa: ""}.fa-jar{--fa: ""}.fa-note-sticky,.fa-sticky-note{--fa: ""}.fa-bug-slash{--fa: ""}.fa-arrow-up-from-water-pump{--fa: ""}.fa-bone{--fa: ""}.fa-table-cells-row-unlock{--fa: ""}.fa-user-injured{--fa: ""}.fa-face-sad-tear,.fa-sad-tear{--fa: ""}.fa-plane{--fa: ""}.fa-tent-arrows-down{--fa: ""}.fa-exclamation{--fa: "!"}.fa-arrows-spin{--fa: ""}.fa-print{--fa: ""}.fa-turkish-lira-sign,.fa-try,.fa-turkish-lira{--fa: ""}.fa-dollar-sign,.fa-dollar,.fa-usd{--fa: "$"}.fa-x{--fa: "X"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa: ""}.fa-users-gear,.fa-users-cog{--fa: ""}.fa-person-military-pointing{--fa: ""}.fa-building-columns,.fa-bank,.fa-institution,.fa-museum,.fa-university{--fa: ""}.fa-umbrella{--fa: ""}.fa-trowel{--fa: ""}.fa-d{--fa: "D"}.fa-stapler{--fa: ""}.fa-masks-theater,.fa-theater-masks{--fa: ""}.fa-kip-sign{--fa: ""}.fa-hand-point-left{--fa: ""}.fa-handshake-simple,.fa-handshake-alt{--fa: ""}.fa-jet-fighter,.fa-fighter-jet{--fa: ""}.fa-square-share-nodes,.fa-share-alt-square{--fa: ""}.fa-barcode{--fa: ""}.fa-plus-minus{--fa: ""}.fa-video,.fa-video-camera{--fa: ""}.fa-graduation-cap,.fa-mortar-board{--fa: ""}.fa-hand-holding-medical{--fa: ""}.fa-person-circle-check{--fa: ""}.fa-turn-up,.fa-level-up-alt{--fa: ""}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:root,:host{--fa-style-family-brands: "Font Awesome 6 Brands";--fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}.fab,.fa-brands{font-weight:400}.fa-monero{--fa: ""}.fa-hooli{--fa: ""}.fa-yelp{--fa: ""}.fa-cc-visa{--fa: ""}.fa-lastfm{--fa: ""}.fa-shopware{--fa: ""}.fa-creative-commons-nc{--fa: ""}.fa-aws{--fa: ""}.fa-redhat{--fa: ""}.fa-yoast{--fa: ""}.fa-cloudflare{--fa: ""}.fa-ups{--fa: ""}.fa-pixiv{--fa: ""}.fa-wpexplorer{--fa: ""}.fa-dyalog{--fa: ""}.fa-bity{--fa: ""}.fa-stackpath{--fa: ""}.fa-buysellads{--fa: ""}.fa-first-order{--fa: ""}.fa-modx{--fa: ""}.fa-guilded{--fa: ""}.fa-vnv{--fa: ""}.fa-square-js,.fa-js-square{--fa: ""}.fa-microsoft{--fa: ""}.fa-qq{--fa: ""}.fa-orcid{--fa: ""}.fa-java{--fa: ""}.fa-invision{--fa: ""}.fa-creative-commons-pd-alt{--fa: ""}.fa-centercode{--fa: ""}.fa-glide-g{--fa: ""}.fa-drupal{--fa: ""}.fa-jxl{--fa: ""}.fa-dart-lang{--fa: ""}.fa-hire-a-helper{--fa: ""}.fa-creative-commons-by{--fa: ""}.fa-unity{--fa: ""}.fa-whmcs{--fa: ""}.fa-rocketchat{--fa: ""}.fa-vk{--fa: ""}.fa-untappd{--fa: ""}.fa-mailchimp{--fa: ""}.fa-css3-alt{--fa: ""}.fa-square-reddit,.fa-reddit-square{--fa: ""}.fa-vimeo-v{--fa: ""}.fa-contao{--fa: ""}.fa-square-font-awesome{--fa: ""}.fa-deskpro{--fa: ""}.fa-brave{--fa: ""}.fa-sistrix{--fa: ""}.fa-square-instagram,.fa-instagram-square{--fa: ""}.fa-battle-net{--fa: ""}.fa-the-red-yeti{--fa: ""}.fa-square-hacker-news,.fa-hacker-news-square{--fa: ""}.fa-edge{--fa: ""}.fa-threads{--fa: ""}.fa-napster{--fa: ""}.fa-square-snapchat,.fa-snapchat-square{--fa: ""}.fa-google-plus-g{--fa: ""}.fa-artstation{--fa: ""}.fa-markdown{--fa: ""}.fa-sourcetree{--fa: ""}.fa-google-plus{--fa: ""}.fa-diaspora{--fa: ""}.fa-foursquare{--fa: ""}.fa-stack-overflow{--fa: ""}.fa-github-alt{--fa: ""}.fa-phoenix-squadron{--fa: ""}.fa-pagelines{--fa: ""}.fa-algolia{--fa: ""}.fa-red-river{--fa: ""}.fa-creative-commons-sa{--fa: ""}.fa-safari{--fa: ""}.fa-google{--fa: ""}.fa-square-font-awesome-stroke,.fa-font-awesome-alt{--fa: ""}.fa-atlassian{--fa: ""}.fa-linkedin-in{--fa: ""}.fa-digital-ocean{--fa: ""}.fa-nimblr{--fa: ""}.fa-chromecast{--fa: ""}.fa-evernote{--fa: ""}.fa-hacker-news{--fa: ""}.fa-creative-commons-sampling{--fa: ""}.fa-adversal{--fa: ""}.fa-creative-commons{--fa: ""}.fa-watchman-monitoring{--fa: ""}.fa-fonticons{--fa: ""}.fa-weixin{--fa: ""}.fa-shirtsinbulk{--fa: ""}.fa-codepen{--fa: ""}.fa-git-alt{--fa: ""}.fa-lyft{--fa: ""}.fa-rev{--fa: ""}.fa-windows{--fa: ""}.fa-wizards-of-the-coast{--fa: ""}.fa-square-viadeo,.fa-viadeo-square{--fa: ""}.fa-meetup{--fa: ""}.fa-centos{--fa: ""}.fa-adn{--fa: ""}.fa-cloudsmith{--fa: ""}.fa-opensuse{--fa: ""}.fa-pied-piper-alt{--fa: ""}.fa-square-dribbble,.fa-dribbble-square{--fa: ""}.fa-codiepie{--fa: ""}.fa-node{--fa: ""}.fa-mix{--fa: ""}.fa-steam{--fa: ""}.fa-cc-apple-pay{--fa: ""}.fa-scribd{--fa: ""}.fa-debian{--fa: ""}.fa-openid{--fa: ""}.fa-instalod{--fa: ""}.fa-files-pinwheel{--fa: ""}.fa-expeditedssl{--fa: ""}.fa-sellcast{--fa: ""}.fa-square-twitter,.fa-twitter-square{--fa: ""}.fa-r-project{--fa: ""}.fa-delicious{--fa: ""}.fa-freebsd{--fa: ""}.fa-vuejs{--fa: ""}.fa-accusoft{--fa: ""}.fa-ioxhost{--fa: ""}.fa-fonticons-fi{--fa: ""}.fa-app-store{--fa: ""}.fa-cc-mastercard{--fa: ""}.fa-itunes-note{--fa: ""}.fa-golang{--fa: ""}.fa-kickstarter,.fa-square-kickstarter{--fa: ""}.fa-grav{--fa: ""}.fa-weibo{--fa: ""}.fa-uncharted{--fa: ""}.fa-firstdraft{--fa: ""}.fa-square-youtube,.fa-youtube-square{--fa: ""}.fa-wikipedia-w{--fa: ""}.fa-wpressr,.fa-rendact{--fa: ""}.fa-angellist{--fa: ""}.fa-galactic-republic{--fa: ""}.fa-nfc-directional{--fa: ""}.fa-skype{--fa: ""}.fa-joget{--fa: ""}.fa-fedora{--fa: ""}.fa-stripe-s{--fa: ""}.fa-meta{--fa: ""}.fa-laravel{--fa: ""}.fa-hotjar{--fa: ""}.fa-bluetooth-b{--fa: ""}.fa-square-letterboxd{--fa: ""}.fa-sticker-mule{--fa: ""}.fa-creative-commons-zero{--fa: ""}.fa-hips{--fa: ""}.fa-css{--fa: ""}.fa-behance{--fa: ""}.fa-reddit{--fa: ""}.fa-discord{--fa: ""}.fa-chrome{--fa: ""}.fa-app-store-ios{--fa: ""}.fa-cc-discover{--fa: ""}.fa-wpbeginner{--fa: ""}.fa-confluence{--fa: ""}.fa-shoelace{--fa: ""}.fa-mdb{--fa: ""}.fa-dochub{--fa: ""}.fa-accessible-icon{--fa: ""}.fa-ebay{--fa: ""}.fa-amazon{--fa: ""}.fa-unsplash{--fa: ""}.fa-yarn{--fa: ""}.fa-square-steam,.fa-steam-square{--fa: ""}.fa-500px{--fa: ""}.fa-square-vimeo,.fa-vimeo-square{--fa: ""}.fa-asymmetrik{--fa: ""}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa: ""}.fa-gratipay{--fa: ""}.fa-apple{--fa: ""}.fa-hive{--fa: ""}.fa-gitkraken{--fa: ""}.fa-keybase{--fa: ""}.fa-apple-pay{--fa: ""}.fa-padlet{--fa: ""}.fa-amazon-pay{--fa: ""}.fa-square-github,.fa-github-square{--fa: ""}.fa-stumbleupon{--fa: ""}.fa-fedex{--fa: ""}.fa-phoenix-framework{--fa: ""}.fa-shopify{--fa: ""}.fa-neos{--fa: ""}.fa-square-threads{--fa: ""}.fa-hackerrank{--fa: ""}.fa-researchgate{--fa: ""}.fa-swift{--fa: ""}.fa-angular{--fa: ""}.fa-speakap{--fa: ""}.fa-angrycreative{--fa: ""}.fa-y-combinator{--fa: ""}.fa-empire{--fa: ""}.fa-envira{--fa: ""}.fa-google-scholar{--fa: ""}.fa-square-gitlab,.fa-gitlab-square{--fa: ""}.fa-studiovinari{--fa: ""}.fa-pied-piper{--fa: ""}.fa-wordpress{--fa: ""}.fa-product-hunt{--fa: ""}.fa-firefox{--fa: ""}.fa-linode{--fa: ""}.fa-goodreads{--fa: ""}.fa-square-odnoklassniki,.fa-odnoklassniki-square{--fa: ""}.fa-jsfiddle{--fa: ""}.fa-sith{--fa: ""}.fa-themeisle{--fa: ""}.fa-page4{--fa: ""}.fa-hashnode{--fa: ""}.fa-react{--fa: ""}.fa-cc-paypal{--fa: ""}.fa-squarespace{--fa: ""}.fa-cc-stripe{--fa: ""}.fa-creative-commons-share{--fa: ""}.fa-bitcoin{--fa: ""}.fa-keycdn{--fa: ""}.fa-opera{--fa: ""}.fa-itch-io{--fa: ""}.fa-umbraco{--fa: ""}.fa-galactic-senate{--fa: ""}.fa-ubuntu{--fa: ""}.fa-draft2digital{--fa: ""}.fa-stripe{--fa: ""}.fa-houzz{--fa: ""}.fa-gg{--fa: ""}.fa-dhl{--fa: ""}.fa-square-pinterest,.fa-pinterest-square{--fa: ""}.fa-xing{--fa: ""}.fa-blackberry{--fa: ""}.fa-creative-commons-pd{--fa: ""}.fa-playstation{--fa: ""}.fa-quinscape{--fa: ""}.fa-less{--fa: ""}.fa-blogger-b{--fa: ""}.fa-opencart{--fa: ""}.fa-vine{--fa: ""}.fa-signal-messenger{--fa: ""}.fa-paypal{--fa: ""}.fa-gitlab{--fa: ""}.fa-typo3{--fa: ""}.fa-reddit-alien{--fa: ""}.fa-yahoo{--fa: ""}.fa-dailymotion{--fa: ""}.fa-affiliatetheme{--fa: ""}.fa-pied-piper-pp{--fa: ""}.fa-bootstrap{--fa: ""}.fa-odnoklassniki{--fa: ""}.fa-nfc-symbol{--fa: ""}.fa-mintbit{--fa: ""}.fa-ethereum{--fa: ""}.fa-speaker-deck{--fa: ""}.fa-creative-commons-nc-eu{--fa: ""}.fa-patreon{--fa: ""}.fa-avianex{--fa: ""}.fa-ello{--fa: ""}.fa-gofore{--fa: ""}.fa-bimobject{--fa: ""}.fa-brave-reverse{--fa: ""}.fa-facebook-f{--fa: ""}.fa-square-google-plus,.fa-google-plus-square{--fa: ""}.fa-web-awesome{--fa: ""}.fa-mandalorian{--fa: ""}.fa-first-order-alt{--fa: ""}.fa-osi{--fa: ""}.fa-google-wallet{--fa: ""}.fa-d-and-d-beyond{--fa: ""}.fa-periscope{--fa: ""}.fa-fulcrum{--fa: ""}.fa-cloudscale{--fa: ""}.fa-forumbee{--fa: ""}.fa-mizuni{--fa: ""}.fa-schlix{--fa: ""}.fa-square-xing,.fa-xing-square{--fa: ""}.fa-bandcamp{--fa: ""}.fa-wpforms{--fa: ""}.fa-cloudversify{--fa: ""}.fa-usps{--fa: ""}.fa-megaport{--fa: ""}.fa-magento{--fa: ""}.fa-spotify{--fa: ""}.fa-optin-monster{--fa: ""}.fa-fly{--fa: ""}.fa-square-bluesky{--fa: ""}.fa-aviato{--fa: ""}.fa-itunes{--fa: ""}.fa-cuttlefish{--fa: ""}.fa-blogger{--fa: ""}.fa-flickr{--fa: ""}.fa-viber{--fa: ""}.fa-soundcloud{--fa: ""}.fa-digg{--fa: ""}.fa-tencent-weibo{--fa: ""}.fa-letterboxd{--fa: ""}.fa-symfony{--fa: ""}.fa-maxcdn{--fa: ""}.fa-etsy{--fa: ""}.fa-facebook-messenger{--fa: ""}.fa-audible{--fa: ""}.fa-think-peaks{--fa: ""}.fa-bilibili{--fa: ""}.fa-erlang{--fa: ""}.fa-x-twitter{--fa: ""}.fa-cotton-bureau{--fa: ""}.fa-dashcube{--fa: ""}.fa-42-group,.fa-innosoft{--fa: ""}.fa-stack-exchange{--fa: ""}.fa-elementor{--fa: ""}.fa-square-pied-piper,.fa-pied-piper-square{--fa: ""}.fa-creative-commons-nd{--fa: ""}.fa-palfed{--fa: ""}.fa-superpowers{--fa: ""}.fa-resolving{--fa: ""}.fa-xbox{--fa: ""}.fa-square-web-awesome-stroke{--fa: ""}.fa-searchengin{--fa: ""}.fa-tiktok{--fa: ""}.fa-square-facebook,.fa-facebook-square{--fa: ""}.fa-renren{--fa: ""}.fa-linux{--fa: ""}.fa-glide{--fa: ""}.fa-linkedin{--fa: ""}.fa-hubspot{--fa: ""}.fa-deploydog{--fa: ""}.fa-twitch{--fa: ""}.fa-flutter{--fa: ""}.fa-ravelry{--fa: ""}.fa-mixer{--fa: ""}.fa-square-lastfm,.fa-lastfm-square{--fa: ""}.fa-vimeo{--fa: ""}.fa-mendeley{--fa: ""}.fa-uniregistry{--fa: ""}.fa-figma{--fa: ""}.fa-creative-commons-remix{--fa: ""}.fa-cc-amazon-pay{--fa: ""}.fa-dropbox{--fa: ""}.fa-instagram{--fa: ""}.fa-cmplid{--fa: ""}.fa-upwork{--fa: ""}.fa-facebook{--fa: ""}.fa-gripfire{--fa: ""}.fa-jedi-order{--fa: ""}.fa-uikit{--fa: ""}.fa-fort-awesome-alt{--fa: ""}.fa-phabricator{--fa: ""}.fa-ussunnah{--fa: ""}.fa-earlybirds{--fa: ""}.fa-trade-federation{--fa: ""}.fa-autoprefixer{--fa: ""}.fa-whatsapp{--fa: ""}.fa-square-upwork{--fa: ""}.fa-slideshare{--fa: ""}.fa-google-play{--fa: ""}.fa-viadeo{--fa: ""}.fa-line{--fa: ""}.fa-google-drive{--fa: ""}.fa-servicestack{--fa: ""}.fa-simplybuilt{--fa: ""}.fa-bitbucket{--fa: ""}.fa-imdb{--fa: ""}.fa-deezer{--fa: ""}.fa-raspberry-pi{--fa: ""}.fa-jira{--fa: ""}.fa-docker{--fa: ""}.fa-screenpal{--fa: ""}.fa-bluetooth{--fa: ""}.fa-gitter{--fa: ""}.fa-d-and-d{--fa: ""}.fa-microblog{--fa: ""}.fa-cc-diners-club{--fa: ""}.fa-gg-circle{--fa: ""}.fa-pied-piper-hat{--fa: ""}.fa-kickstarter-k{--fa: ""}.fa-yandex{--fa: ""}.fa-readme{--fa: ""}.fa-html5{--fa: ""}.fa-sellsy{--fa: ""}.fa-square-web-awesome{--fa: ""}.fa-sass{--fa: ""}.fa-wirsindhandwerk,.fa-wsh{--fa: ""}.fa-buromobelexperte{--fa: ""}.fa-salesforce{--fa: ""}.fa-octopus-deploy{--fa: ""}.fa-medapps{--fa: ""}.fa-ns8{--fa: ""}.fa-pinterest-p{--fa: ""}.fa-apper{--fa: ""}.fa-fort-awesome{--fa: ""}.fa-waze{--fa: ""}.fa-bluesky{--fa: ""}.fa-cc-jcb{--fa: ""}.fa-snapchat,.fa-snapchat-ghost{--fa: ""}.fa-fantasy-flight-games{--fa: ""}.fa-rust{--fa: ""}.fa-wix{--fa: ""}.fa-square-behance,.fa-behance-square{--fa: ""}.fa-supple{--fa: ""}.fa-webflow{--fa: ""}.fa-rebel{--fa: ""}.fa-css3{--fa: ""}.fa-staylinked{--fa: ""}.fa-kaggle{--fa: ""}.fa-space-awesome{--fa: ""}.fa-deviantart{--fa: ""}.fa-cpanel{--fa: ""}.fa-goodreads-g{--fa: ""}.fa-square-git,.fa-git-square{--fa: ""}.fa-square-tumblr,.fa-tumblr-square{--fa: ""}.fa-trello{--fa: ""}.fa-creative-commons-nc-jp{--fa: ""}.fa-get-pocket{--fa: ""}.fa-perbyte{--fa: ""}.fa-grunt{--fa: ""}.fa-weebly{--fa: ""}.fa-connectdevelop{--fa: ""}.fa-leanpub{--fa: ""}.fa-black-tie{--fa: ""}.fa-themeco{--fa: ""}.fa-python{--fa: ""}.fa-android{--fa: ""}.fa-bots{--fa: ""}.fa-free-code-camp{--fa: ""}.fa-hornbill{--fa: ""}.fa-js{--fa: ""}.fa-ideal{--fa: ""}.fa-git{--fa: ""}.fa-dev{--fa: ""}.fa-sketch{--fa: ""}.fa-yandex-international{--fa: ""}.fa-cc-amex{--fa: ""}.fa-uber{--fa: ""}.fa-github{--fa: ""}.fa-php{--fa: ""}.fa-alipay{--fa: ""}.fa-youtube{--fa: ""}.fa-skyatlas{--fa: ""}.fa-firefox-browser{--fa: ""}.fa-replyd{--fa: ""}.fa-suse{--fa: ""}.fa-jenkins{--fa: ""}.fa-twitter{--fa: ""}.fa-rockrms{--fa: ""}.fa-pinterest{--fa: ""}.fa-buffer{--fa: ""}.fa-npm{--fa: ""}.fa-yammer{--fa: ""}.fa-btc{--fa: ""}.fa-dribbble{--fa: ""}.fa-stumbleupon-circle{--fa: ""}.fa-internet-explorer{--fa: ""}.fa-stubber{--fa: ""}.fa-telegram,.fa-telegram-plane{--fa: ""}.fa-old-republic{--fa: ""}.fa-odysee{--fa: ""}.fa-square-whatsapp,.fa-whatsapp-square{--fa: ""}.fa-node-js{--fa: ""}.fa-edge-legacy{--fa: ""}.fa-slack,.fa-slack-hash{--fa: ""}.fa-medrt{--fa: ""}.fa-usb{--fa: ""}.fa-tumblr{--fa: ""}.fa-vaadin{--fa: ""}.fa-quora{--fa: ""}.fa-square-x-twitter{--fa: ""}.fa-reacteurope{--fa: ""}.fa-medium,.fa-medium-m{--fa: ""}.fa-amilia{--fa: ""}.fa-mixcloud{--fa: ""}.fa-flipboard{--fa: ""}.fa-viacoin{--fa: ""}.fa-critical-role{--fa: ""}.fa-sitrox{--fa: ""}.fa-discourse{--fa: ""}.fa-joomla{--fa: ""}.fa-mastodon{--fa: ""}.fa-airbnb{--fa: ""}.fa-wolf-pack-battalion{--fa: ""}.fa-buy-n-large{--fa: ""}.fa-gulp{--fa: ""}.fa-creative-commons-sampling-plus{--fa: ""}.fa-strava{--fa: ""}.fa-ember{--fa: ""}.fa-canadian-maple-leaf{--fa: ""}.fa-teamspeak{--fa: ""}.fa-pushed{--fa: ""}.fa-wordpress-simple{--fa: ""}.fa-nutritionix{--fa: ""}.fa-wodu{--fa: ""}.fa-google-pay{--fa: ""}.fa-intercom{--fa: ""}.fa-zhihu{--fa: ""}.fa-korvue{--fa: ""}.fa-pix{--fa: ""}.fa-steam-symbol{--fa: ""}:root,:host{--fa-style-family-classic: "Font Awesome 6 Free";--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype")}.far,.fa-regular{font-weight:400}:root,:host{--fa-style-family-classic: "Font Awesome 6 Free";--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}.fas,.fa-solid{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype");unicode-range:U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-v4compatibility-C9RhG_FT.woff2) format("woff2"),url(/admin-next/assets/fa-v4compatibility-CCth-dXg.ttf) format("truetype");unicode-range:U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A}.el-button--primary{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);border-color:transparent}.el-button--primary:hover,.el-button--primary:focus{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);opacity:.9}.hover\:border-indigo-300:hover{--tw-border-opacity: 1;border-color:rgb(165 180 252 / var(--tw-border-opacity, 1))}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-200:hover{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.hover\:bg-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/50:hover{background-color:#ffffff80}.hover\:from-yellow-600:hover{--tw-gradient-from: #ca8a04 var(--tw-gradient-from-position);--tw-gradient-to: rgb(202 138 4 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.hover\:to-orange-600:hover{--tw-gradient-to: #ea580c var(--tw-gradient-to-position)}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-700:hover{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.hover\:text-green-900:hover{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.hover\:text-indigo-800:hover{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}.hover\:text-purple-900:hover{--tw-text-opacity: 1;color:rgb(88 28 135 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-red-900:hover{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}}@media (min-width: 1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:block{display:block}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}:root{--primary-color: #667eea;--secondary-color: #764ba2;--accent-color: #f093fb;--success-color: #10b981;--warning-color: #f59e0b;--error-color: #ef4444;--surface-color: rgba(255, 255, 255, .95);--glass-color: rgba(255, 255, 255, .1);--text-primary: #1f2937;--text-secondary: #6b7280;--border-color: rgba(255, 255, 255, .2)}body,div,button,input,select,textarea,table,tr,td,th,span,p,h1,h2,h3,h4,h5,h6{transition:all .3s cubic-bezier(.4,0,.2,1)}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 50%,var(--accent-color) 100%);background-attachment:fixed;min-height:100vh;margin:0;overflow-x:hidden}body:before{content:"";position:fixed;top:0;left:0;right:0;bottom:0;background:radial-gradient(circle at 20% 80%,rgba(240,147,251,.2) 0%,transparent 50%),radial-gradient(circle at 80% 20%,rgba(102,126,234,.2) 0%,transparent 50%),radial-gradient(circle at 40% 40%,rgba(118,75,162,.1) 0%,transparent 50%);pointer-events:none;z-index:-1}.glass{background:var(--glass-color);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border:1px solid var(--border-color);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a,inset 0 1px #ffffff1a}.glass-strong{background:var(--surface-color);-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border:1px solid rgba(255,255,255,.3);box-shadow:0 25px 50px -12px #00000040,0 0 0 1px #ffffff0d,inset 0 1px #ffffff1a}.tab-btn{position:relative;overflow:hidden;border-radius:12px;font-weight:500;letter-spacing:.025em}.tab-btn:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s}.tab-btn:hover:before{left:100%}.tab-btn.active{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);color:#fff;box-shadow:0 10px 15px -3px #667eea4d,0 4px 6px -2px #667eea0d;transform:translateY(-1px)}.card{background:var(--surface-color);border-radius:16px;border:1px solid rgba(255,255,255,.2);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;overflow:hidden;position:relative}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent)}.stat-card{background:linear-gradient(135deg,#fffffff2,#fffc);border-radius:20px;border:1px solid rgba(255,255,255,.3);padding:24px;position:relative;overflow:hidden;transition:all .3s ease}.stat-card:before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(255,255,255,.1) 0%,transparent 70%);opacity:0;transition:opacity .3s ease}.stat-card:hover{transform:translateY(-4px);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}.stat-card:hover:before{opacity:1}.stat-icon{width:56px;height:56px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:24px;color:#fff;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.btn{font-weight:500;border-radius:12px;border:none;cursor:pointer;transition:all .3s ease;position:relative;overflow:hidden;letter-spacing:.025em}.btn:before{content:"";position:absolute;top:50%;left:50%;width:0;height:0;background:#fff3;border-radius:50%;transform:translate(-50%,-50%);transition:width .3s ease,height .3s ease}.btn:active:before{width:300px;height:300px}.btn-primary{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);color:#fff;box-shadow:0 10px 15px -3px #667eea4d,0 4px 6px -2px #667eea0d}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #667eea4d,0 10px 10px -5px #667eea1a}.btn-success{background:linear-gradient(135deg,var(--success-color) 0%,#059669 100%);color:#fff;box-shadow:0 10px 15px -3px #10b9814d,0 4px 6px -2px #10b9810d}.btn-success:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #10b9814d,0 10px 10px -5px #10b9811a}.btn-danger{background:linear-gradient(135deg,var(--error-color) 0%,#dc2626 100%);color:#fff;box-shadow:0 10px 15px -3px #ef44444d,0 4px 6px -2px #ef44440d}.btn-danger:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #ef44444d,0 10px 10px -5px #ef44441a}.form-input{background:#ffffffe6;border:2px solid rgba(255,255,255,.3);border-radius:12px;padding:16px;font-size:16px;transition:all .3s ease;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.form-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #667eea1a,0 10px 15px -3px #0000001a;background:#fffffff2}.table-container{background:#fffffff2;border-radius:16px;overflow:hidden;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.table-row{transition:all .2s ease}.table-row:hover{background:#667eea0d;transform:scale(1.005)}.modal{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0006}.modal-content{background:#fffffff2;border-radius:24px;border:1px solid rgba(255,255,255,.3);box-shadow:0 25px 50px -12px #00000040,0 0 0 1px #ffffff0d;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.header-title{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:700;letter-spacing:-.025em}.loading-spinner{display:inline-block;width:20px;height:20px;border:2px solid rgba(255,255,255,.3);border-radius:50%;border-top:2px solid white;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-up-enter-active,.slide-up-leave-active{transition:all .3s ease}.slide-up-enter-from{opacity:0;transform:translateY(30px)}.slide-up-leave-to{opacity:0;transform:translateY(-30px)}.toast{position:fixed;top:80px;right:20px;z-index:1000;min-width:320px;max-width:500px;transform:translate(100%);transition:transform .3s ease-in-out}.toast.show{transform:translate(0)}.toast-success{background:linear-gradient(135deg,#10b981,#059669);color:#fff;border:1px solid rgba(16,185,129,.3)}.toast-error{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border:1px solid rgba(239,68,68,.3)}.toast-info{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border:1px solid rgba(59,130,246,.3)}.toast-warning{background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;border:1px solid rgba(245,158,11,.3)}[v-cloak]{display:none}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:rgba(102,126,234,.3) rgba(102,126,234,.05)}.custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.custom-scrollbar::-webkit-scrollbar-track{background:#667eea0d;border-radius:10px}.custom-scrollbar::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#667eea66,#764ba266);border-radius:10px;-webkit-transition:background .3s ease;transition:background .3s ease}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#667eea99,#764ba299)}.custom-scrollbar::-webkit-scrollbar-thumb:active{background:linear-gradient(135deg,#667eeacc,#764ba2cc)}.modal-scroll-content{max-height:calc(90vh - 160px);overflow-y:auto;padding-right:8px}@media (max-width: 768px){.glass,.glass-strong{margin:16px;border-radius:20px}.stat-card{padding:16px}.tab-btn{font-size:14px;padding:12px 8px}.modal-scroll-content{max-height:calc(85vh - 120px)}}@keyframes pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.1);opacity:.8}to{transform:scale(1);opacity:1}}.animate-pulse{animation:pulse 2s infinite}.user-menu-dropdown{min-width:240px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.tab-content{animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}} + */.fa{font-family:var(--fa-style-family, "Font Awesome 6 Free");font-weight:var(--fa-style, 900)}.fas,.far,.fab,.fa-solid,.fa-regular,.fa-brands,.fa{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display, inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fas:before,.far:before,.fab:before,.fa-solid:before,.fa-regular:before,.fa-brands:before,.fa:before{content:var(--fa)}.fa-classic,.fas,.fa-solid,.far,.fa-regular{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin, 2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(-1 * var(--fa-li-width, 2em));position:absolute;text-align:center;width:var(--fa-li-width, 2em);line-height:inherit}.fa-border{border-color:var(--fa-border-color, #eee);border-radius:var(--fa-border-radius, .1em);border-style:var(--fa-border-style, solid);border-width:var(--fa-border-width, .08em);padding:var(--fa-border-padding, .2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin, .3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin, .3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.28, .84, .42, 1))}.fa-fade{animation-name:fa-fade;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-beat-fade{animation-name:fa-beat-fade;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, cubic-bezier(.4, 0, .6, 1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, ease-in-out)}.fa-shake{animation-name:fa-shake;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin{animation-name:fa-spin;animation-delay:var(--fa-animation-delay, 0s);animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 2s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, linear)}.fa-spin-reverse{--fa-animation-direction: reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction, normal);animation-duration:var(--fa-animation-duration, 1s);animation-iteration-count:var(--fa-animation-iteration-count, infinite);animation-timing-function:var(--fa-animation-timing, steps(8))}@media (prefers-reduced-motion: reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale, 1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x, 1.1),var(--fa-bounce-start-scale-y, .9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x, .9),var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x, 1.05),var(--fa-bounce-land-scale-y, .95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound, -.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity, .4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity, .4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale, 1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x, 0),var(--fa-flip-y, 1),var(--fa-flip-z, 0),var(--fa-flip-angle, -180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0)}}@keyframes fa-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle, 0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index, auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse, #fff)}.fa-0{--fa: "0"}.fa-1{--fa: "1"}.fa-2{--fa: "2"}.fa-3{--fa: "3"}.fa-4{--fa: "4"}.fa-5{--fa: "5"}.fa-6{--fa: "6"}.fa-7{--fa: "7"}.fa-8{--fa: "8"}.fa-9{--fa: "9"}.fa-fill-drip{--fa: ""}.fa-arrows-to-circle{--fa: ""}.fa-circle-chevron-right,.fa-chevron-circle-right{--fa: ""}.fa-at{--fa: "@"}.fa-trash-can,.fa-trash-alt{--fa: ""}.fa-text-height{--fa: ""}.fa-user-xmark,.fa-user-times{--fa: ""}.fa-stethoscope{--fa: ""}.fa-message,.fa-comment-alt{--fa: ""}.fa-info{--fa: ""}.fa-down-left-and-up-right-to-center,.fa-compress-alt{--fa: ""}.fa-explosion{--fa: ""}.fa-file-lines,.fa-file-alt,.fa-file-text{--fa: ""}.fa-wave-square{--fa: ""}.fa-ring{--fa: ""}.fa-building-un{--fa: ""}.fa-dice-three{--fa: ""}.fa-calendar-days,.fa-calendar-alt{--fa: ""}.fa-anchor-circle-check{--fa: ""}.fa-building-circle-arrow-right{--fa: ""}.fa-volleyball,.fa-volleyball-ball{--fa: ""}.fa-arrows-up-to-line{--fa: ""}.fa-sort-down,.fa-sort-desc{--fa: ""}.fa-circle-minus,.fa-minus-circle{--fa: ""}.fa-door-open{--fa: ""}.fa-right-from-bracket,.fa-sign-out-alt{--fa: ""}.fa-atom{--fa: ""}.fa-soap{--fa: ""}.fa-icons,.fa-heart-music-camera-bolt{--fa: ""}.fa-microphone-lines-slash,.fa-microphone-alt-slash{--fa: ""}.fa-bridge-circle-check{--fa: ""}.fa-pump-medical{--fa: ""}.fa-fingerprint{--fa: ""}.fa-hand-point-right{--fa: ""}.fa-magnifying-glass-location,.fa-search-location{--fa: ""}.fa-forward-step,.fa-step-forward{--fa: ""}.fa-face-smile-beam,.fa-smile-beam{--fa: ""}.fa-flag-checkered{--fa: ""}.fa-football,.fa-football-ball{--fa: ""}.fa-school-circle-exclamation{--fa: ""}.fa-crop{--fa: ""}.fa-angles-down,.fa-angle-double-down{--fa: ""}.fa-users-rectangle{--fa: ""}.fa-people-roof{--fa: ""}.fa-people-line{--fa: ""}.fa-beer-mug-empty,.fa-beer{--fa: ""}.fa-diagram-predecessor{--fa: ""}.fa-arrow-up-long,.fa-long-arrow-up{--fa: ""}.fa-fire-flame-simple,.fa-burn{--fa: ""}.fa-person,.fa-male{--fa: ""}.fa-laptop{--fa: ""}.fa-file-csv{--fa: ""}.fa-menorah{--fa: ""}.fa-truck-plane{--fa: ""}.fa-record-vinyl{--fa: ""}.fa-face-grin-stars,.fa-grin-stars{--fa: ""}.fa-bong{--fa: ""}.fa-spaghetti-monster-flying,.fa-pastafarianism{--fa: ""}.fa-arrow-down-up-across-line{--fa: ""}.fa-spoon,.fa-utensil-spoon{--fa: ""}.fa-jar-wheat{--fa: ""}.fa-envelopes-bulk,.fa-mail-bulk{--fa: ""}.fa-file-circle-exclamation{--fa: ""}.fa-circle-h,.fa-hospital-symbol{--fa: ""}.fa-pager{--fa: ""}.fa-address-book,.fa-contact-book{--fa: ""}.fa-strikethrough{--fa: ""}.fa-k{--fa: "K"}.fa-landmark-flag{--fa: ""}.fa-pencil,.fa-pencil-alt{--fa: ""}.fa-backward{--fa: ""}.fa-caret-right{--fa: ""}.fa-comments{--fa: ""}.fa-paste,.fa-file-clipboard{--fa: ""}.fa-code-pull-request{--fa: ""}.fa-clipboard-list{--fa: ""}.fa-truck-ramp-box,.fa-truck-loading{--fa: ""}.fa-user-check{--fa: ""}.fa-vial-virus{--fa: ""}.fa-sheet-plastic{--fa: ""}.fa-blog{--fa: ""}.fa-user-ninja{--fa: ""}.fa-person-arrow-up-from-line{--fa: ""}.fa-scroll-torah,.fa-torah{--fa: ""}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa: ""}.fa-toggle-off{--fa: ""}.fa-box-archive,.fa-archive{--fa: ""}.fa-person-drowning{--fa: ""}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa: ""}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa: ""}.fa-spray-can{--fa: ""}.fa-truck-monster{--fa: ""}.fa-w{--fa: "W"}.fa-earth-africa,.fa-globe-africa{--fa: ""}.fa-rainbow{--fa: ""}.fa-circle-notch{--fa: ""}.fa-tablet-screen-button,.fa-tablet-alt{--fa: ""}.fa-paw{--fa: ""}.fa-cloud{--fa: ""}.fa-trowel-bricks{--fa: ""}.fa-face-flushed,.fa-flushed{--fa: ""}.fa-hospital-user{--fa: ""}.fa-tent-arrow-left-right{--fa: ""}.fa-gavel,.fa-legal{--fa: ""}.fa-binoculars{--fa: ""}.fa-microphone-slash{--fa: ""}.fa-box-tissue{--fa: ""}.fa-motorcycle{--fa: ""}.fa-bell-concierge,.fa-concierge-bell{--fa: ""}.fa-pen-ruler,.fa-pencil-ruler{--fa: ""}.fa-people-arrows,.fa-people-arrows-left-right{--fa: ""}.fa-mars-and-venus-burst{--fa: ""}.fa-square-caret-right,.fa-caret-square-right{--fa: ""}.fa-scissors,.fa-cut{--fa: ""}.fa-sun-plant-wilt{--fa: ""}.fa-toilets-portable{--fa: ""}.fa-hockey-puck{--fa: ""}.fa-table{--fa: ""}.fa-magnifying-glass-arrow-right{--fa: ""}.fa-tachograph-digital,.fa-digital-tachograph{--fa: ""}.fa-users-slash{--fa: ""}.fa-clover{--fa: ""}.fa-reply,.fa-mail-reply{--fa: ""}.fa-star-and-crescent{--fa: ""}.fa-house-fire{--fa: ""}.fa-square-minus,.fa-minus-square{--fa: ""}.fa-helicopter{--fa: ""}.fa-compass{--fa: ""}.fa-square-caret-down,.fa-caret-square-down{--fa: ""}.fa-file-circle-question{--fa: ""}.fa-laptop-code{--fa: ""}.fa-swatchbook{--fa: ""}.fa-prescription-bottle{--fa: ""}.fa-bars,.fa-navicon{--fa: ""}.fa-people-group{--fa: ""}.fa-hourglass-end,.fa-hourglass-3{--fa: ""}.fa-heart-crack,.fa-heart-broken{--fa: ""}.fa-square-up-right,.fa-external-link-square-alt{--fa: ""}.fa-face-kiss-beam,.fa-kiss-beam{--fa: ""}.fa-film{--fa: ""}.fa-ruler-horizontal{--fa: ""}.fa-people-robbery{--fa: ""}.fa-lightbulb{--fa: ""}.fa-caret-left{--fa: ""}.fa-circle-exclamation,.fa-exclamation-circle{--fa: ""}.fa-school-circle-xmark{--fa: ""}.fa-arrow-right-from-bracket,.fa-sign-out{--fa: ""}.fa-circle-chevron-down,.fa-chevron-circle-down{--fa: ""}.fa-unlock-keyhole,.fa-unlock-alt{--fa: ""}.fa-cloud-showers-heavy{--fa: ""}.fa-headphones-simple,.fa-headphones-alt{--fa: ""}.fa-sitemap{--fa: ""}.fa-circle-dollar-to-slot,.fa-donate{--fa: ""}.fa-memory{--fa: ""}.fa-road-spikes{--fa: ""}.fa-fire-burner{--fa: ""}.fa-flag{--fa: ""}.fa-hanukiah{--fa: ""}.fa-feather{--fa: ""}.fa-volume-low,.fa-volume-down{--fa: ""}.fa-comment-slash{--fa: ""}.fa-cloud-sun-rain{--fa: ""}.fa-compress{--fa: ""}.fa-wheat-awn,.fa-wheat-alt{--fa: ""}.fa-ankh{--fa: ""}.fa-hands-holding-child{--fa: ""}.fa-asterisk{--fa: "*"}.fa-square-check,.fa-check-square{--fa: ""}.fa-peseta-sign{--fa: ""}.fa-heading,.fa-header{--fa: ""}.fa-ghost{--fa: ""}.fa-list,.fa-list-squares{--fa: ""}.fa-square-phone-flip,.fa-phone-square-alt{--fa: ""}.fa-cart-plus{--fa: ""}.fa-gamepad{--fa: ""}.fa-circle-dot,.fa-dot-circle{--fa: ""}.fa-face-dizzy,.fa-dizzy{--fa: ""}.fa-egg{--fa: ""}.fa-house-medical-circle-xmark{--fa: ""}.fa-campground{--fa: ""}.fa-folder-plus{--fa: ""}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa: ""}.fa-paintbrush,.fa-paint-brush{--fa: ""}.fa-lock{--fa: ""}.fa-gas-pump{--fa: ""}.fa-hot-tub-person,.fa-hot-tub{--fa: ""}.fa-map-location,.fa-map-marked{--fa: ""}.fa-house-flood-water{--fa: ""}.fa-tree{--fa: ""}.fa-bridge-lock{--fa: ""}.fa-sack-dollar{--fa: ""}.fa-pen-to-square,.fa-edit{--fa: ""}.fa-car-side{--fa: ""}.fa-share-nodes,.fa-share-alt{--fa: ""}.fa-heart-circle-minus{--fa: ""}.fa-hourglass-half,.fa-hourglass-2{--fa: ""}.fa-microscope{--fa: ""}.fa-sink{--fa: ""}.fa-bag-shopping,.fa-shopping-bag{--fa: ""}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa: ""}.fa-mitten{--fa: ""}.fa-person-rays{--fa: ""}.fa-users{--fa: ""}.fa-eye-slash{--fa: ""}.fa-flask-vial{--fa: ""}.fa-hand,.fa-hand-paper{--fa: ""}.fa-om{--fa: ""}.fa-worm{--fa: ""}.fa-house-circle-xmark{--fa: ""}.fa-plug{--fa: ""}.fa-chevron-up{--fa: ""}.fa-hand-spock{--fa: ""}.fa-stopwatch{--fa: ""}.fa-face-kiss,.fa-kiss{--fa: ""}.fa-bridge-circle-xmark{--fa: ""}.fa-face-grin-tongue,.fa-grin-tongue{--fa: ""}.fa-chess-bishop{--fa: ""}.fa-face-grin-wink,.fa-grin-wink{--fa: ""}.fa-ear-deaf,.fa-deaf,.fa-deafness,.fa-hard-of-hearing{--fa: ""}.fa-road-circle-check{--fa: ""}.fa-dice-five{--fa: ""}.fa-square-rss,.fa-rss-square{--fa: ""}.fa-land-mine-on{--fa: ""}.fa-i-cursor{--fa: ""}.fa-stamp{--fa: ""}.fa-stairs{--fa: ""}.fa-i{--fa: "I"}.fa-hryvnia-sign,.fa-hryvnia{--fa: ""}.fa-pills{--fa: ""}.fa-face-grin-wide,.fa-grin-alt{--fa: ""}.fa-tooth{--fa: ""}.fa-v{--fa: "V"}.fa-bangladeshi-taka-sign{--fa: ""}.fa-bicycle{--fa: ""}.fa-staff-snake,.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius{--fa: ""}.fa-head-side-cough-slash{--fa: ""}.fa-truck-medical,.fa-ambulance{--fa: ""}.fa-wheat-awn-circle-exclamation{--fa: ""}.fa-snowman{--fa: ""}.fa-mortar-pestle{--fa: ""}.fa-road-barrier{--fa: ""}.fa-school{--fa: ""}.fa-igloo{--fa: ""}.fa-joint{--fa: ""}.fa-angle-right{--fa: ""}.fa-horse{--fa: ""}.fa-q{--fa: "Q"}.fa-g{--fa: "G"}.fa-notes-medical{--fa: ""}.fa-temperature-half,.fa-temperature-2,.fa-thermometer-2,.fa-thermometer-half{--fa: ""}.fa-dong-sign{--fa: ""}.fa-capsules{--fa: ""}.fa-poo-storm,.fa-poo-bolt{--fa: ""}.fa-face-frown-open,.fa-frown-open{--fa: ""}.fa-hand-point-up{--fa: ""}.fa-money-bill{--fa: ""}.fa-bookmark{--fa: ""}.fa-align-justify{--fa: ""}.fa-umbrella-beach{--fa: ""}.fa-helmet-un{--fa: ""}.fa-bullseye{--fa: ""}.fa-bacon{--fa: ""}.fa-hand-point-down{--fa: ""}.fa-arrow-up-from-bracket{--fa: ""}.fa-folder,.fa-folder-blank{--fa: ""}.fa-file-waveform,.fa-file-medical-alt{--fa: ""}.fa-radiation{--fa: ""}.fa-chart-simple{--fa: ""}.fa-mars-stroke{--fa: ""}.fa-vial{--fa: ""}.fa-gauge,.fa-dashboard,.fa-gauge-med,.fa-tachometer-alt-average{--fa: ""}.fa-wand-magic-sparkles,.fa-magic-wand-sparkles{--fa: ""}.fa-e{--fa: "E"}.fa-pen-clip,.fa-pen-alt{--fa: ""}.fa-bridge-circle-exclamation{--fa: ""}.fa-user{--fa: ""}.fa-school-circle-check{--fa: ""}.fa-dumpster{--fa: ""}.fa-van-shuttle,.fa-shuttle-van{--fa: ""}.fa-building-user{--fa: ""}.fa-square-caret-left,.fa-caret-square-left{--fa: ""}.fa-highlighter{--fa: ""}.fa-key{--fa: ""}.fa-bullhorn{--fa: ""}.fa-globe{--fa: ""}.fa-synagogue{--fa: ""}.fa-person-half-dress{--fa: ""}.fa-road-bridge{--fa: ""}.fa-location-arrow{--fa: ""}.fa-c{--fa: "C"}.fa-tablet-button{--fa: ""}.fa-building-lock{--fa: ""}.fa-pizza-slice{--fa: ""}.fa-money-bill-wave{--fa: ""}.fa-chart-area,.fa-area-chart{--fa: ""}.fa-house-flag{--fa: ""}.fa-person-circle-minus{--fa: ""}.fa-ban,.fa-cancel{--fa: ""}.fa-camera-rotate{--fa: ""}.fa-spray-can-sparkles,.fa-air-freshener{--fa: ""}.fa-star{--fa: ""}.fa-repeat{--fa: ""}.fa-cross{--fa: ""}.fa-box{--fa: ""}.fa-venus-mars{--fa: ""}.fa-arrow-pointer,.fa-mouse-pointer{--fa: ""}.fa-maximize,.fa-expand-arrows-alt{--fa: ""}.fa-charging-station{--fa: ""}.fa-shapes,.fa-triangle-circle-square{--fa: ""}.fa-shuffle,.fa-random{--fa: ""}.fa-person-running,.fa-running{--fa: ""}.fa-mobile-retro{--fa: ""}.fa-grip-lines-vertical{--fa: ""}.fa-spider{--fa: ""}.fa-hands-bound{--fa: ""}.fa-file-invoice-dollar{--fa: ""}.fa-plane-circle-exclamation{--fa: ""}.fa-x-ray{--fa: ""}.fa-spell-check{--fa: ""}.fa-slash{--fa: ""}.fa-computer-mouse,.fa-mouse{--fa: ""}.fa-arrow-right-to-bracket,.fa-sign-in{--fa: ""}.fa-shop-slash,.fa-store-alt-slash{--fa: ""}.fa-server{--fa: ""}.fa-virus-covid-slash{--fa: ""}.fa-shop-lock{--fa: ""}.fa-hourglass-start,.fa-hourglass-1{--fa: ""}.fa-blender-phone{--fa: ""}.fa-building-wheat{--fa: ""}.fa-person-breastfeeding{--fa: ""}.fa-right-to-bracket,.fa-sign-in-alt{--fa: ""}.fa-venus{--fa: ""}.fa-passport{--fa: ""}.fa-thumbtack-slash,.fa-thumb-tack-slash{--fa: ""}.fa-heart-pulse,.fa-heartbeat{--fa: ""}.fa-people-carry-box,.fa-people-carry{--fa: ""}.fa-temperature-high{--fa: ""}.fa-microchip{--fa: ""}.fa-crown{--fa: ""}.fa-weight-hanging{--fa: ""}.fa-xmarks-lines{--fa: ""}.fa-file-prescription{--fa: ""}.fa-weight-scale,.fa-weight{--fa: ""}.fa-user-group,.fa-user-friends{--fa: ""}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa: ""}.fa-chess-knight{--fa: ""}.fa-face-laugh-squint,.fa-laugh-squint{--fa: ""}.fa-wheelchair{--fa: ""}.fa-circle-arrow-up,.fa-arrow-circle-up{--fa: ""}.fa-toggle-on{--fa: ""}.fa-person-walking,.fa-walking{--fa: ""}.fa-l{--fa: "L"}.fa-fire{--fa: ""}.fa-bed-pulse,.fa-procedures{--fa: ""}.fa-shuttle-space,.fa-space-shuttle{--fa: ""}.fa-face-laugh,.fa-laugh{--fa: ""}.fa-folder-open{--fa: ""}.fa-heart-circle-plus{--fa: ""}.fa-code-fork{--fa: ""}.fa-city{--fa: ""}.fa-microphone-lines,.fa-microphone-alt{--fa: ""}.fa-pepper-hot{--fa: ""}.fa-unlock{--fa: ""}.fa-colon-sign{--fa: ""}.fa-headset{--fa: ""}.fa-store-slash{--fa: ""}.fa-road-circle-xmark{--fa: ""}.fa-user-minus{--fa: ""}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa: ""}.fa-champagne-glasses,.fa-glass-cheers{--fa: ""}.fa-clipboard{--fa: ""}.fa-house-circle-exclamation{--fa: ""}.fa-file-arrow-up,.fa-file-upload{--fa: ""}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa: ""}.fa-bath,.fa-bathtub{--fa: ""}.fa-underline{--fa: ""}.fa-user-pen,.fa-user-edit{--fa: ""}.fa-signature{--fa: ""}.fa-stroopwafel{--fa: ""}.fa-bold{--fa: ""}.fa-anchor-lock{--fa: ""}.fa-building-ngo{--fa: ""}.fa-manat-sign{--fa: ""}.fa-not-equal{--fa: ""}.fa-border-top-left,.fa-border-style{--fa: ""}.fa-map-location-dot,.fa-map-marked-alt{--fa: ""}.fa-jedi{--fa: ""}.fa-square-poll-vertical,.fa-poll{--fa: ""}.fa-mug-hot{--fa: ""}.fa-car-battery,.fa-battery-car{--fa: ""}.fa-gift{--fa: ""}.fa-dice-two{--fa: ""}.fa-chess-queen{--fa: ""}.fa-glasses{--fa: ""}.fa-chess-board{--fa: ""}.fa-building-circle-check{--fa: ""}.fa-person-chalkboard{--fa: ""}.fa-mars-stroke-right,.fa-mars-stroke-h{--fa: ""}.fa-hand-back-fist,.fa-hand-rock{--fa: ""}.fa-square-caret-up,.fa-caret-square-up{--fa: ""}.fa-cloud-showers-water{--fa: ""}.fa-chart-bar,.fa-bar-chart{--fa: ""}.fa-hands-bubbles,.fa-hands-wash{--fa: ""}.fa-less-than-equal{--fa: ""}.fa-train{--fa: ""}.fa-eye-low-vision,.fa-low-vision{--fa: ""}.fa-crow{--fa: ""}.fa-sailboat{--fa: ""}.fa-window-restore{--fa: ""}.fa-square-plus,.fa-plus-square{--fa: ""}.fa-torii-gate{--fa: ""}.fa-frog{--fa: ""}.fa-bucket{--fa: ""}.fa-image{--fa: ""}.fa-microphone{--fa: ""}.fa-cow{--fa: ""}.fa-caret-up{--fa: ""}.fa-screwdriver{--fa: ""}.fa-folder-closed{--fa: ""}.fa-house-tsunami{--fa: ""}.fa-square-nfi{--fa: ""}.fa-arrow-up-from-ground-water{--fa: ""}.fa-martini-glass,.fa-glass-martini-alt{--fa: ""}.fa-square-binary{--fa: ""}.fa-rotate-left,.fa-rotate-back,.fa-rotate-backward,.fa-undo-alt{--fa: ""}.fa-table-columns,.fa-columns{--fa: ""}.fa-lemon{--fa: ""}.fa-head-side-mask{--fa: ""}.fa-handshake{--fa: ""}.fa-gem{--fa: ""}.fa-dolly,.fa-dolly-box{--fa: ""}.fa-smoking{--fa: ""}.fa-minimize,.fa-compress-arrows-alt{--fa: ""}.fa-monument{--fa: ""}.fa-snowplow{--fa: ""}.fa-angles-right,.fa-angle-double-right{--fa: ""}.fa-cannabis{--fa: ""}.fa-circle-play,.fa-play-circle{--fa: ""}.fa-tablets{--fa: ""}.fa-ethernet{--fa: ""}.fa-euro-sign,.fa-eur,.fa-euro{--fa: ""}.fa-chair{--fa: ""}.fa-circle-check,.fa-check-circle{--fa: ""}.fa-circle-stop,.fa-stop-circle{--fa: ""}.fa-compass-drafting,.fa-drafting-compass{--fa: ""}.fa-plate-wheat{--fa: ""}.fa-icicles{--fa: ""}.fa-person-shelter{--fa: ""}.fa-neuter{--fa: ""}.fa-id-badge{--fa: ""}.fa-marker{--fa: ""}.fa-face-laugh-beam,.fa-laugh-beam{--fa: ""}.fa-helicopter-symbol{--fa: ""}.fa-universal-access{--fa: ""}.fa-circle-chevron-up,.fa-chevron-circle-up{--fa: ""}.fa-lari-sign{--fa: ""}.fa-volcano{--fa: ""}.fa-person-walking-dashed-line-arrow-right{--fa: ""}.fa-sterling-sign,.fa-gbp,.fa-pound-sign{--fa: ""}.fa-viruses{--fa: ""}.fa-square-person-confined{--fa: ""}.fa-user-tie{--fa: ""}.fa-arrow-down-long,.fa-long-arrow-down{--fa: ""}.fa-tent-arrow-down-to-line{--fa: ""}.fa-certificate{--fa: ""}.fa-reply-all,.fa-mail-reply-all{--fa: ""}.fa-suitcase{--fa: ""}.fa-person-skating,.fa-skating{--fa: ""}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa: ""}.fa-camera-retro{--fa: ""}.fa-circle-arrow-down,.fa-arrow-circle-down{--fa: ""}.fa-file-import,.fa-arrow-right-to-file{--fa: ""}.fa-square-arrow-up-right,.fa-external-link-square{--fa: ""}.fa-box-open{--fa: ""}.fa-scroll{--fa: ""}.fa-spa{--fa: ""}.fa-location-pin-lock{--fa: ""}.fa-pause{--fa: ""}.fa-hill-avalanche{--fa: ""}.fa-temperature-empty,.fa-temperature-0,.fa-thermometer-0,.fa-thermometer-empty{--fa: ""}.fa-bomb{--fa: ""}.fa-registered{--fa: ""}.fa-address-card,.fa-contact-card,.fa-vcard{--fa: ""}.fa-scale-unbalanced-flip,.fa-balance-scale-right{--fa: ""}.fa-subscript{--fa: ""}.fa-diamond-turn-right,.fa-directions{--fa: ""}.fa-burst{--fa: ""}.fa-house-laptop,.fa-laptop-house{--fa: ""}.fa-face-tired,.fa-tired{--fa: ""}.fa-money-bills{--fa: ""}.fa-smog{--fa: ""}.fa-crutch{--fa: ""}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa: ""}.fa-palette{--fa: ""}.fa-arrows-turn-right{--fa: ""}.fa-vest{--fa: ""}.fa-ferry{--fa: ""}.fa-arrows-down-to-people{--fa: ""}.fa-seedling,.fa-sprout{--fa: ""}.fa-left-right,.fa-arrows-alt-h{--fa: ""}.fa-boxes-packing{--fa: ""}.fa-circle-arrow-left,.fa-arrow-circle-left{--fa: ""}.fa-group-arrows-rotate{--fa: ""}.fa-bowl-food{--fa: ""}.fa-candy-cane{--fa: ""}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa: ""}.fa-cloud-bolt,.fa-thunderstorm{--fa: ""}.fa-text-slash,.fa-remove-format{--fa: ""}.fa-face-smile-wink,.fa-smile-wink{--fa: ""}.fa-file-word{--fa: ""}.fa-file-powerpoint{--fa: ""}.fa-arrows-left-right,.fa-arrows-h{--fa: ""}.fa-house-lock{--fa: ""}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa: ""}.fa-children{--fa: ""}.fa-chalkboard,.fa-blackboard{--fa: ""}.fa-user-large-slash,.fa-user-alt-slash{--fa: ""}.fa-envelope-open{--fa: ""}.fa-handshake-simple-slash,.fa-handshake-alt-slash{--fa: ""}.fa-mattress-pillow{--fa: ""}.fa-guarani-sign{--fa: ""}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa: ""}.fa-fire-extinguisher{--fa: ""}.fa-cruzeiro-sign{--fa: ""}.fa-greater-than-equal{--fa: ""}.fa-shield-halved,.fa-shield-alt{--fa: ""}.fa-book-atlas,.fa-atlas{--fa: ""}.fa-virus{--fa: ""}.fa-envelope-circle-check{--fa: ""}.fa-layer-group{--fa: ""}.fa-arrows-to-dot{--fa: ""}.fa-archway{--fa: ""}.fa-heart-circle-check{--fa: ""}.fa-house-chimney-crack,.fa-house-damage{--fa: ""}.fa-file-zipper,.fa-file-archive{--fa: ""}.fa-square{--fa: ""}.fa-martini-glass-empty,.fa-glass-martini{--fa: ""}.fa-couch{--fa: ""}.fa-cedi-sign{--fa: ""}.fa-italic{--fa: ""}.fa-table-cells-column-lock{--fa: ""}.fa-church{--fa: ""}.fa-comments-dollar{--fa: ""}.fa-democrat{--fa: ""}.fa-z{--fa: "Z"}.fa-person-skiing,.fa-skiing{--fa: ""}.fa-road-lock{--fa: ""}.fa-a{--fa: "A"}.fa-temperature-arrow-down,.fa-temperature-down{--fa: ""}.fa-feather-pointed,.fa-feather-alt{--fa: ""}.fa-p{--fa: "P"}.fa-snowflake{--fa: ""}.fa-newspaper{--fa: ""}.fa-rectangle-ad,.fa-ad{--fa: ""}.fa-circle-arrow-right,.fa-arrow-circle-right{--fa: ""}.fa-filter-circle-xmark{--fa: ""}.fa-locust{--fa: ""}.fa-sort,.fa-unsorted{--fa: ""}.fa-list-ol,.fa-list-1-2,.fa-list-numeric{--fa: ""}.fa-person-dress-burst{--fa: ""}.fa-money-check-dollar,.fa-money-check-alt{--fa: ""}.fa-vector-square{--fa: ""}.fa-bread-slice{--fa: ""}.fa-language{--fa: ""}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa: ""}.fa-filter{--fa: ""}.fa-question{--fa: "?"}.fa-file-signature{--fa: ""}.fa-up-down-left-right,.fa-arrows-alt{--fa: ""}.fa-house-chimney-user{--fa: ""}.fa-hand-holding-heart{--fa: ""}.fa-puzzle-piece{--fa: ""}.fa-money-check{--fa: ""}.fa-star-half-stroke,.fa-star-half-alt{--fa: ""}.fa-code{--fa: ""}.fa-whiskey-glass,.fa-glass-whiskey{--fa: ""}.fa-building-circle-exclamation{--fa: ""}.fa-magnifying-glass-chart{--fa: ""}.fa-arrow-up-right-from-square,.fa-external-link{--fa: ""}.fa-cubes-stacked{--fa: ""}.fa-won-sign,.fa-krw,.fa-won{--fa: ""}.fa-virus-covid{--fa: ""}.fa-austral-sign{--fa: ""}.fa-f{--fa: "F"}.fa-leaf{--fa: ""}.fa-road{--fa: ""}.fa-taxi,.fa-cab{--fa: ""}.fa-person-circle-plus{--fa: ""}.fa-chart-pie,.fa-pie-chart{--fa: ""}.fa-bolt-lightning{--fa: ""}.fa-sack-xmark{--fa: ""}.fa-file-excel{--fa: ""}.fa-file-contract{--fa: ""}.fa-fish-fins{--fa: ""}.fa-building-flag{--fa: ""}.fa-face-grin-beam,.fa-grin-beam{--fa: ""}.fa-object-ungroup{--fa: ""}.fa-poop{--fa: ""}.fa-location-pin,.fa-map-marker{--fa: ""}.fa-kaaba{--fa: ""}.fa-toilet-paper{--fa: ""}.fa-helmet-safety,.fa-hard-hat,.fa-hat-hard{--fa: ""}.fa-eject{--fa: ""}.fa-circle-right,.fa-arrow-alt-circle-right{--fa: ""}.fa-plane-circle-check{--fa: ""}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa: ""}.fa-object-group{--fa: ""}.fa-chart-line,.fa-line-chart{--fa: ""}.fa-mask-ventilator{--fa: ""}.fa-arrow-right{--fa: ""}.fa-signs-post,.fa-map-signs{--fa: ""}.fa-cash-register{--fa: ""}.fa-person-circle-question{--fa: ""}.fa-h{--fa: "H"}.fa-tarp{--fa: ""}.fa-screwdriver-wrench,.fa-tools{--fa: ""}.fa-arrows-to-eye{--fa: ""}.fa-plug-circle-bolt{--fa: ""}.fa-heart{--fa: ""}.fa-mars-and-venus{--fa: ""}.fa-house-user,.fa-home-user{--fa: ""}.fa-dumpster-fire{--fa: ""}.fa-house-crack{--fa: ""}.fa-martini-glass-citrus,.fa-cocktail{--fa: ""}.fa-face-surprise,.fa-surprise{--fa: ""}.fa-bottle-water{--fa: ""}.fa-circle-pause,.fa-pause-circle{--fa: ""}.fa-toilet-paper-slash{--fa: ""}.fa-apple-whole,.fa-apple-alt{--fa: ""}.fa-kitchen-set{--fa: ""}.fa-r{--fa: "R"}.fa-temperature-quarter,.fa-temperature-1,.fa-thermometer-1,.fa-thermometer-quarter{--fa: ""}.fa-cube{--fa: ""}.fa-bitcoin-sign{--fa: ""}.fa-shield-dog{--fa: ""}.fa-solar-panel{--fa: ""}.fa-lock-open{--fa: ""}.fa-elevator{--fa: ""}.fa-money-bill-transfer{--fa: ""}.fa-money-bill-trend-up{--fa: ""}.fa-house-flood-water-circle-arrow-right{--fa: ""}.fa-square-poll-horizontal,.fa-poll-h{--fa: ""}.fa-circle{--fa: ""}.fa-backward-fast,.fa-fast-backward{--fa: ""}.fa-recycle{--fa: ""}.fa-user-astronaut{--fa: ""}.fa-plane-slash{--fa: ""}.fa-trademark{--fa: ""}.fa-basketball,.fa-basketball-ball{--fa: ""}.fa-satellite-dish{--fa: ""}.fa-circle-up,.fa-arrow-alt-circle-up{--fa: ""}.fa-mobile-screen-button,.fa-mobile-alt{--fa: ""}.fa-volume-high,.fa-volume-up{--fa: ""}.fa-users-rays{--fa: ""}.fa-wallet{--fa: ""}.fa-clipboard-check{--fa: ""}.fa-file-audio{--fa: ""}.fa-burger,.fa-hamburger{--fa: ""}.fa-wrench{--fa: ""}.fa-bugs{--fa: ""}.fa-rupee-sign,.fa-rupee{--fa: ""}.fa-file-image{--fa: ""}.fa-circle-question,.fa-question-circle{--fa: ""}.fa-plane-departure{--fa: ""}.fa-handshake-slash{--fa: ""}.fa-book-bookmark{--fa: ""}.fa-code-branch{--fa: ""}.fa-hat-cowboy{--fa: ""}.fa-bridge{--fa: ""}.fa-phone-flip,.fa-phone-alt{--fa: ""}.fa-truck-front{--fa: ""}.fa-cat{--fa: ""}.fa-anchor-circle-exclamation{--fa: ""}.fa-truck-field{--fa: ""}.fa-route{--fa: ""}.fa-clipboard-question{--fa: ""}.fa-panorama{--fa: ""}.fa-comment-medical{--fa: ""}.fa-teeth-open{--fa: ""}.fa-file-circle-minus{--fa: ""}.fa-tags{--fa: ""}.fa-wine-glass{--fa: ""}.fa-forward-fast,.fa-fast-forward{--fa: ""}.fa-face-meh-blank,.fa-meh-blank{--fa: ""}.fa-square-parking,.fa-parking{--fa: ""}.fa-house-signal{--fa: ""}.fa-bars-progress,.fa-tasks-alt{--fa: ""}.fa-faucet-drip{--fa: ""}.fa-cart-flatbed,.fa-dolly-flatbed{--fa: ""}.fa-ban-smoking,.fa-smoking-ban{--fa: ""}.fa-terminal{--fa: ""}.fa-mobile-button{--fa: ""}.fa-house-medical-flag{--fa: ""}.fa-basket-shopping,.fa-shopping-basket{--fa: ""}.fa-tape{--fa: ""}.fa-bus-simple,.fa-bus-alt{--fa: ""}.fa-eye{--fa: ""}.fa-face-sad-cry,.fa-sad-cry{--fa: ""}.fa-audio-description{--fa: ""}.fa-person-military-to-person{--fa: ""}.fa-file-shield{--fa: ""}.fa-user-slash{--fa: ""}.fa-pen{--fa: ""}.fa-tower-observation{--fa: ""}.fa-file-code{--fa: ""}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa: ""}.fa-bus{--fa: ""}.fa-heart-circle-xmark{--fa: ""}.fa-house-chimney,.fa-home-lg{--fa: ""}.fa-window-maximize{--fa: ""}.fa-face-frown,.fa-frown{--fa: ""}.fa-prescription{--fa: ""}.fa-shop,.fa-store-alt{--fa: ""}.fa-floppy-disk,.fa-save{--fa: ""}.fa-vihara{--fa: ""}.fa-scale-unbalanced,.fa-balance-scale-left{--fa: ""}.fa-sort-up,.fa-sort-asc{--fa: ""}.fa-comment-dots,.fa-commenting{--fa: ""}.fa-plant-wilt{--fa: ""}.fa-diamond{--fa: ""}.fa-face-grin-squint,.fa-grin-squint{--fa: ""}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa: ""}.fa-chart-diagram{--fa: ""}.fa-bacterium{--fa: ""}.fa-hand-pointer{--fa: ""}.fa-drum-steelpan{--fa: ""}.fa-hand-scissors{--fa: ""}.fa-hands-praying,.fa-praying-hands{--fa: ""}.fa-arrow-rotate-right,.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-redo{--fa: ""}.fa-biohazard{--fa: ""}.fa-location-crosshairs,.fa-location{--fa: ""}.fa-mars-double{--fa: ""}.fa-child-dress{--fa: ""}.fa-users-between-lines{--fa: ""}.fa-lungs-virus{--fa: ""}.fa-face-grin-tears,.fa-grin-tears{--fa: ""}.fa-phone{--fa: ""}.fa-calendar-xmark,.fa-calendar-times{--fa: ""}.fa-child-reaching{--fa: ""}.fa-head-side-virus{--fa: ""}.fa-user-gear,.fa-user-cog{--fa: ""}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa: ""}.fa-door-closed{--fa: ""}.fa-shield-virus{--fa: ""}.fa-dice-six{--fa: ""}.fa-mosquito-net{--fa: ""}.fa-file-fragment{--fa: ""}.fa-bridge-water{--fa: ""}.fa-person-booth{--fa: ""}.fa-text-width{--fa: ""}.fa-hat-wizard{--fa: ""}.fa-pen-fancy{--fa: ""}.fa-person-digging,.fa-digging{--fa: ""}.fa-trash{--fa: ""}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa: ""}.fa-book-medical{--fa: ""}.fa-poo{--fa: ""}.fa-quote-right,.fa-quote-right-alt{--fa: ""}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa: ""}.fa-cubes{--fa: ""}.fa-divide{--fa: ""}.fa-tenge-sign,.fa-tenge{--fa: ""}.fa-headphones{--fa: ""}.fa-hands-holding{--fa: ""}.fa-hands-clapping{--fa: ""}.fa-republican{--fa: ""}.fa-arrow-left{--fa: ""}.fa-person-circle-xmark{--fa: ""}.fa-ruler{--fa: ""}.fa-align-left{--fa: ""}.fa-dice-d6{--fa: ""}.fa-restroom{--fa: ""}.fa-j{--fa: "J"}.fa-users-viewfinder{--fa: ""}.fa-file-video{--fa: ""}.fa-up-right-from-square,.fa-external-link-alt{--fa: ""}.fa-table-cells,.fa-th{--fa: ""}.fa-file-pdf{--fa: ""}.fa-book-bible,.fa-bible{--fa: ""}.fa-o{--fa: "O"}.fa-suitcase-medical,.fa-medkit{--fa: ""}.fa-user-secret{--fa: ""}.fa-otter{--fa: ""}.fa-person-dress,.fa-female{--fa: ""}.fa-comment-dollar{--fa: ""}.fa-business-time,.fa-briefcase-clock{--fa: ""}.fa-table-cells-large,.fa-th-large{--fa: ""}.fa-book-tanakh,.fa-tanakh{--fa: ""}.fa-phone-volume,.fa-volume-control-phone{--fa: ""}.fa-hat-cowboy-side{--fa: ""}.fa-clipboard-user{--fa: ""}.fa-child{--fa: ""}.fa-lira-sign{--fa: ""}.fa-satellite{--fa: ""}.fa-plane-lock{--fa: ""}.fa-tag{--fa: ""}.fa-comment{--fa: ""}.fa-cake-candles,.fa-birthday-cake,.fa-cake{--fa: ""}.fa-envelope{--fa: ""}.fa-angles-up,.fa-angle-double-up{--fa: ""}.fa-paperclip{--fa: ""}.fa-arrow-right-to-city{--fa: ""}.fa-ribbon{--fa: ""}.fa-lungs{--fa: ""}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa: ""}.fa-litecoin-sign{--fa: ""}.fa-border-none{--fa: ""}.fa-circle-nodes{--fa: ""}.fa-parachute-box{--fa: ""}.fa-indent{--fa: ""}.fa-truck-field-un{--fa: ""}.fa-hourglass,.fa-hourglass-empty{--fa: ""}.fa-mountain{--fa: ""}.fa-user-doctor,.fa-user-md{--fa: ""}.fa-circle-info,.fa-info-circle{--fa: ""}.fa-cloud-meatball{--fa: ""}.fa-camera,.fa-camera-alt{--fa: ""}.fa-square-virus{--fa: ""}.fa-meteor{--fa: ""}.fa-car-on{--fa: ""}.fa-sleigh{--fa: ""}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa: ""}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa: ""}.fa-water{--fa: ""}.fa-calendar-check{--fa: ""}.fa-braille{--fa: ""}.fa-prescription-bottle-medical,.fa-prescription-bottle-alt{--fa: ""}.fa-landmark{--fa: ""}.fa-truck{--fa: ""}.fa-crosshairs{--fa: ""}.fa-person-cane{--fa: ""}.fa-tent{--fa: ""}.fa-vest-patches{--fa: ""}.fa-check-double{--fa: ""}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa: ""}.fa-money-bill-wheat{--fa: ""}.fa-cookie{--fa: ""}.fa-arrow-rotate-left,.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-undo{--fa: ""}.fa-hard-drive,.fa-hdd{--fa: ""}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa: ""}.fa-dumbbell{--fa: ""}.fa-rectangle-list,.fa-list-alt{--fa: ""}.fa-tarp-droplet{--fa: ""}.fa-house-medical-circle-check{--fa: ""}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa: ""}.fa-calendar-plus{--fa: ""}.fa-plane-arrival{--fa: ""}.fa-circle-left,.fa-arrow-alt-circle-left{--fa: ""}.fa-train-subway,.fa-subway{--fa: ""}.fa-chart-gantt{--fa: ""}.fa-indian-rupee-sign,.fa-indian-rupee,.fa-inr{--fa: ""}.fa-crop-simple,.fa-crop-alt{--fa: ""}.fa-money-bill-1,.fa-money-bill-alt{--fa: ""}.fa-left-long,.fa-long-arrow-alt-left{--fa: ""}.fa-dna{--fa: ""}.fa-virus-slash{--fa: ""}.fa-minus,.fa-subtract{--fa: ""}.fa-chess{--fa: ""}.fa-arrow-left-long,.fa-long-arrow-left{--fa: ""}.fa-plug-circle-check{--fa: ""}.fa-street-view{--fa: ""}.fa-franc-sign{--fa: ""}.fa-volume-off{--fa: ""}.fa-hands-asl-interpreting,.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting{--fa: ""}.fa-gear,.fa-cog{--fa: ""}.fa-droplet-slash,.fa-tint-slash{--fa: ""}.fa-mosque{--fa: ""}.fa-mosquito{--fa: ""}.fa-star-of-david{--fa: ""}.fa-person-military-rifle{--fa: ""}.fa-cart-shopping,.fa-shopping-cart{--fa: ""}.fa-vials{--fa: ""}.fa-plug-circle-plus{--fa: ""}.fa-place-of-worship{--fa: ""}.fa-grip-vertical{--fa: ""}.fa-hexagon-nodes{--fa: ""}.fa-arrow-turn-up,.fa-level-up{--fa: ""}.fa-u{--fa: "U"}.fa-square-root-variable,.fa-square-root-alt{--fa: ""}.fa-clock,.fa-clock-four{--fa: ""}.fa-backward-step,.fa-step-backward{--fa: ""}.fa-pallet{--fa: ""}.fa-faucet{--fa: ""}.fa-baseball-bat-ball{--fa: ""}.fa-s{--fa: "S"}.fa-timeline{--fa: ""}.fa-keyboard{--fa: ""}.fa-caret-down{--fa: ""}.fa-house-chimney-medical,.fa-clinic-medical{--fa: ""}.fa-temperature-three-quarters,.fa-temperature-3,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa: ""}.fa-mobile-screen,.fa-mobile-android-alt{--fa: ""}.fa-plane-up{--fa: ""}.fa-piggy-bank{--fa: ""}.fa-battery-half,.fa-battery-3{--fa: ""}.fa-mountain-city{--fa: ""}.fa-coins{--fa: ""}.fa-khanda{--fa: ""}.fa-sliders,.fa-sliders-h{--fa: ""}.fa-folder-tree{--fa: ""}.fa-network-wired{--fa: ""}.fa-map-pin{--fa: ""}.fa-hamsa{--fa: ""}.fa-cent-sign{--fa: ""}.fa-flask{--fa: ""}.fa-person-pregnant{--fa: ""}.fa-wand-sparkles{--fa: ""}.fa-ellipsis-vertical,.fa-ellipsis-v{--fa: ""}.fa-ticket{--fa: ""}.fa-power-off{--fa: ""}.fa-right-long,.fa-long-arrow-alt-right{--fa: ""}.fa-flag-usa{--fa: ""}.fa-laptop-file{--fa: ""}.fa-tty,.fa-teletype{--fa: ""}.fa-diagram-next{--fa: ""}.fa-person-rifle{--fa: ""}.fa-house-medical-circle-exclamation{--fa: ""}.fa-closed-captioning{--fa: ""}.fa-person-hiking,.fa-hiking{--fa: ""}.fa-venus-double{--fa: ""}.fa-images{--fa: ""}.fa-calculator{--fa: ""}.fa-people-pulling{--fa: ""}.fa-n{--fa: "N"}.fa-cable-car,.fa-tram{--fa: ""}.fa-cloud-rain{--fa: ""}.fa-building-circle-xmark{--fa: ""}.fa-ship{--fa: ""}.fa-arrows-down-to-line{--fa: ""}.fa-download{--fa: ""}.fa-face-grin,.fa-grin{--fa: ""}.fa-delete-left,.fa-backspace{--fa: ""}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa: ""}.fa-file-circle-check{--fa: ""}.fa-forward{--fa: ""}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa: ""}.fa-face-meh,.fa-meh{--fa: ""}.fa-align-center{--fa: ""}.fa-book-skull,.fa-book-dead{--fa: ""}.fa-id-card,.fa-drivers-license{--fa: ""}.fa-outdent,.fa-dedent{--fa: ""}.fa-heart-circle-exclamation{--fa: ""}.fa-house,.fa-home,.fa-home-alt,.fa-home-lg-alt{--fa: ""}.fa-calendar-week{--fa: ""}.fa-laptop-medical{--fa: ""}.fa-b{--fa: "B"}.fa-file-medical{--fa: ""}.fa-dice-one{--fa: ""}.fa-kiwi-bird{--fa: ""}.fa-arrow-right-arrow-left,.fa-exchange{--fa: ""}.fa-rotate-right,.fa-redo-alt,.fa-rotate-forward{--fa: ""}.fa-utensils,.fa-cutlery{--fa: ""}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa: ""}.fa-mill-sign{--fa: ""}.fa-bowl-rice{--fa: ""}.fa-skull{--fa: ""}.fa-tower-broadcast,.fa-broadcast-tower{--fa: ""}.fa-truck-pickup{--fa: ""}.fa-up-long,.fa-long-arrow-alt-up{--fa: ""}.fa-stop{--fa: ""}.fa-code-merge{--fa: ""}.fa-upload{--fa: ""}.fa-hurricane{--fa: ""}.fa-mound{--fa: ""}.fa-toilet-portable{--fa: ""}.fa-compact-disc{--fa: ""}.fa-file-arrow-down,.fa-file-download{--fa: ""}.fa-caravan{--fa: ""}.fa-shield-cat{--fa: ""}.fa-bolt,.fa-zap{--fa: ""}.fa-glass-water{--fa: ""}.fa-oil-well{--fa: ""}.fa-vault{--fa: ""}.fa-mars{--fa: ""}.fa-toilet{--fa: ""}.fa-plane-circle-xmark{--fa: ""}.fa-yen-sign,.fa-cny,.fa-jpy,.fa-rmb,.fa-yen{--fa: ""}.fa-ruble-sign,.fa-rouble,.fa-rub,.fa-ruble{--fa: ""}.fa-sun{--fa: ""}.fa-guitar{--fa: ""}.fa-face-laugh-wink,.fa-laugh-wink{--fa: ""}.fa-horse-head{--fa: ""}.fa-bore-hole{--fa: ""}.fa-industry{--fa: ""}.fa-circle-down,.fa-arrow-alt-circle-down{--fa: ""}.fa-arrows-turn-to-dots{--fa: ""}.fa-florin-sign{--fa: ""}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa: ""}.fa-less-than{--fa: "<"}.fa-angle-down{--fa: ""}.fa-car-tunnel{--fa: ""}.fa-head-side-cough{--fa: ""}.fa-grip-lines{--fa: ""}.fa-thumbs-down{--fa: ""}.fa-user-lock{--fa: ""}.fa-arrow-right-long,.fa-long-arrow-right{--fa: ""}.fa-anchor-circle-xmark{--fa: ""}.fa-ellipsis,.fa-ellipsis-h{--fa: ""}.fa-chess-pawn{--fa: ""}.fa-kit-medical,.fa-first-aid{--fa: ""}.fa-person-through-window{--fa: ""}.fa-toolbox{--fa: ""}.fa-hands-holding-circle{--fa: ""}.fa-bug{--fa: ""}.fa-credit-card,.fa-credit-card-alt{--fa: ""}.fa-car,.fa-automobile{--fa: ""}.fa-hand-holding-hand{--fa: ""}.fa-book-open-reader,.fa-book-reader{--fa: ""}.fa-mountain-sun{--fa: ""}.fa-arrows-left-right-to-line{--fa: ""}.fa-dice-d20{--fa: ""}.fa-truck-droplet{--fa: ""}.fa-file-circle-xmark{--fa: ""}.fa-temperature-arrow-up,.fa-temperature-up{--fa: ""}.fa-medal{--fa: ""}.fa-bed{--fa: ""}.fa-square-h,.fa-h-square{--fa: ""}.fa-podcast{--fa: ""}.fa-temperature-full,.fa-temperature-4,.fa-thermometer-4,.fa-thermometer-full{--fa: ""}.fa-bell{--fa: ""}.fa-superscript{--fa: ""}.fa-plug-circle-xmark{--fa: ""}.fa-star-of-life{--fa: ""}.fa-phone-slash{--fa: ""}.fa-paint-roller{--fa: ""}.fa-handshake-angle,.fa-hands-helping{--fa: ""}.fa-location-dot,.fa-map-marker-alt{--fa: ""}.fa-file{--fa: ""}.fa-greater-than{--fa: ">"}.fa-person-swimming,.fa-swimmer{--fa: ""}.fa-arrow-down{--fa: ""}.fa-droplet,.fa-tint{--fa: ""}.fa-eraser{--fa: ""}.fa-earth-americas,.fa-earth,.fa-earth-america,.fa-globe-americas{--fa: ""}.fa-person-burst{--fa: ""}.fa-dove{--fa: ""}.fa-battery-empty,.fa-battery-0{--fa: ""}.fa-socks{--fa: ""}.fa-inbox{--fa: ""}.fa-section{--fa: ""}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa: ""}.fa-envelope-open-text{--fa: ""}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa: ""}.fa-wine-bottle{--fa: ""}.fa-chess-rook{--fa: ""}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa: ""}.fa-dharmachakra{--fa: ""}.fa-hotdog{--fa: ""}.fa-person-walking-with-cane,.fa-blind{--fa: ""}.fa-drum{--fa: ""}.fa-ice-cream{--fa: ""}.fa-heart-circle-bolt{--fa: ""}.fa-fax{--fa: ""}.fa-paragraph{--fa: ""}.fa-check-to-slot,.fa-vote-yea{--fa: ""}.fa-star-half{--fa: ""}.fa-boxes-stacked,.fa-boxes,.fa-boxes-alt{--fa: ""}.fa-link,.fa-chain{--fa: ""}.fa-ear-listen,.fa-assistive-listening-systems{--fa: ""}.fa-tree-city{--fa: ""}.fa-play{--fa: ""}.fa-font{--fa: ""}.fa-table-cells-row-lock{--fa: ""}.fa-rupiah-sign{--fa: ""}.fa-magnifying-glass,.fa-search{--fa: ""}.fa-table-tennis-paddle-ball,.fa-ping-pong-paddle-ball,.fa-table-tennis{--fa: ""}.fa-person-dots-from-line,.fa-diagnoses{--fa: ""}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa: ""}.fa-naira-sign{--fa: ""}.fa-cart-arrow-down{--fa: ""}.fa-walkie-talkie{--fa: ""}.fa-file-pen,.fa-file-edit{--fa: ""}.fa-receipt{--fa: ""}.fa-square-pen,.fa-pen-square,.fa-pencil-square{--fa: ""}.fa-suitcase-rolling{--fa: ""}.fa-person-circle-exclamation{--fa: ""}.fa-chevron-down{--fa: ""}.fa-battery-full,.fa-battery,.fa-battery-5{--fa: ""}.fa-skull-crossbones{--fa: ""}.fa-code-compare{--fa: ""}.fa-list-ul,.fa-list-dots{--fa: ""}.fa-school-lock{--fa: ""}.fa-tower-cell{--fa: ""}.fa-down-long,.fa-long-arrow-alt-down{--fa: ""}.fa-ranking-star{--fa: ""}.fa-chess-king{--fa: ""}.fa-person-harassing{--fa: ""}.fa-brazilian-real-sign{--fa: ""}.fa-landmark-dome,.fa-landmark-alt{--fa: ""}.fa-arrow-up{--fa: ""}.fa-tv,.fa-television,.fa-tv-alt{--fa: ""}.fa-shrimp{--fa: ""}.fa-list-check,.fa-tasks{--fa: ""}.fa-jug-detergent{--fa: ""}.fa-circle-user,.fa-user-circle{--fa: ""}.fa-user-shield{--fa: ""}.fa-wind{--fa: ""}.fa-car-burst,.fa-car-crash{--fa: ""}.fa-y{--fa: "Y"}.fa-person-snowboarding,.fa-snowboarding{--fa: ""}.fa-truck-fast,.fa-shipping-fast{--fa: ""}.fa-fish{--fa: ""}.fa-user-graduate{--fa: ""}.fa-circle-half-stroke,.fa-adjust{--fa: ""}.fa-clapperboard{--fa: ""}.fa-circle-radiation,.fa-radiation-alt{--fa: ""}.fa-baseball,.fa-baseball-ball{--fa: ""}.fa-jet-fighter-up{--fa: ""}.fa-diagram-project,.fa-project-diagram{--fa: ""}.fa-copy{--fa: ""}.fa-volume-xmark,.fa-volume-mute,.fa-volume-times{--fa: ""}.fa-hand-sparkles{--fa: ""}.fa-grip,.fa-grip-horizontal{--fa: ""}.fa-share-from-square,.fa-share-square{--fa: ""}.fa-child-combatant,.fa-child-rifle{--fa: ""}.fa-gun{--fa: ""}.fa-square-phone,.fa-phone-square{--fa: ""}.fa-plus,.fa-add{--fa: "+"}.fa-expand{--fa: ""}.fa-computer{--fa: ""}.fa-xmark,.fa-close,.fa-multiply,.fa-remove,.fa-times{--fa: ""}.fa-arrows-up-down-left-right,.fa-arrows{--fa: ""}.fa-chalkboard-user,.fa-chalkboard-teacher{--fa: ""}.fa-peso-sign{--fa: ""}.fa-building-shield{--fa: ""}.fa-baby{--fa: ""}.fa-users-line{--fa: ""}.fa-quote-left,.fa-quote-left-alt{--fa: ""}.fa-tractor{--fa: ""}.fa-trash-arrow-up,.fa-trash-restore{--fa: ""}.fa-arrow-down-up-lock{--fa: ""}.fa-lines-leaning{--fa: ""}.fa-ruler-combined{--fa: ""}.fa-copyright{--fa: ""}.fa-equals{--fa: "="}.fa-blender{--fa: ""}.fa-teeth{--fa: ""}.fa-shekel-sign,.fa-ils,.fa-shekel,.fa-sheqel,.fa-sheqel-sign{--fa: ""}.fa-map{--fa: ""}.fa-rocket{--fa: ""}.fa-photo-film,.fa-photo-video{--fa: ""}.fa-folder-minus{--fa: ""}.fa-hexagon-nodes-bolt{--fa: ""}.fa-store{--fa: ""}.fa-arrow-trend-up{--fa: ""}.fa-plug-circle-minus{--fa: ""}.fa-sign-hanging,.fa-sign{--fa: ""}.fa-bezier-curve{--fa: ""}.fa-bell-slash{--fa: ""}.fa-tablet,.fa-tablet-android{--fa: ""}.fa-school-flag{--fa: ""}.fa-fill{--fa: ""}.fa-angle-up{--fa: ""}.fa-drumstick-bite{--fa: ""}.fa-holly-berry{--fa: ""}.fa-chevron-left{--fa: ""}.fa-bacteria{--fa: ""}.fa-hand-lizard{--fa: ""}.fa-notdef{--fa: ""}.fa-disease{--fa: ""}.fa-briefcase-medical{--fa: ""}.fa-genderless{--fa: ""}.fa-chevron-right{--fa: ""}.fa-retweet{--fa: ""}.fa-car-rear,.fa-car-alt{--fa: ""}.fa-pump-soap{--fa: ""}.fa-video-slash{--fa: ""}.fa-battery-quarter,.fa-battery-2{--fa: ""}.fa-radio{--fa: ""}.fa-baby-carriage,.fa-carriage-baby{--fa: ""}.fa-traffic-light{--fa: ""}.fa-thermometer{--fa: ""}.fa-vr-cardboard{--fa: ""}.fa-hand-middle-finger{--fa: ""}.fa-percent,.fa-percentage{--fa: "%"}.fa-truck-moving{--fa: ""}.fa-glass-water-droplet{--fa: ""}.fa-display{--fa: ""}.fa-face-smile,.fa-smile{--fa: ""}.fa-thumbtack,.fa-thumb-tack{--fa: ""}.fa-trophy{--fa: ""}.fa-person-praying,.fa-pray{--fa: ""}.fa-hammer{--fa: ""}.fa-hand-peace{--fa: ""}.fa-rotate,.fa-sync-alt{--fa: ""}.fa-spinner{--fa: ""}.fa-robot{--fa: ""}.fa-peace{--fa: ""}.fa-gears,.fa-cogs{--fa: ""}.fa-warehouse{--fa: ""}.fa-arrow-up-right-dots{--fa: ""}.fa-splotch{--fa: ""}.fa-face-grin-hearts,.fa-grin-hearts{--fa: ""}.fa-dice-four{--fa: ""}.fa-sim-card{--fa: ""}.fa-transgender,.fa-transgender-alt{--fa: ""}.fa-mercury{--fa: ""}.fa-arrow-turn-down,.fa-level-down{--fa: ""}.fa-person-falling-burst{--fa: ""}.fa-award{--fa: ""}.fa-ticket-simple,.fa-ticket-alt{--fa: ""}.fa-building{--fa: ""}.fa-angles-left,.fa-angle-double-left{--fa: ""}.fa-qrcode{--fa: ""}.fa-clock-rotate-left,.fa-history{--fa: ""}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa: ""}.fa-file-export,.fa-arrow-right-from-file{--fa: ""}.fa-shield,.fa-shield-blank{--fa: ""}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa: ""}.fa-comment-nodes{--fa: ""}.fa-house-medical{--fa: ""}.fa-golf-ball-tee,.fa-golf-ball{--fa: ""}.fa-circle-chevron-left,.fa-chevron-circle-left{--fa: ""}.fa-house-chimney-window{--fa: ""}.fa-pen-nib{--fa: ""}.fa-tent-arrow-turn-left{--fa: ""}.fa-tents{--fa: ""}.fa-wand-magic,.fa-magic{--fa: ""}.fa-dog{--fa: ""}.fa-carrot{--fa: ""}.fa-moon{--fa: ""}.fa-wine-glass-empty,.fa-wine-glass-alt{--fa: ""}.fa-cheese{--fa: ""}.fa-yin-yang{--fa: ""}.fa-music{--fa: ""}.fa-code-commit{--fa: ""}.fa-temperature-low{--fa: ""}.fa-person-biking,.fa-biking{--fa: ""}.fa-broom{--fa: ""}.fa-shield-heart{--fa: ""}.fa-gopuram{--fa: ""}.fa-earth-oceania,.fa-globe-oceania{--fa: ""}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa: ""}.fa-hashtag{--fa: "#"}.fa-up-right-and-down-left-from-center,.fa-expand-alt{--fa: ""}.fa-oil-can{--fa: ""}.fa-t{--fa: "T"}.fa-hippo{--fa: ""}.fa-chart-column{--fa: ""}.fa-infinity{--fa: ""}.fa-vial-circle-check{--fa: ""}.fa-person-arrow-down-to-line{--fa: ""}.fa-voicemail{--fa: ""}.fa-fan{--fa: ""}.fa-person-walking-luggage{--fa: ""}.fa-up-down,.fa-arrows-alt-v{--fa: ""}.fa-cloud-moon-rain{--fa: ""}.fa-calendar{--fa: ""}.fa-trailer{--fa: ""}.fa-bahai,.fa-haykal{--fa: ""}.fa-sd-card{--fa: ""}.fa-dragon{--fa: ""}.fa-shoe-prints{--fa: ""}.fa-circle-plus,.fa-plus-circle{--fa: ""}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa: ""}.fa-hand-holding{--fa: ""}.fa-plug-circle-exclamation{--fa: ""}.fa-link-slash,.fa-chain-broken,.fa-chain-slash,.fa-unlink{--fa: ""}.fa-clone{--fa: ""}.fa-person-walking-arrow-loop-left{--fa: ""}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa: ""}.fa-fire-flame-curved,.fa-fire-alt{--fa: ""}.fa-tornado{--fa: ""}.fa-file-circle-plus{--fa: ""}.fa-book-quran,.fa-quran{--fa: ""}.fa-anchor{--fa: ""}.fa-border-all{--fa: ""}.fa-face-angry,.fa-angry{--fa: ""}.fa-cookie-bite{--fa: ""}.fa-arrow-trend-down{--fa: ""}.fa-rss,.fa-feed{--fa: ""}.fa-draw-polygon{--fa: ""}.fa-scale-balanced,.fa-balance-scale{--fa: ""}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa: ""}.fa-shower{--fa: ""}.fa-desktop,.fa-desktop-alt{--fa: ""}.fa-m{--fa: "M"}.fa-table-list,.fa-th-list{--fa: ""}.fa-comment-sms,.fa-sms{--fa: ""}.fa-book{--fa: ""}.fa-user-plus{--fa: ""}.fa-check{--fa: ""}.fa-battery-three-quarters,.fa-battery-4{--fa: ""}.fa-house-circle-check{--fa: ""}.fa-angle-left{--fa: ""}.fa-diagram-successor{--fa: ""}.fa-truck-arrow-right{--fa: ""}.fa-arrows-split-up-and-left{--fa: ""}.fa-hand-fist,.fa-fist-raised{--fa: ""}.fa-cloud-moon{--fa: ""}.fa-briefcase{--fa: ""}.fa-person-falling{--fa: ""}.fa-image-portrait,.fa-portrait{--fa: ""}.fa-user-tag{--fa: ""}.fa-rug{--fa: ""}.fa-earth-europe,.fa-globe-europe{--fa: ""}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa: ""}.fa-rectangle-xmark,.fa-rectangle-times,.fa-times-rectangle,.fa-window-close{--fa: ""}.fa-baht-sign{--fa: ""}.fa-book-open{--fa: ""}.fa-book-journal-whills,.fa-journal-whills{--fa: ""}.fa-handcuffs{--fa: ""}.fa-triangle-exclamation,.fa-exclamation-triangle,.fa-warning{--fa: ""}.fa-database{--fa: ""}.fa-share,.fa-mail-forward{--fa: ""}.fa-bottle-droplet{--fa: ""}.fa-mask-face{--fa: ""}.fa-hill-rockslide{--fa: ""}.fa-right-left,.fa-exchange-alt{--fa: ""}.fa-paper-plane{--fa: ""}.fa-road-circle-exclamation{--fa: ""}.fa-dungeon{--fa: ""}.fa-align-right{--fa: ""}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa: ""}.fa-life-ring{--fa: ""}.fa-hands,.fa-sign-language,.fa-signing{--fa: ""}.fa-calendar-day{--fa: ""}.fa-water-ladder,.fa-ladder-water,.fa-swimming-pool{--fa: ""}.fa-arrows-up-down,.fa-arrows-v{--fa: ""}.fa-face-grimace,.fa-grimace{--fa: ""}.fa-wheelchair-move,.fa-wheelchair-alt{--fa: ""}.fa-turn-down,.fa-level-down-alt{--fa: ""}.fa-person-walking-arrow-right{--fa: ""}.fa-square-envelope,.fa-envelope-square{--fa: ""}.fa-dice{--fa: ""}.fa-bowling-ball{--fa: ""}.fa-brain{--fa: ""}.fa-bandage,.fa-band-aid{--fa: ""}.fa-calendar-minus{--fa: ""}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa: ""}.fa-gifts{--fa: ""}.fa-hotel{--fa: ""}.fa-earth-asia,.fa-globe-asia{--fa: ""}.fa-id-card-clip,.fa-id-card-alt{--fa: ""}.fa-magnifying-glass-plus,.fa-search-plus{--fa: ""}.fa-thumbs-up{--fa: ""}.fa-user-clock{--fa: ""}.fa-hand-dots,.fa-allergies{--fa: ""}.fa-file-invoice{--fa: ""}.fa-window-minimize{--fa: ""}.fa-mug-saucer,.fa-coffee{--fa: ""}.fa-brush{--fa: ""}.fa-file-half-dashed{--fa: ""}.fa-mask{--fa: ""}.fa-magnifying-glass-minus,.fa-search-minus{--fa: ""}.fa-ruler-vertical{--fa: ""}.fa-user-large,.fa-user-alt{--fa: ""}.fa-train-tram{--fa: ""}.fa-user-nurse{--fa: ""}.fa-syringe{--fa: ""}.fa-cloud-sun{--fa: ""}.fa-stopwatch-20{--fa: ""}.fa-square-full{--fa: ""}.fa-magnet{--fa: ""}.fa-jar{--fa: ""}.fa-note-sticky,.fa-sticky-note{--fa: ""}.fa-bug-slash{--fa: ""}.fa-arrow-up-from-water-pump{--fa: ""}.fa-bone{--fa: ""}.fa-table-cells-row-unlock{--fa: ""}.fa-user-injured{--fa: ""}.fa-face-sad-tear,.fa-sad-tear{--fa: ""}.fa-plane{--fa: ""}.fa-tent-arrows-down{--fa: ""}.fa-exclamation{--fa: "!"}.fa-arrows-spin{--fa: ""}.fa-print{--fa: ""}.fa-turkish-lira-sign,.fa-try,.fa-turkish-lira{--fa: ""}.fa-dollar-sign,.fa-dollar,.fa-usd{--fa: "$"}.fa-x{--fa: "X"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa: ""}.fa-users-gear,.fa-users-cog{--fa: ""}.fa-person-military-pointing{--fa: ""}.fa-building-columns,.fa-bank,.fa-institution,.fa-museum,.fa-university{--fa: ""}.fa-umbrella{--fa: ""}.fa-trowel{--fa: ""}.fa-d{--fa: "D"}.fa-stapler{--fa: ""}.fa-masks-theater,.fa-theater-masks{--fa: ""}.fa-kip-sign{--fa: ""}.fa-hand-point-left{--fa: ""}.fa-handshake-simple,.fa-handshake-alt{--fa: ""}.fa-jet-fighter,.fa-fighter-jet{--fa: ""}.fa-square-share-nodes,.fa-share-alt-square{--fa: ""}.fa-barcode{--fa: ""}.fa-plus-minus{--fa: ""}.fa-video,.fa-video-camera{--fa: ""}.fa-graduation-cap,.fa-mortar-board{--fa: ""}.fa-hand-holding-medical{--fa: ""}.fa-person-circle-check{--fa: ""}.fa-turn-up,.fa-level-up-alt{--fa: ""}.sr-only,.fa-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:root,:host{--fa-style-family-brands: "Font Awesome 6 Brands";--fa-font-brands: normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}.fab,.fa-brands{font-weight:400}.fa-monero{--fa: ""}.fa-hooli{--fa: ""}.fa-yelp{--fa: ""}.fa-cc-visa{--fa: ""}.fa-lastfm{--fa: ""}.fa-shopware{--fa: ""}.fa-creative-commons-nc{--fa: ""}.fa-aws{--fa: ""}.fa-redhat{--fa: ""}.fa-yoast{--fa: ""}.fa-cloudflare{--fa: ""}.fa-ups{--fa: ""}.fa-pixiv{--fa: ""}.fa-wpexplorer{--fa: ""}.fa-dyalog{--fa: ""}.fa-bity{--fa: ""}.fa-stackpath{--fa: ""}.fa-buysellads{--fa: ""}.fa-first-order{--fa: ""}.fa-modx{--fa: ""}.fa-guilded{--fa: ""}.fa-vnv{--fa: ""}.fa-square-js,.fa-js-square{--fa: ""}.fa-microsoft{--fa: ""}.fa-qq{--fa: ""}.fa-orcid{--fa: ""}.fa-java{--fa: ""}.fa-invision{--fa: ""}.fa-creative-commons-pd-alt{--fa: ""}.fa-centercode{--fa: ""}.fa-glide-g{--fa: ""}.fa-drupal{--fa: ""}.fa-jxl{--fa: ""}.fa-dart-lang{--fa: ""}.fa-hire-a-helper{--fa: ""}.fa-creative-commons-by{--fa: ""}.fa-unity{--fa: ""}.fa-whmcs{--fa: ""}.fa-rocketchat{--fa: ""}.fa-vk{--fa: ""}.fa-untappd{--fa: ""}.fa-mailchimp{--fa: ""}.fa-css3-alt{--fa: ""}.fa-square-reddit,.fa-reddit-square{--fa: ""}.fa-vimeo-v{--fa: ""}.fa-contao{--fa: ""}.fa-square-font-awesome{--fa: ""}.fa-deskpro{--fa: ""}.fa-brave{--fa: ""}.fa-sistrix{--fa: ""}.fa-square-instagram,.fa-instagram-square{--fa: ""}.fa-battle-net{--fa: ""}.fa-the-red-yeti{--fa: ""}.fa-square-hacker-news,.fa-hacker-news-square{--fa: ""}.fa-edge{--fa: ""}.fa-threads{--fa: ""}.fa-napster{--fa: ""}.fa-square-snapchat,.fa-snapchat-square{--fa: ""}.fa-google-plus-g{--fa: ""}.fa-artstation{--fa: ""}.fa-markdown{--fa: ""}.fa-sourcetree{--fa: ""}.fa-google-plus{--fa: ""}.fa-diaspora{--fa: ""}.fa-foursquare{--fa: ""}.fa-stack-overflow{--fa: ""}.fa-github-alt{--fa: ""}.fa-phoenix-squadron{--fa: ""}.fa-pagelines{--fa: ""}.fa-algolia{--fa: ""}.fa-red-river{--fa: ""}.fa-creative-commons-sa{--fa: ""}.fa-safari{--fa: ""}.fa-google{--fa: ""}.fa-square-font-awesome-stroke,.fa-font-awesome-alt{--fa: ""}.fa-atlassian{--fa: ""}.fa-linkedin-in{--fa: ""}.fa-digital-ocean{--fa: ""}.fa-nimblr{--fa: ""}.fa-chromecast{--fa: ""}.fa-evernote{--fa: ""}.fa-hacker-news{--fa: ""}.fa-creative-commons-sampling{--fa: ""}.fa-adversal{--fa: ""}.fa-creative-commons{--fa: ""}.fa-watchman-monitoring{--fa: ""}.fa-fonticons{--fa: ""}.fa-weixin{--fa: ""}.fa-shirtsinbulk{--fa: ""}.fa-codepen{--fa: ""}.fa-git-alt{--fa: ""}.fa-lyft{--fa: ""}.fa-rev{--fa: ""}.fa-windows{--fa: ""}.fa-wizards-of-the-coast{--fa: ""}.fa-square-viadeo,.fa-viadeo-square{--fa: ""}.fa-meetup{--fa: ""}.fa-centos{--fa: ""}.fa-adn{--fa: ""}.fa-cloudsmith{--fa: ""}.fa-opensuse{--fa: ""}.fa-pied-piper-alt{--fa: ""}.fa-square-dribbble,.fa-dribbble-square{--fa: ""}.fa-codiepie{--fa: ""}.fa-node{--fa: ""}.fa-mix{--fa: ""}.fa-steam{--fa: ""}.fa-cc-apple-pay{--fa: ""}.fa-scribd{--fa: ""}.fa-debian{--fa: ""}.fa-openid{--fa: ""}.fa-instalod{--fa: ""}.fa-files-pinwheel{--fa: ""}.fa-expeditedssl{--fa: ""}.fa-sellcast{--fa: ""}.fa-square-twitter,.fa-twitter-square{--fa: ""}.fa-r-project{--fa: ""}.fa-delicious{--fa: ""}.fa-freebsd{--fa: ""}.fa-vuejs{--fa: ""}.fa-accusoft{--fa: ""}.fa-ioxhost{--fa: ""}.fa-fonticons-fi{--fa: ""}.fa-app-store{--fa: ""}.fa-cc-mastercard{--fa: ""}.fa-itunes-note{--fa: ""}.fa-golang{--fa: ""}.fa-kickstarter,.fa-square-kickstarter{--fa: ""}.fa-grav{--fa: ""}.fa-weibo{--fa: ""}.fa-uncharted{--fa: ""}.fa-firstdraft{--fa: ""}.fa-square-youtube,.fa-youtube-square{--fa: ""}.fa-wikipedia-w{--fa: ""}.fa-wpressr,.fa-rendact{--fa: ""}.fa-angellist{--fa: ""}.fa-galactic-republic{--fa: ""}.fa-nfc-directional{--fa: ""}.fa-skype{--fa: ""}.fa-joget{--fa: ""}.fa-fedora{--fa: ""}.fa-stripe-s{--fa: ""}.fa-meta{--fa: ""}.fa-laravel{--fa: ""}.fa-hotjar{--fa: ""}.fa-bluetooth-b{--fa: ""}.fa-square-letterboxd{--fa: ""}.fa-sticker-mule{--fa: ""}.fa-creative-commons-zero{--fa: ""}.fa-hips{--fa: ""}.fa-css{--fa: ""}.fa-behance{--fa: ""}.fa-reddit{--fa: ""}.fa-discord{--fa: ""}.fa-chrome{--fa: ""}.fa-app-store-ios{--fa: ""}.fa-cc-discover{--fa: ""}.fa-wpbeginner{--fa: ""}.fa-confluence{--fa: ""}.fa-shoelace{--fa: ""}.fa-mdb{--fa: ""}.fa-dochub{--fa: ""}.fa-accessible-icon{--fa: ""}.fa-ebay{--fa: ""}.fa-amazon{--fa: ""}.fa-unsplash{--fa: ""}.fa-yarn{--fa: ""}.fa-square-steam,.fa-steam-square{--fa: ""}.fa-500px{--fa: ""}.fa-square-vimeo,.fa-vimeo-square{--fa: ""}.fa-asymmetrik{--fa: ""}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa: ""}.fa-gratipay{--fa: ""}.fa-apple{--fa: ""}.fa-hive{--fa: ""}.fa-gitkraken{--fa: ""}.fa-keybase{--fa: ""}.fa-apple-pay{--fa: ""}.fa-padlet{--fa: ""}.fa-amazon-pay{--fa: ""}.fa-square-github,.fa-github-square{--fa: ""}.fa-stumbleupon{--fa: ""}.fa-fedex{--fa: ""}.fa-phoenix-framework{--fa: ""}.fa-shopify{--fa: ""}.fa-neos{--fa: ""}.fa-square-threads{--fa: ""}.fa-hackerrank{--fa: ""}.fa-researchgate{--fa: ""}.fa-swift{--fa: ""}.fa-angular{--fa: ""}.fa-speakap{--fa: ""}.fa-angrycreative{--fa: ""}.fa-y-combinator{--fa: ""}.fa-empire{--fa: ""}.fa-envira{--fa: ""}.fa-google-scholar{--fa: ""}.fa-square-gitlab,.fa-gitlab-square{--fa: ""}.fa-studiovinari{--fa: ""}.fa-pied-piper{--fa: ""}.fa-wordpress{--fa: ""}.fa-product-hunt{--fa: ""}.fa-firefox{--fa: ""}.fa-linode{--fa: ""}.fa-goodreads{--fa: ""}.fa-square-odnoklassniki,.fa-odnoklassniki-square{--fa: ""}.fa-jsfiddle{--fa: ""}.fa-sith{--fa: ""}.fa-themeisle{--fa: ""}.fa-page4{--fa: ""}.fa-hashnode{--fa: ""}.fa-react{--fa: ""}.fa-cc-paypal{--fa: ""}.fa-squarespace{--fa: ""}.fa-cc-stripe{--fa: ""}.fa-creative-commons-share{--fa: ""}.fa-bitcoin{--fa: ""}.fa-keycdn{--fa: ""}.fa-opera{--fa: ""}.fa-itch-io{--fa: ""}.fa-umbraco{--fa: ""}.fa-galactic-senate{--fa: ""}.fa-ubuntu{--fa: ""}.fa-draft2digital{--fa: ""}.fa-stripe{--fa: ""}.fa-houzz{--fa: ""}.fa-gg{--fa: ""}.fa-dhl{--fa: ""}.fa-square-pinterest,.fa-pinterest-square{--fa: ""}.fa-xing{--fa: ""}.fa-blackberry{--fa: ""}.fa-creative-commons-pd{--fa: ""}.fa-playstation{--fa: ""}.fa-quinscape{--fa: ""}.fa-less{--fa: ""}.fa-blogger-b{--fa: ""}.fa-opencart{--fa: ""}.fa-vine{--fa: ""}.fa-signal-messenger{--fa: ""}.fa-paypal{--fa: ""}.fa-gitlab{--fa: ""}.fa-typo3{--fa: ""}.fa-reddit-alien{--fa: ""}.fa-yahoo{--fa: ""}.fa-dailymotion{--fa: ""}.fa-affiliatetheme{--fa: ""}.fa-pied-piper-pp{--fa: ""}.fa-bootstrap{--fa: ""}.fa-odnoklassniki{--fa: ""}.fa-nfc-symbol{--fa: ""}.fa-mintbit{--fa: ""}.fa-ethereum{--fa: ""}.fa-speaker-deck{--fa: ""}.fa-creative-commons-nc-eu{--fa: ""}.fa-patreon{--fa: ""}.fa-avianex{--fa: ""}.fa-ello{--fa: ""}.fa-gofore{--fa: ""}.fa-bimobject{--fa: ""}.fa-brave-reverse{--fa: ""}.fa-facebook-f{--fa: ""}.fa-square-google-plus,.fa-google-plus-square{--fa: ""}.fa-web-awesome{--fa: ""}.fa-mandalorian{--fa: ""}.fa-first-order-alt{--fa: ""}.fa-osi{--fa: ""}.fa-google-wallet{--fa: ""}.fa-d-and-d-beyond{--fa: ""}.fa-periscope{--fa: ""}.fa-fulcrum{--fa: ""}.fa-cloudscale{--fa: ""}.fa-forumbee{--fa: ""}.fa-mizuni{--fa: ""}.fa-schlix{--fa: ""}.fa-square-xing,.fa-xing-square{--fa: ""}.fa-bandcamp{--fa: ""}.fa-wpforms{--fa: ""}.fa-cloudversify{--fa: ""}.fa-usps{--fa: ""}.fa-megaport{--fa: ""}.fa-magento{--fa: ""}.fa-spotify{--fa: ""}.fa-optin-monster{--fa: ""}.fa-fly{--fa: ""}.fa-square-bluesky{--fa: ""}.fa-aviato{--fa: ""}.fa-itunes{--fa: ""}.fa-cuttlefish{--fa: ""}.fa-blogger{--fa: ""}.fa-flickr{--fa: ""}.fa-viber{--fa: ""}.fa-soundcloud{--fa: ""}.fa-digg{--fa: ""}.fa-tencent-weibo{--fa: ""}.fa-letterboxd{--fa: ""}.fa-symfony{--fa: ""}.fa-maxcdn{--fa: ""}.fa-etsy{--fa: ""}.fa-facebook-messenger{--fa: ""}.fa-audible{--fa: ""}.fa-think-peaks{--fa: ""}.fa-bilibili{--fa: ""}.fa-erlang{--fa: ""}.fa-x-twitter{--fa: ""}.fa-cotton-bureau{--fa: ""}.fa-dashcube{--fa: ""}.fa-42-group,.fa-innosoft{--fa: ""}.fa-stack-exchange{--fa: ""}.fa-elementor{--fa: ""}.fa-square-pied-piper,.fa-pied-piper-square{--fa: ""}.fa-creative-commons-nd{--fa: ""}.fa-palfed{--fa: ""}.fa-superpowers{--fa: ""}.fa-resolving{--fa: ""}.fa-xbox{--fa: ""}.fa-square-web-awesome-stroke{--fa: ""}.fa-searchengin{--fa: ""}.fa-tiktok{--fa: ""}.fa-square-facebook,.fa-facebook-square{--fa: ""}.fa-renren{--fa: ""}.fa-linux{--fa: ""}.fa-glide{--fa: ""}.fa-linkedin{--fa: ""}.fa-hubspot{--fa: ""}.fa-deploydog{--fa: ""}.fa-twitch{--fa: ""}.fa-flutter{--fa: ""}.fa-ravelry{--fa: ""}.fa-mixer{--fa: ""}.fa-square-lastfm,.fa-lastfm-square{--fa: ""}.fa-vimeo{--fa: ""}.fa-mendeley{--fa: ""}.fa-uniregistry{--fa: ""}.fa-figma{--fa: ""}.fa-creative-commons-remix{--fa: ""}.fa-cc-amazon-pay{--fa: ""}.fa-dropbox{--fa: ""}.fa-instagram{--fa: ""}.fa-cmplid{--fa: ""}.fa-upwork{--fa: ""}.fa-facebook{--fa: ""}.fa-gripfire{--fa: ""}.fa-jedi-order{--fa: ""}.fa-uikit{--fa: ""}.fa-fort-awesome-alt{--fa: ""}.fa-phabricator{--fa: ""}.fa-ussunnah{--fa: ""}.fa-earlybirds{--fa: ""}.fa-trade-federation{--fa: ""}.fa-autoprefixer{--fa: ""}.fa-whatsapp{--fa: ""}.fa-square-upwork{--fa: ""}.fa-slideshare{--fa: ""}.fa-google-play{--fa: ""}.fa-viadeo{--fa: ""}.fa-line{--fa: ""}.fa-google-drive{--fa: ""}.fa-servicestack{--fa: ""}.fa-simplybuilt{--fa: ""}.fa-bitbucket{--fa: ""}.fa-imdb{--fa: ""}.fa-deezer{--fa: ""}.fa-raspberry-pi{--fa: ""}.fa-jira{--fa: ""}.fa-docker{--fa: ""}.fa-screenpal{--fa: ""}.fa-bluetooth{--fa: ""}.fa-gitter{--fa: ""}.fa-d-and-d{--fa: ""}.fa-microblog{--fa: ""}.fa-cc-diners-club{--fa: ""}.fa-gg-circle{--fa: ""}.fa-pied-piper-hat{--fa: ""}.fa-kickstarter-k{--fa: ""}.fa-yandex{--fa: ""}.fa-readme{--fa: ""}.fa-html5{--fa: ""}.fa-sellsy{--fa: ""}.fa-square-web-awesome{--fa: ""}.fa-sass{--fa: ""}.fa-wirsindhandwerk,.fa-wsh{--fa: ""}.fa-buromobelexperte{--fa: ""}.fa-salesforce{--fa: ""}.fa-octopus-deploy{--fa: ""}.fa-medapps{--fa: ""}.fa-ns8{--fa: ""}.fa-pinterest-p{--fa: ""}.fa-apper{--fa: ""}.fa-fort-awesome{--fa: ""}.fa-waze{--fa: ""}.fa-bluesky{--fa: ""}.fa-cc-jcb{--fa: ""}.fa-snapchat,.fa-snapchat-ghost{--fa: ""}.fa-fantasy-flight-games{--fa: ""}.fa-rust{--fa: ""}.fa-wix{--fa: ""}.fa-square-behance,.fa-behance-square{--fa: ""}.fa-supple{--fa: ""}.fa-webflow{--fa: ""}.fa-rebel{--fa: ""}.fa-css3{--fa: ""}.fa-staylinked{--fa: ""}.fa-kaggle{--fa: ""}.fa-space-awesome{--fa: ""}.fa-deviantart{--fa: ""}.fa-cpanel{--fa: ""}.fa-goodreads-g{--fa: ""}.fa-square-git,.fa-git-square{--fa: ""}.fa-square-tumblr,.fa-tumblr-square{--fa: ""}.fa-trello{--fa: ""}.fa-creative-commons-nc-jp{--fa: ""}.fa-get-pocket{--fa: ""}.fa-perbyte{--fa: ""}.fa-grunt{--fa: ""}.fa-weebly{--fa: ""}.fa-connectdevelop{--fa: ""}.fa-leanpub{--fa: ""}.fa-black-tie{--fa: ""}.fa-themeco{--fa: ""}.fa-python{--fa: ""}.fa-android{--fa: ""}.fa-bots{--fa: ""}.fa-free-code-camp{--fa: ""}.fa-hornbill{--fa: ""}.fa-js{--fa: ""}.fa-ideal{--fa: ""}.fa-git{--fa: ""}.fa-dev{--fa: ""}.fa-sketch{--fa: ""}.fa-yandex-international{--fa: ""}.fa-cc-amex{--fa: ""}.fa-uber{--fa: ""}.fa-github{--fa: ""}.fa-php{--fa: ""}.fa-alipay{--fa: ""}.fa-youtube{--fa: ""}.fa-skyatlas{--fa: ""}.fa-firefox-browser{--fa: ""}.fa-replyd{--fa: ""}.fa-suse{--fa: ""}.fa-jenkins{--fa: ""}.fa-twitter{--fa: ""}.fa-rockrms{--fa: ""}.fa-pinterest{--fa: ""}.fa-buffer{--fa: ""}.fa-npm{--fa: ""}.fa-yammer{--fa: ""}.fa-btc{--fa: ""}.fa-dribbble{--fa: ""}.fa-stumbleupon-circle{--fa: ""}.fa-internet-explorer{--fa: ""}.fa-stubber{--fa: ""}.fa-telegram,.fa-telegram-plane{--fa: ""}.fa-old-republic{--fa: ""}.fa-odysee{--fa: ""}.fa-square-whatsapp,.fa-whatsapp-square{--fa: ""}.fa-node-js{--fa: ""}.fa-edge-legacy{--fa: ""}.fa-slack,.fa-slack-hash{--fa: ""}.fa-medrt{--fa: ""}.fa-usb{--fa: ""}.fa-tumblr{--fa: ""}.fa-vaadin{--fa: ""}.fa-quora{--fa: ""}.fa-square-x-twitter{--fa: ""}.fa-reacteurope{--fa: ""}.fa-medium,.fa-medium-m{--fa: ""}.fa-amilia{--fa: ""}.fa-mixcloud{--fa: ""}.fa-flipboard{--fa: ""}.fa-viacoin{--fa: ""}.fa-critical-role{--fa: ""}.fa-sitrox{--fa: ""}.fa-discourse{--fa: ""}.fa-joomla{--fa: ""}.fa-mastodon{--fa: ""}.fa-airbnb{--fa: ""}.fa-wolf-pack-battalion{--fa: ""}.fa-buy-n-large{--fa: ""}.fa-gulp{--fa: ""}.fa-creative-commons-sampling-plus{--fa: ""}.fa-strava{--fa: ""}.fa-ember{--fa: ""}.fa-canadian-maple-leaf{--fa: ""}.fa-teamspeak{--fa: ""}.fa-pushed{--fa: ""}.fa-wordpress-simple{--fa: ""}.fa-nutritionix{--fa: ""}.fa-wodu{--fa: ""}.fa-google-pay{--fa: ""}.fa-intercom{--fa: ""}.fa-zhihu{--fa: ""}.fa-korvue{--fa: ""}.fa-pix{--fa: ""}.fa-steam-symbol{--fa: ""}:root,:host{--fa-style-family-classic: "Font Awesome 6 Free";--fa-font-regular: normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype")}.far,.fa-regular{font-weight:400}:root,:host{--fa-style-family-classic: "Font Awesome 6 Free";--fa-font-solid: normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}.fas,.fa-solid{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-solid-900-CTAAxXor.woff2) format("woff2"),url(/admin-next/assets/fa-solid-900-D0aA9rwL.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-brands-400-D_cYUPeE.woff2) format("woff2"),url(/admin-next/assets/fa-brands-400-D1LuMI3I.ttf) format("truetype")}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-regular-400-BjRzuEpd.woff2) format("woff2"),url(/admin-next/assets/fa-regular-400-DZaxPHgR.ttf) format("truetype");unicode-range:U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC}@font-face{font-family:FontAwesome;font-display:block;src:url(/admin-next/assets/fa-v4compatibility-C9RhG_FT.woff2) format("woff2"),url(/admin-next/assets/fa-v4compatibility-CCth-dXg.ttf) format("truetype");unicode-range:U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A}.el-button--primary{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);border-color:transparent}.el-button--primary:hover,.el-button--primary:focus{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);opacity:.9}.hover\:border-indigo-300:hover{--tw-border-opacity: 1;border-color:rgb(165 180 252 / var(--tw-border-opacity, 1))}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-200:hover{--tw-bg-opacity: 1;background-color:rgb(191 219 254 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-50:hover{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-600:hover{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.hover\:bg-green-200:hover{--tw-bg-opacity: 1;background-color:rgb(187 247 208 / var(--tw-bg-opacity, 1))}.hover\:bg-green-50:hover{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.hover\:bg-green-600:hover{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-200:hover{--tw-bg-opacity: 1;background-color:rgb(233 213 255 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-50:hover{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.hover\:bg-red-200:hover{--tw-bg-opacity: 1;background-color:rgb(254 202 202 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600:hover{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/50:hover{background-color:#ffffff80}.hover\:from-yellow-600:hover{--tw-gradient-from: #ca8a04 var(--tw-gradient-from-position);--tw-gradient-to: rgb(202 138 4 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.hover\:to-orange-600:hover{--tw-gradient-to: #ea580c var(--tw-gradient-to-position)}.hover\:text-blue-700:hover{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.hover\:text-blue-900:hover{--tw-text-opacity: 1;color:rgb(30 58 138 / var(--tw-text-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-green-700:hover{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.hover\:text-green-900:hover{--tw-text-opacity: 1;color:rgb(20 83 45 / var(--tw-text-opacity, 1))}.hover\:text-indigo-800:hover{--tw-text-opacity: 1;color:rgb(55 48 163 / var(--tw-text-opacity, 1))}.hover\:text-purple-900:hover{--tw-text-opacity: 1;color:rgb(88 28 135 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-red-900:hover{--tw-text-opacity: 1;color:rgb(127 29 29 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-blue-500:focus{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}}@media (min-width: 1024px){.lg\:col-span-1{grid-column:span 1 / span 1}.lg\:col-span-3{grid-column:span 3 / span 3}.lg\:block{display:block}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}:root{--primary-color: #667eea;--secondary-color: #764ba2;--accent-color: #f093fb;--success-color: #10b981;--warning-color: #f59e0b;--error-color: #ef4444;--surface-color: rgba(255, 255, 255, .95);--glass-color: rgba(255, 255, 255, .1);--text-primary: #1f2937;--text-secondary: #6b7280;--border-color: rgba(255, 255, 255, .2)}body,div,button,input,select,textarea,table,tr,td,th,span,p,h1,h2,h3,h4,h5,h6{transition:all .3s cubic-bezier(.4,0,.2,1)}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 50%,var(--accent-color) 100%);background-attachment:fixed;min-height:100vh;margin:0;overflow-x:hidden}body:before{content:"";position:fixed;top:0;left:0;right:0;bottom:0;background:radial-gradient(circle at 20% 80%,rgba(240,147,251,.2) 0%,transparent 50%),radial-gradient(circle at 80% 20%,rgba(102,126,234,.2) 0%,transparent 50%),radial-gradient(circle at 40% 40%,rgba(118,75,162,.1) 0%,transparent 50%);pointer-events:none;z-index:-1}.glass{background:var(--glass-color);-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);border:1px solid var(--border-color);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a,inset 0 1px #ffffff1a}.glass-strong{background:var(--surface-color);-webkit-backdrop-filter:blur(25px);backdrop-filter:blur(25px);border:1px solid rgba(255,255,255,.3);box-shadow:0 25px 50px -12px #00000040,0 0 0 1px #ffffff0d,inset 0 1px #ffffff1a}.tab-btn{position:relative;overflow:hidden;border-radius:12px;font-weight:500;letter-spacing:.025em}.tab-btn:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s}.tab-btn:hover:before{left:100%}.tab-btn.active{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);color:#fff;box-shadow:0 10px 15px -3px #667eea4d,0 4px 6px -2px #667eea0d;transform:translateY(-1px)}.card{background:var(--surface-color);border-radius:16px;border:1px solid rgba(255,255,255,.2);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;overflow:hidden;position:relative}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(255,255,255,.5),transparent)}.stat-card{background:linear-gradient(135deg,#fffffff2,#fffc);border-radius:20px;border:1px solid rgba(255,255,255,.3);padding:24px;position:relative;overflow:hidden;transition:all .3s ease}.stat-card:before{content:"";position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,rgba(255,255,255,.1) 0%,transparent 70%);opacity:0;transition:opacity .3s ease}.stat-card:hover{transform:translateY(-4px);box-shadow:0 20px 25px -5px #0000001a,0 10px 10px -5px #0000000a}.stat-card:hover:before{opacity:1}.stat-icon{width:56px;height:56px;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:24px;color:#fff;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.btn{font-weight:500;border-radius:12px;border:none;cursor:pointer;transition:all .3s ease;position:relative;overflow:hidden;letter-spacing:.025em}.btn:before{content:"";position:absolute;top:50%;left:50%;width:0;height:0;background:#fff3;border-radius:50%;transform:translate(-50%,-50%);transition:width .3s ease,height .3s ease}.btn:active:before{width:300px;height:300px}.btn-primary{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);color:#fff;box-shadow:0 10px 15px -3px #667eea4d,0 4px 6px -2px #667eea0d}.btn-primary:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #667eea4d,0 10px 10px -5px #667eea1a}.btn-success{background:linear-gradient(135deg,var(--success-color) 0%,#059669 100%);color:#fff;box-shadow:0 10px 15px -3px #10b9814d,0 4px 6px -2px #10b9810d}.btn-success:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #10b9814d,0 10px 10px -5px #10b9811a}.btn-danger{background:linear-gradient(135deg,var(--error-color) 0%,#dc2626 100%);color:#fff;box-shadow:0 10px 15px -3px #ef44444d,0 4px 6px -2px #ef44440d}.btn-danger:hover{transform:translateY(-1px);box-shadow:0 20px 25px -5px #ef44444d,0 10px 10px -5px #ef44441a}.form-input{background:#ffffffe6;border:2px solid rgba(255,255,255,.3);border-radius:12px;padding:16px;font-size:16px;transition:all .3s ease;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.form-input:focus{outline:none;border-color:var(--primary-color);box-shadow:0 0 0 3px #667eea1a,0 10px 15px -3px #0000001a;background:#fffffff2}.table-container{background:#fffffff2;border-radius:16px;overflow:hidden;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.table-row{transition:all .2s ease}.table-row:hover{background:#667eea0d;transform:scale(1.005)}.modal{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0006}.modal-content{background:#fffffff2;border-radius:24px;border:1px solid rgba(255,255,255,.3);box-shadow:0 25px 50px -12px #00000040,0 0 0 1px #ffffff0d;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.header-title{background:linear-gradient(135deg,var(--primary-color) 0%,var(--secondary-color) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:700;letter-spacing:-.025em}.loading-spinner{display:inline-block;width:20px;height:20px;border:2px solid rgba(255,255,255,.3);border-radius:50%;border-top:2px solid white;animation:spin 1s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-up-enter-active,.slide-up-leave-active{transition:all .3s ease}.slide-up-enter-from{opacity:0;transform:translateY(30px)}.slide-up-leave-to{opacity:0;transform:translateY(-30px)}.toast{position:fixed;top:80px;right:20px;z-index:1000;min-width:320px;max-width:500px;transform:translate(100%);transition:transform .3s ease-in-out}.toast.show{transform:translate(0)}.toast-success{background:linear-gradient(135deg,#10b981,#059669);color:#fff;border:1px solid rgba(16,185,129,.3)}.toast-error{background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;border:1px solid rgba(239,68,68,.3)}.toast-info{background:linear-gradient(135deg,#3b82f6,#2563eb);color:#fff;border:1px solid rgba(59,130,246,.3)}.toast-warning{background:linear-gradient(135deg,#f59e0b,#d97706);color:#fff;border:1px solid rgba(245,158,11,.3)}[v-cloak]{display:none}.custom-scrollbar{scrollbar-width:thin;scrollbar-color:rgba(102,126,234,.3) rgba(102,126,234,.05)}.custom-scrollbar::-webkit-scrollbar{width:8px;height:8px}.custom-scrollbar::-webkit-scrollbar-track{background:#667eea0d;border-radius:10px}.custom-scrollbar::-webkit-scrollbar-thumb{background:linear-gradient(135deg,#667eea66,#764ba266);border-radius:10px;-webkit-transition:background .3s ease;transition:background .3s ease}.custom-scrollbar::-webkit-scrollbar-thumb:hover{background:linear-gradient(135deg,#667eea99,#764ba299)}.custom-scrollbar::-webkit-scrollbar-thumb:active{background:linear-gradient(135deg,#667eeacc,#764ba2cc)}.modal-scroll-content{max-height:calc(90vh - 160px);overflow-y:auto;padding-right:8px}@media (max-width: 768px){.glass,.glass-strong{margin:16px;border-radius:20px}.stat-card{padding:16px}.tab-btn{font-size:14px;padding:12px 8px}.modal-scroll-content{max-height:calc(85vh - 120px)}}@keyframes pulse{0%{transform:scale(1);opacity:1}50%{transform:scale(1.1);opacity:.8}to{transform:scale(1);opacity:1}}.animate-pulse{animation:pulse 2s infinite}.user-menu-dropdown{min-width:240px;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d}.tab-content{animation:fadeIn .3s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}} diff --git a/web/admin-spa/dist/index.html b/web/admin-spa/dist/index.html index 4132f9b1..5ea2c4cc 100644 --- a/web/admin-spa/dist/index.html +++ b/web/admin-spa/dist/index.html @@ -18,12 +18,12 @@ - + - +
diff --git a/web/admin-spa/src/components/accounts/AccountForm.vue b/web/admin-spa/src/components/accounts/AccountForm.vue index d1db80d8..2f618a75 100644 --- a/web/admin-spa/src/components/accounts/AccountForm.vue +++ b/web/admin-spa/src/components/accounts/AccountForm.vue @@ -53,6 +53,15 @@ > Claude +