@usehall/bot-gate
Version:
React/Vue/Svelte components for conditionally rendering content based on bot detection with IP validation
1 lines • 34.5 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/core/utils.js","../../../src/core/detector.js","../../../src/core/validator.js","../../../src/core/shared-validation.js","../../../src/components/vue/index.js"],"sourcesContent":["export function isServerSide() {\n return typeof window === 'undefined' && typeof process !== 'undefined' && process.versions && process.versions.node;\n}\n\nexport function warnIfClientSide() {\n if (!isServerSide()) {\n console.warn('bot-gate: This library is designed for server-side use only. Bot detection requires access to request headers and IP addresses that are not available in the browser.');\n }\n}\n\nexport function sanitizeIpAddress(ipAddress) {\n if (!ipAddress || typeof ipAddress !== 'string') return null;\n \n let sanitized = ipAddress.trim()\n .split(',')[0]\n .trim();\n \n // Remove IPv4-mapped IPv6 prefix if present\n if (sanitized.startsWith('::ffff:')) {\n sanitized = sanitized.replace(/^::ffff:/, '');\n }\n \n // Handle IPv6 addresses enclosed in brackets (common in HTTP headers)\n if (sanitized.startsWith('[') && sanitized.endsWith(']')) {\n sanitized = sanitized.slice(1, -1);\n }\n \n return sanitized;\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nlet userAgentPatterns = null;\nlet compiledPatterns = null;\n\nfunction loadUserAgentPatterns() {\n if (!userAgentPatterns) {\n try {\n const dataPath = path.join(__dirname, '../../data/user-agents.json');\n \n if (!fs.existsSync(dataPath)) {\n console.warn('bot-gate: User agent patterns file not found. Bot detection will be disabled.');\n userAgentPatterns = { bots: [] };\n return userAgentPatterns;\n }\n \n const data = fs.readFileSync(dataPath, 'utf8');\n const parsed = JSON.parse(data);\n \n // Validate structure\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.bots)) {\n console.warn('bot-gate: Invalid user agent patterns format. Expected { bots: [...] }');\n userAgentPatterns = { bots: [] };\n return userAgentPatterns;\n }\n \n // Validate each bot entry\n const validBots = parsed.bots.filter(bot => {\n if (!bot || typeof bot !== 'object' || !bot.name || !Array.isArray(bot.patterns)) {\n console.warn(`bot-gate: Invalid bot entry skipped:`, bot);\n return false;\n }\n return true;\n });\n \n userAgentPatterns = { bots: validBots };\n \n if (validBots.length === 0) {\n console.warn('bot-gate: No valid bot patterns found. Bot detection will be disabled.');\n }\n \n // Pre-compile regex patterns for better performance\n compilePatterns();\n \n } catch (error) {\n console.warn('bot-gate: Failed to load user agent patterns:', error.message);\n userAgentPatterns = { bots: [] };\n }\n }\n return userAgentPatterns;\n}\n\nfunction compilePatterns() {\n if (!userAgentPatterns || !userAgentPatterns.bots) {\n compiledPatterns = [];\n return;\n }\n \n compiledPatterns = userAgentPatterns.bots.map(bot => {\n const regexPatterns = bot.patterns.map(pattern => {\n try {\n return new RegExp(pattern, 'i');\n } catch (error) {\n console.warn(`bot-gate: Invalid regex pattern \"${pattern}\" for bot ${bot.name}:`, error.message);\n return null;\n }\n }).filter(Boolean);\n \n return {\n name: bot.name,\n type: bot.type,\n regexPatterns\n };\n }).filter(bot => bot.regexPatterns.length > 0);\n}\n\nexport function detectBot(userAgent) {\n if (!userAgent || typeof userAgent !== 'string') {\n return null;\n }\n\n // Ensure patterns are loaded and compiled\n if (!compiledPatterns) {\n loadUserAgentPatterns();\n if (!compiledPatterns) {\n compilePatterns();\n }\n }\n\n if (!compiledPatterns || compiledPatterns.length === 0) {\n return null;\n }\n\n for (const bot of compiledPatterns) {\n for (const regex of bot.regexPatterns) {\n if (regex.test(userAgent)) {\n return {\n name: bot.name,\n type: bot.type,\n detected: true,\n pattern: regex.source\n };\n }\n }\n }\n\n return null;\n}\n\nexport function getSupportedBots() {\n const patterns = loadUserAgentPatterns();\n return patterns.bots.map(bot => ({\n name: bot.name,\n type: bot.type\n }));\n}","import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport { detectBot } from './detector.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst ipRangeCache = new Map();\n\n// Cache configuration\nconst CACHE_TTL = 60 * 60 * 1000; // 1 hour in milliseconds\nconst MAX_CACHE_SIZE = 50; // Maximum number of cached bot entries\n\nfunction cleanupCache() {\n const now = Date.now();\n const entries = Array.from(ipRangeCache.entries());\n \n // Remove expired entries\n for (const [botName, data] of entries) {\n if (data.loadedAt && (now - data.loadedAt) > CACHE_TTL) {\n ipRangeCache.delete(botName);\n }\n }\n \n // If still over size limit, remove oldest entries\n if (ipRangeCache.size > MAX_CACHE_SIZE) {\n const sortedEntries = Array.from(ipRangeCache.entries())\n .sort(([,a], [,b]) => (a.loadedAt || 0) - (b.loadedAt || 0));\n \n const toRemove = sortedEntries.slice(0, ipRangeCache.size - MAX_CACHE_SIZE);\n for (const [botName] of toRemove) {\n ipRangeCache.delete(botName);\n }\n }\n}\n\n// Periodic cleanup every 10 minutes\nlet cleanupInterval;\nif (typeof setInterval !== 'undefined') {\n cleanupInterval = setInterval(cleanupCache, 10 * 60 * 1000);\n}\n\nfunction loadBotIpRanges(botName) {\n if (!ipRangeCache.has(botName)) {\n // Cleanup cache before adding new entries\n cleanupCache();\n try {\n // Handle applebot-extended using the same IP ranges as applebot\n let actualBotName = botName.toLowerCase();\n if (actualBotName === 'applebot-extended') {\n actualBotName = 'applebot';\n }\n \n const dataPath = path.join(__dirname, `../../data/bots/${actualBotName}.json`);\n \n if (!fs.existsSync(dataPath)) {\n console.warn(`bot-gate: IP ranges file not found for ${botName}. Bot validation will fail for this bot.`);\n ipRangeCache.set(botName, { ranges: [], error: 'file_not_found' });\n return ipRangeCache.get(botName);\n }\n \n const data = fs.readFileSync(dataPath, 'utf8');\n let rawData;\n \n try {\n rawData = JSON.parse(data);\n } catch (parseError) {\n console.warn(`bot-gate: Invalid JSON in IP ranges file for ${botName}:`, parseError.message);\n ipRangeCache.set(botName, { ranges: [], error: 'invalid_json' });\n return ipRangeCache.get(botName);\n }\n \n // Validate structure\n if (!rawData || typeof rawData !== 'object') {\n console.warn(`bot-gate: Invalid IP ranges data structure for ${botName}. Expected object.`);\n ipRangeCache.set(botName, { ranges: [], error: 'invalid_structure' });\n return ipRangeCache.get(botName);\n }\n \n // Official API format: { creationTime, prefixes: [{ ipv4Prefix: \"...\" }] }\n const ranges = rawData.prefixes && Array.isArray(rawData.prefixes)\n ? rawData.prefixes.map(prefix => prefix.ipv4Prefix || prefix.ipv6Prefix).filter(Boolean)\n : [];\n \n if (ranges.length === 0) {\n console.warn(`bot-gate: No valid IP ranges found for ${botName}. Bot validation will fail for this bot.`);\n }\n \n ipRangeCache.set(botName, { \n ranges, \n loadedAt: Date.now(),\n error: ranges.length === 0 ? 'no_ranges' : null \n });\n \n } catch (error) {\n console.warn(`bot-gate: Failed to load IP ranges for ${botName}:`, error.message);\n ipRangeCache.set(botName, { ranges: [], error: 'load_failed', errorMessage: error.message });\n }\n }\n return ipRangeCache.get(botName);\n}\n\nfunction ipToInt(ip) {\n return ip.split('.').reduce((acc, octet) => (acc << 8) + parseInt(octet, 10), 0) >>> 0;\n}\n\nfunction cidrToRange(cidr) {\n const [ip, prefixLength] = cidr.split('/');\n const ipInt = ipToInt(ip);\n const mask = (-1 << (32 - parseInt(prefixLength, 10))) >>> 0;\n const networkInt = ipInt & mask;\n const broadcastInt = networkInt | (~mask >>> 0);\n \n return {\n start: networkInt,\n end: broadcastInt\n };\n}\n\nfunction expandIpv6(ip) {\n // Expand IPv6 address to full form\n if (ip.includes('::')) {\n const parts = ip.split('::');\n const left = parts[0] ? parts[0].split(':') : [];\n const right = parts[1] ? parts[1].split(':') : [];\n const missing = 8 - left.length - right.length;\n const middle = Array(missing).fill('0000');\n return [...left, ...middle, ...right].map(part => part.padStart(4, '0')).join(':');\n }\n return ip.split(':').map(part => part.padStart(4, '0')).join(':');\n}\n\nfunction ipv6ToInts(ip) {\n const expanded = expandIpv6(ip);\n const parts = expanded.split(':');\n return parts.map(part => parseInt(part, 16));\n}\n\nfunction isIpv6InRange(ip, range) {\n if (!ip.includes(':')) return false;\n \n if (range.includes('/')) {\n const [rangeIp, prefixLength] = range.split('/');\n const prefix = parseInt(prefixLength, 10);\n \n if (!rangeIp.includes(':')) return false;\n \n const ipParts = ipv6ToInts(ip);\n const rangeParts = ipv6ToInts(rangeIp);\n \n // Check how many complete 16-bit blocks we need to compare\n const completeBlocks = Math.floor(prefix / 16);\n const remainingBits = prefix % 16;\n \n // Compare complete blocks\n for (let i = 0; i < completeBlocks; i++) {\n if (ipParts[i] !== rangeParts[i]) {\n return false;\n }\n }\n \n // Compare remaining bits in the partial block\n if (remainingBits > 0 && completeBlocks < 8) {\n const mask = (0xFFFF << (16 - remainingBits)) & 0xFFFF;\n if ((ipParts[completeBlocks] & mask) !== (rangeParts[completeBlocks] & mask)) {\n return false;\n }\n }\n \n return true;\n }\n \n // Direct IPv6 comparison\n if (range.includes(':')) {\n return expandIpv6(ip) === expandIpv6(range);\n }\n \n return false;\n}\n\nfunction isIpInRange(ip, range) {\n // Handle IPv6 ranges\n if (ip.includes(':') || range.includes(':')) {\n return isIpv6InRange(ip, range);\n }\n \n // Handle IPv4 ranges\n const ipInt = ipToInt(ip);\n \n if (range.includes('/')) {\n const { start, end } = cidrToRange(range);\n return ipInt >= start && ipInt <= end;\n }\n \n if (range.includes('-')) {\n const [startIp, endIp] = range.split('-');\n const startInt = ipToInt(startIp.trim());\n const endInt = ipToInt(endIp.trim());\n return ipInt >= startInt && ipInt <= endInt;\n }\n \n return ipInt === ipToInt(range);\n}\n\nfunction isValidIpAddress(ip) {\n const ipv4Regex = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n const ipv6Regex = /^([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|^::([0-9a-fA-F]{1,4}:)+[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)+::[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:)*::([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4}$|^::$|^([0-9a-fA-F]{1,4}:){1,7}:$|^:(:([0-9a-fA-F]{1,4})){1,7}$|^([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}$|^([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}$|^([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}$|^([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}$|^([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}$|^[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})$/;\n \n return ipv4Regex.test(ip) || ipv6Regex.test(ip);\n}\n\nfunction validateBotByName(botName, ipAddress) {\n if (!botName || !ipAddress) {\n return false;\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n if (!cleanIp || !isValidIpAddress(cleanIp)) {\n return false;\n }\n\n const botData = loadBotIpRanges(botName);\n \n if (!botData.ranges || botData.ranges.length === 0) {\n return false;\n }\n\n return botData.ranges.some(range => isIpInRange(cleanIp, range));\n}\n\nexport function validateBot(userAgent, ipAddress) {\n if (!userAgent || !ipAddress) {\n return false;\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n if (!cleanIp) {\n console.warn(`bot-gate: Failed to sanitize IP address: ${ipAddress}`);\n return false;\n }\n\n const botInfo = detectBot(userAgent);\n \n if (!botInfo) {\n return false;\n }\n\n const isValid = validateBotByName(botInfo.name, cleanIp);\n if (!isValid) {\n console.warn(`bot-gate: Bot validation failed for ${botInfo.name} with IP ${cleanIp}. This may indicate a spoofed bot or outdated IP ranges.`);\n }\n\n return isValid;\n}\n\n// Export cache management functions for testing and manual cleanup\nexport function clearCache() {\n ipRangeCache.clear();\n}\n\nexport function getCacheSize() {\n return ipRangeCache.size;\n}\n\nexport function stopCacheCleanup() {\n if (cleanupInterval) {\n clearInterval(cleanupInterval);\n cleanupInterval = null;\n }\n}\n\n// Debugging utilities\nexport function debugBotValidation(userAgent, ipAddress) {\n console.log('bot-gate: Debug validation starting...');\n console.log(`User-Agent: ${userAgent}`);\n console.log(`IP Address: ${ipAddress}`);\n \n if (!userAgent || !ipAddress) {\n console.log('❌ Missing required parameters');\n return { valid: false, reason: 'missing_params' };\n }\n\n const cleanIp = sanitizeIpAddress(ipAddress);\n console.log(`Sanitized IP: ${cleanIp}`);\n \n if (!cleanIp) {\n console.log('❌ IP sanitization failed');\n return { valid: false, reason: 'ip_sanitization_failed' };\n }\n\n if (!isValidIpAddress(cleanIp)) {\n console.log('❌ Invalid IP address format');\n return { valid: false, reason: 'invalid_ip_format' };\n }\n\n const botInfo = detectBot(userAgent);\n console.log(`Bot detection result:`, botInfo);\n \n if (!botInfo) {\n console.log('❌ No bot detected in user agent');\n return { valid: false, reason: 'bot_not_detected' };\n }\n\n const botData = loadBotIpRanges(botInfo.name);\n console.log(`Bot IP ranges loaded: ${botData.ranges.length} ranges`);\n \n if (botData.error) {\n console.log(`❌ Bot data error: ${botData.error}`);\n return { valid: false, reason: 'bot_data_error', botError: botData.error };\n }\n\n const isInRange = botData.ranges.some(range => {\n const inRange = isIpInRange(cleanIp, range);\n if (inRange) {\n console.log(`✅ IP ${cleanIp} matches range: ${range}`);\n }\n return inRange;\n });\n\n if (!isInRange) {\n console.log(`❌ IP ${cleanIp} not in any valid ranges for ${botInfo.name}`);\n console.log('Available ranges:', botData.ranges.slice(0, 5)); // Show first 5 ranges\n }\n\n const result = { \n valid: isInRange, \n reason: isInRange ? 'valid_bot' : 'ip_not_in_range',\n botInfo,\n cleanIp,\n availableRanges: botData.ranges.length\n };\n \n console.log('bot-gate: Debug validation complete:', result);\n return result;\n}\n\nexport function getBotValidationInfo(botName) {\n const botData = loadBotIpRanges(botName);\n return {\n botName,\n rangeCount: botData.ranges.length,\n error: botData.error,\n errorMessage: botData.errorMessage,\n loadedAt: botData.loadedAt,\n ranges: botData.ranges.slice(0, 10) // First 10 ranges for inspection\n };\n}\n\nexport function listCachedBots() {\n return Array.from(ipRangeCache.keys());\n}","import { detectBot } from './detector.js';\nimport { validateBot } from './validator.js';\nimport { sanitizeIpAddress } from './utils.js';\n\nexport function validateBotGateProps(userAgent, ipAddress, display, role) {\n if (!userAgent || !ipAddress) {\n console.warn(`bot-gate: Missing required props. userAgent: ${userAgent ? 'provided' : 'missing'}, ipAddress: ${ipAddress ? 'provided' : 'missing'}. Both are required for bot detection.`);\n return { isValid: false, error: 'missing_required_props' };\n }\n\n if (!display) {\n console.warn('bot-gate: display prop is required. Must be either \"show\" or \"hide\" to control content visibility.');\n return { isValid: false, error: 'missing_display' };\n }\n\n if (!role) {\n console.warn('bot-gate: role prop is required. Must be either \"bot\" or \"user\" to specify the target audience.');\n return { isValid: false, error: 'missing_role' };\n }\n\n if (!['show', 'hide'].includes(display)) {\n console.warn(`bot-gate: Invalid display value \"${display}\". Must be either \"show\" (to display content) or \"hide\" (to hide content).`);\n return { isValid: false, error: 'invalid_display' };\n }\n\n if (!['bot', 'user'].includes(role)) {\n console.warn(`bot-gate: Invalid role value \"${role}\". Must be either \"bot\" (for search engines/crawlers) or \"user\" (for human visitors).`);\n return { isValid: false, error: 'invalid_role' };\n }\n\n return { isValid: true };\n}\n\n\nexport function isValidBot(userAgent, ipAddress, bots = null) {\n const cleanIp = sanitizeIpAddress(ipAddress);\n const isValid = validateBot(userAgent, cleanIp);\n \n if (!isValid) {\n return false;\n }\n \n // If specific bots are requested, check if this bot is in the list\n if (bots && Array.isArray(bots) && bots.length > 0) {\n const botInfo = detectBot(userAgent);\n return botInfo ? bots.includes(botInfo.name) : false;\n }\n \n return true;\n}","import { defineComponent, onMounted } from 'vue';\nimport { warnIfClientSide } from '../../core/index.js';\nimport { validateBotGateProps, isValidBot } from '../../core/shared-validation.js';\n\nexport const BotGate = defineComponent({\n name: 'BotGate',\n props: {\n userAgent: {\n type: String,\n required: true\n },\n ipAddress: {\n type: String,\n required: true\n },\n display: {\n type: String,\n required: true,\n validator: value => ['show', 'hide'].includes(value)\n },\n role: {\n type: String,\n required: true,\n validator: value => ['bot', 'user'].includes(value)\n },\n bots: {\n type: Array,\n default: null\n }\n },\n setup(props, { slots }) {\n onMounted(() => {\n warnIfClientSide();\n });\n\n const shouldShow = () => {\n const validation = validateBotGateProps(props.userAgent, props.ipAddress, props.display, props.role);\n if (!validation.isValid) {\n return false;\n }\n\n const isBot = isValidBot(props.userAgent, props.ipAddress, props.bots);\n return (props.display === 'show') ? \n (props.role === 'bot' ? isBot : !isBot) : \n (props.role === 'bot' ? !isBot : isBot);\n };\n\n return () => {\n const show = shouldShow();\n return show ? slots.default?.() : null;\n };\n }\n});\n\n"],"names":["__dirname","fileURLToPath","defineComponent","onMounted"],"mappings":";;;;;;;;AAAO,SAAS,YAAY,GAAG;AAC/B,EAAE,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI;AACrH;;AAEO,SAAS,gBAAgB,GAAG;AACnC,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,IAAI,OAAO,CAAC,IAAI,CAAC,uKAAuK,CAAC;AACzL,EAAE;AACF;;AAEO,SAAS,iBAAiB,CAAC,SAAS,EAAE;AAC7C,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,OAAO,IAAI;AAC9D;AACA,EAAE,IAAI,SAAS,GAAG,SAAS,CAAC,IAAI;AAChC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACjB,KAAK,IAAI,EAAE;AACX;AACA;AACA,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;AACvC,IAAI,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;AACjD,EAAE;AACF;AACA;AACA,EAAE,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC5D,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACtC,EAAE;AACF;AACA,EAAE,OAAO,SAAS;AAClB;;ACxBA,MAAMA,WAAS,GAAG,IAAI,CAAC,OAAO,CAACC,iBAAa,CAAC,2PAAe,CAAC,CAAC;;AAE9D,IAAI,iBAAiB,GAAG,IAAI;AAC5B,IAAI,gBAAgB,GAAG,IAAI;;AAE3B,SAAS,qBAAqB,GAAG;AACjC,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC1B,IAAI,IAAI;AACR,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAACD,WAAS,EAAE,6BAA6B,CAAC;AAC1E;AACA,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACpC,QAAQ,OAAO,CAAC,IAAI,CAAC,+EAA+E,CAAC;AACrG,QAAQ,iBAAiB,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;AACxC,QAAQ,OAAO,iBAAiB;AAChC,MAAM;AACN;AACA,MAAM,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AACrC;AACA;AACA,MAAM,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;AAChF,QAAQ,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC;AAC9F,QAAQ,iBAAiB,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;AACxC,QAAQ,OAAO,iBAAiB;AAChC,MAAM;AACN;AACA;AACA,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI;AAClD,QAAQ,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;AAC1F,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,oCAAoC,CAAC,EAAE,GAAG,CAAC;AACnE,UAAU,OAAO,KAAK;AACtB,QAAQ;AACR,QAAQ,OAAO,IAAI;AACnB,MAAM,CAAC,CAAC;AACR;AACA,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AAC7C;AACA,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,QAAQ,OAAO,CAAC,IAAI,CAAC,wEAAwE,CAAC;AAC9F,MAAM;AACN;AACA;AACA,MAAM,eAAe,EAAE;AACvB;AACA,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,CAAC,OAAO,CAAC;AAClF,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE;AACtC,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,iBAAiB;AAC1B;;AAEA,SAAS,eAAe,GAAG;AAC3B,EAAE,IAAI,CAAC,iBAAiB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;AACrD,IAAI,gBAAgB,GAAG,EAAE;AACzB,IAAI;AACJ,EAAE;AACF;AACA,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AACvD,IAAI,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,IAAI;AACtD,MAAM,IAAI;AACV,QAAQ,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC;AACvC,MAAM,CAAC,CAAC,OAAO,KAAK,EAAE;AACtB,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,iCAAiC,EAAE,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AACxG,QAAQ,OAAO,IAAI;AACnB,MAAM;AACN,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACtB;AACA,IAAI,OAAO;AACX,MAAM,IAAI,EAAE,GAAG,CAAC,IAAI;AACpB,MAAM,IAAI,EAAE,GAAG,CAAC,IAAI;AACpB,MAAM;AACN,KAAK;AACL,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;AAChD;;AAEO,SAAS,SAAS,CAAC,SAAS,EAAE;AACrC,EAAE,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACnD,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF;AACA,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzB,IAAI,qBAAqB,EAAE;AAC3B,IAAI,IAAI,CAAC,gBAAgB,EAAE;AAC3B,MAAM,eAAe,EAAE;AACvB,IAAI;AACJ,EAAE;;AAEF,EAAE,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1D,IAAI,OAAO,IAAI;AACf,EAAE;;AAEF,EAAE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE;AACtC,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,aAAa,EAAE;AAC3C,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACjC,QAAQ,OAAO;AACf,UAAU,IAAI,EAAE,GAAG,CAAC,IAAI;AACxB,UAAU,IAAI,EAAE,GAAG,CAAC,IAAI;AACxB,UAAU,QAAQ,EAAE,IAAI;AACxB,UAAU,OAAO,EAAE,KAAK,CAAC;AACzB,SAAS;AACT,MAAM;AACN,IAAI;AACJ,EAAE;;AAEF,EAAE,OAAO,IAAI;AACb;;ACzGA,MAAMA,WAAS,GAAG,IAAI,CAAC,OAAO,CAACC,iBAAa,CAAC,2PAAe,CAAC,CAAC;;AAE9D,MAAM,YAAY,GAAG,IAAI,GAAG,EAAE;;AAE9B;AACA,MAAM,SAAS,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACjC,MAAM,cAAc,GAAG,EAAE,CAAC;;AAE1B,SAAS,YAAY,GAAG;AACxB,EAAE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACxB,EAAE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;AACpD;AACA;AACA,EAAE,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE;AACzC,IAAI,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;AAC5D,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,IAAI;AACJ,EAAE;AACF;AACA;AACA,EAAE,IAAI,YAAY,CAAC,IAAI,GAAG,cAAc,EAAE;AAC1C,IAAI,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC3D,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;AAClE;AACA,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,GAAG,cAAc,CAAC;AAC/E,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,QAAQ,EAAE;AACtC,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;AAClC,IAAI;AACJ,EAAE;AACF;AAIA,IAAI,OAAO,WAAW,KAAK,WAAW,EAAE;AACxC,EAAoB,WAAW,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC7D;;AAEA,SAAS,eAAe,CAAC,OAAO,EAAE;AAClC,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AAClC;AACA,IAAI,YAAY,EAAE;AAClB,IAAI,IAAI;AACR;AACA,MAAM,IAAI,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE;AAC/C,MAAM,IAAI,aAAa,KAAK,mBAAmB,EAAE;AACjD,QAAQ,aAAa,GAAG,UAAU;AAClC,MAAM;AACN;AACA,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAACD,WAAS,EAAE,CAAC,gBAAgB,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AACpF;AACA,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACpC,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,uCAAuC,EAAE,OAAO,CAAC,wCAAwC,CAAC,CAAC;AACjH,QAAQ,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;AAC1E,QAAQ,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AACxC,MAAM;AACN;AACA,MAAM,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC;AACpD,MAAM,IAAI,OAAO;AACjB;AACA,MAAM,IAAI;AACV,QAAQ,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAClC,MAAM,CAAC,CAAC,OAAO,UAAU,EAAE;AAC3B,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,6CAA6C,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;AACpG,QAAQ,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;AACxE,QAAQ,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AACxC,MAAM;AACN;AACA;AACA,MAAM,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AACnD,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,+CAA+C,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;AACnG,QAAQ,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;AAC7E,QAAQ,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AACxC,MAAM;AACN;AACA;AACA,MAAM,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ;AACvE,UAAU,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO;AAC/F,UAAU,EAAE;AACZ;AACA,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AAC/B,QAAQ,OAAO,CAAC,IAAI,CAAC,CAAC,uCAAuC,EAAE,OAAO,CAAC,wCAAwC,CAAC,CAAC;AACjH,MAAM;AACN;AACA,MAAM,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE;AAChC,QAAQ,MAAM;AACd,QAAQ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;AAC5B,QAAQ,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,WAAW,GAAG,IAAI;AACvD,OAAO,CAAC;AACR;AACA,IAAI,CAAC,CAAC,OAAO,KAAK,EAAE;AACpB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,uCAAuC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC;AACvF,MAAM,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;AAClG,IAAI;AACJ,EAAE;AACF,EAAE,OAAO,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAClC;;AAEA,SAAS,OAAO,CAAC,EAAE,EAAE;AACrB,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC;AACxF;;AAEA,SAAS,WAAW,CAAC,IAAI,EAAE;AAC3B,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAC5C,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;AAC3B,EAAE,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAC9D,EAAE,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI;AACjC,EAAE,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AACjD;AACA,EAAE,OAAO;AACT,IAAI,KAAK,EAAE,UAAU;AACrB,IAAI,GAAG,EAAE;AACT,GAAG;AACH;;AAEA,SAAS,UAAU,CAAC,EAAE,EAAE;AACxB;AACA,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACzB,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AACpD,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AACrD,IAAI,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;AAClD,IAAI,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9C,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACtF,EAAE;AACF,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACnE;;AAEA,SAAS,UAAU,CAAC,EAAE,EAAE;AACxB,EAAE,MAAM,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC;AACjC,EAAE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AACnC,EAAE,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC9C;;AAEA,SAAS,aAAa,CAAC,EAAE,EAAE,KAAK,EAAE;AAClC,EAAE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK;AACrC;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,IAAI,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AACpD,IAAI,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC;AAC7C;AACA,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK;AAC5C;AACA,IAAI,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,CAAC;AAClC,IAAI,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC;AAC1C;AACA;AACA,IAAI,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;AAClD,IAAI,MAAM,aAAa,GAAG,MAAM,GAAG,EAAE;AACrC;AACA;AACA,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE;AAC7C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE;AACxC,QAAQ,OAAO,KAAK;AACpB,MAAM;AACN,IAAI;AACJ;AACA;AACA,IAAI,IAAI,aAAa,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;AACjD,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,GAAG,aAAa,CAAC,IAAI,MAAM;AAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,OAAO,UAAU,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,EAAE;AACpF,QAAQ,OAAO,KAAK;AACpB,MAAM;AACN,IAAI;AACJ;AACA,IAAI,OAAO,IAAI;AACf,EAAE;AACF;AACA;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,IAAI,OAAO,UAAU,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC;AAC/C,EAAE;AACF;AACA,EAAE,OAAO,KAAK;AACd;;AAEA,SAAS,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE;AAChC;AACA,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC/C,IAAI,OAAO,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC;AACnC,EAAE;AACF;AACA;AACA,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,CAAC;AAC3B;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,IAAI,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC;AAC7C,IAAI,OAAO,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG;AACzC,EAAE;AACF;AACA,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC3B,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAC7C,IAAI,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5C,IAAI,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACxC,IAAI,OAAO,KAAK,IAAI,QAAQ,IAAI,KAAK,IAAI,MAAM;AAC/C,EAAE;AACF;AACA,EAAE,OAAO,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;AACjC;;AAEA,SAAS,gBAAgB,CAAC,EAAE,EAAE;AAC9B,EAAE,MAAM,SAAS,GAAG,uFAAuF;AAC3G,EAAE,MAAM,SAAS,GAAG,2lBAA2lB;AAC/mB;AACA,EAAE,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AACjD;;AAEA,SAAS,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE;AAC/C,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE;AAC9B,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAC9C,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE;AAC9C,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;AAC1C;AACA,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACtD,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAClE;;AAEO,SAAS,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE;AAClD,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE;AAChC,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAC9C,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,yCAAyC,EAAE,SAAS,CAAC,CAAC,CAAC;AACzE,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC;AACtC;AACA,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,KAAK;AAChB,EAAE;;AAEF,EAAE,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AAC1D,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,oCAAoC,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,wDAAwD,CAAC,CAAC;AAClJ,EAAE;;AAEF,EAAE,OAAO,OAAO;AAChB;;AC1PO,SAAS,oBAAoB,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;AAC1E,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE;AAChC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,6CAA6C,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC,sCAAsC,CAAC,CAAC;AAC9L,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE;AAC9D,EAAE;;AAEF,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,CAAC,IAAI,CAAC,oGAAoG,CAAC;AACtH,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE;AACvD,EAAE;;AAEF,EAAE,IAAI,CAAC,IAAI,EAAE;AACb,IAAI,OAAO,CAAC,IAAI,CAAC,iGAAiG,CAAC;AACnH,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE;AACpD,EAAE;;AAEF,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC3C,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,iCAAiC,EAAE,OAAO,CAAC,0EAA0E,CAAC,CAAC;AACzI,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE;AACvD,EAAE;;AAEF,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,8BAA8B,EAAE,IAAI,CAAC,qFAAqF,CAAC,CAAC;AAC9I,IAAI,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE;AACpD,EAAE;;AAEF,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE;AAC1B;;;AAGO,SAAS,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,GAAG,IAAI,EAAE;AAC9D,EAAE,MAAM,OAAO,GAAG,iBAAiB,CAAC,SAAS,CAAC;AAC9C,EAAE,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC;AACjD;AACA,EAAE,IAAI,CAAC,OAAO,EAAE;AAChB,IAAI,OAAO,KAAK;AAChB,EAAE;AACF;AACA;AACA,EAAE,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;AACtD,IAAI,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC;AACxC,IAAI,OAAO,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK;AACxD,EAAE;AACF;AACA,EAAE,OAAO,IAAI;AACb;;AC7CY,MAAC,OAAO,GAAGE,mBAAe,CAAC;AACvC,EAAE,IAAI,EAAE,SAAS;AACjB,EAAE,KAAK,EAAE;AACT,IAAI,SAAS,EAAE;AACf,MAAM,IAAI,EAAE,MAAM;AAClB,MAAM,QAAQ,EAAE;AAChB,KAAK;AACL,IAAI,SAAS,EAAE;AACf,MAAM,IAAI,EAAE,MAAM;AAClB,MAAM,QAAQ,EAAE;AAChB,KAAK;AACL,IAAI,OAAO,EAAE;AACb,MAAM,IAAI,EAAE,MAAM;AAClB,MAAM,QAAQ,EAAE,IAAI;AACpB,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK;AACzD,KAAK;AACL,IAAI,IAAI,EAAE;AACV,MAAM,IAAI,EAAE,MAAM;AAClB,MAAM,QAAQ,EAAE,IAAI;AACpB,MAAM,SAAS,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK;AACxD,KAAK;AACL,IAAI,IAAI,EAAE;AACV,MAAM,IAAI,EAAE,KAAK;AACjB,MAAM,OAAO,EAAE;AACf;AACA,GAAG;AACH,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE;AAC1B,IAAIC,aAAS,CAAC,MAAM;AACpB,MAAM,gBAAgB,EAAE;AACxB,IAAI,CAAC,CAAC;;AAEN,IAAI,MAAM,UAAU,GAAG,MAAM;AAC7B,MAAM,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;AAC1G,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AAC/B,QAAQ,OAAO,KAAK;AACpB,MAAM;;AAEN,MAAM,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;AAC5E,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM;AACtC,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG,CAAC,KAAK;AAC9C,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;AAC/C,IAAI,CAAC;;AAEL,IAAI,OAAO,MAAM;AACjB,MAAM,MAAM,IAAI,GAAG,UAAU,EAAE;AAC/B,MAAM,OAAO,IAAI,GAAG,KAAK,CAAC,OAAO,IAAI,GAAG,IAAI;AAC5C,IAAI,CAAC;AACL,EAAE;AACF,CAAC;;;;"}