From f5cb1042ae5e79cce05c0cb0bf13bd2da871ed59 Mon Sep 17 00:00:00 2001 From: tony Date: Sun, 14 Dec 2025 19:52:54 +0800 Subject: [PATCH] Upload latest code and optimized prompts (v6) --- .gitignore | 23 + README.md | 34 + check_buckets.js | 20 + debug-api.js | 71 + design.md | 2 + golden-description.txt | 23 + lib/batch-processor.js | 332 ++ lib/brain.js | 332 ++ lib/constraint-injector.js | 369 ++ lib/image-processor.js | 338 ++ lib/template-config.js | 629 +++ lib/vision-extractor.js | 198 + package-lock.json | 3811 ++++++++++++++++++ package.json | 19 + poc-workflow-v2.js | 395 ++ poc-workflow-v3.js | 482 +++ poc-workflow-v4.js | 399 ++ poc-workflow-v5.js | 687 ++++ poc-workflow-v6.js | 876 ++++ poc-workflow.js | 383 ++ product.md | 29 + prompt.md | 41 + prompts/brain-system.md | 0 prompts/constraints/brand-vi.md | 145 + prompts/constraints/competitor-compliance.md | 0 prompts/image-templates.js | 459 +++ prompts/v6-optimized.md | 486 +++ public/css/bootstrap-icons.css | 2018 ++++++++++ public/css/bootstrap.min.css | 6 + public/fonts/bootstrap-icons.woff | Bin 0 -> 164168 bytes public/fonts/bootstrap-icons.woff2 | Bin 0 -> 121084 bytes public/index.html | 845 ++++ public/js/axios.min.js | 3 + public/js/bootstrap.bundle.min.js | 7 + schemas/brain-output.schema.json | 119 + schemas/sku-input.schema.json | 219 + server.js | 624 +++ test-generate.js | 359 ++ test-vision-extract.js | 209 + test-vision-vs-manual.js | 240 ++ test_upload.js | 31 + vision-extract-result.json | 39 + 42 files changed, 15302 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 check_buckets.js create mode 100644 debug-api.js create mode 100644 design.md create mode 100644 golden-description.txt create mode 100644 lib/batch-processor.js create mode 100644 lib/brain.js create mode 100644 lib/constraint-injector.js create mode 100644 lib/image-processor.js create mode 100644 lib/template-config.js create mode 100644 lib/vision-extractor.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 poc-workflow-v2.js create mode 100644 poc-workflow-v3.js create mode 100644 poc-workflow-v4.js create mode 100644 poc-workflow-v5.js create mode 100644 poc-workflow-v6.js create mode 100644 poc-workflow.js create mode 100644 product.md create mode 100644 prompt.md create mode 100644 prompts/brain-system.md create mode 100644 prompts/constraints/brand-vi.md create mode 100644 prompts/constraints/competitor-compliance.md create mode 100644 prompts/image-templates.js create mode 100644 prompts/v6-optimized.md create mode 100644 public/css/bootstrap-icons.css create mode 100644 public/css/bootstrap.min.css create mode 100644 public/fonts/bootstrap-icons.woff create mode 100644 public/fonts/bootstrap-icons.woff2 create mode 100644 public/index.html create mode 100644 public/js/axios.min.js create mode 100644 public/js/bootstrap.bundle.min.js create mode 100644 schemas/brain-output.schema.json create mode 100644 schemas/sku-input.schema.json create mode 100644 server.js create mode 100644 test-generate.js create mode 100644 test-vision-extract.js create mode 100644 test-vision-vs-manual.js create mode 100644 test_upload.js create mode 100644 vision-extract-result.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1a665c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Dependencies +node_modules/ + +# Environment variables +.env + +# Generated files +output/ +output_*/ +output_v*/ +*.zip +*.jpg +*.png +*.JPG +*.PNG + +# System files +.DS_Store + +# Large assets +素材/ +pic/ +data/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..8e9aa5b --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# AI Image Generator Flow + +## Setup + +1. **Install Dependencies**: + ```bash + npm install + ``` + +2. **Environment Variables**: + A `.env` file has been created. Ensure the following keys are correct: + * `R2_ACCOUNT_ID`: Your Cloudflare Account ID. + * `R2_ACCESS_KEY_ID`: Your R2 Access Key ID. + * `R2_SECRET_ACCESS_KEY`: Your R2 Secret Access Key. + * `R2_BUCKET_NAME`: The name of your R2 bucket (Default: `ai-flow`). + * `API_KEY`: Your Wuyin Keji API Key. + +3. **Run Server**: + ```bash + node server.js + ``` + Access at `http://localhost:3000`. + +## Features + +1. **Upload**: Uploads reference images to Cloudflare R2. +2. **Prompt Generation**: Uses LLM to generate prompts based on `prompt.md` template. +3. **Image Generation**: Uses NanoBanana to generate images from prompts. +4. **History**: Saves generated images and prompts locally. +5. **Batch Download**: Download all generated images. + +## Notes +* Ensure your R2 bucket allows public access or configure a custom domain in `.env` as `R2_PUBLIC_DOMAIN`. +* The application saves state to browser `localStorage` to prevent data loss on refresh. diff --git a/check_buckets.js b/check_buckets.js new file mode 100644 index 0000000..5c9ecf7 --- /dev/null +++ b/check_buckets.js @@ -0,0 +1,20 @@ +require('dotenv').config(); +const { S3Client, ListBucketsCommand } = require('@aws-sdk/client-s3'); + +const client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, +}); + +(async () => { + try { + const data = await client.send(new ListBucketsCommand({})); + console.log('Buckets:', data.Buckets); + } catch (err) { + console.error('Error:', err); + } +})(); diff --git a/debug-api.js b/debug-api.js new file mode 100644 index 0000000..6dedd2d --- /dev/null +++ b/debug-api.js @@ -0,0 +1,71 @@ +/** + * API Debug Script + */ +require('dotenv').config(); +const axios = require('axios'); + +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +async function debug() { + console.log('🔍 Starting API Debug...'); + + // 1. Debug Vision + console.log('\n--- 1. Testing Vision API ---'); + try { + const res = await axios.post(`${API_BASE}/chat/index`, { + key: API_KEY, + model: 'gemini-1.5-flash', + content: 'Describe this image briefly.', + image_url: 'https://pub-777656770f4a44079545474665f00072.r2.dev/poc-1765607704915-IMG_6514.JPG' // 使用刚才日志里上传成功的图 + }); + console.log('Vision Response:', JSON.stringify(res.data, null, 2)); + } catch (e) { + console.error('Vision Error:', e.message, e.response?.data); + } + + // 2. Debug Image Submit + console.log('\n--- 2. Testing Image Submit ---'); + let taskId; + try { + const res = await axios.post(`${API_BASE}/img/nanoBanana-pro`, { + key: API_KEY, + prompt: 'A cute cat', + aspectRatio: '1:1' + }); + console.log('Submit Response:', JSON.stringify(res.data, null, 2)); + + // 尝试获取ID + if (res.data.data && typeof res.data.data === 'string') { + taskId = res.data.data; + } else if (res.data.data?.id) { + taskId = res.data.data.id; + } else if (res.data.id) { + taskId = res.data.id; + } + console.log('Extracted Task ID:', taskId); + } catch (e) { + console.error('Submit Error:', e.message, e.response?.data); + } + + // 3. Debug Poll + if (taskId) { + console.log('\n--- 3. Testing Poll ---'); + try { + // 等几秒让它处理 + await new Promise(r => setTimeout(r, 3000)); + + const res = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId } + }); + console.log('Poll Response:', JSON.stringify(res.data, null, 2)); + } catch (e) { + console.error('Poll Error:', e.message, e.response?.data); + } + } +} + +debug(); + + + diff --git a/design.md b/design.md new file mode 100644 index 0000000..bbd4555 --- /dev/null +++ b/design.md @@ -0,0 +1,2 @@ +## SKU颜色:纯蓝色 +### 需要设计4张主图(尺寸1600*1600,横向)和4张A+图(尺寸970*600,横向) diff --git a/golden-description.txt b/golden-description.txt new file mode 100644 index 0000000..22d30be --- /dev/null +++ b/golden-description.txt @@ -0,0 +1,23 @@ +EXACT PRODUCT APPEARANCE (AUTO-EXTRACTED BY VISION): + +- Shape: 7-PETAL FLOWER/FAN shape, C-shaped opening +- Color: PASTEL ICE BLUE (#C3E6E8) +- Material: soft matte/satin synthetic fabric (likely water-resistant polyester/nylon) fabric with smooth, padded/quilted panels texture +- Edge binding: Mint Green (slightly more saturated than body) ribbed knit elastic fabric around inner neck hole +- Closure: white velcro (hook and loop) on large rectangular strip covering the entire bottom-left terminal segment +- Logo: "TOUCHDOG®" embroidered on centered on the middle-right segment + +UNIQUE FEATURES: +- Scalloped outer edge resembling flower petals +- Soft ribbed knit neckline for comfort +- Radial stitching lines creating distinct padded zones +- Large surface area velcro for adjustable sizing + +SUMMARY FOR PROMPTS: +A soft, padded pet recovery collar in pastel ice blue with a scalloped, flower-like shape. It features a comfortable mint-green ribbed knit neck opening, sectioned padding for flexibility, and a prominent white velcro closure strip. + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes (must have C-opening) +- ❌ NO random brand logos or text \ No newline at end of file diff --git a/lib/batch-processor.js b/lib/batch-processor.js new file mode 100644 index 0000000..c91974f --- /dev/null +++ b/lib/batch-processor.js @@ -0,0 +1,332 @@ +/** + * 批量处理器 + * 支持5000+ SKU的批量图片生成 + */ + +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +/** + * 批量处理配置 + */ +const DEFAULT_CONFIG = { + concurrency: 1, // 并发数(建议保持1避免API限流) + retryCount: 3, // 失败重试次数 + retryDelay: 5000, // 重试延迟(毫秒) + imageDelay: 1500, // 图片间延迟(毫秒) + skuDelay: 3000, // SKU间延迟(毫秒) + saveProgress: true, // 是否保存进度 + progressFile: 'batch-progress.json' +}; + +/** + * 批量处理器类 + */ +class BatchProcessor { + constructor(serverUrl, config = {}) { + this.serverUrl = serverUrl || 'http://localhost:3000'; + this.config = { ...DEFAULT_CONFIG, ...config }; + this.progress = { + total: 0, + completed: 0, + failed: 0, + results: [] + }; + } + + /** + * 处理单个SKU + * @param {object} sku - SKU数据 + * @returns {Promise} 处理结果 + */ + async processSKU(sku) { + const startTime = Date.now(); + + try { + console.log(`Processing SKU: ${sku.sku_id}`); + + const response = await axios.post(`${this.serverUrl}/api/generate-sku`, { + sku + }, { + timeout: 600000 // 10分钟超时(12张图) + }); + + const duration = (Date.now() - startTime) / 1000; + console.log(`SKU ${sku.sku_id} completed in ${duration.toFixed(1)}s`); + + return { + sku_id: sku.sku_id, + status: 'success', + duration, + ...response.data + }; + + } catch (error) { + const duration = (Date.now() - startTime) / 1000; + console.error(`SKU ${sku.sku_id} failed after ${duration.toFixed(1)}s:`, error.message); + + return { + sku_id: sku.sku_id, + status: 'failed', + duration, + error: error.message + }; + } + } + + /** + * 带重试的处理单个SKU + * @param {object} sku - SKU数据 + * @returns {Promise} 处理结果 + */ + async processSKUWithRetry(sku) { + let lastError; + + for (let attempt = 1; attempt <= this.config.retryCount; attempt++) { + try { + const result = await this.processSKU(sku); + + if (result.status === 'success') { + return result; + } + + lastError = result.error; + + if (attempt < this.config.retryCount) { + console.log(`Retrying SKU ${sku.sku_id} (attempt ${attempt + 1}/${this.config.retryCount})...`); + await this.delay(this.config.retryDelay); + } + } catch (error) { + lastError = error.message; + + if (attempt < this.config.retryCount) { + console.log(`Retrying SKU ${sku.sku_id} (attempt ${attempt + 1}/${this.config.retryCount})...`); + await this.delay(this.config.retryDelay); + } + } + } + + return { + sku_id: sku.sku_id, + status: 'failed', + error: lastError, + attempts: this.config.retryCount + }; + } + + /** + * 批量处理SKU列表 + * @param {array} skus - SKU数据数组 + * @param {function} onProgress - 进度回调 + * @returns {Promise} 批量处理结果 + */ + async processBatch(skus, onProgress = null) { + this.progress = { + total: skus.length, + completed: 0, + failed: 0, + startTime: Date.now(), + results: [] + }; + + console.log(`\n${'='.repeat(60)}`); + console.log(`Starting batch processing: ${skus.length} SKUs`); + console.log(`${'='.repeat(60)}\n`); + + // 加载之前的进度(如果有) + const existingProgress = this.loadProgress(); + const processedIds = new Set(existingProgress.map(r => r.sku_id)); + + // 过滤掉已处理的SKU + const pendingSkus = skus.filter(sku => !processedIds.has(sku.sku_id)); + this.progress.results = existingProgress; + this.progress.completed = existingProgress.filter(r => r.status === 'success').length; + this.progress.failed = existingProgress.filter(r => r.status === 'failed').length; + + if (existingProgress.length > 0) { + console.log(`Resuming from previous progress: ${existingProgress.length} already processed`); + } + + // 串行处理(避免API限流) + for (let i = 0; i < pendingSkus.length; i++) { + const sku = pendingSkus[i]; + const overallIndex = existingProgress.length + i + 1; + + console.log(`\n[${overallIndex}/${skus.length}] Processing ${sku.sku_id}...`); + + const result = await this.processSKUWithRetry(sku); + this.progress.results.push(result); + + if (result.status === 'success') { + this.progress.completed++; + } else { + this.progress.failed++; + } + + // 保存进度 + if (this.config.saveProgress) { + this.saveProgress(); + } + + // 进度回调 + if (onProgress) { + onProgress({ + current: overallIndex, + total: skus.length, + completed: this.progress.completed, + failed: this.progress.failed, + lastResult: result + }); + } + + // SKU间延迟 + if (i < pendingSkus.length - 1) { + await this.delay(this.config.skuDelay); + } + } + + this.progress.endTime = Date.now(); + this.progress.totalDuration = (this.progress.endTime - this.progress.startTime) / 1000; + + console.log(`\n${'='.repeat(60)}`); + console.log(`Batch processing complete!`); + console.log(`Total: ${skus.length}, Success: ${this.progress.completed}, Failed: ${this.progress.failed}`); + console.log(`Duration: ${this.progress.totalDuration.toFixed(1)}s`); + console.log(`${'='.repeat(60)}\n`); + + return { + total: skus.length, + completed: this.progress.completed, + failed: this.progress.failed, + duration: this.progress.totalDuration, + results: this.progress.results + }; + } + + /** + * 延迟函数 + * @param {number} ms - 毫秒数 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /** + * 保存进度到文件 + */ + saveProgress() { + try { + const progressPath = path.join(process.cwd(), this.config.progressFile); + fs.writeFileSync(progressPath, JSON.stringify(this.progress.results, null, 2)); + } catch (error) { + console.error('Failed to save progress:', error.message); + } + } + + /** + * 加载之前的进度 + * @returns {array} 之前的处理结果 + */ + loadProgress() { + try { + const progressPath = path.join(process.cwd(), this.config.progressFile); + if (fs.existsSync(progressPath)) { + const content = fs.readFileSync(progressPath, 'utf-8'); + return JSON.parse(content); + } + } catch (error) { + console.error('Failed to load progress:', error.message); + } + return []; + } + + /** + * 清除进度文件 + */ + clearProgress() { + try { + const progressPath = path.join(process.cwd(), this.config.progressFile); + if (fs.existsSync(progressPath)) { + fs.unlinkSync(progressPath); + console.log('Progress cleared'); + } + } catch (error) { + console.error('Failed to clear progress:', error.message); + } + } + + /** + * 生成批处理报告 + * @returns {object} 报告数据 + */ + generateReport() { + const successResults = this.progress.results.filter(r => r.status === 'success'); + const failedResults = this.progress.results.filter(r => r.status === 'failed'); + + const totalImages = successResults.reduce((sum, r) => { + return sum + (r.summary?.success || 0); + }, 0); + + return { + summary: { + total_skus: this.progress.total, + successful_skus: this.progress.completed, + failed_skus: this.progress.failed, + success_rate: ((this.progress.completed / this.progress.total) * 100).toFixed(1) + '%', + total_images_generated: totalImages, + total_duration: this.progress.totalDuration?.toFixed(1) + 's', + average_time_per_sku: (this.progress.totalDuration / this.progress.total).toFixed(1) + 's' + }, + failed_skus: failedResults.map(r => ({ + sku_id: r.sku_id, + error: r.error + })), + successful_skus: successResults.map(r => ({ + sku_id: r.sku_id, + images: r.summary + })) + }; + } +} + +/** + * 从文件加载SKU列表 + * @param {string} filePath - 文件路径(JSON或CSV) + * @returns {array} SKU数组 + */ +function loadSKUsFromFile(filePath) { + const content = fs.readFileSync(filePath, 'utf-8'); + const ext = path.extname(filePath).toLowerCase(); + + if (ext === '.json') { + const data = JSON.parse(content); + return Array.isArray(data) ? data : [data]; + } + + // 简单CSV解析(假设第一行是表头) + if (ext === '.csv') { + const lines = content.split('\n').filter(line => line.trim()); + const headers = lines[0].split(',').map(h => h.trim()); + + return lines.slice(1).map(line => { + const values = line.split(',').map(v => v.trim()); + const obj = {}; + headers.forEach((h, i) => { + obj[h] = values[i]; + }); + return obj; + }); + } + + throw new Error('Unsupported file format. Use .json or .csv'); +} + +module.exports = { + BatchProcessor, + loadSKUsFromFile, + DEFAULT_CONFIG +}; + + + diff --git a/lib/brain.js b/lib/brain.js new file mode 100644 index 0000000..fa61a77 --- /dev/null +++ b/lib/brain.js @@ -0,0 +1,332 @@ +/** + * Brain决策逻辑 + * 调用LLM分析产品信息并生成12张图的规划 + */ + +const fs = require('fs'); +const path = require('path'); +const axios = require('axios'); + +// 读取Brain System Prompt +const brainPromptPath = path.join(__dirname, '../prompts/brain-system.md'); +let brainSystemPrompt = ''; + +try { + brainSystemPrompt = fs.readFileSync(brainPromptPath, 'utf-8'); +} catch (err) { + console.error('Failed to load brain system prompt:', err.message); +} + +/** + * 调用LLM生成图片规划 + * @param {object} sku - SKU数据 + * @param {object} options - 选项 + * @param {string} options.apiKey - API密钥 + * @param {string} options.apiUrl - API地址 + * @param {string} options.model - 模型名称 + * @returns {Promise} Brain输出的图片规划 + */ +async function generateImagePlan(sku, options = {}) { + const { + apiKey = process.env.API_KEY, + apiUrl = 'https://api2img.shubiaobiao.com/v1/chat/completions', + model = 'gemini-3-pro-preview' + } = options; + + if (!apiKey) { + throw new Error('API_KEY is required'); + } + + // 构建用户消息 + const userMessage = `请根据以下产品信息,规划12张电商图片(6张主图 + 6张A+图)的内容策略。 + +## 产品信息 + +\`\`\`json +${JSON.stringify(sku, null, 2)} +\`\`\` + +请严格按照System Prompt中的输出格式返回JSON。`; + + try { + const response = await axios.post(apiUrl, { + model: model, + messages: [ + { role: 'system', content: brainSystemPrompt }, + { role: 'user', content: userMessage } + ], + temperature: 0.7, + max_tokens: 8000 + }, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${apiKey}` + }, + timeout: 120000 // 2分钟超时 + }); + + // 解析响应 + let content = response.data.choices?.[0]?.message?.content; + + if (!content) { + throw new Error('Empty response from LLM'); + } + + // 清理响应内容 + content = cleanLLMResponse(content); + + // 解析JSON + const plan = parseJSONFromResponse(content); + + // 验证输出格式 + validatePlan(plan); + + return plan; + + } catch (error) { + console.error('Brain generation error:', error.message); + throw error; + } +} + +/** + * 清理LLM响应 + * @param {string} content - 原始响应内容 + * @returns {string} 清理后的内容 + */ +function cleanLLMResponse(content) { + // 移除 块 + content = content.replace(/[\s\S]*?<\/think>/gi, '').trim(); + + // 移除可能的markdown标记 + content = content.replace(/^```json\s*/i, ''); + content = content.replace(/\s*```$/i, ''); + + return content.trim(); +} + +/** + * 从响应中解析JSON + * @param {string} content - 响应内容 + * @returns {object} 解析后的JSON对象 + */ +function parseJSONFromResponse(content) { + // 尝试直接解析 + try { + return JSON.parse(content); + } catch (e) { + // 尝试提取JSON块 + const jsonMatch = content.match(/\{[\s\S]*\}/); + if (jsonMatch) { + try { + return JSON.parse(jsonMatch[0]); + } catch (e2) { + // 尝试修复常见问题 + let fixed = jsonMatch[0]; + + // 修复尾部逗号 + fixed = fixed.replace(/,\s*([}\]])/g, '$1'); + + // 修复未闭合的字符串 + fixed = fixed.replace(/:\s*"([^"]*?)(?=\s*[,}\]])/g, ': "$1"'); + + try { + return JSON.parse(fixed); + } catch (e3) { + throw new Error('Failed to parse JSON from LLM response: ' + e.message); + } + } + } + throw new Error('No valid JSON found in LLM response'); + } +} + +/** + * 验证Brain输出的计划 + * @param {object} plan - 图片规划 + */ +function validatePlan(plan) { + if (!plan.analysis) { + throw new Error('Missing analysis in plan'); + } + + if (!plan.images || !Array.isArray(plan.images)) { + throw new Error('Missing or invalid images array in plan'); + } + + if (plan.images.length !== 12) { + console.warn(`Expected 12 images, got ${plan.images.length}`); + } + + // 检查必要字段 + const requiredFields = ['id', 'type', 'ai_prompt']; + for (const image of plan.images) { + for (const field of requiredFields) { + if (!image[field]) { + throw new Error(`Missing ${field} in image ${image.id || 'unknown'}`); + } + } + } + + // 检查图片ID是否正确 + const expectedIds = [ + 'Main_01', 'Main_02', 'Main_03', 'Main_04', 'Main_05', 'Main_06', + 'APlus_01', 'APlus_02', 'APlus_03', 'APlus_04', 'APlus_05', 'APlus_06' + ]; + + const actualIds = plan.images.map(img => img.id); + const missingIds = expectedIds.filter(id => !actualIds.includes(id)); + + if (missingIds.length > 0) { + console.warn(`Missing image IDs: ${missingIds.join(', ')}`); + } +} + +/** + * 生成默认的图片规划(当Brain调用失败时使用) + * @param {object} sku - SKU数据 + * @returns {object} 默认的图片规划 + */ +function generateDefaultPlan(sku) { + const topSellingPoints = sku.selling_points.slice(0, 3).map(sp => sp.key); + const productColor = sku.color.name; + const productName = sku.product_name; + + return { + analysis: { + product_category: 'Pet Recovery Cone', + core_selling_points: topSellingPoints, + background_strategy: 'light', + logo_color: 'red', + visual_style: 'Warm, caring home environment' + }, + images: [ + { + id: 'Main_01', + type: 'Hero Scene + Key Benefits', + purpose: '首图决定点击率,展示产品使用状态+核心卖点', + layout_description: `上60%:猫咪佩戴${productColor}${productName}的居家场景。下40%:浅色Banner展示3个核心卖点。`, + ai_prompt: `Professional Amazon main image, 1:1 square format. A beautiful cat wearing a ${productColor} soft cone collar in a cozy modern home interior. Natural soft lighting, warm atmosphere. Bottom section shows a light blue rounded banner with "DESIGNED FOR COMFORTABLE RECOVERY" text and three small product detail images highlighting key features. Clean, professional pet product photography style. --ar 1:1`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'Main_02', + type: 'Product Detail + Craftsmanship', + purpose: '展示产品结构和工艺细节', + layout_description: `产品平铺俯视图,配合2-3个细节放大框展示材质和工艺`, + ai_prompt: `Professional product flat lay image, 1:1 square format. ${productColor} soft cone collar displayed from above on white background. Two circular detail callouts showing: 1) waterproof PU outer layer texture, 2) soft cotton inner lining. Clean product photography, even lighting, high detail. Brand logo "TOUCHDOG®" visible on right petal. --ar 1:1`, + logo_placement: { position: 'none', type: 'none', color: 'red' } + }, + { + id: 'Main_03', + type: 'Function Demonstration', + purpose: '展示可调节绑带等功能特性', + layout_description: `主场景展示佩戴状态,配合细节图展示调节功能`, + ai_prompt: `Professional Amazon feature demonstration image, 1:1 square format. Main image shows cat wearing ${productColor} cone, looking comfortable. Detail callouts show: adjustable velcro strap being secured, snug fit around neck. Text overlay "ADJUSTABLE STRAP FOR A SECURE FIT". Light blue background with paw print decorations. --ar 1:1`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'Main_04', + type: 'Use Cases Grid', + purpose: '展示4种适用场景', + layout_description: `四宫格布局,展示术后护理、滴药、剪指甲、梳毛四个场景`, + ai_prompt: `Professional Amazon use case image, 1:1 square format. Four-panel grid showing: 1) cat resting after surgery wearing cone, 2) owner applying eye drops to cat, 3) owner trimming cat's nails, 4) cat being groomed. Each panel labeled: "POSTOPERATIVE CARE", "EYE MEDICATION", "NAIL TRIMMING", "GROOMING". Light blue header banner "APPLICABLE SCENARIOS". --ar 1:1`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'Main_05', + type: 'Size & Specifications', + purpose: '展示尺寸规格信息', + layout_description: `产品尺寸标注图配合尺码对照表`, + ai_prompt: `Professional Amazon size guide image, 1:1 square format. ${productColor} cone collar with dimension annotations showing depth measurement (${sku.specs.depth_cm}cm). Clean size chart showing XS to XL with neck circumference ranges. Professional infographic style, clear readable text. Light background. --ar 1:1`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'Main_06', + type: 'Brand & Benefits Summary', + purpose: '强化品牌认知和卖点汇总', + layout_description: `品牌Logo突出展示,配合核心卖点图标`, + ai_prompt: `Professional Amazon brand summary image, 1:1 square format. Touchdog brand logo prominently displayed. Key benefit icons with text: "65g Ultra Light", "Waterproof PU", "Breathable Cotton", "Adjustable Fit", "Foldable Design". Cat wearing ${productColor} cone as background element. Premium brand aesthetic. --ar 1:1`, + logo_placement: { position: 'center', type: 'combined', color: 'red' } + }, + { + id: 'APlus_01', + type: 'Brand Banner', + purpose: '品牌形象首图', + layout_description: `品牌名+产品名+生活场景大图`, + ai_prompt: `Professional Amazon A+ banner image, 970x600px landscape. Beautiful cat wearing ${productColor} Touchdog soft cone collar in warm modern home interior. Large "TOUCHDOG" brand text and "CAT SOFT CONE COLLAR" product name overlaid. Lifestyle photography, natural lighting, cozy atmosphere. --ar 3:2`, + logo_placement: { position: 'top-left', type: 'combined', color: 'red' } + }, + { + id: 'APlus_02', + type: 'Competitor Comparison', + purpose: '竞品对比展示优势', + layout_description: `左侧我们的产品(彩色+优点),右侧传统产品(灰色+缺点)`, + ai_prompt: `Professional Amazon A+ comparison image, 970x600px landscape. Left side (colored): Touchdog ${productColor} soft cone with green checkmark, labeled "OUR" with benefits "CLOUD-LIGHT COMFORT", "WIDER & CLEARER", "FOLDABLE & PORTABLE". Right side (grayscale): Generic plastic cone with red X, labeled "OTHER" with drawbacks "HEAVY & BULKY", "BLOCKS VISION & MOVEMENT", "HARD TO STORE". Center shows cat wearing our product. Warm beige background with paw prints. --ar 3:2`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' }, + is_comparison: true + }, + { + id: 'APlus_03', + type: 'Benefits Grid', + purpose: '核心卖点展示', + layout_description: `三宫格展示3个核心卖点`, + ai_prompt: `Professional Amazon A+ benefits image, 970x600px landscape. Three-panel layout showing key features: 1) "STURDY AND BREATHABLE" with fabric texture close-up, 2) "EASY TO CLEAN" with dimension annotation ${sku.specs.depth_cm}cm, 3) "REINFORCED STITCHING" with stitching detail. Header "ENGINEERED FOR UNCOMPROMISED COMFORT". Warm beige background. --ar 3:2`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'APlus_04', + type: 'Features Grid', + purpose: '功能场景展示', + layout_description: `四宫格展示功能:易清洁、不影响进食、可翻折、360°舒适`, + ai_prompt: `Professional Amazon A+ features image, 970x600px landscape. Four vertical panels: 1) "HYGIENIC & EASY TO CLEAN" showing water-resistant surface, 2) "UNRESTRICTED EATING/DRINKING" showing cat eating while wearing cone, 3) "REVERSIBLE WEAR" showing flip-over design, 4) "360° COMFORT" showing cat sleeping peacefully. Warm beige background, consistent styling. --ar 3:2`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'APlus_05', + type: 'Material & Craftsmanship', + purpose: '材质工艺展示', + layout_description: `材质剖面和工艺细节展示`, + ai_prompt: `Professional Amazon A+ material image, 970x600px landscape. Close-up details of ${productColor} cone showing: waterproof PU outer layer with water droplets, soft cotton inner lining texture, reinforced stitching seams, embroidered TOUCHDOG logo. Technical infographic style with material callouts. Light background. --ar 3:2`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + }, + { + id: 'APlus_06', + type: 'Size Guide', + purpose: '尺寸选择指南', + layout_description: `完整尺码表+测量指南`, + ai_prompt: `Professional Amazon A+ size guide image, 970x600px landscape. Comprehensive size chart showing all sizes (XS-XL) with neck circumference and depth measurements in both cm and inches. Illustration showing how to measure pet's neck. Clear, readable table format. Helpful sizing tips. Professional infographic design. --ar 3:2`, + logo_placement: { position: 'bottom-right', type: 'combined', color: 'red' } + } + ] + }; +} + +/** + * 主入口:生成图片规划 + * @param {object} sku - SKU数据 + * @param {object} options - 选项 + * @returns {Promise} 图片规划 + */ +async function planImages(sku, options = {}) { + try { + // 尝试调用LLM生成计划 + const plan = await generateImagePlan(sku, options); + console.log('Brain generated plan successfully'); + return plan; + } catch (error) { + console.error('Brain failed, using default plan:', error.message); + // 失败时使用默认计划 + return generateDefaultPlan(sku); + } +} + +module.exports = { + planImages, + generateImagePlan, + generateDefaultPlan, + validatePlan +}; + + + diff --git a/lib/constraint-injector.js b/lib/constraint-injector.js new file mode 100644 index 0000000..51217f2 --- /dev/null +++ b/lib/constraint-injector.js @@ -0,0 +1,369 @@ +/** + * 约束注入器 + * 自动将各类约束追加到AI生图Prompt中 + */ + +const fs = require('fs'); +const path = require('path'); + +// 读取约束模板 +const constraintsDir = path.join(__dirname, '../prompts/constraints'); + +/** + * 简单的模板引擎,替换 {{variable}} 占位符 + * @param {string} template - 模板字符串 + * @param {object} data - 数据对象 + * @returns {string} 替换后的字符串 + */ +function renderTemplate(template, data) { + return template.replace(/\{\{([^}]+)\}\}/g, (match, key) => { + const keys = key.trim().split('.'); + let value = data; + for (const k of keys) { + if (value && typeof value === 'object') { + // 处理数组索引 selling_points[0] + const arrayMatch = k.match(/^(\w+)\[(\d+)\]$/); + if (arrayMatch) { + value = value[arrayMatch[1]]?.[parseInt(arrayMatch[2])]; + } else { + value = value[k]; + } + } else { + return match; // 保留原占位符 + } + } + + if (Array.isArray(value)) { + return value.join(', '); + } + + return value !== undefined ? String(value) : match; + }); +} + +/** + * 处理Handlebars风格的循环 {{#each array}}...{{/each}} + * @param {string} template - 模板字符串 + * @param {object} data - 数据对象 + * @returns {string} 处理后的字符串 + */ +function processEachBlocks(template, data) { + const eachRegex = /\{\{#each\s+(\w+)\}\}([\s\S]*?)\{\{\/each\}\}/g; + + return template.replace(eachRegex, (match, arrayName, content) => { + const array = data[arrayName]; + if (!Array.isArray(array)) { + return ''; + } + + return array.map(item => { + // 处理 {{#if field}} 条件 + let processed = content.replace(/\{\{#if\s+(\w+)\}\}([\s\S]*?)\{\{\/if\}\}/g, (m, field, ifContent) => { + return item[field] ? ifContent : ''; + }); + + // 替换当前项的字段 + processed = processed.replace(/\{\{(\w+)\}\}/g, (m, field) => { + return item[field] !== undefined ? String(item[field]) : m; + }); + + return processed; + }).join('\n'); + }); +} + +/** + * 生成产品一致性约束 + * @param {object} sku - SKU数据 + * @returns {string} 约束文本 + */ +function generateProductConsistencyConstraint(sku) { + const template = ` +=== PRODUCT CONSISTENCY REQUIREMENTS (CRITICAL - DO NOT IGNORE) === + +The product shown in this image must EXACTLY match the reference images provided. + +PRODUCT SPECIFICATIONS: +- Product Type: ${sku.product_name} +- Color: ${sku.color.hex} (${sku.color.name}) +- Color Series: ${sku.color.series || 'Standard'} +- Edge/Binding Color: ${sku.color.edge_color || sku.color.hex} + +STRUCTURAL REQUIREMENTS: +- Shape: Soft cone collar with petal-like segments (NOT rigid plastic cone) +- Segments: Multiple soft fabric petals radiating from center opening +- Opening: Circular neck opening with ribbed cotton binding +- Closure: Velcro strap closure system + +BRAND LOGO ON PRODUCT: +- Text: "TOUCHDOG®" (UPPERCASE with ® symbol) +- Position: On one petal segment, typically right side (2-3 o'clock position when viewed from front) +- Style: Embroidered/stitched into fabric, slightly recessed +- Color: Darker or contrasting shade matching the product color + +TEXTURE & MATERIAL APPEARANCE: +- Outer Layer: Smooth, slightly glossy waterproof PU fabric +- Inner Layer: Visible soft cotton lining at edges +- Stitching: Reinforced seams, visible quilted pattern on petals +- Edge Binding: Ribbed cotton binding in ${sku.color.edge_color || 'matching color'} + +CRITICAL PROHIBITIONS: +- DO NOT alter the product shape or structure +- DO NOT change the color from specified hex value +- DO NOT move or resize the embroidered logo +- DO NOT add any elements not present in reference images +- DO NOT stylize, reimagine, or "improve" the product design +- DO NOT generate rigid plastic cone - must be SOFT fabric cone + +=== END PRODUCT CONSISTENCY REQUIREMENTS === +`; + return template.trim(); +} + +/** + * 生成卖点合规约束 + * @param {object} sku - SKU数据 + * @returns {string} 约束文本 + */ +function generateSellingPointConstraint(sku) { + const sellingPointsList = sku.selling_points.map(sp => { + let line = `- ${sp.title_en}`; + if (sp.value) line += ` (Value: ${sp.value})`; + if (sp.description_en) line += `: ${sp.description_en}`; + return line; + }).join('\n'); + + const visualPromptsList = sku.selling_points + .filter(sp => sp.visual_prompt) + .map(sp => `- ${sp.key}: ${sp.visual_prompt}`) + .join('\n'); + + const useCasesList = sku.use_cases + .map(uc => `- ${uc.name_en}`) + .join('\n'); + + const template = ` +=== SELLING POINTS COMPLIANCE (LEGAL REQUIREMENT) === + +ALL product claims, features, and specifications shown in this image must come EXACTLY from the provided data. + +APPROVED SELLING POINTS (use ONLY these): +${sellingPointsList} + +APPROVED SPECIFICATIONS (use EXACT values): +- Weight: ${sku.specs.weight} +- Depth: ${sku.specs.depth_cm}cm +- Available Sizes: ${sku.specs.sizes.join(', ')} +- Outer Material: ${sku.specs.materials?.outer || 'Waterproof PU'} +- Inner Material: ${sku.specs.materials?.inner || 'Cotton blend'} + +APPROVED USE CASES: +${useCasesList} + +PROHIBITED ACTIONS: +- DO NOT invent new features or benefits not listed above +- DO NOT modify numerical values (no rounding, no approximation) +- DO NOT use superlatives: "best", "first", "only", "most", "#1", "leading" +- DO NOT make comparative claims without data: "better than", "superior to" +- DO NOT add health claims not approved by regulations +- DO NOT promise specific outcomes: "guaranteed", "100% effective" + +VISUAL REPRESENTATION OF SELLING POINTS: +${visualPromptsList} + +=== END SELLING POINTS COMPLIANCE === +`; + return template.trim(); +} + +/** + * 生成竞品合规约束(仅用于竞品对比图) + * @param {object} sku - SKU数据 + * @returns {string} 约束文本 + */ +function generateCompetitorConstraint(sku) { + const productCategory = sku.product_name.includes('Cone') ? 'Plastic Cone' : 'Product'; + + const template = ` +=== COMPETITOR COMPARISON COMPLIANCE (LEGAL RED LINE) === + +This is a product comparison image. You MUST follow these legal requirements: + +OUR PRODUCT SIDE (Left/Colored): +- Show the Touchdog ${sku.product_name} in FULL COLOR +- Product color: ${sku.color.hex} (${sku.color.name}) +- Use green checkmark icon (✓) to indicate positive +- Label as "OUR" or "TOUCHDOG" +- List ONLY the approved selling points from provided data +- Product must match reference images exactly + +COMPETITOR SIDE (Right/Grayscale): +- Label as "OTHER" or "Traditional ${productCategory}" ONLY +- DO NOT use any competitor brand names +- DO NOT use any competitor logos or trademarks +- DO NOT show any identifiable competitor product designs +- Show a GENERIC, UNBRANDED version of traditional product +- Apply GRAYSCALE filter to entire competitor side +- Use red X icon to indicate negative + +APPROVED COMPETITOR DISADVANTAGES (generic industry facts only): +- "Heavy & Bulky" +- "Blocks Vision & Movement" +- "Hard to Store" +- "Uncomfortable for Extended Wear" +- "Difficult to Clean" +- "Rigid and Inflexible" + +VISUAL TREATMENT: +- Our side: Vibrant, colorful, positive imagery +- Competitor side: Muted, grayscale, neutral imagery +- Clear visual contrast between the two sides +- Center divider or clear separation between sides + +STRICTLY PROHIBITED: +- ❌ Any specific competitor brand name +- ❌ Any competitor logo or trademark symbol +- ❌ Any identifiable competitor product photo +- ❌ Claims like "better than [Brand]" +- ❌ Using competitor's actual product images + +=== END COMPETITOR COMPARISON COMPLIANCE === +`; + return template.trim(); +} + +/** + * 生成品牌VI约束 + * @param {object} sku - SKU数据 + * @param {object} logoPlacement - Logo放置信息 + * @returns {string} 约束文本 + */ +function generateBrandVIConstraint(sku, logoPlacement = {}) { + const position = logoPlacement.position || 'bottom-right'; + const logoType = logoPlacement.type || 'combined'; + const logoColor = logoPlacement.color || 'red'; + + const template = ` +=== BRAND VI REQUIREMENTS === + +EMBROIDERED LOGO ON PRODUCT: +- Text: "TOUCHDOG®" (UPPERCASE with ® symbol) +- Position: Right petal segment, 2-3 o'clock position +- Style: Embroidered, stitched into fabric +- Color: Slightly darker shade of product color (${sku.color.hex}) + +E-COMMERCE IMAGE BRAND LOGO: +- Position: ${position} +- Type: ${logoType === 'combined' ? 'Graphic icon + "touchdog®" text + "wow pretty"' : logoType} +- Color: ${logoColor === 'red' ? 'Red (#E60012)' : 'White'} + +LOGO SPECIFICATIONS: +- Clear space: Minimum 1/4 of logo height on all sides +- Minimum size: Combined logo ≥ 46px height +- Tagline: "wow pretty" (for international markets) + +PROHIBITED LOGO MODIFICATIONS: +- ❌ NO tilting or rotation +- ❌ NO outlines or strokes +- ❌ NO gradient fills +- ❌ NO drop shadows +- ❌ NO proportion changes +- ❌ NO underlines + +BRAND TYPOGRAPHY: +- Headlines: Clean sans-serif, bold weight +- Body text: Clean sans-serif, medium weight +- Style: Clean, modern, professional + +=== END BRAND VI REQUIREMENTS === +`; + return template.trim(); +} + +/** + * 注入所有约束到Prompt + * @param {string} originalPrompt - 原始Prompt + * @param {object} sku - SKU数据 + * @param {object} options - 选项 + * @param {boolean} options.isComparison - 是否是竞品对比图 + * @param {object} options.logoPlacement - Logo放置信息 + * @returns {string} 注入约束后的完整Prompt + */ +function injectConstraints(originalPrompt, sku, options = {}) { + const { isComparison = false, logoPlacement = {} } = options; + + const constraints = []; + + // 始终添加产品一致性约束 + constraints.push(generateProductConsistencyConstraint(sku)); + + // 始终添加卖点合规约束 + constraints.push(generateSellingPointConstraint(sku)); + + // 如果是竞品对比图,添加竞品合规约束 + if (isComparison) { + constraints.push(generateCompetitorConstraint(sku)); + } + + // 始终添加品牌VI约束 + constraints.push(generateBrandVIConstraint(sku, logoPlacement)); + + // 添加参考图提示 + if (sku.ref_images && sku.ref_images.length > 0) { + constraints.push(` +=== REFERENCE IMAGES === +The following reference images must be used to ensure product consistency: +${sku.ref_images.map((url, i) => `- Reference ${i + 1}: ${url}`).join('\n')} +Product in generated image must match these reference images exactly. +=== END REFERENCE IMAGES === +`); + } + + // 组合最终Prompt + return `${originalPrompt} + +${constraints.join('\n\n')}`; +} + +/** + * 提取图片的宽高比参数 + * @param {string} imageId - 图片ID (Main_01 或 APlus_01) + * @returns {string} 宽高比参数 + */ +function getAspectRatio(imageId) { + if (imageId.startsWith('Main_')) { + return '1:1'; + } else if (imageId.startsWith('APlus_')) { + return '3:2'; + } + return '1:1'; +} + +/** + * 获取图片尺寸 + * @param {string} imageId - 图片ID + * @returns {object} 尺寸信息 + */ +function getImageSize(imageId) { + if (imageId.startsWith('Main_')) { + return { width: 1600, height: 1600, label: '1600x1600' }; + } else if (imageId.startsWith('APlus_')) { + return { width: 970, height: 600, label: '970x600' }; + } + return { width: 1600, height: 1600, label: '1600x1600' }; +} + +module.exports = { + injectConstraints, + generateProductConsistencyConstraint, + generateSellingPointConstraint, + generateCompetitorConstraint, + generateBrandVIConstraint, + getAspectRatio, + getImageSize, + renderTemplate, + processEachBlocks +}; + + + diff --git a/lib/image-processor.js b/lib/image-processor.js new file mode 100644 index 0000000..9d75d43 --- /dev/null +++ b/lib/image-processor.js @@ -0,0 +1,338 @@ +/** + * 图片处理工具模块 + * 使用Sharp库实现:抠图、合成、叠加文字/标注 + */ + +const sharp = require('sharp'); +const fs = require('fs'); +const path = require('path'); + +/** + * 调整图片大小,保持比例 + */ +async function resizeImage(inputPath, width, height, fit = 'contain') { + const buffer = await sharp(inputPath) + .resize(width, height, { fit, background: { r: 255, g: 255, b: 255, alpha: 0 } }) + .toBuffer(); + return buffer; +} + +/** + * 将图片转换为PNG(保持透明度) + */ +async function toPng(inputPath) { + return await sharp(inputPath).png().toBuffer(); +} + +/** + * 创建纯色背景 + */ +async function createSolidBackground(width, height, color = '#FFFFFF') { + // 解析颜色 + const r = parseInt(color.slice(1, 3), 16); + const g = parseInt(color.slice(3, 5), 16); + const b = parseInt(color.slice(5, 7), 16); + + return await sharp({ + create: { + width, + height, + channels: 3, + background: { r, g, b } + } + }).jpeg().toBuffer(); +} + +/** + * 创建渐变背景 + */ +async function createGradientBackground(width, height, color1 = '#F5EDE4', color2 = '#FFFFFF') { + // 创建简单的渐变效果(从上到下) + const svg = ` + + + + + + + + + + `; + + return await sharp(Buffer.from(svg)).jpeg().toBuffer(); +} + +/** + * 合成多个图层 + * @param {Buffer} baseImage - 底图 + * @param {Array} layers - 图层数组 [{buffer, left, top, width?, height?}] + */ +async function compositeImages(baseImage, layers) { + let composite = sharp(baseImage); + + const compositeInputs = []; + + for (const layer of layers) { + let input = layer.buffer; + + // 如果需要调整大小 + if (layer.width || layer.height) { + input = await sharp(layer.buffer) + .resize(layer.width, layer.height, { fit: 'contain', background: { r: 0, g: 0, b: 0, alpha: 0 } }) + .toBuffer(); + } + + compositeInputs.push({ + input, + left: layer.left || 0, + top: layer.top || 0 + }); + } + + return await composite.composite(compositeInputs).toBuffer(); +} + +/** + * 在图片上叠加文字 + */ +async function addTextOverlay(baseImage, texts) { + // texts: [{text, x, y, fontSize, color, fontWeight, align}] + + const metadata = await sharp(baseImage).metadata(); + const width = metadata.width; + const height = metadata.height; + + // 创建SVG文字层 + const textElements = texts.map(t => { + const fontSize = t.fontSize || 40; + const color = t.color || '#333333'; + const fontWeight = t.fontWeight || 'bold'; + const textAnchor = t.align === 'center' ? 'middle' : (t.align === 'right' ? 'end' : 'start'); + + return `${escapeXml(t.text)}`; + }).join('\n'); + + const svg = ` + + ${textElements} + + `; + + return await sharp(baseImage) + .composite([{ input: Buffer.from(svg), top: 0, left: 0 }]) + .toBuffer(); +} + +/** + * 创建圆形裁剪的图片(用于细节放大镜效果) + */ +async function createCircularCrop(inputBuffer, diameter) { + const circle = Buffer.from(` + + + + `); + + const resized = await sharp(inputBuffer) + .resize(diameter, diameter, { fit: 'cover' }) + .toBuffer(); + + return await sharp(resized) + .composite([{ input: circle, blend: 'dest-in' }]) + .png() + .toBuffer(); +} + +/** + * 添加圆形边框 + */ +async function addCircleBorder(inputBuffer, diameter, borderWidth = 3, borderColor = '#2D4A3E') { + const r = parseInt(borderColor.slice(1, 3), 16); + const g = parseInt(borderColor.slice(3, 5), 16); + const b = parseInt(borderColor.slice(5, 7), 16); + + const borderSvg = Buffer.from(` + + + + `); + + return await sharp(inputBuffer) + .composite([{ input: borderSvg, top: 0, left: 0 }]) + .toBuffer(); +} + +/** + * 创建带箭头的标注线 + */ +async function createArrowLine(width, height, fromX, fromY, toX, toY, color = '#2D4A3E') { + const r = parseInt(color.slice(1, 3), 16); + const g = parseInt(color.slice(3, 5), 16); + const b = parseInt(color.slice(5, 7), 16); + + // 计算箭头角度 + const angle = Math.atan2(toY - fromY, toX - fromX); + const arrowLength = 15; + const arrowAngle = Math.PI / 6; + + const arrow1X = toX - arrowLength * Math.cos(angle - arrowAngle); + const arrow1Y = toY - arrowLength * Math.sin(angle - arrowAngle); + const arrow2X = toX - arrowLength * Math.cos(angle + arrowAngle); + const arrow2Y = toY - arrowLength * Math.sin(angle + arrowAngle); + + const svg = ` + + + + + `; + + return Buffer.from(svg); +} + +/** + * 创建标题横幅 + */ +async function createTitleBanner(width, height, text, bgColor = '#2D4A3E', textColor = '#FFFFFF') { + const fontSize = Math.floor(height * 0.5); + + const svg = ` + + + "${escapeXml(text)}" + + `; + + return await sharp(Buffer.from(svg)).png().toBuffer(); +} + +/** + * 将图片转为灰度(用于竞品对比) + */ +async function toGrayscale(inputBuffer) { + return await sharp(inputBuffer).grayscale().toBuffer(); +} + +/** + * 调整图片亮度/对比度 + */ +async function adjustBrightness(inputBuffer, brightness = 1.0) { + return await sharp(inputBuffer) + .modulate({ brightness }) + .toBuffer(); +} + +/** + * 添加阴影效果 + */ +async function addShadow(inputBuffer, offsetX = 5, offsetY = 5, blur = 10, opacity = 0.3) { + const metadata = await sharp(inputBuffer).metadata(); + const width = metadata.width + offsetX + blur * 2; + const height = metadata.height + offsetY + blur * 2; + + // 创建阴影层 + const shadowBuffer = await sharp(inputBuffer) + .greyscale() + .modulate({ brightness: 0 }) + .blur(blur) + .toBuffer(); + + // 创建透明背景 + const background = await sharp({ + create: { + width, + height, + channels: 4, + background: { r: 255, g: 255, b: 255, alpha: 0 } + } + }).png().toBuffer(); + + // 合成 + return await sharp(background) + .composite([ + { input: shadowBuffer, left: offsetX + blur, top: offsetY + blur, blend: 'over' }, + { input: inputBuffer, left: blur, top: blur } + ]) + .toBuffer(); +} + +/** + * 裁剪图片的特定区域 + */ +async function cropRegion(inputBuffer, left, top, width, height) { + return await sharp(inputBuffer) + .extract({ left, top, width, height }) + .toBuffer(); +} + +/** + * 辅助函数:转义XML特殊字符 + */ +function escapeXml(text) { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +/** + * 保存图片到文件 + */ +async function saveImage(buffer, outputPath, format = 'jpeg', quality = 90) { + let pipeline = sharp(buffer); + + if (format === 'jpeg' || format === 'jpg') { + pipeline = pipeline.jpeg({ quality }); + } else if (format === 'png') { + pipeline = pipeline.png(); + } + + await pipeline.toFile(outputPath); + return outputPath; +} + +/** + * 读取图片为Buffer + */ +async function readImage(imagePath) { + return fs.readFileSync(imagePath); +} + +/** + * 获取图片尺寸 + */ +async function getImageSize(inputPath) { + const metadata = await sharp(inputPath).metadata(); + return { width: metadata.width, height: metadata.height }; +} + +module.exports = { + resizeImage, + toPng, + createSolidBackground, + createGradientBackground, + compositeImages, + addTextOverlay, + createCircularCrop, + addCircleBorder, + createArrowLine, + createTitleBanner, + toGrayscale, + adjustBrightness, + addShadow, + cropRegion, + saveImage, + readImage, + getImageSize +}; + + diff --git a/lib/template-config.js b/lib/template-config.js new file mode 100644 index 0000000..a4124d9 --- /dev/null +++ b/lib/template-config.js @@ -0,0 +1,629 @@ +/** + * 可配置的套路模板系统 + * 运营人员可以自定义每张图的布局和内容 + */ + +// ============================================================ +// 默认套路配置(基于真实交付成品分析) +// ============================================================ + +const DEFAULT_MAIN_TEMPLATES = { + // Main_01: 场景首图 + 卖点文字 + Main_01: { + type: 'lifestyle_with_features', + name: '场景首图+卖点', + aspectRatio: '1:1', + layout: { + scene: 'left-center', // 场景图位置 + title: 'center-bottom', // 标题位置 + features: 'bottom-row' // 卖点位置 + }, + config: { + title: 'DESIGNED FOR COMFORTABLE RECOVERY', + titleStyle: 'curved-banner', // curved-banner | simple | none + features: [ + { icon: 'egg', text: 'LIGHTER THAN AN EGG' }, + { icon: 'water', text: 'WATERPROOF & EASY WIPE' }, + { icon: 'cloud', text: 'BREATHABLE COTTON LINING' } + ], + background: 'warm-home' + } + }, + + // Main_02: 白底平铺 + 局部放大(关键改进!) + Main_02: { + type: 'product_with_callouts', + name: '白底平铺+细节放大', + aspectRatio: '1:1', + layout: { + product: 'center', + callouts: 'corners' // 放大镜效果在角落 + }, + config: { + title: 'DURABLE WATERPROOF PU LAYER', + titlePosition: 'top', + callouts: [ + { + position: 'bottom-left', + target: 'material-edge', + label: 'DURABLE WATERPROOF PU LAYER', + hasArrow: true + }, + { + position: 'bottom-right', + target: 'neck-binding', + label: 'DOUBLE-LAYER COMFORT', + hasArrow: true + } + ], + background: 'white' + } + }, + + // Main_03: 功能调节展示 + Main_03: { + type: 'feature_showcase', + name: '功能调节展示', + aspectRatio: '1:1', + layout: { + mainScene: 'left', + featureCircles: 'right-column' + }, + config: { + title: 'ADJUSTABLE STRAP FOR A SECURE FIT', + titlePosition: 'top-left', + mainScene: { + type: 'cat-wearing', + background: 'lifestyle' + }, + featureCircles: [ + { label: 'SECURE THE ADJUSTABLE BELLY STRAP', showDetail: 'velcro-close-up' }, + { label: 'ADJUST FOR A SNUG FIT', showDetail: 'full-product-view' } + ], + background: 'matching-color' // 使用产品主色作为背景 + } + }, + + // Main_04: 多场景使用(4宫格) + Main_04: { + type: 'multi_scenario_grid', + name: '多场景使用', + aspectRatio: '1:1', + layout: { + grid: '2x2', + captionPosition: 'below-each' + }, + config: { + scenarios: [ + { scene: 'standing', caption: '• HYGIENIC & EASY TO CLEAN', subtext: 'WATERPROOF OUTER LAYER' }, + { scene: 'eating', caption: '• UNRESTRICTED EATING/DRINKING', subtext: 'SPECIALLY DESIGNED OPENING' }, + { scene: 'playing', caption: '• REVERSIBLE WEAR', subtext: 'FLIP-OVER DESIGN' }, + { scene: 'sleeping', caption: '• 360° COMFORT', subtext: 'FREE MOVEMENT' } + ], + background: 'warm-beige' + } + }, + + // Main_05: 尺寸图 + Main_05: { + type: 'size_chart', + name: '尺寸图', + aspectRatio: '1:1', + layout: { + product: 'top-center', + table: 'bottom' + }, + config: { + title: 'PRODUCT SIZE', + measurements: ['NECK', 'WIDTH'], + sizeChart: { + XS: { neck: '5.6-6.8IN', depth: '3.2IN' }, + S: { neck: '7.2-8.4IN', depth: '4IN' }, + M: { neck: '8.8-10.4IN', depth: '5IN' }, + L: { neck: '10.8-12.4IN', depth: '6IN' }, + XL: { neck: '12.8-14.4IN', depth: '7IN' } + }, + footer: 'NOTE: ALWAYS MEASURE YOUR PET\'S NECK BEFORE SELECTING A SIZE' + } + }, + + // Main_06: 多角度展示 + Main_06: { + type: 'multiple_angles', + name: '多角度展示', + aspectRatio: '1:1', + layout: { + images: 'side-by-side', + divider: 'curved-line' + }, + config: { + angles: [ + { view: 'front', petType: 'cat' }, + { view: 'side', petType: 'cat' } + ], + background: 'warm-interior' + } + } +}; + +const DEFAULT_APLUS_TEMPLATES = { + // APlus_01: 品牌横幅 + APlus_01: { + type: 'brand_banner', + name: '品牌横幅', + aspectRatio: '3:2', + config: { + brandName: 'TOUCHDOG', + productName: 'CAT SOFT CONE COLLAR', + brandStyle: 'playful-curved', // 品牌字体风格 + brandColor: '#E8A87C', // 珊瑚色 + scene: 'cat-on-furniture', + background: 'warm-home' + } + }, + + // APlus_02: 对比图(关键改进!) + APlus_02: { + type: 'comparison', + name: '对比图', + aspectRatio: '3:2', + layout: { + left: 'our-product', + right: 'competitor', + center: 'none' // 不要中间的产品图! + }, + config: { + leftSide: { + label: 'OUR', + labelBg: '#E8876C', + checkmark: true, + colorful: true, + sellingPoints: [ + 'CLOUD-LIGHT COMFORT', + 'WIDER & CLEARER', + 'FOLDABLE & PORTABLE' + ] + }, + rightSide: { + label: 'OTHER', + labelBg: '#808080', + xmark: true, + grayscale: true, + weaknesses: [ + 'HEAVY & BULKY', + 'BLOCKS VISION & MOVEMENT', + 'HARD TO STORE' + ] + }, + background: 'warm-beige' + } + }, + + // APlus_03: 功能细节 + APlus_03: { + type: 'feature_details', + name: '功能细节', + aspectRatio: '3:2', + config: { + title: 'ENGINEERED FOR UNCOMPROMISED COMFORT', + detailImages: [ + { focus: 'inner-lining', caption: 'STURDY AND BREATHABLE', subtext: 'DURABLE AND COMFORTABLE' }, + { focus: 'wearing-with-size', caption: 'EASY TO CLEAN, STYLISH', subtext: 'AND ATTRACTIVE' }, + { focus: 'stitching-detail', caption: 'REINFORCED STITCHING', subtext: 'AND DURABLE FABRIC' } + ], + background: 'warm-beige' + } + }, + + // APlus_04: 多场景横版 + APlus_04: { + type: 'multi_scenario_horizontal', + name: '多场景横版', + aspectRatio: '3:2', + config: { + scenarios: [ + { scene: 'standing', caption: '• HYGIENIC & EASY TO CLEAN' }, + { scene: 'eating', caption: '• UNRESTRICTED EATING/DRINKING' }, + { scene: 'playing', caption: '• REVERSIBLE WEAR' }, + { scene: 'sleeping', caption: '• 360° COMFORT' } + ] + } + }, + + // APlus_05: 多角度横版 + APlus_05: { + type: 'multiple_angles_horizontal', + name: '多角度横版', + aspectRatio: '3:2', + config: { + angles: ['front', 'side'], + dividerStyle: 'curved' + } + }, + + // APlus_06: 尺寸表横版 + APlus_06: { + type: 'size_chart_horizontal', + name: '尺寸表横版', + aspectRatio: '3:2', + config: { + title: 'PRODUCT SIZE', + layout: 'product-left-table-right' + } + } +}; + +// ============================================================ +// 从配置生成Prompt的函数 +// ============================================================ + +function generatePromptFromConfig(templateConfig, product, skuInfo) { + const { type, config, layout } = templateConfig; + + // 基础产品描述 + const productDesc = product.goldenDescription || 'Pet recovery cone collar'; + + switch (type) { + case 'lifestyle_with_features': + return generateLifestyleWithFeatures(productDesc, config, skuInfo); + + case 'product_with_callouts': + return generateProductWithCallouts(productDesc, config, skuInfo); + + case 'feature_showcase': + return generateFeatureShowcase(productDesc, config, skuInfo); + + case 'multi_scenario_grid': + return generateMultiScenarioGrid(productDesc, config, skuInfo); + + case 'size_chart': + return generateSizeChart(productDesc, config, skuInfo); + + case 'multiple_angles': + return generateMultipleAngles(productDesc, config, skuInfo); + + case 'brand_banner': + return generateBrandBanner(productDesc, config, skuInfo); + + case 'comparison': + return generateComparison(productDesc, config, skuInfo); + + case 'feature_details': + return generateFeatureDetails(productDesc, config, skuInfo); + + default: + return generateGenericPrompt(productDesc, config, skuInfo); + } +} + +// ============================================================ +// 各类型Prompt生成函数 +// ============================================================ + +function generateLifestyleWithFeatures(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - LIFESTYLE WITH FEATURE TEXT] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +SCENE: +- Beautiful ${skuInfo.petType || 'cat'} wearing the product comfortably +- Warm, cozy home interior background (soft focus) +- Product clearly visible, occupies 50-60% of frame +- Pet looks comfortable and relaxed + +TEXT OVERLAY REQUIREMENTS: +- ${config.titleStyle === 'curved-banner' ? 'CURVED BANNER in muted blue (#8BB8C4) across center' : 'SIMPLE TITLE at center-bottom'} +- TITLE TEXT: "${config.title}" in white, clean sans-serif font +- BOTTOM ROW: 3 feature boxes in rounded rectangles +${config.features.map((f, i) => ` - Box ${i+1}: "${f.text}" with ${f.icon} icon`).join('\n')} + +STYLE: +- Professional Amazon product photography +- Warm color palette +- Clean, readable text +- Subtle paw print watermarks +- 8K quality, 1:1 aspect ratio + +CRITICAL: Product must match reference image EXACTLY in shape, color, and material. +`.trim(); +} + +function generateProductWithCallouts(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - PRODUCT WITH DETAIL CALLOUTS] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: +- TOP: Title "${config.title}" in dark green banner with white text +- CENTER: Product C-shape flat lay view on white/light background +- CALLOUT CIRCLES: Magnifying glass style detail views with arrows pointing to product + +CALLOUT DETAILS: +${config.callouts.map(c => `- ${c.position.toUpperCase()}: Circular magnified view of ${c.target} + Label: "${c.label}" + Arrow pointing from circle to corresponding area on product`).join('\n')} + +STYLE: +- Clean product photography with infographic elements +- Dark green (#2D4A3E) for title banner +- Thin lines/arrows connecting callouts to product +- Professional Amazon listing style +- 8K quality, 1:1 aspect ratio + +CRITICAL: Product must show C-shaped opening clearly. Match reference image EXACTLY. +`.trim(); +} + +function generateFeatureShowcase(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - FEATURE SHOWCASE] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: +- BACKGROUND: Solid color matching product main color (use product's primary color) +- TOP-LEFT: Large title "${config.title}" in dark text +- LEFT SIDE (60%): Main lifestyle scene - ${skuInfo.petType || 'cat'} wearing product, walking through doorway/arch +- RIGHT SIDE (40%): 2 feature detail circles stacked vertically + +FEATURE CIRCLES: +${config.featureCircles.map((f, i) => `${i+1}. Circle showing: ${f.showDetail} + Button/label below: "${f.label}"`).join('\n')} + +STYLE: +- Lifestyle photography meets infographic +- Rounded rectangle buttons for labels +- Paw print decorations scattered on background +- Modern, clean design +- 8K quality, 1:1 aspect ratio + +CRITICAL: Product color and shape must match reference image EXACTLY. +`.trim(); +} + +function generateMultiScenarioGrid(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - MULTI-SCENARIO 2x2 GRID] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: 2x2 grid of scenes, each in rounded rectangle frame + +${config.scenarios.map((s, i) => `SCENE ${i+1} (${['TOP-LEFT', 'TOP-RIGHT', 'BOTTOM-LEFT', 'BOTTOM-RIGHT'][i]}): +- ${skuInfo.petType || 'Cat'} ${s.scene} while wearing product +- Caption below: "${s.caption}" +- Subtext: "${s.subtext}"`).join('\n\n')} + +BACKGROUND: Warm beige (#F5EDE4) with subtle paw print watermarks + +STYLE: +- Each scene in rounded rectangle with slight shadow +- Captions in dark text, clean sans-serif +- Professional lifestyle photography +- 8K quality, 1:1 aspect ratio + +CRITICAL: Product in ALL 4 scenes must be identical and match reference image. +`.trim(); +} + +function generateSizeChart(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - SIZE CHART INFOGRAPHIC] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: +- TOP: Title "${config.title}" in bold dark text +- CENTER: Product flat lay with measurement arrows and labels + - Arrow across neck opening: "NECK" + - Arrow across width: "WIDTH" +- BOTTOM: Size chart table + +SIZE CHART TABLE (clean, rounded corners): +| SIZE | NECK CIRCUMFERENCE | DEPTH | +${Object.entries(config.sizeChart).map(([size, dims]) => + `| ${size} | ${dims.neck} | ${dims.depth} |`).join('\n')} + +FOOTER TEXT: "${config.footer}" + +BACKGROUND: Warm beige with subtle paw prints + +STYLE: +- Clean infographic design +- Table with alternating row colors +- Professional product photography +- 8K quality, 1:1 aspect ratio +`.trim(); +} + +function generateMultipleAngles(productDesc, config, skuInfo) { + return ` +[AMAZON MAIN IMAGE - MULTIPLE ANGLES] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: +- Split view with decorative curved divider in center +- LEFT: ${skuInfo.petType || 'Cat'} wearing product, ${config.angles[0].view} view +- RIGHT: Same ${skuInfo.petType || 'cat'} or similar, ${config.angles[1].view} view + +SCENE: +- Warm home interior background +- Both pets look comfortable +- Product clearly visible from different angles + +STYLE: +- Lifestyle photography +- Soft warm lighting +- Decorative curved line or wave between images +- NO text overlay +- 8K quality, 1:1 aspect ratio + +CRITICAL: Product must be IDENTICAL in both views, matching reference image exactly. +`.trim(); +} + +function generateBrandBanner(productDesc, config, skuInfo) { + return ` +[AMAZON A+ BRAND BANNER - HORIZONTAL] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT (970x600px aspect ratio): +- LEFT 40%: Brand text area with decorative elements +- RIGHT 60%: Lifestyle scene + +LEFT SIDE: +- Brand name "${config.brandName}" in playful, slightly curved font +- Color: ${config.brandColor} (coral/salmon) +- Decorative paw prints around text +- Product name "${config.productName}" below in smaller gray text + +RIGHT SIDE: +- ${skuInfo.petType || 'Cat'} wearing product on modern furniture +- Warm cozy interior background + +STYLE: +- Professional Amazon A+ content +- Warm, inviting color palette +- 8K quality, ~1.6:1 aspect ratio +`.trim(); +} + +function generateComparison(productDesc, config, skuInfo) { + const { leftSide, rightSide } = config; + + return ` +[AMAZON A+ COMPARISON IMAGE - SPLIT SCREEN] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: Two-column comparison, NO center product image + +LEFT SIDE (OUR PRODUCT): +- GREEN CHECKMARK icon at top +- "${leftSide.label}" label on ${leftSide.labelBg} background +- ${skuInfo.petType || 'Cat'} wearing OUR PRODUCT (must match reference exactly!) +- Cat looks HAPPY and comfortable +- FULL COLOR, warm tones +- Selling points in white text on colored background: +${leftSide.sellingPoints.map(p => ` • ${p}`).join('\n')} + +RIGHT SIDE (COMPETITOR): +- RED X-MARK icon at top +- "${rightSide.label}" label on ${rightSide.labelBg} background +- ${skuInfo.petType || 'Cat'} wearing HARD PLASTIC transparent cone +- Cat looks SAD/uncomfortable +- GRAYSCALE/desaturated +- Weaknesses in gray text: +${rightSide.weaknesses.map(p => ` • ${p}`).join('\n')} + +BACKGROUND: Warm beige (#F5EDE4) with paw print watermarks + +STYLE: +- Clear visual contrast between sides +- Professional comparison layout +- Clean readable text +- 8K quality, ~1.6:1 aspect ratio + +CRITICAL: +- LEFT product must match reference image EXACTLY (our soft cone) +- RIGHT shows generic hard plastic cone (NOT our product) +- NO product image in the center +`.trim(); +} + +function generateFeatureDetails(productDesc, config, skuInfo) { + return ` +[AMAZON A+ FEATURE DETAILS - HORIZONTAL] + +PRODUCT (MUST MATCH REFERENCE IMAGE EXACTLY): +${productDesc} + +LAYOUT: +- TOP: Large title "${config.title}" in bold dark font +- MIDDLE: 3 detail images in rounded rectangles, evenly spaced + +${config.detailImages.map((d, i) => `DETAIL ${i+1}: +- Focus: ${d.focus} +- Caption: "${d.caption}" +- Subtext: "${d.subtext}"`).join('\n\n')} + +BACKGROUND: Warm beige (#F5EDE4) with subtle paw print watermarks + +STYLE: +- Professional product detail photography +- Clean modern typography +- Rounded rectangle frames for each detail +- 8K quality, ~1.6:1 aspect ratio +`.trim(); +} + +function generateGenericPrompt(productDesc, config, skuInfo) { + return ` +[AMAZON PRODUCT IMAGE] + +PRODUCT: +${productDesc} + +REQUIREMENTS: +- Professional product photography +- Match reference image exactly +- High quality, clear details +- 8K resolution +`.trim(); +} + +// ============================================================ +// 导出 +// ============================================================ + +module.exports = { + DEFAULT_MAIN_TEMPLATES, + DEFAULT_APLUS_TEMPLATES, + generatePromptFromConfig, + + // 生成所有12张图的Prompts + generateAllPrompts: (product, skuInfo, customConfig = {}) => { + const mainTemplates = { ...DEFAULT_MAIN_TEMPLATES, ...customConfig.main }; + const aplusTemplates = { ...DEFAULT_APLUS_TEMPLATES, ...customConfig.aplus }; + + const prompts = []; + + // 主图6张 + for (const [id, template] of Object.entries(mainTemplates)) { + prompts.push({ + id, + name: template.name, + aspectRatio: template.aspectRatio || '1:1', + type: template.type, + prompt: generatePromptFromConfig(template, product, skuInfo) + }); + } + + // A+图6张 + for (const [id, template] of Object.entries(aplusTemplates)) { + prompts.push({ + id, + name: template.name, + aspectRatio: template.aspectRatio || '3:2', + type: template.type, + prompt: generatePromptFromConfig(template, product, skuInfo) + }); + } + + return prompts; + } +}; + + diff --git a/lib/vision-extractor.js b/lib/vision-extractor.js new file mode 100644 index 0000000..7c18056 --- /dev/null +++ b/lib/vision-extractor.js @@ -0,0 +1,198 @@ +/** + * Vision产品特征提取器 + * 支持超时重试 + 缓存 + */ + +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); + +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// Vision提取Prompt +const VISION_EXTRACT_PROMPT = `Analyze this pet product image in EXTREME detail. + +Output ONLY a valid JSON object (no markdown, no explanation, no thinking): + +{ + "color": { + "primary": "", + "name": "", + "secondary": "" + }, + "shape": { + "type": "", + "petal_count": , + "opening": "", + "description": "" + }, + "material": { + "type": "", + "finish": "", + "texture": "" + }, + "edge_binding": { + "color": "", + "material": "" + }, + "closure": { + "type": "", + "color": "", + "position": "" + }, + "logo": { + "text": "", + "style": "", + "position": "" + }, + "unique_features": [""], + "overall_description": "<2-3 sentence summary for image generation>" +}`; + +/** + * 调用Vision API提取产品特征 + * @param {string} imageUrl - 图片URL + * @param {object} options - 配置选项 + * @returns {object|null} - 提取的产品特征JSON + */ +async function extractProductFeatures(imageUrl, options = {}) { + const { + maxRetries = 3, + timeout = 120000, // 120秒 + retryDelay = 5000, + cacheDir = null, + cacheKey = null + } = options; + + // 检查缓存 + if (cacheDir && cacheKey) { + const cachePath = path.join(cacheDir, `vision-cache-${cacheKey}.json`); + if (fs.existsSync(cachePath)) { + try { + const cached = JSON.parse(fs.readFileSync(cachePath, 'utf-8')); + if (cached && cached.color) { + console.log(' 📦 使用缓存的Vision结果'); + return cached; + } + } catch (e) { + // 缓存无效,继续请求 + } + } + } + + let lastError = null; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + console.log(` 🔍 Vision分析 (尝试 ${attempt}/${maxRetries})...`); + + try { + const response = await axios.post(`${API_BASE}/chat/index`, { + key: API_KEY, + model: 'gemini-3-pro', + content: VISION_EXTRACT_PROMPT, + image_url: imageUrl + }, { timeout }); + + const content = response.data.data?.choices?.[0]?.message?.content || + response.data.data?.content; + + if (!content) { + throw new Error('Vision响应为空'); + } + + // 提取JSON(跳过thinking部分) + let jsonStr = content; + + // 如果有标签,跳过它 + const thinkEnd = content.indexOf(''); + if (thinkEnd !== -1) { + jsonStr = content.substring(thinkEnd + 8); + } + + // 提取JSON + const jsonMatch = jsonStr.match(/\{[\s\S]*\}/); + if (jsonMatch) { + const parsed = JSON.parse(jsonMatch[0]); + + // 验证必要字段 + if (parsed.color && parsed.shape) { + console.log(' ✓ Vision提取成功'); + + // 保存缓存 + if (cacheDir && cacheKey) { + const cachePath = path.join(cacheDir, `vision-cache-${cacheKey}.json`); + fs.writeFileSync(cachePath, JSON.stringify(parsed, null, 2)); + } + + return parsed; + } + } + + throw new Error('无法解析有效的JSON'); + + } catch (error) { + lastError = error; + console.log(` ⚠️ 尝试 ${attempt} 失败: ${error.message}`); + + if (attempt < maxRetries) { + console.log(` ⏳ ${retryDelay/1000}秒后重试...`); + await new Promise(r => setTimeout(r, retryDelay)); + } + } + } + + console.error(` ❌ Vision提取最终失败: ${lastError?.message}`); + return null; +} + +/** + * 将Vision结果转换为Golden Description + */ +function buildGoldenDescription(visionResult, productType = 'pet recovery cone') { + if (!visionResult) { + return ` +PRODUCT: ${productType} +- Shape: Soft flower/petal shape with C-shaped opening +- Material: Soft waterproof fabric +- Closure: Velcro strap +- Comfortable design for pets + +CRITICAL: Follow the reference image EXACTLY for product shape and color. +`; + } + + const r = visionResult; + + return ` +EXACT PRODUCT APPEARANCE (MUST MATCH REFERENCE IMAGE): + +- Shape: ${r.shape?.petal_count || '7-8'}-PETAL ${(r.shape?.type || 'flower').toUpperCase()} shape +- Opening: ${r.shape?.opening || 'C-shaped'} (NOT a full circle) +- Color: ${(r.color?.name || 'ice blue').toUpperCase()} (${r.color?.primary || '#C3E6E8'}) +- Material: ${r.material?.finish || 'Soft'} ${r.material?.type || 'waterproof fabric'} with ${r.material?.texture || 'padded'} texture +- Edge binding: ${r.edge_binding?.color || 'Matching color'} ${r.edge_binding?.material || 'ribbed elastic'} around inner neck hole +- Closure: ${r.closure?.color || 'White'} ${r.closure?.type || 'velcro'} on ${r.closure?.position || 'one segment'} +- Logo: "${r.logo?.text || 'TOUCHDOG'}" ${r.logo?.style || 'embroidered'} on ${r.logo?.position || 'one petal'} + +UNIQUE FEATURES: +${(r.unique_features || ['Scalloped petal edges', 'Radial stitching', 'Soft padded construction']).map(f => `- ${f}`).join('\n')} + +OVERALL: ${r.overall_description || 'A soft, comfortable pet recovery cone with flower-petal design.'} + +CRITICAL PROHIBITIONS: +- ❌ NO printed colorful patterns (solid color only unless reference shows otherwise) +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes (must match reference C-opening) +- ❌ NO random brand logos +- ❌ MUST match reference image product EXACTLY +`.trim(); +} + +module.exports = { + extractProductFeatures, + buildGoldenDescription, + VISION_EXTRACT_PROMPT +}; + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ce6d9b9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3811 @@ +{ + "name": "ai-image-generator", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ai-image-generator", + "version": "1.0.0", + "dependencies": { + "@aws-sdk/client-s3": "^3.400.0", + "axios": "^1.6.0", + "canvas": "^3.2.0", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "multer": "^1.4.5-lts.1", + "sharp": "^0.34.5" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.947.0.tgz", + "integrity": "sha512-ICgnI8D3ccIX9alsLksPFY2bX5CAIbyB+q19sXJgPhzCJ5kWeQ6LQ5xBmRVT5kccmsVGbbJdhnLXHyiN5LZsWg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.947.0", + "@aws-sdk/credential-provider-node": "3.947.0", + "@aws-sdk/middleware-bucket-endpoint": "3.936.0", + "@aws-sdk/middleware-expect-continue": "3.936.0", + "@aws-sdk/middleware-flexible-checksums": "3.947.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-location-constraint": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-sdk-s3": "3.947.0", + "@aws-sdk/middleware-ssec": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.947.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/signature-v4-multi-region": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.947.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.7", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-retry": "^4.4.14", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.13", + "@smithy/util-defaults-mode-node": "^4.2.16", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.947.0.tgz", + "integrity": "sha512-sDwcO8SP290WSErY1S8pz8hTafeghKmmWjNVks86jDK30wx62CfazOTeU70IpWgrUBEygyXk/zPogHsUMbW2Rg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.947.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.947.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.947.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.7", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-retry": "^4.4.14", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.13", + "@smithy/util-defaults-mode-node": "^4.2.16", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.947.0.tgz", + "integrity": "sha512-Khq4zHhuAkvCFuFbgcy3GrZTzfSX7ZIjIcW1zRDxXRLZKRtuhnZdonqTUfaWi5K42/4OmxkYNpsO7X7trQOeHw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.7", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.947.0.tgz", + "integrity": "sha512-VR2V6dRELmzwAsCpK4GqxUi6UW5WNhAXS9F9AzWi5jvijwJo3nH92YNJUP4quMpgFZxJHEWyXLWgPjh9u0zYOA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.947.0.tgz", + "integrity": "sha512-inF09lh9SlHj63Vmr5d+LmwPXZc2IbK8lAruhOr3KLsZAIHEgHgGPXWDC2ukTEMzg0pkexQ6FOhXXad6klK4RA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.947.0.tgz", + "integrity": "sha512-A2ZUgJUJZERjSzvCi2NR/hBVbVkTXPD0SdKcR/aITb30XwF+n3T963b+pJl90qhOspoy7h0IVYNR7u5Nr9tJdQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/credential-provider-env": "3.947.0", + "@aws-sdk/credential-provider-http": "3.947.0", + "@aws-sdk/credential-provider-login": "3.947.0", + "@aws-sdk/credential-provider-process": "3.947.0", + "@aws-sdk/credential-provider-sso": "3.947.0", + "@aws-sdk/credential-provider-web-identity": "3.947.0", + "@aws-sdk/nested-clients": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.947.0.tgz", + "integrity": "sha512-u7M3hazcB7aJiVwosNdJRbIJDzbwQ861NTtl6S0HmvWpixaVb7iyhJZWg8/plyUznboZGBm7JVEdxtxv3u0bTA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/nested-clients": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.947.0.tgz", + "integrity": "sha512-S0Zqebr71KyrT6J4uYPhwV65g4V5uDPHnd7dt2W34FcyPu+hVC7Hx4MFmsPyVLeT5cMCkkZvmY3kAoEzgUPJJg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.947.0", + "@aws-sdk/credential-provider-http": "3.947.0", + "@aws-sdk/credential-provider-ini": "3.947.0", + "@aws-sdk/credential-provider-process": "3.947.0", + "@aws-sdk/credential-provider-sso": "3.947.0", + "@aws-sdk/credential-provider-web-identity": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.947.0.tgz", + "integrity": "sha512-WpanFbHe08SP1hAJNeDdBDVz9SGgMu/gc0XJ9u3uNpW99nKZjDpvPRAdW7WLA4K6essMjxWkguIGNOpij6Do2Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.947.0.tgz", + "integrity": "sha512-NktnVHTGaUMaozxycYrepvb3yfFquHTQ53lt6hBEVjYBzK3C4tVz0siUpr+5RMGLSiZ5bLBp2UjJPgwx4i4waQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.947.0", + "@aws-sdk/core": "3.947.0", + "@aws-sdk/token-providers": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.947.0.tgz", + "integrity": "sha512-gokm/e/YHiHLrZgLq4j8tNAn8RJDPbIcglFRKgy08q8DmAqHQ8MXAKW3eS0QjAuRXU9mcMmUo1NrX6FRNBCCPw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/nested-clients": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.936.0.tgz", + "integrity": "sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.936.0.tgz", + "integrity": "sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.947.0.tgz", + "integrity": "sha512-kXXxS2raNESNO+zR0L4YInVjhcGGNI2Mx0AE1ThRhDkAt2se3a+rGf9equ9YvOqA1m8Jl/GSI8cXYvSxXmS9Ag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.936.0.tgz", + "integrity": "sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.947.0.tgz", + "integrity": "sha512-DS2tm5YBKhPW2PthrRBDr6eufChbwXe0NjtTZcYDfUCXf0OR+W6cIqyKguwHMJ+IyYdey30AfVw9/Lb5KB8U8A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.7", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.936.0.tgz", + "integrity": "sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.947.0.tgz", + "integrity": "sha512-7rpKV8YNgCP2R4F9RjWZFcD2R+SO/0R4VHIbY9iZJdH2MzzJ8ZG7h8dZ2m8QkQd1fjx4wrFJGGPJUTYXPV3baA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.7", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.947.0.tgz", + "integrity": "sha512-DjRJEYNnHUTu9kGPPQDTSXquwSEd6myKR4ssI4FaYLFhdT3ldWpj73yYt807H3tdmhS7vPmdVqchSJnjurUQAw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.947.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.947.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.947.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.7", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-retry": "^4.4.14", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.13", + "@smithy/util-defaults-mode-node": "^4.2.16", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.947.0.tgz", + "integrity": "sha512-UaYmzoxf9q3mabIA2hc4T6x5YSFUG2BpNjAZ207EA1bnQMiK+d6vZvb83t7dIWL/U1de1sGV19c1C81Jf14rrA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.947.0.tgz", + "integrity": "sha512-X/DyB8GuK44rsE89Tn5+s542B3PhGbXQSgV8lvqHDzvicwCt0tWny6790st6CPETrVVV2K3oJMfG5U3/jAmaZA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.947.0", + "@aws-sdk/nested-clients": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.947.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.947.0.tgz", + "integrity": "sha512-+vhHoDrdbb+zerV4noQk1DHaUMNzWFWPpPYjVTwW2186k5BEJIecAMChYkghRrBVJ3KPWP1+JnZwOd72F3d4rQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.947.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", + "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", + "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.18.7", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.7.tgz", + "integrity": "sha512-axG9MvKhMWOhFbvf5y2DuyTxQueO0dkedY9QC3mAfndLosRI/9LJv8WaL0mw7ubNhsO4IuXX9/9dYGPFvHrqlw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", + "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", + "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", + "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", + "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", + "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz", + "integrity": "sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz", + "integrity": "sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.5.tgz", + "integrity": "sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.14.tgz", + "integrity": "sha512-v0q4uTKgBM8dsqGjqsabZQyH85nFaTnFcgpWU1uydKFsdyyMzfvOkNum9G7VK+dOP01vUnoZxIeRiJ6uD0kjIg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.14.tgz", + "integrity": "sha512-Z2DG8Ej7FyWG1UA+7HceINtSLzswUgs2np3sZX0YBBxCt+CXG4QUxv88ZDS3+2/1ldW7LqtSY1UO/6VQ1pND8Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.9.10", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.10.tgz", + "integrity": "sha512-Jaoz4Jw1QYHc1EFww/E6gVtNjhoDU+gwRKqXP6C3LKYqqH2UQhP8tMP3+t/ePrhaze7fhLE8vS2q6vVxBANFTQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.7", + "@smithy/middleware-endpoint": "^4.3.14", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.13.tgz", + "integrity": "sha512-hlVLdAGrVfyNei+pKIgqDTxfu/ZI2NSyqj4IDxKd5bIsIqwR/dSlkxlPaYxFiIaDVrBy0he8orsFy+Cz119XvA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.16.tgz", + "integrity": "sha512-F1t22IUiJLHrxW9W1CQ6B9PN+skZ9cqSuzB18Eh06HrJPbjsyZ7ZHecAKw80DQtyGTRcVfeukKaCRYebFwclbg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.10", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bowser": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", + "integrity": "sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==", + "license": "MIT" + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/canvas": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.0.tgz", + "integrity": "sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": "^18.12.0 || >= 20.9.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.85.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.85.0.tgz", + "integrity": "sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static/node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-static/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..17aa06d --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "ai-image-generator", + "version": "1.0.0", + "description": "AI Image Generation SPA", + "main": "server.js", + "scripts": { + "start": "node server.js" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.400.0", + "axios": "^1.6.0", + "canvas": "^3.2.0", + "cors": "^2.8.5", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "multer": "^1.4.5-lts.1", + "sharp": "^0.34.5" + } +} diff --git a/poc-workflow-v2.js b/poc-workflow-v2.js new file mode 100644 index 0000000..6fea573 --- /dev/null +++ b/poc-workflow-v2.js @@ -0,0 +1,395 @@ +/** + * POC Workflow V2: 强化产品一致性 + * 核心改进: + * 1. 极致详细的产品描述 (Golden Description) + * 2. 移除AI生成logo(后期处理) + * 3. 分级策略:A级严格复制,B级可控创意 + * 4. 对比图特殊处理 + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +// 配置 +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; +const OUTPUT_DIR = path.join(__dirname, 'output_poc_v2'); +const MATERIAL_DIR = path.join(__dirname, '素材/素材/已有的素材'); + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +async function uploadToR2(filePath) { + const fileName = `poc-v2-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + const publicUrl = process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; + + return publicUrl; +} + +// ============================================================ +// 🔥 核心改进1: 黄金产品描述 (Golden Product Description) +// ============================================================ +const GOLDEN_PRODUCT_DESC = ` +EXACT PRODUCT APPEARANCE (MUST MATCH PRECISELY): +- Shape: 8-PETAL FLOWER/FAN shape, C-shaped opening (like Pac-Man), NOT a full circle +- Color: ICE BLUE / Light aqua blue (#C5E8ED approximate) +- Material: Glossy waterproof PU fabric with visible stitching lines between petals +- Edge binding: TEAL/TURQUOISE color binding around the inner neck hole +- Closure: White velcro strap on one petal end +- Logo: "TOUCHDOG®" embroidered in matching blue thread on one petal (small, subtle) +- Texture: Smooth, slightly shiny, NOT matte, NOT cotton fabric +- Structure: Soft but structured, maintains petal shape, NOT floppy + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes +- ❌ NO matte cotton or fleece textures +- ❌ NO random brand logos or text +`; + +// ============================================================ +// 🔥 核心改进2: 分级Prompt策略 +// ============================================================ + +// A级:严格产品复制 (必须和参考图几乎一致) +function createPromptA_Strict(sceneDesc) { + return ` +[PRODUCT REPRODUCTION - HIGHEST FIDELITY] +${GOLDEN_PRODUCT_DESC} + +SCENE: ${sceneDesc} + +INSTRUCTION: Reproduce the EXACT product from reference image. +The product shape, color, and material must be IDENTICAL to reference. +Only change the background/scene as described. +DO NOT add any brand logo overlays or text graphics. +`.trim(); +} + +// B级:可控创意 (产品保持一致,场景可发挥) +function createPromptB_Controlled(sceneDesc, extraInstructions = '') { + return ` +[CONTROLLED CREATIVE - PRODUCT CONSISTENCY REQUIRED] +${GOLDEN_PRODUCT_DESC} + +SCENE: ${sceneDesc} + +${extraInstructions} + +INSTRUCTION: Keep product appearance EXACTLY as described above. +Creative freedom allowed ONLY for background, lighting, and composition. +DO NOT modify product shape, color, or material. +DO NOT add any brand logo overlays. +`.trim(); +} + +// C级:对比图专用 (左边严格,右边自由) +function createPromptC_Comparison() { + return ` +[COMPARISON IMAGE - SPLIT SCREEN] + +LEFT SIDE (OUR PRODUCT - STRICT): +${GOLDEN_PRODUCT_DESC} +- Happy, comfortable cat/dog wearing the ICE BLUE 8-PETAL soft cone +- Bright, colorful, warm lighting +- GREEN CHECKMARK overlay + +RIGHT SIDE (GENERIC COMPETITOR - FLEXIBLE): +- Generic transparent HARD PLASTIC cone (the traditional "lamp shade" type) +- Sad, uncomfortable looking cat/dog +- Grayscale / desaturated colors +- RED X-MARK overlay + +LAYOUT: Side by side, clear visual contrast +TEXT HEADER: "Soft & Comfortable" vs "Hard & Uncomfortable" + +CRITICAL: Left side product must be ICE BLUE 8-PETAL FLOWER shape, NOT any other design! +`.trim(); +} + +// 生图任务提交 +async function submitImageTask(prompt, refImageUrl, aspectRatio = '1:1') { + try { + const payload = { + key: API_KEY, + prompt: prompt, + img_url: refImageUrl, // 强参考图 + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + console.log(` 提交任务...`); + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload); + const taskId = response.data.data?.id; + + if (!taskId) { + console.error('Submit response:', response.data); + throw new Error('No task ID returned'); + } + + return taskId; + + } catch (error) { + console.error('Submit failed:', error.message); + throw error; + } +} + +// 轮询图片结果 +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 60; + + while (attempts < maxAttempts) { + try { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId } + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + + } catch (error) { + if (error.message.includes('Generation failed')) throw error; + console.error('Poll error:', error.message); + throw error; + } + } + throw new Error('Timeout waiting for image'); +} + +// 生成单张图(含重试) +async function generateSingleImage(item, refUrls) { + console.log(`\n🎨 [${item.level}级] ${item.id}: ${item.name}`); + + let retryCount = 0; + const maxRetries = 2; + + // 根据类型选择最佳参考图 + let refUrl = refUrls.flat; // 默认用平铺图 + if (item.useWornRef) { + refUrl = refUrls.worn; + } + + while (retryCount <= maxRetries) { + try { + if (retryCount > 0) console.log(` 重试第 ${retryCount} 次...`); + + const taskId = await submitImageTask(item.prompt, refUrl, item.aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ 生成成功'); + + // 下载保存 + const imgRes = await axios.get(imageUrl, { responseType: 'arraybuffer' }); + fs.writeFileSync(path.join(OUTPUT_DIR, `${item.id}.jpg`), imgRes.data); + console.log(' ✓ 保存本地'); + return true; + + } catch (error) { + console.error(`\n ✗ 失败: ${error.message}`); + retryCount++; + await new Promise(r => setTimeout(r, 3000)); + } + } + console.error(` ❌ ${item.id} 最终失败`); + return false; +} + +// ============================================================ +// 主流程 +// ============================================================ +async function main() { + if (!fs.existsSync(OUTPUT_DIR)) fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + + // 1. 上传核心参考图 + console.log('📤 上传核心参考图...'); + + const flatImgPath = path.join(MATERIAL_DIR, 'IMG_5683.png'); // 平铺图(最清晰产品细节) + const wornImgPath = path.join(MATERIAL_DIR, 'IMG_6514.JPG'); // 佩戴图 + + const refUrls = { + flat: await uploadToR2(flatImgPath), + worn: await uploadToR2(wornImgPath) + }; + + console.log(' 平铺图:', refUrls.flat); + console.log(' 佩戴图:', refUrls.worn); + + // 2. 定义优化后的图片任务 + const tasks = [ + // ========== A级:严格复制 ========== + { + id: 'Main_01_Hero', + name: '场景首图', + level: 'A', + aspectRatio: '1:1', + useWornRef: true, + prompt: createPromptA_Strict(` + Cute white fluffy cat wearing the product. + Cone opens OUTWARD around face (like flower petals spreading out). + Cat looks comfortable and relaxed. + Warm, cozy home interior background (soft focus). + Professional Amazon product photography, 8K quality. + `) + }, + { + id: 'Main_02_Flat', + name: '平铺白底图', + level: 'A', + aspectRatio: '1:1', + useWornRef: false, + prompt: createPromptA_Strict(` + Product flat lay on PURE WHITE background. + Shot from directly above (bird's eye view). + Show the 8-petal flower/fan shape clearly. + C-shaped opening (gap between velcro ends) visible. + Clean studio lighting, no shadows. + Product photography style. + `) + }, + + // ========== B级:可控创意 ========== + { + id: 'Main_03_Function', + name: '功能演示', + level: 'B', + aspectRatio: '1:1', + useWornRef: false, + prompt: createPromptB_Controlled(` + Close-up of hands adjusting the white velcro strap. + Show the velcro closure mechanism clearly. + Demonstrate "adjustable fit" feature. + Clean, bright lighting. + `) + }, + { + id: 'Main_04_Scenarios', + name: '多场景使用', + level: 'B', + aspectRatio: '1:1', + useWornRef: true, + prompt: createPromptB_Controlled(` + 2x2 grid showing different usage scenarios: + - Cat eating from bowl while wearing cone (cone allows eating) + - Cat drinking water comfortably + - Cat sleeping peacefully + - Cat walking around home + All showing the ICE BLUE 8-PETAL cone product. + `) + }, + { + id: 'APlus_01_Banner', + name: 'A+横幅', + level: 'B', + aspectRatio: '3:2', + useWornRef: true, + prompt: createPromptB_Controlled(` + Wide banner shot for Amazon A+ content. + Beautiful modern living room scene. + White cat wearing the ICE BLUE 8-petal cone walking on soft rug. + Left side has empty space for text overlay. + Warm, inviting home atmosphere. + Professional lifestyle photography. + `) + }, + { + id: 'APlus_03_Detail', + name: '材质细节', + level: 'B', + aspectRatio: '3:2', + useWornRef: false, + prompt: createPromptB_Controlled(` + Extreme close-up macro photography. + Focus on the ICE BLUE glossy PU material texture. + Water droplets beading on the waterproof surface. + Show the neat stitching between petals. + Show the TEAL edge binding around neck hole. + High-end product detail photography. + `) + }, + { + id: 'APlus_04_Waterproof', + name: '防水演示', + level: 'B', + aspectRatio: '3:2', + useWornRef: false, + prompt: createPromptB_Controlled(` + Action shot demonstrating waterproof feature. + Water being poured onto the ICE BLUE 8-petal cone. + Water droplets rolling off the glossy PU surface. + Dynamic splash photography style. + Bright lighting, white background. + `) + }, + + // ========== C级:对比图 ========== + { + id: 'APlus_02_Comparison', + name: '对比图', + level: 'C', + aspectRatio: '3:2', + useWornRef: true, + prompt: createPromptC_Comparison() + }, + ]; + + // 3. 执行生成 + console.log('\n🚀 开始V2优化版生成...\n'); + console.log('=' .repeat(50)); + + let successCount = 0; + for (const task of tasks) { + const success = await generateSingleImage(task, refUrls); + if (success) successCount++; + } + + console.log('\n' + '='.repeat(50)); + console.log(`✅ 完成! 成功 ${successCount}/${tasks.length} 张`); + console.log(`📁 输出目录: ${OUTPUT_DIR}`); + + // 4. 说明跳过的图 + console.log('\n⚠️ 以下图片建议后期处理,不适合纯AI生成:'); + console.log(' - Main_05_Size (尺寸图) → 用设计软件+产品抠图'); + console.log(' - Main_06_Brand (品牌图) → 用设计软件+官方logo'); + console.log(' - APlus_05_Storage (收纳图) → 需要真实折叠产品素材'); + console.log(' - APlus_06_Guide (选购指南) → 用设计软件模板'); +} + +main().catch(console.error); + + diff --git a/poc-workflow-v3.js b/poc-workflow-v3.js new file mode 100644 index 0000000..62d3874 --- /dev/null +++ b/poc-workflow-v3.js @@ -0,0 +1,482 @@ +/** + * POC Workflow V3: 通用化工作流 + * + * 特性: + * 1. 素材目录作为参数,支持一键切换SKU + * 2. Vision自动提取产品特征 + * 3. 基于真实交付成品的12张图模板 + * 4. 带文字排版的A+/主图 + * + * 用法: + * node poc-workflow-v3.js --material-dir="./素材/素材/已有的素材" --sku-name="Touchdog软质伊丽莎白圈" + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); +const { generateAllPrompts } = require('./prompts/image-templates'); + +// ============================================================ +// 配置 +// ============================================================ +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +// ============================================================ +// 命令行参数解析 +// ============================================================ +function parseArgs() { + const args = process.argv.slice(2); + const config = { + materialDir: path.join(__dirname, '素材/素材/已有的素材'), + skuName: 'Touchdog 软质伊丽莎白圈', + brandName: 'TOUCHDOG', + productName: 'CAT SOFT CONE COLLAR', + outputDir: null, // 自动生成 + sellingPoints: [ + 'CLOUD-LIGHT COMFORT', + 'WIDER & CLEARER', + 'FOLDABLE & PORTABLE', + 'WATERPROOF & EASY CLEAN' + ], + competitorWeaknesses: [ + 'HEAVY & BULKY', + 'BLOCKS VISION & MOVEMENT', + 'HARD TO STORE' + ], + features: [ + { title: 'STURDY AND BREATHABLE', desc: ', DURABLE AND COMFORTABLE' }, + { title: 'EASY TO CLEAN, STYLISH', desc: 'AND ATTRACTIVE' }, + { title: 'REINFORCED STITCHING PROCESS', desc: 'AND DURABLE FABRIC' } + ], + sizeChart: { + XS: { neck: '5.6-6.8IN', depth: '3.2IN' }, + S: { neck: '7.2-8.4IN', depth: '4IN' }, + M: { neck: '8.8-10.4IN', depth: '5IN' }, + L: { neck: '10.8-12.4IN', depth: '6IN' }, + XL: { neck: '12.8-14.4IN', depth: '7IN' } + } + }; + + for (const arg of args) { + if (arg.startsWith('--material-dir=')) { + config.materialDir = arg.split('=')[1]; + } else if (arg.startsWith('--sku-name=')) { + config.skuName = arg.split('=')[1]; + } else if (arg.startsWith('--brand-name=')) { + config.brandName = arg.split('=')[1]; + } else if (arg.startsWith('--product-name=')) { + config.productName = arg.split('=')[1]; + } else if (arg.startsWith('--output-dir=')) { + config.outputDir = arg.split('=')[1]; + } + } + + // 自动生成输出目录 + if (!config.outputDir) { + const timestamp = new Date().toISOString().slice(0, 10); + const safeName = config.skuName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '_').slice(0, 30); + config.outputDir = path.join(__dirname, `output_v3_${safeName}_${timestamp}`); + } + + return config; +} + +// ============================================================ +// 工具函数 +// ============================================================ + +async function uploadToR2(filePath) { + const fileName = `v3-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + return process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; +} + +// 扫描素材目录,找到关键图片 +async function scanMaterials(materialDir) { + console.log('📁 扫描素材目录:', materialDir); + + const files = fs.readdirSync(materialDir); + const images = files.filter(f => /\.(jpg|jpeg|png)$/i.test(f)); + + console.log(` 找到 ${images.length} 张图片`); + + // 识别图片类型 + let flatImage = null; // 平铺图 + let wornImage = null; // 佩戴图 + + for (const img of images) { + const imgPath = path.join(materialDir, img); + // 简单启发式:文件名包含特定关键词 + if (img.includes('5683') || img.toLowerCase().includes('flat')) { + flatImage = imgPath; + } else if (img.includes('6514') || img.toLowerCase().includes('worn') || img.toLowerCase().includes('wear')) { + wornImage = imgPath; + } + } + + // 如果没找到,用第一张和第二张 + if (!flatImage && images.length > 0) { + flatImage = path.join(materialDir, images[0]); + } + if (!wornImage && images.length > 1) { + wornImage = path.join(materialDir, images[1]); + } else if (!wornImage) { + wornImage = flatImage; + } + + console.log(' 平铺图:', flatImage ? path.basename(flatImage) : '未找到'); + console.log(' 佩戴图:', wornImage ? path.basename(wornImage) : '未找到'); + + return { flatImage, wornImage, allImages: images.map(i => path.join(materialDir, i)) }; +} + +// Vision API提取产品特征 +const VISION_EXTRACT_PROMPT = `Analyze this pet recovery cone product image in EXTREME detail. + +Output ONLY a valid JSON object (no markdown, no explanation): + +{ + "color": { + "primary": "", + "name": "", + "secondary": "" + }, + "shape": { + "type": "", + "petal_count": , + "opening": "", + "description": "" + }, + "material": { + "type": "", + "finish": "", + "texture": "" + }, + "edge_binding": { + "color": "", + "material": "" + }, + "closure": { + "type": "", + "color": "", + "position": "" + }, + "logo": { + "text": "", + "style": "", + "position": "" + }, + "unique_features": [""], + "overall_description": "<2-3 sentence summary>" +}`; + +async function extractProductFeatures(imageUrl) { + console.log('\n🔍 Vision分析产品特征...'); + + try { + const response = await axios.post(`${API_BASE}/chat/index`, { + key: API_KEY, + model: 'gemini-3-pro', + content: VISION_EXTRACT_PROMPT, + image_url: imageUrl + }, { timeout: 90000 }); + + const content = response.data.data?.choices?.[0]?.message?.content || + response.data.data?.content; + + if (!content) { + throw new Error('Vision响应为空'); + } + + // 提取JSON + const jsonMatch = content.match(/\{[\s\S]*\}/); + if (jsonMatch) { + const parsed = JSON.parse(jsonMatch[0]); + console.log(' ✓ 提取成功'); + return parsed; + } + + throw new Error('无法解析JSON'); + } catch (error) { + console.error(' ✗ Vision分析失败:', error.message); + return null; + } +} + +// 将Vision结果转换为Golden Description +function buildGoldenDescription(visionResult) { + if (!visionResult) { + return ` +PRODUCT: Pet recovery cone collar +- Soft, flexible material +- C-shaped opening design +- Velcro closure +- Comfortable for pets +`; + } + + const r = visionResult; + return ` +EXACT PRODUCT APPEARANCE (AUTO-EXTRACTED): +- Shape: ${r.shape?.petal_count || '?'}-PETAL ${r.shape?.type?.toUpperCase() || 'FLOWER'} shape, ${r.shape?.opening || 'C-shaped'} opening +- Color: ${r.color?.name?.toUpperCase() || 'UNKNOWN'} (${r.color?.primary || '#???'}) +- Material: ${r.material?.finish || 'Soft'} ${r.material?.type || 'fabric'} with ${r.material?.texture || 'smooth'} texture +- Edge binding: ${r.edge_binding?.color || 'Contrasting color'} ${r.edge_binding?.material || 'ribbed elastic'} around inner neck hole +- Closure: ${r.closure?.color || 'White'} ${r.closure?.type || 'velcro'} on ${r.closure?.position || 'one end'} +- Logo: "${r.logo?.text || 'TOUCHDOG'}" ${r.logo?.style || 'embroidered'} + +UNIQUE FEATURES: +${(r.unique_features || []).map(f => `- ${f}`).join('\n') || '- Soft, comfortable design'} + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes (must have C-opening) +- ❌ NO random brand logos +`.trim(); +} + +// 生图任务 +async function submitImageTask(prompt, refImageUrl, aspectRatio = '1:1') { + const payload = { + key: API_KEY, + prompt: prompt, + img_url: refImageUrl, + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload); + const taskId = response.data.data?.id; + + if (!taskId) { + throw new Error('No task ID returned'); + } + return taskId; +} + +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 90; + + while (attempts < maxAttempts) { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId } + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + } + throw new Error('Timeout'); +} + +async function generateSingleImage(item, refUrl, outputDir) { + console.log(`\n🎨 [${item.id}] ${item.name}`); + + let retryCount = 0; + const maxRetries = 2; + + while (retryCount <= maxRetries) { + try { + if (retryCount > 0) console.log(` 重试 ${retryCount}/${maxRetries}...`); + + console.log(' 提交任务...'); + const taskId = await submitImageTask(item.prompt, refUrl, item.aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ 生成成功'); + + // 下载保存 + const imgRes = await axios.get(imageUrl, { responseType: 'arraybuffer' }); + const outputPath = path.join(outputDir, `${item.id}.jpg`); + fs.writeFileSync(outputPath, imgRes.data); + console.log(` ✓ 保存: ${item.id}.jpg`); + + return { id: item.id, success: true, path: outputPath }; + + } catch (error) { + console.error(`\n ✗ 失败: ${error.message}`); + retryCount++; + await new Promise(r => setTimeout(r, 3000)); + } + } + + return { id: item.id, success: false, error: 'Max retries exceeded' }; +} + +// ============================================================ +// 主流程 +// ============================================================ + +async function main() { + const config = parseArgs(); + + console.log('='.repeat(70)); + console.log('🚀 POC Workflow V3 - 通用化工作流'); + console.log('='.repeat(70)); + console.log('\n📋 配置:'); + console.log(' 素材目录:', config.materialDir); + console.log(' SKU名称:', config.skuName); + console.log(' 品牌:', config.brandName); + console.log(' 输出目录:', config.outputDir); + + // 创建输出目录 + if (!fs.existsSync(config.outputDir)) { + fs.mkdirSync(config.outputDir, { recursive: true }); + } + + // 1. 扫描素材 + console.log('\n' + '─'.repeat(70)); + console.log('📁 阶段1: 扫描素材'); + console.log('─'.repeat(70)); + + const materials = await scanMaterials(config.materialDir); + + if (!materials.flatImage) { + console.error('❌ 未找到素材图片,请检查素材目录'); + process.exit(1); + } + + // 2. 上传素材到R2 + console.log('\n' + '─'.repeat(70)); + console.log('📤 阶段2: 上传素材'); + console.log('─'.repeat(70)); + + const flatImageUrl = await uploadToR2(materials.flatImage); + console.log(' 平铺图URL:', flatImageUrl); + + let wornImageUrl = flatImageUrl; + if (materials.wornImage && materials.wornImage !== materials.flatImage) { + wornImageUrl = await uploadToR2(materials.wornImage); + console.log(' 佩戴图URL:', wornImageUrl); + } + + // 3. Vision分析 + console.log('\n' + '─'.repeat(70)); + console.log('🔍 阶段3: Vision分析产品特征'); + console.log('─'.repeat(70)); + + const visionResult = await extractProductFeatures(flatImageUrl); + const goldenDescription = buildGoldenDescription(visionResult); + + console.log('\n生成的Golden Description:'); + console.log(goldenDescription.substring(0, 500) + '...'); + + // 保存Vision结果 + fs.writeFileSync( + path.join(config.outputDir, 'vision-analysis.json'), + JSON.stringify(visionResult, null, 2) + ); + fs.writeFileSync( + path.join(config.outputDir, 'golden-description.txt'), + goldenDescription + ); + + // 4. 生成12张图的Prompts + console.log('\n' + '─'.repeat(70)); + console.log('📝 阶段4: 生成Prompts'); + console.log('─'.repeat(70)); + + const product = { goldenDescription }; + const skuInfo = { + brandName: config.brandName, + productName: config.productName, + sellingPoints: config.sellingPoints, + competitorWeaknesses: config.competitorWeaknesses, + features: config.features, + sizeChart: config.sizeChart + }; + + const prompts = generateAllPrompts(product, skuInfo); + console.log(` 生成了 ${prompts.length} 个Prompt`); + + // 保存prompts供参考 + fs.writeFileSync( + path.join(config.outputDir, 'prompts.json'), + JSON.stringify(prompts.map(p => ({ id: p.id, name: p.name, aspectRatio: p.aspectRatio })), null, 2) + ); + + // 5. 批量生成图片 + console.log('\n' + '─'.repeat(70)); + console.log('🎨 阶段5: 批量生成图片'); + console.log('─'.repeat(70)); + + const results = []; + for (const promptItem of prompts) { + // 根据图片类型选择参考图 + const refUrl = promptItem.id.includes('Main_02') ? flatImageUrl : wornImageUrl; + + const result = await generateSingleImage(promptItem, refUrl, config.outputDir); + results.push(result); + } + + // 6. 总结 + console.log('\n' + '='.repeat(70)); + console.log('📊 生成完成'); + console.log('='.repeat(70)); + + const successCount = results.filter(r => r.success).length; + console.log(`\n✅ 成功: ${successCount}/${results.length}`); + + if (successCount < results.length) { + console.log('\n❌ 失败的图片:'); + results.filter(r => !r.success).forEach(r => { + console.log(` - ${r.id}: ${r.error}`); + }); + } + + console.log(`\n📁 输出目录: ${config.outputDir}`); + + // 保存结果摘要 + fs.writeFileSync( + path.join(config.outputDir, 'results.json'), + JSON.stringify({ + config, + visionResult, + results, + summary: { + total: results.length, + success: successCount, + failed: results.length - successCount + } + }, null, 2) + ); +} + +main().catch(console.error); + + diff --git a/poc-workflow-v4.js b/poc-workflow-v4.js new file mode 100644 index 0000000..e44ea3b --- /dev/null +++ b/poc-workflow-v4.js @@ -0,0 +1,399 @@ +/** + * POC Workflow V4: 完整优化版 + * + * 改进: + * 1. Vision超时重试机制 + * 2. 可配置的套路模板系统 + * 3. 基于真实交付成品的Prompt + * 4. 强化产品一致性约束 + * + * 用法: + * node poc-workflow-v4.js --material-dir="./素材/素材/已有的素材" --sku-name="Touchdog冰蓝色伊丽莎白圈" + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); +const { extractProductFeatures, buildGoldenDescription } = require('./lib/vision-extractor'); +const { generateAllPrompts } = require('./lib/template-config'); + +// ============================================================ +// 配置 +// ============================================================ +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +// ============================================================ +// 命令行参数解析 +// ============================================================ +function parseArgs() { + const args = process.argv.slice(2); + const config = { + materialDir: path.join(__dirname, '素材/素材/已有的素材'), + skuName: 'Touchdog 软质伊丽莎白圈', + brandName: 'TOUCHDOG', + productName: 'CAT SOFT CONE COLLAR', + petType: 'cat', + outputDir: null + }; + + for (const arg of args) { + if (arg.startsWith('--material-dir=')) { + config.materialDir = arg.split('=')[1]; + } else if (arg.startsWith('--sku-name=')) { + config.skuName = arg.split('=')[1]; + } else if (arg.startsWith('--brand-name=')) { + config.brandName = arg.split('=')[1]; + } else if (arg.startsWith('--product-name=')) { + config.productName = arg.split('=')[1]; + } else if (arg.startsWith('--output-dir=')) { + config.outputDir = arg.split('=')[1]; + } else if (arg.startsWith('--pet-type=')) { + config.petType = arg.split('=')[1]; + } + } + + // 自动生成输出目录 + if (!config.outputDir) { + const timestamp = new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-'); + const safeName = config.skuName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '_').slice(0, 20); + config.outputDir = path.join(__dirname, `output_v4_${safeName}_${timestamp}`); + } + + return config; +} + +// ============================================================ +// 工具函数 +// ============================================================ + +async function uploadToR2(filePath) { + const fileName = `v4-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + return process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; +} + +// 扫描素材目录 +async function scanMaterials(materialDir) { + console.log('📁 扫描素材目录:', materialDir); + + if (!fs.existsSync(materialDir)) { + throw new Error(`素材目录不存在: ${materialDir}`); + } + + const files = fs.readdirSync(materialDir); + const images = files.filter(f => /\.(jpg|jpeg|png)$/i.test(f)); + + console.log(` 找到 ${images.length} 张图片: ${images.join(', ')}`); + + // 识别图片类型 + let flatImage = null; // 平铺图 + let wornImage = null; // 佩戴图 + + for (const img of images) { + const imgPath = path.join(materialDir, img); + const imgLower = img.toLowerCase(); + + // 平铺图识别 + if (img.includes('5683') || imgLower.includes('flat') || imgLower.includes('1.png')) { + flatImage = imgPath; + } + // 佩戴图识别 + if (img.includes('6514') || imgLower.includes('worn') || imgLower.includes('wear') || imgLower.includes('3.png')) { + wornImage = imgPath; + } + } + + // 如果没找到,用启发式规则 + if (!flatImage) { + // 优先选png格式(通常更清晰) + const pngImages = images.filter(i => i.toLowerCase().endsWith('.png')); + flatImage = pngImages.length > 0 + ? path.join(materialDir, pngImages[0]) + : path.join(materialDir, images[0]); + } + + if (!wornImage) { + const jpgImages = images.filter(i => i.toLowerCase().endsWith('.jpg') || i.toLowerCase().endsWith('.jpeg')); + wornImage = jpgImages.length > 0 + ? path.join(materialDir, jpgImages[0]) + : flatImage; + } + + console.log(' ✓ 平铺图:', path.basename(flatImage)); + console.log(' ✓ 佩戴图:', path.basename(wornImage)); + + return { flatImage, wornImage, allImages: images.map(i => path.join(materialDir, i)) }; +} + +// 生图任务 +async function submitImageTask(prompt, refImageUrl, aspectRatio = '1:1') { + const payload = { + key: API_KEY, + prompt: prompt, + img_url: refImageUrl, + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload, { + timeout: 30000 + }); + + const taskId = response.data.data?.id; + if (!taskId) { + console.error('Submit response:', response.data); + throw new Error('No task ID returned'); + } + return taskId; +} + +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 90; + + while (attempts < maxAttempts) { + try { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId }, + timeout: 10000 + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + } catch (error) { + if (error.message.includes('Generation failed')) throw error; + // 网络错误,继续重试 + process.stdout.write('x'); + await new Promise(r => setTimeout(r, 3000)); + attempts++; + } + } + throw new Error('Timeout after ' + maxAttempts + ' attempts'); +} + +async function generateSingleImage(item, refUrl, outputDir) { + console.log(`\n🎨 [${item.id}] ${item.name}`); + + let retryCount = 0; + const maxRetries = 2; + + while (retryCount <= maxRetries) { + try { + if (retryCount > 0) console.log(` 重试 ${retryCount}/${maxRetries}...`); + + console.log(' 提交任务...'); + const taskId = await submitImageTask(item.prompt, refUrl, item.aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ 生成成功'); + + // 下载保存 + const imgRes = await axios.get(imageUrl, { responseType: 'arraybuffer', timeout: 30000 }); + const outputPath = path.join(outputDir, `${item.id}.jpg`); + fs.writeFileSync(outputPath, imgRes.data); + console.log(` ✓ 保存: ${item.id}.jpg`); + + return { id: item.id, success: true, path: outputPath }; + + } catch (error) { + console.error(`\n ✗ 失败: ${error.message}`); + retryCount++; + if (retryCount <= maxRetries) { + await new Promise(r => setTimeout(r, 5000)); + } + } + } + + return { id: item.id, success: false, error: 'Max retries exceeded' }; +} + +// ============================================================ +// 主流程 +// ============================================================ + +async function main() { + const config = parseArgs(); + + console.log('\n' + '═'.repeat(70)); + console.log('🚀 POC Workflow V4 - 完整优化版'); + console.log('═'.repeat(70)); + console.log('\n📋 配置:'); + console.log(' 素材目录:', config.materialDir); + console.log(' SKU名称:', config.skuName); + console.log(' 品牌:', config.brandName); + console.log(' 输出目录:', config.outputDir); + + // 创建输出目录 + if (!fs.existsSync(config.outputDir)) { + fs.mkdirSync(config.outputDir, { recursive: true }); + } + + // ========== 阶段1: 扫描素材 ========== + console.log('\n' + '─'.repeat(70)); + console.log('📁 阶段1: 扫描素材'); + console.log('─'.repeat(70)); + + const materials = await scanMaterials(config.materialDir); + + if (!materials.flatImage) { + console.error('❌ 未找到素材图片'); + process.exit(1); + } + + // ========== 阶段2: 上传素材 ========== + console.log('\n' + '─'.repeat(70)); + console.log('📤 阶段2: 上传素材到云存储'); + console.log('─'.repeat(70)); + + const flatImageUrl = await uploadToR2(materials.flatImage); + console.log(' 平铺图:', flatImageUrl); + + let wornImageUrl = flatImageUrl; + if (materials.wornImage && materials.wornImage !== materials.flatImage) { + wornImageUrl = await uploadToR2(materials.wornImage); + console.log(' 佩戴图:', wornImageUrl); + } + + // ========== 阶段3: Vision分析 ========== + console.log('\n' + '─'.repeat(70)); + console.log('🔍 阶段3: Vision分析产品特征 (超时重试机制)'); + console.log('─'.repeat(70)); + + const visionResult = await extractProductFeatures(flatImageUrl, { + maxRetries: 3, + timeout: 150000, // 150秒 + retryDelay: 8000, + cacheDir: config.outputDir, + cacheKey: path.basename(materials.flatImage).replace(/\.[^.]+$/, '') + }); + + const goldenDescription = buildGoldenDescription(visionResult); + + console.log('\n📝 Golden Description预览:'); + console.log('─'.repeat(50)); + console.log(goldenDescription.substring(0, 600) + '...'); + + // 保存分析结果 + fs.writeFileSync( + path.join(config.outputDir, 'vision-analysis.json'), + JSON.stringify(visionResult, null, 2) + ); + fs.writeFileSync( + path.join(config.outputDir, 'golden-description.txt'), + goldenDescription + ); + + // ========== 阶段4: 生成Prompts ========== + console.log('\n' + '─'.repeat(70)); + console.log('📝 阶段4: 生成12张图的Prompts (可配置模板系统)'); + console.log('─'.repeat(70)); + + const product = { goldenDescription }; + const skuInfo = { + brandName: config.brandName, + productName: config.productName, + petType: config.petType + }; + + const prompts = generateAllPrompts(product, skuInfo); + console.log(` ✓ 生成了 ${prompts.length} 个Prompt`); + + // 保存prompts供参考 + fs.writeFileSync( + path.join(config.outputDir, 'all-prompts.json'), + JSON.stringify(prompts.map(p => ({ + id: p.id, + name: p.name, + type: p.type, + aspectRatio: p.aspectRatio, + prompt: p.prompt + })), null, 2) + ); + + // ========== 阶段5: 批量生成 ========== + console.log('\n' + '─'.repeat(70)); + console.log('🎨 阶段5: 批量生成图片'); + console.log('─'.repeat(70)); + + const results = []; + for (const promptItem of prompts) { + // Main_02用平铺图参考,其他用佩戴图 + const refUrl = promptItem.id === 'Main_02' ? flatImageUrl : wornImageUrl; + + const result = await generateSingleImage(promptItem, refUrl, config.outputDir); + results.push(result); + } + + // ========== 阶段6: 总结 ========== + console.log('\n' + '═'.repeat(70)); + console.log('📊 生成完成'); + console.log('═'.repeat(70)); + + const successCount = results.filter(r => r.success).length; + console.log(`\n✅ 成功: ${successCount}/${results.length}`); + + if (successCount < results.length) { + console.log('\n❌ 失败的图片:'); + results.filter(r => !r.success).forEach(r => { + console.log(` - ${r.id}: ${r.error}`); + }); + } + + console.log(`\n📁 输出目录: ${config.outputDir}`); + + // 保存结果摘要 + fs.writeFileSync( + path.join(config.outputDir, 'results-summary.json'), + JSON.stringify({ + config, + visionSuccess: !!visionResult, + results, + summary: { + total: results.length, + success: successCount, + failed: results.length - successCount + }, + timestamp: new Date().toISOString() + }, null, 2) + ); + + console.log('\n💡 提示: 查看 all-prompts.json 了解每张图的Prompt详情'); +} + +main().catch(console.error); + + diff --git a/poc-workflow-v5.js b/poc-workflow-v5.js new file mode 100644 index 0000000..ff7de1e --- /dev/null +++ b/poc-workflow-v5.js @@ -0,0 +1,687 @@ +/** + * POC Workflow V5: P图合成工作流 + * + * 核心策略: + * - 产品部分:使用原始素材(100%一致) + * - 背景/场景:AI生成(无产品) + * - 文字排版:AI生成或代码叠加 + * - 最终图片:代码合成各层 + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const sharp = require('sharp'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); +const imageProcessor = require('./lib/image-processor'); + +// ============================================================ +// 配置 +// ============================================================ +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +// ============================================================ +// 工具函数 +// ============================================================ + +async function uploadToR2(buffer, filename) { + const fileName = `v5-${Date.now()}-${filename}`; + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: buffer, + ContentType: filename.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + return process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; +} + +async function uploadFileToR2(filePath) { + const buffer = fs.readFileSync(filePath); + return await uploadToR2(buffer, path.basename(filePath)); +} + +// 生图任务 +async function submitImageTask(prompt, refImageUrl = null, aspectRatio = '1:1') { + const payload = { + key: API_KEY, + prompt: prompt, + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + if (refImageUrl) { + payload.img_url = refImageUrl; + } + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload, { timeout: 30000 }); + const taskId = response.data.data?.id; + + if (!taskId) { + throw new Error('No task ID returned'); + } + return taskId; +} + +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 90; + + while (attempts < maxAttempts) { + try { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId }, + timeout: 10000 + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + } catch (error) { + if (error.message.includes('Generation failed')) throw error; + process.stdout.write('x'); + await new Promise(r => setTimeout(r, 3000)); + attempts++; + } + } + throw new Error('Timeout'); +} + +async function downloadImage(url) { + const response = await axios.get(url, { responseType: 'arraybuffer', timeout: 30000 }); + return Buffer.from(response.data); +} + +async function generateAIImage(prompt, refImageUrl = null, aspectRatio = '1:1') { + console.log(' 提交AI任务...'); + const taskId = await submitImageTask(prompt, refImageUrl, aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ AI生成完成'); + + return await downloadImage(imageUrl); +} + +// ============================================================ +// 12张图的生成逻辑 +// ============================================================ + +/** + * Main_01: 场景首图+卖点 + * 策略:原图叠加到AI生成的背景上,再由AI添加文字 + */ +async function generateMain01(materials, config, outputDir) { + console.log('\n🎨 [Main_01] 场景首图+卖点'); + + // 直接用原佩戴图,让AI基于它编辑(添加文字和调整背景) + const wornBuffer = fs.readFileSync(materials.wornImage); + const wornUrl = await uploadToR2(wornBuffer, 'worn.jpg'); + + const prompt = ` +Edit this image of a cat wearing a pet recovery cone: +1. KEEP the cat and product EXACTLY as shown - DO NOT modify them +2. Enhance the background to be a warm, cozy home interior +3. Add soft, warm lighting effects +4. Add text overlay: + - A curved blue banner across the middle-left with text "DESIGNED FOR COMFORTABLE RECOVERY" + - 3 feature boxes at the bottom: + * "LIGHTER THAN AN EGG" with egg icon + * "WATERPROOF & EASY WIPE" with water droplet icon + * "BREATHABLE COTTON LINING" with cloud icon +5. Add subtle paw print decorations + +Style: Professional Amazon product photography with text overlay +Output: 1:1 square image, high quality +`.trim(); + + const result = await generateAIImage(prompt, wornUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_01.jpg')); + return true; +} + +/** + * Main_02: 白底平铺+细节放大 + * 策略:使用原平铺图,代码添加标注和放大镜效果 + */ +async function generateMain02(materials, config, outputDir) { + console.log('\n🎨 [Main_02] 白底平铺+细节放大'); + + // 读取原图 + const flatBuffer = fs.readFileSync(materials.flatImage); + const metadata = await sharp(flatBuffer).metadata(); + + // 目标尺寸 1600x1600 + const targetSize = 1600; + + // 调整原图大小,留出空间给标题和标注 + const productSize = Math.floor(targetSize * 0.65); + const productBuffer = await sharp(flatBuffer) + .resize(productSize, productSize, { fit: 'contain', background: { r: 255, g: 255, b: 255, alpha: 1 } }) + .toBuffer(); + + // 创建白色背景 + const background = await sharp({ + create: { + width: targetSize, + height: targetSize, + channels: 3, + background: { r: 255, g: 255, b: 255 } + } + }).jpeg().toBuffer(); + + // 创建标题横幅 + const bannerHeight = 80; + const bannerSvg = ` + + + "DURABLE WATERPROOF PU LAYER" + + `; + const bannerBuffer = await sharp(Buffer.from(bannerSvg)).png().toBuffer(); + + // 创建两个放大镜效果的细节图 + const detailSize = 180; + + // 从原图裁剪细节区域(左下角材质,右下角内圈) + const origWidth = metadata.width; + const origHeight = metadata.height; + + // 细节1:左下角区域 + const detail1 = await sharp(flatBuffer) + .extract({ + left: Math.floor(origWidth * 0.1), + top: Math.floor(origHeight * 0.6), + width: Math.floor(origWidth * 0.25), + height: Math.floor(origHeight * 0.25) + }) + .resize(detailSize, detailSize, { fit: 'cover' }) + .toBuffer(); + + // 细节2:中心内圈区域 + const detail2 = await sharp(flatBuffer) + .extract({ + left: Math.floor(origWidth * 0.35), + top: Math.floor(origHeight * 0.35), + width: Math.floor(origWidth * 0.3), + height: Math.floor(origHeight * 0.3) + }) + .resize(detailSize, detailSize, { fit: 'cover' }) + .toBuffer(); + + // 创建圆形遮罩 + const circleMask = Buffer.from(` + + + + `); + + const detail1Circle = await sharp(detail1) + .composite([{ input: circleMask, blend: 'dest-in' }]) + .png() + .toBuffer(); + + const detail2Circle = await sharp(detail2) + .composite([{ input: circleMask, blend: 'dest-in' }]) + .png() + .toBuffer(); + + // 添加绿色边框 + const borderSvg = Buffer.from(` + + + + `); + + const detail1WithBorder = await sharp(detail1Circle) + .composite([{ input: borderSvg }]) + .toBuffer(); + + const detail2WithBorder = await sharp(detail2Circle) + .composite([{ input: borderSvg }]) + .toBuffer(); + + // 创建标签文字 + const label1Svg = Buffer.from(` + + DURABLE WATERPROOF PU LAYER + + `); + + const label2Svg = Buffer.from(` + + DOUBLE-LAYER COMFORT + + `); + + // 合成所有图层 + const productTop = bannerHeight + 50; + const productLeft = (targetSize - productSize) / 2; + + const composite = await sharp(background) + .composite([ + { input: bannerBuffer, top: 0, left: 0 }, + { input: productBuffer, top: productTop, left: productLeft }, + { input: detail1WithBorder, top: targetSize - detailSize - 120, left: 80 }, + { input: await sharp(label1Svg).png().toBuffer(), top: targetSize - 80, left: 80 }, + { input: detail2WithBorder, top: targetSize - detailSize - 120, left: targetSize - detailSize - 80 }, + { input: await sharp(label2Svg).png().toBuffer(), top: targetSize - 80, left: targetSize - 300 - 80 } + ]) + .jpeg({ quality: 95 }) + .toBuffer(); + + await imageProcessor.saveImage(composite, path.join(outputDir, 'Main_02.jpg')); + return true; +} + +/** + * Main_03-06 和 APlus_01-06: 使用原图让AI编辑 + * 策略:传入原图,让AI保持产品不变,只做背景和文字编辑 + */ +async function generateImageWithOriginal(id, name, materials, prompt, aspectRatio, outputDir) { + console.log(`\n🎨 [${id}] ${name}`); + + // 选择合适的参考图 + const refImage = id.includes('02') || id.includes('05') || id.includes('06') + ? materials.flatImage + : materials.wornImage; + + const refBuffer = fs.readFileSync(refImage); + const refUrl = await uploadToR2(refBuffer, `ref-${id}.jpg`); + + const result = await generateAIImage(prompt, refUrl, aspectRatio); + await imageProcessor.saveImage(result, path.join(outputDir, `${id}.jpg`)); + return true; +} + +/** + * APlus_02: 对比图 - 特殊处理 + * 左边用原图,右边AI生成竞品 + */ +async function generateAPlus02(materials, config, outputDir) { + console.log('\n🎨 [APlus_02] 对比图'); + + // 用原佩戴图作为参考 + const wornBuffer = fs.readFileSync(materials.wornImage); + const wornUrl = await uploadToR2(wornBuffer, 'comparison-ref.jpg'); + + const prompt = ` +Create an Amazon A+ comparison image (landscape 3:2 ratio): + +LEFT SIDE (colorful, positive): +- Show a happy cat/dog wearing the EXACT same soft cone collar from the reference image +- The cone collar must match the reference EXACTLY in color, shape, and material +- Green checkmark icon +- Label "OUR" on coral/orange background +- 3 selling points in white text: + • CLOUD-LIGHT COMFORT + • WIDER & CLEARER + • FOLDABLE & PORTABLE + +RIGHT SIDE (grayscale, negative): +- Show a sad cat wearing a HARD PLASTIC transparent cone (traditional lampshade style) +- Red X icon +- Label "OTHER" on gray background +- Grayscale/desaturated colors +- 3 weaknesses in gray text: + • HEAVY & BULKY + • BLOCKS VISION & MOVEMENT + • HARD TO STORE + +CRITICAL: +- LEFT product MUST match the reference image exactly (soft fabric cone) +- RIGHT product should be a generic hard plastic cone (NOT our product) +- NO product image in the center +- Background: warm beige with paw print watermarks +`.trim(); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_02.jpg')); + return true; +} + +// ============================================================ +// 主流程 +// ============================================================ + +async function main() { + const args = process.argv.slice(2); + let materialDir = path.join(__dirname, '素材/素材/已有的素材'); + let skuName = 'Touchdog冰蓝色伊丽莎白圈'; + + for (const arg of args) { + if (arg.startsWith('--material-dir=')) { + materialDir = arg.split('=')[1]; + } else if (arg.startsWith('--sku-name=')) { + skuName = arg.split('=')[1]; + } + } + + const timestamp = new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-'); + const safeName = skuName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '_').slice(0, 20); + const outputDir = path.join(__dirname, `output_v5_${safeName}_${timestamp}`); + + console.log('\n' + '═'.repeat(70)); + console.log('🚀 POC Workflow V5 - P图合成工作流'); + console.log('═'.repeat(70)); + console.log('\n📋 核心策略: 保持原素材产品不变,AI只编辑背景和文字'); + console.log(' 素材目录:', materialDir); + console.log(' 输出目录:', outputDir); + + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + // 扫描素材 + const files = fs.readdirSync(materialDir); + const images = files.filter(f => /\.(jpg|jpeg|png)$/i.test(f)); + + // 识别平铺图和佩戴图 + let flatImage = images.find(i => i.includes('5683') || i.includes('1.png')); + let wornImage = images.find(i => i.includes('6514') || i.includes('3.png') || i.includes('3.jpg')); + + if (!flatImage) flatImage = images.find(i => i.endsWith('.png')) || images[0]; + if (!wornImage) wornImage = images.find(i => i.endsWith('.jpg') || i.endsWith('.JPG')) || flatImage; + + const materials = { + flatImage: path.join(materialDir, flatImage), + wornImage: path.join(materialDir, wornImage) + }; + + console.log('\n📁 素材:'); + console.log(' 平铺图:', flatImage); + console.log(' 佩戴图:', wornImage); + + const config = { brandName: 'TOUCHDOG', productName: 'CAT SOFT CONE COLLAR' }; + const results = []; + + // ========== 生成12张图 ========== + console.log('\n' + '─'.repeat(70)); + console.log('🎨 开始生成12张图'); + console.log('─'.repeat(70)); + + try { + // Main_01: 场景首图 + results.push({ id: 'Main_01', success: await generateMain01(materials, config, outputDir) }); + } catch (e) { + console.error('Main_01 失败:', e.message); + results.push({ id: 'Main_01', success: false, error: e.message }); + } + + try { + // Main_02: 白底平铺+细节(代码合成) + results.push({ id: 'Main_02', success: await generateMain02(materials, config, outputDir) }); + } catch (e) { + console.error('Main_02 失败:', e.message); + results.push({ id: 'Main_02', success: false, error: e.message }); + } + + // Main_03: 功能调节展示 + try { + const prompt03 = ` +Edit this image to create an Amazon product feature showcase: +1. KEEP the pet and product EXACTLY as shown +2. Use a background color that matches the product's main color +3. Add title at top-left: "ADJUSTABLE STRAP FOR A SECURE FIT" +4. Add 2 circular detail callouts on the right side: + - One showing velcro closure detail, label: "SECURE THE ADJUSTABLE STRAP" + - One showing the product from another angle, label: "ADJUST FOR A SNUG FIT" +5. Add paw print decorations +Style: Professional Amazon infographic, 1:1 square +`.trim(); + results.push({ id: 'Main_03', success: await generateImageWithOriginal('Main_03', '功能调节展示', materials, prompt03, '1:1', outputDir) }); + } catch (e) { + console.error('Main_03 失败:', e.message); + results.push({ id: 'Main_03', success: false, error: e.message }); + } + + // Main_04: 多场景使用 + try { + const prompt04 = ` +Create a 2x2 grid Amazon product image showing 4 usage scenarios: +Based on the reference image, show the SAME product (keep it identical) in 4 scenes: + +TOP-LEFT: Cat standing, wearing the product +Caption: "• HYGIENIC & EASY TO CLEAN" + +TOP-RIGHT: Cat eating from bowl while wearing product +Caption: "• UNRESTRICTED EATING/DRINKING" + +BOTTOM-LEFT: Cat playing/stretching with product +Caption: "• REVERSIBLE WEAR" + +BOTTOM-RIGHT: Cat sleeping peacefully with product +Caption: "• 360° COMFORT" + +CRITICAL: The product in ALL 4 scenes must match the reference image EXACTLY +Background: Warm beige with paw print watermarks +Style: Rounded rectangle frames for each scene +`.trim(); + results.push({ id: 'Main_04', success: await generateImageWithOriginal('Main_04', '多场景使用', materials, prompt04, '1:1', outputDir) }); + } catch (e) { + console.error('Main_04 失败:', e.message); + results.push({ id: 'Main_04', success: false, error: e.message }); + } + + // Main_05: 尺寸图(代码生成) + try { + console.log('\n🎨 [Main_05] 尺寸图'); + + const flatBuffer = fs.readFileSync(materials.flatImage); + const targetSize = 1600; + const productSize = Math.floor(targetSize * 0.5); + + const productBuffer = await sharp(flatBuffer) + .resize(productSize, productSize, { fit: 'contain', background: { r: 245, g: 237, b: 228, alpha: 1 } }) + .toBuffer(); + + // 创建米色背景 + const background = await sharp({ + create: { width: targetSize, height: targetSize, channels: 3, background: { r: 245, g: 237, b: 228 } } + }).jpeg().toBuffer(); + + // 标题 + const titleSvg = Buffer.from(` + + PRODUCT SIZE + + `); + + // 尺寸表 + const tableSvg = Buffer.from(` + + + SIZE + NECK + DEPTH + + + XS + 5.6-6.8IN + 3.2IN + + + S + 7.2-8.4IN + 4IN + + + M + 8.8-10.4IN + 5IN + + + L + 10.8-12.4IN + 6IN + + + XL + 12.8-14.4IN + 7IN + + + NOTE: ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE + + + `); + + const composite = await sharp(background) + .composite([ + { input: await sharp(titleSvg).png().toBuffer(), top: 20, left: 0 }, + { input: productBuffer, top: 120, left: (targetSize - productSize) / 2 }, + { input: await sharp(tableSvg).png().toBuffer(), top: targetSize - 450, left: (targetSize - 800) / 2 } + ]) + .jpeg({ quality: 95 }) + .toBuffer(); + + await imageProcessor.saveImage(composite, path.join(outputDir, 'Main_05.jpg')); + results.push({ id: 'Main_05', success: true }); + } catch (e) { + console.error('Main_05 失败:', e.message); + results.push({ id: 'Main_05', success: false, error: e.message }); + } + + // Main_06: 多角度展示 + try { + const prompt06 = ` +Edit this image to show multiple angles: +1. Split the image into two parts with a curved decorative divider +2. LEFT: Keep the cat wearing product as shown +3. RIGHT: Show the same cat from a different angle (side view) +4. CRITICAL: The product must be IDENTICAL in both views +5. Warm home interior background +6. NO text overlay +Style: Professional lifestyle photography, 1:1 square +`.trim(); + results.push({ id: 'Main_06', success: await generateImageWithOriginal('Main_06', '多角度展示', materials, prompt06, '1:1', outputDir) }); + } catch (e) { + console.error('Main_06 失败:', e.message); + results.push({ id: 'Main_06', success: false, error: e.message }); + } + + // APlus_01: 品牌横幅 + try { + const prompt_a01 = ` +Create an Amazon A+ brand banner (landscape 3:2): +1. LEFT 40%: Brand text area + - "TOUCHDOG" in playful coral/salmon color (#E8A87C) with paw prints + - "CAT SOFT CONE COLLAR" below in gray +2. RIGHT 60%: Show the cat wearing the product EXACTLY as in reference +3. Warm cozy home background +4. The product must match the reference EXACTLY +`.trim(); + results.push({ id: 'APlus_01', success: await generateImageWithOriginal('APlus_01', '品牌横幅', materials, prompt_a01, '3:2', outputDir) }); + } catch (e) { + console.error('APlus_01 失败:', e.message); + results.push({ id: 'APlus_01', success: false, error: e.message }); + } + + // APlus_02: 对比图 + try { + results.push({ id: 'APlus_02', success: await generateAPlus02(materials, config, outputDir) }); + } catch (e) { + console.error('APlus_02 失败:', e.message); + results.push({ id: 'APlus_02', success: false, error: e.message }); + } + + // APlus_03-06: 其他A+图 + const aplusPrompts = { + 'APlus_03': { + name: '功能细节', + prompt: `Create Amazon A+ feature details (3:2): +Title: "ENGINEERED FOR UNCOMPROMISED COMFORT" +Show 3 detail images with captions: +1. Inner lining close-up: "STURDY AND BREATHABLE" +2. Pet wearing with size marker: "EASY TO CLEAN, STYLISH" +3. Stitching detail: "REINFORCED STITCHING" +Product must match reference EXACTLY. Warm beige background.` + }, + 'APlus_04': { + name: '多场景横版', + prompt: `Create Amazon A+ horizontal 4-scene image (3:2): +4 scenes in a row, each showing the SAME product (match reference): +1. Cat standing: "HYGIENIC & EASY TO CLEAN" +2. Cat eating: "UNRESTRICTED EATING" +3. Cat playing: "REVERSIBLE WEAR" +4. Cat sleeping: "360° COMFORT" +Warm beige background with paw prints.` + }, + 'APlus_05': { + name: '多角度横版', + prompt: `Create Amazon A+ multiple angles image (3:2): +Show 2 views side by side with curved divider: +LEFT: Front view of cat wearing product +RIGHT: Side view of same product +Product must match reference EXACTLY. NO text. Warm background.` + }, + 'APlus_06': { + name: '尺寸表横版', + prompt: `Create Amazon A+ size chart (3:2): +LEFT: Product flat lay with dimension arrows (NECK, WIDTH) +RIGHT: Size chart table (XS to XL) +Title: "PRODUCT SIZE" +Product must match reference EXACTLY. Warm beige background.` + } + }; + + for (const [id, info] of Object.entries(aplusPrompts)) { + try { + results.push({ id, success: await generateImageWithOriginal(id, info.name, materials, info.prompt, '3:2', outputDir) }); + } catch (e) { + console.error(`${id} 失败:`, e.message); + results.push({ id, success: false, error: e.message }); + } + } + + // ========== 总结 ========== + console.log('\n' + '═'.repeat(70)); + console.log('📊 生成完成'); + console.log('═'.repeat(70)); + + const successCount = results.filter(r => r.success).length; + console.log(`\n✅ 成功: ${successCount}/${results.length}`); + + if (successCount < results.length) { + console.log('\n❌ 失败:'); + results.filter(r => !r.success).forEach(r => console.log(` - ${r.id}: ${r.error}`)); + } + + console.log(`\n📁 输出目录: ${outputDir}`); + + fs.writeFileSync(path.join(outputDir, 'results.json'), JSON.stringify(results, null, 2)); +} + +main().catch(console.error); + + diff --git a/poc-workflow-v6.js b/poc-workflow-v6.js new file mode 100644 index 0000000..0b1a860 --- /dev/null +++ b/poc-workflow-v6.js @@ -0,0 +1,876 @@ +/** + * POC Workflow V6: 优化Prompt控制策略 + * + * 核心改进: + * 1. 修复素材选择(使用猫咪图而非狗狗图) + * 2. 优化Prompt - 更精准地指示AI保持主体不变 + * 3. 分类处理不同复杂度的图片 + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const sharp = require('sharp'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); +const imageProcessor = require('./lib/image-processor'); + +// ============================================================ +// 配置 +// ============================================================ +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +// ============================================================ +// 工具函数 +// ============================================================ + +async function uploadToR2(buffer, filename) { + const fileName = `v6-${Date.now()}-${filename}`; + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: buffer, + ContentType: filename.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + return process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; +} + +async function submitImageTask(prompt, refImageUrl = null, aspectRatio = '1:1') { + const payload = { + key: API_KEY, + prompt: prompt, + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + if (refImageUrl) { + payload.img_url = refImageUrl; + } + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload, { timeout: 30000 }); + const taskId = response.data.data?.id; + + if (!taskId) { + throw new Error('No task ID returned'); + } + return taskId; +} + +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 90; + + while (attempts < maxAttempts) { + try { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId }, + timeout: 10000 + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + } catch (error) { + if (error.message.includes('Generation failed')) throw error; + process.stdout.write('x'); + await new Promise(r => setTimeout(r, 3000)); + attempts++; + } + } + throw new Error('Timeout'); +} + +async function downloadImage(url) { + const response = await axios.get(url, { responseType: 'arraybuffer', timeout: 30000 }); + return Buffer.from(response.data); +} + +async function generateAIImage(prompt, refImageUrl = null, aspectRatio = '1:1') { + console.log(' 提交AI任务...'); + const taskId = await submitImageTask(prompt, refImageUrl, aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ AI生成完成'); + + return await downloadImage(imageUrl); +} + +// ============================================================ +// Prompt模板 - 核心优化 +// ============================================================ + +/** + * 构建精准的编辑prompt + * 核心策略:明确告诉AI这是"编辑"任务,精确描述要保留的元素 + */ +function buildEditPrompt(config) { + const { + subjectDescription, // 主体描述(产品+宠物) + preserveElements, // 必须保留的元素 + editTasks, // 编辑任务 + layoutDescription, // 排版描述 + styleGuide, // 风格指南 + aspectRatio // 比例 + } = config; + + return ` +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: ${subjectDescription} + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +${preserveElements.map((e, i) => `${i + 1}. ${e}`).join('\n')} + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +${editTasks.map((t, i) => `${i + 1}. ${t}`).join('\n')} + +LAYOUT SPECIFICATION: +${layoutDescription} + +STYLE GUIDE: +${styleGuide} + +OUTPUT: ${aspectRatio} ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +`.trim(); +} + +// ============================================================ +// 12张图的生成逻辑 +// ============================================================ + +/** + * Main_01: 场景首图+卖点 + */ +async function generateMain01(materials, config, outputDir) { + console.log('\n🎨 [Main_01] 场景首图+卖点'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'cat-worn.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat (white/cream fur with light brown markings, blue eyes) wearing an ice-blue soft recovery cone collar (brand: TOUCHDOG). The cat is in a home environment.`, + + preserveElements: [ + `The cat MUST remain a Ragdoll with blue eyes, white/cream fur, brown ear markings - EXACTLY as shown`, + `The cone collar MUST remain ice-blue (#B5E5E8), flower/petal shaped, with "TOUCHDOG" branding`, + `The cat's pose, expression, and the way the collar sits on the cat`, + `The product's texture, stitching pattern, and velcro closure detail` + ], + + editTasks: [ + `Enhance background to warm, cozy home interior (fireplace, blanket, wooden furniture)`, + `Add soft warm lighting with gentle shadows`, + `Add a curved blue banner (#4A7C9B) across middle area with text: "DESIGNED FOR COMFORTABLE RECOVERY"`, + `Add 3 white feature boxes at bottom with icons and text: + - Egg icon + "LIGHTER THAN AN EGG" + - Water drop icon + "WATERPROOF & EASY WIPE" + - Cloud icon + "BREATHABLE COTTON LINING"`, + `Add subtle paw print watermarks in light blue on the banner area` + ], + + layoutDescription: ` + - Top 60%: Cat wearing product in enhanced home scene + - Middle: Curved banner with main tagline + - Bottom 25%: Three feature callout boxes in a row`, + + styleGuide: `Professional Amazon main image style. Warm color palette. Text should be crisp and readable. The cat and product should be the clear focal point.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, wornUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_01.jpg')); + + // 保存prompt供调试 + fs.writeFileSync(path.join(outputDir, 'Main_01_prompt.txt'), prompt); + return true; +} + +/** + * Main_03: 功能调节展示 (参考效果最好的那张) + */ +async function generateMain03(materials, config, outputDir) { + console.log('\n🎨 [Main_03] 功能调节展示'); + + // 使用平铺图作为主参考 + const flatBuffer = fs.readFileSync(materials.flatImage); + const flatUrl = await uploadToR2(flatBuffer, 'flat.png'); + + const prompt = buildEditPrompt({ + subjectDescription: `An ice-blue soft pet recovery cone collar (TOUCHDOG brand) shown in flat lay position. The product has a flower/petal shape with 8 segments, velcro closure, and green inner rim.`, + + preserveElements: [ + `The product MUST remain EXACTLY as shown: ice-blue color (#B5E5E8), flower shape, TOUCHDOG branding`, + `The velcro strap detail on the left side`, + `The green/teal inner rim around the neck hole`, + `The 8-petal segmented design with visible stitching` + ], + + editTasks: [ + `Place the product on a soft blue background (#6B9AC4) that complements the product color`, + `Add title text at top-left: "ADJUSTABLE STRAP FOR A SECURE FIT" in white, bold`, + `Add 2 circular detail callout images on the right side: + - Top circle: Close-up of the velcro strap, caption "SECURE THE ADJUSTABLE STRAP" + - Bottom circle: Product being worn by a pet showing fit, caption "ADJUST FOR A SNUG FIT"`, + `Add decorative white paw prints scattered in the background`, + `Add thin white circular borders around the detail callouts` + ], + + layoutDescription: ` + - Left side (60%): Main product image, slightly angled + - Top-left corner: Title text + - Right side (40%): Two stacked circular detail images with captions + - Scattered paw prints as decoration`, + + styleGuide: `Clean infographic style. Blue color scheme matching the product. Professional Amazon A+ content quality. High contrast text for readability.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, flatUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_03.jpg')); + fs.writeFileSync(path.join(outputDir, 'Main_03_prompt.txt'), prompt); + return true; +} + +/** + * Main_04: 多场景使用 - 关键优化 + * 这是最难的图,需要在4个场景中保持同一产品和宠物 + */ +async function generateMain04(materials, config, outputDir) { + console.log('\n🎨 [Main_04] 多场景使用 (4宫格)'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'cat-worn-grid.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat (white/cream long fur, light brown markings on ears and face, distinctive blue eyes, pink nose) wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `ALL 4 SCENES MUST SHOW THE EXACT SAME CAT: Ragdoll breed, blue eyes, white/cream fur, brown ear markings`, + `ALL 4 SCENES MUST SHOW THE EXACT SAME PRODUCT: Ice-blue (#B5E5E8) flower-shaped soft cone, TOUCHDOG brand`, + `The cat's fur texture and coloring must be consistent across all 4 images`, + `The product's color, shape, and branding must be identical in all 4 scenes` + ], + + editTasks: [ + `Create a 2x2 grid layout with 4 scenes, each in a rounded rectangle frame`, + `TOP-LEFT scene: Cat standing alert, wearing the cone - Caption: "• HYGIENIC & EASY TO CLEAN"`, + `TOP-RIGHT scene: Cat eating/drinking from a bowl while wearing cone - Caption: "• UNRESTRICTED EATING/DRINKING"`, + `BOTTOM-LEFT scene: Cat stretching or playing while wearing cone - Caption: "• REVERSIBLE WEAR"`, + `BOTTOM-RIGHT scene: Cat sleeping peacefully curled up with cone - Caption: "• 360° COMFORT"`, + `Add light paw print watermarks in corners of the overall image` + ], + + layoutDescription: ` + - Background: Warm beige/cream (#F5EBE0) + - 2x2 grid of equal-sized rounded rectangles + - Each scene has the same cat in different poses + - Caption text below each scene in brown (#8B7355) + - Subtle paw prints in corners`, + + styleGuide: ` + Lifestyle photography style. Warm, inviting colors. + The cat should look comfortable and happy in all scenes. + Consistent lighting across all 4 scenes. + CRITICAL: The cat must be recognizably the SAME individual cat in all scenes.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, wornUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_04.jpg')); + fs.writeFileSync(path.join(outputDir, 'Main_04_prompt.txt'), prompt); + return true; +} + +/** + * Main_05: 尺寸图 + */ +async function generateMain05(materials, config, outputDir) { + console.log('\n🎨 [Main_05] 尺寸图'); + + const flatBuffer = fs.readFileSync(materials.flatImage); + const flatUrl = await uploadToR2(flatBuffer, 'flat-size.png'); + + const prompt = buildEditPrompt({ + subjectDescription: `An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position, showing its flower/petal shape design.`, + + preserveElements: [ + `The product MUST remain EXACTLY as shown: ice-blue color, flower shape, TOUCHDOG branding`, + `The product's proportions and shape`, + `The velcro closure and inner rim details` + ], + + editTasks: [ + `Place product on warm beige background (#F5EDE4)`, + `Add title "PRODUCT SIZE" at top center in dark text`, + `Add a size chart table below the product with columns: SIZE | NECK | DEPTH`, + `Table data: + XS: 5.6-6.8IN | 3.2IN + S: 7.2-8.4IN | 4IN + M: 8.8-10.4IN | 5IN + L: 10.8-12.4IN | 6IN + XL: 12.8-14.4IN | 7IN`, + `Add note in coral/salmon color: "NOTE: ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE"`, + `Add subtle paw print decorations in beige tones` + ], + + layoutDescription: ` + - Top: Title + - Center: Product image (main focus) + - Bottom: Size chart table with clean design`, + + styleGuide: `Clean, informative infographic style. Easy to read table. Warm neutral background. Professional Amazon listing quality.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, flatUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_05.jpg')); + fs.writeFileSync(path.join(outputDir, 'Main_05_prompt.txt'), prompt); + return true; +} + +/** + * Main_02: 白底平铺+细节放大 + */ +async function generateMain02(materials, config, outputDir) { + console.log('\n🎨 [Main_02] 白底平铺+细节放大'); + + const flatBuffer = fs.readFileSync(materials.flatImage); + const flatUrl = await uploadToR2(flatBuffer, 'flat-detail.png'); + + const prompt = buildEditPrompt({ + subjectDescription: `An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position on black background. The product has a flower/petal shape with 8 segments, velcro closure on left, and green inner rim.`, + + preserveElements: [ + `The product MUST remain EXACTLY as shown: ice-blue color (#B5E5E8), flower shape, 8 petal segments`, + `The TOUCHDOG branding text on the product`, + `The velcro strap detail and green/teal inner rim`, + `The product's proportions and stitching pattern` + ], + + editTasks: [ + `Change background from black to clean white`, + `Add a dark green (#2D4A3E) banner at top with text: "DURABLE WATERPROOF PU LAYER"`, + `Add 2 circular magnified detail callouts at bottom: + - Left circle: Close-up of outer material texture, label "DURABLE WATERPROOF PU LAYER" + - Right circle: Close-up of inner lining, label "DOUBLE-LAYER COMFORT"`, + `Add thin green borders around detail circles`, + `Keep layout clean and professional` + ], + + layoutDescription: ` + - Top: Dark green banner with title + - Center: Main product image on white background + - Bottom: Two circular detail magnifications with labels`, + + styleGuide: `Clean white background product photography. Professional Amazon main image style. High contrast, sharp details.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, flatUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_02.jpg')); + fs.writeFileSync(path.join(outputDir, 'Main_02_prompt.txt'), prompt); + return true; +} + +/** + * Main_06: 多角度展示 + */ +async function generateMain06(materials, config, outputDir) { + console.log('\n🎨 [Main_06] 多角度展示'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'multi-angle.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat (white/cream fur, brown ear markings, blue eyes) wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `The cat MUST remain a Ragdoll: blue eyes, white/cream fur, brown markings`, + `The product MUST remain ice-blue (#B5E5E8), flower-shaped, TOUCHDOG branded`, + `Both views must show the EXACT SAME cat and product` + ], + + editTasks: [ + `Create a split image with curved decorative divider in the middle`, + `LEFT SIDE: Front view of cat wearing the cone (from reference)`, + `RIGHT SIDE: Side/profile view of the same cat wearing the same cone`, + `Warm home interior background in both halves`, + `NO text overlays - pure lifestyle imagery` + ], + + layoutDescription: ` + - Split layout with elegant curved divider + - Left: Front view + - Right: Side view + - Consistent warm lighting across both`, + + styleGuide: `Lifestyle photography. Warm, cozy atmosphere. The cat should look comfortable. NO text.`, + + aspectRatio: '1:1 square' + }); + + const result = await generateAIImage(prompt, wornUrl, '1:1'); + await imageProcessor.saveImage(result, path.join(outputDir, 'Main_06.jpg')); + fs.writeFileSync(path.join(outputDir, 'Main_06_prompt.txt'), prompt); + return true; +} + +/** + * APlus_01: 品牌横幅 + */ +async function generateAPlus01(materials, config, outputDir) { + console.log('\n🎨 [APlus_01] 品牌横幅'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'brand-banner.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar in a home setting.`, + + preserveElements: [ + `The cat MUST remain a Ragdoll with blue eyes and white/cream fur`, + `The product MUST remain ice-blue, flower-shaped, TOUCHDOG branded` + ], + + editTasks: [ + `Create a horizontal banner layout (3:2 ratio)`, + `LEFT 40%: Brand text area with: + - "TOUCHDOG" in playful coral/salmon color (#E8A87C) + - Small paw print icons around the brand name + - "CAT SOFT CONE COLLAR" below in gray`, + `RIGHT 60%: The cat wearing the product in a warm home setting`, + `Soft, warm color palette throughout` + ], + + layoutDescription: ` + - Left side: Brand name and product title + - Right side: Hero image of cat with product + - Warm, cohesive color scheme`, + + styleGuide: `Amazon A+ brand story style. Warm and inviting. Professional yet friendly.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_01.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_01_prompt.txt'), prompt); + return true; +} + +/** + * APlus_02: 对比图 + */ +async function generateAPlus02(materials, config, outputDir) { + console.log('\n🎨 [APlus_02] 对比图'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'comparison.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `LEFT SIDE: The cat and product MUST match the reference - Ragdoll cat, ice-blue soft cone`, + `The product color (#B5E5E8), flower shape, and TOUCHDOG branding on left side` + ], + + editTasks: [ + `Create a side-by-side comparison layout`, + `LEFT SIDE (60% width, colorful): + - Happy Ragdoll cat wearing our ice-blue soft cone (from reference) + - Green checkmark icon + - "OUR" label on coral/orange banner + - 3 benefits in white: "CLOUD-LIGHT COMFORT", "WIDER & CLEARER", "FOLDABLE & PORTABLE"`, + `RIGHT SIDE (40% width, grayscale): + - Sad-looking cat wearing a DIFFERENT product: hard plastic transparent cone (traditional e-collar) + - Red X icon + - "OTHER" label on gray banner + - 3 drawbacks in gray: "HEAVY & BULKY", "BLOCKS VISION & MOVEMENT", "HARD TO STORE"`, + `Warm beige background with paw print watermarks` + ], + + layoutDescription: ` + - Split layout with curved divider + - Left side larger, full color, positive mood + - Right side smaller, desaturated, negative mood + - Text overlays on each side`, + + styleGuide: ` + Clear visual contrast between "us" and "them". + Left side warm and inviting, right side cold and uncomfortable. + IMPORTANT: Right side must show a DIFFERENT type of cone (hard plastic), not our product.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_02.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_02_prompt.txt'), prompt); + return true; +} + +/** + * APlus_03: 功能细节展示 + */ +async function generateAPlus03(materials, config, outputDir) { + console.log('\n🎨 [APlus_03] 功能细节展示'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'feature-detail.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `The cat MUST remain a Ragdoll with blue eyes`, + `The product MUST remain ice-blue, flower-shaped, TOUCHDOG branded` + ], + + editTasks: [ + `Create horizontal layout (3:2) with title and 3 detail panels`, + `Title at top: "ENGINEERED FOR UNCOMPROMISED COMFORT" in dark text`, + `3 detail images in a row below: + - Panel 1: Close-up of inner cotton lining texture, caption "STURDY AND BREATHABLE" + - Panel 2: Cat wearing the product looking comfortable, caption "EASY TO CLEAN, STYLISH" + - Panel 3: Close-up of stitching detail, caption "REINFORCED STITCHING"`, + `Warm beige background (#F5EBE0) with subtle paw prints` + ], + + layoutDescription: ` + - Top: Title banner + - Bottom: Three equal-width panels with captions`, + + styleGuide: `Amazon A+ feature module style. Clean, informative. Warm color palette.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_03.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_03_prompt.txt'), prompt); + return true; +} + +/** + * APlus_04: 多场景横版 + */ +async function generateAPlus04(materials, config, outputDir) { + console.log('\n🎨 [APlus_04] 多场景横版'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'scenes-horizontal.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat (white/cream fur, blue eyes, brown ear markings) wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `ALL 4 SCENES MUST SHOW THE EXACT SAME CAT: Ragdoll breed, blue eyes, white/cream fur`, + `ALL 4 SCENES MUST SHOW THE EXACT SAME PRODUCT: Ice-blue flower-shaped soft cone`, + `Consistent cat appearance and product across all panels` + ], + + editTasks: [ + `Create horizontal layout (3:2) with 4 scenes in a row`, + `Scene 1: Cat standing - "HYGIENIC & EASY TO CLEAN"`, + `Scene 2: Cat eating from bowl - "UNRESTRICTED EATING"`, + `Scene 3: Cat playing/stretching - "REVERSIBLE WEAR"`, + `Scene 4: Cat sleeping curled up - "360° COMFORT"`, + `Each scene in a rounded rectangle frame`, + `Warm beige background with paw print decorations` + ], + + layoutDescription: ` + - 4 equal panels arranged horizontally + - Each panel has image + caption below + - Consistent warm lighting across all`, + + styleGuide: `Lifestyle photography. Same cat in all scenes. Warm, cozy feel.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_04.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_04_prompt.txt'), prompt); + return true; +} + +/** + * APlus_05: 多角度横版 + */ +async function generateAPlus05(materials, config, outputDir) { + console.log('\n🎨 [APlus_05] 多角度横版'); + + const wornBuffer = fs.readFileSync(materials.catWornImage); + const wornUrl = await uploadToR2(wornBuffer, 'angles-horizontal.jpg'); + + const prompt = buildEditPrompt({ + subjectDescription: `A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar.`, + + preserveElements: [ + `Both views must show the SAME Ragdoll cat with blue eyes`, + `Both views must show the SAME ice-blue TOUCHDOG cone` + ], + + editTasks: [ + `Create horizontal split layout (3:2)`, + `LEFT: Front view of cat wearing cone`, + `RIGHT: Side/profile view of same cat with cone`, + `Elegant curved divider between the two views`, + `Warm home background in both`, + `NO text - pure visual showcase` + ], + + layoutDescription: ` + - Two equal halves with curved divider + - Left: Front angle + - Right: Side angle + - Warm consistent lighting`, + + styleGuide: `High-end lifestyle photography. No text. Warm atmosphere.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, wornUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_05.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_05_prompt.txt'), prompt); + return true; +} + +/** + * APlus_06: 尺寸表横版 + * 优化:明确描述产品的C形开口特征 + */ +async function generateAPlus06(materials, config, outputDir) { + console.log('\n🎨 [APlus_06] 尺寸表横版'); + + const flatBuffer = fs.readFileSync(materials.flatImage); + const flatUrl = await uploadToR2(flatBuffer, 'size-chart-h.png'); + + const prompt = buildEditPrompt({ + subjectDescription: `An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position. +CRITICAL SHAPE DETAIL: The product has a C-SHAPED OPENING (not a closed circle) - there is a GAP on the left side where the velcro strap attaches. This opening allows the collar to wrap around the pet's neck.`, + + preserveElements: [ + `The product MUST keep its C-SHAPED OPENING - DO NOT close the gap into a full circle`, + `The velcro strap visible on the left side of the opening`, + `Ice-blue color (#B5E5E8), flower/petal shape with 8 segments`, + `TOUCHDOG brand text on the product`, + `Green/teal inner rim around the neck hole` + ], + + editTasks: [ + `Change background from black to warm beige (#F5EDE4)`, + `Add title "PRODUCT SIZE" at top center in dark text`, + `Add dimension labels: "NECK" pointing to inner circle, "DEPTH" pointing outward`, + `Add size chart table on the right: + SIZE | NECK | DEPTH + XS | 5.6-6.8IN | 3.2IN + S | 7.2-8.4IN | 4IN + M | 8.8-10.4IN | 5IN + L | 10.8-12.4IN | 6IN + XL | 12.8-14.4IN | 7IN`, + `Add note in coral: "ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE"`, + `Add subtle paw print watermarks` + ], + + layoutDescription: ` + - Left 45%: Product image maintaining C-shape opening + - Right 55%: Size chart table + - Top: Title + - Bottom: Note text`, + + styleGuide: `Clean infographic style. The product's C-shaped opening must be clearly visible - this is a key feature showing how it wraps around the neck.`, + + aspectRatio: '3:2 landscape' + }); + + const result = await generateAIImage(prompt, flatUrl, '3:2'); + await imageProcessor.saveImage(result, path.join(outputDir, 'APlus_06.jpg')); + fs.writeFileSync(path.join(outputDir, 'APlus_06_prompt.txt'), prompt); + return true; +} + +// ============================================================ +// 主流程 +// ============================================================ + +async function main() { + const args = process.argv.slice(2); + let materialDir = path.join(__dirname, '素材/素材/已有的素材'); + let skuName = 'Touchdog冰蓝色伊丽莎白圈'; + + // 可选:只生成指定的图 + let onlyGenerate = null; // e.g., ['Main_01', 'Main_04'] + + for (const arg of args) { + if (arg.startsWith('--material-dir=')) { + materialDir = arg.split('=')[1]; + } else if (arg.startsWith('--sku-name=')) { + skuName = arg.split('=')[1]; + } else if (arg.startsWith('--only=')) { + onlyGenerate = arg.split('=')[1].split(','); + } + } + + const timestamp = new Date().toISOString().slice(0, 10); + const timeStr = new Date().toTimeString().slice(0, 8).replace(/:/g, '-'); + const safeName = skuName.replace(/[^a-zA-Z0-9\u4e00-\u9fa5]/g, '_').slice(0, 20); + const outputDir = path.join(__dirname, `output_v6_${safeName}_${timestamp}-${timeStr}`); + + console.log('\n' + '═'.repeat(70)); + console.log('🚀 POC Workflow V6 - 优化Prompt控制策略'); + console.log('═'.repeat(70)); + console.log('\n📋 核心策略: 精准Prompt控制,明确保留元素,限定编辑范围'); + console.log(' 素材目录:', materialDir); + console.log(' 输出目录:', outputDir); + + if (!fs.existsSync(outputDir)) { + fs.mkdirSync(outputDir, { recursive: true }); + } + + // 扫描素材 + const files = fs.readdirSync(materialDir); + const images = files.filter(f => /\.(jpg|jpeg|png)$/i.test(f)); + + console.log('\n📁 可用素材:'); + images.forEach(img => console.log(` - ${img}`)); + + // ========== 修复:正确识别素材 ========== + // 平铺图:IMG_5683.png(黑底抠图) + const flatImage = images.find(i => i.includes('5683')) || images.find(i => i.endsWith('.png')); + + // 猫咪佩戴图:IMG_6216 或 IMG_6229(不是6514的狗狗图!) + const catWornImage = images.find(i => i.includes('6216')) || + images.find(i => i.includes('6229')) || + images.find(i => i.toLowerCase().includes('cat')); + + // 狗狗佩戴图(备用) + const dogWornImage = images.find(i => i.includes('6514')); + + if (!flatImage) { + console.error('❌ 找不到平铺图素材'); + return; + } + if (!catWornImage) { + console.error('❌ 找不到猫咪佩戴图素材'); + console.log(' 可用文件:', images); + return; + } + + const materials = { + flatImage: path.join(materialDir, flatImage), + catWornImage: path.join(materialDir, catWornImage), + dogWornImage: dogWornImage ? path.join(materialDir, dogWornImage) : null + }; + + console.log('\n✅ 素材选择:'); + console.log(' 平铺图:', flatImage); + console.log(' 猫咪佩戴图:', catWornImage, '← 使用这个'); + if (dogWornImage) console.log(' 狗狗佩戴图:', dogWornImage, '(备用)'); + + const config = { brandName: 'TOUCHDOG', productName: 'CAT SOFT CONE COLLAR' }; + const results = []; + + // ========== 生成图片 ========== + console.log('\n' + '─'.repeat(70)); + console.log('🎨 开始生成图片'); + console.log('─'.repeat(70)); + + const generators = { + 'Main_01': () => generateMain01(materials, config, outputDir), + 'Main_02': () => generateMain02(materials, config, outputDir), + 'Main_03': () => generateMain03(materials, config, outputDir), + 'Main_04': () => generateMain04(materials, config, outputDir), + 'Main_05': () => generateMain05(materials, config, outputDir), + 'Main_06': () => generateMain06(materials, config, outputDir), + 'APlus_01': () => generateAPlus01(materials, config, outputDir), + 'APlus_02': () => generateAPlus02(materials, config, outputDir), + 'APlus_03': () => generateAPlus03(materials, config, outputDir), + 'APlus_04': () => generateAPlus04(materials, config, outputDir), + 'APlus_05': () => generateAPlus05(materials, config, outputDir), + 'APlus_06': () => generateAPlus06(materials, config, outputDir), + }; + + for (const [id, generator] of Object.entries(generators)) { + if (onlyGenerate && !onlyGenerate.includes(id)) { + console.log(`\n⏭️ [${id}] 跳过`); + continue; + } + + try { + results.push({ id, success: await generator() }); + } catch (e) { + console.error(`\n❌ ${id} 失败:`, e.message); + results.push({ id, success: false, error: e.message }); + } + } + + // ========== 总结 ========== + console.log('\n' + '═'.repeat(70)); + console.log('📊 生成完成'); + console.log('═'.repeat(70)); + + const successCount = results.filter(r => r.success).length; + console.log(`\n✅ 成功: ${successCount}/${results.length}`); + + if (successCount < results.length) { + console.log('\n❌ 失败:'); + results.filter(r => !r.success).forEach(r => console.log(` - ${r.id}: ${r.error}`)); + } + + console.log(`\n📁 输出目录: ${outputDir}`); + console.log(' 每张图都保存了对应的 _prompt.txt 供调试'); + + // 保存所有prompt到一个文件 + const allPrompts = {}; + for (const id of Object.keys(generators)) { + const promptFile = path.join(outputDir, `${id}_prompt.txt`); + if (fs.existsSync(promptFile)) { + allPrompts[id] = fs.readFileSync(promptFile, 'utf-8'); + } + } + fs.writeFileSync(path.join(outputDir, 'all-prompts.json'), JSON.stringify(allPrompts, null, 2)); + fs.writeFileSync(path.join(outputDir, 'results.json'), JSON.stringify(results, null, 2)); +} + +main().catch(console.error); + diff --git a/poc-workflow.js b/poc-workflow.js new file mode 100644 index 0000000..706e8c8 --- /dev/null +++ b/poc-workflow.js @@ -0,0 +1,383 @@ +/** + * POC Workflow: Vision Analysis -> Optimized Generation (Full 12 Images) + * API Provider: wuyinkeji.com + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +// 配置 +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; +const OUTPUT_DIR = path.join(__dirname, 'output_poc_full'); +const MATERIAL_DIR = path.join(__dirname, '素材/素材/已有的素材'); + +// R2客户端 (保持不变) +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +async function uploadToR2(filePath) { + const fileName = `poc-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + const publicUrl = process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; + + return publicUrl; +} + +// 核心函数1:视觉分析 (Vision Agent) +async function analyzeProductVisuals(refImageUrls) { + console.log('👁️ 正在进行视觉分析 (Vision Agent)...'); + + const analysisPrompt = ` +You are a professional e-commerce product photographer. +Analyze these reference images of a pet recovery cone collar. +Extract visual characteristics: +1. Material & Texture: (e.g. glossy PU, matte cotton) +2. Structure (Flat): (e.g. Open C-shape, Fan shape) +3. Structure (Worn): (e.g. Cone shape flared OUTWARDS/FORWARD) +4. Key Details: (e.g. logo, binding color) + +Output JSON: { "material": "...", "structure_flat": "...", "structure_worn": "...", "details": "..." } +`; + + try { + // 构造Wuyin Vision请求 + // 注意:根据文档截图,/api/chat/index 支持 image_url 参数 + // 这里我们只传第一张图作为主要参考,或者尝试传多张如果API支持 + // 由于接口文档通常 image_url 是字符串,我们先传最具代表性的图(通常是第一张) + // 如果需要多图分析,可能需要多次调用或拼接 + + // 这里简单起见,我们取一张最清晰的图(假设是第一张或摊平图)进行分析 + const mainRefImage = refImageUrls.find(url => url.includes('5683')) || refImageUrls[0]; + + const response = await axios.post( + `${API_BASE}/chat/index`, + { + key: API_KEY, + model: 'gemini-3-pro', // 明确指定 vision 模型为 gemini-3-pro + content: analysisPrompt, + image_url: mainRefImage + }, + { timeout: 60000 } + ); + + let content = response.data.data?.content || response.data.choices?.[0]?.message?.content; + + if (!content) throw new Error('No content in vision response'); + + content = content.replace(/```json|```/g, '').trim(); + + // 尝试解析JSON,如果失败则用正则提取或兜底 + let analysis; + try { + analysis = JSON.parse(content); + } catch (e) { + console.warn('JSON parse failed, using raw content'); + analysis = { + material: "Smooth waterproof PU, slightly glossy", + structure_flat: "Open C-shape/Fan shape", + structure_worn: "Cone flared upwards/outwards", + details: "Embroidered Touchdog logo" + }; + } + + console.log('✅ 视觉分析完成:', analysis); + return analysis; + + } catch (error) { + console.error('❌ 视觉分析失败:', error.message); + // 兜底描述 + return { + material: "Smooth waterproof PU fabric with a slight sheen", + structure_flat: "Open C-shape (Fan-like) with petal segments", + structure_worn: "Cone shape flared UPWARDS/FORWARD around head", + details: "Embroidered Touchdog logo on right petal" + }; + } +} + +// 生图任务提交 +async function submitImageTask(prompt, refImageUrls, aspectRatio = '1:1') { + try { + // Wuyin API: /api/img/nanoBanana-pro + // 参数: key, prompt, img_url (参考图), aspectRatio + + // 注意:img_url 只能传一张。我们传最相关的一张。 + // 对于场景图,传佩戴图;对于平铺图,传平铺图。 + let refImg = refImageUrls[0]; + if (prompt.includes('flat') && refImageUrls.some(u => u.includes('5683'))) { + refImg = refImageUrls.find(u => u.includes('5683')); // 摊平图 + } else if (refImageUrls.some(u => u.includes('6514'))) { + refImg = refImageUrls.find(u => u.includes('6514')); // 佩戴图 + } + + const payload = { + key: API_KEY, + prompt: prompt, + img_url: refImg, // 传单张参考图强约束 + aspectRatio: aspectRatio, + imageSize: '1K' + }; + + console.log(` 提交任务... (Ref: ${path.basename(refImg || '')})`); + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload); + + // 假设返回格式 { code: 200, data: { id: "..." }, msg: "success" } + // 或者直接返回 task_id,需根据实际响应调整 + // 根据截图: 异步任务通常返回 id + + // 这里假设 API 返回包含 task id + const taskId = response.data.data?.id; // 修正: 获取 data.id + + if (!taskId) { + console.error('Submit response:', response.data); + throw new Error('No task ID returned'); + } + + return taskId; + + } catch (error) { + console.error('Submit failed:', error.message); + throw error; + } +} + +// 轮询图片结果 +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 60; // 60 * 2s = 2 mins + + while (attempts < maxAttempts) { + try { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId } + }); + + // 状态判断修正: status 2 是成功 + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && (data.status === 3 || data.status === 'failed')) { // 假设 3 是失败,或者保留 failed 字符串判断 + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + console.log(` 状态: ${data.status} (等待中...)`); + + // Still processing + await new Promise(r => setTimeout(r, 2000)); + attempts++; + process.stdout.write('.'); + + } catch (error) { + console.error('Poll error:', error.message); + throw error; // 直接抛出,触发重试 + } + } + throw new Error('Timeout waiting for image'); +} + +// 生成单张图(含重试) +async function generateSingleImage(item, refImageUrls) { + console.log(`\n🎨 生成 ${item.id} (${item.type})...`); + + let retryCount = 0; + const maxRetries = 2; + + while (retryCount <= maxRetries) { + try { + if (retryCount > 0) console.log(` 重试第 ${retryCount} 次...`); + + const taskId = await submitImageTask(item.prompt, refImageUrls, item.aspectRatio); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log(' ✓ 生成成功'); + + // 下载保存 + const imgRes = await axios.get(imageUrl, { responseType: 'arraybuffer' }); + fs.writeFileSync(path.join(OUTPUT_DIR, `${item.id}.jpg`), imgRes.data); + console.log(' ✓ 保存本地'); + return; // 成功退出 + + } catch (error) { + console.error(` ✗ 失败: ${error.message}`); + retryCount++; + await new Promise(r => setTimeout(r, 3000)); + } + } + console.error(` ❌ ${item.id} 最终失败`); +} + +// 主流程 +async function main() { + if (!fs.existsSync(OUTPUT_DIR)) fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + + // 1. 上传 + console.log('📤 Step 1: 上传素材...'); + const files = fs.readdirSync(MATERIAL_DIR).filter(f => /\.(jpg|png)$/i.test(f)); + const refImageUrls = []; + files.sort(); + + for (const file of files) { + if (file.startsWith('.')) continue; + const url = await uploadToR2(path.join(MATERIAL_DIR, file)); + refImageUrls.push(url); + } + console.log(` 共 ${refImageUrls.length} 张`); + + // 2. 视觉分析 + const va = await analyzeProductVisuals(refImageUrls); + // const va = { + // material: "Smooth waterproof PU fabric with a slight glossy sheen", + // structure_flat: "Open C-shape (Fan-like) with petal segments, NOT a closed circle", + // structure_worn: "Cone shape flared UPWARDS/FORWARD around head (megaphone shape)", + // details: "Embroidered Touchdog logo on right petal, teal edge binding" + // }; + + // 3. 定义12张图的Prompt (结合视觉分析) + const prompts = [ + // --- 主图 (1:1) --- + { + id: 'Main_01_Hero', + type: '场景首图', + aspectRatio: '1:1', + prompt: `Amazon main image. Ragdoll cat wearing ${va.material} cone collar. + CRITICAL: Cone opening must face FORWARD/OUTWARDS around the cat's face (like a megaphone), NOT wrapped like a scarf. + Cat is looking comfortable. Warm cozy home background. + Product texture: ${va.material}. Structure: ${va.structure_worn}. + Logo: Touchdog embroidered on right side. High quality, 8k.` + }, + { + id: 'Main_02_Flat', + type: '平铺图', + aspectRatio: '1:1', + prompt: `Product flat lay, white background. + Structure: ${va.structure_flat} (Open C-shape/Fan-like, NOT closed circle). + Texture: ${va.material}, glossy PU sheen. + Details: Velcro strap visible, ${va.details}. Clean studio light.` + }, + { + id: 'Main_03_Function', + type: '功能演示', + aspectRatio: '1:1', + prompt: `Product feature shot. Close-up of the velcro strap adjustment. + Hands adjusting the strap for secure fit. + Show the ${va.material} texture and stitching quality. + Light blue background with text overlay "ADJUSTABLE FIT" (optional).` + }, + { + id: 'Main_04_Scenarios', + type: '场景拼图', + aspectRatio: '1:1', + prompt: `Split screen composition. + Top: Cat eating food easily while wearing the cone (cone facing forward). + Bottom: Cat sleeping comfortably. + Show flexibility and comfort. Soft lighting.` + }, + { + id: 'Main_05_Size', + type: '尺寸图', + aspectRatio: '1:1', + prompt: `Product infographic. The ${va.structure_flat} cone laid flat. + Ruler graphics measuring the depth (24.5cm). + Size chart table on the side: XS, S, M, L, XL. + Professional clean design.` + }, + { + id: 'Main_06_Brand', + type: '品牌汇总', + aspectRatio: '1:1', + prompt: `Brand image. Large Touchdog logo in center. + Product floating in background. + Icons: Feather (Lightweight), Water drop (Waterproof), Cotton (Soft). + High-end branding style.` + }, + // --- A+图 (3:2) --- + { + id: 'APlus_01_Banner', + type: '品牌Banner', + aspectRatio: '3:2', + prompt: `Amazon A+ Banner. Wide shot of modern living room. + White cat wearing the ${va.material} cone walking on rug. + Cone flares outwards correctly. + Text space on left. Warm, inviting atmosphere.` + }, + { + id: 'APlus_02_Comparison', + type: '竞品对比', + aspectRatio: '3:2', + prompt: `Comparison image. Split screen. + Left (Touchdog): Colorful, happy cat wearing soft blue cone. Green Checkmark. + Right (Others): Black and white, sad cat wearing hard plastic transparent cone. Red Cross. + Text: "Soft & Comfy" vs "Hard & Heavy".` + }, + { + id: 'APlus_03_Detail', + type: '材质细节', + aspectRatio: '3:2', + prompt: `Extreme close-up macro shot of the product material. + Show the waterproof PU texture with water droplets beading off. + Show the neat stitching and soft edge binding. + High tech, quality feel.` + }, + { + id: 'APlus_04_Waterproof', + type: '防水测试', + aspectRatio: '3:2', + prompt: `Action shot. Water being poured onto the blue cone collar. + Water repelling instantly, rolling off the surface. + Demonstrates "Easy to Wipe" feature. + Bright lighting.` + }, + { + id: 'APlus_05_Storage', + type: '收纳展示', + aspectRatio: '3:2', + prompt: `Lifestyle shot. The cone collar folded/rolled up compactly. + Placed inside a small travel bag or drawer. + Shows "Easy Storage" feature. + Clean composition.` + }, + { + id: 'APlus_06_Guide', + type: '选购指南', + aspectRatio: '3:2', + prompt: `Sizing guide banner. + Illustration of how to measure cat's neck circumference. + Touchdog branding elements. + Clean, instructional design.` + } + ]; + + // 4. 执行生成 + console.log('\n🚀 开始全量生成 (12张)...'); + for (const item of prompts) { + await generateSingleImage(item, refImageUrls); + } + + console.log('\n✅ POC 完整验证结束。'); +} + +main().catch(console.error); diff --git a/product.md b/product.md new file mode 100644 index 0000000..cd5f455 --- /dev/null +++ b/product.md @@ -0,0 +1,29 @@ +# 伊丽莎白圈产品介绍 +## 核心卖点 +1. **极致轻盈**:仅65g(约1颗鸡蛋重量),云感舒适,不束缚宠物活动,玩耍、进食饮水无压力。 +2. **全面防水易清洁**:外层采用防水PU面料,污渍一擦即净,耐脏防潮,保持项圈干燥卫生。 +3. **舒适亲肤设计**:内层填充PP棉与棉氨纶混纺材质,搭配亲肤罗纹包边,柔软透气;微孔透气结构+加固车线工艺,久戴不闷、揉搓不变形。 +4. **实用结构优势**:加宽视野设计,不遮挡宠物视线;可折叠便携,轻松卷起收纳于宠物急救包;3秒穿脱,可调节粘扣确保稳固贴合。 +5. **高颜值多选择**:推出幻彩系列、马卡龙色系及优雅花朵设计(含蓝爱五、淡草莓、暮霭粉等颜色),兼具美观与实用性。 +6. **强效防护**:加宽围度设计(24.5cm等规格),术后能有效防止宠物舔咬伤口,适用于多种场景防护。 + +## 适用场景 +术后恢复、驱虫护理、指甲修剪、美容护理、伤口治疗、绝育术后防护、皮肤病管理等。 + +## 尺寸规格 +| 尺寸 | 颈围范围(cm/in) | 深度(cm/in) | +|------|-------------------|---------------| +| XS | 14-17/5.5-6.7 | 8/3.1 | +| S | 18-21/7.1-8.3 | 13/5.1 | +| M | 22-26/8.7-10.2 | 12.5/4.9 | +| L | 27-31/10.6-12.2 | 15/5.9 | +| XL | 32-36/12.6-14.2 | 17.5/6.9 | + +## 材质工艺 +- 外层:耐用防水PU面料,防污抗皱 +- 内层:PP棉填充+95%棉+5%氨纶高密罗纹,亲肤吸湿 +- 工艺:加固车线、精密缝线,刺绣品牌标识,质感出众 + +## 品牌优势 +Touchdog创立于2004年,作为宠物美装品类开创者,秉持原创设计理念,整合全球设计资源,20年斩获100余项设计大奖(含PFAAWARDS亚宠2022年度产品设计大奖),专注人宠生活美学产品创作。 + diff --git a/prompt.md b/prompt.md new file mode 100644 index 0000000..49bd8e0 --- /dev/null +++ b/prompt.md @@ -0,0 +1,41 @@ +# Role: 亚马逊高级电商视觉总监 & AI提示词工程师 +# Objective: 根据提供的产品信息和图片需求,编写适用于AI绘画工具(如NanoBanana/Midjourney/Stable Diffusion)的高质量英文提示词(Prompts)。 + +# Guidelines for Prompt Generation (视觉转化规则): +1. **结构化写作**: 每个Prompt必须包含:[主体描述] + [环境/背景] + [光影/氛围] + [构图视角] + [画质修饰词]。 +2. **卖点视觉化**: 不要直接在Prompt里写卖点文字(如"Waterproof"),而是描述表现该卖点的画面(如"Water droplets beading off the surface, hydrophobic effect")。 +3. **一致性控制**: + - 确保所有图片中的产品必须是参考图中的产品。 + - 主图(Main Images)通常需要纯白背景(White Background)或极简背景。 + - A+图(Lifestyle Images)需要具体的居家或户外场景,具有生活感。 +4. **尺寸适配**: + - 主图 Prompt 末尾添加参数 `--ar 1:1` + - A+图 Prompt 末尾添加参数 `--ar 3:2` (或接近970:600的比例) + +# Output Format (JSON): +请严格按照以下JSON格式返回,不要包含Markdown代码块以外的文字: +```json +[ + { + "id": "Main_01", + "type": "Main Image (1600x1600)", + "purpose": "核心卖点/首图", + "visual_description": "中文描述该图的设计思路(例如:正面特写,展示整体结构)", + "ai_prompt": "English Prompt here, Subject, Action, Context, Lighting, Style, --ar 1:1" + }, + { + "id": "APlus_01", + "type": "A+ Image (970x600)", + "purpose": "适用场景/佩戴演示", + "visual_description": "中文描述...", + "ai_prompt": "English Prompt here... --ar 3:2" + } + // ...以此类推 +] +``` + +# Input Data +## 图片设计要求: +[图片设计要求] +## 产品介绍: +[产品介绍] \ No newline at end of file diff --git a/prompts/brain-system.md b/prompts/brain-system.md new file mode 100644 index 0000000..e69de29 diff --git a/prompts/constraints/brand-vi.md b/prompts/constraints/brand-vi.md new file mode 100644 index 0000000..9507e99 --- /dev/null +++ b/prompts/constraints/brand-vi.md @@ -0,0 +1,145 @@ +# 品牌VI约束模板 + +## 约束级别:P1 + +此约束确保所有图片符合Touchdog品牌视觉识别规范。 + +--- + +## Logo体系 + +### 产品刺绣Logo(出现在产品上) +- **文字**: TOUCHDOG®(大写,带®符号) +- **位置**: 产品右侧花瓣区域(2-3点钟方向) +- **样式**: 刺绣效果,凹陷质感 +- **颜色**: 与产品主色协调的深色调 + +### 电商图片Logo(出现在图片角落) +- **图形**: 红色心形狗狗造型 +- **文字**: touchdog®(全小写,带®符号) +- **标语**: wow pretty(国际版) +- **组合**: 图形 + 文字 + 标语 + +--- + +## Logo颜色适配规则 + +``` +=== BRAND LOGO COLOR ADAPTATION === + +Determine background brightness and apply correct logo color: + +IF background_brightness > 60% (light background): + → Use RED logo (#E60012) + → Red graphic icon + black "touchdog®" text + +IF background_brightness < 50% (dark background): + → Use WHITE logo + → White graphic icon + white "touchdog®" text + +IF background_brightness 50-60% (medium): + → Evaluate contrast and choose accordingly + → Prefer the option with better visibility + +=== END LOGO COLOR ADAPTATION === +``` + +--- + +## 约束模板(自动注入) + +``` +=== BRAND VI REQUIREMENTS === + +EMBROIDERED LOGO ON PRODUCT: +- Text: "TOUCHDOG®" (UPPERCASE) +- Position: Right petal segment, 2-3 o'clock position +- Style: Embroidered, stitched into fabric +- Color: Slightly darker shade of product color + +E-COMMERCE IMAGE BRAND LOGO: +- Position: {{logo_placement.position}} +- Type: {{logo_placement.type}} +- Color: {{logo_placement.color}} + +LOGO SPECIFICATIONS: +- Clear space: Minimum 1/4 of logo height on all sides +- Minimum size: Combined logo ≥ 46px height +- Tagline: "wow pretty" (for international markets) + +PROHIBITED LOGO MODIFICATIONS: +- ❌ NO tilting or rotation +- ❌ NO outlines or strokes +- ❌ NO gradient fills +- ❌ NO drop shadows +- ❌ NO proportion changes (stretching/squishing) +- ❌ NO underlines + +BRAND TYPOGRAPHY: +- Headlines: OPPOsans-Bold or similar clean sans-serif +- Body text: OPPOsans-Medium or similar +- Style: Clean, modern, professional + +BRAND COLOR PALETTE: +- Primary Red: #E60012 +- Text Black: #333333 +- Background suggestions based on product color: + - Ice Blue product → Light blue/white background + - Iridescent product → Warm beige/cream background + - Solid color product → Complementary light background + +=== END BRAND VI REQUIREMENTS === +``` + +--- + +## Logo位置规范 + +### 主图Logo位置 +| 图片类型 | 推荐位置 | 备选位置 | +|----------|----------|----------| +| M1 场景首图 | bottom-right | none(产品上已有Logo) | +| M2 产品平铺 | none | bottom-right | +| M3 功能演示 | bottom-right | none | +| M4 场景四宫格 | bottom-right | none | +| M5 尺寸规格 | bottom-right | none | +| M6 品牌汇总 | center或prominent | - | + +### A+图Logo位置 +| 图片类型 | 推荐位置 | 备选位置 | +|----------|----------|----------| +| A1 品牌Banner | prominent/center | top-left | +| A2 竞品对比 | bottom-right(我方侧) | none | +| A3 卖点三宫格 | bottom-right | none | +| A4 功能四宫格 | bottom-right | none | +| A5 材质工艺 | bottom-right | none | +| A6 尺寸指南 | bottom-right | none | + +--- + +## 违规案例 + +以下Logo使用方式是禁止的: + +1. **倾斜Logo** - 任何角度的旋转都不允许 +2. **描边Logo** - 不能给Logo添加外轮廓 +3. **渐变Logo** - 不能使用渐变色填充 +4. **阴影Logo** - 不能添加投影效果 +5. **变形Logo** - 不能拉伸或压缩比例 +6. **下划线Logo** - 不能在文字下方添加线条 + +--- + +## 验证检查点 + +生成图片后,检查: + +- [ ] 产品上的刺绣Logo是TOUCHDOG®(大写) +- [ ] 电商图片Logo是touchdog®(小写) +- [ ] Logo颜色与背景亮度匹配(浅底红Logo,深底白Logo) +- [ ] Logo周围有足够净空间 +- [ ] Logo没有倾斜、渐变、阴影等违规处理 +- [ ] Logo尺寸不小于46px高度 + + + diff --git a/prompts/constraints/competitor-compliance.md b/prompts/constraints/competitor-compliance.md new file mode 100644 index 0000000..e69de29 diff --git a/prompts/image-templates.js b/prompts/image-templates.js new file mode 100644 index 0000000..8b3fabb --- /dev/null +++ b/prompts/image-templates.js @@ -0,0 +1,459 @@ +/** + * 基于真实交付成品的12张图Prompt模板 + * 每张图都包含文字排版要求 + */ + +// ======================================== +// 主图6张 (1600x1600px, 1:1) +// ======================================== + +const MAIN_TEMPLATES = { + // Main_01: 场景首图 + 卖点 + // 参考: 幻彩主图冰蓝色 (1).jpg + Main_01: (product, sellingPoints) => ` +[AMAZON MAIN IMAGE - LIFESTYLE WITH TEXT OVERLAY] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +SCENE: +- Beautiful cat wearing the product +- Warm, cozy home interior background (soft focus) +- Product clearly visible, 60% of frame +- Cat looks comfortable and relaxed + +TEXT OVERLAY (MUST INCLUDE): +- CENTER-LEFT AREA: Curved banner in muted blue (#8BB8C4) +- TITLE on banner: "DESIGNED FOR COMFORTABLE RECOVERY" in white, clean sans-serif font +- BOTTOM: 3 feature boxes in rounded rectangles with icons + - Box 1: "LIGHTER THAN AN EGG" with egg icon + - Box 2: "WATERPROOF & EASY WIPE" with water droplet icon + - Box 3: "BREATHABLE COTTON LINING" with cloud icon + +STYLE: +- Professional Amazon product photography +- Text is clean, readable, modern sans-serif +- Subtle paw print watermarks in background +- 8K quality, 1:1 aspect ratio +`, + + // Main_02: 白底平铺图 (纯产品,无文字) + Main_02: (product) => ` +[AMAZON MAIN IMAGE - FLAT LAY WHITE BACKGROUND] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +SCENE: +- Product flat lay on PURE WHITE background (#FFFFFF) +- Bird's eye view / top-down angle +- Full C-shaped opening visible +- All petals/segments spread out +- Clean studio lighting, minimal shadows +- Product fills 80% of frame + +NO TEXT OVERLAY ON THIS IMAGE. + +STYLE: +- Clean Amazon product photography +- 8K quality, 1:1 aspect ratio +`, + + // Main_03: 功能特写 + Main_03: (product) => ` +[AMAZON MAIN IMAGE - FEATURE CLOSE-UP] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +SCENE: +- Close-up shot of the product's key feature +- Focus on velcro closure mechanism OR inner lining texture +- Hands may be shown adjusting/demonstrating + +STYLE: +- Macro product photography +- Sharp focus on detail area +- Soft blurred background +- 8K quality, 1:1 aspect ratio +`, + + // Main_04: 多场景使用 (4宫格) + // 参考: 伊丽莎白A+ (4).jpg + Main_04: (product, sellingPoints) => ` +[AMAZON MAIN IMAGE - 4-GRID USAGE SCENARIOS] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: 2x2 grid of 4 scenes, each with text caption below + +SCENE 1 (TOP-LEFT): Cat wearing product, standing +CAPTION: "• HYGIENIC & EASY TO CLEAN" +SUB-TEXT: "${sellingPoints[0] || 'WATERPROOF OUTER LAYER REPELS STAINS'}" + +SCENE 2 (TOP-RIGHT): Cat eating from bowl while wearing product +CAPTION: "• UNRESTRICTED EATING/DRINKING" +SUB-TEXT: "${sellingPoints[1] || 'SPECIALLY DESIGNED OPENING ALLOWS NATURAL FEEDING'}" + +SCENE 3 (BOTTOM-LEFT): Cat stretching or walking with product +CAPTION: "• REVERSIBLE WEAR (4-IN-1 DESIGN)" +SUB-TEXT: "${sellingPoints[2] || 'FLIP-OVER DESIGN FLEXIBLY ADAPTS TO VARIOUS ACTIVITIES'}" + +SCENE 4 (BOTTOM-RIGHT): Cat sleeping comfortably with product +CAPTION: "• 360° COMFORT" +SUB-TEXT: "${sellingPoints[3] || 'FREE PLAY, SLEEP, AND MOVEMENT WITHOUT PRESSURE'}" + +STYLE: +- Each scene in rounded rectangle frame +- Warm beige background (#F5EDE4) with paw print watermarks +- Text in dark gray, clean sans-serif +- 8K quality, 1:1 aspect ratio +`, + + // Main_05: 尺寸图 + // 参考: 伊丽莎白A+ (6).jpg + Main_05: (product, sizeChart) => ` +[AMAZON MAIN IMAGE - SIZE GUIDE] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- TOP: Title "PRODUCT SIZE" in bold dark font +- CENTER: Product image with dimension arrows + - Arrow pointing to neck opening: "NECK" + - Arrow pointing to outer width: "WIDTH" +- BOTTOM: Size chart table + +SIZE CHART TABLE: +| SIZE | NECK CIRCUMFERENCE | DEPTH | +|------|-------------------|-------| +| XS | ${sizeChart?.XS?.neck || '5.6-6.8IN'} | ${sizeChart?.XS?.depth || '3.2IN'} | +| S | ${sizeChart?.S?.neck || '7.2-8.4IN'} | ${sizeChart?.S?.depth || '4IN'} | +| M | ${sizeChart?.M?.neck || '8.8-10.4IN'} | ${sizeChart?.M?.depth || '5IN'} | +| L | ${sizeChart?.L?.neck || '10.8-12.4IN'} | ${sizeChart?.L?.depth || '6IN'} | +| XL | ${sizeChart?.XL?.neck || '12.8-14.4IN'} | ${sizeChart?.XL?.depth || '7IN'} | + +FOOTER TEXT: "NOTE: MEASUREMENTS ARE HAND-CHECKED. ALWAYS MEASURE YOUR PET'S NECK CIRCUMFERENCE BEFORE SELECTING A SIZE." + +STYLE: +- Clean infographic style +- Warm beige background with paw prints +- Table with rounded corners +- 8K quality, 1:1 aspect ratio +`, + + // Main_06: 多角度展示 + // 参考: 伊丽莎白A+ (5).jpg + Main_06: (product) => ` +[AMAZON MAIN IMAGE - MULTIPLE ANGLES] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- 2 cats wearing the same product, different angles +- Left: Front view, cat facing camera +- Right: 3/4 side view, cat looking to the side +- Decorative curved line connecting the two images + +SCENE: +- Warm home interior background +- Both cats look comfortable +- Product clearly visible on both + +STYLE: +- Lifestyle photography +- Soft warm lighting +- No text overlay +- 8K quality, 1:1 aspect ratio +` +}; + +// ======================================== +// A+图6张 (970x600px, 约1.6:1) +// ======================================== + +const APLUS_TEMPLATES = { + // APlus_01: 品牌横幅 + // 参考: 伊丽莎白A+ (1).jpg + APlus_01: (product, brandName, productName) => ` +[AMAZON A+ BANNER - BRAND HEADER] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- Wide banner, 970x600px aspect ratio +- LEFT 40%: Empty space with decorative paw prints for text overlay +- RIGHT 60%: Cat wearing product in lifestyle scene + +TEXT OVERLAY (LEFT SIDE): +- BRAND NAME: "${brandName || 'TOUCHDOG'}" in playful, slightly curved font (coral/salmon color #E8A87C) +- Decorative paw prints around brand name +- PRODUCT NAME: "${productName || 'CAT SOFT CONE COLLAR'}" below in smaller gray text + +SCENE (RIGHT SIDE): +- White cat standing on modern furniture +- Wearing the product, looking comfortable +- Warm cozy interior background + +STYLE: +- Professional Amazon A+ content +- Warm, inviting color palette +- 8K quality +`, + + // APlus_02: 对比图 + // 参考: 伊丽莎白A+ (2).jpg + APlus_02: (product, sellingPoints, competitorWeaknesses) => ` +[AMAZON A+ COMPARISON IMAGE] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: Split screen, left vs right + +LEFT SIDE (OUR PRODUCT - COLORFUL): +- GREEN CHECKMARK icon at top-left +- "OUR" label in white on coral/orange background (#E8876C) +- Cat wearing our product, looking HAPPY +- 3 SELLING POINTS in white text: + • "${sellingPoints[0] || 'CLOUD-LIGHT COMFORT'}" + • "${sellingPoints[1] || 'WIDER & CLEARER'}" + • "${sellingPoints[2] || 'FOLDABLE & PORTABLE'}" + +RIGHT SIDE (COMPETITOR - GRAYSCALE): +- RED X-MARK icon at top-right +- "OTHER" label in dark text on gray background +- Cat wearing hard plastic cone, looking SAD/UNCOMFORTABLE +- GRAYSCALE/DESATURATED colors +- 3 WEAKNESSES in gray text: + • "${competitorWeaknesses[0] || 'HEAVY & BULKY'}" + • "${competitorWeaknesses[1] || 'BLOCKS VISION & MOVEMENT'}" + • "${competitorWeaknesses[2] || 'HARD TO STORE'}" + +CENTER: Product image showing our soft cone + +STYLE: +- Clear visual contrast between sides +- Warm beige background with paw prints +- 8K quality, ~1.6:1 aspect ratio +`, + + // APlus_03: 功能细节 + // 参考: 伊丽莎白A+ (3).jpg + APlus_03: (product, features) => ` +[AMAZON A+ FEATURE DETAILS] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- TOP: Large title "ENGINEERED FOR UNCOMPROMISED COMFORT" in bold dark font +- MIDDLE: 3 detail images in rounded rectangles + +DETAIL 1 (LEFT): +- Close-up of inner lining/fabric +- CAPTION: "${features[0]?.title || 'STURDY AND BREATHABLE'}" +- SUB-TEXT: "${features[0]?.desc || ', DURABLE AND COMFORTABLE'}" + +DETAIL 2 (CENTER): +- Dog/cat wearing product with size annotation line +- Show measurement like "24.5cm" +- CAPTION: "${features[1]?.title || 'EASY TO CLEAN, STYLISH'}" +- SUB-TEXT: "${features[1]?.desc || 'AND ATTRACTIVE'}" + +DETAIL 3 (RIGHT): +- Close-up of stitching/material +- CAPTION: "${features[2]?.title || 'REINFORCED STITCHING PROCESS'}" +- SUB-TEXT: "${features[2]?.desc || 'AND DURABLE FABRIC'}" + +STYLE: +- Warm beige background (#F5EDE4) with paw print watermarks +- Text in dark gray/brown +- 8K quality, ~1.6:1 aspect ratio +`, + + // APlus_04: 多场景 (与Main_04类似但横版) + APlus_04: (product, sellingPoints) => ` +[AMAZON A+ MULTI-SCENARIO - HORIZONTAL] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: 4 scenes in horizontal row + +SCENE 1: Cat standing wearing product +CAPTION: "• HYGIENIC & EASY TO CLEAN" + +SCENE 2: Cat eating from bowl +CAPTION: "• UNRESTRICTED EATING/DRINKING" + +SCENE 3: Cat stretching/playing +CAPTION: "• REVERSIBLE WEAR" + +SCENE 4: Cat sleeping peacefully +CAPTION: "• 360° COMFORT" + +Each scene in rounded rectangle frame with caption below. + +STYLE: +- Warm beige background with paw prints +- Clean modern typography +- 8K quality, ~1.6:1 aspect ratio +`, + + // APlus_05: 多角度展示 + APlus_05: (product) => ` +[AMAZON A+ MULTIPLE ANGLES - HORIZONTAL] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- 2 cats wearing product, side by side +- Left cat: Front view +- Right cat: Side/3/4 view +- Decorative curved divider between them + +SCENE: +- Warm interior background +- Both cats comfortable +- Product clearly visible + +STYLE: +- No text overlay +- Lifestyle photography +- 8K quality, ~1.6:1 aspect ratio +`, + + // APlus_06: 尺寸表 + APlus_06: (product, sizeChart) => ` +[AMAZON A+ SIZE CHART - HORIZONTAL] + +PRODUCT DESCRIPTION: +${product.goldenDescription} + +LAYOUT: +- LEFT 40%: Product image with dimension arrows (NECK, WIDTH labels) +- RIGHT 60%: Size chart table + +TITLE: "PRODUCT SIZE" at top + +SIZE CHART TABLE: +| SIZE | NECK CIRCUMFERENCE | DEPTH | +|------|-------------------|-------| +| XS | ${sizeChart?.XS?.neck || '5.6-6.8IN'} | ${sizeChart?.XS?.depth || '3.2IN'} | +| S | ${sizeChart?.S?.neck || '7.2-8.4IN'} | ${sizeChart?.S?.depth || '4IN'} | +| M | ${sizeChart?.M?.neck || '8.8-10.4IN'} | ${sizeChart?.M?.depth || '5IN'} | +| L | ${sizeChart?.L?.neck || '10.8-12.4IN'} | ${sizeChart?.L?.depth || '6IN'} | +| XL | ${sizeChart?.XL?.neck || '12.8-14.4IN'} | ${sizeChart?.XL?.depth || '7IN'} | + +FOOTER: "NOTE: ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE" + +STYLE: +- Warm beige background with paw prints +- Clean infographic style +- 8K quality, ~1.6:1 aspect ratio +` +}; + +// ======================================== +// 导出 +// ======================================== + +module.exports = { + MAIN_TEMPLATES, + APLUS_TEMPLATES, + + // 生成所有12张图的Prompts + generateAllPrompts: (product, skuInfo) => { + const prompts = []; + + // 主图6张 + prompts.push({ + id: 'Main_01', + name: '场景首图+卖点', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_01(product, skuInfo.sellingPoints || []) + }); + prompts.push({ + id: 'Main_02', + name: '白底平铺图', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_02(product) + }); + prompts.push({ + id: 'Main_03', + name: '功能特写', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_03(product) + }); + prompts.push({ + id: 'Main_04', + name: '多场景使用', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_04(product, skuInfo.sellingPoints || []) + }); + prompts.push({ + id: 'Main_05', + name: '尺寸图', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_05(product, skuInfo.sizeChart || {}) + }); + prompts.push({ + id: 'Main_06', + name: '多角度展示', + aspectRatio: '1:1', + prompt: MAIN_TEMPLATES.Main_06(product) + }); + + // A+图6张 + prompts.push({ + id: 'APlus_01', + name: '品牌横幅', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_01(product, skuInfo.brandName, skuInfo.productName) + }); + prompts.push({ + id: 'APlus_02', + name: '对比图', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_02( + product, + skuInfo.sellingPoints || [], + skuInfo.competitorWeaknesses || [] + ) + }); + prompts.push({ + id: 'APlus_03', + name: '功能细节', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_03(product, skuInfo.features || []) + }); + prompts.push({ + id: 'APlus_04', + name: '多场景横版', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_04(product, skuInfo.sellingPoints || []) + }); + prompts.push({ + id: 'APlus_05', + name: '多角度横版', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_05(product) + }); + prompts.push({ + id: 'APlus_06', + name: '尺寸表横版', + aspectRatio: '3:2', + prompt: APLUS_TEMPLATES.APlus_06(product, skuInfo.sizeChart || {}) + }); + + return prompts; + } +}; + + diff --git a/prompts/v6-optimized.md b/prompts/v6-optimized.md new file mode 100644 index 0000000..822f2d3 --- /dev/null +++ b/prompts/v6-optimized.md @@ -0,0 +1,486 @@ +# V6 Optimized Prompts for Amazon Listing + +## Strategy Overview +- **Strategy**: Image Editing (NOT Generation) +- **Core Principle**: Preserve specific elements (product/pet) while modifying background/layout +- **Prompt Structure**: + 1. Reference Analysis + 2. Critical Preservation Requirements + 3. Editing Tasks + 4. Layout Specification + 5. Style Guide + 6. Final Check + +## Main Images (1:1 Square) + +### Main_01: Hero Scene +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat (white/cream fur with light brown markings, blue eyes) wearing an ice-blue soft recovery cone collar (brand: TOUCHDOG). The cat is in a home environment. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The cat MUST remain a Ragdoll with blue eyes, white/cream fur, brown ear markings - EXACTLY as shown +2. The cone collar MUST remain ice-blue (#B5E5E8), flower/petal shaped, with "TOUCHDOG" branding +3. The cat's pose, expression, and the way the collar sits on the cat +4. The product's texture, stitching pattern, and velcro closure detail + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Enhance background to warm, cozy home interior (fireplace, blanket, wooden furniture) +2. Add soft warm lighting with gentle shadows +3. Add a curved blue banner (#4A7C9B) across middle area with text: "DESIGNED FOR COMFORTABLE RECOVERY" +4. Add 3 white feature boxes at bottom with icons and text: + - Egg icon + "LIGHTER THAN AN EGG" + - Water drop icon + "WATERPROOF & EASY WIPE" + - Cloud icon + "BREATHABLE COTTON LINING" +5. Add subtle paw print watermarks in light blue on the banner area + +LAYOUT SPECIFICATION: + - Top 60%: Cat wearing product in enhanced home scene + - Middle: Curved banner with main tagline + - Bottom 25%: Three feature callout boxes in a row + +STYLE GUIDE: +Professional Amazon main image style. Warm color palette. Text should be crisp and readable. The cat and product should be the clear focal point. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### Main_02: Flat Lay Detail +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position on black background. The product has a flower/petal shape with 8 segments, velcro closure on left, and green inner rim. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The product MUST remain EXACTLY as shown: ice-blue color (#B5E5E8), flower shape, 8 petal segments +2. The TOUCHDOG branding text on the product +3. The velcro strap detail and green/teal inner rim +4. The product's proportions and stitching pattern + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Change background from black to clean white +2. Add a dark green (#2D4A3E) banner at top with text: "DURABLE WATERPROOF PU LAYER" +3. Add 2 circular magnified detail callouts at bottom: + - Left circle: Close-up of outer material texture, label "DURABLE WATERPROOF PU LAYER" + - Right circle: Close-up of inner lining, label "DOUBLE-LAYER COMFORT" +4. Add thin green borders around detail circles +5. Keep layout clean and professional + +LAYOUT SPECIFICATION: + - Top: Dark green banner with title + - Center: Main product image on white background + - Bottom: Two circular detail magnifications with labels + +STYLE GUIDE: +Clean white background product photography. Professional Amazon main image style. High contrast, sharp details. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### Main_03: Feature Showcase +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: An ice-blue soft pet recovery cone collar (TOUCHDOG brand) shown in flat lay position. The product has a flower/petal shape with 8 segments, velcro closure, and green inner rim. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The product MUST remain EXACTLY as shown: ice-blue color (#B5E5E8), flower shape, TOUCHDOG branding +2. The velcro strap detail on the left side +3. The green/teal inner rim around the neck hole +4. The 8-petal segmented design with visible stitching + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Place the product on a soft blue background (#6B9AC4) that complements the product color +2. Add title text at top-left: "ADJUSTABLE STRAP FOR A SECURE FIT" in white, bold +3. Add 2 circular detail callout images on the right side: + - Top circle: Close-up of the velcro strap, caption "SECURE THE ADJUSTABLE STRAP" + - Bottom circle: Product being worn by a pet showing fit, caption "ADJUST FOR A SNUG FIT" +4. Add decorative white paw prints scattered in the background +5. Add thin white circular borders around the detail callouts + +LAYOUT SPECIFICATION: + - Left side (60%): Main product image, slightly angled + - Top-left corner: Title text + - Right side (40%): Two stacked circular detail images with captions + - Scattered paw prints as decoration + +STYLE GUIDE: +Clean infographic style. Blue color scheme matching the product. Professional Amazon A+ content quality. High contrast text for readability. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### Main_04: 4-Scenario Grid +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat (white/cream long fur, light brown markings on ears and face, distinctive blue eyes, pink nose) wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. ALL 4 SCENES MUST SHOW THE EXACT SAME CAT: Ragdoll breed, blue eyes, white/cream fur, brown ear markings +2. ALL 4 SCENES MUST SHOW THE EXACT SAME PRODUCT: Ice-blue (#B5E5E8) flower-shaped soft cone, TOUCHDOG brand +3. The cat's fur texture and coloring must be consistent across all 4 images +4. The product's color, shape, and branding must be identical in all 4 scenes + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create a 2x2 grid layout with 4 scenes, each in a rounded rectangle frame +2. TOP-LEFT scene: Cat standing alert, wearing the cone - Caption: "• HYGIENIC & EASY TO CLEAN" +3. TOP-RIGHT scene: Cat eating/drinking from a bowl while wearing cone - Caption: "• UNRESTRICTED EATING/DRINKING" +4. BOTTOM-LEFT scene: Cat stretching or playing while wearing cone - Caption: "• REVERSIBLE WEAR" +5. BOTTOM-RIGHT scene: Cat sleeping peacefully curled up with cone - Caption: "• 360° COMFORT" +6. Add light paw print watermarks in corners of the overall image + +LAYOUT SPECIFICATION: + - Background: Warm beige/cream (#F5EBE0) + - 2x2 grid of equal-sized rounded rectangles + - Each scene has the same cat in different poses + - Caption text below each scene in brown (#8B7355) + - Subtle paw prints in corners + +STYLE GUIDE: + Lifestyle photography style. Warm, inviting colors. + The cat should look comfortable and happy in all scenes. + Consistent lighting across all 4 scenes. + CRITICAL: The cat must be recognizably the SAME individual cat in all scenes. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### Main_05: Size Chart +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position, showing its flower/petal shape design. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The product MUST remain EXACTLY as shown: ice-blue color, flower shape, TOUCHDOG branding +2. The product's proportions and shape +3. The velcro closure and inner rim details + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Place product on warm beige background (#F5EDE4) +2. Add title "PRODUCT SIZE" at top center in dark text +3. Add a size chart table below the product with columns: SIZE | NECK | DEPTH +4. Table data: + XS: 5.6-6.8IN | 3.2IN + S: 7.2-8.4IN | 4IN + M: 8.8-10.4IN | 5IN + L: 10.8-12.4IN | 6IN + XL: 12.8-14.4IN | 7IN +5. Add note in coral/salmon color: "NOTE: ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE" +6. Add subtle paw print decorations in beige tones + +LAYOUT SPECIFICATION: + - Top: Title + - Center: Product image (main focus) + - Bottom: Size chart table with clean design + +STYLE GUIDE: +Clean, informative infographic style. Easy to read table. Warm neutral background. Professional Amazon listing quality. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### Main_06: Multi-Angle +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat (white/cream fur, brown ear markings, blue eyes) wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The cat MUST remain a Ragdoll: blue eyes, white/cream fur, brown markings +2. The product MUST remain ice-blue (#B5E5E8), flower-shaped, TOUCHDOG branded +3. Both views must show the EXACT SAME cat and product + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create a split image with curved decorative divider in the middle +2. LEFT SIDE: Front view of cat wearing the cone (from reference) +3. RIGHT SIDE: Side/profile view of the same cat wearing the same cone +4. Warm home interior background in both halves +5. NO text overlays - pure lifestyle imagery + +LAYOUT SPECIFICATION: + - Split layout with elegant curved divider + - Left: Front view + - Right: Side view + - Consistent warm lighting across both + +STYLE GUIDE: +Lifestyle photography. Warm, cozy atmosphere. The cat should look comfortable. NO text. + +OUTPUT: 1:1 square ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +## A+ Images (3:2 Landscape) + +### APlus_01: Brand Banner +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar in a home setting. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The cat MUST remain a Ragdoll with blue eyes and white/cream fur +2. The product MUST remain ice-blue, flower-shaped, TOUCHDOG branded + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create a horizontal banner layout (3:2 ratio) +2. LEFT 40%: Brand text area with: + - "TOUCHDOG" in playful coral/salmon color (#E8A87C) + - Small paw print icons around the brand name + - "CAT SOFT CONE COLLAR" below in gray +3. RIGHT 60%: The cat wearing the product in a warm home setting +4. Soft, warm color palette throughout + +LAYOUT SPECIFICATION: + - Left side: Brand name and product title + - Right side: Hero image of cat with product + - Warm, cohesive color scheme + +STYLE GUIDE: +Amazon A+ brand story style. Warm and inviting. Professional yet friendly. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### APlus_02: Comparison Chart +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. LEFT SIDE: The cat and product MUST match the reference - Ragdoll cat, ice-blue soft cone +2. The product color (#B5E5E8), flower shape, and TOUCHDOG branding on left side + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create a side-by-side comparison layout +2. LEFT SIDE (60% width, colorful): + - Happy Ragdoll cat wearing our ice-blue soft cone (from reference) + - Green checkmark icon + - "OUR" label on coral/orange banner + - 3 benefits in white: "CLOUD-LIGHT COMFORT", "WIDER & CLEARER", "FOLDABLE & PORTABLE" +3. RIGHT SIDE (40% width, grayscale): + - Sad-looking cat wearing a DIFFERENT product: hard plastic transparent cone (traditional e-collar) + - Red X icon + - "OTHER" label on gray banner + - 3 drawbacks in gray: "HEAVY & BULKY", "BLOCKS VISION & MOVEMENT", "HARD TO STORE" +4. Warm beige background with paw print watermarks + +LAYOUT SPECIFICATION: + - Split layout with curved divider + - Left side larger, full color, positive mood + - Right side smaller, desaturated, negative mood + - Text overlays on each side + +STYLE GUIDE: + Clear visual contrast between "us" and "them". + Left side warm and inviting, right side cold and uncomfortable. + IMPORTANT: Right side must show a DIFFERENT type of cone (hard plastic), not our product. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### APlus_03: Feature Details +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The cat MUST remain a Ragdoll with blue eyes +2. The product MUST remain ice-blue, flower-shaped, TOUCHDOG branded + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create horizontal layout (3:2) with title and 3 detail panels +2. Title at top: "ENGINEERED FOR UNCOMPROMISED COMFORT" in dark text +3. 3 detail images in a row below: + - Panel 1: Close-up of inner cotton lining texture, caption "STURDY AND BREATHABLE" + - Panel 2: Cat wearing the product looking comfortable, caption "EASY TO CLEAN, STYLISH" + - Panel 3: Close-up of stitching detail, caption "REINFORCED STITCHING" +4. Warm beige background (#F5EBE0) with subtle paw prints + +LAYOUT SPECIFICATION: + - Top: Title banner + - Bottom: Three equal-width panels with captions + +STYLE GUIDE: +Amazon A+ feature module style. Clean, informative. Warm color palette. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### APlus_04: 4-Scene Horizontal +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat (white/cream fur, blue eyes, brown ear markings) wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. ALL 4 SCENES MUST SHOW THE EXACT SAME CAT: Ragdoll breed, blue eyes, white/cream fur +2. ALL 4 SCENES MUST SHOW THE EXACT SAME PRODUCT: Ice-blue flower-shaped soft cone +3. Consistent cat appearance and product across all panels + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create horizontal layout (3:2) with 4 scenes in a row +2. Scene 1: Cat standing - "HYGIENIC & EASY TO CLEAN" +3. Scene 2: Cat eating from bowl - "UNRESTRICTED EATING" +4. Scene 3: Cat playing/stretching - "REVERSIBLE WEAR" +5. Scene 4: Cat sleeping curled up - "360° COMFORT" +6. Each scene in a rounded rectangle frame +7. Warm beige background with paw print decorations + +LAYOUT SPECIFICATION: + - 4 equal panels arranged horizontally + - Each panel has image + caption below + - Consistent warm lighting across all + +STYLE GUIDE: +Lifestyle photography. Same cat in all scenes. Warm, cozy feel. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### APlus_05: Multi-Angle Horizontal +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: A Ragdoll cat wearing an ice-blue TOUCHDOG soft recovery cone collar. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. Both views must show the SAME Ragdoll cat with blue eyes +2. Both views must show the SAME ice-blue TOUCHDOG cone + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Create horizontal split layout (3:2) +2. LEFT: Front view of cat wearing cone +3. RIGHT: Side/profile view of same cat with cone +4. Elegant curved divider between the two views +5. Warm home background in both +6. NO text - pure visual showcase + +LAYOUT SPECIFICATION: + - Two equal halves with curved divider + - Left: Front angle + - Right: Side angle + - Warm consistent lighting + +STYLE GUIDE: +High-end lifestyle photography. No text. Warm atmosphere. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + +### APlus_06: Size Chart Horizontal (Corrected) +```text +[IMAGE EDITING TASK - NOT GENERATION] + +REFERENCE IMAGE ANALYSIS: +The reference image shows: An ice-blue TOUCHDOG soft pet recovery cone collar in flat lay position. +CRITICAL SHAPE DETAIL: The product has a C-SHAPED OPENING (not a closed circle) - there is a GAP on the left side where the velcro strap attaches. This opening allows the collar to wrap around the pet's neck. + +CRITICAL PRESERVATION REQUIREMENTS (DO NOT MODIFY): +1. The product MUST keep its C-SHAPED OPENING - DO NOT close the gap into a full circle +2. The velcro strap visible on the left side of the opening +3. Ice-blue color (#B5E5E8), flower/petal shape with 8 segments +4. TOUCHDOG brand text on the product +5. Green/teal inner rim around the neck hole + +EDITING TASKS (ONLY THESE CHANGES ARE ALLOWED): +1. Change background from black to warm beige (#F5EDE4) +2. Add title "PRODUCT SIZE" at top center in dark text +3. Add dimension labels: "NECK" pointing to inner circle, "DEPTH" pointing outward +4. Add size chart table on the right: + SIZE | NECK | DEPTH + XS | 5.6-6.8IN | 3.2IN + S | 7.2-8.4IN | 4IN + M | 8.8-10.4IN | 5IN + L | 10.8-12.4IN | 6IN + XL | 12.8-14.4IN | 7IN +5. Add note in coral: "ALWAYS MEASURE YOUR PET'S NECK BEFORE SELECTING A SIZE" +6. Add subtle paw print watermarks + +LAYOUT SPECIFICATION: + - Left 45%: Product image maintaining C-shape opening + - Right 55%: Size chart table + - Top: Title + - Bottom: Note text + +STYLE GUIDE: +Clean infographic style. The product's C-shaped opening must be clearly visible - this is a key feature showing how it wraps around the neck. + +OUTPUT: 3:2 landscape ratio, professional Amazon listing quality + +FINAL CHECK: Before output, verify that the pet and product in the result match the reference image EXACTLY in: +- Species, breed, fur color and pattern +- Product color (#B5E5E8 ice blue), shape (flower/petal cone), brand text "TOUCHDOG" +- Pose and positioning relative to original +``` + diff --git a/public/css/bootstrap-icons.css b/public/css/bootstrap-icons.css new file mode 100644 index 0000000..ae1be21 --- /dev/null +++ b/public/css/bootstrap-icons.css @@ -0,0 +1,2018 @@ +@font-face { + font-display: block; + font-family: "bootstrap-icons"; + src: url("../fonts/bootstrap-icons.woff2?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff2"), +url("../fonts/bootstrap-icons.woff?2ab2cbbe07fcebb53bdaa7313bb290f2") format("woff"); +} + +.bi::before, +[class^="bi-"]::before, +[class*=" bi-"]::before { + display: inline-block; + font-family: bootstrap-icons !important; + font-style: normal; + font-weight: normal !important; + font-variant: normal; + text-transform: none; + line-height: 1; + vertical-align: -.125em; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.bi-123::before { content: "\f67f"; } +.bi-alarm-fill::before { content: "\f101"; } +.bi-alarm::before { content: "\f102"; } +.bi-align-bottom::before { content: "\f103"; } +.bi-align-center::before { content: "\f104"; } +.bi-align-end::before { content: "\f105"; } +.bi-align-middle::before { content: "\f106"; } +.bi-align-start::before { content: "\f107"; } +.bi-align-top::before { content: "\f108"; } +.bi-alt::before { content: "\f109"; } +.bi-app-indicator::before { content: "\f10a"; } +.bi-app::before { content: "\f10b"; } +.bi-archive-fill::before { content: "\f10c"; } +.bi-archive::before { content: "\f10d"; } +.bi-arrow-90deg-down::before { content: "\f10e"; } +.bi-arrow-90deg-left::before { content: "\f10f"; } +.bi-arrow-90deg-right::before { content: "\f110"; } +.bi-arrow-90deg-up::before { content: "\f111"; } +.bi-arrow-bar-down::before { content: "\f112"; } +.bi-arrow-bar-left::before { content: "\f113"; } +.bi-arrow-bar-right::before { content: "\f114"; } +.bi-arrow-bar-up::before { content: "\f115"; } +.bi-arrow-clockwise::before { content: "\f116"; } +.bi-arrow-counterclockwise::before { content: "\f117"; } +.bi-arrow-down-circle-fill::before { content: "\f118"; } +.bi-arrow-down-circle::before { content: "\f119"; } +.bi-arrow-down-left-circle-fill::before { content: "\f11a"; } +.bi-arrow-down-left-circle::before { content: "\f11b"; } +.bi-arrow-down-left-square-fill::before { content: "\f11c"; } +.bi-arrow-down-left-square::before { content: "\f11d"; } +.bi-arrow-down-left::before { content: "\f11e"; } +.bi-arrow-down-right-circle-fill::before { content: "\f11f"; } +.bi-arrow-down-right-circle::before { content: "\f120"; } +.bi-arrow-down-right-square-fill::before { content: "\f121"; } +.bi-arrow-down-right-square::before { content: "\f122"; } +.bi-arrow-down-right::before { content: "\f123"; } +.bi-arrow-down-short::before { content: "\f124"; } +.bi-arrow-down-square-fill::before { content: "\f125"; } +.bi-arrow-down-square::before { content: "\f126"; } +.bi-arrow-down-up::before { content: "\f127"; } +.bi-arrow-down::before { content: "\f128"; } +.bi-arrow-left-circle-fill::before { content: "\f129"; } +.bi-arrow-left-circle::before { content: "\f12a"; } +.bi-arrow-left-right::before { content: "\f12b"; } +.bi-arrow-left-short::before { content: "\f12c"; } +.bi-arrow-left-square-fill::before { content: "\f12d"; } +.bi-arrow-left-square::before { content: "\f12e"; } +.bi-arrow-left::before { content: "\f12f"; } +.bi-arrow-repeat::before { content: "\f130"; } +.bi-arrow-return-left::before { content: "\f131"; } +.bi-arrow-return-right::before { content: "\f132"; } +.bi-arrow-right-circle-fill::before { content: "\f133"; } +.bi-arrow-right-circle::before { content: "\f134"; } +.bi-arrow-right-short::before { content: "\f135"; } +.bi-arrow-right-square-fill::before { content: "\f136"; } +.bi-arrow-right-square::before { content: "\f137"; } +.bi-arrow-right::before { content: "\f138"; } +.bi-arrow-up-circle-fill::before { content: "\f139"; } +.bi-arrow-up-circle::before { content: "\f13a"; } +.bi-arrow-up-left-circle-fill::before { content: "\f13b"; } +.bi-arrow-up-left-circle::before { content: "\f13c"; } +.bi-arrow-up-left-square-fill::before { content: "\f13d"; } +.bi-arrow-up-left-square::before { content: "\f13e"; } +.bi-arrow-up-left::before { content: "\f13f"; } +.bi-arrow-up-right-circle-fill::before { content: "\f140"; } +.bi-arrow-up-right-circle::before { content: "\f141"; } +.bi-arrow-up-right-square-fill::before { content: "\f142"; } +.bi-arrow-up-right-square::before { content: "\f143"; } +.bi-arrow-up-right::before { content: "\f144"; } +.bi-arrow-up-short::before { content: "\f145"; } +.bi-arrow-up-square-fill::before { content: "\f146"; } +.bi-arrow-up-square::before { content: "\f147"; } +.bi-arrow-up::before { content: "\f148"; } +.bi-arrows-angle-contract::before { content: "\f149"; } +.bi-arrows-angle-expand::before { content: "\f14a"; } +.bi-arrows-collapse::before { content: "\f14b"; } +.bi-arrows-expand::before { content: "\f14c"; } +.bi-arrows-fullscreen::before { content: "\f14d"; } +.bi-arrows-move::before { content: "\f14e"; } +.bi-aspect-ratio-fill::before { content: "\f14f"; } +.bi-aspect-ratio::before { content: "\f150"; } +.bi-asterisk::before { content: "\f151"; } +.bi-at::before { content: "\f152"; } +.bi-award-fill::before { content: "\f153"; } +.bi-award::before { content: "\f154"; } +.bi-back::before { content: "\f155"; } +.bi-backspace-fill::before { content: "\f156"; } +.bi-backspace-reverse-fill::before { content: "\f157"; } +.bi-backspace-reverse::before { content: "\f158"; } +.bi-backspace::before { content: "\f159"; } +.bi-badge-3d-fill::before { content: "\f15a"; } +.bi-badge-3d::before { content: "\f15b"; } +.bi-badge-4k-fill::before { content: "\f15c"; } +.bi-badge-4k::before { content: "\f15d"; } +.bi-badge-8k-fill::before { content: "\f15e"; } +.bi-badge-8k::before { content: "\f15f"; } +.bi-badge-ad-fill::before { content: "\f160"; } +.bi-badge-ad::before { content: "\f161"; } +.bi-badge-ar-fill::before { content: "\f162"; } +.bi-badge-ar::before { content: "\f163"; } +.bi-badge-cc-fill::before { content: "\f164"; } +.bi-badge-cc::before { content: "\f165"; } +.bi-badge-hd-fill::before { content: "\f166"; } +.bi-badge-hd::before { content: "\f167"; } +.bi-badge-tm-fill::before { content: "\f168"; } +.bi-badge-tm::before { content: "\f169"; } +.bi-badge-vo-fill::before { content: "\f16a"; } +.bi-badge-vo::before { content: "\f16b"; } +.bi-badge-vr-fill::before { content: "\f16c"; } +.bi-badge-vr::before { content: "\f16d"; } +.bi-badge-wc-fill::before { content: "\f16e"; } +.bi-badge-wc::before { content: "\f16f"; } +.bi-bag-check-fill::before { content: "\f170"; } +.bi-bag-check::before { content: "\f171"; } +.bi-bag-dash-fill::before { content: "\f172"; } +.bi-bag-dash::before { content: "\f173"; } +.bi-bag-fill::before { content: "\f174"; } +.bi-bag-plus-fill::before { content: "\f175"; } +.bi-bag-plus::before { content: "\f176"; } +.bi-bag-x-fill::before { content: "\f177"; } +.bi-bag-x::before { content: "\f178"; } +.bi-bag::before { content: "\f179"; } +.bi-bar-chart-fill::before { content: "\f17a"; } +.bi-bar-chart-line-fill::before { content: "\f17b"; } +.bi-bar-chart-line::before { content: "\f17c"; } +.bi-bar-chart-steps::before { content: "\f17d"; } +.bi-bar-chart::before { content: "\f17e"; } +.bi-basket-fill::before { content: "\f17f"; } +.bi-basket::before { content: "\f180"; } +.bi-basket2-fill::before { content: "\f181"; } +.bi-basket2::before { content: "\f182"; } +.bi-basket3-fill::before { content: "\f183"; } +.bi-basket3::before { content: "\f184"; } +.bi-battery-charging::before { content: "\f185"; } +.bi-battery-full::before { content: "\f186"; } +.bi-battery-half::before { content: "\f187"; } +.bi-battery::before { content: "\f188"; } +.bi-bell-fill::before { content: "\f189"; } +.bi-bell::before { content: "\f18a"; } +.bi-bezier::before { content: "\f18b"; } +.bi-bezier2::before { content: "\f18c"; } +.bi-bicycle::before { content: "\f18d"; } +.bi-binoculars-fill::before { content: "\f18e"; } +.bi-binoculars::before { content: "\f18f"; } +.bi-blockquote-left::before { content: "\f190"; } +.bi-blockquote-right::before { content: "\f191"; } +.bi-book-fill::before { content: "\f192"; } +.bi-book-half::before { content: "\f193"; } +.bi-book::before { content: "\f194"; } +.bi-bookmark-check-fill::before { content: "\f195"; } +.bi-bookmark-check::before { content: "\f196"; } +.bi-bookmark-dash-fill::before { content: "\f197"; } +.bi-bookmark-dash::before { content: "\f198"; } +.bi-bookmark-fill::before { content: "\f199"; } +.bi-bookmark-heart-fill::before { content: "\f19a"; } +.bi-bookmark-heart::before { content: "\f19b"; } +.bi-bookmark-plus-fill::before { content: "\f19c"; } +.bi-bookmark-plus::before { content: "\f19d"; } +.bi-bookmark-star-fill::before { content: "\f19e"; } +.bi-bookmark-star::before { content: "\f19f"; } +.bi-bookmark-x-fill::before { content: "\f1a0"; } +.bi-bookmark-x::before { content: "\f1a1"; } +.bi-bookmark::before { content: "\f1a2"; } +.bi-bookmarks-fill::before { content: "\f1a3"; } +.bi-bookmarks::before { content: "\f1a4"; } +.bi-bookshelf::before { content: "\f1a5"; } +.bi-bootstrap-fill::before { content: "\f1a6"; } +.bi-bootstrap-reboot::before { content: "\f1a7"; } +.bi-bootstrap::before { content: "\f1a8"; } +.bi-border-all::before { content: "\f1a9"; } +.bi-border-bottom::before { content: "\f1aa"; } +.bi-border-center::before { content: "\f1ab"; } +.bi-border-inner::before { content: "\f1ac"; } +.bi-border-left::before { content: "\f1ad"; } +.bi-border-middle::before { content: "\f1ae"; } +.bi-border-outer::before { content: "\f1af"; } +.bi-border-right::before { content: "\f1b0"; } +.bi-border-style::before { content: "\f1b1"; } +.bi-border-top::before { content: "\f1b2"; } +.bi-border-width::before { content: "\f1b3"; } +.bi-border::before { content: "\f1b4"; } +.bi-bounding-box-circles::before { content: "\f1b5"; } +.bi-bounding-box::before { content: "\f1b6"; } +.bi-box-arrow-down-left::before { content: "\f1b7"; } +.bi-box-arrow-down-right::before { content: "\f1b8"; } +.bi-box-arrow-down::before { content: "\f1b9"; } +.bi-box-arrow-in-down-left::before { content: "\f1ba"; } +.bi-box-arrow-in-down-right::before { content: "\f1bb"; } +.bi-box-arrow-in-down::before { content: "\f1bc"; } +.bi-box-arrow-in-left::before { content: "\f1bd"; } +.bi-box-arrow-in-right::before { content: "\f1be"; } +.bi-box-arrow-in-up-left::before { content: "\f1bf"; } +.bi-box-arrow-in-up-right::before { content: "\f1c0"; } +.bi-box-arrow-in-up::before { content: "\f1c1"; } +.bi-box-arrow-left::before { content: "\f1c2"; } +.bi-box-arrow-right::before { content: "\f1c3"; } +.bi-box-arrow-up-left::before { content: "\f1c4"; } +.bi-box-arrow-up-right::before { content: "\f1c5"; } +.bi-box-arrow-up::before { content: "\f1c6"; } +.bi-box-seam::before { content: "\f1c7"; } +.bi-box::before { content: "\f1c8"; } +.bi-braces::before { content: "\f1c9"; } +.bi-bricks::before { content: "\f1ca"; } +.bi-briefcase-fill::before { content: "\f1cb"; } +.bi-briefcase::before { content: "\f1cc"; } +.bi-brightness-alt-high-fill::before { content: "\f1cd"; } +.bi-brightness-alt-high::before { content: "\f1ce"; } +.bi-brightness-alt-low-fill::before { content: "\f1cf"; } +.bi-brightness-alt-low::before { content: "\f1d0"; } +.bi-brightness-high-fill::before { content: "\f1d1"; } +.bi-brightness-high::before { content: "\f1d2"; } +.bi-brightness-low-fill::before { content: "\f1d3"; } +.bi-brightness-low::before { content: "\f1d4"; } +.bi-broadcast-pin::before { content: "\f1d5"; } +.bi-broadcast::before { content: "\f1d6"; } +.bi-brush-fill::before { content: "\f1d7"; } +.bi-brush::before { content: "\f1d8"; } +.bi-bucket-fill::before { content: "\f1d9"; } +.bi-bucket::before { content: "\f1da"; } +.bi-bug-fill::before { content: "\f1db"; } +.bi-bug::before { content: "\f1dc"; } +.bi-building::before { content: "\f1dd"; } +.bi-bullseye::before { content: "\f1de"; } +.bi-calculator-fill::before { content: "\f1df"; } +.bi-calculator::before { content: "\f1e0"; } +.bi-calendar-check-fill::before { content: "\f1e1"; } +.bi-calendar-check::before { content: "\f1e2"; } +.bi-calendar-date-fill::before { content: "\f1e3"; } +.bi-calendar-date::before { content: "\f1e4"; } +.bi-calendar-day-fill::before { content: "\f1e5"; } +.bi-calendar-day::before { content: "\f1e6"; } +.bi-calendar-event-fill::before { content: "\f1e7"; } +.bi-calendar-event::before { content: "\f1e8"; } +.bi-calendar-fill::before { content: "\f1e9"; } +.bi-calendar-minus-fill::before { content: "\f1ea"; } +.bi-calendar-minus::before { content: "\f1eb"; } +.bi-calendar-month-fill::before { content: "\f1ec"; } +.bi-calendar-month::before { content: "\f1ed"; } +.bi-calendar-plus-fill::before { content: "\f1ee"; } +.bi-calendar-plus::before { content: "\f1ef"; } +.bi-calendar-range-fill::before { content: "\f1f0"; } +.bi-calendar-range::before { content: "\f1f1"; } +.bi-calendar-week-fill::before { content: "\f1f2"; } +.bi-calendar-week::before { content: "\f1f3"; } +.bi-calendar-x-fill::before { content: "\f1f4"; } +.bi-calendar-x::before { content: "\f1f5"; } +.bi-calendar::before { content: "\f1f6"; } +.bi-calendar2-check-fill::before { content: "\f1f7"; } +.bi-calendar2-check::before { content: "\f1f8"; } +.bi-calendar2-date-fill::before { content: "\f1f9"; } +.bi-calendar2-date::before { content: "\f1fa"; } +.bi-calendar2-day-fill::before { content: "\f1fb"; } +.bi-calendar2-day::before { content: "\f1fc"; } +.bi-calendar2-event-fill::before { content: "\f1fd"; } +.bi-calendar2-event::before { content: "\f1fe"; } +.bi-calendar2-fill::before { content: "\f1ff"; } +.bi-calendar2-minus-fill::before { content: "\f200"; } +.bi-calendar2-minus::before { content: "\f201"; } +.bi-calendar2-month-fill::before { content: "\f202"; } +.bi-calendar2-month::before { content: "\f203"; } +.bi-calendar2-plus-fill::before { content: "\f204"; } +.bi-calendar2-plus::before { content: "\f205"; } +.bi-calendar2-range-fill::before { content: "\f206"; } +.bi-calendar2-range::before { content: "\f207"; } +.bi-calendar2-week-fill::before { content: "\f208"; } +.bi-calendar2-week::before { content: "\f209"; } +.bi-calendar2-x-fill::before { content: "\f20a"; } +.bi-calendar2-x::before { content: "\f20b"; } +.bi-calendar2::before { content: "\f20c"; } +.bi-calendar3-event-fill::before { content: "\f20d"; } +.bi-calendar3-event::before { content: "\f20e"; } +.bi-calendar3-fill::before { content: "\f20f"; } +.bi-calendar3-range-fill::before { content: "\f210"; } +.bi-calendar3-range::before { content: "\f211"; } +.bi-calendar3-week-fill::before { content: "\f212"; } +.bi-calendar3-week::before { content: "\f213"; } +.bi-calendar3::before { content: "\f214"; } +.bi-calendar4-event::before { content: "\f215"; } +.bi-calendar4-range::before { content: "\f216"; } +.bi-calendar4-week::before { content: "\f217"; } +.bi-calendar4::before { content: "\f218"; } +.bi-camera-fill::before { content: "\f219"; } +.bi-camera-reels-fill::before { content: "\f21a"; } +.bi-camera-reels::before { content: "\f21b"; } +.bi-camera-video-fill::before { content: "\f21c"; } +.bi-camera-video-off-fill::before { content: "\f21d"; } +.bi-camera-video-off::before { content: "\f21e"; } +.bi-camera-video::before { content: "\f21f"; } +.bi-camera::before { content: "\f220"; } +.bi-camera2::before { content: "\f221"; } +.bi-capslock-fill::before { content: "\f222"; } +.bi-capslock::before { content: "\f223"; } +.bi-card-checklist::before { content: "\f224"; } +.bi-card-heading::before { content: "\f225"; } +.bi-card-image::before { content: "\f226"; } +.bi-card-list::before { content: "\f227"; } +.bi-card-text::before { content: "\f228"; } +.bi-caret-down-fill::before { content: "\f229"; } +.bi-caret-down-square-fill::before { content: "\f22a"; } +.bi-caret-down-square::before { content: "\f22b"; } +.bi-caret-down::before { content: "\f22c"; } +.bi-caret-left-fill::before { content: "\f22d"; } +.bi-caret-left-square-fill::before { content: "\f22e"; } +.bi-caret-left-square::before { content: "\f22f"; } +.bi-caret-left::before { content: "\f230"; } +.bi-caret-right-fill::before { content: "\f231"; } +.bi-caret-right-square-fill::before { content: "\f232"; } +.bi-caret-right-square::before { content: "\f233"; } +.bi-caret-right::before { content: "\f234"; } +.bi-caret-up-fill::before { content: "\f235"; } +.bi-caret-up-square-fill::before { content: "\f236"; } +.bi-caret-up-square::before { content: "\f237"; } +.bi-caret-up::before { content: "\f238"; } +.bi-cart-check-fill::before { content: "\f239"; } +.bi-cart-check::before { content: "\f23a"; } +.bi-cart-dash-fill::before { content: "\f23b"; } +.bi-cart-dash::before { content: "\f23c"; } +.bi-cart-fill::before { content: "\f23d"; } +.bi-cart-plus-fill::before { content: "\f23e"; } +.bi-cart-plus::before { content: "\f23f"; } +.bi-cart-x-fill::before { content: "\f240"; } +.bi-cart-x::before { content: "\f241"; } +.bi-cart::before { content: "\f242"; } +.bi-cart2::before { content: "\f243"; } +.bi-cart3::before { content: "\f244"; } +.bi-cart4::before { content: "\f245"; } +.bi-cash-stack::before { content: "\f246"; } +.bi-cash::before { content: "\f247"; } +.bi-cast::before { content: "\f248"; } +.bi-chat-dots-fill::before { content: "\f249"; } +.bi-chat-dots::before { content: "\f24a"; } +.bi-chat-fill::before { content: "\f24b"; } +.bi-chat-left-dots-fill::before { content: "\f24c"; } +.bi-chat-left-dots::before { content: "\f24d"; } +.bi-chat-left-fill::before { content: "\f24e"; } +.bi-chat-left-quote-fill::before { content: "\f24f"; } +.bi-chat-left-quote::before { content: "\f250"; } +.bi-chat-left-text-fill::before { content: "\f251"; } +.bi-chat-left-text::before { content: "\f252"; } +.bi-chat-left::before { content: "\f253"; } +.bi-chat-quote-fill::before { content: "\f254"; } +.bi-chat-quote::before { content: "\f255"; } +.bi-chat-right-dots-fill::before { content: "\f256"; } +.bi-chat-right-dots::before { content: "\f257"; } +.bi-chat-right-fill::before { content: "\f258"; } +.bi-chat-right-quote-fill::before { content: "\f259"; } +.bi-chat-right-quote::before { content: "\f25a"; } +.bi-chat-right-text-fill::before { content: "\f25b"; } +.bi-chat-right-text::before { content: "\f25c"; } +.bi-chat-right::before { content: "\f25d"; } +.bi-chat-square-dots-fill::before { content: "\f25e"; } +.bi-chat-square-dots::before { content: "\f25f"; } +.bi-chat-square-fill::before { content: "\f260"; } +.bi-chat-square-quote-fill::before { content: "\f261"; } +.bi-chat-square-quote::before { content: "\f262"; } +.bi-chat-square-text-fill::before { content: "\f263"; } +.bi-chat-square-text::before { content: "\f264"; } +.bi-chat-square::before { content: "\f265"; } +.bi-chat-text-fill::before { content: "\f266"; } +.bi-chat-text::before { content: "\f267"; } +.bi-chat::before { content: "\f268"; } +.bi-check-all::before { content: "\f269"; } +.bi-check-circle-fill::before { content: "\f26a"; } +.bi-check-circle::before { content: "\f26b"; } +.bi-check-square-fill::before { content: "\f26c"; } +.bi-check-square::before { content: "\f26d"; } +.bi-check::before { content: "\f26e"; } +.bi-check2-all::before { content: "\f26f"; } +.bi-check2-circle::before { content: "\f270"; } +.bi-check2-square::before { content: "\f271"; } +.bi-check2::before { content: "\f272"; } +.bi-chevron-bar-contract::before { content: "\f273"; } +.bi-chevron-bar-down::before { content: "\f274"; } +.bi-chevron-bar-expand::before { content: "\f275"; } +.bi-chevron-bar-left::before { content: "\f276"; } +.bi-chevron-bar-right::before { content: "\f277"; } +.bi-chevron-bar-up::before { content: "\f278"; } +.bi-chevron-compact-down::before { content: "\f279"; } +.bi-chevron-compact-left::before { content: "\f27a"; } +.bi-chevron-compact-right::before { content: "\f27b"; } +.bi-chevron-compact-up::before { content: "\f27c"; } +.bi-chevron-contract::before { content: "\f27d"; } +.bi-chevron-double-down::before { content: "\f27e"; } +.bi-chevron-double-left::before { content: "\f27f"; } +.bi-chevron-double-right::before { content: "\f280"; } +.bi-chevron-double-up::before { content: "\f281"; } +.bi-chevron-down::before { content: "\f282"; } +.bi-chevron-expand::before { content: "\f283"; } +.bi-chevron-left::before { content: "\f284"; } +.bi-chevron-right::before { content: "\f285"; } +.bi-chevron-up::before { content: "\f286"; } +.bi-circle-fill::before { content: "\f287"; } +.bi-circle-half::before { content: "\f288"; } +.bi-circle-square::before { content: "\f289"; } +.bi-circle::before { content: "\f28a"; } +.bi-clipboard-check::before { content: "\f28b"; } +.bi-clipboard-data::before { content: "\f28c"; } +.bi-clipboard-minus::before { content: "\f28d"; } +.bi-clipboard-plus::before { content: "\f28e"; } +.bi-clipboard-x::before { content: "\f28f"; } +.bi-clipboard::before { content: "\f290"; } +.bi-clock-fill::before { content: "\f291"; } +.bi-clock-history::before { content: "\f292"; } +.bi-clock::before { content: "\f293"; } +.bi-cloud-arrow-down-fill::before { content: "\f294"; } +.bi-cloud-arrow-down::before { content: "\f295"; } +.bi-cloud-arrow-up-fill::before { content: "\f296"; } +.bi-cloud-arrow-up::before { content: "\f297"; } +.bi-cloud-check-fill::before { content: "\f298"; } +.bi-cloud-check::before { content: "\f299"; } +.bi-cloud-download-fill::before { content: "\f29a"; } +.bi-cloud-download::before { content: "\f29b"; } +.bi-cloud-drizzle-fill::before { content: "\f29c"; } +.bi-cloud-drizzle::before { content: "\f29d"; } +.bi-cloud-fill::before { content: "\f29e"; } +.bi-cloud-fog-fill::before { content: "\f29f"; } +.bi-cloud-fog::before { content: "\f2a0"; } +.bi-cloud-fog2-fill::before { content: "\f2a1"; } +.bi-cloud-fog2::before { content: "\f2a2"; } +.bi-cloud-hail-fill::before { content: "\f2a3"; } +.bi-cloud-hail::before { content: "\f2a4"; } +.bi-cloud-haze-1::before { content: "\f2a5"; } +.bi-cloud-haze-fill::before { content: "\f2a6"; } +.bi-cloud-haze::before { content: "\f2a7"; } +.bi-cloud-haze2-fill::before { content: "\f2a8"; } +.bi-cloud-lightning-fill::before { content: "\f2a9"; } +.bi-cloud-lightning-rain-fill::before { content: "\f2aa"; } +.bi-cloud-lightning-rain::before { content: "\f2ab"; } +.bi-cloud-lightning::before { content: "\f2ac"; } +.bi-cloud-minus-fill::before { content: "\f2ad"; } +.bi-cloud-minus::before { content: "\f2ae"; } +.bi-cloud-moon-fill::before { content: "\f2af"; } +.bi-cloud-moon::before { content: "\f2b0"; } +.bi-cloud-plus-fill::before { content: "\f2b1"; } +.bi-cloud-plus::before { content: "\f2b2"; } +.bi-cloud-rain-fill::before { content: "\f2b3"; } +.bi-cloud-rain-heavy-fill::before { content: "\f2b4"; } +.bi-cloud-rain-heavy::before { content: "\f2b5"; } +.bi-cloud-rain::before { content: "\f2b6"; } +.bi-cloud-slash-fill::before { content: "\f2b7"; } +.bi-cloud-slash::before { content: "\f2b8"; } +.bi-cloud-sleet-fill::before { content: "\f2b9"; } +.bi-cloud-sleet::before { content: "\f2ba"; } +.bi-cloud-snow-fill::before { content: "\f2bb"; } +.bi-cloud-snow::before { content: "\f2bc"; } +.bi-cloud-sun-fill::before { content: "\f2bd"; } +.bi-cloud-sun::before { content: "\f2be"; } +.bi-cloud-upload-fill::before { content: "\f2bf"; } +.bi-cloud-upload::before { content: "\f2c0"; } +.bi-cloud::before { content: "\f2c1"; } +.bi-clouds-fill::before { content: "\f2c2"; } +.bi-clouds::before { content: "\f2c3"; } +.bi-cloudy-fill::before { content: "\f2c4"; } +.bi-cloudy::before { content: "\f2c5"; } +.bi-code-slash::before { content: "\f2c6"; } +.bi-code-square::before { content: "\f2c7"; } +.bi-code::before { content: "\f2c8"; } +.bi-collection-fill::before { content: "\f2c9"; } +.bi-collection-play-fill::before { content: "\f2ca"; } +.bi-collection-play::before { content: "\f2cb"; } +.bi-collection::before { content: "\f2cc"; } +.bi-columns-gap::before { content: "\f2cd"; } +.bi-columns::before { content: "\f2ce"; } +.bi-command::before { content: "\f2cf"; } +.bi-compass-fill::before { content: "\f2d0"; } +.bi-compass::before { content: "\f2d1"; } +.bi-cone-striped::before { content: "\f2d2"; } +.bi-cone::before { content: "\f2d3"; } +.bi-controller::before { content: "\f2d4"; } +.bi-cpu-fill::before { content: "\f2d5"; } +.bi-cpu::before { content: "\f2d6"; } +.bi-credit-card-2-back-fill::before { content: "\f2d7"; } +.bi-credit-card-2-back::before { content: "\f2d8"; } +.bi-credit-card-2-front-fill::before { content: "\f2d9"; } +.bi-credit-card-2-front::before { content: "\f2da"; } +.bi-credit-card-fill::before { content: "\f2db"; } +.bi-credit-card::before { content: "\f2dc"; } +.bi-crop::before { content: "\f2dd"; } +.bi-cup-fill::before { content: "\f2de"; } +.bi-cup-straw::before { content: "\f2df"; } +.bi-cup::before { content: "\f2e0"; } +.bi-cursor-fill::before { content: "\f2e1"; } +.bi-cursor-text::before { content: "\f2e2"; } +.bi-cursor::before { content: "\f2e3"; } +.bi-dash-circle-dotted::before { content: "\f2e4"; } +.bi-dash-circle-fill::before { content: "\f2e5"; } +.bi-dash-circle::before { content: "\f2e6"; } +.bi-dash-square-dotted::before { content: "\f2e7"; } +.bi-dash-square-fill::before { content: "\f2e8"; } +.bi-dash-square::before { content: "\f2e9"; } +.bi-dash::before { content: "\f2ea"; } +.bi-diagram-2-fill::before { content: "\f2eb"; } +.bi-diagram-2::before { content: "\f2ec"; } +.bi-diagram-3-fill::before { content: "\f2ed"; } +.bi-diagram-3::before { content: "\f2ee"; } +.bi-diamond-fill::before { content: "\f2ef"; } +.bi-diamond-half::before { content: "\f2f0"; } +.bi-diamond::before { content: "\f2f1"; } +.bi-dice-1-fill::before { content: "\f2f2"; } +.bi-dice-1::before { content: "\f2f3"; } +.bi-dice-2-fill::before { content: "\f2f4"; } +.bi-dice-2::before { content: "\f2f5"; } +.bi-dice-3-fill::before { content: "\f2f6"; } +.bi-dice-3::before { content: "\f2f7"; } +.bi-dice-4-fill::before { content: "\f2f8"; } +.bi-dice-4::before { content: "\f2f9"; } +.bi-dice-5-fill::before { content: "\f2fa"; } +.bi-dice-5::before { content: "\f2fb"; } +.bi-dice-6-fill::before { content: "\f2fc"; } +.bi-dice-6::before { content: "\f2fd"; } +.bi-disc-fill::before { content: "\f2fe"; } +.bi-disc::before { content: "\f2ff"; } +.bi-discord::before { content: "\f300"; } +.bi-display-fill::before { content: "\f301"; } +.bi-display::before { content: "\f302"; } +.bi-distribute-horizontal::before { content: "\f303"; } +.bi-distribute-vertical::before { content: "\f304"; } +.bi-door-closed-fill::before { content: "\f305"; } +.bi-door-closed::before { content: "\f306"; } +.bi-door-open-fill::before { content: "\f307"; } +.bi-door-open::before { content: "\f308"; } +.bi-dot::before { content: "\f309"; } +.bi-download::before { content: "\f30a"; } +.bi-droplet-fill::before { content: "\f30b"; } +.bi-droplet-half::before { content: "\f30c"; } +.bi-droplet::before { content: "\f30d"; } +.bi-earbuds::before { content: "\f30e"; } +.bi-easel-fill::before { content: "\f30f"; } +.bi-easel::before { content: "\f310"; } +.bi-egg-fill::before { content: "\f311"; } +.bi-egg-fried::before { content: "\f312"; } +.bi-egg::before { content: "\f313"; } +.bi-eject-fill::before { content: "\f314"; } +.bi-eject::before { content: "\f315"; } +.bi-emoji-angry-fill::before { content: "\f316"; } +.bi-emoji-angry::before { content: "\f317"; } +.bi-emoji-dizzy-fill::before { content: "\f318"; } +.bi-emoji-dizzy::before { content: "\f319"; } +.bi-emoji-expressionless-fill::before { content: "\f31a"; } +.bi-emoji-expressionless::before { content: "\f31b"; } +.bi-emoji-frown-fill::before { content: "\f31c"; } +.bi-emoji-frown::before { content: "\f31d"; } +.bi-emoji-heart-eyes-fill::before { content: "\f31e"; } +.bi-emoji-heart-eyes::before { content: "\f31f"; } +.bi-emoji-laughing-fill::before { content: "\f320"; } +.bi-emoji-laughing::before { content: "\f321"; } +.bi-emoji-neutral-fill::before { content: "\f322"; } +.bi-emoji-neutral::before { content: "\f323"; } +.bi-emoji-smile-fill::before { content: "\f324"; } +.bi-emoji-smile-upside-down-fill::before { content: "\f325"; } +.bi-emoji-smile-upside-down::before { content: "\f326"; } +.bi-emoji-smile::before { content: "\f327"; } +.bi-emoji-sunglasses-fill::before { content: "\f328"; } +.bi-emoji-sunglasses::before { content: "\f329"; } +.bi-emoji-wink-fill::before { content: "\f32a"; } +.bi-emoji-wink::before { content: "\f32b"; } +.bi-envelope-fill::before { content: "\f32c"; } +.bi-envelope-open-fill::before { content: "\f32d"; } +.bi-envelope-open::before { content: "\f32e"; } +.bi-envelope::before { content: "\f32f"; } +.bi-eraser-fill::before { content: "\f330"; } +.bi-eraser::before { content: "\f331"; } +.bi-exclamation-circle-fill::before { content: "\f332"; } +.bi-exclamation-circle::before { content: "\f333"; } +.bi-exclamation-diamond-fill::before { content: "\f334"; } +.bi-exclamation-diamond::before { content: "\f335"; } +.bi-exclamation-octagon-fill::before { content: "\f336"; } +.bi-exclamation-octagon::before { content: "\f337"; } +.bi-exclamation-square-fill::before { content: "\f338"; } +.bi-exclamation-square::before { content: "\f339"; } +.bi-exclamation-triangle-fill::before { content: "\f33a"; } +.bi-exclamation-triangle::before { content: "\f33b"; } +.bi-exclamation::before { content: "\f33c"; } +.bi-exclude::before { content: "\f33d"; } +.bi-eye-fill::before { content: "\f33e"; } +.bi-eye-slash-fill::before { content: "\f33f"; } +.bi-eye-slash::before { content: "\f340"; } +.bi-eye::before { content: "\f341"; } +.bi-eyedropper::before { content: "\f342"; } +.bi-eyeglasses::before { content: "\f343"; } +.bi-facebook::before { content: "\f344"; } +.bi-file-arrow-down-fill::before { content: "\f345"; } +.bi-file-arrow-down::before { content: "\f346"; } +.bi-file-arrow-up-fill::before { content: "\f347"; } +.bi-file-arrow-up::before { content: "\f348"; } +.bi-file-bar-graph-fill::before { content: "\f349"; } +.bi-file-bar-graph::before { content: "\f34a"; } +.bi-file-binary-fill::before { content: "\f34b"; } +.bi-file-binary::before { content: "\f34c"; } +.bi-file-break-fill::before { content: "\f34d"; } +.bi-file-break::before { content: "\f34e"; } +.bi-file-check-fill::before { content: "\f34f"; } +.bi-file-check::before { content: "\f350"; } +.bi-file-code-fill::before { content: "\f351"; } +.bi-file-code::before { content: "\f352"; } +.bi-file-diff-fill::before { content: "\f353"; } +.bi-file-diff::before { content: "\f354"; } +.bi-file-earmark-arrow-down-fill::before { content: "\f355"; } +.bi-file-earmark-arrow-down::before { content: "\f356"; } +.bi-file-earmark-arrow-up-fill::before { content: "\f357"; } +.bi-file-earmark-arrow-up::before { content: "\f358"; } +.bi-file-earmark-bar-graph-fill::before { content: "\f359"; } +.bi-file-earmark-bar-graph::before { content: "\f35a"; } +.bi-file-earmark-binary-fill::before { content: "\f35b"; } +.bi-file-earmark-binary::before { content: "\f35c"; } +.bi-file-earmark-break-fill::before { content: "\f35d"; } +.bi-file-earmark-break::before { content: "\f35e"; } +.bi-file-earmark-check-fill::before { content: "\f35f"; } +.bi-file-earmark-check::before { content: "\f360"; } +.bi-file-earmark-code-fill::before { content: "\f361"; } +.bi-file-earmark-code::before { content: "\f362"; } +.bi-file-earmark-diff-fill::before { content: "\f363"; } +.bi-file-earmark-diff::before { content: "\f364"; } +.bi-file-earmark-easel-fill::before { content: "\f365"; } +.bi-file-earmark-easel::before { content: "\f366"; } +.bi-file-earmark-excel-fill::before { content: "\f367"; } +.bi-file-earmark-excel::before { content: "\f368"; } +.bi-file-earmark-fill::before { content: "\f369"; } +.bi-file-earmark-font-fill::before { content: "\f36a"; } +.bi-file-earmark-font::before { content: "\f36b"; } +.bi-file-earmark-image-fill::before { content: "\f36c"; } +.bi-file-earmark-image::before { content: "\f36d"; } +.bi-file-earmark-lock-fill::before { content: "\f36e"; } +.bi-file-earmark-lock::before { content: "\f36f"; } +.bi-file-earmark-lock2-fill::before { content: "\f370"; } +.bi-file-earmark-lock2::before { content: "\f371"; } +.bi-file-earmark-medical-fill::before { content: "\f372"; } +.bi-file-earmark-medical::before { content: "\f373"; } +.bi-file-earmark-minus-fill::before { content: "\f374"; } +.bi-file-earmark-minus::before { content: "\f375"; } +.bi-file-earmark-music-fill::before { content: "\f376"; } +.bi-file-earmark-music::before { content: "\f377"; } +.bi-file-earmark-person-fill::before { content: "\f378"; } +.bi-file-earmark-person::before { content: "\f379"; } +.bi-file-earmark-play-fill::before { content: "\f37a"; } +.bi-file-earmark-play::before { content: "\f37b"; } +.bi-file-earmark-plus-fill::before { content: "\f37c"; } +.bi-file-earmark-plus::before { content: "\f37d"; } +.bi-file-earmark-post-fill::before { content: "\f37e"; } +.bi-file-earmark-post::before { content: "\f37f"; } +.bi-file-earmark-ppt-fill::before { content: "\f380"; } +.bi-file-earmark-ppt::before { content: "\f381"; } +.bi-file-earmark-richtext-fill::before { content: "\f382"; } +.bi-file-earmark-richtext::before { content: "\f383"; } +.bi-file-earmark-ruled-fill::before { content: "\f384"; } +.bi-file-earmark-ruled::before { content: "\f385"; } +.bi-file-earmark-slides-fill::before { content: "\f386"; } +.bi-file-earmark-slides::before { content: "\f387"; } +.bi-file-earmark-spreadsheet-fill::before { content: "\f388"; } +.bi-file-earmark-spreadsheet::before { content: "\f389"; } +.bi-file-earmark-text-fill::before { content: "\f38a"; } +.bi-file-earmark-text::before { content: "\f38b"; } +.bi-file-earmark-word-fill::before { content: "\f38c"; } +.bi-file-earmark-word::before { content: "\f38d"; } +.bi-file-earmark-x-fill::before { content: "\f38e"; } +.bi-file-earmark-x::before { content: "\f38f"; } +.bi-file-earmark-zip-fill::before { content: "\f390"; } +.bi-file-earmark-zip::before { content: "\f391"; } +.bi-file-earmark::before { content: "\f392"; } +.bi-file-easel-fill::before { content: "\f393"; } +.bi-file-easel::before { content: "\f394"; } +.bi-file-excel-fill::before { content: "\f395"; } +.bi-file-excel::before { content: "\f396"; } +.bi-file-fill::before { content: "\f397"; } +.bi-file-font-fill::before { content: "\f398"; } +.bi-file-font::before { content: "\f399"; } +.bi-file-image-fill::before { content: "\f39a"; } +.bi-file-image::before { content: "\f39b"; } +.bi-file-lock-fill::before { content: "\f39c"; } +.bi-file-lock::before { content: "\f39d"; } +.bi-file-lock2-fill::before { content: "\f39e"; } +.bi-file-lock2::before { content: "\f39f"; } +.bi-file-medical-fill::before { content: "\f3a0"; } +.bi-file-medical::before { content: "\f3a1"; } +.bi-file-minus-fill::before { content: "\f3a2"; } +.bi-file-minus::before { content: "\f3a3"; } +.bi-file-music-fill::before { content: "\f3a4"; } +.bi-file-music::before { content: "\f3a5"; } +.bi-file-person-fill::before { content: "\f3a6"; } +.bi-file-person::before { content: "\f3a7"; } +.bi-file-play-fill::before { content: "\f3a8"; } +.bi-file-play::before { content: "\f3a9"; } +.bi-file-plus-fill::before { content: "\f3aa"; } +.bi-file-plus::before { content: "\f3ab"; } +.bi-file-post-fill::before { content: "\f3ac"; } +.bi-file-post::before { content: "\f3ad"; } +.bi-file-ppt-fill::before { content: "\f3ae"; } +.bi-file-ppt::before { content: "\f3af"; } +.bi-file-richtext-fill::before { content: "\f3b0"; } +.bi-file-richtext::before { content: "\f3b1"; } +.bi-file-ruled-fill::before { content: "\f3b2"; } +.bi-file-ruled::before { content: "\f3b3"; } +.bi-file-slides-fill::before { content: "\f3b4"; } +.bi-file-slides::before { content: "\f3b5"; } +.bi-file-spreadsheet-fill::before { content: "\f3b6"; } +.bi-file-spreadsheet::before { content: "\f3b7"; } +.bi-file-text-fill::before { content: "\f3b8"; } +.bi-file-text::before { content: "\f3b9"; } +.bi-file-word-fill::before { content: "\f3ba"; } +.bi-file-word::before { content: "\f3bb"; } +.bi-file-x-fill::before { content: "\f3bc"; } +.bi-file-x::before { content: "\f3bd"; } +.bi-file-zip-fill::before { content: "\f3be"; } +.bi-file-zip::before { content: "\f3bf"; } +.bi-file::before { content: "\f3c0"; } +.bi-files-alt::before { content: "\f3c1"; } +.bi-files::before { content: "\f3c2"; } +.bi-film::before { content: "\f3c3"; } +.bi-filter-circle-fill::before { content: "\f3c4"; } +.bi-filter-circle::before { content: "\f3c5"; } +.bi-filter-left::before { content: "\f3c6"; } +.bi-filter-right::before { content: "\f3c7"; } +.bi-filter-square-fill::before { content: "\f3c8"; } +.bi-filter-square::before { content: "\f3c9"; } +.bi-filter::before { content: "\f3ca"; } +.bi-flag-fill::before { content: "\f3cb"; } +.bi-flag::before { content: "\f3cc"; } +.bi-flower1::before { content: "\f3cd"; } +.bi-flower2::before { content: "\f3ce"; } +.bi-flower3::before { content: "\f3cf"; } +.bi-folder-check::before { content: "\f3d0"; } +.bi-folder-fill::before { content: "\f3d1"; } +.bi-folder-minus::before { content: "\f3d2"; } +.bi-folder-plus::before { content: "\f3d3"; } +.bi-folder-symlink-fill::before { content: "\f3d4"; } +.bi-folder-symlink::before { content: "\f3d5"; } +.bi-folder-x::before { content: "\f3d6"; } +.bi-folder::before { content: "\f3d7"; } +.bi-folder2-open::before { content: "\f3d8"; } +.bi-folder2::before { content: "\f3d9"; } +.bi-fonts::before { content: "\f3da"; } +.bi-forward-fill::before { content: "\f3db"; } +.bi-forward::before { content: "\f3dc"; } +.bi-front::before { content: "\f3dd"; } +.bi-fullscreen-exit::before { content: "\f3de"; } +.bi-fullscreen::before { content: "\f3df"; } +.bi-funnel-fill::before { content: "\f3e0"; } +.bi-funnel::before { content: "\f3e1"; } +.bi-gear-fill::before { content: "\f3e2"; } +.bi-gear-wide-connected::before { content: "\f3e3"; } +.bi-gear-wide::before { content: "\f3e4"; } +.bi-gear::before { content: "\f3e5"; } +.bi-gem::before { content: "\f3e6"; } +.bi-geo-alt-fill::before { content: "\f3e7"; } +.bi-geo-alt::before { content: "\f3e8"; } +.bi-geo-fill::before { content: "\f3e9"; } +.bi-geo::before { content: "\f3ea"; } +.bi-gift-fill::before { content: "\f3eb"; } +.bi-gift::before { content: "\f3ec"; } +.bi-github::before { content: "\f3ed"; } +.bi-globe::before { content: "\f3ee"; } +.bi-globe2::before { content: "\f3ef"; } +.bi-google::before { content: "\f3f0"; } +.bi-graph-down::before { content: "\f3f1"; } +.bi-graph-up::before { content: "\f3f2"; } +.bi-grid-1x2-fill::before { content: "\f3f3"; } +.bi-grid-1x2::before { content: "\f3f4"; } +.bi-grid-3x2-gap-fill::before { content: "\f3f5"; } +.bi-grid-3x2-gap::before { content: "\f3f6"; } +.bi-grid-3x2::before { content: "\f3f7"; } +.bi-grid-3x3-gap-fill::before { content: "\f3f8"; } +.bi-grid-3x3-gap::before { content: "\f3f9"; } +.bi-grid-3x3::before { content: "\f3fa"; } +.bi-grid-fill::before { content: "\f3fb"; } +.bi-grid::before { content: "\f3fc"; } +.bi-grip-horizontal::before { content: "\f3fd"; } +.bi-grip-vertical::before { content: "\f3fe"; } +.bi-hammer::before { content: "\f3ff"; } +.bi-hand-index-fill::before { content: "\f400"; } +.bi-hand-index-thumb-fill::before { content: "\f401"; } +.bi-hand-index-thumb::before { content: "\f402"; } +.bi-hand-index::before { content: "\f403"; } +.bi-hand-thumbs-down-fill::before { content: "\f404"; } +.bi-hand-thumbs-down::before { content: "\f405"; } +.bi-hand-thumbs-up-fill::before { content: "\f406"; } +.bi-hand-thumbs-up::before { content: "\f407"; } +.bi-handbag-fill::before { content: "\f408"; } +.bi-handbag::before { content: "\f409"; } +.bi-hash::before { content: "\f40a"; } +.bi-hdd-fill::before { content: "\f40b"; } +.bi-hdd-network-fill::before { content: "\f40c"; } +.bi-hdd-network::before { content: "\f40d"; } +.bi-hdd-rack-fill::before { content: "\f40e"; } +.bi-hdd-rack::before { content: "\f40f"; } +.bi-hdd-stack-fill::before { content: "\f410"; } +.bi-hdd-stack::before { content: "\f411"; } +.bi-hdd::before { content: "\f412"; } +.bi-headphones::before { content: "\f413"; } +.bi-headset::before { content: "\f414"; } +.bi-heart-fill::before { content: "\f415"; } +.bi-heart-half::before { content: "\f416"; } +.bi-heart::before { content: "\f417"; } +.bi-heptagon-fill::before { content: "\f418"; } +.bi-heptagon-half::before { content: "\f419"; } +.bi-heptagon::before { content: "\f41a"; } +.bi-hexagon-fill::before { content: "\f41b"; } +.bi-hexagon-half::before { content: "\f41c"; } +.bi-hexagon::before { content: "\f41d"; } +.bi-hourglass-bottom::before { content: "\f41e"; } +.bi-hourglass-split::before { content: "\f41f"; } +.bi-hourglass-top::before { content: "\f420"; } +.bi-hourglass::before { content: "\f421"; } +.bi-house-door-fill::before { content: "\f422"; } +.bi-house-door::before { content: "\f423"; } +.bi-house-fill::before { content: "\f424"; } +.bi-house::before { content: "\f425"; } +.bi-hr::before { content: "\f426"; } +.bi-hurricane::before { content: "\f427"; } +.bi-image-alt::before { content: "\f428"; } +.bi-image-fill::before { content: "\f429"; } +.bi-image::before { content: "\f42a"; } +.bi-images::before { content: "\f42b"; } +.bi-inbox-fill::before { content: "\f42c"; } +.bi-inbox::before { content: "\f42d"; } +.bi-inboxes-fill::before { content: "\f42e"; } +.bi-inboxes::before { content: "\f42f"; } +.bi-info-circle-fill::before { content: "\f430"; } +.bi-info-circle::before { content: "\f431"; } +.bi-info-square-fill::before { content: "\f432"; } +.bi-info-square::before { content: "\f433"; } +.bi-info::before { content: "\f434"; } +.bi-input-cursor-text::before { content: "\f435"; } +.bi-input-cursor::before { content: "\f436"; } +.bi-instagram::before { content: "\f437"; } +.bi-intersect::before { content: "\f438"; } +.bi-journal-album::before { content: "\f439"; } +.bi-journal-arrow-down::before { content: "\f43a"; } +.bi-journal-arrow-up::before { content: "\f43b"; } +.bi-journal-bookmark-fill::before { content: "\f43c"; } +.bi-journal-bookmark::before { content: "\f43d"; } +.bi-journal-check::before { content: "\f43e"; } +.bi-journal-code::before { content: "\f43f"; } +.bi-journal-medical::before { content: "\f440"; } +.bi-journal-minus::before { content: "\f441"; } +.bi-journal-plus::before { content: "\f442"; } +.bi-journal-richtext::before { content: "\f443"; } +.bi-journal-text::before { content: "\f444"; } +.bi-journal-x::before { content: "\f445"; } +.bi-journal::before { content: "\f446"; } +.bi-journals::before { content: "\f447"; } +.bi-joystick::before { content: "\f448"; } +.bi-justify-left::before { content: "\f449"; } +.bi-justify-right::before { content: "\f44a"; } +.bi-justify::before { content: "\f44b"; } +.bi-kanban-fill::before { content: "\f44c"; } +.bi-kanban::before { content: "\f44d"; } +.bi-key-fill::before { content: "\f44e"; } +.bi-key::before { content: "\f44f"; } +.bi-keyboard-fill::before { content: "\f450"; } +.bi-keyboard::before { content: "\f451"; } +.bi-ladder::before { content: "\f452"; } +.bi-lamp-fill::before { content: "\f453"; } +.bi-lamp::before { content: "\f454"; } +.bi-laptop-fill::before { content: "\f455"; } +.bi-laptop::before { content: "\f456"; } +.bi-layer-backward::before { content: "\f457"; } +.bi-layer-forward::before { content: "\f458"; } +.bi-layers-fill::before { content: "\f459"; } +.bi-layers-half::before { content: "\f45a"; } +.bi-layers::before { content: "\f45b"; } +.bi-layout-sidebar-inset-reverse::before { content: "\f45c"; } +.bi-layout-sidebar-inset::before { content: "\f45d"; } +.bi-layout-sidebar-reverse::before { content: "\f45e"; } +.bi-layout-sidebar::before { content: "\f45f"; } +.bi-layout-split::before { content: "\f460"; } +.bi-layout-text-sidebar-reverse::before { content: "\f461"; } +.bi-layout-text-sidebar::before { content: "\f462"; } +.bi-layout-text-window-reverse::before { content: "\f463"; } +.bi-layout-text-window::before { content: "\f464"; } +.bi-layout-three-columns::before { content: "\f465"; } +.bi-layout-wtf::before { content: "\f466"; } +.bi-life-preserver::before { content: "\f467"; } +.bi-lightbulb-fill::before { content: "\f468"; } +.bi-lightbulb-off-fill::before { content: "\f469"; } +.bi-lightbulb-off::before { content: "\f46a"; } +.bi-lightbulb::before { content: "\f46b"; } +.bi-lightning-charge-fill::before { content: "\f46c"; } +.bi-lightning-charge::before { content: "\f46d"; } +.bi-lightning-fill::before { content: "\f46e"; } +.bi-lightning::before { content: "\f46f"; } +.bi-link-45deg::before { content: "\f470"; } +.bi-link::before { content: "\f471"; } +.bi-linkedin::before { content: "\f472"; } +.bi-list-check::before { content: "\f473"; } +.bi-list-nested::before { content: "\f474"; } +.bi-list-ol::before { content: "\f475"; } +.bi-list-stars::before { content: "\f476"; } +.bi-list-task::before { content: "\f477"; } +.bi-list-ul::before { content: "\f478"; } +.bi-list::before { content: "\f479"; } +.bi-lock-fill::before { content: "\f47a"; } +.bi-lock::before { content: "\f47b"; } +.bi-mailbox::before { content: "\f47c"; } +.bi-mailbox2::before { content: "\f47d"; } +.bi-map-fill::before { content: "\f47e"; } +.bi-map::before { content: "\f47f"; } +.bi-markdown-fill::before { content: "\f480"; } +.bi-markdown::before { content: "\f481"; } +.bi-mask::before { content: "\f482"; } +.bi-megaphone-fill::before { content: "\f483"; } +.bi-megaphone::before { content: "\f484"; } +.bi-menu-app-fill::before { content: "\f485"; } +.bi-menu-app::before { content: "\f486"; } +.bi-menu-button-fill::before { content: "\f487"; } +.bi-menu-button-wide-fill::before { content: "\f488"; } +.bi-menu-button-wide::before { content: "\f489"; } +.bi-menu-button::before { content: "\f48a"; } +.bi-menu-down::before { content: "\f48b"; } +.bi-menu-up::before { content: "\f48c"; } +.bi-mic-fill::before { content: "\f48d"; } +.bi-mic-mute-fill::before { content: "\f48e"; } +.bi-mic-mute::before { content: "\f48f"; } +.bi-mic::before { content: "\f490"; } +.bi-minecart-loaded::before { content: "\f491"; } +.bi-minecart::before { content: "\f492"; } +.bi-moisture::before { content: "\f493"; } +.bi-moon-fill::before { content: "\f494"; } +.bi-moon-stars-fill::before { content: "\f495"; } +.bi-moon-stars::before { content: "\f496"; } +.bi-moon::before { content: "\f497"; } +.bi-mouse-fill::before { content: "\f498"; } +.bi-mouse::before { content: "\f499"; } +.bi-mouse2-fill::before { content: "\f49a"; } +.bi-mouse2::before { content: "\f49b"; } +.bi-mouse3-fill::before { content: "\f49c"; } +.bi-mouse3::before { content: "\f49d"; } +.bi-music-note-beamed::before { content: "\f49e"; } +.bi-music-note-list::before { content: "\f49f"; } +.bi-music-note::before { content: "\f4a0"; } +.bi-music-player-fill::before { content: "\f4a1"; } +.bi-music-player::before { content: "\f4a2"; } +.bi-newspaper::before { content: "\f4a3"; } +.bi-node-minus-fill::before { content: "\f4a4"; } +.bi-node-minus::before { content: "\f4a5"; } +.bi-node-plus-fill::before { content: "\f4a6"; } +.bi-node-plus::before { content: "\f4a7"; } +.bi-nut-fill::before { content: "\f4a8"; } +.bi-nut::before { content: "\f4a9"; } +.bi-octagon-fill::before { content: "\f4aa"; } +.bi-octagon-half::before { content: "\f4ab"; } +.bi-octagon::before { content: "\f4ac"; } +.bi-option::before { content: "\f4ad"; } +.bi-outlet::before { content: "\f4ae"; } +.bi-paint-bucket::before { content: "\f4af"; } +.bi-palette-fill::before { content: "\f4b0"; } +.bi-palette::before { content: "\f4b1"; } +.bi-palette2::before { content: "\f4b2"; } +.bi-paperclip::before { content: "\f4b3"; } +.bi-paragraph::before { content: "\f4b4"; } +.bi-patch-check-fill::before { content: "\f4b5"; } +.bi-patch-check::before { content: "\f4b6"; } +.bi-patch-exclamation-fill::before { content: "\f4b7"; } +.bi-patch-exclamation::before { content: "\f4b8"; } +.bi-patch-minus-fill::before { content: "\f4b9"; } +.bi-patch-minus::before { content: "\f4ba"; } +.bi-patch-plus-fill::before { content: "\f4bb"; } +.bi-patch-plus::before { content: "\f4bc"; } +.bi-patch-question-fill::before { content: "\f4bd"; } +.bi-patch-question::before { content: "\f4be"; } +.bi-pause-btn-fill::before { content: "\f4bf"; } +.bi-pause-btn::before { content: "\f4c0"; } +.bi-pause-circle-fill::before { content: "\f4c1"; } +.bi-pause-circle::before { content: "\f4c2"; } +.bi-pause-fill::before { content: "\f4c3"; } +.bi-pause::before { content: "\f4c4"; } +.bi-peace-fill::before { content: "\f4c5"; } +.bi-peace::before { content: "\f4c6"; } +.bi-pen-fill::before { content: "\f4c7"; } +.bi-pen::before { content: "\f4c8"; } +.bi-pencil-fill::before { content: "\f4c9"; } +.bi-pencil-square::before { content: "\f4ca"; } +.bi-pencil::before { content: "\f4cb"; } +.bi-pentagon-fill::before { content: "\f4cc"; } +.bi-pentagon-half::before { content: "\f4cd"; } +.bi-pentagon::before { content: "\f4ce"; } +.bi-people-fill::before { content: "\f4cf"; } +.bi-people::before { content: "\f4d0"; } +.bi-percent::before { content: "\f4d1"; } +.bi-person-badge-fill::before { content: "\f4d2"; } +.bi-person-badge::before { content: "\f4d3"; } +.bi-person-bounding-box::before { content: "\f4d4"; } +.bi-person-check-fill::before { content: "\f4d5"; } +.bi-person-check::before { content: "\f4d6"; } +.bi-person-circle::before { content: "\f4d7"; } +.bi-person-dash-fill::before { content: "\f4d8"; } +.bi-person-dash::before { content: "\f4d9"; } +.bi-person-fill::before { content: "\f4da"; } +.bi-person-lines-fill::before { content: "\f4db"; } +.bi-person-plus-fill::before { content: "\f4dc"; } +.bi-person-plus::before { content: "\f4dd"; } +.bi-person-square::before { content: "\f4de"; } +.bi-person-x-fill::before { content: "\f4df"; } +.bi-person-x::before { content: "\f4e0"; } +.bi-person::before { content: "\f4e1"; } +.bi-phone-fill::before { content: "\f4e2"; } +.bi-phone-landscape-fill::before { content: "\f4e3"; } +.bi-phone-landscape::before { content: "\f4e4"; } +.bi-phone-vibrate-fill::before { content: "\f4e5"; } +.bi-phone-vibrate::before { content: "\f4e6"; } +.bi-phone::before { content: "\f4e7"; } +.bi-pie-chart-fill::before { content: "\f4e8"; } +.bi-pie-chart::before { content: "\f4e9"; } +.bi-pin-angle-fill::before { content: "\f4ea"; } +.bi-pin-angle::before { content: "\f4eb"; } +.bi-pin-fill::before { content: "\f4ec"; } +.bi-pin::before { content: "\f4ed"; } +.bi-pip-fill::before { content: "\f4ee"; } +.bi-pip::before { content: "\f4ef"; } +.bi-play-btn-fill::before { content: "\f4f0"; } +.bi-play-btn::before { content: "\f4f1"; } +.bi-play-circle-fill::before { content: "\f4f2"; } +.bi-play-circle::before { content: "\f4f3"; } +.bi-play-fill::before { content: "\f4f4"; } +.bi-play::before { content: "\f4f5"; } +.bi-plug-fill::before { content: "\f4f6"; } +.bi-plug::before { content: "\f4f7"; } +.bi-plus-circle-dotted::before { content: "\f4f8"; } +.bi-plus-circle-fill::before { content: "\f4f9"; } +.bi-plus-circle::before { content: "\f4fa"; } +.bi-plus-square-dotted::before { content: "\f4fb"; } +.bi-plus-square-fill::before { content: "\f4fc"; } +.bi-plus-square::before { content: "\f4fd"; } +.bi-plus::before { content: "\f4fe"; } +.bi-power::before { content: "\f4ff"; } +.bi-printer-fill::before { content: "\f500"; } +.bi-printer::before { content: "\f501"; } +.bi-puzzle-fill::before { content: "\f502"; } +.bi-puzzle::before { content: "\f503"; } +.bi-question-circle-fill::before { content: "\f504"; } +.bi-question-circle::before { content: "\f505"; } +.bi-question-diamond-fill::before { content: "\f506"; } +.bi-question-diamond::before { content: "\f507"; } +.bi-question-octagon-fill::before { content: "\f508"; } +.bi-question-octagon::before { content: "\f509"; } +.bi-question-square-fill::before { content: "\f50a"; } +.bi-question-square::before { content: "\f50b"; } +.bi-question::before { content: "\f50c"; } +.bi-rainbow::before { content: "\f50d"; } +.bi-receipt-cutoff::before { content: "\f50e"; } +.bi-receipt::before { content: "\f50f"; } +.bi-reception-0::before { content: "\f510"; } +.bi-reception-1::before { content: "\f511"; } +.bi-reception-2::before { content: "\f512"; } +.bi-reception-3::before { content: "\f513"; } +.bi-reception-4::before { content: "\f514"; } +.bi-record-btn-fill::before { content: "\f515"; } +.bi-record-btn::before { content: "\f516"; } +.bi-record-circle-fill::before { content: "\f517"; } +.bi-record-circle::before { content: "\f518"; } +.bi-record-fill::before { content: "\f519"; } +.bi-record::before { content: "\f51a"; } +.bi-record2-fill::before { content: "\f51b"; } +.bi-record2::before { content: "\f51c"; } +.bi-reply-all-fill::before { content: "\f51d"; } +.bi-reply-all::before { content: "\f51e"; } +.bi-reply-fill::before { content: "\f51f"; } +.bi-reply::before { content: "\f520"; } +.bi-rss-fill::before { content: "\f521"; } +.bi-rss::before { content: "\f522"; } +.bi-rulers::before { content: "\f523"; } +.bi-save-fill::before { content: "\f524"; } +.bi-save::before { content: "\f525"; } +.bi-save2-fill::before { content: "\f526"; } +.bi-save2::before { content: "\f527"; } +.bi-scissors::before { content: "\f528"; } +.bi-screwdriver::before { content: "\f529"; } +.bi-search::before { content: "\f52a"; } +.bi-segmented-nav::before { content: "\f52b"; } +.bi-server::before { content: "\f52c"; } +.bi-share-fill::before { content: "\f52d"; } +.bi-share::before { content: "\f52e"; } +.bi-shield-check::before { content: "\f52f"; } +.bi-shield-exclamation::before { content: "\f530"; } +.bi-shield-fill-check::before { content: "\f531"; } +.bi-shield-fill-exclamation::before { content: "\f532"; } +.bi-shield-fill-minus::before { content: "\f533"; } +.bi-shield-fill-plus::before { content: "\f534"; } +.bi-shield-fill-x::before { content: "\f535"; } +.bi-shield-fill::before { content: "\f536"; } +.bi-shield-lock-fill::before { content: "\f537"; } +.bi-shield-lock::before { content: "\f538"; } +.bi-shield-minus::before { content: "\f539"; } +.bi-shield-plus::before { content: "\f53a"; } +.bi-shield-shaded::before { content: "\f53b"; } +.bi-shield-slash-fill::before { content: "\f53c"; } +.bi-shield-slash::before { content: "\f53d"; } +.bi-shield-x::before { content: "\f53e"; } +.bi-shield::before { content: "\f53f"; } +.bi-shift-fill::before { content: "\f540"; } +.bi-shift::before { content: "\f541"; } +.bi-shop-window::before { content: "\f542"; } +.bi-shop::before { content: "\f543"; } +.bi-shuffle::before { content: "\f544"; } +.bi-signpost-2-fill::before { content: "\f545"; } +.bi-signpost-2::before { content: "\f546"; } +.bi-signpost-fill::before { content: "\f547"; } +.bi-signpost-split-fill::before { content: "\f548"; } +.bi-signpost-split::before { content: "\f549"; } +.bi-signpost::before { content: "\f54a"; } +.bi-sim-fill::before { content: "\f54b"; } +.bi-sim::before { content: "\f54c"; } +.bi-skip-backward-btn-fill::before { content: "\f54d"; } +.bi-skip-backward-btn::before { content: "\f54e"; } +.bi-skip-backward-circle-fill::before { content: "\f54f"; } +.bi-skip-backward-circle::before { content: "\f550"; } +.bi-skip-backward-fill::before { content: "\f551"; } +.bi-skip-backward::before { content: "\f552"; } +.bi-skip-end-btn-fill::before { content: "\f553"; } +.bi-skip-end-btn::before { content: "\f554"; } +.bi-skip-end-circle-fill::before { content: "\f555"; } +.bi-skip-end-circle::before { content: "\f556"; } +.bi-skip-end-fill::before { content: "\f557"; } +.bi-skip-end::before { content: "\f558"; } +.bi-skip-forward-btn-fill::before { content: "\f559"; } +.bi-skip-forward-btn::before { content: "\f55a"; } +.bi-skip-forward-circle-fill::before { content: "\f55b"; } +.bi-skip-forward-circle::before { content: "\f55c"; } +.bi-skip-forward-fill::before { content: "\f55d"; } +.bi-skip-forward::before { content: "\f55e"; } +.bi-skip-start-btn-fill::before { content: "\f55f"; } +.bi-skip-start-btn::before { content: "\f560"; } +.bi-skip-start-circle-fill::before { content: "\f561"; } +.bi-skip-start-circle::before { content: "\f562"; } +.bi-skip-start-fill::before { content: "\f563"; } +.bi-skip-start::before { content: "\f564"; } +.bi-slack::before { content: "\f565"; } +.bi-slash-circle-fill::before { content: "\f566"; } +.bi-slash-circle::before { content: "\f567"; } +.bi-slash-square-fill::before { content: "\f568"; } +.bi-slash-square::before { content: "\f569"; } +.bi-slash::before { content: "\f56a"; } +.bi-sliders::before { content: "\f56b"; } +.bi-smartwatch::before { content: "\f56c"; } +.bi-snow::before { content: "\f56d"; } +.bi-snow2::before { content: "\f56e"; } +.bi-snow3::before { content: "\f56f"; } +.bi-sort-alpha-down-alt::before { content: "\f570"; } +.bi-sort-alpha-down::before { content: "\f571"; } +.bi-sort-alpha-up-alt::before { content: "\f572"; } +.bi-sort-alpha-up::before { content: "\f573"; } +.bi-sort-down-alt::before { content: "\f574"; } +.bi-sort-down::before { content: "\f575"; } +.bi-sort-numeric-down-alt::before { content: "\f576"; } +.bi-sort-numeric-down::before { content: "\f577"; } +.bi-sort-numeric-up-alt::before { content: "\f578"; } +.bi-sort-numeric-up::before { content: "\f579"; } +.bi-sort-up-alt::before { content: "\f57a"; } +.bi-sort-up::before { content: "\f57b"; } +.bi-soundwave::before { content: "\f57c"; } +.bi-speaker-fill::before { content: "\f57d"; } +.bi-speaker::before { content: "\f57e"; } +.bi-speedometer::before { content: "\f57f"; } +.bi-speedometer2::before { content: "\f580"; } +.bi-spellcheck::before { content: "\f581"; } +.bi-square-fill::before { content: "\f582"; } +.bi-square-half::before { content: "\f583"; } +.bi-square::before { content: "\f584"; } +.bi-stack::before { content: "\f585"; } +.bi-star-fill::before { content: "\f586"; } +.bi-star-half::before { content: "\f587"; } +.bi-star::before { content: "\f588"; } +.bi-stars::before { content: "\f589"; } +.bi-stickies-fill::before { content: "\f58a"; } +.bi-stickies::before { content: "\f58b"; } +.bi-sticky-fill::before { content: "\f58c"; } +.bi-sticky::before { content: "\f58d"; } +.bi-stop-btn-fill::before { content: "\f58e"; } +.bi-stop-btn::before { content: "\f58f"; } +.bi-stop-circle-fill::before { content: "\f590"; } +.bi-stop-circle::before { content: "\f591"; } +.bi-stop-fill::before { content: "\f592"; } +.bi-stop::before { content: "\f593"; } +.bi-stoplights-fill::before { content: "\f594"; } +.bi-stoplights::before { content: "\f595"; } +.bi-stopwatch-fill::before { content: "\f596"; } +.bi-stopwatch::before { content: "\f597"; } +.bi-subtract::before { content: "\f598"; } +.bi-suit-club-fill::before { content: "\f599"; } +.bi-suit-club::before { content: "\f59a"; } +.bi-suit-diamond-fill::before { content: "\f59b"; } +.bi-suit-diamond::before { content: "\f59c"; } +.bi-suit-heart-fill::before { content: "\f59d"; } +.bi-suit-heart::before { content: "\f59e"; } +.bi-suit-spade-fill::before { content: "\f59f"; } +.bi-suit-spade::before { content: "\f5a0"; } +.bi-sun-fill::before { content: "\f5a1"; } +.bi-sun::before { content: "\f5a2"; } +.bi-sunglasses::before { content: "\f5a3"; } +.bi-sunrise-fill::before { content: "\f5a4"; } +.bi-sunrise::before { content: "\f5a5"; } +.bi-sunset-fill::before { content: "\f5a6"; } +.bi-sunset::before { content: "\f5a7"; } +.bi-symmetry-horizontal::before { content: "\f5a8"; } +.bi-symmetry-vertical::before { content: "\f5a9"; } +.bi-table::before { content: "\f5aa"; } +.bi-tablet-fill::before { content: "\f5ab"; } +.bi-tablet-landscape-fill::before { content: "\f5ac"; } +.bi-tablet-landscape::before { content: "\f5ad"; } +.bi-tablet::before { content: "\f5ae"; } +.bi-tag-fill::before { content: "\f5af"; } +.bi-tag::before { content: "\f5b0"; } +.bi-tags-fill::before { content: "\f5b1"; } +.bi-tags::before { content: "\f5b2"; } +.bi-telegram::before { content: "\f5b3"; } +.bi-telephone-fill::before { content: "\f5b4"; } +.bi-telephone-forward-fill::before { content: "\f5b5"; } +.bi-telephone-forward::before { content: "\f5b6"; } +.bi-telephone-inbound-fill::before { content: "\f5b7"; } +.bi-telephone-inbound::before { content: "\f5b8"; } +.bi-telephone-minus-fill::before { content: "\f5b9"; } +.bi-telephone-minus::before { content: "\f5ba"; } +.bi-telephone-outbound-fill::before { content: "\f5bb"; } +.bi-telephone-outbound::before { content: "\f5bc"; } +.bi-telephone-plus-fill::before { content: "\f5bd"; } +.bi-telephone-plus::before { content: "\f5be"; } +.bi-telephone-x-fill::before { content: "\f5bf"; } +.bi-telephone-x::before { content: "\f5c0"; } +.bi-telephone::before { content: "\f5c1"; } +.bi-terminal-fill::before { content: "\f5c2"; } +.bi-terminal::before { content: "\f5c3"; } +.bi-text-center::before { content: "\f5c4"; } +.bi-text-indent-left::before { content: "\f5c5"; } +.bi-text-indent-right::before { content: "\f5c6"; } +.bi-text-left::before { content: "\f5c7"; } +.bi-text-paragraph::before { content: "\f5c8"; } +.bi-text-right::before { content: "\f5c9"; } +.bi-textarea-resize::before { content: "\f5ca"; } +.bi-textarea-t::before { content: "\f5cb"; } +.bi-textarea::before { content: "\f5cc"; } +.bi-thermometer-half::before { content: "\f5cd"; } +.bi-thermometer-high::before { content: "\f5ce"; } +.bi-thermometer-low::before { content: "\f5cf"; } +.bi-thermometer-snow::before { content: "\f5d0"; } +.bi-thermometer-sun::before { content: "\f5d1"; } +.bi-thermometer::before { content: "\f5d2"; } +.bi-three-dots-vertical::before { content: "\f5d3"; } +.bi-three-dots::before { content: "\f5d4"; } +.bi-toggle-off::before { content: "\f5d5"; } +.bi-toggle-on::before { content: "\f5d6"; } +.bi-toggle2-off::before { content: "\f5d7"; } +.bi-toggle2-on::before { content: "\f5d8"; } +.bi-toggles::before { content: "\f5d9"; } +.bi-toggles2::before { content: "\f5da"; } +.bi-tools::before { content: "\f5db"; } +.bi-tornado::before { content: "\f5dc"; } +.bi-trash-fill::before { content: "\f5dd"; } +.bi-trash::before { content: "\f5de"; } +.bi-trash2-fill::before { content: "\f5df"; } +.bi-trash2::before { content: "\f5e0"; } +.bi-tree-fill::before { content: "\f5e1"; } +.bi-tree::before { content: "\f5e2"; } +.bi-triangle-fill::before { content: "\f5e3"; } +.bi-triangle-half::before { content: "\f5e4"; } +.bi-triangle::before { content: "\f5e5"; } +.bi-trophy-fill::before { content: "\f5e6"; } +.bi-trophy::before { content: "\f5e7"; } +.bi-tropical-storm::before { content: "\f5e8"; } +.bi-truck-flatbed::before { content: "\f5e9"; } +.bi-truck::before { content: "\f5ea"; } +.bi-tsunami::before { content: "\f5eb"; } +.bi-tv-fill::before { content: "\f5ec"; } +.bi-tv::before { content: "\f5ed"; } +.bi-twitch::before { content: "\f5ee"; } +.bi-twitter::before { content: "\f5ef"; } +.bi-type-bold::before { content: "\f5f0"; } +.bi-type-h1::before { content: "\f5f1"; } +.bi-type-h2::before { content: "\f5f2"; } +.bi-type-h3::before { content: "\f5f3"; } +.bi-type-italic::before { content: "\f5f4"; } +.bi-type-strikethrough::before { content: "\f5f5"; } +.bi-type-underline::before { content: "\f5f6"; } +.bi-type::before { content: "\f5f7"; } +.bi-ui-checks-grid::before { content: "\f5f8"; } +.bi-ui-checks::before { content: "\f5f9"; } +.bi-ui-radios-grid::before { content: "\f5fa"; } +.bi-ui-radios::before { content: "\f5fb"; } +.bi-umbrella-fill::before { content: "\f5fc"; } +.bi-umbrella::before { content: "\f5fd"; } +.bi-union::before { content: "\f5fe"; } +.bi-unlock-fill::before { content: "\f5ff"; } +.bi-unlock::before { content: "\f600"; } +.bi-upc-scan::before { content: "\f601"; } +.bi-upc::before { content: "\f602"; } +.bi-upload::before { content: "\f603"; } +.bi-vector-pen::before { content: "\f604"; } +.bi-view-list::before { content: "\f605"; } +.bi-view-stacked::before { content: "\f606"; } +.bi-vinyl-fill::before { content: "\f607"; } +.bi-vinyl::before { content: "\f608"; } +.bi-voicemail::before { content: "\f609"; } +.bi-volume-down-fill::before { content: "\f60a"; } +.bi-volume-down::before { content: "\f60b"; } +.bi-volume-mute-fill::before { content: "\f60c"; } +.bi-volume-mute::before { content: "\f60d"; } +.bi-volume-off-fill::before { content: "\f60e"; } +.bi-volume-off::before { content: "\f60f"; } +.bi-volume-up-fill::before { content: "\f610"; } +.bi-volume-up::before { content: "\f611"; } +.bi-vr::before { content: "\f612"; } +.bi-wallet-fill::before { content: "\f613"; } +.bi-wallet::before { content: "\f614"; } +.bi-wallet2::before { content: "\f615"; } +.bi-watch::before { content: "\f616"; } +.bi-water::before { content: "\f617"; } +.bi-whatsapp::before { content: "\f618"; } +.bi-wifi-1::before { content: "\f619"; } +.bi-wifi-2::before { content: "\f61a"; } +.bi-wifi-off::before { content: "\f61b"; } +.bi-wifi::before { content: "\f61c"; } +.bi-wind::before { content: "\f61d"; } +.bi-window-dock::before { content: "\f61e"; } +.bi-window-sidebar::before { content: "\f61f"; } +.bi-window::before { content: "\f620"; } +.bi-wrench::before { content: "\f621"; } +.bi-x-circle-fill::before { content: "\f622"; } +.bi-x-circle::before { content: "\f623"; } +.bi-x-diamond-fill::before { content: "\f624"; } +.bi-x-diamond::before { content: "\f625"; } +.bi-x-octagon-fill::before { content: "\f626"; } +.bi-x-octagon::before { content: "\f627"; } +.bi-x-square-fill::before { content: "\f628"; } +.bi-x-square::before { content: "\f629"; } +.bi-x::before { content: "\f62a"; } +.bi-youtube::before { content: "\f62b"; } +.bi-zoom-in::before { content: "\f62c"; } +.bi-zoom-out::before { content: "\f62d"; } +.bi-bank::before { content: "\f62e"; } +.bi-bank2::before { content: "\f62f"; } +.bi-bell-slash-fill::before { content: "\f630"; } +.bi-bell-slash::before { content: "\f631"; } +.bi-cash-coin::before { content: "\f632"; } +.bi-check-lg::before { content: "\f633"; } +.bi-coin::before { content: "\f634"; } +.bi-currency-bitcoin::before { content: "\f635"; } +.bi-currency-dollar::before { content: "\f636"; } +.bi-currency-euro::before { content: "\f637"; } +.bi-currency-exchange::before { content: "\f638"; } +.bi-currency-pound::before { content: "\f639"; } +.bi-currency-yen::before { content: "\f63a"; } +.bi-dash-lg::before { content: "\f63b"; } +.bi-exclamation-lg::before { content: "\f63c"; } +.bi-file-earmark-pdf-fill::before { content: "\f63d"; } +.bi-file-earmark-pdf::before { content: "\f63e"; } +.bi-file-pdf-fill::before { content: "\f63f"; } +.bi-file-pdf::before { content: "\f640"; } +.bi-gender-ambiguous::before { content: "\f641"; } +.bi-gender-female::before { content: "\f642"; } +.bi-gender-male::before { content: "\f643"; } +.bi-gender-trans::before { content: "\f644"; } +.bi-headset-vr::before { content: "\f645"; } +.bi-info-lg::before { content: "\f646"; } +.bi-mastodon::before { content: "\f647"; } +.bi-messenger::before { content: "\f648"; } +.bi-piggy-bank-fill::before { content: "\f649"; } +.bi-piggy-bank::before { content: "\f64a"; } +.bi-pin-map-fill::before { content: "\f64b"; } +.bi-pin-map::before { content: "\f64c"; } +.bi-plus-lg::before { content: "\f64d"; } +.bi-question-lg::before { content: "\f64e"; } +.bi-recycle::before { content: "\f64f"; } +.bi-reddit::before { content: "\f650"; } +.bi-safe-fill::before { content: "\f651"; } +.bi-safe2-fill::before { content: "\f652"; } +.bi-safe2::before { content: "\f653"; } +.bi-sd-card-fill::before { content: "\f654"; } +.bi-sd-card::before { content: "\f655"; } +.bi-skype::before { content: "\f656"; } +.bi-slash-lg::before { content: "\f657"; } +.bi-translate::before { content: "\f658"; } +.bi-x-lg::before { content: "\f659"; } +.bi-safe::before { content: "\f65a"; } +.bi-apple::before { content: "\f65b"; } +.bi-microsoft::before { content: "\f65d"; } +.bi-windows::before { content: "\f65e"; } +.bi-behance::before { content: "\f65c"; } +.bi-dribbble::before { content: "\f65f"; } +.bi-line::before { content: "\f660"; } +.bi-medium::before { content: "\f661"; } +.bi-paypal::before { content: "\f662"; } +.bi-pinterest::before { content: "\f663"; } +.bi-signal::before { content: "\f664"; } +.bi-snapchat::before { content: "\f665"; } +.bi-spotify::before { content: "\f666"; } +.bi-stack-overflow::before { content: "\f667"; } +.bi-strava::before { content: "\f668"; } +.bi-wordpress::before { content: "\f669"; } +.bi-vimeo::before { content: "\f66a"; } +.bi-activity::before { content: "\f66b"; } +.bi-easel2-fill::before { content: "\f66c"; } +.bi-easel2::before { content: "\f66d"; } +.bi-easel3-fill::before { content: "\f66e"; } +.bi-easel3::before { content: "\f66f"; } +.bi-fan::before { content: "\f670"; } +.bi-fingerprint::before { content: "\f671"; } +.bi-graph-down-arrow::before { content: "\f672"; } +.bi-graph-up-arrow::before { content: "\f673"; } +.bi-hypnotize::before { content: "\f674"; } +.bi-magic::before { content: "\f675"; } +.bi-person-rolodex::before { content: "\f676"; } +.bi-person-video::before { content: "\f677"; } +.bi-person-video2::before { content: "\f678"; } +.bi-person-video3::before { content: "\f679"; } +.bi-person-workspace::before { content: "\f67a"; } +.bi-radioactive::before { content: "\f67b"; } +.bi-webcam-fill::before { content: "\f67c"; } +.bi-webcam::before { content: "\f67d"; } +.bi-yin-yang::before { content: "\f67e"; } +.bi-bandaid-fill::before { content: "\f680"; } +.bi-bandaid::before { content: "\f681"; } +.bi-bluetooth::before { content: "\f682"; } +.bi-body-text::before { content: "\f683"; } +.bi-boombox::before { content: "\f684"; } +.bi-boxes::before { content: "\f685"; } +.bi-dpad-fill::before { content: "\f686"; } +.bi-dpad::before { content: "\f687"; } +.bi-ear-fill::before { content: "\f688"; } +.bi-ear::before { content: "\f689"; } +.bi-envelope-check-1::before { content: "\f68a"; } +.bi-envelope-check-fill::before { content: "\f68b"; } +.bi-envelope-check::before { content: "\f68c"; } +.bi-envelope-dash-1::before { content: "\f68d"; } +.bi-envelope-dash-fill::before { content: "\f68e"; } +.bi-envelope-dash::before { content: "\f68f"; } +.bi-envelope-exclamation-1::before { content: "\f690"; } +.bi-envelope-exclamation-fill::before { content: "\f691"; } +.bi-envelope-exclamation::before { content: "\f692"; } +.bi-envelope-plus-fill::before { content: "\f693"; } +.bi-envelope-plus::before { content: "\f694"; } +.bi-envelope-slash-1::before { content: "\f695"; } +.bi-envelope-slash-fill::before { content: "\f696"; } +.bi-envelope-slash::before { content: "\f697"; } +.bi-envelope-x-1::before { content: "\f698"; } +.bi-envelope-x-fill::before { content: "\f699"; } +.bi-envelope-x::before { content: "\f69a"; } +.bi-explicit-fill::before { content: "\f69b"; } +.bi-explicit::before { content: "\f69c"; } +.bi-git::before { content: "\f69d"; } +.bi-infinity::before { content: "\f69e"; } +.bi-list-columns-reverse::before { content: "\f69f"; } +.bi-list-columns::before { content: "\f6a0"; } +.bi-meta::before { content: "\f6a1"; } +.bi-mortorboard-fill::before { content: "\f6a2"; } +.bi-mortorboard::before { content: "\f6a3"; } +.bi-nintendo-switch::before { content: "\f6a4"; } +.bi-pc-display-horizontal::before { content: "\f6a5"; } +.bi-pc-display::before { content: "\f6a6"; } +.bi-pc-horizontal::before { content: "\f6a7"; } +.bi-pc::before { content: "\f6a8"; } +.bi-playstation::before { content: "\f6a9"; } +.bi-plus-slash-minus::before { content: "\f6aa"; } +.bi-projector-fill::before { content: "\f6ab"; } +.bi-projector::before { content: "\f6ac"; } +.bi-qr-code-scan::before { content: "\f6ad"; } +.bi-qr-code::before { content: "\f6ae"; } +.bi-quora::before { content: "\f6af"; } +.bi-quote::before { content: "\f6b0"; } +.bi-robot::before { content: "\f6b1"; } +.bi-send-check-fill::before { content: "\f6b2"; } +.bi-send-check::before { content: "\f6b3"; } +.bi-send-dash-fill::before { content: "\f6b4"; } +.bi-send-dash::before { content: "\f6b5"; } +.bi-send-exclamation-1::before { content: "\f6b6"; } +.bi-send-exclamation-fill::before { content: "\f6b7"; } +.bi-send-exclamation::before { content: "\f6b8"; } +.bi-send-fill::before { content: "\f6b9"; } +.bi-send-plus-fill::before { content: "\f6ba"; } +.bi-send-plus::before { content: "\f6bb"; } +.bi-send-slash-fill::before { content: "\f6bc"; } +.bi-send-slash::before { content: "\f6bd"; } +.bi-send-x-fill::before { content: "\f6be"; } +.bi-send-x::before { content: "\f6bf"; } +.bi-send::before { content: "\f6c0"; } +.bi-steam::before { content: "\f6c1"; } +.bi-terminal-dash-1::before { content: "\f6c2"; } +.bi-terminal-dash::before { content: "\f6c3"; } +.bi-terminal-plus::before { content: "\f6c4"; } +.bi-terminal-split::before { content: "\f6c5"; } +.bi-ticket-detailed-fill::before { content: "\f6c6"; } +.bi-ticket-detailed::before { content: "\f6c7"; } +.bi-ticket-fill::before { content: "\f6c8"; } +.bi-ticket-perforated-fill::before { content: "\f6c9"; } +.bi-ticket-perforated::before { content: "\f6ca"; } +.bi-ticket::before { content: "\f6cb"; } +.bi-tiktok::before { content: "\f6cc"; } +.bi-window-dash::before { content: "\f6cd"; } +.bi-window-desktop::before { content: "\f6ce"; } +.bi-window-fullscreen::before { content: "\f6cf"; } +.bi-window-plus::before { content: "\f6d0"; } +.bi-window-split::before { content: "\f6d1"; } +.bi-window-stack::before { content: "\f6d2"; } +.bi-window-x::before { content: "\f6d3"; } +.bi-xbox::before { content: "\f6d4"; } +.bi-ethernet::before { content: "\f6d5"; } +.bi-hdmi-fill::before { content: "\f6d6"; } +.bi-hdmi::before { content: "\f6d7"; } +.bi-usb-c-fill::before { content: "\f6d8"; } +.bi-usb-c::before { content: "\f6d9"; } +.bi-usb-fill::before { content: "\f6da"; } +.bi-usb-plug-fill::before { content: "\f6db"; } +.bi-usb-plug::before { content: "\f6dc"; } +.bi-usb-symbol::before { content: "\f6dd"; } +.bi-usb::before { content: "\f6de"; } +.bi-boombox-fill::before { content: "\f6df"; } +.bi-displayport-1::before { content: "\f6e0"; } +.bi-displayport::before { content: "\f6e1"; } +.bi-gpu-card::before { content: "\f6e2"; } +.bi-memory::before { content: "\f6e3"; } +.bi-modem-fill::before { content: "\f6e4"; } +.bi-modem::before { content: "\f6e5"; } +.bi-motherboard-fill::before { content: "\f6e6"; } +.bi-motherboard::before { content: "\f6e7"; } +.bi-optical-audio-fill::before { content: "\f6e8"; } +.bi-optical-audio::before { content: "\f6e9"; } +.bi-pci-card::before { content: "\f6ea"; } +.bi-router-fill::before { content: "\f6eb"; } +.bi-router::before { content: "\f6ec"; } +.bi-ssd-fill::before { content: "\f6ed"; } +.bi-ssd::before { content: "\f6ee"; } +.bi-thunderbolt-fill::before { content: "\f6ef"; } +.bi-thunderbolt::before { content: "\f6f0"; } +.bi-usb-drive-fill::before { content: "\f6f1"; } +.bi-usb-drive::before { content: "\f6f2"; } +.bi-usb-micro-fill::before { content: "\f6f3"; } +.bi-usb-micro::before { content: "\f6f4"; } +.bi-usb-mini-fill::before { content: "\f6f5"; } +.bi-usb-mini::before { content: "\f6f6"; } +.bi-cloud-haze2::before { content: "\f6f7"; } +.bi-device-hdd-fill::before { content: "\f6f8"; } +.bi-device-hdd::before { content: "\f6f9"; } +.bi-device-ssd-fill::before { content: "\f6fa"; } +.bi-device-ssd::before { content: "\f6fb"; } +.bi-displayport-fill::before { content: "\f6fc"; } +.bi-mortarboard-fill::before { content: "\f6fd"; } +.bi-mortarboard::before { content: "\f6fe"; } +.bi-terminal-x::before { content: "\f6ff"; } +.bi-arrow-through-heart-fill::before { content: "\f700"; } +.bi-arrow-through-heart::before { content: "\f701"; } +.bi-badge-sd-fill::before { content: "\f702"; } +.bi-badge-sd::before { content: "\f703"; } +.bi-bag-heart-fill::before { content: "\f704"; } +.bi-bag-heart::before { content: "\f705"; } +.bi-balloon-fill::before { content: "\f706"; } +.bi-balloon-heart-fill::before { content: "\f707"; } +.bi-balloon-heart::before { content: "\f708"; } +.bi-balloon::before { content: "\f709"; } +.bi-box2-fill::before { content: "\f70a"; } +.bi-box2-heart-fill::before { content: "\f70b"; } +.bi-box2-heart::before { content: "\f70c"; } +.bi-box2::before { content: "\f70d"; } +.bi-braces-asterisk::before { content: "\f70e"; } +.bi-calendar-heart-fill::before { content: "\f70f"; } +.bi-calendar-heart::before { content: "\f710"; } +.bi-calendar2-heart-fill::before { content: "\f711"; } +.bi-calendar2-heart::before { content: "\f712"; } +.bi-chat-heart-fill::before { content: "\f713"; } +.bi-chat-heart::before { content: "\f714"; } +.bi-chat-left-heart-fill::before { content: "\f715"; } +.bi-chat-left-heart::before { content: "\f716"; } +.bi-chat-right-heart-fill::before { content: "\f717"; } +.bi-chat-right-heart::before { content: "\f718"; } +.bi-chat-square-heart-fill::before { content: "\f719"; } +.bi-chat-square-heart::before { content: "\f71a"; } +.bi-clipboard-check-fill::before { content: "\f71b"; } +.bi-clipboard-data-fill::before { content: "\f71c"; } +.bi-clipboard-fill::before { content: "\f71d"; } +.bi-clipboard-heart-fill::before { content: "\f71e"; } +.bi-clipboard-heart::before { content: "\f71f"; } +.bi-clipboard-minus-fill::before { content: "\f720"; } +.bi-clipboard-plus-fill::before { content: "\f721"; } +.bi-clipboard-pulse::before { content: "\f722"; } +.bi-clipboard-x-fill::before { content: "\f723"; } +.bi-clipboard2-check-fill::before { content: "\f724"; } +.bi-clipboard2-check::before { content: "\f725"; } +.bi-clipboard2-data-fill::before { content: "\f726"; } +.bi-clipboard2-data::before { content: "\f727"; } +.bi-clipboard2-fill::before { content: "\f728"; } +.bi-clipboard2-heart-fill::before { content: "\f729"; } +.bi-clipboard2-heart::before { content: "\f72a"; } +.bi-clipboard2-minus-fill::before { content: "\f72b"; } +.bi-clipboard2-minus::before { content: "\f72c"; } +.bi-clipboard2-plus-fill::before { content: "\f72d"; } +.bi-clipboard2-plus::before { content: "\f72e"; } +.bi-clipboard2-pulse-fill::before { content: "\f72f"; } +.bi-clipboard2-pulse::before { content: "\f730"; } +.bi-clipboard2-x-fill::before { content: "\f731"; } +.bi-clipboard2-x::before { content: "\f732"; } +.bi-clipboard2::before { content: "\f733"; } +.bi-emoji-kiss-fill::before { content: "\f734"; } +.bi-emoji-kiss::before { content: "\f735"; } +.bi-envelope-heart-fill::before { content: "\f736"; } +.bi-envelope-heart::before { content: "\f737"; } +.bi-envelope-open-heart-fill::before { content: "\f738"; } +.bi-envelope-open-heart::before { content: "\f739"; } +.bi-envelope-paper-fill::before { content: "\f73a"; } +.bi-envelope-paper-heart-fill::before { content: "\f73b"; } +.bi-envelope-paper-heart::before { content: "\f73c"; } +.bi-envelope-paper::before { content: "\f73d"; } +.bi-filetype-aac::before { content: "\f73e"; } +.bi-filetype-ai::before { content: "\f73f"; } +.bi-filetype-bmp::before { content: "\f740"; } +.bi-filetype-cs::before { content: "\f741"; } +.bi-filetype-css::before { content: "\f742"; } +.bi-filetype-csv::before { content: "\f743"; } +.bi-filetype-doc::before { content: "\f744"; } +.bi-filetype-docx::before { content: "\f745"; } +.bi-filetype-exe::before { content: "\f746"; } +.bi-filetype-gif::before { content: "\f747"; } +.bi-filetype-heic::before { content: "\f748"; } +.bi-filetype-html::before { content: "\f749"; } +.bi-filetype-java::before { content: "\f74a"; } +.bi-filetype-jpg::before { content: "\f74b"; } +.bi-filetype-js::before { content: "\f74c"; } +.bi-filetype-jsx::before { content: "\f74d"; } +.bi-filetype-key::before { content: "\f74e"; } +.bi-filetype-m4p::before { content: "\f74f"; } +.bi-filetype-md::before { content: "\f750"; } +.bi-filetype-mdx::before { content: "\f751"; } +.bi-filetype-mov::before { content: "\f752"; } +.bi-filetype-mp3::before { content: "\f753"; } +.bi-filetype-mp4::before { content: "\f754"; } +.bi-filetype-otf::before { content: "\f755"; } +.bi-filetype-pdf::before { content: "\f756"; } +.bi-filetype-php::before { content: "\f757"; } +.bi-filetype-png::before { content: "\f758"; } +.bi-filetype-ppt-1::before { content: "\f759"; } +.bi-filetype-ppt::before { content: "\f75a"; } +.bi-filetype-psd::before { content: "\f75b"; } +.bi-filetype-py::before { content: "\f75c"; } +.bi-filetype-raw::before { content: "\f75d"; } +.bi-filetype-rb::before { content: "\f75e"; } +.bi-filetype-sass::before { content: "\f75f"; } +.bi-filetype-scss::before { content: "\f760"; } +.bi-filetype-sh::before { content: "\f761"; } +.bi-filetype-svg::before { content: "\f762"; } +.bi-filetype-tiff::before { content: "\f763"; } +.bi-filetype-tsx::before { content: "\f764"; } +.bi-filetype-ttf::before { content: "\f765"; } +.bi-filetype-txt::before { content: "\f766"; } +.bi-filetype-wav::before { content: "\f767"; } +.bi-filetype-woff::before { content: "\f768"; } +.bi-filetype-xls-1::before { content: "\f769"; } +.bi-filetype-xls::before { content: "\f76a"; } +.bi-filetype-xml::before { content: "\f76b"; } +.bi-filetype-yml::before { content: "\f76c"; } +.bi-heart-arrow::before { content: "\f76d"; } +.bi-heart-pulse-fill::before { content: "\f76e"; } +.bi-heart-pulse::before { content: "\f76f"; } +.bi-heartbreak-fill::before { content: "\f770"; } +.bi-heartbreak::before { content: "\f771"; } +.bi-hearts::before { content: "\f772"; } +.bi-hospital-fill::before { content: "\f773"; } +.bi-hospital::before { content: "\f774"; } +.bi-house-heart-fill::before { content: "\f775"; } +.bi-house-heart::before { content: "\f776"; } +.bi-incognito::before { content: "\f777"; } +.bi-magnet-fill::before { content: "\f778"; } +.bi-magnet::before { content: "\f779"; } +.bi-person-heart::before { content: "\f77a"; } +.bi-person-hearts::before { content: "\f77b"; } +.bi-phone-flip::before { content: "\f77c"; } +.bi-plugin::before { content: "\f77d"; } +.bi-postage-fill::before { content: "\f77e"; } +.bi-postage-heart-fill::before { content: "\f77f"; } +.bi-postage-heart::before { content: "\f780"; } +.bi-postage::before { content: "\f781"; } +.bi-postcard-fill::before { content: "\f782"; } +.bi-postcard-heart-fill::before { content: "\f783"; } +.bi-postcard-heart::before { content: "\f784"; } +.bi-postcard::before { content: "\f785"; } +.bi-search-heart-fill::before { content: "\f786"; } +.bi-search-heart::before { content: "\f787"; } +.bi-sliders2-vertical::before { content: "\f788"; } +.bi-sliders2::before { content: "\f789"; } +.bi-trash3-fill::before { content: "\f78a"; } +.bi-trash3::before { content: "\f78b"; } +.bi-valentine::before { content: "\f78c"; } +.bi-valentine2::before { content: "\f78d"; } +.bi-wrench-adjustable-circle-fill::before { content: "\f78e"; } +.bi-wrench-adjustable-circle::before { content: "\f78f"; } +.bi-wrench-adjustable::before { content: "\f790"; } +.bi-filetype-json::before { content: "\f791"; } +.bi-filetype-pptx::before { content: "\f792"; } +.bi-filetype-xlsx::before { content: "\f793"; } +.bi-1-circle-1::before { content: "\f794"; } +.bi-1-circle-fill-1::before { content: "\f795"; } +.bi-1-circle-fill::before { content: "\f796"; } +.bi-1-circle::before { content: "\f797"; } +.bi-1-square-fill::before { content: "\f798"; } +.bi-1-square::before { content: "\f799"; } +.bi-2-circle-1::before { content: "\f79a"; } +.bi-2-circle-fill-1::before { content: "\f79b"; } +.bi-2-circle-fill::before { content: "\f79c"; } +.bi-2-circle::before { content: "\f79d"; } +.bi-2-square-fill::before { content: "\f79e"; } +.bi-2-square::before { content: "\f79f"; } +.bi-3-circle-1::before { content: "\f7a0"; } +.bi-3-circle-fill-1::before { content: "\f7a1"; } +.bi-3-circle-fill::before { content: "\f7a2"; } +.bi-3-circle::before { content: "\f7a3"; } +.bi-3-square-fill::before { content: "\f7a4"; } +.bi-3-square::before { content: "\f7a5"; } +.bi-4-circle-1::before { content: "\f7a6"; } +.bi-4-circle-fill-1::before { content: "\f7a7"; } +.bi-4-circle-fill::before { content: "\f7a8"; } +.bi-4-circle::before { content: "\f7a9"; } +.bi-4-square-fill::before { content: "\f7aa"; } +.bi-4-square::before { content: "\f7ab"; } +.bi-5-circle-1::before { content: "\f7ac"; } +.bi-5-circle-fill-1::before { content: "\f7ad"; } +.bi-5-circle-fill::before { content: "\f7ae"; } +.bi-5-circle::before { content: "\f7af"; } +.bi-5-square-fill::before { content: "\f7b0"; } +.bi-5-square::before { content: "\f7b1"; } +.bi-6-circle-1::before { content: "\f7b2"; } +.bi-6-circle-fill-1::before { content: "\f7b3"; } +.bi-6-circle-fill::before { content: "\f7b4"; } +.bi-6-circle::before { content: "\f7b5"; } +.bi-6-square-fill::before { content: "\f7b6"; } +.bi-6-square::before { content: "\f7b7"; } +.bi-7-circle-1::before { content: "\f7b8"; } +.bi-7-circle-fill-1::before { content: "\f7b9"; } +.bi-7-circle-fill::before { content: "\f7ba"; } +.bi-7-circle::before { content: "\f7bb"; } +.bi-7-square-fill::before { content: "\f7bc"; } +.bi-7-square::before { content: "\f7bd"; } +.bi-8-circle-1::before { content: "\f7be"; } +.bi-8-circle-fill-1::before { content: "\f7bf"; } +.bi-8-circle-fill::before { content: "\f7c0"; } +.bi-8-circle::before { content: "\f7c1"; } +.bi-8-square-fill::before { content: "\f7c2"; } +.bi-8-square::before { content: "\f7c3"; } +.bi-9-circle-1::before { content: "\f7c4"; } +.bi-9-circle-fill-1::before { content: "\f7c5"; } +.bi-9-circle-fill::before { content: "\f7c6"; } +.bi-9-circle::before { content: "\f7c7"; } +.bi-9-square-fill::before { content: "\f7c8"; } +.bi-9-square::before { content: "\f7c9"; } +.bi-airplane-engines-fill::before { content: "\f7ca"; } +.bi-airplane-engines::before { content: "\f7cb"; } +.bi-airplane-fill::before { content: "\f7cc"; } +.bi-airplane::before { content: "\f7cd"; } +.bi-alexa::before { content: "\f7ce"; } +.bi-alipay::before { content: "\f7cf"; } +.bi-android::before { content: "\f7d0"; } +.bi-android2::before { content: "\f7d1"; } +.bi-box-fill::before { content: "\f7d2"; } +.bi-box-seam-fill::before { content: "\f7d3"; } +.bi-browser-chrome::before { content: "\f7d4"; } +.bi-browser-edge::before { content: "\f7d5"; } +.bi-browser-firefox::before { content: "\f7d6"; } +.bi-browser-safari::before { content: "\f7d7"; } +.bi-c-circle-1::before { content: "\f7d8"; } +.bi-c-circle-fill-1::before { content: "\f7d9"; } +.bi-c-circle-fill::before { content: "\f7da"; } +.bi-c-circle::before { content: "\f7db"; } +.bi-c-square-fill::before { content: "\f7dc"; } +.bi-c-square::before { content: "\f7dd"; } +.bi-capsule-pill::before { content: "\f7de"; } +.bi-capsule::before { content: "\f7df"; } +.bi-car-front-fill::before { content: "\f7e0"; } +.bi-car-front::before { content: "\f7e1"; } +.bi-cassette-fill::before { content: "\f7e2"; } +.bi-cassette::before { content: "\f7e3"; } +.bi-cc-circle-1::before { content: "\f7e4"; } +.bi-cc-circle-fill-1::before { content: "\f7e5"; } +.bi-cc-circle-fill::before { content: "\f7e6"; } +.bi-cc-circle::before { content: "\f7e7"; } +.bi-cc-square-fill::before { content: "\f7e8"; } +.bi-cc-square::before { content: "\f7e9"; } +.bi-cup-hot-fill::before { content: "\f7ea"; } +.bi-cup-hot::before { content: "\f7eb"; } +.bi-currency-rupee::before { content: "\f7ec"; } +.bi-dropbox::before { content: "\f7ed"; } +.bi-escape::before { content: "\f7ee"; } +.bi-fast-forward-btn-fill::before { content: "\f7ef"; } +.bi-fast-forward-btn::before { content: "\f7f0"; } +.bi-fast-forward-circle-fill::before { content: "\f7f1"; } +.bi-fast-forward-circle::before { content: "\f7f2"; } +.bi-fast-forward-fill::before { content: "\f7f3"; } +.bi-fast-forward::before { content: "\f7f4"; } +.bi-filetype-sql::before { content: "\f7f5"; } +.bi-fire::before { content: "\f7f6"; } +.bi-google-play::before { content: "\f7f7"; } +.bi-h-circle-1::before { content: "\f7f8"; } +.bi-h-circle-fill-1::before { content: "\f7f9"; } +.bi-h-circle-fill::before { content: "\f7fa"; } +.bi-h-circle::before { content: "\f7fb"; } +.bi-h-square-fill::before { content: "\f7fc"; } +.bi-h-square::before { content: "\f7fd"; } +.bi-indent::before { content: "\f7fe"; } +.bi-lungs-fill::before { content: "\f7ff"; } +.bi-lungs::before { content: "\f800"; } +.bi-microsoft-teams::before { content: "\f801"; } +.bi-p-circle-1::before { content: "\f802"; } +.bi-p-circle-fill-1::before { content: "\f803"; } +.bi-p-circle-fill::before { content: "\f804"; } +.bi-p-circle::before { content: "\f805"; } +.bi-p-square-fill::before { content: "\f806"; } +.bi-p-square::before { content: "\f807"; } +.bi-pass-fill::before { content: "\f808"; } +.bi-pass::before { content: "\f809"; } +.bi-prescription::before { content: "\f80a"; } +.bi-prescription2::before { content: "\f80b"; } +.bi-r-circle-1::before { content: "\f80c"; } +.bi-r-circle-fill-1::before { content: "\f80d"; } +.bi-r-circle-fill::before { content: "\f80e"; } +.bi-r-circle::before { content: "\f80f"; } +.bi-r-square-fill::before { content: "\f810"; } +.bi-r-square::before { content: "\f811"; } +.bi-repeat-1::before { content: "\f812"; } +.bi-repeat::before { content: "\f813"; } +.bi-rewind-btn-fill::before { content: "\f814"; } +.bi-rewind-btn::before { content: "\f815"; } +.bi-rewind-circle-fill::before { content: "\f816"; } +.bi-rewind-circle::before { content: "\f817"; } +.bi-rewind-fill::before { content: "\f818"; } +.bi-rewind::before { content: "\f819"; } +.bi-train-freight-front-fill::before { content: "\f81a"; } +.bi-train-freight-front::before { content: "\f81b"; } +.bi-train-front-fill::before { content: "\f81c"; } +.bi-train-front::before { content: "\f81d"; } +.bi-train-lightrail-front-fill::before { content: "\f81e"; } +.bi-train-lightrail-front::before { content: "\f81f"; } +.bi-truck-front-fill::before { content: "\f820"; } +.bi-truck-front::before { content: "\f821"; } +.bi-ubuntu::before { content: "\f822"; } +.bi-unindent::before { content: "\f823"; } +.bi-unity::before { content: "\f824"; } +.bi-universal-access-circle::before { content: "\f825"; } +.bi-universal-access::before { content: "\f826"; } +.bi-virus::before { content: "\f827"; } +.bi-virus2::before { content: "\f828"; } +.bi-wechat::before { content: "\f829"; } +.bi-yelp::before { content: "\f82a"; } +.bi-sign-stop-fill::before { content: "\f82b"; } +.bi-sign-stop-lights-fill::before { content: "\f82c"; } +.bi-sign-stop-lights::before { content: "\f82d"; } +.bi-sign-stop::before { content: "\f82e"; } +.bi-sign-turn-left-fill::before { content: "\f82f"; } +.bi-sign-turn-left::before { content: "\f830"; } +.bi-sign-turn-right-fill::before { content: "\f831"; } +.bi-sign-turn-right::before { content: "\f832"; } +.bi-sign-turn-slight-left-fill::before { content: "\f833"; } +.bi-sign-turn-slight-left::before { content: "\f834"; } +.bi-sign-turn-slight-right-fill::before { content: "\f835"; } +.bi-sign-turn-slight-right::before { content: "\f836"; } +.bi-sign-yield-fill::before { content: "\f837"; } +.bi-sign-yield::before { content: "\f838"; } +.bi-ev-station-fill::before { content: "\f839"; } +.bi-ev-station::before { content: "\f83a"; } +.bi-fuel-pump-diesel-fill::before { content: "\f83b"; } +.bi-fuel-pump-diesel::before { content: "\f83c"; } +.bi-fuel-pump-fill::before { content: "\f83d"; } +.bi-fuel-pump::before { content: "\f83e"; } +.bi-0-circle-fill::before { content: "\f83f"; } +.bi-0-circle::before { content: "\f840"; } +.bi-0-square-fill::before { content: "\f841"; } +.bi-0-square::before { content: "\f842"; } +.bi-rocket-fill::before { content: "\f843"; } +.bi-rocket-takeoff-fill::before { content: "\f844"; } +.bi-rocket-takeoff::before { content: "\f845"; } +.bi-rocket::before { content: "\f846"; } +.bi-stripe::before { content: "\f847"; } +.bi-subscript::before { content: "\f848"; } +.bi-superscript::before { content: "\f849"; } +.bi-trello::before { content: "\f84a"; } +.bi-envelope-at-fill::before { content: "\f84b"; } +.bi-envelope-at::before { content: "\f84c"; } +.bi-regex::before { content: "\f84d"; } +.bi-text-wrap::before { content: "\f84e"; } +.bi-sign-dead-end-fill::before { content: "\f84f"; } +.bi-sign-dead-end::before { content: "\f850"; } +.bi-sign-do-not-enter-fill::before { content: "\f851"; } +.bi-sign-do-not-enter::before { content: "\f852"; } +.bi-sign-intersection-fill::before { content: "\f853"; } +.bi-sign-intersection-side-fill::before { content: "\f854"; } +.bi-sign-intersection-side::before { content: "\f855"; } +.bi-sign-intersection-t-fill::before { content: "\f856"; } +.bi-sign-intersection-t::before { content: "\f857"; } +.bi-sign-intersection-y-fill::before { content: "\f858"; } +.bi-sign-intersection-y::before { content: "\f859"; } +.bi-sign-intersection::before { content: "\f85a"; } +.bi-sign-merge-left-fill::before { content: "\f85b"; } +.bi-sign-merge-left::before { content: "\f85c"; } +.bi-sign-merge-right-fill::before { content: "\f85d"; } +.bi-sign-merge-right::before { content: "\f85e"; } +.bi-sign-no-left-turn-fill::before { content: "\f85f"; } +.bi-sign-no-left-turn::before { content: "\f860"; } +.bi-sign-no-parking-fill::before { content: "\f861"; } +.bi-sign-no-parking::before { content: "\f862"; } +.bi-sign-no-right-turn-fill::before { content: "\f863"; } +.bi-sign-no-right-turn::before { content: "\f864"; } +.bi-sign-railroad-fill::before { content: "\f865"; } +.bi-sign-railroad::before { content: "\f866"; } +.bi-building-add::before { content: "\f867"; } +.bi-building-check::before { content: "\f868"; } +.bi-building-dash::before { content: "\f869"; } +.bi-building-down::before { content: "\f86a"; } +.bi-building-exclamation::before { content: "\f86b"; } +.bi-building-fill-add::before { content: "\f86c"; } +.bi-building-fill-check::before { content: "\f86d"; } +.bi-building-fill-dash::before { content: "\f86e"; } +.bi-building-fill-down::before { content: "\f86f"; } +.bi-building-fill-exclamation::before { content: "\f870"; } +.bi-building-fill-gear::before { content: "\f871"; } +.bi-building-fill-lock::before { content: "\f872"; } +.bi-building-fill-slash::before { content: "\f873"; } +.bi-building-fill-up::before { content: "\f874"; } +.bi-building-fill-x::before { content: "\f875"; } +.bi-building-fill::before { content: "\f876"; } +.bi-building-gear::before { content: "\f877"; } +.bi-building-lock::before { content: "\f878"; } +.bi-building-slash::before { content: "\f879"; } +.bi-building-up::before { content: "\f87a"; } +.bi-building-x::before { content: "\f87b"; } +.bi-buildings-fill::before { content: "\f87c"; } +.bi-buildings::before { content: "\f87d"; } +.bi-bus-front-fill::before { content: "\f87e"; } +.bi-bus-front::before { content: "\f87f"; } +.bi-ev-front-fill::before { content: "\f880"; } +.bi-ev-front::before { content: "\f881"; } +.bi-globe-americas::before { content: "\f882"; } +.bi-globe-asia-australia::before { content: "\f883"; } +.bi-globe-central-south-asia::before { content: "\f884"; } +.bi-globe-europe-africa::before { content: "\f885"; } +.bi-house-add-fill::before { content: "\f886"; } +.bi-house-add::before { content: "\f887"; } +.bi-house-check-fill::before { content: "\f888"; } +.bi-house-check::before { content: "\f889"; } +.bi-house-dash-fill::before { content: "\f88a"; } +.bi-house-dash::before { content: "\f88b"; } +.bi-house-down-fill::before { content: "\f88c"; } +.bi-house-down::before { content: "\f88d"; } +.bi-house-exclamation-fill::before { content: "\f88e"; } +.bi-house-exclamation::before { content: "\f88f"; } +.bi-house-gear-fill::before { content: "\f890"; } +.bi-house-gear::before { content: "\f891"; } +.bi-house-lock-fill::before { content: "\f892"; } +.bi-house-lock::before { content: "\f893"; } +.bi-house-slash-fill::before { content: "\f894"; } +.bi-house-slash::before { content: "\f895"; } +.bi-house-up-fill::before { content: "\f896"; } +.bi-house-up::before { content: "\f897"; } +.bi-house-x-fill::before { content: "\f898"; } +.bi-house-x::before { content: "\f899"; } +.bi-person-add::before { content: "\f89a"; } +.bi-person-down::before { content: "\f89b"; } +.bi-person-exclamation::before { content: "\f89c"; } +.bi-person-fill-add::before { content: "\f89d"; } +.bi-person-fill-check::before { content: "\f89e"; } +.bi-person-fill-dash::before { content: "\f89f"; } +.bi-person-fill-down::before { content: "\f8a0"; } +.bi-person-fill-exclamation::before { content: "\f8a1"; } +.bi-person-fill-gear::before { content: "\f8a2"; } +.bi-person-fill-lock::before { content: "\f8a3"; } +.bi-person-fill-slash::before { content: "\f8a4"; } +.bi-person-fill-up::before { content: "\f8a5"; } +.bi-person-fill-x::before { content: "\f8a6"; } +.bi-person-gear::before { content: "\f8a7"; } +.bi-person-lock::before { content: "\f8a8"; } +.bi-person-slash::before { content: "\f8a9"; } +.bi-person-up::before { content: "\f8aa"; } +.bi-scooter::before { content: "\f8ab"; } +.bi-taxi-front-fill::before { content: "\f8ac"; } +.bi-taxi-front::before { content: "\f8ad"; } +.bi-amd::before { content: "\f8ae"; } +.bi-database-add::before { content: "\f8af"; } +.bi-database-check::before { content: "\f8b0"; } +.bi-database-dash::before { content: "\f8b1"; } +.bi-database-down::before { content: "\f8b2"; } +.bi-database-exclamation::before { content: "\f8b3"; } +.bi-database-fill-add::before { content: "\f8b4"; } +.bi-database-fill-check::before { content: "\f8b5"; } +.bi-database-fill-dash::before { content: "\f8b6"; } +.bi-database-fill-down::before { content: "\f8b7"; } +.bi-database-fill-exclamation::before { content: "\f8b8"; } +.bi-database-fill-gear::before { content: "\f8b9"; } +.bi-database-fill-lock::before { content: "\f8ba"; } +.bi-database-fill-slash::before { content: "\f8bb"; } +.bi-database-fill-up::before { content: "\f8bc"; } +.bi-database-fill-x::before { content: "\f8bd"; } +.bi-database-fill::before { content: "\f8be"; } +.bi-database-gear::before { content: "\f8bf"; } +.bi-database-lock::before { content: "\f8c0"; } +.bi-database-slash::before { content: "\f8c1"; } +.bi-database-up::before { content: "\f8c2"; } +.bi-database-x::before { content: "\f8c3"; } +.bi-database::before { content: "\f8c4"; } +.bi-houses-fill::before { content: "\f8c5"; } +.bi-houses::before { content: "\f8c6"; } +.bi-nvidia::before { content: "\f8c7"; } +.bi-person-vcard-fill::before { content: "\f8c8"; } +.bi-person-vcard::before { content: "\f8c9"; } +.bi-sina-weibo::before { content: "\f8ca"; } +.bi-tencent-qq::before { content: "\f8cb"; } +.bi-wikipedia::before { content: "\f8cc"; } diff --git a/public/css/bootstrap.min.css b/public/css/bootstrap.min.css new file mode 100644 index 0000000..b23c3e7 --- /dev/null +++ b/public/css/bootstrap.min.css @@ -0,0 +1,6 @@ +@charset "UTF-8";/*! + * Bootstrap v5.3.0 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */:root,[data-bs-theme=light]{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13, 110, 253, 0.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#adb5bd;--bs-body-color-rgb:173,181,189;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(173, 181, 189, 0.75);--bs-secondary-color-rgb:173,181,189;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(173, 181, 189, 0.5);--bs-tertiary-color-rgb:173,181,189;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-body-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-body-color);--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>:disabled~label{color:#6c757d}.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{color:var(--bs-nav-link-disabled-color);background-color:transparent;border-color:transparent}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#0d6efd;--bs-list-group-active-border-color:#0d6efd;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(13, 110, 253, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important}.text-bg-info{color:#000!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#000!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/public/fonts/bootstrap-icons.woff b/public/fonts/bootstrap-icons.woff new file mode 100644 index 0000000000000000000000000000000000000000..18d21d457558d4dc2e231a8f6ee585fada9c6bab GIT binary patch literal 164168 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%0D{F7My?sp4b~Pd<-wWT`E3Pn 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%0Aub6*Q4?Lh?RzF3+=+IGMyc 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

    V5sL;~RGzKe44( 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࿣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

    + + + + + +
    + + + + + + diff --git a/public/js/axios.min.js b/public/js/axios.min.js new file mode 100644 index 0000000..2b482fa --- /dev/null +++ b/public/js/axios.min.js @@ -0,0 +1,3 @@ +/*! Axios v1.13.2 Copyright (c) 2025 Matt Zabriskie and contributors */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).axios=t()}(this,(function(){"use strict";function e(e){var r,n;function o(r,n){try{var a=e[r](n),u=a.value,s=u instanceof t;Promise.resolve(s?u.v:u).then((function(t){if(s){var n="return"===r?"return":"next";if(!u.k||t.done)return o(n,t);t=e[n](t).value}i(a.done?"return":"normal",t)}),(function(e){o("throw",e)}))}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":r.resolve({value:t,done:!0});break;case"throw":r.reject(t);break;default:r.resolve({value:t,done:!1})}(r=r.next)?o(r.key,r.arg):n=null}this._invoke=function(e,t){return new Promise((function(i,a){var u={key:e,arg:t,resolve:i,reject:a,next:null};n?n=n.next=u:(r=n=u,o(e,t))}))},"function"!=typeof e.return&&(this.return=void 0)}function t(e,t){this.v=e,this.k=t}function r(e){var r={},n=!1;function o(r,o){return n=!0,o=new Promise((function(t){t(e[r](o))})),{done:!1,value:new t(o,1)}}return r["undefined"!=typeof Symbol&&Symbol.iterator||"@@iterator"]=function(){return this},r.next=function(e){return n?(n=!1,e):o("next",e)},"function"==typeof e.throw&&(r.throw=function(e){if(n)throw n=!1,e;return o("throw",e)}),"function"==typeof e.return&&(r.return=function(e){return n?(n=!1,e):o("return",e)}),r}function n(e){var t,r,n,i=2;for("undefined"!=typeof Symbol&&(r=Symbol.asyncIterator,n=Symbol.iterator);i--;){if(r&&null!=(t=e[r]))return t.call(e);if(n&&null!=(t=e[n]))return new o(t.call(e));r="@@asyncIterator",n="@@iterator"}throw new TypeError("Object is not async iterable")}function o(e){function t(e){if(Object(e)!==e)return Promise.reject(new TypeError(e+" is not an object."));var t=e.done;return Promise.resolve(e.value).then((function(e){return{value:e,done:t}}))}return o=function(e){this.s=e,this.n=e.next},o.prototype={s:null,n:null,next:function(){return t(this.n.apply(this.s,arguments))},return:function(e){var r=this.s.return;return void 0===r?Promise.resolve({value:e,done:!0}):t(r.apply(this.s,arguments))},throw:function(e){var r=this.s.return;return void 0===r?Promise.reject(e):t(r.apply(this.s,arguments))}},new o(e)}function i(e){return new t(e,0)}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function u(e){for(var t=1;t=0;--i){var a=this.tryEntries[i],u=a.completion;if("root"===a.tryLoc)return o("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(s&&c){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--t){var r=this.tryEntries[t];if(r.finallyLoc===e)return this.complete(r.completion,r.afterLoc),A(r),y}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var r=this.tryEntries[t];if(r.tryLoc===e){var n=r.completion;if("throw"===n.type){var o=n.arg;A(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:L(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),y}},t}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:String(t)}function f(e){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f(e)}function l(t){return function(){return new e(t.apply(this,arguments))}}function p(e,t,r,n,o,i,a){try{var u=e[i](a),s=u.value}catch(e){return void r(e)}u.done?t(s):Promise.resolve(s).then(n,o)}function d(e){return function(){var t=this,r=arguments;return new Promise((function(n,o){var i=e.apply(t,r);function a(e){p(i,n,o,a,u,"next",e)}function u(e){p(i,n,o,a,u,"throw",e)}a(void 0)}))}}function h(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function v(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r2&&void 0!==arguments[2]?arguments[2]:{},i=o.allOwnKeys,a=void 0!==i&&i;if(null!=e)if("object"!==f(e)&&(e=[e]),L(e))for(r=0,n=e.length;r0;)if(t===(r=n[o]).toLowerCase())return r;return null}var Q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:global,Z=function(e){return!N(e)&&e!==Q};var ee,te=(ee="undefined"!=typeof Uint8Array&&R(Uint8Array),function(e){return ee&&e instanceof ee}),re=A("HTMLFormElement"),ne=function(e){var t=Object.prototype.hasOwnProperty;return function(e,r){return t.call(e,r)}}(),oe=A("RegExp"),ie=function(e,t){var r=Object.getOwnPropertyDescriptors(e),n={};$(r,(function(r,o){var i;!1!==(i=t(r,o,e))&&(n[o]=i||r)})),Object.defineProperties(e,n)};var ae,ue,se,ce,fe=A("AsyncFunction"),le=(ae="function"==typeof setImmediate,ue=F(Q.postMessage),ae?setImmediate:ue?(se="axios@".concat(Math.random()),ce=[],Q.addEventListener("message",(function(e){var t=e.source,r=e.data;t===Q&&r===se&&ce.length&&ce.shift()()}),!1),function(e){ce.push(e),Q.postMessage(se,"*")}):function(e){return setTimeout(e)}),pe="undefined"!=typeof queueMicrotask?queueMicrotask.bind(Q):"undefined"!=typeof process&&process.nextTick||le,de={isArray:L,isArrayBuffer:_,isBuffer:C,isFormData:function(e){var t;return e&&("function"==typeof FormData&&e instanceof FormData||F(e.append)&&("formdata"===(t=j(e))||"object"===t&&F(e.toString)&&"[object FormData]"===e.toString()))},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&_(e.buffer)},isString:U,isNumber:B,isBoolean:function(e){return!0===e||!1===e},isObject:D,isPlainObject:I,isEmptyObject:function(e){if(!D(e)||C(e))return!1;try{return 0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype}catch(e){return!1}},isReadableStream:K,isRequest:V,isResponse:G,isHeaders:X,isUndefined:N,isDate:q,isFile:M,isBlob:z,isRegExp:oe,isFunction:F,isStream:function(e){return D(e)&&F(e.pipe)},isURLSearchParams:J,isTypedArray:te,isFileList:H,forEach:$,merge:function e(){for(var t=Z(this)&&this||{},r=t.caseless,n=t.skipUndefined,o={},i=function(t,i){var a=r&&Y(o,i)||i;I(o[a])&&I(t)?o[a]=e(o[a],t):I(t)?o[a]=e({},t):L(t)?o[a]=t.slice():n&&N(t)||(o[a]=t)},a=0,u=arguments.length;a3&&void 0!==arguments[3]?arguments[3]:{},o=n.allOwnKeys;return $(t,(function(t,n){r&&F(t)?e[n]=O(t,r):e[n]=t}),{allOwnKeys:o}),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,r,n){e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),r&&Object.assign(e.prototype,r)},toFlatObject:function(e,t,r,n){var o,i,a,u={};if(t=t||{},null==e)return t;do{for(i=(o=Object.getOwnPropertyNames(e)).length;i-- >0;)a=o[i],n&&!n(a,e,t)||u[a]||(t[a]=e[a],u[a]=!0);e=!1!==r&&R(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t},kindOf:j,kindOfTest:A,endsWith:function(e,t,r){e=String(e),(void 0===r||r>e.length)&&(r=e.length),r-=t.length;var n=e.indexOf(t,r);return-1!==n&&n===r},toArray:function(e){if(!e)return null;if(L(e))return e;var t=e.length;if(!B(t))return null;for(var r=new Array(t);t-- >0;)r[t]=e[t];return r},forEachEntry:function(e,t){for(var r,n=(e&&e[k]).call(e);(r=n.next())&&!r.done;){var o=r.value;t.call(e,o[0],o[1])}},matchAll:function(e,t){for(var r,n=[];null!==(r=e.exec(t));)n.push(r);return n},isHTMLForm:re,hasOwnProperty:ne,hasOwnProp:ne,reduceDescriptors:ie,freezeMethods:function(e){ie(e,(function(t,r){if(F(e)&&-1!==["arguments","caller","callee"].indexOf(r))return!1;var n=e[r];F(n)&&(t.enumerable=!1,"writable"in t?t.writable=!1:t.set||(t.set=function(){throw Error("Can not rewrite read-only method '"+r+"'")}))}))},toObjectSet:function(e,t){var r={},n=function(e){e.forEach((function(e){r[e]=!0}))};return L(e)?n(e):n(String(e).split(t)),r},toCamelCase:function(e){return e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))},noop:function(){},toFiniteNumber:function(e,t){return null!=e&&Number.isFinite(e=+e)?e:t},findKey:Y,global:Q,isContextDefined:Z,isSpecCompliantForm:function(e){return!!(e&&F(e.append)&&"FormData"===e[T]&&e[k])},toJSONObject:function(e){var t=new Array(10);return function e(r,n){if(D(r)){if(t.indexOf(r)>=0)return;if(C(r))return r;if(!("toJSON"in r)){t[n]=r;var o=L(r)?[]:{};return $(r,(function(t,r){var i=e(t,n+1);!N(i)&&(o[r]=i)})),t[n]=void 0,o}}return r}(e,0)},isAsyncFn:fe,isThenable:function(e){return e&&(D(e)||F(e))&&F(e.then)&&F(e.catch)},setImmediate:le,asap:pe,isIterable:function(e){return null!=e&&F(e[k])}};function he(e,t,r,n,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),o&&(this.response=o,this.status=o.status?o.status:null)}de.inherits(he,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:de.toJSONObject(this.config),code:this.code,status:this.status}}});var ve=he.prototype,ye={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){ye[e]={value:e}})),Object.defineProperties(he,ye),Object.defineProperty(ve,"isAxiosError",{value:!0}),he.from=function(e,t,r,n,o,i){var a=Object.create(ve);de.toFlatObject(e,a,(function(e){return e!==Error.prototype}),(function(e){return"isAxiosError"!==e}));var u=e&&e.message?e.message:"Error",s=null==t&&e?e.code:t;return he.call(a,u,s,r,n,o),e&&null==a.cause&&Object.defineProperty(a,"cause",{value:e,configurable:!0}),a.name=e&&e.name||"Error",i&&Object.assign(a,i),a};function me(e){return de.isPlainObject(e)||de.isArray(e)}function be(e){return de.endsWith(e,"[]")?e.slice(0,-2):e}function ge(e,t,r){return e?e.concat(t).map((function(e,t){return e=be(e),!r&&t?"["+e+"]":e})).join(r?".":""):t}var we=de.toFlatObject(de,{},null,(function(e){return/^is[A-Z]/.test(e)}));function Ee(e,t,r){if(!de.isObject(e))throw new TypeError("target must be an object");t=t||new FormData;var n=(r=de.toFlatObject(r,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!de.isUndefined(t[e])}))).metaTokens,o=r.visitor||c,i=r.dots,a=r.indexes,u=(r.Blob||"undefined"!=typeof Blob&&Blob)&&de.isSpecCompliantForm(t);if(!de.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(de.isDate(e))return e.toISOString();if(de.isBoolean(e))return e.toString();if(!u&&de.isBlob(e))throw new he("Blob is not supported. Use a Buffer instead.");return de.isArrayBuffer(e)||de.isTypedArray(e)?u&&"function"==typeof Blob?new Blob([e]):Buffer.from(e):e}function c(e,r,o){var u=e;if(e&&!o&&"object"===f(e))if(de.endsWith(r,"{}"))r=n?r:r.slice(0,-2),e=JSON.stringify(e);else if(de.isArray(e)&&function(e){return de.isArray(e)&&!e.some(me)}(e)||(de.isFileList(e)||de.endsWith(r,"[]"))&&(u=de.toArray(e)))return r=be(r),u.forEach((function(e,n){!de.isUndefined(e)&&null!==e&&t.append(!0===a?ge([r],n,i):null===a?r:r+"[]",s(e))})),!1;return!!me(e)||(t.append(ge(o,r,i),s(e)),!1)}var l=[],p=Object.assign(we,{defaultVisitor:c,convertValue:s,isVisitable:me});if(!de.isObject(e))throw new TypeError("data must be an object");return function e(r,n){if(!de.isUndefined(r)){if(-1!==l.indexOf(r))throw Error("Circular reference detected in "+n.join("."));l.push(r),de.forEach(r,(function(r,i){!0===(!(de.isUndefined(r)||null===r)&&o.call(t,r,de.isString(i)?i.trim():i,n,p))&&e(r,n?n.concat(i):[i])})),l.pop()}}(e),t}function Oe(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,(function(e){return t[e]}))}function Se(e,t){this._pairs=[],e&&Ee(e,this,t)}var xe=Se.prototype;function Re(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function ke(e,t,r){if(!t)return e;var n=r&&r.encode||Re;de.isFunction(r)&&(r={serialize:r});var o,i=r&&r.serialize;if(o=i?i(t,r):de.isURLSearchParams(t)?t.toString():new Se(t,r).toString(n)){var a=e.indexOf("#");-1!==a&&(e=e.slice(0,a)),e+=(-1===e.indexOf("?")?"?":"&")+o}return e}xe.append=function(e,t){this._pairs.push([e,t])},xe.toString=function(e){var t=e?function(t){return e.call(this,t,Oe)}:Oe;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Te=function(){function e(){h(this,e),this.handlers=[]}return y(e,[{key:"use",value:function(e,t,r){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!r&&r.synchronous,runWhen:r?r.runWhen:null}),this.handlers.length-1}},{key:"eject",value:function(e){this.handlers[e]&&(this.handlers[e]=null)}},{key:"clear",value:function(){this.handlers&&(this.handlers=[])}},{key:"forEach",value:function(e){de.forEach(this.handlers,(function(t){null!==t&&e(t)}))}}]),e}(),je={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ae={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Se,FormData:"undefined"!=typeof FormData?FormData:null,Blob:"undefined"!=typeof Blob?Blob:null},protocols:["http","https","file","blob","url","data"]},Pe="undefined"!=typeof window&&"undefined"!=typeof document,Le="object"===("undefined"==typeof navigator?"undefined":f(navigator))&&navigator||void 0,Ne=Pe&&(!Le||["ReactNative","NativeScript","NS"].indexOf(Le.product)<0),Ce="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope&&"function"==typeof self.importScripts,_e=Pe&&window.location.href||"http://localhost",Ue=u(u({},Object.freeze({__proto__:null,hasBrowserEnv:Pe,hasStandardBrowserWebWorkerEnv:Ce,hasStandardBrowserEnv:Ne,navigator:Le,origin:_e})),Ae);function Fe(e){function t(e,r,n,o){var i=e[o++];if("__proto__"===i)return!0;var a=Number.isFinite(+i),u=o>=e.length;return i=!i&&de.isArray(n)?n.length:i,u?(de.hasOwnProp(n,i)?n[i]=[n[i],r]:n[i]=r,!a):(n[i]&&de.isObject(n[i])||(n[i]=[]),t(e,r,n[i],o)&&de.isArray(n[i])&&(n[i]=function(e){var t,r,n={},o=Object.keys(e),i=o.length;for(t=0;t-1,i=de.isObject(e);if(i&&de.isHTMLForm(e)&&(e=new FormData(e)),de.isFormData(e))return o?JSON.stringify(Fe(e)):e;if(de.isArrayBuffer(e)||de.isBuffer(e)||de.isStream(e)||de.isFile(e)||de.isBlob(e)||de.isReadableStream(e))return e;if(de.isArrayBufferView(e))return e.buffer;if(de.isURLSearchParams(e))return t.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),e.toString();if(i){if(n.indexOf("application/x-www-form-urlencoded")>-1)return function(e,t){return Ee(e,new Ue.classes.URLSearchParams,u({visitor:function(e,t,r,n){return Ue.isNode&&de.isBuffer(e)?(this.append(t,e.toString("base64")),!1):n.defaultVisitor.apply(this,arguments)}},t))}(e,this.formSerializer).toString();if((r=de.isFileList(e))||n.indexOf("multipart/form-data")>-1){var a=this.env&&this.env.FormData;return Ee(r?{"files[]":e}:e,a&&new a,this.formSerializer)}}return i||o?(t.setContentType("application/json",!1),function(e,t,r){if(de.isString(e))try{return(t||JSON.parse)(e),de.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(r||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||Be.transitional,r=t&&t.forcedJSONParsing,n="json"===this.responseType;if(de.isResponse(e)||de.isReadableStream(e))return e;if(e&&de.isString(e)&&(r&&!this.responseType||n)){var o=!(t&&t.silentJSONParsing)&&n;try{return JSON.parse(e,this.parseReviver)}catch(e){if(o){if("SyntaxError"===e.name)throw he.from(e,he.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:Ue.classes.FormData,Blob:Ue.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};de.forEach(["delete","get","head","post","put","patch"],(function(e){Be.headers[e]={}}));var De=Be,Ie=de.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),qe=Symbol("internals");function Me(e){return e&&String(e).trim().toLowerCase()}function ze(e){return!1===e||null==e?e:de.isArray(e)?e.map(ze):String(e)}function He(e,t,r,n,o){return de.isFunction(n)?n.call(this,t,r):(o&&(t=r),de.isString(t)?de.isString(n)?-1!==t.indexOf(n):de.isRegExp(n)?n.test(t):void 0:void 0)}var Je=function(e,t){function r(e){h(this,r),e&&this.set(e)}return y(r,[{key:"set",value:function(e,t,r){var n=this;function o(e,t,r){var o=Me(t);if(!o)throw new Error("header name must be a non-empty string");var i=de.findKey(n,o);(!i||void 0===n[i]||!0===r||void 0===r&&!1!==n[i])&&(n[i||t]=ze(e))}var i=function(e,t){return de.forEach(e,(function(e,r){return o(e,r,t)}))};if(de.isPlainObject(e)||e instanceof this.constructor)i(e,t);else if(de.isString(e)&&(e=e.trim())&&!/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim()))i(function(e){var t,r,n,o={};return e&&e.split("\n").forEach((function(e){n=e.indexOf(":"),t=e.substring(0,n).trim().toLowerCase(),r=e.substring(n+1).trim(),!t||o[t]&&Ie[t]||("set-cookie"===t?o[t]?o[t].push(r):o[t]=[r]:o[t]=o[t]?o[t]+", "+r:r)})),o}(e),t);else if(de.isObject(e)&&de.isIterable(e)){var a,u,s,c={},f=function(e,t){var r="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=w(e))||t&&e&&"number"==typeof e.length){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,a=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return a=e.done,e},e:function(e){u=!0,i=e},f:function(){try{a||null==r.return||r.return()}finally{if(u)throw i}}}}(e);try{for(f.s();!(s=f.n()).done;){var l=s.value;if(!de.isArray(l))throw TypeError("Object iterator must return a key-value pair");c[u=l[0]]=(a=c[u])?de.isArray(a)?[].concat(g(a),[l[1]]):[a,l[1]]:l[1]}}catch(e){f.e(e)}finally{f.f()}i(c,t)}else null!=e&&o(t,e,r);return this}},{key:"get",value:function(e,t){if(e=Me(e)){var r=de.findKey(this,e);if(r){var n=this[r];if(!t)return n;if(!0===t)return function(e){for(var t,r=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;t=n.exec(e);)r[t[1]]=t[2];return r}(n);if(de.isFunction(t))return t.call(this,n,r);if(de.isRegExp(t))return t.exec(n);throw new TypeError("parser must be boolean|regexp|function")}}}},{key:"has",value:function(e,t){if(e=Me(e)){var r=de.findKey(this,e);return!(!r||void 0===this[r]||t&&!He(0,this[r],r,t))}return!1}},{key:"delete",value:function(e,t){var r=this,n=!1;function o(e){if(e=Me(e)){var o=de.findKey(r,e);!o||t&&!He(0,r[o],o,t)||(delete r[o],n=!0)}}return de.isArray(e)?e.forEach(o):o(e),n}},{key:"clear",value:function(e){for(var t=Object.keys(this),r=t.length,n=!1;r--;){var o=t[r];e&&!He(0,this[o],o,e,!0)||(delete this[o],n=!0)}return n}},{key:"normalize",value:function(e){var t=this,r={};return de.forEach(this,(function(n,o){var i=de.findKey(r,o);if(i)return t[i]=ze(n),void delete t[o];var a=e?function(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(function(e,t,r){return t.toUpperCase()+r}))}(o):String(o).trim();a!==o&&delete t[o],t[a]=ze(n),r[a]=!0})),this}},{key:"concat",value:function(){for(var e,t=arguments.length,r=new Array(t),n=0;n1?r-1:0),o=1;o1&&void 0!==arguments[1]?arguments[1]:Date.now();o=i,r=null,n&&(clearTimeout(n),n=null),e.apply(void 0,g(t))};return[function(){for(var e=Date.now(),t=e-o,u=arguments.length,s=new Array(u),c=0;c=i?a(s,e):(r=s,n||(n=setTimeout((function(){n=null,a(r)}),i-t)))},function(){return r&&a(r)}]}de.inherits(Ge,he,{__CANCEL__:!0});var Qe=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3,n=0,o=$e(50,250);return Ye((function(r){var i=r.loaded,a=r.lengthComputable?r.total:void 0,u=i-n,s=o(u);n=i;var c=m({loaded:i,total:a,progress:a?i/a:void 0,bytes:u,rate:s||void 0,estimated:s&&a&&i<=a?(a-i)/s:void 0,event:r,lengthComputable:null!=a},t?"download":"upload",!0);e(c)}),r)},Ze=function(e,t){var r=null!=e;return[function(n){return t[0]({lengthComputable:r,total:e,loaded:n})},t[1]]},et=function(e){return function(){for(var t=arguments.length,r=new Array(t),n=0;n1?t-1:0),n=1;n1?"since :\n"+s.map(xt).join("\n"):" "+xt(s[0]):"as no adapter specified"),"ERR_NOT_SUPPORT")}return n},adapters:St};function Tt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ge(null,e)}function jt(e){return Tt(e),e.headers=We.from(e.headers),e.data=Ke.call(e,e.transformRequest),-1!==["post","put","patch"].indexOf(e.method)&&e.headers.setContentType("application/x-www-form-urlencoded",!1),kt.getAdapter(e.adapter||De.adapter,e)(e).then((function(t){return Tt(e),t.data=Ke.call(e,e.transformResponse,t),t.headers=We.from(t.headers),t}),(function(t){return Ve(t)||(Tt(e),t&&t.response&&(t.response.data=Ke.call(e,e.transformResponse,t.response),t.response.headers=We.from(t.response.headers))),Promise.reject(t)}))}var At="1.13.2",Pt={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Pt[e]=function(r){return f(r)===e||"a"+(t<1?"n ":" ")+e}}));var Lt={};Pt.transitional=function(e,t,r){function n(e,t){return"[Axios v1.13.2] Transitional option '"+e+"'"+t+(r?". "+r:"")}return function(r,o,i){if(!1===e)throw new he(n(o," has been removed"+(t?" in "+t:"")),he.ERR_DEPRECATED);return t&&!Lt[o]&&(Lt[o]=!0,console.warn(n(o," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(r,o,i)}},Pt.spelling=function(e){return function(t,r){return console.warn("".concat(r," is likely a misspelling of ").concat(e)),!0}};var Nt={assertOptions:function(e,t,r){if("object"!==f(e))throw new he("options must be an object",he.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),o=n.length;o-- >0;){var i=n[o],a=t[i];if(a){var u=e[i],s=void 0===u||a(u,i,e);if(!0!==s)throw new he("option "+i+" must be "+s,he.ERR_BAD_OPTION_VALUE)}else if(!0!==r)throw new he("Unknown option "+i,he.ERR_BAD_OPTION)}},validators:Pt},Ct=Nt.validators,_t=function(){function e(t){h(this,e),this.defaults=t||{},this.interceptors={request:new Te,response:new Te}}var t;return y(e,[{key:"request",value:(t=d(s().mark((function e(t,r){var n,o;return s().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,this._request(t,r);case 3:return e.abrupt("return",e.sent);case 6:if(e.prev=6,e.t0=e.catch(0),e.t0 instanceof Error){n={},Error.captureStackTrace?Error.captureStackTrace(n):n=new Error,o=n.stack?n.stack.replace(/^.+\n/,""):"";try{e.t0.stack?o&&!String(e.t0.stack).endsWith(o.replace(/^.+\n.+\n/,""))&&(e.t0.stack+="\n"+o):e.t0.stack=o}catch(e){}}throw e.t0;case 10:case"end":return e.stop()}}),e,this,[[0,6]])}))),function(e,r){return t.apply(this,arguments)})},{key:"_request",value:function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{};var r=t=it(this.defaults,t),n=r.transitional,o=r.paramsSerializer,i=r.headers;void 0!==n&&Nt.assertOptions(n,{silentJSONParsing:Ct.transitional(Ct.boolean),forcedJSONParsing:Ct.transitional(Ct.boolean),clarifyTimeoutError:Ct.transitional(Ct.boolean)},!1),null!=o&&(de.isFunction(o)?t.paramsSerializer={serialize:o}:Nt.assertOptions(o,{encode:Ct.function,serialize:Ct.function},!0)),void 0!==t.allowAbsoluteUrls||(void 0!==this.defaults.allowAbsoluteUrls?t.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:t.allowAbsoluteUrls=!0),Nt.assertOptions(t,{baseUrl:Ct.spelling("baseURL"),withXsrfToken:Ct.spelling("withXSRFToken")},!0),t.method=(t.method||this.defaults.method||"get").toLowerCase();var a=i&&de.merge(i.common,i[t.method]);i&&de.forEach(["delete","get","head","post","put","patch","common"],(function(e){delete i[e]})),t.headers=We.concat(a,i);var u=[],s=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(s=s&&e.synchronous,u.unshift(e.fulfilled,e.rejected))}));var c,f=[];this.interceptors.response.forEach((function(e){f.push(e.fulfilled,e.rejected)}));var l,p=0;if(!s){var d=[jt.bind(this),void 0];for(d.unshift.apply(d,u),d.push.apply(d,f),l=d.length,c=Promise.resolve(t);p0;)n._listeners[t](e);n._listeners=null}})),this.promise.then=function(e){var t,r=new Promise((function(e){n.subscribe(e),t=e})).then(e);return r.cancel=function(){n.unsubscribe(t)},r},t((function(e,t,o){n.reason||(n.reason=new Ge(e,t,o),r(n.reason))}))}return y(e,[{key:"throwIfRequested",value:function(){if(this.reason)throw this.reason}},{key:"subscribe",value:function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]}},{key:"unsubscribe",value:function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}}},{key:"toAbortSignal",value:function(){var e=this,t=new AbortController,r=function(e){t.abort(e)};return this.subscribe(r),t.signal.unsubscribe=function(){return e.unsubscribe(r)},t.signal}}],[{key:"source",value:function(){var t;return{token:new e((function(e){t=e})),cancel:t}}}]),e}(),Bt=Ft;var Dt={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Dt).forEach((function(e){var t=b(e,2),r=t[0],n=t[1];Dt[n]=r}));var It=Dt;var qt=function e(t){var r=new Ut(t),n=O(Ut.prototype.request,r);return de.extend(n,Ut.prototype,r,{allOwnKeys:!0}),de.extend(n,r,null,{allOwnKeys:!0}),n.create=function(r){return e(it(t,r))},n}(De);return qt.Axios=Ut,qt.CanceledError=Ge,qt.CancelToken=Bt,qt.isCancel=Ve,qt.VERSION=At,qt.toFormData=Ee,qt.AxiosError=he,qt.Cancel=qt.CanceledError,qt.all=function(e){return Promise.all(e)},qt.spread=function(e){return function(t){return e.apply(null,t)}},qt.isAxiosError=function(e){return de.isObject(e)&&!0===e.isAxiosError},qt.mergeConfig=it,qt.AxiosHeaders=We,qt.formToJSON=function(e){return Fe(de.isHTMLForm(e)?new FormData(e):e)},qt.getAdapter=kt.getAdapter,qt.HttpStatusCode=It,qt.default=qt,qt})); +//# sourceMappingURL=axios.min.js.map diff --git a/public/js/bootstrap.bundle.min.js b/public/js/bootstrap.bundle.min.js new file mode 100644 index 0000000..fe19d88 --- /dev/null +++ b/public/js/bootstrap.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v5.3.0 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=N(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return M(s,{delegateTarget:r}),n.oneOff&&P.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return M(n,{delegateTarget:t}),i.oneOff&&P.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function I(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function N(t){return t=t.replace(y,""),T[t]||t}const P={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))I(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==N(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=M(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function M(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function j(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function F(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const H={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${F(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${F(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=j(t.dataset[n])}return e},getDataAttribute:(t,e)=>j(t.getAttribute(`data-bs-${F(e)}`))};class ${static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?H.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?H.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends ${constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),P.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.0"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?i.trim():null}return n(e)},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;P.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))};class q extends W{static get NAME(){return"alert"}close(){if(P.trigger(this._element,"close.bs.alert").defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),P.trigger(this._element,"closed.bs.alert"),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(q,"close"),m(q);const V='[data-bs-toggle="button"]';class K extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=K.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}P.on(document,"click.bs.button.data-api",V,(t=>{t.preventDefault();const e=t.target.closest(V);K.getOrCreateInstance(e).toggle()})),m(K);const Q={endCallback:null,leftCallback:null,rightCallback:null},X={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Y extends ${constructor(t,e){super(),this._element=t,t&&Y.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return Q}static get DefaultType(){return X}static get NAME(){return"swipe"}dispose(){P.off(this._element,".bs.swipe")}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(P.on(this._element,"pointerdown.bs.swipe",(t=>this._start(t))),P.on(this._element,"pointerup.bs.swipe",(t=>this._end(t))),this._element.classList.add("pointer-event")):(P.on(this._element,"touchstart.bs.swipe",(t=>this._start(t))),P.on(this._element,"touchmove.bs.swipe",(t=>this._move(t))),P.on(this._element,"touchend.bs.swipe",(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const U="next",G="prev",J="left",Z="right",tt="slid.bs.carousel",et="carousel",it="active",nt={ArrowLeft:Z,ArrowRight:J},st={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class rt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===et&&this.cycle()}static get Default(){return st}static get DefaultType(){return ot}static get NAME(){return"carousel"}next(){this._slide(U)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(G)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?P.one(this._element,tt,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void P.one(this._element,tt,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?U:G;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&P.on(this._element,"keydown.bs.carousel",(t=>this._keydown(t))),"hover"===this._config.pause&&(P.on(this._element,"mouseenter.bs.carousel",(()=>this.pause())),P.on(this._element,"mouseleave.bs.carousel",(()=>this._maybeEnableCycle()))),this._config.touch&&Y.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))P.on(t,"dragstart.bs.carousel",(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(J)),rightCallback:()=>this._slide(this._directionToOrder(Z)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new Y(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=nt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(".active",this._indicatorsElement);e.classList.remove(it),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(it),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===U,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>P.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r("slide.bs.carousel").defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(it),i.classList.remove(it,c,l),this._isSliding=!1,r(tt)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(".active.carousel-item",this._element)}_getItems(){return z.find(".carousel-item",this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===J?G:U:t===J?U:G}_orderToDirection(t){return p()?t===G?J:Z:t===G?Z:J}static jQueryInterface(t){return this.each((function(){const e=rt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}P.on(document,"click.bs.carousel.data-api","[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(et))return;t.preventDefault();const i=rt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===H.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),P.on(window,"load.bs.carousel.data-api",(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)rt.getOrCreateInstance(e)})),m(rt);const at="show",lt="collapse",ct="collapsing",ht='[data-bs-toggle="collapse"]',dt={parent:null,toggle:!0},ut={parent:"(null|element)",toggle:"boolean"};class ft extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(ht);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return dt}static get DefaultType(){return ut}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>ft.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(P.trigger(this._element,"show.bs.collapse").defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(lt),this._element.classList.add(ct),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt,at),this._element.style[e]="",P.trigger(this._element,"shown.bs.collapse")}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(P.trigger(this._element,"hide.bs.collapse").defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(ct),this._element.classList.remove(lt,at);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(ct),this._element.classList.add(lt),P.trigger(this._element,"hidden.bs.collapse")}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(at)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(ht);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(":scope .collapse .collapse",this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=ft.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}P.on(document,"click.bs.collapse.data-api",ht,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))ft.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(ft);var pt="top",mt="bottom",gt="right",_t="left",bt="auto",vt=[pt,mt,gt,_t],yt="start",wt="end",At="clippingParents",Et="viewport",Tt="popper",Ct="reference",Ot=vt.reduce((function(t,e){return t.concat([e+"-"+yt,e+"-"+wt])}),[]),xt=[].concat(vt,[bt]).reduce((function(t,e){return t.concat([e,e+"-"+yt,e+"-"+wt])}),[]),kt="beforeRead",Lt="read",St="afterRead",Dt="beforeMain",It="main",Nt="afterMain",Pt="beforeWrite",Mt="write",jt="afterWrite",Ft=[kt,Lt,St,Dt,It,Nt,Pt,Mt,jt];function Ht(t){return t?(t.nodeName||"").toLowerCase():null}function $t(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function Wt(t){return t instanceof $t(t).Element||t instanceof Element}function Bt(t){return t instanceof $t(t).HTMLElement||t instanceof HTMLElement}function zt(t){return"undefined"!=typeof ShadowRoot&&(t instanceof $t(t).ShadowRoot||t instanceof ShadowRoot)}const Rt={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];Bt(s)&&Ht(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});Bt(n)&&Ht(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function qt(t){return t.split("-")[0]}var Vt=Math.max,Kt=Math.min,Qt=Math.round;function Xt(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Yt(){return!/^((?!chrome|android).)*safari/i.test(Xt())}function Ut(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&Bt(t)&&(s=t.offsetWidth>0&&Qt(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&Qt(n.height)/t.offsetHeight||1);var r=(Wt(t)?$t(t):window).visualViewport,a=!Yt()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Gt(t){var e=Ut(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Jt(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&zt(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function Zt(t){return $t(t).getComputedStyle(t)}function te(t){return["table","td","th"].indexOf(Ht(t))>=0}function ee(t){return((Wt(t)?t.ownerDocument:t.document)||window.document).documentElement}function ie(t){return"html"===Ht(t)?t:t.assignedSlot||t.parentNode||(zt(t)?t.host:null)||ee(t)}function ne(t){return Bt(t)&&"fixed"!==Zt(t).position?t.offsetParent:null}function se(t){for(var e=$t(t),i=ne(t);i&&te(i)&&"static"===Zt(i).position;)i=ne(i);return i&&("html"===Ht(i)||"body"===Ht(i)&&"static"===Zt(i).position)?e:i||function(t){var e=/firefox/i.test(Xt());if(/Trident/i.test(Xt())&&Bt(t)&&"fixed"===Zt(t).position)return null;var i=ie(t);for(zt(i)&&(i=i.host);Bt(i)&&["html","body"].indexOf(Ht(i))<0;){var n=Zt(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function oe(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function re(t,e,i){return Vt(t,Kt(e,i))}function ae(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function le(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const ce={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=qt(i.placement),l=oe(a),c=[_t,gt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return ae("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:le(t,vt))}(s.padding,i),d=Gt(o),u="y"===l?pt:_t,f="y"===l?mt:gt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=se(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=re(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Jt(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function he(t){return t.split("-")[1]}var de={top:"auto",right:"auto",bottom:"auto",left:"auto"};function ue(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=_t,y=pt,w=window;if(c){var A=se(i),E="clientHeight",T="clientWidth";A===$t(i)&&"static"!==Zt(A=ee(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===pt||(s===_t||s===gt)&&o===wt)&&(y=mt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==_t&&(s!==pt&&s!==mt||o!==wt)||(v=gt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&de),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:Qt(i*s)/s||0,y:Qt(n*s)/s||0}}({x:f,y:m},$t(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const fe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:qt(e.placement),variation:he(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,ue(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,ue(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var pe={passive:!0};const me={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=$t(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,pe)})),a&&l.addEventListener("resize",i.update,pe),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,pe)})),a&&l.removeEventListener("resize",i.update,pe)}},data:{}};var ge={left:"right",right:"left",bottom:"top",top:"bottom"};function _e(t){return t.replace(/left|right|bottom|top/g,(function(t){return ge[t]}))}var be={start:"end",end:"start"};function ve(t){return t.replace(/start|end/g,(function(t){return be[t]}))}function ye(t){var e=$t(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function we(t){return Ut(ee(t)).left+ye(t).scrollLeft}function Ae(t){var e=Zt(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ee(t){return["html","body","#document"].indexOf(Ht(t))>=0?t.ownerDocument.body:Bt(t)&&Ae(t)?t:Ee(ie(t))}function Te(t,e){var i;void 0===e&&(e=[]);var n=Ee(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=$t(n),r=s?[o].concat(o.visualViewport||[],Ae(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Te(ie(r)))}function Ce(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Oe(t,e,i){return e===Et?Ce(function(t,e){var i=$t(t),n=ee(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Yt();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+we(t),y:l}}(t,i)):Wt(e)?function(t,e){var i=Ut(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ce(function(t){var e,i=ee(t),n=ye(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=Vt(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=Vt(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+we(t),l=-n.scrollTop;return"rtl"===Zt(s||i).direction&&(a+=Vt(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(ee(t)))}function xe(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?qt(s):null,r=s?he(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case pt:e={x:a,y:i.y-n.height};break;case mt:e={x:a,y:i.y+i.height};break;case gt:e={x:i.x+i.width,y:l};break;case _t:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?oe(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case yt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case wt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ke(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?At:a,c=i.rootBoundary,h=void 0===c?Et:c,d=i.elementContext,u=void 0===d?Tt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=ae("number"!=typeof g?g:le(g,vt)),b=u===Tt?Ct:Tt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Te(ie(t)),i=["absolute","fixed"].indexOf(Zt(t).position)>=0&&Bt(t)?se(t):t;return Wt(i)?e.filter((function(t){return Wt(t)&&Jt(t,i)&&"body"!==Ht(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=Oe(t,i,n);return e.top=Vt(s.top,e.top),e.right=Kt(s.right,e.right),e.bottom=Kt(s.bottom,e.bottom),e.left=Vt(s.left,e.left),e}),Oe(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(Wt(y)?y:y.contextElement||ee(t.elements.popper),l,h,r),A=Ut(t.elements.reference),E=xe({reference:A,element:v,strategy:"absolute",placement:s}),T=Ce(Object.assign({},v,E)),C=u===Tt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Tt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[gt,mt].indexOf(t)>=0?1:-1,i=[pt,mt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function Le(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?xt:l,h=he(n),d=h?a?Ot:Ot.filter((function(t){return he(t)===h})):vt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ke(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[qt(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const Se={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=qt(g),b=l||(_!==g&&p?function(t){if(qt(t)===bt)return[];var e=_e(t);return[ve(t),e,ve(e)]}(g):[_e(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(qt(i)===bt?Le(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ke(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),I=L?k?gt:_t:k?mt:pt;y[S]>w[S]&&(I=_e(I));var N=_e(I),P=[];if(o&&P.push(D[x]<=0),a&&P.push(D[I]<=0,D[N]<=0),P.every((function(t){return t}))){T=O,E=!1;break}A.set(O,P)}if(E)for(var M=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},j=p?3:1;j>0&&"break"!==M(j);j--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function De(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function Ie(t){return[pt,gt,mt,_t].some((function(e){return t[e]>=0}))}const Ne={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ke(e,{elementContext:"reference"}),a=ke(e,{altBoundary:!0}),l=De(r,n),c=De(a,s,o),h=Ie(l),d=Ie(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},Pe={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=xt.reduce((function(t,i){return t[i]=function(t,e,i){var n=qt(t),s=[_t,pt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[_t,gt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},Me={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=xe({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},je={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ke(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=qt(e.placement),b=he(e.placement),v=!b,y=oe(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?pt:_t,D="y"===y?mt:gt,I="y"===y?"height":"width",N=A[y],P=N+g[S],M=N-g[D],j=f?-T[I]/2:0,F=b===yt?E[I]:T[I],H=b===yt?-T[I]:-E[I],$=e.elements.arrow,W=f&&$?Gt($):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=re(0,E[I],W[I]),V=v?E[I]/2-j-q-z-O.mainAxis:F-q-z-O.mainAxis,K=v?-E[I]/2+j+q+R+O.mainAxis:H+q+R+O.mainAxis,Q=e.elements.arrow&&se(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=N+K-Y,G=re(f?Kt(P,N+V-Y-X):P,N,f?Vt(M,U):M);A[y]=G,k[y]=G-N}if(a){var J,Z="x"===y?pt:_t,tt="x"===y?mt:gt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[pt,_t].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=re(t,e,i);return n>i?i:n}(at,et,lt):re(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function Fe(t,e,i){void 0===i&&(i=!1);var n,s,o=Bt(e),r=Bt(e)&&function(t){var e=t.getBoundingClientRect(),i=Qt(e.width)/t.offsetWidth||1,n=Qt(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=ee(e),l=Ut(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==Ht(e)||Ae(a))&&(c=(n=e)!==$t(n)&&Bt(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:ye(n)),Bt(e)?((h=Ut(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=we(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function He(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var $e={placement:"bottom",modifiers:[],strategy:"absolute"};function We(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(H.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Xe,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=ci.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ze);for(const i of e){const e=ci.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Qe,Xe].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Je)?this:z.prev(this,Je)[0]||z.next(this,Je)[0]||z.findOne(Je,t.delegateTarget.parentNode),o=ci.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}P.on(document,Ue,Je,ci.dataApiKeydownHandler),P.on(document,Ue,ti,ci.dataApiKeydownHandler),P.on(document,Ye,ci.clearMenus),P.on(document,"keyup.bs.dropdown.data-api",ci.clearMenus),P.on(document,Ye,Je,(function(t){t.preventDefault(),ci.getOrCreateInstance(this).toggle()})),m(ci);const hi="show",di="mousedown.bs.backdrop",ui={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},fi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class pi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return ui}static get DefaultType(){return fi}static get NAME(){return"backdrop"}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(hi),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(hi),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(P.off(this._element,di),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),P.on(t,di,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const mi=".bs.focustrap",gi="backward",_i={autofocus:!0,trapElement:null},bi={autofocus:"boolean",trapElement:"element"};class vi extends ${constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return _i}static get DefaultType(){return bi}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),P.off(document,mi),P.on(document,"focusin.bs.focustrap",(t=>this._handleFocusin(t))),P.on(document,"keydown.tab.bs.focustrap",(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,P.off(document,mi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===gi?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?gi:"forward")}}const yi=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",wi=".sticky-top",Ai="padding-right",Ei="margin-right";class Ti{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,Ai,(e=>e+t)),this._setElementAttributes(yi,Ai,(e=>e+t)),this._setElementAttributes(wi,Ei,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,Ai),this._resetElementAttributes(yi,Ai),this._resetElementAttributes(wi,Ei)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&H.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=H.getDataAttribute(t,e);null!==i?(H.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const Ci=".bs.modal",Oi="hidden.bs.modal",xi="show.bs.modal",ki="modal-open",Li="show",Si="modal-static",Di={backdrop:!0,focus:!0,keyboard:!0},Ii={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Ni extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new Ti,this._addEventListeners()}static get Default(){return Di}static get DefaultType(){return Ii}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||P.trigger(this._element,xi,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(ki),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(P.trigger(this._element,"hide.bs.modal").defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(Li),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){P.off(window,Ci),P.off(this._dialog,Ci),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new pi({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(Li),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,P.trigger(this._element,"shown.bs.modal",{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.modal",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),P.on(window,"resize.bs.modal",(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),P.on(this._element,"mousedown.dismiss.bs.modal",(t=>{P.one(this._element,"click.dismiss.bs.modal",(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(ki),this._resetAdjustments(),this._scrollBar.reset(),P.trigger(this._element,Oi)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(P.trigger(this._element,"hidePrevented.bs.modal").defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(Si)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(Si),this._queueCallback((()=>{this._element.classList.remove(Si),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=Ni.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}P.on(document,"click.bs.modal.data-api",'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),P.one(e,xi,(t=>{t.defaultPrevented||P.one(e,Oi,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&Ni.getInstance(i).hide(),Ni.getOrCreateInstance(e).toggle(this)})),R(Ni),m(Ni);const Pi="show",Mi="showing",ji="hiding",Fi=".offcanvas.show",Hi="hidePrevented.bs.offcanvas",$i="hidden.bs.offcanvas",Wi={backdrop:!0,keyboard:!0,scroll:!1},Bi={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class zi extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Wi}static get DefaultType(){return Bi}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||P.trigger(this._element,"show.bs.offcanvas",{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new Ti).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Mi),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Pi),this._element.classList.remove(Mi),P.trigger(this._element,"shown.bs.offcanvas",{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(P.trigger(this._element,"hide.bs.offcanvas").defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(ji),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Pi,ji),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new Ti).reset(),P.trigger(this._element,$i)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new pi({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():P.trigger(this._element,Hi)}:null})}_initializeFocusTrap(){return new vi({trapElement:this._element})}_addEventListeners(){P.on(this._element,"keydown.dismiss.bs.offcanvas",(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():P.trigger(this._element,Hi))}))}static jQueryInterface(t){return this.each((function(){const e=zi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}P.on(document,"click.bs.offcanvas.data-api",'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;P.one(e,$i,(()=>{a(this)&&this.focus()}));const i=z.findOne(Fi);i&&i!==e&&zi.getInstance(i).hide(),zi.getOrCreateInstance(e).toggle(this)})),P.on(window,"load.bs.offcanvas.data-api",(()=>{for(const t of z.find(Fi))zi.getOrCreateInstance(t).show()})),P.on(window,"resize.bs.offcanvas",(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&zi.getOrCreateInstance(t).hide()})),R(zi),m(zi);const Ri={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},qi=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Vi=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Ki=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!qi.has(i)||Boolean(Vi.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Qi={allowList:Ri,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
    "},Xi={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Yi={entry:"(string|element|function|null)",selector:"(string|element)"};class Ui extends ${constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Qi}static get DefaultType(){return Xi}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Yi)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Ki(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Gi=new Set(["sanitize","allowList","sanitizeFn"]),Ji="fade",Zi="show",tn=".modal",en="hide.bs.modal",nn="hover",sn="focus",on={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},rn={allowList:Ri,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},an={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class ln extends W{constructor(t,e){if(void 0===Ve)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return rn}static get DefaultType(){return an}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),P.off(this._element.closest(tn),en,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=P.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),P.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(Zi),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.on(t,"mouseover",h);this._queueCallback((()=>{P.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!P.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(Zi),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))P.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),P.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(Ji,Zi),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(Ji),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Ui({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(Ji)}_isShown(){return this.tip&&this.tip.classList.contains(Zi)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=on[e.toUpperCase()];return qe(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)P.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===nn?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===nn?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");P.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?sn:nn]=!0,e._enter()})),P.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?sn:nn]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},P.on(this._element.closest(tn),en,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=H.getDataAttributes(this._element);for(const t of Object.keys(e))Gi.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=ln.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(ln);const cn={...ln.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},hn={...ln.DefaultType,content:"(null|string|element|function)"};class dn extends ln{static get Default(){return cn}static get DefaultType(){return hn}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=dn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(dn);const un="click.bs.scrollspy",fn="active",pn="[href]",mn={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},gn={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class _n extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return mn}static get DefaultType(){return gn}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(P.off(this._config.target,un),P.on(this._config.target,un,pn,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(pn,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(fn),this._activateParents(t),P.trigger(this._element,"activate.bs.scrollspy",{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(fn);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,".nav-link, .nav-item > .nav-link, .list-group-item"))t.classList.add(fn)}_clearActiveClass(t){t.classList.remove(fn);const e=z.find("[href].active",t);for(const t of e)t.classList.remove(fn)}static jQueryInterface(t){return this.each((function(){const e=_n.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(window,"load.bs.scrollspy.data-api",(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))_n.getOrCreateInstance(t)})),m(_n);const bn="ArrowLeft",vn="ArrowRight",yn="ArrowUp",wn="ArrowDown",An="active",En="fade",Tn="show",Cn='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',On=`.nav-link:not(.dropdown-toggle), .list-group-item:not(.dropdown-toggle), [role="tab"]:not(.dropdown-toggle), ${Cn}`;class xn extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),P.on(this._element,"keydown.bs.tab",(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?P.trigger(e,"hide.bs.tab",{relatedTarget:t}):null;P.trigger(t,"show.bs.tab",{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(An),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),P.trigger(t,"shown.bs.tab",{relatedTarget:e})):t.classList.add(Tn)}),t,t.classList.contains(En)))}_deactivate(t,e){t&&(t.classList.remove(An),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),P.trigger(t,"hidden.bs.tab",{relatedTarget:e})):t.classList.remove(Tn)}),t,t.classList.contains(En)))}_keydown(t){if(![bn,vn,yn,wn].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=[vn,wn].includes(t.key),i=b(this._getChildren().filter((t=>!l(t))),t.target,e,!0);i&&(i.focus({preventScroll:!0}),xn.getOrCreateInstance(i).show())}_getChildren(){return z.find(On,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(".dropdown-toggle",An),n(".dropdown-menu",Tn),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(An)}_getInnerElement(t){return t.matches(On)?t:z.findOne(On,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=xn.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}P.on(document,"click.bs.tab",Cn,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||xn.getOrCreateInstance(this).show()})),P.on(window,"load.bs.tab",(()=>{for(const t of z.find('.active[data-bs-toggle="tab"], .active[data-bs-toggle="pill"], .active[data-bs-toggle="list"]'))xn.getOrCreateInstance(t)})),m(xn);const kn="hide",Ln="show",Sn="showing",Dn={animation:"boolean",autohide:"boolean",delay:"number"},In={animation:!0,autohide:!0,delay:5e3};class Nn extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return In}static get DefaultType(){return Dn}static get NAME(){return"toast"}show(){P.trigger(this._element,"show.bs.toast").defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(kn),d(this._element),this._element.classList.add(Ln,Sn),this._queueCallback((()=>{this._element.classList.remove(Sn),P.trigger(this._element,"shown.bs.toast"),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(P.trigger(this._element,"hide.bs.toast").defaultPrevented||(this._element.classList.add(Sn),this._queueCallback((()=>{this._element.classList.add(kn),this._element.classList.remove(Sn,Ln),P.trigger(this._element,"hidden.bs.toast")}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(Ln),super.dispose()}isShown(){return this._element.classList.contains(Ln)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){P.on(this._element,"mouseover.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"mouseout.bs.toast",(t=>this._onInteraction(t,!1))),P.on(this._element,"focusin.bs.toast",(t=>this._onInteraction(t,!0))),P.on(this._element,"focusout.bs.toast",(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=Nn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(Nn),m(Nn),{Alert:q,Button:K,Carousel:rt,Collapse:ft,Dropdown:ci,Modal:Ni,Offcanvas:zi,Popover:dn,ScrollSpy:_n,Tab:xn,Toast:Nn,Tooltip:ln}})); +//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/schemas/brain-output.schema.json b/schemas/brain-output.schema.json new file mode 100644 index 0000000..2f4db91 --- /dev/null +++ b/schemas/brain-output.schema.json @@ -0,0 +1,119 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "touchdog-brain-output", + "title": "Touchdog Brain Output Schema", + "description": "Brain决策层输出的图片规划数据结构", + "type": "object", + "required": ["analysis", "images"], + "properties": { + "analysis": { + "type": "object", + "description": "产品分析结果", + "required": ["product_category", "core_selling_points", "background_strategy", "logo_color"], + "properties": { + "product_category": { + "type": "string", + "description": "产品品类英文名", + "examples": ["Pet Recovery Cone", "Dog Harness", "Pet Bed"] + }, + "core_selling_points": { + "type": "array", + "description": "选中的核心卖点key列表(3-4个)", + "items": { "type": "string" }, + "minItems": 3, + "maxItems": 4, + "examples": [["lightweight", "waterproof", "breathable"]] + }, + "background_strategy": { + "type": "string", + "description": "背景亮度策略", + "enum": ["light", "dark", "mixed"] + }, + "logo_color": { + "type": "string", + "description": "Logo颜色选择", + "enum": ["red", "white"] + }, + "visual_style": { + "type": "string", + "description": "整体视觉风格描述", + "examples": ["Warm, caring home environment emphasizing comfort and ease"] + } + } + }, + "images": { + "type": "array", + "description": "12张图片的规划", + "minItems": 12, + "maxItems": 12, + "items": { + "type": "object", + "required": ["id", "type", "purpose", "layout_description", "ai_prompt", "logo_placement"], + "properties": { + "id": { + "type": "string", + "description": "图片ID", + "pattern": "^(Main_0[1-6]|APlus_0[1-6])$", + "examples": ["Main_01", "APlus_01"] + }, + "type": { + "type": "string", + "description": "图片类型", + "examples": ["Hero Scene + Key Benefits", "Product Detail + Craftsmanship", "Competitor Comparison"] + }, + "purpose": { + "type": "string", + "description": "这张图的营销目的(中文)", + "examples": ["首图决定点击率,展示产品使用状态+核心卖点"] + }, + "layout_description": { + "type": "string", + "description": "布局描述(中文,给人审核用)", + "examples": ["上半部分:布偶猫佩戴冰蓝色伊丽莎白圈,在温馨的木质家居架子上。下半部分:浅蓝色圆弧Banner..."] + }, + "ai_prompt": { + "type": "string", + "description": "完整的英文AI生图Prompt", + "minLength": 100 + }, + "logo_placement": { + "type": "object", + "description": "Logo放置信息", + "required": ["position", "type", "color"], + "properties": { + "position": { + "type": "string", + "description": "Logo位置", + "enum": ["bottom-right", "bottom-left", "top-right", "top-left", "center", "none"] + }, + "type": { + "type": "string", + "description": "Logo类型", + "enum": ["combined", "graphic_only", "text_only", "none"] + }, + "color": { + "type": "string", + "description": "Logo颜色", + "enum": ["red", "white", "auto"] + } + } + }, + "aspect_ratio": { + "type": "string", + "description": "图片宽高比", + "enum": ["1:1", "3:2"], + "default": "1:1" + }, + "is_comparison": { + "type": "boolean", + "description": "是否是竞品对比图", + "default": false + } + } + } + } + } +} + + + diff --git a/schemas/sku-input.schema.json b/schemas/sku-input.schema.json new file mode 100644 index 0000000..d0e7af4 --- /dev/null +++ b/schemas/sku-input.schema.json @@ -0,0 +1,219 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "touchdog-sku-input", + "title": "Touchdog SKU Input Schema", + "description": "用于AI电商图片生成的SKU输入数据结构", + "type": "object", + "required": ["sku_id", "product_name", "brand", "color", "selling_points", "specs", "ref_images"], + "properties": { + "sku_id": { + "type": "string", + "description": "SKU唯一标识符", + "examples": ["TD-EC-001-IBLUE"] + }, + "product_name": { + "type": "string", + "description": "产品英文名称", + "examples": ["Cat Soft Cone Collar"] + }, + "product_name_cn": { + "type": "string", + "description": "产品中文名称", + "examples": ["伊丽莎白圈"] + }, + "brand": { + "type": "string", + "description": "品牌名称", + "const": "Touchdog" + }, + "color": { + "type": "object", + "description": "颜色信息", + "required": ["name", "hex"], + "properties": { + "name": { + "type": "string", + "description": "颜色英文名", + "examples": ["Ice Blue", "Mint Green", "Coral Pink"] + }, + "name_cn": { + "type": "string", + "description": "颜色中文名", + "examples": ["冰蓝色", "薄荷绿", "珊瑚粉"] + }, + "series": { + "type": "string", + "description": "色系系列", + "enum": ["Iridescent", "Solid", "Macaron", "Floral"], + "examples": ["Iridescent"] + }, + "hex": { + "type": "string", + "description": "主色HEX值", + "pattern": "^#[0-9A-Fa-f]{6}$", + "examples": ["#B0E0E6"] + }, + "edge_color": { + "type": "string", + "description": "边缘包边颜色HEX值", + "pattern": "^#[0-9A-Fa-f]{6}$", + "examples": ["#7FDBDB"] + } + } + }, + "selling_points": { + "type": "array", + "description": "产品卖点列表", + "minItems": 1, + "items": { + "type": "object", + "required": ["key", "title_en"], + "properties": { + "key": { + "type": "string", + "description": "卖点唯一标识", + "examples": ["lightweight", "waterproof", "breathable", "adjustable", "wide_view", "foldable"] + }, + "title_en": { + "type": "string", + "description": "卖点英文标题(用于图片显示)", + "examples": ["LIGHTER THAN AN EGG", "WATERPROOF & EASY WIPE"] + }, + "title_cn": { + "type": "string", + "description": "卖点中文标题", + "examples": ["极致轻盈", "防水易清洁"] + }, + "value": { + "type": "string", + "description": "具体数值(如有)", + "examples": ["65g", "24.5cm"] + }, + "description_en": { + "type": "string", + "description": "卖点英文描述", + "examples": ["Cloud-light comfort, won't restrict pet activity"] + }, + "description_cn": { + "type": "string", + "description": "卖点中文描述", + "examples": ["云感舒适,不束缚宠物活动"] + }, + "visual_prompt": { + "type": "string", + "description": "视觉化表达提示(用于AI生图)", + "examples": ["product shown next to an egg for size comparison", "water droplets beading on the surface"] + } + } + } + }, + "specs": { + "type": "object", + "description": "产品规格", + "required": ["weight", "sizes"], + "properties": { + "weight": { + "type": "string", + "description": "产品重量", + "examples": ["65g"] + }, + "depth_cm": { + "type": "string", + "description": "圈深度(厘米)", + "examples": ["24.5"] + }, + "sizes": { + "type": "array", + "description": "可用尺码", + "items": { + "type": "string", + "enum": ["XS", "S", "M", "L", "XL"] + }, + "examples": [["XS", "S", "M", "L", "XL"]] + }, + "size_chart": { + "type": "array", + "description": "尺码对照表", + "items": { + "type": "object", + "properties": { + "size": { "type": "string" }, + "neck_range_cm": { "type": "string" }, + "neck_range_in": { "type": "string" }, + "depth_cm": { "type": "string" }, + "depth_in": { "type": "string" } + } + } + }, + "materials": { + "type": "object", + "description": "材质信息", + "properties": { + "outer": { + "type": "string", + "description": "外层材质", + "examples": ["Durable Waterproof PU"] + }, + "inner": { + "type": "string", + "description": "内层材质", + "examples": ["95% Cotton + 5% Spandex"] + } + } + } + } + }, + "use_cases": { + "type": "array", + "description": "使用场景列表", + "items": { + "type": "object", + "required": ["name_en"], + "properties": { + "name_en": { + "type": "string", + "description": "场景英文名", + "examples": ["Postoperative Care", "Eye Drop Application", "Nail Trimming", "Grooming"] + }, + "name_cn": { + "type": "string", + "description": "场景中文名", + "examples": ["术后恢复", "驱虫护理", "指甲修剪", "美容护理"] + }, + "visual_prompt": { + "type": "string", + "description": "场景视觉化提示", + "examples": ["cat resting comfortably after surgery wearing the cone"] + } + } + } + }, + "ref_images": { + "type": "array", + "description": "参考图片URLs(用于产品一致性约束)", + "minItems": 1, + "items": { + "type": "string", + "format": "uri" + }, + "examples": [ + ["https://r2.example.com/td-ec-001-flat.jpg", "https://r2.example.com/td-ec-001-worn.jpg"] + ] + }, + "pet_type": { + "type": "string", + "description": "适用宠物类型", + "enum": ["cat", "dog", "both"], + "default": "cat" + }, + "target_market": { + "type": "string", + "description": "目标市场", + "enum": ["us", "eu", "global"], + "default": "global" + } + } +} + + + diff --git a/server.js b/server.js new file mode 100644 index 0000000..e6de5e6 --- /dev/null +++ b/server.js @@ -0,0 +1,624 @@ +require('dotenv').config(); +const express = require('express'); +const multer = require('multer'); +const { S3Client, PutObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3'); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const cors = require('cors'); + +// 导入新模块 +const { planImages } = require('./lib/brain'); +const { injectConstraints, getAspectRatio } = require('./lib/constraint-injector'); + +const app = express(); +const port = process.env.PORT || 3000; + +app.use(cors()); +app.use(express.json({ limit: '50mb' })); +app.use(express.static('public')); + +// Configure R2 Client +const bucketName = process.env.R2_BUCKET_NAME || 'ai-flow'; +console.log('Using R2 Bucket:', bucketName); + +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +// Multer for memory storage (upload directly to R2) +const upload = multer({ storage: multer.memoryStorage() }); + +// ============================================ +// 原有API端点 +// ============================================ + +// Endpoint to get prompt template +app.get('/api/prompt-template', (req, res) => { + try { + const promptPath = path.join(__dirname, 'prompt.md'); + const content = fs.readFileSync(promptPath, 'utf-8'); + res.json({ content }); + } catch (error) { + res.status(500).json({ error: 'Failed to read prompt template' }); + } +}); + +// Endpoint to upload to R2 +app.post('/api/upload-r2', upload.array('files'), async (req, res) => { + try { + const files = req.files; + if (!files || files.length === 0) { + return res.status(400).json({ error: 'No files uploaded' }); + } + + const uploadedUrls = []; + + for (const file of files) { + const fileName = `${Date.now()}-${file.originalname}`; + const command = new PutObjectCommand({ + Bucket: bucketName, + Key: fileName, + Body: file.buffer, + ContentType: file.mimetype, + }); + + await r2Client.send(command); + + const publicUrl = process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${bucketName}/${fileName}`; + + uploadedUrls.push(publicUrl); + } + + res.json({ urls: uploadedUrls }); + } catch (error) { + console.error('R2 Upload Error:', error); + res.status(500).json({ error: 'Upload failed: ' + error.message }); + } +}); + +// Endpoint to delete from R2 +app.delete('/api/delete-r2', async (req, res) => { + try { + const { url } = req.body; + if (!url) return res.status(400).json({ error: 'URL is required' }); + + const urlObj = new URL(url); + const key = decodeURIComponent(urlObj.pathname.substring(1)); + + const bucketName = process.env.R2_BUCKET_NAME || 'ai-flow'; + + await r2Client.send(new DeleteObjectCommand({ + Bucket: bucketName, + Key: key, + })); + + res.json({ success: true }); + } catch (error) { + console.error('R2 Delete Error:', error); + res.status(500).json({ error: 'Delete failed: ' + error.message }); + } +}); + +// Endpoint to generate prompts (LLM) - 保留原有功能 +app.post('/api/generate-prompts', async (req, res) => { + try { + const { prompt } = req.body; + + const response = await axios.post('https://api2img.shubiaobiao.com/v1/chat/completions', { + model: 'gemini-3-pro-preview', + messages: [ + { role: 'user', content: prompt } + ], + stream: false + }, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + } + }); + + res.json({ data: response.data }); + } catch (error) { + console.error('LLM API Error:', error.response?.data || error.message); + res.status(500).json({ error: 'Prompt generation failed' }); + } +}); + +// Endpoint to generate image (Sync) - 保留原有功能 +app.post('/api/generate-image', async (req, res) => { + try { + const { prompt, aspectRatio, refImages } = req.body; + console.log('Generate Image Request:', { promptLength: prompt?.length, refImagesCount: refImages?.length }); + + let finalPrompt = prompt; + let ar = aspectRatio || '1:1'; + + const arMatch = prompt.match(/--ar\s+(\d+:\d+)/i); + if (arMatch) { + ar = arMatch[1]; + } + + const payload = { + model: 'gemini-3-pro-image-preview', + prompt: finalPrompt, + n: 1, + size: "1K", + aspect_ratio: ar + }; + + if (refImages && Array.isArray(refImages) && refImages.length > 0) { + payload.image_urls = refImages; + } + + const response = await axios.post('https://api2img.shubiaobiao.com/v1/images/generations', payload, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + }, + timeout: 120000 + }); + + res.json(response.data); + } catch (error) { + console.error('Image Gen API Error:', error.response?.data || error.message); + res.status(500).json({ error: 'Image generation failed' }); + } +}); + +// Endpoint to get image result +app.post('/api/get-image-result', async (req, res) => { + try { + const { id } = req.body; + if (!id) return res.status(400).json({ error: 'Task ID is required' }); + + const queryUrl = process.env.IMAGE_QUERY_API_URL || 'https://api.wuyinkeji.com/api/img/drawDetail'; + + const response = await axios.get(queryUrl, { + params: { + key: process.env.API_KEY, + id: id + }, + headers: { 'Content-Type': 'application/json' } + }); + + res.json(response.data); + } catch (error) { + console.error('Image Query API Error:', error.response?.data || error.message); + res.status(500).json({ error: 'Failed to query image result' }); + } +}); + +// ============================================ +// 新增API端点 - SKU智能生图 +// ============================================ + +/** + * 获取Brain System Prompt + */ +app.get('/api/brain-prompt', (req, res) => { + try { + const promptPath = path.join(__dirname, 'prompts/brain-system.md'); + const content = fs.readFileSync(promptPath, 'utf-8'); + res.json({ content }); + } catch (error) { + res.status(500).json({ error: 'Failed to read brain prompt' }); + } +}); + +/** + * 获取示例SKU数据 + */ +app.get('/api/sample-sku', (req, res) => { + try { + const skuPath = path.join(__dirname, 'data/sample-sku.json'); + const content = fs.readFileSync(skuPath, 'utf-8'); + res.json(JSON.parse(content)); + } catch (error) { + res.status(500).json({ error: 'Failed to read sample SKU' }); + } +}); + +/** + * Stage 1: Brain决策 - 生成图片规划 + * POST /api/plan-images + * Body: { sku: SKU数据对象 } + * Returns: { plan: Brain输出的图片规划 } + */ +app.post('/api/plan-images', async (req, res) => { + try { + const { sku } = req.body; + + if (!sku || !sku.sku_id) { + return res.status(400).json({ error: 'SKU data is required' }); + } + + console.log(`Planning images for SKU: ${sku.sku_id}`); + + const plan = await planImages(sku, { + apiKey: process.env.API_KEY + }); + + res.json({ + success: true, + sku_id: sku.sku_id, + plan + }); + } catch (error) { + console.error('Plan Images Error:', error.message); + res.status(500).json({ error: 'Failed to plan images: ' + error.message }); + } +}); + +/** + * Stage 2: 生成单张图片(带约束注入) + * POST /api/generate-image-with-constraints + * Body: { sku, imageSpec, plan } + * Returns: { imageUrl } + */ +app.post('/api/generate-image-with-constraints', async (req, res) => { + try { + const { sku, imageSpec } = req.body; + + if (!sku || !imageSpec) { + return res.status(400).json({ error: 'SKU and imageSpec are required' }); + } + + // 注入约束 + const isComparison = imageSpec.is_comparison || imageSpec.id === 'APlus_02'; + const fullPrompt = injectConstraints( + imageSpec.ai_prompt, + sku, + { + isComparison, + logoPlacement: imageSpec.logo_placement || {} + } + ); + + // 确定宽高比 + const aspectRatio = getAspectRatio(imageSpec.id); + + console.log(`Generating image ${imageSpec.id} for SKU ${sku.sku_id}`); + + // 调用图像生成API + const payload = { + model: 'gemini-3-pro-image-preview', + prompt: fullPrompt, + n: 1, + size: "1K", + aspect_ratio: aspectRatio + }; + + // 添加参考图 + if (sku.ref_images && sku.ref_images.length > 0) { + payload.image_urls = sku.ref_images; + } + + const response = await axios.post('https://api2img.shubiaobiao.com/v1/images/generations', payload, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + }, + timeout: 180000 // 3分钟超时 + }); + + // 提取图片URL + let imageUrl = null; + if (response.data.data && Array.isArray(response.data.data) && response.data.data.length > 0) { + imageUrl = response.data.data[0].url; + } + + res.json({ + success: true, + image_id: imageSpec.id, + image_url: imageUrl, + aspect_ratio: aspectRatio + }); + + } catch (error) { + console.error('Generate Image With Constraints Error:', error.response?.data || error.message); + res.status(500).json({ error: 'Image generation failed: ' + error.message }); + } +}); + +/** + * 完整流程:为单个SKU生成全部12张图 + * POST /api/generate-sku + * Body: { sku: SKU数据对象 } + * Returns: { results: [{ id, url, status }] } + */ +app.post('/api/generate-sku', async (req, res) => { + try { + const { sku } = req.body; + + if (!sku || !sku.sku_id) { + return res.status(400).json({ error: 'SKU data is required' }); + } + + console.log(`\n========== Starting SKU Generation: ${sku.sku_id} ==========`); + + // Stage 1: Brain规划 + console.log('Stage 1: Planning images...'); + const plan = await planImages(sku, { apiKey: process.env.API_KEY }); + console.log(`Plan generated with ${plan.images.length} images`); + + // Stage 2: 逐张生成图片 + console.log('Stage 2: Generating images...'); + const results = []; + + for (const imageSpec of plan.images) { + try { + console.log(` Generating ${imageSpec.id}...`); + + // 注入约束 + const isComparison = imageSpec.is_comparison || imageSpec.id === 'APlus_02'; + const fullPrompt = injectConstraints( + imageSpec.ai_prompt, + sku, + { + isComparison, + logoPlacement: imageSpec.logo_placement || {} + } + ); + + const aspectRatio = getAspectRatio(imageSpec.id); + + const payload = { + model: 'gemini-3-pro-image-preview', + prompt: fullPrompt, + n: 1, + size: "1K", + aspect_ratio: aspectRatio + }; + + if (sku.ref_images && sku.ref_images.length > 0) { + payload.image_urls = sku.ref_images; + } + + const response = await axios.post('https://api2img.shubiaobiao.com/v1/images/generations', payload, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + }, + timeout: 180000 + }); + + let imageUrl = null; + if (response.data.data && Array.isArray(response.data.data) && response.data.data.length > 0) { + imageUrl = response.data.data[0].url; + } + + results.push({ + id: imageSpec.id, + type: imageSpec.type, + purpose: imageSpec.purpose, + url: imageUrl, + status: imageUrl ? 'success' : 'failed', + aspect_ratio: aspectRatio + }); + + console.log(` ✓ ${imageSpec.id} generated`); + + // 添加小延迟避免API限流 + await new Promise(resolve => setTimeout(resolve, 1000)); + + } catch (imgError) { + console.error(` ✗ ${imageSpec.id} failed:`, imgError.message); + results.push({ + id: imageSpec.id, + type: imageSpec.type, + purpose: imageSpec.purpose, + url: null, + status: 'failed', + error: imgError.message + }); + } + } + + const successCount = results.filter(r => r.status === 'success').length; + console.log(`\n========== SKU Generation Complete: ${successCount}/${results.length} ==========\n`); + + res.json({ + success: true, + sku_id: sku.sku_id, + plan: { + analysis: plan.analysis, + image_count: plan.images.length + }, + results, + summary: { + total: results.length, + success: successCount, + failed: results.length - successCount + } + }); + + } catch (error) { + console.error('Generate SKU Error:', error.message); + res.status(500).json({ error: 'SKU generation failed: ' + error.message }); + } +}); + +/** + * 批量生成:为多个SKU生成图片 + * POST /api/batch-generate + * Body: { skus: [SKU数据数组], concurrency: 并发数 } + * Returns: { results: [{ sku_id, status, images }] } + */ +app.post('/api/batch-generate', async (req, res) => { + try { + const { skus, concurrency = 1 } = req.body; + + if (!skus || !Array.isArray(skus) || skus.length === 0) { + return res.status(400).json({ error: 'SKUs array is required' }); + } + + console.log(`\n========== Batch Generation Started: ${skus.length} SKUs ==========`); + + const allResults = []; + + // 简单的串行处理(避免API限流) + for (let i = 0; i < skus.length; i++) { + const sku = skus[i]; + console.log(`\nProcessing SKU ${i + 1}/${skus.length}: ${sku.sku_id}`); + + try { + // 调用单个SKU生成 + const plan = await planImages(sku, { apiKey: process.env.API_KEY }); + + const skuResults = { + sku_id: sku.sku_id, + status: 'processing', + images: [], + plan_analysis: plan.analysis + }; + + for (const imageSpec of plan.images) { + try { + const isComparison = imageSpec.is_comparison || imageSpec.id === 'APlus_02'; + const fullPrompt = injectConstraints( + imageSpec.ai_prompt, + sku, + { isComparison, logoPlacement: imageSpec.logo_placement || {} } + ); + + const aspectRatio = getAspectRatio(imageSpec.id); + + const payload = { + model: 'gemini-3-pro-image-preview', + prompt: fullPrompt, + n: 1, + size: "1K", + aspect_ratio: aspectRatio + }; + + if (sku.ref_images && sku.ref_images.length > 0) { + payload.image_urls = sku.ref_images; + } + + const response = await axios.post('https://api2img.shubiaobiao.com/v1/images/generations', payload, { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + }, + timeout: 180000 + }); + + let imageUrl = null; + if (response.data.data && Array.isArray(response.data.data) && response.data.data.length > 0) { + imageUrl = response.data.data[0].url; + } + + skuResults.images.push({ + id: imageSpec.id, + url: imageUrl, + status: imageUrl ? 'success' : 'failed' + }); + + // 延迟避免限流 + await new Promise(resolve => setTimeout(resolve, 1500)); + + } catch (imgErr) { + skuResults.images.push({ + id: imageSpec.id, + url: null, + status: 'failed', + error: imgErr.message + }); + } + } + + const successCount = skuResults.images.filter(img => img.status === 'success').length; + skuResults.status = successCount === skuResults.images.length ? 'complete' : 'partial'; + skuResults.summary = { + total: skuResults.images.length, + success: successCount, + failed: skuResults.images.length - successCount + }; + + allResults.push(skuResults); + console.log(` SKU ${sku.sku_id} complete: ${successCount}/${skuResults.images.length} images`); + + } catch (skuErr) { + console.error(` SKU ${sku.sku_id} failed:`, skuErr.message); + allResults.push({ + sku_id: sku.sku_id, + status: 'failed', + error: skuErr.message, + images: [] + }); + } + } + + const completedCount = allResults.filter(r => r.status === 'complete').length; + console.log(`\n========== Batch Complete: ${completedCount}/${skus.length} SKUs ==========\n`); + + res.json({ + success: true, + total_skus: skus.length, + completed: completedCount, + results: allResults + }); + + } catch (error) { + console.error('Batch Generate Error:', error.message); + res.status(500).json({ error: 'Batch generation failed: ' + error.message }); + } +}); + +/** + * 获取约束预览(调试用) + * POST /api/preview-constraints + */ +app.post('/api/preview-constraints', (req, res) => { + try { + const { sku, imageSpec } = req.body; + + if (!sku) { + return res.status(400).json({ error: 'SKU data is required' }); + } + + const isComparison = imageSpec?.is_comparison || imageSpec?.id === 'APlus_02'; + const fullPrompt = injectConstraints( + imageSpec?.ai_prompt || 'Sample prompt for preview', + sku, + { + isComparison, + logoPlacement: imageSpec?.logo_placement || {} + } + ); + + res.json({ + original_prompt: imageSpec?.ai_prompt || 'Sample prompt for preview', + full_prompt_with_constraints: fullPrompt, + prompt_length: fullPrompt.length + }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// ============================================ +// 启动服务器 +// ============================================ + +app.listen(port, () => { + console.log(`\n🚀 Server running at http://localhost:${port}`); + console.log('📁 Available endpoints:'); + console.log(' GET /api/prompt-template - Get prompt template'); + console.log(' GET /api/brain-prompt - Get brain system prompt'); + console.log(' GET /api/sample-sku - Get sample SKU data'); + console.log(' POST /api/plan-images - Stage 1: Brain planning'); + console.log(' POST /api/generate-sku - Full SKU generation (12 images)'); + console.log(' POST /api/batch-generate - Batch SKU generation'); + console.log(' POST /api/preview-constraints - Preview constraints injection'); + console.log(''); +}); diff --git a/test-generate.js b/test-generate.js new file mode 100644 index 0000000..3765089 --- /dev/null +++ b/test-generate.js @@ -0,0 +1,359 @@ +/** + * 测试脚本:使用素材图片生成电商图片 + * 运行方式: node test-generate.js + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +// 配置 +const SERVER_URL = 'http://localhost:3000'; +const OUTPUT_DIR = path.join(__dirname, 'output'); +const MATERIAL_DIR = path.join(__dirname, '素材/素材/已有的素材'); + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +/** + * 上传图片到R2 + */ +async function uploadToR2(filePath) { + const fileName = `test-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + const contentType = filePath.endsWith('.png') ? 'image/png' : 'image/jpeg'; + + const command = new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: contentType, + }); + + await r2Client.send(command); + + const publicUrl = process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://pub-${process.env.R2_ACCOUNT_ID}.r2.dev/${fileName}`; + + console.log(` 上传成功: ${fileName}`); + return publicUrl; +} + +/** + * 下载图片到本地 + */ +async function downloadImage(url, outputPath) { + try { + const response = await axios.get(url, { responseType: 'arraybuffer', timeout: 60000 }); + fs.writeFileSync(outputPath, response.data); + console.log(` 下载成功: ${path.basename(outputPath)}`); + return true; + } catch (error) { + console.error(` 下载失败: ${error.message}`); + return false; + } +} + +/** + * 主函数 + */ +async function main() { + console.log('\n========================================'); + console.log('Touchdog 电商图片生成测试'); + console.log('========================================\n'); + + // 确保输出目录存在 + if (!fs.existsSync(OUTPUT_DIR)) { + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + } + + // 1. 获取素材图片 + console.log('📁 Step 1: 读取素材图片...'); + const materialFiles = fs.readdirSync(MATERIAL_DIR) + .filter(f => /\.(jpg|jpeg|png)$/i.test(f)) + .slice(0, 3); // 取前3张作为参考 + + console.log(` 找到 ${materialFiles.length} 张素材图片`); + + // 2. 上传素材到R2 + console.log('\n📤 Step 2: 上传素材到R2...'); + const refImageUrls = []; + + for (const file of materialFiles) { + try { + const filePath = path.join(MATERIAL_DIR, file); + const url = await uploadToR2(filePath); + refImageUrls.push(url); + } catch (error) { + console.error(` 上传失败 ${file}: ${error.message}`); + } + } + + if (refImageUrls.length === 0) { + console.error('❌ 没有成功上传任何参考图片,退出'); + process.exit(1); + } + + console.log(` 成功上传 ${refImageUrls.length} 张参考图`); + + // 3. 构建SKU数据 + console.log('\n📝 Step 3: 构建SKU数据...'); + const sku = { + sku_id: 'TD-EC-TEST-001', + product_name: 'Cat Soft Cone Collar', + product_name_cn: '伊丽莎白圈', + brand: 'Touchdog', + color: { + name: 'Ice Blue', + name_cn: '冰蓝色', + series: 'Iridescent', + hex: '#B0E0E6', + edge_color: '#7FDBDB' + }, + selling_points: [ + { + key: 'lightweight', + title_en: 'LIGHTER THAN AN EGG', + title_cn: '极致轻盈', + value: '65g', + description_en: 'Cloud-light comfort at only 65g', + visual_prompt: 'product shown next to an egg for size comparison' + }, + { + key: 'waterproof', + title_en: 'WATERPROOF & EASY WIPE', + title_cn: '防水易清洁', + description_en: 'Waterproof PU fabric, stains wipe clean instantly', + visual_prompt: 'water droplets beading on the surface' + }, + { + key: 'breathable', + title_en: 'BREATHABLE COTTON LINING', + title_cn: '舒适亲肤', + description_en: 'Soft cotton inner layer, comfortable for extended wear', + visual_prompt: 'close-up of soft cotton inner lining' + }, + { + key: 'adjustable', + title_en: 'ADJUSTABLE STRAP', + title_cn: '可调节', + description_en: '3-second on/off, adjustable velcro', + visual_prompt: 'velcro strap being adjusted' + } + ], + specs: { + weight: '65g', + depth_cm: '24.5', + sizes: ['XS', 'S', 'M', 'L', 'XL'], + materials: { + outer: 'Durable Waterproof PU', + inner: '95% Cotton + 5% Spandex' + } + }, + use_cases: [ + { name_en: 'Postoperative Care', name_cn: '术后恢复' }, + { name_en: 'Eye Drop Application', name_cn: '驱虫护理' }, + { name_en: 'Nail Trimming', name_cn: '指甲修剪' }, + { name_en: 'Grooming', name_cn: '美容护理' } + ], + ref_images: refImageUrls + }; + + console.log(' SKU数据准备完成'); + console.log(` 参考图: ${refImageUrls.length} 张`); + + // 4. 调用生成API (只生成前3张测试) + console.log('\n🎨 Step 4: 调用AI生图API...'); + console.log(' (为节省时间,仅生成3张测试图)\n'); + + // 直接调用图像生成API进行测试 + const testPrompts = [ + { + id: 'Main_01', + type: '场景首图+卖点摘要', + prompt: `Professional Amazon main image for Touchdog Cat Soft Cone Collar, 1:1 square format. + +COMPOSITION: +- TOP 60%: A beautiful Ragdoll cat wearing the Ice Blue (#B0E0E6) soft cone collar in a cozy modern home interior with warm wood shelving. Natural soft lighting from window. Cat looks comfortable and relaxed. The cone collar is soft fabric with petal-like segments. + +- BOTTOM 40%: Light blue (#B0E0E6) rounded banner with title "DESIGNED FOR COMFORTABLE RECOVERY" in navy blue text. Below: three small circular images showing: + 1. Product next to an egg showing 65g weight - "LIGHTER THAN AN EGG" + 2. Water droplets on surface - "WATERPROOF & EASY WIPE" + 3. Soft cotton lining detail - "BREATHABLE COTTON LINING" + +PRODUCT REQUIREMENTS: +- Soft cone collar with petal-like fabric segments, NOT rigid plastic +- Color: Ice Blue (#B0E0E6) with teal edge binding (#7FDBDB) +- Embroidered "TOUCHDOG®" logo visible on right petal (2-3 o'clock position) +- Waterproof PU outer, soft cotton inner visible at edges + +STYLE: Clean, professional Amazon listing photo. Warm home aesthetic. High-end pet product photography. + +--ar 1:1` + }, + { + id: 'Main_02', + type: '产品平铺+细节放大', + prompt: `Professional Amazon product detail image for Touchdog Cat Soft Cone Collar, 1:1 square format. + +COMPOSITION: +- CENTER: Ice Blue (#B0E0E6) soft cone collar displayed flat from above on clean white background. Shows full petal-like segment structure. +- Two circular detail callout bubbles with thin lines pointing to product: + 1. Left callout: "DURABLE WATERPROOF PU LAYER" - showing the smooth outer texture + 2. Right callout: "DOUBLE-LAYER COMFORT" - showing the soft ribbed edge binding in teal (#7FDBDB) + +PRODUCT REQUIREMENTS: +- Soft fabric cone with 8-10 petal segments radiating from center +- Visible velcro closure strap +- "TOUCHDOG®" embroidered logo on right side +- Color: Ice Blue (#B0E0E6) main, teal binding + +STYLE: Clean white background product photography. Professional Amazon listing style. Even studio lighting. + +--ar 1:1` + }, + { + id: 'APlus_01', + type: '品牌Banner', + prompt: `Professional Amazon A+ brand banner image for Touchdog Cat Soft Cone Collar, landscape 970x600 format. + +COMPOSITION: +- FULL WIDTH: Warm modern living room scene with a beautiful white cat wearing the Ice Blue soft cone collar, standing gracefully on a light wood surface. +- LEFT SIDE: Large stylized "TOUCHDOG" brand text in coral/pink color with playful font, paw print decorations +- BELOW: "CAT SOFT CONE COLLAR" product name text + +PRODUCT REQUIREMENTS: +- Cat wearing Ice Blue (#B0E0E6) soft cone collar +- Petal-like fabric segments visible +- Collar looks soft and comfortable, not rigid + +ENVIRONMENT: +- Cozy modern home interior +- Soft natural lighting +- Warm neutral tones (beige, cream, light wood) +- Professional lifestyle photography feel + +BRAND ELEMENTS: +- Touchdog logo with heart-shaped dog icon in red +- "wow pretty" tagline + +--ar 3:2` + } + ]; + + const results = []; + + for (const testPrompt of testPrompts) { + console.log(` 生成 ${testPrompt.id}: ${testPrompt.type}...`); + + try { + const payload = { + model: 'gemini-3-pro-image-preview', + prompt: testPrompt.prompt, + n: 1, + size: '1K', + aspect_ratio: testPrompt.id.startsWith('APlus') ? '3:2' : '1:1', + image_urls: refImageUrls + }; + + const response = await axios.post( + 'https://api2img.shubiaobiao.com/v1/images/generations', + payload, + { + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${process.env.API_KEY}` + }, + timeout: 180000 + } + ); + + // 处理响应 - 可能是URL或base64 + const imageData = response.data.data?.[0]; + const outputPath = path.join(OUTPUT_DIR, `${sku.sku_id}-${testPrompt.id}.jpg`); + + if (imageData?.b64_json) { + // Base64格式 - 直接保存 + const imageBuffer = Buffer.from(imageData.b64_json, 'base64'); + fs.writeFileSync(outputPath, imageBuffer); + console.log(` 保存成功: ${path.basename(outputPath)}`); + + results.push({ + id: testPrompt.id, + type: testPrompt.type, + localPath: outputPath, + status: 'success' + }); + + console.log(` ✓ ${testPrompt.id} 生成成功`); + } else if (imageData?.url) { + // URL格式 - 下载保存 + await downloadImage(imageData.url, outputPath); + + results.push({ + id: testPrompt.id, + type: testPrompt.type, + url: imageData.url, + localPath: outputPath, + status: 'success' + }); + + console.log(` ✓ ${testPrompt.id} 生成成功`); + } else { + throw new Error('No image data in response'); + } + + // 延迟避免限流 + await new Promise(r => setTimeout(r, 2000)); + + } catch (error) { + console.error(` ✗ ${testPrompt.id} 生成失败: ${error.message}`); + results.push({ + id: testPrompt.id, + type: testPrompt.type, + status: 'failed', + error: error.message + }); + } + } + + // 5. 输出结果 + console.log('\n========================================'); + console.log('生成结果汇总'); + console.log('========================================'); + + const successCount = results.filter(r => r.status === 'success').length; + console.log(`\n成功: ${successCount}/${results.length}`); + + results.forEach(r => { + const status = r.status === 'success' ? '✓' : '✗'; + console.log(` ${status} ${r.id} - ${r.type}`); + if (r.localPath) { + console.log(` 保存位置: ${r.localPath}`); + } + }); + + console.log(`\n📁 输出目录: ${OUTPUT_DIR}`); + console.log('\n========================================\n'); + + // 保存结果JSON + fs.writeFileSync( + path.join(OUTPUT_DIR, 'generation-results.json'), + JSON.stringify({ sku, results }, null, 2) + ); +} + +// 运行 +main().catch(console.error); + diff --git a/test-vision-extract.js b/test-vision-extract.js new file mode 100644 index 0000000..338be1e --- /dev/null +++ b/test-vision-extract.js @@ -0,0 +1,209 @@ +/** + * 测试Vision自动提取产品特征 + * 目标:验证Vision能否从素材图中自动提取"黄金产品描述" + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +async function uploadToR2(filePath) { + const fileName = `vision-test-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + const publicUrl = process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; + + return publicUrl; +} + +// Vision提取产品特征的Prompt +const VISION_EXTRACT_PROMPT = `Analyze this pet recovery cone product image in EXTREME detail. + +You MUST extract and output the following information as structured JSON: + +{ + "color": { + "primary": "", + "name": "", + "secondary": "" + }, + "shape": { + "type": "", + "petal_count": , + "opening": "", + "description": "" + }, + "material": { + "type": "", + "finish": "", + "texture": "" + }, + "edge_binding": { + "color": "", + "material": "" + }, + "closure": { + "type": "", + "color": "", + "position": "" + }, + "logo": { + "text": "", + "style": "", + "position": "" + }, + "unique_features": [ + "" + ], + "overall_description": "<2-3 sentence summary for image generation prompt>" +} + +Be EXTREMELY precise about colors and structural details. This will be used to generate consistent product images.`; + +async function testVisionExtract(imagePath) { + console.log('📤 上传图片到R2...'); + const imageUrl = await uploadToR2(imagePath); + console.log(' URL:', imageUrl); + + console.log('\n🔍 调用Vision API分析图片...'); + + try { + const response = await axios.post(`${API_BASE}/chat/index`, { + key: API_KEY, + model: 'gemini-3-pro', + content: VISION_EXTRACT_PROMPT, + image_url: imageUrl + }, { + timeout: 60000 + }); + + const content = response.data.data?.choices?.[0]?.message?.content || + response.data.data?.content || + response.data.choices?.[0]?.message?.content; + + if (!content) { + console.error('Vision响应为空'); + console.log('完整响应:', JSON.stringify(response.data, null, 2)); + return null; + } + + console.log('\n📝 Vision原始输出:\n'); + console.log(content); + + // 尝试提取JSON + const jsonMatch = content.match(/\{[\s\S]*\}/); + if (jsonMatch) { + try { + const parsed = JSON.parse(jsonMatch[0]); + console.log('\n✅ 解析后的JSON:\n'); + console.log(JSON.stringify(parsed, null, 2)); + return parsed; + } catch (e) { + console.log('\n⚠️ JSON解析失败,但有输出内容'); + return { raw: content }; + } + } + + return { raw: content }; + + } catch (error) { + console.error('Vision API错误:', error.message); + if (error.response) { + console.error('响应数据:', error.response.data); + } + return null; + } +} + +async function main() { + const MATERIAL_DIR = path.join(__dirname, '素材/素材/已有的素材'); + const flatImagePath = path.join(MATERIAL_DIR, 'IMG_5683.png'); + + console.log('='.repeat(60)); + console.log('🧪 Vision产品特征提取测试'); + console.log('='.repeat(60)); + console.log('\n测试图片:', flatImagePath); + + const result = await testVisionExtract(flatImagePath); + + if (result) { + // 保存结果 + const outputPath = path.join(__dirname, 'vision-extract-result.json'); + fs.writeFileSync(outputPath, JSON.stringify(result, null, 2)); + console.log('\n💾 结果已保存到:', outputPath); + + // 如果成功解析,生成Golden Description + if (result.overall_description || result.shape) { + console.log('\n' + '='.repeat(60)); + console.log('🌟 生成的Golden Product Description:'); + console.log('='.repeat(60)); + + const golden = generateGoldenDescription(result); + console.log(golden); + + fs.writeFileSync( + path.join(__dirname, 'golden-description.txt'), + golden + ); + } + } +} + +function generateGoldenDescription(visionResult) { + if (visionResult.raw) { + return `[需要手动整理Vision输出]\n\n${visionResult.raw}`; + } + + const r = visionResult; + + return ` +EXACT PRODUCT APPEARANCE (AUTO-EXTRACTED BY VISION): + +- Shape: ${r.shape?.petal_count || '?'}-PETAL ${r.shape?.type?.toUpperCase() || 'FLOWER'} shape, ${r.shape?.opening || 'C-shaped'} opening +- Color: ${r.color?.name?.toUpperCase() || 'UNKNOWN'} (${r.color?.primary || '#???'}) +- Material: ${r.material?.finish || 'Glossy'} ${r.material?.type || 'PU'} fabric with ${r.material?.texture || 'smooth'} texture +- Edge binding: ${r.edge_binding?.color || 'TEAL'} ${r.edge_binding?.material || 'ribbed elastic'} around inner neck hole +- Closure: ${r.closure?.color || 'White'} ${r.closure?.type || 'velcro'} on ${r.closure?.position || 'one petal end'} +- Logo: "${r.logo?.text || 'TOUCHDOG'}" ${r.logo?.style || 'embroidered'} on ${r.logo?.position || 'one petal'} + +UNIQUE FEATURES: +${(r.unique_features || []).map(f => `- ${f}`).join('\n') || '- Visible stitching between petals\n- Soft but structured'} + +SUMMARY FOR PROMPTS: +${r.overall_description || 'Pet recovery cone with flower-petal design, soft waterproof material.'} + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes (must have C-opening) +- ❌ NO random brand logos or text +`.trim(); +} + +main().catch(console.error); + diff --git a/test-vision-vs-manual.js b/test-vision-vs-manual.js new file mode 100644 index 0000000..37528e5 --- /dev/null +++ b/test-vision-vs-manual.js @@ -0,0 +1,240 @@ +/** + * 对比测试:Vision自动提取 vs 手写描述 + * 生成Main_02平铺图,对比两者效果 + */ + +require('dotenv').config(); +const axios = require('axios'); +const fs = require('fs'); +const path = require('path'); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +const API_KEY = 'G9rXx3Ag2Xfa7Gs8zou6t6HqeZ'; +const API_BASE = 'https://api.wuyinkeji.com/api'; +const OUTPUT_DIR = path.join(__dirname, 'output_comparison'); +const MATERIAL_DIR = path.join(__dirname, '素材/素材/已有的素材'); + +// R2客户端 +const r2Client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +async function uploadToR2(filePath) { + const fileName = `compare-${Date.now()}-${path.basename(filePath)}`; + const fileBuffer = fs.readFileSync(filePath); + + await r2Client.send(new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME || 'ai-flow', + Key: fileName, + Body: fileBuffer, + ContentType: filePath.endsWith('.png') ? 'image/png' : 'image/jpeg', + })); + + return process.env.R2_PUBLIC_DOMAIN + ? `${process.env.R2_PUBLIC_DOMAIN}/${fileName}` + : `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com/${process.env.R2_BUCKET_NAME}/${fileName}`; +} + +// ======================================== +// 方案A: 手写的Golden Description (V2版) +// ======================================== +const MANUAL_GOLDEN_DESC = ` +EXACT PRODUCT APPEARANCE (MUST MATCH PRECISELY): +- Shape: 8-PETAL FLOWER/FAN shape, C-shaped opening (like Pac-Man), NOT a full circle +- Color: ICE BLUE / Light aqua blue (#C5E8ED approximate) +- Material: Glossy waterproof PU fabric with visible stitching lines between petals +- Edge binding: TEAL/TURQUOISE color binding around the inner neck hole +- Closure: White velcro strap on one petal end +- Logo: "TOUCHDOG®" embroidered in matching blue thread on one petal (small, subtle) +- Texture: Smooth, slightly shiny, NOT matte, NOT cotton fabric +- Structure: Soft but structured, maintains petal shape, NOT floppy + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes +- ❌ NO matte cotton or fleece textures +- ❌ NO random brand logos or text +`; + +// ======================================== +// 方案B: Vision自动提取的Golden Description +// ======================================== +const VISION_GOLDEN_DESC = ` +EXACT PRODUCT APPEARANCE (AUTO-EXTRACTED BY VISION): +- Shape: 7-PETAL FLOWER/FAN shape, C-shaped opening +- Color: PASTEL ICE BLUE (#C3E6E8) +- Material: soft matte/satin synthetic fabric (likely water-resistant polyester/nylon) with smooth, padded/quilted panels texture +- Edge binding: Mint Green (slightly more saturated than body) ribbed knit elastic fabric around inner neck hole +- Closure: white velcro (hook and loop) on large rectangular strip covering the entire bottom-left terminal segment +- Logo: "TOUCHDOG®" embroidered on centered on the middle-right segment + +UNIQUE FEATURES: +- Scalloped outer edge resembling flower petals +- Soft ribbed knit neckline for comfort +- Radial stitching lines creating distinct padded zones +- Large surface area velcro for adjustable sizing + +CRITICAL PROHIBITIONS: +- ❌ NO printed patterns or colorful fabric designs +- ❌ NO hard plastic transparent cones +- ❌ NO fully circular/closed shapes (must have C-opening) +- ❌ NO random brand logos or text +`; + +// Main_02 平铺图 Prompt模板 +function createMain02Prompt(goldenDesc) { + return ` +[PRODUCT FLAT LAY PHOTO - WHITE BACKGROUND] + +${goldenDesc} + +SCENE REQUIREMENTS: +- Product flat lay on PURE WHITE background (#FFFFFF) +- Shot from directly above (bird's eye view / top-down angle) +- Show the full C-shaped opening clearly (gap between velcro ends visible) +- All petals/segments fully visible and spread out +- Clean studio lighting, MINIMAL shadows +- Product fills 70-80% of frame +- Professional Amazon product photography style + +OUTPUT: High quality 1:1 aspect ratio product photo, 8K resolution +`.trim(); +} + +// 生图任务提交 +async function submitImageTask(prompt, refImageUrl) { + const payload = { + key: API_KEY, + prompt: prompt, + img_url: refImageUrl, + aspectRatio: '1:1', + imageSize: '1K' + }; + + const response = await axios.post(`${API_BASE}/img/nanoBanana-pro`, payload); + const taskId = response.data.data?.id; + + if (!taskId) { + throw new Error('No task ID returned'); + } + return taskId; +} + +// 轮询图片结果 +async function pollImageResult(taskId) { + let attempts = 0; + const maxAttempts = 60; + + while (attempts < maxAttempts) { + const response = await axios.get(`${API_BASE}/img/drawDetail`, { + params: { key: API_KEY, id: taskId } + }); + + const data = response.data.data; + + if (data && data.status === 2 && data.image_url) { + return data.image_url; + } else if (data && data.status === 3) { + throw new Error('Generation failed: ' + (data.fail_reason || 'Unknown')); + } + + process.stdout.write('.'); + await new Promise(r => setTimeout(r, 2000)); + attempts++; + } + throw new Error('Timeout waiting for image'); +} + +// 生成单张图 +async function generateImage(name, prompt, refUrl) { + console.log(`\n🎨 生成: ${name}`); + console.log(' 提交任务...'); + + const taskId = await submitImageTask(prompt, refUrl); + console.log(` Task ID: ${taskId}`); + + const imageUrl = await pollImageResult(taskId); + console.log('\n ✓ 生成成功'); + + // 下载保存 + const imgRes = await axios.get(imageUrl, { responseType: 'arraybuffer' }); + const outputPath = path.join(OUTPUT_DIR, `${name}.jpg`); + fs.writeFileSync(outputPath, imgRes.data); + console.log(` ✓ 保存: ${outputPath}`); + + return outputPath; +} + +async function main() { + if (!fs.existsSync(OUTPUT_DIR)) fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + + console.log('='.repeat(60)); + console.log('🔬 Vision提取 vs 手写描述 对比测试'); + console.log('='.repeat(60)); + + // 上传参考图 + console.log('\n📤 上传参考图...'); + const flatImgPath = path.join(MATERIAL_DIR, 'IMG_5683.png'); + const refUrl = await uploadToR2(flatImgPath); + console.log(' 参考图URL:', refUrl); + + // 生成两个版本的Main_02 + const results = []; + + // 版本A: 手写描述 + console.log('\n' + '='.repeat(60)); + console.log('📝 版本A: 手写Golden Description'); + console.log('='.repeat(60)); + const promptA = createMain02Prompt(MANUAL_GOLDEN_DESC); + console.log('Prompt预览:\n', promptA.substring(0, 500) + '...'); + + try { + const pathA = await generateImage('Main_02_Manual', promptA, refUrl); + results.push({ name: 'Manual', path: pathA, success: true }); + } catch (e) { + console.error('版本A失败:', e.message); + results.push({ name: 'Manual', success: false, error: e.message }); + } + + // 版本B: Vision提取 + console.log('\n' + '='.repeat(60)); + console.log('🤖 版本B: Vision自动提取Golden Description'); + console.log('='.repeat(60)); + const promptB = createMain02Prompt(VISION_GOLDEN_DESC); + console.log('Prompt预览:\n', promptB.substring(0, 500) + '...'); + + try { + const pathB = await generateImage('Main_02_Vision', promptB, refUrl); + results.push({ name: 'Vision', path: pathB, success: true }); + } catch (e) { + console.error('版本B失败:', e.message); + results.push({ name: 'Vision', success: false, error: e.message }); + } + + // 总结 + console.log('\n' + '='.repeat(60)); + console.log('📊 对比结果'); + console.log('='.repeat(60)); + console.log(`输出目录: ${OUTPUT_DIR}`); + console.log('\n生成结果:'); + results.forEach(r => { + if (r.success) { + console.log(` ✅ ${r.name}: ${r.path}`); + } else { + console.log(` ❌ ${r.name}: ${r.error}`); + } + }); + + console.log('\n💡 请手动对比两张图片,评估Vision自动提取的效果是否达标'); +} + +main().catch(console.error); + + diff --git a/test_upload.js b/test_upload.js new file mode 100644 index 0000000..d85b588 --- /dev/null +++ b/test_upload.js @@ -0,0 +1,31 @@ +require('dotenv').config(); +const { S3Client, PutObjectCommand } = require('@aws-sdk/client-s3'); + +const client = new S3Client({ + region: 'auto', + endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`, + credentials: { + accessKeyId: process.env.R2_ACCESS_KEY_ID, + secretAccessKey: process.env.R2_SECRET_ACCESS_KEY, + }, + forcePathStyle: true, +}); + +(async () => { + try { + console.log('Attempting upload to bucket:', process.env.R2_BUCKET_NAME); + const command = new PutObjectCommand({ + Bucket: process.env.R2_BUCKET_NAME, + Key: 'test-file.txt', + Body: 'Hello R2', + ContentType: 'text/plain', + }); + await client.send(command); + console.log('Upload successful!'); + } catch (err) { + console.error('Upload Error Details:'); + console.error('Code:', err.Code); + console.error('Message:', err.message); + console.error('Full Error:', err); + } +})(); diff --git a/vision-extract-result.json b/vision-extract-result.json new file mode 100644 index 0000000..a587f06 --- /dev/null +++ b/vision-extract-result.json @@ -0,0 +1,39 @@ +{ + "color": { + "primary": "#C3E6E8", + "name": "Pastel Ice Blue", + "secondary": "#FFFFFF (Velcro), #98DBCF (Neck Ribbing)" + }, + "shape": { + "type": "flower/fan", + "petal_count": 7, + "opening": "C-shaped", + "description": "A flat, semi-circular fan shape composed of padded segments with a scalloped outer edge, designed to wrap into a cone." + }, + "material": { + "type": "synthetic fabric (likely water-resistant polyester/nylon)", + "finish": "soft matte/satin", + "texture": "smooth, padded/quilted panels" + }, + "edge_binding": { + "color": "Mint Green (slightly more saturated than body)", + "material": "ribbed knit elastic fabric" + }, + "closure": { + "type": "velcro (hook and loop)", + "color": "white", + "position": "large rectangular strip covering the entire bottom-left terminal segment" + }, + "logo": { + "text": "TOUCHDOG®", + "style": "embroidered", + "position": "centered on the middle-right segment" + }, + "unique_features": [ + "Scalloped outer edge resembling flower petals", + "Soft ribbed knit neckline for comfort", + "Radial stitching lines creating distinct padded zones", + "Large surface area velcro for adjustable sizing" + ], + "overall_description": "A soft, padded pet recovery collar in pastel ice blue with a scalloped, flower-like shape. It features a comfortable mint-green ribbed knit neck opening, sectioned padding for flexibility, and a prominent white velcro closure strip." +} \ No newline at end of file

    E0Q>dwTHGr5Eml?v4A4cqksyc*{&0*B}<_UWD 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 N7Xi?h+IjWj{{hmn!3F>T literal 0 HcmV?d00001 diff --git a/public/fonts/bootstrap-icons.woff2 b/public/fonts/bootstrap-icons.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..52b12533e4da87cb83e50039430cd027b48f931a GIT binary patch literal 121084 zcmZs>1CS=owzmDWZQFKF+qP{@+qP}nwrx+_wykMQTi?9%T-4VV<9 z2LRIp3IHVp3$}y^xc1R5DQt=IYme{ob2TNmG$j;}EXfK7eCVq#r#s);o23K)WR%{_ z%ZME+TBhFTze93{*LDFqUiHXoi6{08Z~Ff4p_eGClC{0u#LCjxEkw(V5Gu=*go9(8WTU@-sUy&ZWn>)5ivL(jrvoyag?U1|0vSjGNV7wo( zC0A7$+EwBmO=o%IS(JQydb3|iit0FKV!zA&-D9Fr1!CHZfj3<$V}h2K3|#^G1p zGdn|3=Z$vD(Z!H?Y;YOuv%|Y7Q66btb5L}i$p?t(poABk`b1O1cYf^Ml$^}NGAO_P zm`kctOT(-KLYl2FJ&0q5V$E_5Z^mMQhc+%98PelG+S6rgqSGVTDor*lT{e>LraF>u zamUa4A2J_h#O-kX25u|_NUhc~jk`hRvDgCbq7SPlbk_**eGN=_(|%NeM1UY!mTy^( zdM4iK)5v}h#x;JHT@-Y-P!>Nj>vhbs*F^iF5$}Rm#c-~v+b|%4rS*nbYG9+>C-6{@ zh26)vyvR58;`&-bI)ytv_$B6C$tB9VHf0HL$fjOJ`XkPOdPxWkHUJ$< zpe7I&!WEjMD+09?LaF_>o4;LZRpTLg67UMrx;A8JIIZjX6L4)~~Dm^e|AMEX16NN3C|))xf=azoS}NR1oPwv*_yxKFBV+{N;m`5brd zF71gS-|ASJ%k<+^vh9oP_f&V*RB(n2ak(H={9G_cfI)qA)-Zl@qd)J4Llpf_8$oMc zTbnVvGh4Im!PHW1ny-_u8~xT4qU_o!+l2<}^ELPe+YCG!cRgBXjsB>==UM;;PdUCj z5=#{gjsdE0@s}_;s>BgoN|g#+gj@~m9Es!JZkCoj&9R7xQ4N4^QyyL2!CtrG zOZ^wH4WHnTE3J`zQZ$`s&{_VSrtP+CUs%R|S_#ympO5br&PKlnk=Ig2)W`Z?xYE|P z$GyOw7dv1SB0{Kz1G?rUMB_8de;v1%|AN|LdO82S?P29qNu~z4{o42`FoXBIAOPNp zL?O#c0lByxNy>vI5bnh;>j=E|^BqI9h!k%~q|_1XGji|s(|3B{X9=1Vu@H drt- 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 + + + + + Touchdog AI 智能电商出图系统 + + + + + +