{"version":3,"file":"AtlasManager.cjs","sources":["../../../src/managers/AtlasManager.ts"],"sourcesContent":["import { Assets, Texture, Rectangle } from 'pixi.js';\nimport ResourceManager from './ResourceManager';\n\n// Development environment check\nconst isDevelopment = import.meta.env?.MODE === 'development';\n\n/**\n * Interface for a frame within an atlas\n */\nexport interface AtlasFrame {\n    frame: {\n        x: number;\n        y: number;\n        w: number;\n        h: number;\n    };\n    rotated: boolean;\n    trimmed: boolean;\n    spriteSourceSize?: {\n        x: number;\n        y: number;\n        w: number;\n        h: number;\n    };\n    sourceSize?: {\n        w: number;\n        h: number;\n    };\n    pivot?: {\n        x: number;\n        y: number;\n    };\n}\n\n/**\n * Interface for atlas metadata\n */\nexport interface AtlasMetadata {\n    app?: string;\n    version?: string;\n    image?: string;\n    format?: string;\n    size?: {\n        w: number;\n        h: number;\n    };\n    scale?: number;\n}\n\n/**\n * Interface for a complete texture atlas\n */\nexport interface Atlas {\n    frames: Record<string, AtlasFrame>;\n    meta: AtlasMetadata;\n}\n\n/**\n * Options for the atlas manager\n */\nexport interface AtlasManagerOptions {\n    // Whether to enable debug logging\n    debug?: boolean;\n\n    // Whether to prefer atlases over individual images when both are available\n    preferAtlas?: boolean;\n\n    // Whether to cache frame textures (recommended for better performance)\n    cacheFrameTextures?: boolean;\n\n    // Base path to prepend to atlas image paths\n    basePath?: string;\n}\n\n/**\n * Status of an atlas or image loading operation\n */\nexport enum LoadStatus {\n    NotLoaded = 'not_loaded',\n    Loading = 'loading',\n    Loaded = 'loaded',\n    Failed = 'failed'\n}\n\n/**\n * Manager for handling texture atlases in the KineticSlider\n *\n * This class provides methods for:\n * - Loading texture atlases from JSON and image files\n * - Retrieving textures for individual frames\n * - Managing the lifecycle of atlas resources\n * - Providing proper cleanup when an atlas is no longer needed\n */\nexport class AtlasManager {\n    // Loaded atlases\n    private atlases: Map<string, Atlas> = new Map();\n\n    // Atlas textures (the full atlas texture)\n    private atlasTextures: Map<string, Texture> = new Map();\n\n    // Cached frame textures (individual sprites cut from the atlas)\n    private frameTextures: Map<string, Texture> = new Map();\n\n    // Image textures (for individual images, used as fallback)\n    private imageTextures: Map<string, Texture> = new Map();\n\n    // Loading status for atlases\n    private atlasStatus: Map<string, LoadStatus> = new Map();\n\n    // Loading status for individual images\n    private imageStatus: Map<string, LoadStatus> = new Map();\n\n    // Reference to ResourceManager for tracking resources\n    private resourceManager?: ResourceManager;\n\n    // Options for the atlas manager\n    private options: AtlasManagerOptions;\n\n    /**\n     * Create a new atlas manager\n     *\n     * @param options - Options for the atlas manager\n     * @param resourceManager - Optional ResourceManager for tracking resources\n     */\n    constructor(options: AtlasManagerOptions = {}, resourceManager?: ResourceManager) {\n        this.options = {\n            debug: isDevelopment,\n            preferAtlas: true,\n            cacheFrameTextures: true,\n            basePath: '',\n            ...options\n        };\n\n        this.resourceManager = resourceManager;\n\n        if (this.options.debug) {\n            console.log('AtlasManager initialized with options:', this.options);\n        }\n    }\n\n    /**\n     * Extract the filename from a path for atlas frame lookup\n     *\n     * @param imagePath - The full path to the image\n     * @returns The filename part of the path\n     */\n    private getFilenameFromPath(imagePath: string): string {\n        // Check if the path is empty or null\n        if (!imagePath) return '';\n\n        // Extract filename from path (everything after the last /)\n        const filename = imagePath.split('/').pop() || imagePath;\n\n        if (this.options.debug) {\n            console.log(`Extracted filename \"${filename}\" from path \"${imagePath}\"`);\n        }\n\n        return filename;\n    }\n\n    /**\n     * Load a texture atlas from a JSON file\n     *\n     * @param atlasId - Identifier for the atlas\n     * @param jsonUrl - URL to the atlas JSON file\n     * @param imageUrl - Optional URL to the atlas image file (if not specified in JSON)\n     * @returns Promise resolving when the atlas is loaded\n     */\n    async loadAtlas(atlasId: string, jsonUrl: string, imageUrl?: string): Promise<boolean> {\n        // Check if atlas is already loaded or loading\n        if (this.atlasStatus.get(atlasId) === LoadStatus.Loaded) {\n            this.log(`Atlas '${atlasId}' already loaded, skipping`);\n            return true;\n        }\n\n        if (this.atlasStatus.get(atlasId) === LoadStatus.Loading) {\n            this.log(`Atlas '${atlasId}' is already loading, waiting...`);\n\n            // Wait for atlas to finish loading\n            return new Promise<boolean>((resolve) => {\n                const checkInterval = setInterval(() => {\n                    const status = this.atlasStatus.get(atlasId);\n                    if (status === LoadStatus.Loaded) {\n                        clearInterval(checkInterval);\n                        resolve(true);\n                    } else if (status === LoadStatus.Failed) {\n                        clearInterval(checkInterval);\n                        resolve(false);\n                    }\n                }, 100);\n            });\n        }\n\n        try {\n            // Mark atlas as loading\n            this.atlasStatus.set(atlasId, LoadStatus.Loading);\n            this.log(`Loading atlas '${atlasId}' from ${jsonUrl}`);\n\n            // Load the atlas JSON\n            let atlasData: Atlas;\n            try {\n                const response = await fetch(jsonUrl);\n                if (!response.ok) {\n                    throw new Error(`Failed to load atlas JSON: ${response.statusText}`);\n                }\n                atlasData = await response.json();\n            } catch (error) {\n                this.log(`Error loading atlas JSON: ${error}`, 'error');\n                this.atlasStatus.set(atlasId, LoadStatus.Failed);\n                return false;\n            }\n\n            // Validate atlas data\n            if (!atlasData.frames || !atlasData.meta) {\n                this.log(`Invalid atlas data: missing frames or meta`, 'error');\n                this.atlasStatus.set(atlasId, LoadStatus.Failed);\n                return false;\n            }\n\n            // Determine the image URL\n            const atlasImageUrl = imageUrl ||\n                (atlasData.meta.image ?\n                    (this.options.basePath ? `${this.options.basePath}/${atlasData.meta.image}` : atlasData.meta.image) :\n                    null);\n\n            if (!atlasImageUrl) {\n                this.log(`Invalid atlas data: no image URL specified`, 'error');\n                this.atlasStatus.set(atlasId, LoadStatus.Failed);\n                return false;\n            }\n\n            // Load the atlas texture\n            let atlasTexture: Texture;\n            try {\n                // Check if the texture is already in the Assets cache\n                if (Assets.cache.has(atlasImageUrl)) {\n                    atlasTexture = Assets.cache.get(atlasImageUrl);\n                } else {\n                    // Load the texture\n                    this.log(`Loading atlas texture from ${atlasImageUrl}`);\n                    atlasTexture = await Assets.load(atlasImageUrl);\n                }\n\n                // Track the texture with ResourceManager\n                if (this.resourceManager) {\n                    this.resourceManager.trackTexture(atlasImageUrl, atlasTexture);\n                }\n            } catch (error) {\n                this.log(`Error loading atlas texture: ${error}`, 'error');\n                this.atlasStatus.set(atlasId, LoadStatus.Failed);\n                return false;\n            }\n\n            // Store the atlas data and texture\n            this.atlases.set(atlasId, atlasData);\n            this.atlasTextures.set(atlasId, atlasTexture);\n\n            // Mark atlas as loaded\n            this.atlasStatus.set(atlasId, LoadStatus.Loaded);\n            this.log(`Atlas '${atlasId}' loaded successfully with ${Object.keys(atlasData.frames).length} frames`);\n\n            return true;\n        } catch (error) {\n            this.log(`Unexpected error loading atlas: ${error}`, 'error');\n            this.atlasStatus.set(atlasId, LoadStatus.Failed);\n            return false;\n        }\n    }\n\n    /**\n     * Check if a frame exists in any loaded atlas\n     *\n     * @param frameName - Name of the frame to check\n     * @returns The ID of the atlas containing the frame, or null if not found\n     */\n    hasFrame(frameName: string): string | null {\n        // First check with the exact name\n        for (const [atlasId, atlas] of this.atlases.entries()) {\n            if (atlas.frames[frameName]) {\n                return atlasId;\n            }\n        }\n\n        // If not found and it looks like a path, extract the filename and try again\n        if (frameName.includes('/')) {\n            const filename = this.getFilenameFromPath(frameName);\n            for (const [atlasId, atlas] of this.atlases.entries()) {\n                if (atlas.frames[filename]) {\n                    if (this.options.debug) {\n                        console.log(`Found frame \"${filename}\" in atlas \"${atlasId}\" by extracting from path \"${frameName}\"`);\n                    }\n                    return atlasId;\n                }\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get a texture for a frame from an atlas\n     *\n     * @param frameName - Name of the frame\n     * @param atlasId - Optional ID of the atlas to use (if not specified, all atlases will be searched)\n     * @returns The texture for the frame, or null if not found\n     */\n    getFrameTexture(frameName: string, atlasId?: string): Texture | null {\n        // Use full path for cache key to avoid collisions\n        const cacheKey = atlasId ? `${atlasId}:${frameName}` : frameName;\n\n        // Check if we already have a cached texture for this frame\n        if (this.options.cacheFrameTextures && this.frameTextures.has(cacheKey)) {\n            return this.frameTextures.get(cacheKey)!;\n        }\n\n        // Find the atlas containing the frame\n        let targetAtlasId = atlasId;\n        let frameData: AtlasFrame | null = null;\n        let lookupName = frameName;\n\n        // If frameName looks like a path, try to extract just the filename\n        if (frameName.includes('/')) {\n            lookupName = this.getFilenameFromPath(frameName);\n        }\n\n        if (targetAtlasId) {\n            // Use the specified atlas\n            const atlas = this.atlases.get(targetAtlasId);\n            if (!atlas) {\n                this.log(`Atlas '${targetAtlasId}' not found`, 'warn');\n                return null;\n            }\n\n            // Try first with original name\n            frameData = atlas.frames[frameName] || null;\n\n            // If not found, try with extracted filename\n            if (!frameData && frameName !== lookupName) {\n                frameData = atlas.frames[lookupName] || null;\n\n                if (frameData && this.options.debug) {\n                    console.log(`Found frame \"${lookupName}\" in atlas \"${targetAtlasId}\" by extracting from path \"${frameName}\"`);\n                }\n            }\n\n            if (!frameData) {\n                this.log(`Frame '${frameName}' not found in atlas '${targetAtlasId}'`, 'warn');\n                return null;\n            }\n        } else {\n            // Search all atlases\n            for (const [id, atlas] of this.atlases.entries()) {\n                // Try first with original name\n                if (atlas.frames[frameName]) {\n                    targetAtlasId = id;\n                    frameData = atlas.frames[frameName];\n                    break;\n                }\n\n                // If not found, try with extracted filename\n                if (frameName !== lookupName && atlas.frames[lookupName]) {\n                    targetAtlasId = id;\n                    frameData = atlas.frames[lookupName];\n\n                    if (this.options.debug) {\n                        console.log(`Found frame \"${lookupName}\" in atlas \"${id}\" by extracting from path \"${frameName}\"`);\n                    }\n\n                    break;\n                }\n            }\n\n            if (!targetAtlasId || !frameData) {\n                this.log(`Frame '${frameName}' not found in any atlas`, 'warn');\n                return null;\n            }\n        }\n\n        // Get the atlas texture\n        const atlasTexture = this.atlasTextures.get(targetAtlasId!);\n        if (!atlasTexture) {\n            this.log(`Atlas texture for '${targetAtlasId}' not found`, 'warn');\n            return null;\n        }\n\n        // Create a new texture from the atlas using the frame data\n        try {\n            // Create the frame rectangle\n            const rect = new Rectangle(\n                frameData.frame.x,\n                frameData.frame.y,\n                frameData.frame.w,\n                frameData.frame.h\n            );\n\n            // Create the texture using the PixiJS v8 approach\n            // Get the source from the atlas texture\n            const source = atlasTexture.source;\n\n            // Create the frame texture with the new approach\n            const frameTexture = new Texture({\n                source, // Use the same source as the atlas texture\n                frame: rect, // The frame rectangle within the atlas\n                orig: frameData.trimmed && frameData.spriteSourceSize ?\n                    new Rectangle(\n                        frameData.spriteSourceSize.x,\n                        frameData.spriteSourceSize.y,\n                        frameData.spriteSourceSize.w,\n                        frameData.spriteSourceSize.h\n                    ) : undefined,\n                trim: frameData.trimmed ? rect : undefined,\n                rotate: frameData.rotated ? 2 : 0 // 2 = DEGREES_90, 0 = DEGREES_0\n            });\n\n            // Cache the frame texture if enabled - use the original frameName as the key for consistency\n            if (this.options.cacheFrameTextures) {\n                this.frameTextures.set(cacheKey, frameTexture);\n\n                // Track with ResourceManager if available\n                if (this.resourceManager) {\n                    // We don't directly track frame textures as they share the base texture\n                    // But we could track them if needed for special cases\n                }\n            }\n\n            return frameTexture;\n        } catch (error) {\n            this.log(`Error creating frame texture: ${error}`, 'error');\n            return null;\n        }\n    }\n\n    /**\n     * Get a list of all frame names in an atlas\n     *\n     * @param atlasId - ID of the atlas\n     * @returns Array of frame names, or empty array if atlas not found\n     */\n    getFrameNames(atlasId: string): string[] {\n        const atlas = this.atlases.get(atlasId);\n        if (!atlas) {\n            return [];\n        }\n\n        return Object.keys(atlas.frames);\n    }\n\n    /**\n     * Get a texture for an image, either from an atlas or as an individual texture\n     *\n     * @param imagePath - Path to the image\n     * @param atlasId - Optional ID of a specific atlas to check first\n     * @returns Promise resolving to the texture, or null if not found\n     */\n    async getTexture(imagePath: string, atlasId?: string): Promise<Texture | null> {\n        // First check if we have the texture as a frame in the specified atlas or any atlas\n        if (this.options.preferAtlas) {\n            // Try to find the frame using the full imagePath first\n            let frameTexture = this.getFrameTexture(imagePath, atlasId);\n\n            // If not found and it looks like a path, extract the filename and try again\n            if (!frameTexture && imagePath.includes('/')) {\n                const filename = this.getFilenameFromPath(imagePath);\n                frameTexture = this.getFrameTexture(filename, atlasId);\n\n                if (frameTexture && this.options.debug) {\n                    console.log(`Using atlas frame for ${imagePath} (found using filename ${filename}) ${atlasId ? `from atlas '${atlasId}'` : ''}`);\n                }\n\n                return frameTexture;\n            }\n\n            if (frameTexture) {\n                this.log(`Using atlas frame for ${imagePath} ${atlasId ? `from atlas '${atlasId}'` : ''}`);\n                return frameTexture;\n            }\n        }\n\n        // If not found in atlas or atlases are not preferred, try to load the individual image\n        // Check if we already have the texture loaded\n        if (this.imageTextures.has(imagePath)) {\n            return this.imageTextures.get(imagePath)!;\n        }\n\n        // Check the loading status\n        const status = this.imageStatus.get(imagePath);\n        if (status === LoadStatus.Loading) {\n            this.log(`Image ${imagePath} is already loading, waiting...`);\n\n            // Wait for image to finish loading\n            return new Promise<Texture | null>((resolve) => {\n                const checkInterval = setInterval(() => {\n                    const currentStatus = this.imageStatus.get(imagePath);\n                    if (currentStatus === LoadStatus.Loaded) {\n                        clearInterval(checkInterval);\n                        resolve(this.imageTextures.get(imagePath) || null);\n                    } else if (currentStatus === LoadStatus.Failed) {\n                        clearInterval(checkInterval);\n                        resolve(null);\n                    }\n                }, 100);\n            });\n        }\n\n        // Load the image\n        try {\n            this.imageStatus.set(imagePath, LoadStatus.Loading);\n\n            // Check if the texture is already in the Assets cache\n            let texture: Texture;\n            if (Assets.cache.has(imagePath)) {\n                texture = Assets.cache.get(imagePath);\n            } else {\n                // Load the texture\n                this.log(`Loading individual texture from ${imagePath}`);\n                texture = await Assets.load(imagePath);\n            }\n\n            // Store and track the texture\n            this.imageTextures.set(imagePath, texture);\n            this.imageStatus.set(imagePath, LoadStatus.Loaded);\n\n            // Track with ResourceManager\n            if (this.resourceManager) {\n                this.resourceManager.trackTexture(imagePath, texture);\n            }\n\n            return texture;\n        } catch (error) {\n            this.log(`Error loading individual texture ${imagePath}: ${error}`, 'error');\n            this.imageStatus.set(imagePath, LoadStatus.Failed);\n            return null;\n        }\n    }\n\n    /**\n     * Preload a set of images, preferably from atlas(es)\n     *\n     * @param imagePaths - Array of image paths to preload\n     * @param atlasIds - Optional array of atlas IDs to search for frames\n     * @param progressCallback - Optional callback for loading progress\n     * @returns Promise resolving when all images are loaded\n     */\n    async preloadImages(\n        imagePaths: string[],\n        atlasIds?: string[],\n        progressCallback?: (progress: number) => void\n    ): Promise<void> {\n        if (!imagePaths.length) {\n            return;\n        }\n\n        let loadedCount = 0;\n        const totalCount = imagePaths.length;\n\n        // Function to update progress\n        const updateProgress = () => {\n            loadedCount++;\n            if (progressCallback) {\n                progressCallback(loadedCount / totalCount);\n            }\n        };\n\n        // Process each image\n        const loadPromises = imagePaths.map(async (imagePath) => {\n            try {\n                // Try to get the texture, optionally limiting to specified atlas IDs\n                if (atlasIds && atlasIds.length > 0) {\n                    // Try each specified atlas in order\n                    for (const atlasId of atlasIds) {\n                        const texture = await this.getTexture(imagePath, atlasId);\n                        if (texture) {\n                            updateProgress();\n                            return; // Found in one of the specified atlases\n                        }\n                    }\n\n                    // If not found in specified atlases, try individual texture\n                    await this.getTexture(imagePath);\n                } else {\n                    // No atlas IDs specified, try any atlas or individual texture\n                    await this.getTexture(imagePath);\n                }\n\n                updateProgress();\n            } catch (error) {\n                this.log(`Error preloading image ${imagePath}: ${error}`, 'warn');\n                updateProgress();\n            }\n        });\n\n        // Wait for all images to load\n        await Promise.all(loadPromises);\n    }\n\n    /**\n     * Unload an atlas and its resources\n     *\n     * @param atlasId - ID of the atlas to unload\n     */\n    unloadAtlas(atlasId: string): void {\n        // Check if the atlas exists\n        if (!this.atlases.has(atlasId)) {\n            this.log(`Atlas '${atlasId}' not found, cannot unload`, 'warn');\n            return;\n        }\n\n        try {\n            // Get the atlas texture\n            const atlasTexture = this.atlasTextures.get(atlasId);\n\n            // Remove all frame textures for this atlas\n            if (this.options.cacheFrameTextures) {\n                const prefix = `${atlasId}:`;\n                for (const [key] of this.frameTextures.entries()) {\n                    if (key.startsWith(prefix)) {\n                        // Do not destroy the texture as it shares the base texture with the atlas\n                        this.frameTextures.delete(key);\n                    }\n                }\n            }\n\n            // Remove the atlas data\n            this.atlases.delete(atlasId);\n\n            // Remove the atlas texture\n            if (atlasTexture) {\n                this.atlasTextures.delete(atlasId);\n\n                // Let ResourceManager handle the actual destruction\n                // We don't need to call destroy here as that's handled by ResourceManager\n            }\n\n            // Clear the loading status\n            this.atlasStatus.delete(atlasId);\n\n            this.log(`Atlas '${atlasId}' unloaded`);\n        } catch (error) {\n            this.log(`Error unloading atlas '${atlasId}': ${error}`, 'error');\n        }\n    }\n\n    /**\n     * Unload an individual image texture\n     *\n     * @param imagePath - Path to the image\n     */\n    unloadTexture(imagePath: string): void {\n        // Check if the texture exists\n        if (!this.imageTextures.has(imagePath)) {\n            return;\n        }\n\n        try {\n            // Remove the texture\n            this.imageTextures.delete(imagePath);\n\n            // Clear the loading status\n            this.imageStatus.delete(imagePath);\n\n            // ResourceManager handles the actual texture destruction\n\n            this.log(`Texture ${imagePath} unloaded`);\n        } catch (error) {\n            this.log(`Error unloading texture ${imagePath}: ${error}`, 'error');\n        }\n    }\n\n    /**\n     * Clean up all resources\n     */\n    dispose(): void {\n        try {\n            // Clear all cached data\n            this.atlases.clear();\n            this.atlasTextures.clear();\n            this.frameTextures.clear();\n            this.imageTextures.clear();\n            this.atlasStatus.clear();\n            this.imageStatus.clear();\n\n            // ResourceManager handles actual resource destruction\n\n            this.log('AtlasManager disposed');\n        } catch (error) {\n            this.log(`Error disposing AtlasManager: ${error}`, 'error');\n        }\n    }\n\n    /**\n     * Log a message with the appropriate level\n     *\n     * @param message - Message to log\n     * @param level - Log level\n     */\n    private log(message: string, level: 'log' | 'warn' | 'error' = 'log'): void {\n        if (!this.options.debug && level === 'log') {\n            return;\n        }\n\n        const prefix = '[AtlasManager]';\n\n        switch (level) {\n            case 'warn':\n                console.warn(`${prefix} ${message}`);\n                break;\n            case 'error':\n                console.error(`${prefix} ${message}`);\n                break;\n            default:\n                console.log(`${prefix} ${message}`);\n                break;\n        }\n    }\n}"],"names":["Assets","Rectangle","Texture"],"mappings":";;;;;;;AAIA,MAAM,aAAgB,GAAA,KAAA;AAyFf,MAAM,YAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BtB,WAAY,CAAA,OAAA,GAA+B,EAAC,EAAG,eAAmC,EAAA;AA7BlF;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,SAAA,sBAAkC,GAAI,EAAA,CAAA;AAG9C;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,sBAA0C,GAAI,EAAA,CAAA;AAGtD;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,sBAA0C,GAAI,EAAA,CAAA;AAGtD;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,sBAA0C,GAAI,EAAA,CAAA;AAGtD;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,aAAA,sBAA2C,GAAI,EAAA,CAAA;AAGvD;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,aAAA,sBAA2C,GAAI,EAAA,CAAA;AAGvD;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AAGR;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AASJ,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACX,KAAO,EAAA,aAAA;AAAA,MACP,WAAa,EAAA,IAAA;AAAA,MACb,kBAAoB,EAAA,IAAA;AAAA,MACpB,QAAU,EAAA,EAAA;AAAA,MACV,GAAG;AAAA,KACP;AAEA,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA;AAEvB,IAAI,IAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AACpB,MAAQ,OAAA,CAAA,GAAA,CAAI,wCAA0C,EAAA,IAAA,CAAK,OAAO,CAAA;AAAA;AACtE;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,oBAAoB,SAA2B,EAAA;AAEnD,IAAI,IAAA,CAAC,WAAkB,OAAA,EAAA;AAGvB,IAAA,MAAM,WAAW,SAAU,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,KAAS,IAAA,SAAA;AAE/C,IAAI,IAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AACpB,MAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,oBAAA,EAAuB,QAAQ,CAAA,aAAA,EAAgB,SAAS,CAAG,CAAA,CAAA,CAAA;AAAA;AAG3E,IAAO,OAAA,QAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,SAAA,CAAU,OAAiB,EAAA,OAAA,EAAiB,QAAqC,EAAA;AAEnF,IAAA,IAAI,IAAK,CAAA,WAAA,CAAY,GAAI,CAAA,OAAO,MAAM,QAAmB,eAAA;AACrD,MAAK,IAAA,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,OAAO,CAA4B,0BAAA,CAAA,CAAA;AACtD,MAAO,OAAA,IAAA;AAAA;AAGX,IAAA,IAAI,IAAK,CAAA,WAAA,CAAY,GAAI,CAAA,OAAO,MAAM,SAAoB,gBAAA;AACtD,MAAK,IAAA,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,OAAO,CAAkC,gCAAA,CAAA,CAAA;AAG5D,MAAO,OAAA,IAAI,OAAiB,CAAA,CAAC,OAAY,KAAA;AACrC,QAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACpC,UAAA,MAAM,MAAS,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,OAAO,CAAA;AAC3C,UAAA,IAAI,WAAW,QAAmB,eAAA;AAC9B,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,WAChB,MAAA,IAAW,WAAW,QAAmB,eAAA;AACrC,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AACjB,WACD,GAAG,CAAA;AAAA,OACT,CAAA;AAAA;AAGL,IAAI,IAAA;AAEA,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,SAAkB,eAAA;AAChD,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,eAAA,EAAkB,OAAO,CAAA,OAAA,EAAU,OAAO,CAAE,CAAA,CAAA;AAGrD,MAAI,IAAA,SAAA;AACJ,MAAI,IAAA;AACA,QAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,OAAO,CAAA;AACpC,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AACd,UAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAEvE,QAAY,SAAA,GAAA,MAAM,SAAS,IAAK,EAAA;AAAA,eAC3B,KAAO,EAAA;AACZ,QAAA,IAAA,CAAK,GAAI,CAAA,CAAA,0BAAA,EAA6B,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AACtD,QAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,QAAO,OAAA,KAAA;AAAA;AAIX,MAAA,IAAI,CAAC,SAAA,CAAU,MAAU,IAAA,CAAC,UAAU,IAAM,EAAA;AACtC,QAAK,IAAA,CAAA,GAAA,CAAI,8CAA8C,OAAO,CAAA;AAC9D,QAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,QAAO,OAAA,KAAA;AAAA;AAIX,MAAA,MAAM,gBAAgB,QACjB,KAAA,SAAA,CAAU,KAAK,KACX,GAAA,IAAA,CAAK,QAAQ,QAAW,GAAA,CAAA,EAAG,KAAK,OAAQ,CAAA,QAAQ,IAAI,SAAU,CAAA,IAAA,CAAK,KAAK,CAAK,CAAA,GAAA,SAAA,CAAU,KAAK,KAC7F,GAAA,IAAA,CAAA;AAER,MAAA,IAAI,CAAC,aAAe,EAAA;AAChB,QAAK,IAAA,CAAA,GAAA,CAAI,8CAA8C,OAAO,CAAA;AAC9D,QAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,QAAO,OAAA,KAAA;AAAA;AAIX,MAAI,IAAA,YAAA;AACJ,MAAI,IAAA;AAEA,QAAA,IAAIA,cAAO,CAAA,KAAA,CAAM,GAAI,CAAA,aAAa,CAAG,EAAA;AACjC,UAAe,YAAA,GAAAA,cAAA,CAAO,KAAM,CAAA,GAAA,CAAI,aAAa,CAAA;AAAA,SAC1C,MAAA;AAEH,UAAK,IAAA,CAAA,GAAA,CAAI,CAA8B,2BAAA,EAAA,aAAa,CAAE,CAAA,CAAA;AACtD,UAAe,YAAA,GAAA,MAAMA,cAAO,CAAA,IAAA,CAAK,aAAa,CAAA;AAAA;AAIlD,QAAA,IAAI,KAAK,eAAiB,EAAA;AACtB,UAAK,IAAA,CAAA,eAAA,CAAgB,YAAa,CAAA,aAAA,EAAe,YAAY,CAAA;AAAA;AACjE,eACK,KAAO,EAAA;AACZ,QAAA,IAAA,CAAK,GAAI,CAAA,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AACzD,QAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,QAAO,OAAA,KAAA;AAAA;AAIX,MAAK,IAAA,CAAA,OAAA,CAAQ,GAAI,CAAA,OAAA,EAAS,SAAS,CAAA;AACnC,MAAK,IAAA,CAAA,aAAA,CAAc,GAAI,CAAA,OAAA,EAAS,YAAY,CAAA;AAG5C,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,MAAK,IAAA,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,OAAO,CAA8B,2BAAA,EAAA,MAAA,CAAO,KAAK,SAAU,CAAA,MAAM,CAAE,CAAA,MAAM,CAAS,OAAA,CAAA,CAAA;AAErG,MAAO,OAAA,IAAA;AAAA,aACF,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AAC5D,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,OAAA,EAAS,QAAiB,cAAA;AAC/C,MAAO,OAAA,KAAA;AAAA;AACX;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAS,SAAkC,EAAA;AAEvC,IAAA,KAAA,MAAW,CAAC,OAAS,EAAA,KAAK,KAAK,IAAK,CAAA,OAAA,CAAQ,SAAW,EAAA;AACnD,MAAI,IAAA,KAAA,CAAM,MAAO,CAAA,SAAS,CAAG,EAAA;AACzB,QAAO,OAAA,OAAA;AAAA;AACX;AAIJ,IAAI,IAAA,SAAA,CAAU,QAAS,CAAA,GAAG,CAAG,EAAA;AACzB,MAAM,MAAA,QAAA,GAAW,IAAK,CAAA,mBAAA,CAAoB,SAAS,CAAA;AACnD,MAAA,KAAA,MAAW,CAAC,OAAS,EAAA,KAAK,KAAK,IAAK,CAAA,OAAA,CAAQ,SAAW,EAAA;AACnD,QAAI,IAAA,KAAA,CAAM,MAAO,CAAA,QAAQ,CAAG,EAAA;AACxB,UAAI,IAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AACpB,YAAA,OAAA,CAAQ,IAAI,CAAgB,aAAA,EAAA,QAAQ,eAAe,OAAO,CAAA,2BAAA,EAA8B,SAAS,CAAG,CAAA,CAAA,CAAA;AAAA;AAExG,UAAO,OAAA,OAAA;AAAA;AACX;AACJ;AAGJ,IAAO,OAAA,IAAA;AAAA;AACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAA,CAAgB,WAAmB,OAAkC,EAAA;AAEjE,IAAA,MAAM,WAAW,OAAU,GAAA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,SAAS,CAAK,CAAA,GAAA,SAAA;AAGvD,IAAA,IAAI,KAAK,OAAQ,CAAA,kBAAA,IAAsB,KAAK,aAAc,CAAA,GAAA,CAAI,QAAQ,CAAG,EAAA;AACrE,MAAO,OAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,QAAQ,CAAA;AAAA;AAI1C,IAAA,IAAI,aAAgB,GAAA,OAAA;AACpB,IAAA,IAAI,SAA+B,GAAA,IAAA;AACnC,IAAA,IAAI,UAAa,GAAA,SAAA;AAGjB,IAAI,IAAA,SAAA,CAAU,QAAS,CAAA,GAAG,CAAG,EAAA;AACzB,MAAa,UAAA,GAAA,IAAA,CAAK,oBAAoB,SAAS,CAAA;AAAA;AAGnD,IAAA,IAAI,aAAe,EAAA;AAEf,MAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,aAAa,CAAA;AAC5C,MAAA,IAAI,CAAC,KAAO,EAAA;AACR,QAAA,IAAA,CAAK,GAAI,CAAA,CAAA,OAAA,EAAU,aAAa,CAAA,WAAA,CAAA,EAAe,MAAM,CAAA;AACrD,QAAO,OAAA,IAAA;AAAA;AAIX,MAAY,SAAA,GAAA,KAAA,CAAM,MAAO,CAAA,SAAS,CAAK,IAAA,IAAA;AAGvC,MAAI,IAAA,CAAC,SAAa,IAAA,SAAA,KAAc,UAAY,EAAA;AACxC,QAAY,SAAA,GAAA,KAAA,CAAM,MAAO,CAAA,UAAU,CAAK,IAAA,IAAA;AAExC,QAAI,IAAA,SAAA,IAAa,IAAK,CAAA,OAAA,CAAQ,KAAO,EAAA;AACjC,UAAA,OAAA,CAAQ,IAAI,CAAgB,aAAA,EAAA,UAAU,eAAe,aAAa,CAAA,2BAAA,EAA8B,SAAS,CAAG,CAAA,CAAA,CAAA;AAAA;AAChH;AAGJ,MAAA,IAAI,CAAC,SAAW,EAAA;AACZ,QAAA,IAAA,CAAK,IAAI,CAAU,OAAA,EAAA,SAAS,CAAyB,sBAAA,EAAA,aAAa,KAAK,MAAM,CAAA;AAC7E,QAAO,OAAA,IAAA;AAAA;AACX,KACG,MAAA;AAEH,MAAA,KAAA,MAAW,CAAC,EAAI,EAAA,KAAK,KAAK,IAAK,CAAA,OAAA,CAAQ,SAAW,EAAA;AAE9C,QAAI,IAAA,KAAA,CAAM,MAAO,CAAA,SAAS,CAAG,EAAA;AACzB,UAAgB,aAAA,GAAA,EAAA;AAChB,UAAY,SAAA,GAAA,KAAA,CAAM,OAAO,SAAS,CAAA;AAClC,UAAA;AAAA;AAIJ,QAAA,IAAI,SAAc,KAAA,UAAA,IAAc,KAAM,CAAA,MAAA,CAAO,UAAU,CAAG,EAAA;AACtD,UAAgB,aAAA,GAAA,EAAA;AAChB,UAAY,SAAA,GAAA,KAAA,CAAM,OAAO,UAAU,CAAA;AAEnC,UAAI,IAAA,IAAA,CAAK,QAAQ,KAAO,EAAA;AACpB,YAAA,OAAA,CAAQ,IAAI,CAAgB,aAAA,EAAA,UAAU,eAAe,EAAE,CAAA,2BAAA,EAA8B,SAAS,CAAG,CAAA,CAAA,CAAA;AAAA;AAGrG,UAAA;AAAA;AACJ;AAGJ,MAAI,IAAA,CAAC,aAAiB,IAAA,CAAC,SAAW,EAAA;AAC9B,QAAA,IAAA,CAAK,GAAI,CAAA,CAAA,OAAA,EAAU,SAAS,CAAA,wBAAA,CAAA,EAA4B,MAAM,CAAA;AAC9D,QAAO,OAAA,IAAA;AAAA;AACX;AAIJ,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,aAAc,CAAA;AAC1D,IAAA,IAAI,CAAC,YAAc,EAAA;AACf,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,mBAAA,EAAsB,aAAa,CAAA,WAAA,CAAA,EAAe,MAAM,CAAA;AACjE,MAAO,OAAA,IAAA;AAAA;AAIX,IAAI,IAAA;AAEA,MAAA,MAAM,OAAO,IAAIC,iBAAA;AAAA,QACb,UAAU,KAAM,CAAA,CAAA;AAAA,QAChB,UAAU,KAAM,CAAA,CAAA;AAAA,QAChB,UAAU,KAAM,CAAA,CAAA;AAAA,QAChB,UAAU,KAAM,CAAA;AAAA,OACpB;AAIA,MAAA,MAAM,SAAS,YAAa,CAAA,MAAA;AAG5B,MAAM,MAAA,YAAA,GAAe,IAAIC,eAAQ,CAAA;AAAA,QAC7B,MAAA;AAAA;AAAA,QACA,KAAO,EAAA,IAAA;AAAA;AAAA,QACP,IAAM,EAAA,SAAA,CAAU,OAAW,IAAA,SAAA,CAAU,mBACjC,IAAID,iBAAA;AAAA,UACA,UAAU,gBAAiB,CAAA,CAAA;AAAA,UAC3B,UAAU,gBAAiB,CAAA,CAAA;AAAA,UAC3B,UAAU,gBAAiB,CAAA,CAAA;AAAA,UAC3B,UAAU,gBAAiB,CAAA;AAAA,SAC3B,GAAA,KAAA,CAAA;AAAA,QACR,IAAA,EAAM,SAAU,CAAA,OAAA,GAAU,IAAO,GAAA,KAAA,CAAA;AAAA,QACjC,MAAA,EAAQ,SAAU,CAAA,OAAA,GAAU,CAAI,GAAA;AAAA;AAAA,OACnC,CAAA;AAGD,MAAI,IAAA,IAAA,CAAK,QAAQ,kBAAoB,EAAA;AACjC,QAAK,IAAA,CAAA,aAAA,CAAc,GAAI,CAAA,QAAA,EAAU,YAAY,CAAA;AAG7C,QAAA,IAAI,KAAK,eAAiB,EAAA;AAAA;AAG1B;AAGJ,MAAO,OAAA,YAAA;AAAA,aACF,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AAC1D,MAAO,OAAA,IAAA;AAAA;AACX;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,cAAc,OAA2B,EAAA;AACrC,IAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,OAAO,CAAA;AACtC,IAAA,IAAI,CAAC,KAAO,EAAA;AACR,MAAA,OAAO,EAAC;AAAA;AAGZ,IAAO,OAAA,MAAA,CAAO,IAAK,CAAA,KAAA,CAAM,MAAM,CAAA;AAAA;AACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAW,CAAA,SAAA,EAAmB,OAA2C,EAAA;AAE3E,IAAI,IAAA,IAAA,CAAK,QAAQ,WAAa,EAAA;AAE1B,MAAA,IAAI,YAAe,GAAA,IAAA,CAAK,eAAgB,CAAA,SAAA,EAAW,OAAO,CAAA;AAG1D,MAAA,IAAI,CAAC,YAAA,IAAgB,SAAU,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC1C,QAAM,MAAA,QAAA,GAAW,IAAK,CAAA,mBAAA,CAAoB,SAAS,CAAA;AACnD,QAAe,YAAA,GAAA,IAAA,CAAK,eAAgB,CAAA,QAAA,EAAU,OAAO,CAAA;AAErD,QAAI,IAAA,YAAA,IAAgB,IAAK,CAAA,OAAA,CAAQ,KAAO,EAAA;AACpC,UAAQ,OAAA,CAAA,GAAA,CAAI,CAAyB,sBAAA,EAAA,SAAS,CAA0B,uBAAA,EAAA,QAAQ,CAAK,EAAA,EAAA,OAAA,GAAU,CAAe,YAAA,EAAA,OAAO,CAAM,CAAA,CAAA,GAAA,EAAE,CAAE,CAAA,CAAA;AAAA;AAGnI,QAAO,OAAA,YAAA;AAAA;AAGX,MAAA,IAAI,YAAc,EAAA;AACd,QAAK,IAAA,CAAA,GAAA,CAAI,yBAAyB,SAAS,CAAA,CAAA,EAAI,UAAU,CAAe,YAAA,EAAA,OAAO,CAAM,CAAA,CAAA,GAAA,EAAE,CAAE,CAAA,CAAA;AACzF,QAAO,OAAA,YAAA;AAAA;AACX;AAKJ,IAAA,IAAI,IAAK,CAAA,aAAA,CAAc,GAAI,CAAA,SAAS,CAAG,EAAA;AACnC,MAAO,OAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,SAAS,CAAA;AAAA;AAI3C,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,SAAS,CAAA;AAC7C,IAAA,IAAI,WAAW,SAAoB,gBAAA;AAC/B,MAAK,IAAA,CAAA,GAAA,CAAI,CAAS,MAAA,EAAA,SAAS,CAAiC,+BAAA,CAAA,CAAA;AAG5D,MAAO,OAAA,IAAI,OAAwB,CAAA,CAAC,OAAY,KAAA;AAC5C,QAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACpC,UAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,SAAS,CAAA;AACpD,UAAA,IAAI,kBAAkB,QAAmB,eAAA;AACrC,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,OAAA,CAAQ,IAAK,CAAA,aAAA,CAAc,GAAI,CAAA,SAAS,KAAK,IAAI,CAAA;AAAA,WACrD,MAAA,IAAW,kBAAkB,QAAmB,eAAA;AAC5C,YAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,YAAA,OAAA,CAAQ,IAAI,CAAA;AAAA;AAChB,WACD,GAAG,CAAA;AAAA,OACT,CAAA;AAAA;AAIL,IAAI,IAAA;AACA,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,SAAA,EAAW,SAAkB,eAAA;AAGlD,MAAI,IAAA,OAAA;AACJ,MAAA,IAAID,cAAO,CAAA,KAAA,CAAM,GAAI,CAAA,SAAS,CAAG,EAAA;AAC7B,QAAU,OAAA,GAAAA,cAAA,CAAO,KAAM,CAAA,GAAA,CAAI,SAAS,CAAA;AAAA,OACjC,MAAA;AAEH,QAAK,IAAA,CAAA,GAAA,CAAI,CAAmC,gCAAA,EAAA,SAAS,CAAE,CAAA,CAAA;AACvD,QAAU,OAAA,GAAA,MAAMA,cAAO,CAAA,IAAA,CAAK,SAAS,CAAA;AAAA;AAIzC,MAAK,IAAA,CAAA,aAAA,CAAc,GAAI,CAAA,SAAA,EAAW,OAAO,CAAA;AACzC,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,SAAA,EAAW,QAAiB,cAAA;AAGjD,MAAA,IAAI,KAAK,eAAiB,EAAA;AACtB,QAAK,IAAA,CAAA,eAAA,CAAgB,YAAa,CAAA,SAAA,EAAW,OAAO,CAAA;AAAA;AAGxD,MAAO,OAAA,OAAA;AAAA,aACF,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,IAAI,CAAoC,iCAAA,EAAA,SAAS,CAAK,EAAA,EAAA,KAAK,IAAI,OAAO,CAAA;AAC3E,MAAK,IAAA,CAAA,WAAA,CAAY,GAAI,CAAA,SAAA,EAAW,QAAiB,cAAA;AACjD,MAAO,OAAA,IAAA;AAAA;AACX;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACF,UACA,EAAA,QAAA,EACA,gBACa,EAAA;AACb,IAAI,IAAA,CAAC,WAAW,MAAQ,EAAA;AACpB,MAAA;AAAA;AAGJ,IAAA,IAAI,WAAc,GAAA,CAAA;AAClB,IAAA,MAAM,aAAa,UAAW,CAAA,MAAA;AAG9B,IAAA,MAAM,iBAAiB,MAAM;AACzB,MAAA,WAAA,EAAA;AACA,MAAA,IAAI,gBAAkB,EAAA;AAClB,QAAA,gBAAA,CAAiB,cAAc,UAAU,CAAA;AAAA;AAC7C,KACJ;AAGA,IAAA,MAAM,YAAe,GAAA,UAAA,CAAW,GAAI,CAAA,OAAO,SAAc,KAAA;AACrD,MAAI,IAAA;AAEA,QAAI,IAAA,QAAA,IAAY,QAAS,CAAA,MAAA,GAAS,CAAG,EAAA;AAEjC,UAAA,KAAA,MAAW,WAAW,QAAU,EAAA;AAC5B,YAAA,MAAM,OAAU,GAAA,MAAM,IAAK,CAAA,UAAA,CAAW,WAAW,OAAO,CAAA;AACxD,YAAA,IAAI,OAAS,EAAA;AACT,cAAe,cAAA,EAAA;AACf,cAAA;AAAA;AACJ;AAIJ,UAAM,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,SAC5B,MAAA;AAEH,UAAM,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA;AAGnC,QAAe,cAAA,EAAA;AAAA,eACV,KAAO,EAAA;AACZ,QAAA,IAAA,CAAK,IAAI,CAA0B,uBAAA,EAAA,SAAS,CAAK,EAAA,EAAA,KAAK,IAAI,MAAM,CAAA;AAChE,QAAe,cAAA,EAAA;AAAA;AACnB,KACH,CAAA;AAGD,IAAM,MAAA,OAAA,CAAQ,IAAI,YAAY,CAAA;AAAA;AAClC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,OAAuB,EAAA;AAE/B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAQ,CAAA,GAAA,CAAI,OAAO,CAAG,EAAA;AAC5B,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,OAAA,EAAU,OAAO,CAAA,0BAAA,CAAA,EAA8B,MAAM,CAAA;AAC9D,MAAA;AAAA;AAGJ,IAAI,IAAA;AAEA,MAAA,MAAM,YAAe,GAAA,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,OAAO,CAAA;AAGnD,MAAI,IAAA,IAAA,CAAK,QAAQ,kBAAoB,EAAA;AACjC,QAAM,MAAA,MAAA,GAAS,GAAG,OAAO,CAAA,CAAA,CAAA;AACzB,QAAA,KAAA,MAAW,CAAC,GAAG,CAAA,IAAK,IAAK,CAAA,aAAA,CAAc,SAAW,EAAA;AAC9C,UAAI,IAAA,GAAA,CAAI,UAAW,CAAA,MAAM,CAAG,EAAA;AAExB,YAAK,IAAA,CAAA,aAAA,CAAc,OAAO,GAAG,CAAA;AAAA;AACjC;AACJ;AAIJ,MAAK,IAAA,CAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AAG3B,MAAA,IAAI,YAAc,EAAA;AACd,QAAK,IAAA,CAAA,aAAA,CAAc,OAAO,OAAO,CAAA;AAAA;AAOrC,MAAK,IAAA,CAAA,WAAA,CAAY,OAAO,OAAO,CAAA;AAE/B,MAAK,IAAA,CAAA,GAAA,CAAI,CAAU,OAAA,EAAA,OAAO,CAAY,UAAA,CAAA,CAAA;AAAA,aACjC,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,IAAI,CAA0B,uBAAA,EAAA,OAAO,CAAM,GAAA,EAAA,KAAK,IAAI,OAAO,CAAA;AAAA;AACpE;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,cAAc,SAAyB,EAAA;AAEnC,IAAA,IAAI,CAAC,IAAA,CAAK,aAAc,CAAA,GAAA,CAAI,SAAS,CAAG,EAAA;AACpC,MAAA;AAAA;AAGJ,IAAI,IAAA;AAEA,MAAK,IAAA,CAAA,aAAA,CAAc,OAAO,SAAS,CAAA;AAGnC,MAAK,IAAA,CAAA,WAAA,CAAY,OAAO,SAAS,CAAA;AAIjC,MAAK,IAAA,CAAA,GAAA,CAAI,CAAW,QAAA,EAAA,SAAS,CAAW,SAAA,CAAA,CAAA;AAAA,aACnC,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,IAAI,CAA2B,wBAAA,EAAA,SAAS,CAAK,EAAA,EAAA,KAAK,IAAI,OAAO,CAAA;AAAA;AACtE;AACJ;AAAA;AAAA;AAAA,EAKA,OAAgB,GAAA;AACZ,IAAI,IAAA;AAEA,MAAA,IAAA,CAAK,QAAQ,KAAM,EAAA;AACnB,MAAA,IAAA,CAAK,cAAc,KAAM,EAAA;AACzB,MAAA,IAAA,CAAK,cAAc,KAAM,EAAA;AACzB,MAAA,IAAA,CAAK,cAAc,KAAM,EAAA;AACzB,MAAA,IAAA,CAAK,YAAY,KAAM,EAAA;AACvB,MAAA,IAAA,CAAK,YAAY,KAAM,EAAA;AAIvB,MAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA;AAAA,aAC3B,KAAO,EAAA;AACZ,MAAA,IAAA,CAAK,GAAI,CAAA,CAAA,8BAAA,EAAiC,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA;AAAA;AAC9D;AACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,GAAA,CAAI,OAAiB,EAAA,KAAA,GAAkC,KAAa,EAAA;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,OAAQ,CAAA,KAAA,IAAS,UAAU,KAAO,EAAA;AACxC,MAAA;AAAA;AAGJ,IAAA,MAAM,MAAS,GAAA,gBAAA;AAEf,IAAA,QAAQ,KAAO;AAAA,MACX,KAAK,MAAA;AACD,QAAA,OAAA,CAAQ,IAAK,CAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAE,CAAA,CAAA;AACnC,QAAA;AAAA,MACJ,KAAK,OAAA;AACD,QAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAE,CAAA,CAAA;AACpC,QAAA;AAAA,MACJ;AACI,QAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAE,CAAA,CAAA;AAClC,QAAA;AAAA;AACR;AAER;;;;"}