{"version":3,"file":"Extensions.mjs","sources":["../../src/extensions/Extensions.ts"],"sourcesContent":["/**\n * Collection of valid extension types.\n * @category extensions\n * @advanced\n */\nenum ExtensionType\n{\n    /** extensions that are registered as Application plugins */\n    Application = 'application',\n\n    /** extensions that are registered as WebGL render pipes */\n    WebGLPipes = 'webgl-pipes',\n    /** extensions that are registered as WebGL render pipes adaptors */\n    WebGLPipesAdaptor = 'webgl-pipes-adaptor',\n    /** extensions that are registered as WebGL render systems */\n    WebGLSystem = 'webgl-system',\n\n    /** extensions that are registered as WebGPU render pipes */\n    WebGPUPipes = 'webgpu-pipes',\n    /** extensions that are registered as WebGPU render pipes adaptors */\n    WebGPUPipesAdaptor = 'webgpu-pipes-adaptor',\n    /** extensions that are registered as WebGPU render systems */\n    WebGPUSystem = 'webgpu-system',\n\n    /** extensions that are registered as Canvas render pipes */\n    CanvasSystem = 'canvas-system',\n    /** extensions that are registered as Canvas render pipes adaptors */\n    CanvasPipesAdaptor = 'canvas-pipes-adaptor',\n    /** extensions that are registered as Canvas render systems */\n    CanvasPipes = 'canvas-pipes',\n\n    /** extensions that combine the other Asset extensions */\n    Asset = 'asset',\n    /** extensions that are used to load assets through Assets */\n    LoadParser = 'load-parser',\n    /** extensions that are used to resolve asset urls through Assets */\n    ResolveParser = 'resolve-parser',\n    /** extensions that are used to handle how urls are cached by Assets */\n    CacheParser = 'cache-parser',\n    /** extensions that are used to add/remove available resources from Assets */\n    DetectionParser = 'detection-parser',\n\n    /** extensions that are registered with the MaskEffectManager */\n    MaskEffect = 'mask-effect',\n\n    /** A type of extension for creating a new advanced blend mode */\n    BlendMode = 'blend-mode',\n\n    /** A type of extension that will be used to auto detect a resource type */\n    TextureSource = 'texture-source',\n\n    /** A type of extension that will be used to auto detect an environment */\n    Environment = 'environment',\n\n    /** A type of extension for building and triangulating custom shapes used in graphics. */\n    ShapeBuilder = 'shape-builder',\n\n    /** A type of extension for creating custom batchers used in rendering. */\n    Batcher = 'batcher',\n}\n\n/**\n * The metadata for an extension.\n * @category extensions\n * @ignore\n */\ninterface ExtensionMetadataDetails\n{\n    /** The extension type, can be multiple types */\n    type: ExtensionType | ExtensionType[];\n    /** Optional. Some plugins provide an API name/property, to make them more easily accessible */\n    name?: string;\n    /** Optional, used for sorting the plugins in a particular order */\n    priority?: number;\n}\n\n/**\n * The metadata for an extension.\n * @category extensions\n * @advanced\n */\ntype ExtensionMetadata = ExtensionType | ExtensionMetadataDetails;\n\n/**\n * Format when registering an extension. Generally, the extension\n * should have these values as `extension` static property,\n * but you can override name or type by providing an object.\n * @category extensions\n * @advanced\n */\ninterface ExtensionFormat\n{\n    /** The extension type, can be multiple types */\n    type: ExtensionType | ExtensionType[];\n    /** Optional. Some plugins provide an API name/property, such as Renderer plugins */\n    name?: string;\n    /** Optional, used for sorting the plugins in a particular order */\n    priority?: number;\n    /** Reference to the plugin object/class */\n    ref: any;\n}\n\n/**\n * Extension format that is used internally for registrations.\n * @category extensions\n * @ignore\n */\ninterface StrictExtensionFormat extends ExtensionFormat\n{\n    /** The extension type, always expressed as multiple, even if a single */\n    type: ExtensionType[];\n}\n\n/**\n * The function that is called when an extension is added or removed.\n * @category extensions\n * @ignore\n */\ntype ExtensionHandler = (extension: StrictExtensionFormat) => void;\n\n/**\n * Convert input into extension format data.\n * @ignore\n */\nconst normalizeExtension = (ext: ExtensionFormat | any): StrictExtensionFormat =>\n{\n    // Class/Object submission, use extension object\n    if (typeof ext === 'function' || (typeof ext === 'object' && ext.extension))\n    {\n        // #if _DEBUG\n        if (!ext.extension)\n        {\n            throw new Error('Extension class must have an extension object');\n        }\n        // #endif\n        const metadata: ExtensionMetadataDetails = (typeof ext.extension !== 'object')\n            ? { type: ext.extension }\n            : ext.extension;\n\n        ext = { ...metadata, ref: ext };\n    }\n    if (typeof ext === 'object')\n    {\n        ext = { ...ext };\n    }\n    else\n    {\n        throw new Error('Invalid extension type');\n    }\n\n    if (typeof ext.type === 'string')\n    {\n        ext.type = [ext.type];\n    }\n\n    return ext;\n};\n\n/**\n * Get the priority for an extension.\n * @ignore\n * @param ext - Any extension\n * @param defaultPriority - Fallback priority if none is defined.\n * @returns The priority for the extension.\n * @category extensions\n */\nexport const normalizeExtensionPriority = (ext: ExtensionFormat | any, defaultPriority: number): number =>\n    normalizeExtension(ext).priority ?? defaultPriority;\n\n/**\n * Global registration system for all PixiJS extensions. Provides a centralized way to add, remove,\n * and manage functionality across the engine.\n *\n * Features:\n * - Register custom extensions and plugins\n * - Handle multiple extension types\n * - Priority-based ordering\n * @example\n * ```ts\n * import { extensions, ExtensionType } from 'pixi.js';\n *\n * // Register a simple object extension\n * extensions.add({\n *   extension: {\n *       type: ExtensionType.LoadParser,\n *       name: 'my-loader',\n *       priority: 100, // Optional priority for ordering\n *   },\n *   // add load parser functions\n * });\n *\n * // Register a class-based extension\n * class MyRendererPlugin {\n *     static extension = {\n *         type: [ExtensionType.WebGLSystem, ExtensionType.WebGPUSystem],\n *         name: 'myRendererPlugin'\n *     };\n *\n *    // add renderer plugin methods\n * }\n * extensions.add(MyRendererPlugin);\n *\n * // Remove extensions\n * extensions.remove(MyRendererPlugin);\n * ```\n * @remarks\n * - Extensions must have a type from {@link ExtensionType}\n * - Can be registered before or after their handlers\n * - Supports priority-based ordering\n * - Automatically normalizes extension formats\n * @see {@link ExtensionType} For all available extension types\n * @see {@link ExtensionFormat} For extension registration format\n * @see {@link Application} For application plugin system\n * @see {@link LoaderParser} For asset loading extensions\n * @category extensions\n * @standard\n * @class\n */\nconst extensions = {\n\n    /** @ignore */\n    _addHandlers: {} as Partial<Record<ExtensionType, ExtensionHandler>>,\n\n    /** @ignore */\n    _removeHandlers: {} as Partial<Record<ExtensionType, ExtensionHandler>>,\n\n    /** @ignore */\n    _queue: {} as Partial<Record<ExtensionType, StrictExtensionFormat[]>>,\n\n    /**\n     * Remove extensions from PixiJS.\n     * @param extensions - Extensions to be removed. Can be:\n     * - Extension class with static `extension` property\n     * - Extension format object with `type` and `ref`\n     * - Multiple extensions as separate arguments\n     * @returns {extensions} this for chaining\n     * @example\n     * ```ts\n     * // Remove a single extension\n     * extensions.remove(MyRendererPlugin);\n     *\n     * // Remove multiple extensions\n     * extensions.remove(\n     *     MyRendererPlugin,\n     *     MySystemPlugin\n     * );\n     * ```\n     * @see {@link ExtensionType} For available extension types\n     * @see {@link ExtensionFormat} For extension format details\n     */\n    remove(...extensions: Array<ExtensionFormat | any>)\n    {\n        extensions.map(normalizeExtension).forEach((ext) =>\n        {\n            ext.type.forEach((type) => this._removeHandlers[type]?.(ext));\n        });\n\n        return this;\n    },\n\n    /**\n     * Register new extensions with PixiJS. Extensions can be registered in multiple formats:\n     * - As a class with a static `extension` property\n     * - As an extension format object\n     * - As multiple extensions passed as separate arguments\n     * @param extensions - Extensions to add to PixiJS. Each can be:\n     * - A class with static `extension` property\n     * - An extension format object with `type` and `ref`\n     * - Multiple extensions as separate arguments\n     * @returns This extensions instance for chaining\n     * @example\n     * ```ts\n     * // Register a simple extension\n     * extensions.add(MyRendererPlugin);\n     *\n     * // Register multiple extensions\n     * extensions.add(\n     *     MyRendererPlugin,\n     *     MySystemPlugin,\n     * });\n     * ```\n     * @see {@link ExtensionType} For available extension types\n     * @see {@link ExtensionFormat} For extension format details\n     * @see {@link extensions.remove} For removing registered extensions\n     */\n    add(...extensions: Array<ExtensionFormat | any>)\n    {\n        // Handle any extensions either passed as class w/ data or as data\n        extensions.map(normalizeExtension).forEach((ext) =>\n        {\n            ext.type.forEach((type) =>\n            {\n                const handlers = this._addHandlers;\n                const queue = this._queue;\n\n                if (!handlers[type])\n                {\n                    queue[type] = queue[type] || [];\n                    queue[type]?.push(ext);\n                }\n                else\n                {\n                    handlers[type]?.(ext);\n                }\n            });\n        });\n\n        return this;\n    },\n\n    /**\n     * Internal method to handle extensions by name.\n     * @param type - The extension type.\n     * @param onAdd  - Function handler when extensions are added/registered {@link StrictExtensionFormat}.\n     * @param onRemove  - Function handler when extensions are removed/unregistered {@link StrictExtensionFormat}.\n     * @returns this for chaining.\n     * @internal\n     * @ignore\n     */\n    handle(type: ExtensionType, onAdd: ExtensionHandler, onRemove: ExtensionHandler)\n    {\n        const addHandlers = this._addHandlers;\n        const removeHandlers = this._removeHandlers;\n\n        // #if _DEBUG\n        if (addHandlers[type] || removeHandlers[type])\n        {\n            throw new Error(`Extension type ${type} already has a handler`);\n        }\n        // #endif\n\n        addHandlers[type] = onAdd;\n        removeHandlers[type] = onRemove;\n\n        // Process the queue\n        const queue = this._queue;\n\n        // Process any plugins that have been registered before the handler\n        if (queue[type])\n        {\n            queue[type]?.forEach((ext) => onAdd(ext));\n            delete queue[type];\n        }\n\n        return this;\n    },\n\n    /**\n     * Handle a type, but using a map by `name` property.\n     * @param type - Type of extension to handle.\n     * @param map - The object map of named extensions.\n     * @returns this for chaining.\n     * @ignore\n     */\n    handleByMap(type: ExtensionType, map: Record<string, any>)\n    {\n        return this.handle(type,\n            (extension) =>\n            {\n                if (extension.name)\n                {\n                    map[extension.name] = extension.ref;\n                }\n            },\n            (extension) =>\n            {\n                if (extension.name)\n                {\n                    delete map[extension.name];\n                }\n            }\n        );\n    },\n\n    /**\n     * Handle a type, but using a list of extensions with a `name` property.\n     * @param type - Type of extension to handle.\n     * @param map - The array of named extensions.\n     * @param defaultPriority - Fallback priority if none is defined.\n     * @returns this for chaining.\n     * @ignore\n     */\n    handleByNamedList(type: ExtensionType, map: {name: string, value: any}[], defaultPriority = -1)\n    {\n        return this.handle(\n            type,\n            (extension) =>\n            {\n                const index = map.findIndex((item) => item.name === extension.name);\n\n                if (index >= 0) return;\n\n                map.push({ name: extension.name, value: extension.ref });\n                map.sort((a, b) =>\n                    normalizeExtensionPriority(b.value, defaultPriority)\n                    - normalizeExtensionPriority(a.value, defaultPriority));\n            },\n            (extension) =>\n            {\n                const index = map.findIndex((item) => item.name === extension.name);\n\n                if (index !== -1)\n                {\n                    map.splice(index, 1);\n                }\n            }\n        );\n    },\n\n    /**\n     * Handle a type, but using a list of extensions.\n     * @param type - Type of extension to handle.\n     * @param list - The list of extensions.\n     * @param defaultPriority - The default priority to use if none is specified.\n     * @returns this for chaining.\n     * @ignore\n     */\n    handleByList(type: ExtensionType, list: any[], defaultPriority = -1)\n    {\n        return this.handle(\n            type,\n            (extension) =>\n            {\n                if (list.includes(extension.ref))\n                {\n                    return;\n                }\n\n                list.push(extension.ref);\n                list.sort((a, b) =>\n                    normalizeExtensionPriority(b, defaultPriority) - normalizeExtensionPriority(a, defaultPriority));\n            },\n            (extension) =>\n            {\n                const index = list.indexOf(extension.ref);\n\n                if (index !== -1)\n                {\n                    list.splice(index, 1);\n                }\n            }\n        );\n    },\n\n    /**\n     * Mixin the source object(s) properties into the target class's prototype.\n     * Copies all property descriptors from source objects to the target's prototype.\n     * @param Target - The target class to mix properties into\n     * @param sources - One or more source objects containing properties to mix in\n     * @example\n     * ```ts\n     * // Create a mixin with shared properties\n     * const moveable = {\n     *     x: 0,\n     *     y: 0,\n     *     move(x: number, y: number) {\n     *         this.x += x;\n     *         this.y += y;\n     *     }\n     * };\n     *\n     * // Create a mixin with computed properties\n     * const scalable = {\n     *     scale: 1,\n     *     get scaled() {\n     *         return this.scale > 1;\n     *     }\n     * };\n     *\n     * // Apply mixins to a class\n     * extensions.mixin(Sprite, moveable, scalable);\n     *\n     * // Use mixed-in properties\n     * const sprite = new Sprite();\n     * sprite.move(10, 20);\n     * console.log(sprite.x, sprite.y); // 10, 20\n     * ```\n     * @remarks\n     * - Copies all properties including getters/setters\n     * - Does not modify source objects\n     * - Preserves property descriptors\n     * @see {@link Object.defineProperties} For details on property descriptors\n     * @see {@link Object.getOwnPropertyDescriptors} For details on property copying\n     */\n    mixin(Target: any, ...sources: Parameters<typeof Object.getOwnPropertyDescriptors>[0][])\n    {\n        // Apply each source's properties to the target prototype\n        for (const source of sources)\n        {\n            Object.defineProperties(Target.prototype, Object.getOwnPropertyDescriptors(source));\n        }\n    }\n};\n\nexport {\n    extensions,\n    ExtensionType,\n};\nexport type {\n    StrictExtensionFormat as ExtensionFormat,\n    ExtensionFormat as ExtensionFormatLoose,\n    ExtensionHandler,\n    ExtensionMetadata,\n    ExtensionMetadataDetails\n};\n"],"names":["ExtensionType","extensions"],"mappings":";AAKA,IAAK,aAAA,qBAAAA,cAAAA,KAAL;AAGI,EAAAA,eAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,eAAA,YAAA,CAAA,GAAa,aAAA;AAEb,EAAAA,eAAA,mBAAA,CAAA,GAAoB,qBAAA;AAEpB,EAAAA,eAAA,aAAA,CAAA,GAAc,cAAA;AAGd,EAAAA,eAAA,aAAA,CAAA,GAAc,cAAA;AAEd,EAAAA,eAAA,oBAAA,CAAA,GAAqB,sBAAA;AAErB,EAAAA,eAAA,cAAA,CAAA,GAAe,eAAA;AAGf,EAAAA,eAAA,cAAA,CAAA,GAAe,eAAA;AAEf,EAAAA,eAAA,oBAAA,CAAA,GAAqB,sBAAA;AAErB,EAAAA,eAAA,aAAA,CAAA,GAAc,cAAA;AAGd,EAAAA,eAAA,OAAA,CAAA,GAAQ,OAAA;AAER,EAAAA,eAAA,YAAA,CAAA,GAAa,aAAA;AAEb,EAAAA,eAAA,eAAA,CAAA,GAAgB,gBAAA;AAEhB,EAAAA,eAAA,aAAA,CAAA,GAAc,cAAA;AAEd,EAAAA,eAAA,iBAAA,CAAA,GAAkB,kBAAA;AAGlB,EAAAA,eAAA,YAAA,CAAA,GAAa,aAAA;AAGb,EAAAA,eAAA,WAAA,CAAA,GAAY,YAAA;AAGZ,EAAAA,eAAA,eAAA,CAAA,GAAgB,gBAAA;AAGhB,EAAAA,eAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,eAAA,cAAA,CAAA,GAAe,eAAA;AAGf,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AArDT,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAuHL,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAC5B;AAEI,EAAA,IAAI,OAAO,GAAA,KAAQ,UAAA,IAAe,OAAO,GAAA,KAAQ,QAAA,IAAY,IAAI,SAAA,EACjE;AAEI,IAAA,IAAI,CAAC,IAAI,SAAA,EACT;AACI,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACnE;AAEA,IAAA,MAAM,QAAA,GAAsC,OAAO,GAAA,CAAI,SAAA,KAAc,QAAA,GAC/D,EAAE,IAAA,EAAM,GAAA,CAAI,SAAA,EAAU,GACtB,GAAA,CAAI,SAAA;AAEV,IAAA,GAAA,GAAM,EAAE,GAAG,QAAA,EAAU,GAAA,EAAK,GAAA,EAAI;AAAA,EAClC;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EACnB;AACI,IAAA,GAAA,GAAM,EAAE,GAAG,GAAA,EAAI;AAAA,EACnB,CAAA,MAEA;AACI,IAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,EAC5C;AAEA,EAAA,IAAI,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,EACxB;AACI,IAAA,GAAA,CAAI,IAAA,GAAO,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,GAAA;AACX,CAAA;AAUO,MAAM,6BAA6B,CAAC,GAAA,EAA4B,oBACnE,kBAAA,CAAmB,GAAG,EAAE,QAAA,IAAY;AAmDxC,MAAM,UAAA,GAAa;AAAA;AAAA,EAGf,cAAc,EAAC;AAAA;AAAA,EAGf,iBAAiB,EAAC;AAAA;AAAA,EAGlB,QAAQ,EAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBT,UAAUC,WAAAA,EACV;AACI,IAAAA,YAAW,GAAA,CAAI,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAC5C;AACI,MAAA,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAC,IAAA,KAAS,KAAK,eAAA,CAAgB,IAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,IAChE,CAAC,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA2BA,OAAOA,WAAAA,EACP;AAEI,IAAAA,YAAW,GAAA,CAAI,kBAAkB,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAC5C;AACI,MAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAC,IAAA,KAClB;AACI,QAAA,MAAM,WAAW,IAAA,CAAK,YAAA;AACtB,QAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AAEnB,QAAA,IAAI,CAAC,QAAA,CAAS,IAAI,CAAA,EAClB;AACI,UAAA,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,IAAI,KAAK,EAAC;AAC9B,UAAA,KAAA,CAAM,IAAI,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA;AAAA,QACzB,CAAA,MAEA;AACI,UAAA,QAAA,CAAS,IAAI,IAAI,GAAG,CAAA;AAAA,QACxB;AAAA,MACJ,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAA,CAAO,IAAA,EAAqB,KAAA,EAAyB,QAAA,EACrD;AACI,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA;AACzB,IAAA,MAAM,iBAAiB,IAAA,CAAK,eAAA;AAG5B,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,IAAK,cAAA,CAAe,IAAI,CAAA,EAC5C;AACI,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAI,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAClE;AAGA,IAAA,WAAA,CAAY,IAAI,CAAA,GAAI,KAAA;AACpB,IAAA,cAAA,CAAe,IAAI,CAAA,GAAI,QAAA;AAGvB,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AAGnB,IAAA,IAAI,KAAA,CAAM,IAAI,CAAA,EACd;AACI,MAAA,KAAA,CAAM,IAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,GAAA,KAAQ,KAAA,CAAM,GAAG,CAAC,CAAA;AACxC,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO,IAAA;AAAA,EACX,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WAAA,CAAY,MAAqB,GAAA,EACjC;AACI,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MAAO,IAAA;AAAA,MACf,CAAC,SAAA,KACD;AACI,QAAA,IAAI,UAAU,IAAA,EACd;AACI,UAAA,GAAA,CAAI,SAAA,CAAU,IAAI,CAAA,GAAI,SAAA,CAAU,GAAA;AAAA,QACpC;AAAA,MACJ,CAAA;AAAA,MACA,CAAC,SAAA,KACD;AACI,QAAA,IAAI,UAAU,IAAA,EACd;AACI,UAAA,OAAO,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,QAC7B;AAAA,MACJ;AAAA,KACJ;AAAA,EACJ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,iBAAA,CAAkB,IAAA,EAAqB,GAAA,EAAmC,eAAA,GAAkB,CAAA,CAAA,EAC5F;AACI,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACR,IAAA;AAAA,MACA,CAAC,SAAA,KACD;AACI,QAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,IAAA,KAAS,UAAU,IAAI,CAAA;AAElE,QAAA,IAAI,SAAS,CAAA,EAAG;AAEhB,QAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,CAAU,MAAM,KAAA,EAAO,SAAA,CAAU,KAAK,CAAA;AACvD,QAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KACT,0BAAA,CAA2B,CAAA,CAAE,KAAA,EAAO,eAAe,CAAA,GACjD,0BAAA,CAA2B,CAAA,CAAE,KAAA,EAAO,eAAe,CAAC,CAAA;AAAA,MAC9D,CAAA;AAAA,MACA,CAAC,SAAA,KACD;AACI,QAAA,MAAM,KAAA,GAAQ,IAAI,SAAA,CAAU,CAAC,SAAS,IAAA,CAAK,IAAA,KAAS,UAAU,IAAI,CAAA;AAElE,QAAA,IAAI,UAAU,CAAA,CAAA,EACd;AACI,UAAA,GAAA,CAAI,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QACvB;AAAA,MACJ;AAAA,KACJ;AAAA,EACJ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAA,CAAa,IAAA,EAAqB,IAAA,EAAa,eAAA,GAAkB,CAAA,CAAA,EACjE;AACI,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACR,IAAA;AAAA,MACA,CAAC,SAAA,KACD;AACI,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU,GAAG,CAAA,EAC/B;AACI,UAAA;AAAA,QACJ;AAEA,QAAA,IAAA,CAAK,IAAA,CAAK,UAAU,GAAG,CAAA;AACvB,QAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KACV,0BAAA,CAA2B,CAAA,EAAG,eAAe,CAAA,GAAI,0BAAA,CAA2B,CAAA,EAAG,eAAe,CAAC,CAAA;AAAA,MACvG,CAAA;AAAA,MACA,CAAC,SAAA,KACD;AACI,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,SAAA,CAAU,GAAG,CAAA;AAExC,QAAA,IAAI,UAAU,CAAA,CAAA,EACd;AACI,UAAA,IAAA,CAAK,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,QACxB;AAAA,MACJ;AAAA,KACJ;AAAA,EACJ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0CA,KAAA,CAAM,WAAgB,OAAA,EACtB;AAEI,IAAA,KAAA,MAAW,UAAU,OAAA,EACrB;AACI,MAAA,MAAA,CAAO,iBAAiB,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,yBAAA,CAA0B,MAAM,CAAC,CAAA;AAAA,IACtF;AAAA,EACJ;AACJ;;;;"}