view3d-core 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerializationPlugin-Cxn2UjuS.cjs","sources":["../src/plugins/Plugin.ts","../src/plugins/controls/OrbitController.ts","../src/plugins/controls/TransformController.ts","../src/plugins/loaders/LoaderPlugin.ts","../src/plugins/postprocessing/ComposerPlugin.ts","../src/utils/raycast.ts","../src/plugins/editor/EditorPlugin.ts","../node_modules/dat.gui/build/dat.gui.module.js","../src/plugins/gui/GUIPlugin.ts","../src/plugins/gizmo/GizmoPlugin.ts","../src/utils/math.ts","../src/utils/box3.ts","../src/plugins/shader/ShaderPlugin.ts","../src/plugins/animation/AnimationPlugin.ts","../src/plugins/drawing/DrawingPlugin.ts","../src/plugins/geomap/GeoMapPlugin.ts","../src/plugins/geometry/GeometryPlugin.ts","../src/plugins/material/MaterialPlugin.ts","../src/plugins/particle/ParticlePlugin.ts","../src/plugins/physics/PhysicsPlugin.ts","../src/plugins/text/TextPlugin.ts","../src/plugins/environment/EnvironmentPlugin.ts","../src/plugins/serialization/SerializationPlugin.ts","../src/plugins/renderers/CSSRendererPlugin.ts","../src/plugins/PluginManager.ts"],"sourcesContent":["import type * as THREE from 'three'\r\nimport type { IPlugin, PluginContext, PluginLifecycleHooks } from '../types/plugin.types'\r\n\r\n/**\r\n * 插件基类\r\n * 所有插件都应该继承此类\r\n */\r\nexport abstract class Plugin<TConfig = any> implements IPlugin<TConfig>, PluginLifecycleHooks {\r\n /** 插件名称(唯一标识) */\r\n abstract readonly name: string\r\n\r\n /** 插件版本 */\r\n readonly version?: string\r\n\r\n /** 插件依赖 */\r\n readonly dependencies?: string[]\r\n\r\n /** 插件配置 */\r\n config: TConfig\r\n\r\n /** 插件上下文 */\r\n protected context!: PluginContext\r\n\r\n /** 是否已安装 */\r\n private _installed = false\r\n\r\n /** 取消订阅函数列表 */\r\n protected unsubscribers: Array<() => void> = []\r\n\r\n constructor(config?: Partial<TConfig>) {\r\n this.config = (config ?? {}) as TConfig\r\n }\r\n\r\n /**\r\n * 安装插件\r\n */\r\n install(context: PluginContext): void | Promise<void> {\r\n if (this._installed) {\r\n console.warn(`Plugin \"${this.name}\" is already installed`)\r\n return\r\n }\r\n\r\n this.context = context\r\n this._installed = true\r\n\r\n // 注册生命周期钩子\r\n this.registerLifecycleHooks()\r\n\r\n // 调用子类的初始化方法\r\n this.onInstall?.()\r\n }\r\n\r\n /**\r\n * 卸载插件\r\n */\r\n uninstall(): void | Promise<void> {\r\n if (!this._installed) {\r\n console.warn(`Plugin \"${this.name}\" is not installed`)\r\n return\r\n }\r\n\r\n // 调用子类的销毁方法\r\n this.onUninstall?.()\r\n\r\n // 取消所有订阅\r\n for (const unsubscribe of this.unsubscribers) {\r\n unsubscribe()\r\n }\r\n this.unsubscribers = []\r\n\r\n this._installed = false\r\n }\r\n\r\n /**\r\n * 是否已安装\r\n */\r\n isInstalled(): boolean {\r\n return this._installed\r\n }\r\n\r\n /**\r\n * 注册生命周期钩子\r\n */\r\n private registerLifecycleHooks(): void {\r\n const { events } = this.context\r\n\r\n // 场景就绪\r\n if (typeof (this as any).onSceneReady === 'function') {\r\n const unsubscribe = events.on('scene:ready', ({ scene }) => {\r\n this.onSceneReady!(scene)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 每帧更新 - 检查原型链上是否有 onUpdate 方法\r\n const hasOnUpdate = typeof (this as any).onUpdate === 'function' && \r\n (this as any).onUpdate !== Plugin.prototype.onUpdate\r\n if (hasOnUpdate) {\r\n const unsubscribe = events.on('render:before', ({ delta, elapsed }) => {\r\n this.onUpdate!(delta, elapsed)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 窗口大小改变\r\n if (typeof (this as any).onResize === 'function') {\r\n const unsubscribe = events.on('resize', ({ width, height }) => {\r\n this.onResize!(width, height)\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // 销毁前\r\n if (typeof (this as any).onBeforeDispose === 'function') {\r\n const unsubscribe = events.on('engine:dispose', () => {\r\n this.onBeforeDispose!()\r\n })\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n }\r\n\r\n /**\r\n * 便捷方法:获取引擎\r\n */\r\n protected get engine() {\r\n return this.context.engine\r\n }\r\n\r\n /**\r\n * 便捷方法:获取场景\r\n */\r\n protected get scene(): THREE.Scene {\r\n return this.context.engine.scene\r\n }\r\n\r\n /**\r\n * 便捷方法:获取相机\r\n */\r\n protected get camera(): THREE.PerspectiveCamera {\r\n return this.context.engine.camera\r\n }\r\n\r\n /**\r\n * 便捷方法:获取渲染器\r\n */\r\n protected get renderer(): THREE.WebGLRenderer {\r\n return this.context.engine.renderer\r\n }\r\n\r\n /**\r\n * 便捷方法:获取事件发射器\r\n */\r\n protected get events() {\r\n return this.context.events\r\n }\r\n\r\n /**\r\n * 便捷方法:获取插件管理器\r\n */\r\n protected get pluginManager() {\r\n return this.context.pluginManager\r\n }\r\n\r\n /**\r\n * 便捷方法:订阅事件(自动管理取消订阅)\r\n */\r\n protected subscribe<K extends keyof import('../types/event.types').EventMap>(\r\n event: K,\r\n callback: (data: import('../types/event.types').EventMap[K]) => void\r\n ): void {\r\n const unsubscribe = this.events.on(event, callback)\r\n this.unsubscribers.push(unsubscribe)\r\n }\r\n\r\n // ============ 可选的生命周期钩子 ============\r\n\r\n /** 安装时调用 */\r\n protected onInstall?(): void\r\n\r\n /** 卸载时调用 */\r\n protected onUninstall?(): void\r\n\r\n /** 场景准备完成 */\r\n onSceneReady?(scene: THREE.Scene): void\r\n\r\n /** 每帧更新 */\r\n onUpdate?(delta: number, elapsed: number): void\r\n\r\n /** 窗口大小改变 */\r\n onResize?(width: number, height: number): void\r\n\r\n /** 销毁前 */\r\n onBeforeDispose?(): void\r\n}\r\n","import * as THREE from 'three'\r\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { OrbitControllerConfig } from '../../types/config.types'\r\nimport type { ViewAngle } from '../../types/core.types'\r\n\r\n/**\r\n * 默认轨道控制器配置\r\n */\r\nexport const DEFAULT_ORBIT_CONFIG: OrbitControllerConfig = {\r\n enableDamping: true,\r\n dampingFactor: 0.05,\r\n minDistance: 1,\r\n maxDistance: 5000,\r\n minZoom: 1000,\r\n maxPolarAngle: Math.PI,\r\n enablePan: true,\r\n enableZoom: true,\r\n enableRotate: true\r\n}\r\n\r\n/**\r\n * 轨道控制器插件\r\n * 提供相机轨道控制功能\r\n */\r\nexport class OrbitControllerPlugin extends Plugin<OrbitControllerConfig> {\r\n readonly name = 'orbit-controller'\r\n\r\n /** OrbitControls 实例 */\r\n private _controls!: OrbitControls\r\n\r\n /** 视角列表 */\r\n private viewAngleList: ViewAngle[] = []\r\n\r\n constructor(config?: Partial<OrbitControllerConfig>) {\r\n super({ ...DEFAULT_ORBIT_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取控制器实例\r\n */\r\n get controls(): OrbitControls {\r\n return this._controls\r\n }\r\n\r\n /**\r\n * 获取目标点\r\n */\r\n get target(): THREE.Vector3 {\r\n return this._controls.target\r\n }\r\n\r\n protected onInstall(): void {\r\n const { camera, renderer } = this.engine\r\n\r\n this._controls = new OrbitControls(camera, renderer.domElement)\r\n\r\n // 应用配置\r\n this.applyConfig(this.config)\r\n\r\n // 注册每帧更新 - 确保 damping 效果正常工作\r\n this.subscribe('render:before', () => {\r\n this._controls.update()\r\n })\r\n\r\n // 监听控制器事件\r\n this._controls.addEventListener('start', () => {\r\n this.events.emit('controls:start', undefined)\r\n })\r\n\r\n this._controls.addEventListener('end', () => {\r\n this.events.emit('controls:end', undefined)\r\n })\r\n\r\n this._controls.addEventListener('change', () => {\r\n this.events.emit('controls:change', undefined)\r\n })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._controls.dispose()\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<OrbitControllerConfig>): void {\r\n if (config.enableDamping !== undefined) {\r\n this._controls.enableDamping = config.enableDamping\r\n }\r\n if (config.dampingFactor !== undefined) {\r\n this._controls.dampingFactor = config.dampingFactor\r\n }\r\n if (config.minDistance !== undefined) {\r\n this._controls.minDistance = config.minDistance\r\n }\r\n if (config.maxDistance !== undefined) {\r\n this._controls.maxDistance = config.maxDistance\r\n }\r\n if (config.maxPolarAngle !== undefined) {\r\n this._controls.maxPolarAngle = config.maxPolarAngle\r\n }\r\n if (config.enablePan !== undefined) {\r\n this._controls.enablePan = config.enablePan\r\n }\r\n if (config.enableZoom !== undefined) {\r\n this._controls.enableZoom = config.enableZoom\r\n }\r\n if (config.enableRotate !== undefined) {\r\n this._controls.enableRotate = config.enableRotate\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): OrbitControllerConfig {\r\n return {\r\n enableDamping: this._controls.enableDamping,\r\n dampingFactor: this._controls.dampingFactor,\r\n minDistance: this._controls.minDistance,\r\n maxDistance: this._controls.maxDistance,\r\n minZoom: this._controls.minZoom,\r\n maxPolarAngle: this._controls.maxPolarAngle,\r\n enablePan: this._controls.enablePan,\r\n enableZoom: this._controls.enableZoom,\r\n enableRotate: this._controls.enableRotate\r\n }\r\n }\r\n\r\n /**\r\n * 设置目标点\r\n */\r\n setTarget(x: number, y: number, z: number): void {\r\n this._controls.target.set(x, y, z)\r\n this._controls.update()\r\n }\r\n\r\n /**\r\n * 启用/禁用控制器\r\n */\r\n setEnabled(enabled: boolean): void {\r\n this._controls.enabled = enabled\r\n }\r\n\r\n /**\r\n * 保存当前视角\r\n */\r\n saveViewAngle(name?: string): ViewAngle {\r\n const viewAngle: ViewAngle = {\r\n position: this.camera.position.clone(),\r\n target: this._controls.target.clone()\r\n }\r\n this.viewAngleList.push(viewAngle)\r\n return viewAngle\r\n }\r\n\r\n /**\r\n * 获取视角列表\r\n */\r\n getViewAngleList(): ViewAngle[] {\r\n return this.viewAngleList\r\n }\r\n\r\n /**\r\n * 清空视角列表\r\n */\r\n clearViewAngleList(): void {\r\n this.viewAngleList = []\r\n }\r\n\r\n /**\r\n * 重置控制器\r\n */\r\n reset(): void {\r\n this._controls.reset()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { TransformControllerConfig } from '../../types/config.types'\r\nimport type { OrbitControllerPlugin } from './OrbitController'\r\n\r\n/**\r\n * 默认变换控制器配置\r\n */\r\nexport const DEFAULT_TRANSFORM_CONFIG: TransformControllerConfig = {\r\n mode: 'translate',\r\n space: 'world',\r\n showX: true,\r\n showY: true,\r\n showZ: true,\r\n translationSnap: null,\r\n rotationSnap: null,\r\n scaleSnap: null\r\n}\r\n\r\n/**\r\n * 变换控制器插件\r\n * 提供物体变换(移动、旋转、缩放)功能\r\n */\r\nexport class TransformControllerPlugin extends Plugin<TransformControllerConfig> {\r\n readonly name = 'transform-controller'\r\n readonly dependencies = ['orbit-controller']\r\n\r\n /** TransformControls 实例 */\r\n private _controls!: TransformControls\r\n\r\n /** 包围盒辅助器 */\r\n private box3Helper: THREE.Box3Helper | null = null\r\n\r\n /** 拖拽变化回调 */\r\n dragChangeCallback?: (isDragging: boolean) => void\r\n\r\n constructor(config?: Partial<TransformControllerConfig>) {\r\n super({ ...DEFAULT_TRANSFORM_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取控制器实例\r\n */\r\n get controls(): TransformControls {\r\n return this._controls\r\n }\r\n\r\n /**\r\n * 获取当前附加的物体\r\n */\r\n get object(): THREE.Object3D | undefined {\r\n return this._controls.object\r\n }\r\n\r\n protected onInstall(): void {\r\n const { camera, renderer, scene } = this.engine\r\n\r\n this._controls = new TransformControls(camera, renderer.domElement)\r\n this._controls.name = 'TransformControls'\r\n\r\n // 标记所有子物体,用于射线检测过滤\r\n this._controls.traverse((child) => {\r\n (child as any).isTransformControls = true\r\n })\r\n\r\n scene.add(this._controls)\r\n\r\n // 创建包围盒辅助器\r\n this.box3Helper = new THREE.Box3Helper(new THREE.Box3(), 0xffff00)\r\n this.box3Helper.name = 'Box3Helper'\r\n this.box3Helper.visible = false\r\n scene.add(this.box3Helper)\r\n\r\n // 应用配置\r\n this.applyConfig(this.config)\r\n\r\n // 监听拖拽事件\r\n this._controls.addEventListener('dragging-changed', (event: any) => {\r\n // 获取轨道控制器并禁用/启用\r\n const orbitController = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n if (orbitController) {\r\n orbitController.controls.enabled = !event.value\r\n }\r\n\r\n // 触发回调\r\n this.dragChangeCallback?.(event.value)\r\n\r\n // 发射事件\r\n if (event.value) {\r\n this.events.emit('object:transform:start', { object: this._controls.object! })\r\n } else {\r\n this.events.emit('object:transform:end', { object: this._controls.object! })\r\n }\r\n })\r\n\r\n // 监听变换事件\r\n this._controls.addEventListener('change', () => {\r\n if (this._controls.object) {\r\n this.events.emit('object:transform:change', { object: this._controls.object })\r\n\r\n // 更新包围盒\r\n if (this.box3Helper && this._controls.object) {\r\n const box = new THREE.Box3().setFromObject(this._controls.object)\r\n this.box3Helper.box = box\r\n this.box3Helper.visible = true\r\n }\r\n }\r\n })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.detach()\r\n this.scene.remove(this._controls)\r\n this._controls.dispose()\r\n\r\n if (this.box3Helper) {\r\n this.scene.remove(this.box3Helper)\r\n this.box3Helper = null\r\n }\r\n }\r\n\r\n /**\r\n * 应用配置\r\n */\r\n applyConfig(config: Partial<TransformControllerConfig>): void {\r\n if (config.mode !== undefined) {\r\n this._controls.setMode(config.mode)\r\n }\r\n if (config.space !== undefined) {\r\n this._controls.setSpace(config.space)\r\n }\r\n if (config.showX !== undefined) {\r\n this._controls.showX = config.showX\r\n }\r\n if (config.showY !== undefined) {\r\n this._controls.showY = config.showY\r\n }\r\n if (config.showZ !== undefined) {\r\n this._controls.showZ = config.showZ\r\n }\r\n if (config.translationSnap !== undefined) {\r\n this._controls.setTranslationSnap(config.translationSnap)\r\n }\r\n if (config.rotationSnap !== undefined) {\r\n this._controls.setRotationSnap(config.rotationSnap)\r\n }\r\n if (config.scaleSnap !== undefined) {\r\n this._controls.setScaleSnap(config.scaleSnap)\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前配置\r\n */\r\n getConfig(): TransformControllerConfig {\r\n return {\r\n mode: this._controls.mode as 'translate' | 'rotate' | 'scale',\r\n space: this._controls.space as 'world' | 'local',\r\n showX: this._controls.showX,\r\n showY: this._controls.showY,\r\n showZ: this._controls.showZ,\r\n translationSnap: this._controls.translationSnap,\r\n rotationSnap: this._controls.rotationSnap,\r\n scaleSnap: (this._controls as any).scaleSnap ?? null\r\n }\r\n }\r\n\r\n /**\r\n * 附加到物体\r\n */\r\n attach(object: THREE.Object3D): void {\r\n this._controls.attach(object)\r\n }\r\n\r\n /**\r\n * 分离物体\r\n */\r\n detach(): void {\r\n this._controls.detach()\r\n if (this.box3Helper) {\r\n this.box3Helper.visible = false\r\n }\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: 'translate' | 'rotate' | 'scale'): void {\r\n this._controls.setMode(mode)\r\n }\r\n\r\n /**\r\n * 设置空间\r\n */\r\n setSpace(space: 'world' | 'local'): void {\r\n this._controls.setSpace(space)\r\n }\r\n\r\n /**\r\n * 设置大小\r\n */\r\n setSize(size: number): void {\r\n this._controls.setSize(size)\r\n }\r\n\r\n /**\r\n * 启用/禁用控制器\r\n */\r\n setEnabled(enabled: boolean): void {\r\n this._controls.enabled = enabled\r\n }\r\n\r\n /**\r\n * 显示/隐藏包围盒\r\n */\r\n showBox3Helper(visible: boolean): void {\r\n if (this.box3Helper) {\r\n this.box3Helper.visible = visible\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'\r\nimport { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'\r\nimport { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'\r\nimport { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js'\r\nimport { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js'\r\nimport { FontLoader, Font } from 'three/examples/jsm/loaders/FontLoader.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { LoaderConfig } from '../../types/config.types'\r\nimport type { LoaderService, ModelType, RootInfo } from '../../types/core.types'\r\n\r\n/**\r\n * 默认加载器配置\r\n */\r\nexport const DEFAULT_LOADER_CONFIG: LoaderConfig = {\r\n dracoPath: '/draco/',\r\n useDraco: true\r\n}\r\n\r\n/**\r\n * 加载器插件\r\n * 提供模型、纹理、字体等资源的加载功能\r\n */\r\nexport class LoaderPlugin extends Plugin<LoaderConfig> {\r\n readonly name = 'loader'\r\n\r\n /** GLTF 加载器 */\r\n private gltfLoader!: GLTFLoader\r\n\r\n /** Draco 加载器 */\r\n private dracoLoader!: DRACOLoader\r\n\r\n /** FBX 加载器 */\r\n private fbxLoader!: FBXLoader\r\n\r\n /** OBJ 加载器 */\r\n private objLoader!: OBJLoader\r\n\r\n /** MTL 加载器 */\r\n private mtlLoader!: MTLLoader\r\n\r\n /** 纹理加载器 */\r\n private textureLoader!: THREE.TextureLoader\r\n\r\n /** 立方体纹理加载器 */\r\n private cubeTextureLoader!: THREE.CubeTextureLoader\r\n\r\n /** 字体加载器 */\r\n private fontLoader!: FontLoader\r\n\r\n /** 字体缓存 */\r\n private fontCache = new Map<string, Font>()\r\n\r\n constructor(config?: Partial<LoaderConfig>) {\r\n super({ ...DEFAULT_LOADER_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 初始化 Draco 加载器\r\n this.dracoLoader = new DRACOLoader()\r\n this.dracoLoader.setDecoderPath(this.config.dracoPath)\r\n\r\n // 初始化 GLTF 加载器\r\n this.gltfLoader = new GLTFLoader()\r\n if (this.config.useDraco) {\r\n this.gltfLoader.setDRACOLoader(this.dracoLoader)\r\n }\r\n\r\n // 初始化其他加载器\r\n this.fbxLoader = new FBXLoader()\r\n this.objLoader = new OBJLoader()\r\n this.mtlLoader = new MTLLoader()\r\n this.textureLoader = new THREE.TextureLoader()\r\n this.cubeTextureLoader = new THREE.CubeTextureLoader()\r\n this.fontLoader = new FontLoader()\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.dracoLoader.dispose()\r\n this.fontCache.clear()\r\n }\r\n\r\n /**\r\n * 设置 Draco 解码器路径\r\n */\r\n setDracoPath(path: string): void {\r\n this.config.dracoPath = path\r\n this.dracoLoader.setDecoderPath(path)\r\n }\r\n\r\n /**\r\n * 根据类型加载模型\r\n */\r\n loadModel(rootInfo: RootInfo): LoaderService<THREE.Object3D> {\r\n const { type, url } = rootInfo\r\n\r\n switch (type) {\r\n case 'GLTF':\r\n return this.loadGLTF(url)\r\n case 'FBX':\r\n return this.loadFBX(url)\r\n case 'OBJ':\r\n return this.loadOBJ(url)\r\n default:\r\n throw new Error(`Unsupported model type: ${type}`)\r\n }\r\n }\r\n\r\n /**\r\n * 加载 GLTF/GLB 模型\r\n */\r\n loadGLTF(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'GLTF' })\r\n\r\n this.gltfLoader.load(\r\n url,\r\n (gltf) => {\r\n const model = gltf.scene\r\n model.animations = gltf.animations\r\n service.complete(model)\r\n this.events.emit('load:complete', { url, object: model })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载 FBX 模型\r\n */\r\n loadFBX(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'FBX' })\r\n\r\n this.fbxLoader.load(\r\n url,\r\n (object) => {\r\n // 处理材质\r\n object.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((m) => {\r\n m.side = THREE.DoubleSide\r\n })\r\n } else if (mesh.material) {\r\n mesh.material.side = THREE.DoubleSide\r\n }\r\n }\r\n })\r\n\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载 OBJ 模型(带 MTL)\r\n */\r\n loadOBJ(url: string): LoaderService<THREE.Object3D> {\r\n const service: LoaderService<THREE.Object3D> = {\r\n progress: () => {},\r\n complete: () => {}\r\n }\r\n\r\n this.events.emit('load:start', { url, type: 'OBJ' })\r\n\r\n const mtlUrl = url.replace('.obj', '.mtl')\r\n\r\n this.mtlLoader.load(\r\n mtlUrl,\r\n (materials) => {\r\n materials.preload()\r\n this.objLoader.setMaterials(materials)\r\n\r\n this.objLoader.load(\r\n url,\r\n (object) => {\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n this.events.emit('load:progress', {\r\n url,\r\n loaded: xhr.loaded,\r\n total: xhr.total,\r\n percent\r\n })\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n },\r\n undefined,\r\n () => {\r\n // MTL 加载失败,尝试只加载 OBJ\r\n this.objLoader.load(\r\n url,\r\n (object) => {\r\n service.complete(object)\r\n this.events.emit('load:complete', { url, object })\r\n },\r\n (xhr) => {\r\n const percent = xhr.loaded / xhr.total\r\n service.progress(percent, xhr)\r\n },\r\n (error) => {\r\n this.events.emit('load:error', { url, error: error as Error })\r\n }\r\n )\r\n }\r\n )\r\n\r\n return service\r\n }\r\n\r\n /**\r\n * 加载纹理\r\n */\r\n loadTexture(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(url, resolve, undefined, reject)\r\n })\r\n }\r\n\r\n /**\r\n * 加载立方体纹理\r\n */\r\n loadCubeTexture(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(urls, resolve, undefined, reject)\r\n })\r\n }\r\n\r\n /**\r\n * 加载字体\r\n */\r\n loadFont(url: string): Promise<Font> {\r\n // 检查缓存\r\n const cached = this.fontCache.get(url)\r\n if (cached) {\r\n return Promise.resolve(cached)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.fontLoader.load(\r\n url,\r\n (font) => {\r\n this.fontCache.set(url, font)\r\n resolve(font)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 创建视频纹理\r\n */\r\n createVideoTexture(url: string): THREE.VideoTexture {\r\n const video = document.createElement('video')\r\n video.crossOrigin = 'anonymous'\r\n video.src = url\r\n video.muted = true\r\n video.loop = true\r\n video.play()\r\n\r\n return new THREE.VideoTexture(video)\r\n }\r\n\r\n /**\r\n * 获取模型的所有材质\r\n */\r\n getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse((child) => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js'\r\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js'\r\nimport { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js'\r\nimport { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js'\r\nimport { SAOPass } from 'three/examples/jsm/postprocessing/SAOPass.js'\r\nimport { SSRPass } from 'three/examples/jsm/postprocessing/SSRPass.js'\r\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js'\r\nimport { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader.js'\r\nimport { OutputPass } from 'three/examples/jsm/postprocessing/OutputPass.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ComposerConfig, OutlinePassConfig, BloomPassConfig, SSAOPassConfig, SSRPassConfig } from '../../types/config.types'\r\nimport type { RenderWay } from '../../types/core.types'\r\n\r\n/**\r\n * 默认后期处理配置\r\n */\r\nexport const DEFAULT_COMPOSER_CONFIG: ComposerConfig = {\r\n enabled: true,\r\n outline: {\r\n enabled: true,\r\n edgeStrength: 4,\r\n edgeGlow: 0,\r\n edgeThickness: 2,\r\n pulsePeriod: 0,\r\n visibleEdgeColor: 0xfafe2f,\r\n hiddenEdgeColor: 0xfafe2f\r\n },\r\n bloom: {\r\n enabled: false,\r\n strength: 1.5,\r\n radius: 0.4,\r\n threshold: 0.85\r\n },\r\n ssao: {\r\n enabled: false,\r\n intensity: 0.01,\r\n scale: 100\r\n },\r\n ssr: {\r\n enabled: false,\r\n thickness: 0.018,\r\n infiniteThick: false,\r\n maxDistance: 0.01,\r\n opacity: 0.5\r\n },\r\n screenMask: {\r\n enabled: false\r\n }\r\n}\r\n\r\n/**\r\n * 后期处理插件\r\n * 提供各种后期处理效果\r\n */\r\nexport class ComposerPlugin extends Plugin<ComposerConfig> {\r\n readonly name = 'composer'\r\n\r\n /** EffectComposer 实例 */\r\n private _composer!: EffectComposer\r\n\r\n /** 渲染通道 */\r\n private renderPass!: RenderPass\r\n\r\n /** 轮廓光通道 */\r\n private _outlinePass!: OutlinePass\r\n\r\n /** 泛光通道 */\r\n private _bloomPass!: UnrealBloomPass\r\n\r\n /** SSAO 通道 */\r\n private _saoPass!: SAOPass\r\n\r\n /** SSR 通道 */\r\n private _ssrPass!: SSRPass\r\n\r\n /** FXAA 通道 */\r\n private _fxaaPass!: ShaderPass\r\n\r\n /** 输出通道 */\r\n private outputPass!: OutputPass\r\n\r\n /** 渲染方式 */\r\n private _renderWay: RenderWay = '效果渲染'\r\n\r\n /** SSR 网格列表 */\r\n private ssrMeshList: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<ComposerConfig>) {\r\n super({ ...DEFAULT_COMPOSER_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取 Composer 实例\r\n */\r\n get composer(): EffectComposer {\r\n return this._composer\r\n }\r\n\r\n /**\r\n * 获取轮廓光通道\r\n */\r\n get outlinePass(): OutlinePass {\r\n return this._outlinePass\r\n }\r\n\r\n /**\r\n * 获取泛光通道\r\n */\r\n get bloomPass(): UnrealBloomPass {\r\n return this._bloomPass\r\n }\r\n\r\n /**\r\n * 获取 SSAO 通道\r\n */\r\n get saoPass(): SAOPass {\r\n return this._saoPass\r\n }\r\n\r\n /**\r\n * 获取 SSR 通道\r\n */\r\n get ssrPass(): SSRPass {\r\n return this._ssrPass\r\n }\r\n\r\n /**\r\n * 获取渲染方式\r\n */\r\n get renderWay(): RenderWay {\r\n return this._renderWay\r\n }\r\n\r\n protected onInstall(): void {\r\n const { scene, camera, renderer } = this.engine\r\n const container = renderer.domElement.parentElement!\r\n const width = container.clientWidth\r\n const height = container.clientHeight\r\n const pixelRatio = renderer.getPixelRatio()\r\n\r\n // 创建 EffectComposer\r\n this._composer = new EffectComposer(renderer)\r\n this._composer.setSize(width, height)\r\n this._composer.setPixelRatio(pixelRatio)\r\n\r\n // 渲染通道\r\n this.renderPass = new RenderPass(scene, camera)\r\n this._composer.addPass(this.renderPass)\r\n\r\n // SSAO 通道\r\n this._saoPass = new SAOPass(scene, camera)\r\n this._saoPass.enabled = this.config.ssao?.enabled ?? false\r\n if (this.config.ssao) {\r\n this._saoPass.params.saoIntensity = this.config.ssao.intensity\r\n this._saoPass.params.saoScale = this.config.ssao.scale\r\n }\r\n this._composer.addPass(this._saoPass)\r\n\r\n // 泛光通道\r\n this._bloomPass = new UnrealBloomPass(\r\n new THREE.Vector2(width, height),\r\n this.config.bloom?.strength ?? 1.5,\r\n this.config.bloom?.radius ?? 0.4,\r\n this.config.bloom?.threshold ?? 0.85\r\n )\r\n this._bloomPass.enabled = this.config.bloom?.enabled ?? false\r\n this._composer.addPass(this._bloomPass)\r\n\r\n // SSR 通道\r\n this._ssrPass = new SSRPass({\r\n renderer,\r\n scene,\r\n camera,\r\n width,\r\n height,\r\n selects: this.ssrMeshList,\r\n groundReflector: null\r\n } as any)\r\n this._ssrPass.enabled = this.config.ssr?.enabled ?? false\r\n if (this.config.ssr) {\r\n this._ssrPass.thickness = this.config.ssr.thickness\r\n this._ssrPass.infiniteThick = this.config.ssr.infiniteThick\r\n this._ssrPass.maxDistance = this.config.ssr.maxDistance\r\n this._ssrPass.opacity = this.config.ssr.opacity\r\n }\r\n this._composer.addPass(this._ssrPass)\r\n\r\n // 轮廓光通道\r\n this._outlinePass = new OutlinePass(\r\n new THREE.Vector2(width, height),\r\n scene,\r\n camera\r\n )\r\n this._outlinePass.renderToScreen = true\r\n if (this.config.outline) {\r\n this._outlinePass.edgeStrength = this.config.outline.edgeStrength\r\n this._outlinePass.edgeGlow = this.config.outline.edgeGlow\r\n this._outlinePass.edgeThickness = this.config.outline.edgeThickness\r\n this._outlinePass.pulsePeriod = this.config.outline.pulsePeriod\r\n this._outlinePass.visibleEdgeColor.set(this.config.outline.visibleEdgeColor)\r\n this._outlinePass.hiddenEdgeColor.set(this.config.outline.hiddenEdgeColor)\r\n }\r\n this._outlinePass.overlayMaterial.blending = THREE.CustomBlending\r\n this._outlinePass.overlayMaterial.blendSrc = THREE.OneFactor\r\n this._composer.addPass(this._outlinePass)\r\n\r\n // 输出通道\r\n this.outputPass = new OutputPass()\r\n this._composer.addPass(this.outputPass)\r\n\r\n // FXAA 通道\r\n this._fxaaPass = new ShaderPass(FXAAShader)\r\n this._fxaaPass.material.uniforms['resolution'].value.x = 1 / (width * pixelRatio)\r\n this._fxaaPass.material.uniforms['resolution'].value.y = 1 / (height * pixelRatio)\r\n this._composer.addPass(this._fxaaPass)\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._composer.dispose()\r\n }\r\n\r\n onResize(width: number, height: number): void {\r\n const pixelRatio = this.renderer.getPixelRatio()\r\n\r\n this._composer.setSize(width, height)\r\n this._bloomPass.setSize(width, height)\r\n\r\n this._fxaaPass.material.uniforms['resolution'].value.x = 1 / (width * pixelRatio)\r\n this._fxaaPass.material.uniforms['resolution'].value.y = 1 / (height * pixelRatio)\r\n }\r\n\r\n /**\r\n * 渲染\r\n */\r\n render(): void {\r\n if (this._renderWay === '效果渲染') {\r\n this._composer.render()\r\n } else {\r\n this.renderer.render(this.scene, this.camera)\r\n }\r\n }\r\n\r\n /**\r\n * 设置渲染方式\r\n */\r\n setRenderWay(way: RenderWay): void {\r\n this._renderWay = way\r\n }\r\n\r\n /**\r\n * 设置轮廓光选中物体\r\n */\r\n setOutlineObjects(objects: THREE.Object3D[]): void {\r\n this._outlinePass.selectedObjects = objects\r\n }\r\n\r\n /**\r\n * 清除轮廓光选中\r\n */\r\n clearOutlineObjects(): void {\r\n this._outlinePass.selectedObjects = []\r\n }\r\n\r\n /**\r\n * 配置轮廓光\r\n */\r\n configureOutline(config: Partial<OutlinePassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._outlinePass.enabled = config.enabled\r\n }\r\n if (config.edgeStrength !== undefined) {\r\n this._outlinePass.edgeStrength = config.edgeStrength\r\n }\r\n if (config.edgeGlow !== undefined) {\r\n this._outlinePass.edgeGlow = config.edgeGlow\r\n }\r\n if (config.edgeThickness !== undefined) {\r\n this._outlinePass.edgeThickness = config.edgeThickness\r\n }\r\n if (config.pulsePeriod !== undefined) {\r\n this._outlinePass.pulsePeriod = config.pulsePeriod\r\n }\r\n if (config.visibleEdgeColor !== undefined) {\r\n this._outlinePass.visibleEdgeColor.set(config.visibleEdgeColor)\r\n }\r\n if (config.hiddenEdgeColor !== undefined) {\r\n this._outlinePass.hiddenEdgeColor.set(config.hiddenEdgeColor)\r\n }\r\n }\r\n\r\n /**\r\n * 配置泛光\r\n */\r\n configureBloom(config: Partial<BloomPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._bloomPass.enabled = config.enabled\r\n }\r\n if (config.strength !== undefined) {\r\n this._bloomPass.strength = config.strength\r\n }\r\n if (config.radius !== undefined) {\r\n this._bloomPass.radius = config.radius\r\n }\r\n if (config.threshold !== undefined) {\r\n this._bloomPass.threshold = config.threshold\r\n }\r\n }\r\n\r\n /**\r\n * 配置 SSAO\r\n */\r\n configureSSAO(config: Partial<SSAOPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._saoPass.enabled = config.enabled\r\n }\r\n if (config.intensity !== undefined) {\r\n this._saoPass.params.saoIntensity = config.intensity\r\n }\r\n if (config.scale !== undefined) {\r\n this._saoPass.params.saoScale = config.scale\r\n }\r\n }\r\n\r\n /**\r\n * 配置 SSR\r\n */\r\n configureSSR(config: Partial<SSRPassConfig>): void {\r\n if (config.enabled !== undefined) {\r\n this._ssrPass.enabled = config.enabled\r\n }\r\n if (config.thickness !== undefined) {\r\n this._ssrPass.thickness = config.thickness\r\n }\r\n if (config.infiniteThick !== undefined) {\r\n this._ssrPass.infiniteThick = config.infiniteThick\r\n }\r\n if (config.maxDistance !== undefined) {\r\n this._ssrPass.maxDistance = config.maxDistance\r\n }\r\n if (config.opacity !== undefined) {\r\n this._ssrPass.opacity = config.opacity\r\n }\r\n }\r\n\r\n /**\r\n * 添加 SSR 网格\r\n */\r\n addSSRMesh(mesh: THREE.Mesh): void {\r\n if (!this.ssrMeshList.includes(mesh)) {\r\n this.ssrMeshList.push(mesh)\r\n }\r\n }\r\n\r\n /**\r\n * 移除 SSR 网格\r\n */\r\n removeSSRMesh(mesh: THREE.Mesh): void {\r\n const index = this.ssrMeshList.indexOf(mesh)\r\n if (index > -1) {\r\n this.ssrMeshList.splice(index, 1)\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouse(event: MouseEvent): THREE.Vector2 {\r\n const target = event.target as HTMLElement\r\n // 使用 offsetX/offsetY,它们是相对于 event.target 的\r\n return new THREE.Vector2(\r\n (event.offsetX / target.clientWidth) * 2 - 1,\r\n -(event.offsetY / target.clientHeight) * 2 + 1\r\n )\r\n}\r\n\r\n/**\r\n * 从容器元素获取 WebGL 鼠标坐标\r\n * @param event 鼠标事件\r\n * @param container 容器元素\r\n * @returns 归一化的鼠标坐标\r\n */\r\nexport function getWebGLMouseFromContainer(event: MouseEvent, container: HTMLElement): THREE.Vector2 {\r\n const rect = container.getBoundingClientRect()\r\n return new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n}\r\n\r\n/**\r\n * 射线检测物体\r\n * @param mouse 鼠标坐标\r\n * @param camera 相机\r\n * @param objects 检测对象列表\r\n * @returns 交点列表\r\n */\r\nexport function raycastObjects(\r\n mouse: THREE.Vector2,\r\n camera: THREE.Camera,\r\n objects: THREE.Object3D[]\r\n): THREE.Intersection[] {\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(mouse, camera)\r\n\r\n const intersects = raycaster.intersectObjects(objects, true)\r\n\r\n // 过滤掉 TransformControls 和不可见物体\r\n return intersects.filter(i => {\r\n const obj = i.object as any\r\n // 兼容两种标记方式\r\n const isTransformControl = obj.isTransformControls || obj.text === 'TransformControls'\r\n return !isTransformControl &&\r\n obj.isMesh &&\r\n obj.visible\r\n })\r\n}\r\n\r\n/**\r\n * 获取物体的根模型\r\n * @param object 物体\r\n * @returns 根模型\r\n */\r\nexport function getRootModel(object: THREE.Object3D): THREE.Object3D {\r\n let current = object\r\n while (current.parent && current.parent.type !== 'Scene') {\r\n current = current.parent\r\n }\r\n return current\r\n}\r\n\r\n/**\r\n * 创建射线检测器\r\n * @param camera 相机\r\n * @returns 射线检测工具\r\n */\r\nexport function createRaycaster(camera: THREE.Camera) {\r\n const raycaster = new THREE.Raycaster()\r\n\r\n return {\r\n raycaster,\r\n\r\n /**\r\n * 从鼠标事件获取交点\r\n */\r\n getIntersects(event: MouseEvent, objects: THREE.Object3D[]): THREE.Intersection[] {\r\n const mouse = getWebGLMouse(event)\r\n raycaster.setFromCamera(mouse, camera)\r\n return raycaster.intersectObjects(objects, true)\r\n },\r\n\r\n /**\r\n * 设置射线远近\r\n */\r\n setRange(near: number, far: number): void {\r\n raycaster.near = near\r\n raycaster.far = far\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { EditorPluginConfig } from '../../types/config.types'\r\nimport type { HandlerMode, ClickInfo, ExtendedObject3D } from '../../types/core.types'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\nimport { getRootModel, raycastObjects, getWebGLMouse } from '../../utils/raycast'\r\n\r\n/**\r\n * 默认编辑器配置\r\n */\r\nexport const DEFAULT_EDITOR_CONFIG: EditorPluginConfig = {\r\n modes: ['选择', '根选择', '变换', '场景绘制', '点击信息'],\r\n defaultMode: '变换',\r\n isTransformChildren: false,\r\n enableKeyboard: false\r\n}\r\n\r\n/**\r\n * 编辑器插件\r\n * 提供物体选择、变换、模式切换等编辑功能\r\n */\r\nexport class EditorPlugin extends Plugin<EditorPluginConfig> {\r\n readonly name = 'editor'\r\n readonly dependencies = ['transform-controller', 'composer']\r\n\r\n /** 当前模式 */\r\n private _mode: HandlerMode\r\n\r\n /** 当前选中信息 */\r\n private _currentInfo: ClickInfo | null = null\r\n\r\n /** 键盘事件处理函数 */\r\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null\r\n\r\n /** 绘制事件回调 */\r\n drawEventCallback?: (point: THREE.Vector3, object: THREE.Object3D) => void\r\n\r\n constructor(config?: Partial<EditorPluginConfig>) {\r\n super({ ...DEFAULT_EDITOR_CONFIG, ...config })\r\n this._mode = (this.config.defaultMode as HandlerMode) || '变换'\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n get mode(): HandlerMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前选中信息\r\n */\r\n get currentInfo(): ClickInfo | null {\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取是否变换子物体\r\n */\r\n get isTransformChildren(): boolean {\r\n return this.config.isTransformChildren\r\n }\r\n\r\n /**\r\n * 设置是否变换子物体\r\n */\r\n set isTransformChildren(value: boolean) {\r\n this.config.isTransformChildren = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 设置键盘快捷键\r\n if (this.config.enableKeyboard) {\r\n this.enableKeyboard()\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.disableKeyboard()\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: HandlerMode): void {\r\n const previous = this._mode\r\n this._mode = mode\r\n this.events.emit('mode:change', { mode, previous })\r\n }\r\n\r\n /**\r\n * 处理场景点击事件\r\n */\r\n handleClick(event: MouseEvent): ClickInfo | null {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return null\r\n\r\n // 分离当前变换控制器\r\n transformPlugin.detach()\r\n\r\n // 获取鼠标位置(使用渲染器的 domElement 计算)\r\n const rect = this.renderer.domElement.getBoundingClientRect()\r\n const mouse = new THREE.Vector2(\r\n ((event.clientX - rect.left) / rect.width) * 2 - 1,\r\n -((event.clientY - rect.top) / rect.height) * 2 + 1\r\n )\r\n\r\n // 射线检测\r\n const intersects = raycastObjects(mouse, this.camera, this.scene.children)\r\n\r\n // 过滤有效交点\r\n const intersect = intersects.find(i => {\r\n const obj = i.object as ExtendedObject3D\r\n const rootObj = getRootModel(i.object)\r\n return (i.object as THREE.Object3D).visible && rootObj.visible\r\n })\r\n\r\n if (!intersect) {\r\n this._currentInfo = null\r\n this.events.emit('click', { event, info: null })\r\n return null\r\n }\r\n\r\n const { object, point } = intersect\r\n const rootModel = getRootModel(object)\r\n\r\n // 根据模式处理\r\n switch (this._mode) {\r\n case '变换':\r\n composerPlugin.clearOutlineObjects()\r\n if (this.config.isTransformChildren) {\r\n transformPlugin.attach(object)\r\n } else {\r\n transformPlugin.attach(rootModel)\r\n }\r\n break\r\n\r\n case '选择':\r\n composerPlugin.setOutlineObjects([object])\r\n break\r\n\r\n case '根选择':\r\n composerPlugin.setOutlineObjects([rootModel])\r\n break\r\n\r\n case '场景绘制':\r\n this.drawEventCallback?.(point, object)\r\n break\r\n\r\n case '点击信息':\r\n // 仅返回信息,不做其他操作\r\n break\r\n }\r\n\r\n // 保存当前信息\r\n this._currentInfo = {\r\n currentModel: object,\r\n currentRootModel: rootModel,\r\n point: point.clone(),\r\n mode: this._mode\r\n }\r\n\r\n this.events.emit('click', { event, info: this._currentInfo })\r\n this.events.emit('object:selected', {\r\n object: this._mode === '选择' ? object : rootModel,\r\n previous: null\r\n })\r\n\r\n return this._currentInfo\r\n }\r\n\r\n /**\r\n * 获取原始射线检测结果\r\n */\r\n getRawRaycast(event: MouseEvent, objects?: THREE.Object3D[]): {\r\n raycaster: THREE.Raycaster\r\n intersects: THREE.Intersection[]\r\n } {\r\n const mouse = getWebGLMouse(event)\r\n const raycaster = new THREE.Raycaster()\r\n raycaster.setFromCamera(mouse, this.camera)\r\n\r\n const targetObjects = objects || this.scene.children\r\n const intersects = raycaster.intersectObjects(targetObjects, true)\r\n\r\n return { raycaster, intersects }\r\n }\r\n\r\n /**\r\n * 选择物体\r\n */\r\n select(object: THREE.Object3D | null): void {\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n const composerPlugin = this.getPlugin<ComposerPlugin>('composer')\r\n\r\n if (!transformPlugin || !composerPlugin) return\r\n\r\n if (object) {\r\n if (this._mode === '变换') {\r\n transformPlugin.attach(object)\r\n }\r\n composerPlugin.setOutlineObjects([object])\r\n this.events.emit('object:selected', { object, previous: this._currentInfo?.currentModel || null })\r\n } else {\r\n transformPlugin.detach()\r\n composerPlugin.clearOutlineObjects()\r\n this.events.emit('object:deselected', { object: this._currentInfo?.currentModel! })\r\n }\r\n }\r\n\r\n /**\r\n * 取消选择\r\n */\r\n deselect(): void {\r\n this.select(null)\r\n this._currentInfo = null\r\n }\r\n\r\n /**\r\n * 启用键盘快捷键\r\n */\r\n enableKeyboard(): void {\r\n if (this.keydownHandler) return\r\n\r\n const transformPlugin = this.getPlugin<TransformControllerPlugin>('transform-controller')\r\n\r\n this.keydownHandler = (e: KeyboardEvent) => {\r\n if (!transformPlugin) return\r\n\r\n switch (e.key.toLowerCase()) {\r\n case 'w':\r\n transformPlugin.setMode('translate')\r\n break\r\n case 'e':\r\n transformPlugin.setMode('rotate')\r\n break\r\n case 'r':\r\n transformPlugin.setMode('scale')\r\n break\r\n case 'escape':\r\n this.deselect()\r\n break\r\n case 'delete':\r\n case 'backspace':\r\n if (this._currentInfo?.currentRootModel) {\r\n this.scene.remove(this._currentInfo.currentRootModel)\r\n this.deselect()\r\n }\r\n break\r\n }\r\n }\r\n\r\n document.addEventListener('keydown', this.keydownHandler)\r\n this.config.enableKeyboard = true\r\n }\r\n\r\n /**\r\n * 禁用键盘快捷键\r\n */\r\n disableKeyboard(): void {\r\n if (this.keydownHandler) {\r\n document.removeEventListener('keydown', this.keydownHandler)\r\n this.keydownHandler = null\r\n }\r\n this.config.enableKeyboard = false\r\n }\r\n\r\n /**\r\n * 获取插件\r\n */\r\n private getPlugin<T>(name: string): T | undefined {\r\n return this.pluginManager?.get(name) as T | undefined\r\n }\r\n}\r\n","/**\n * dat-gui JavaScript Controller Library\n * https://github.com/dataarts/dat.gui\n *\n * Copyright 2011 Data Arts Team, Google Creative Lab\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n */\n\nfunction ___$insertStyle(css) {\n if (!css) {\n return;\n }\n if (typeof window === 'undefined') {\n return;\n }\n\n var style = document.createElement('style');\n\n style.setAttribute('type', 'text/css');\n style.innerHTML = css;\n document.head.appendChild(style);\n\n return css;\n}\n\nfunction colorToString (color, forceCSSHex) {\n var colorFormat = color.__state.conversionName.toString();\n var r = Math.round(color.r);\n var g = Math.round(color.g);\n var b = Math.round(color.b);\n var a = color.a;\n var h = Math.round(color.h);\n var s = color.s.toFixed(1);\n var v = color.v.toFixed(1);\n if (forceCSSHex || colorFormat === 'THREE_CHAR_HEX' || colorFormat === 'SIX_CHAR_HEX') {\n var str = color.hex.toString(16);\n while (str.length < 6) {\n str = '0' + str;\n }\n return '#' + str;\n } else if (colorFormat === 'CSS_RGB') {\n return 'rgb(' + r + ',' + g + ',' + b + ')';\n } else if (colorFormat === 'CSS_RGBA') {\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n } else if (colorFormat === 'HEX') {\n return '0x' + color.hex.toString(16);\n } else if (colorFormat === 'RGB_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ']';\n } else if (colorFormat === 'RGBA_ARRAY') {\n return '[' + r + ',' + g + ',' + b + ',' + a + ']';\n } else if (colorFormat === 'RGB_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + '}';\n } else if (colorFormat === 'RGBA_OBJ') {\n return '{r:' + r + ',g:' + g + ',b:' + b + ',a:' + a + '}';\n } else if (colorFormat === 'HSV_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + '}';\n } else if (colorFormat === 'HSVA_OBJ') {\n return '{h:' + h + ',s:' + s + ',v:' + v + ',a:' + a + '}';\n }\n return 'unknown format';\n}\n\nvar ARR_EACH = Array.prototype.forEach;\nvar ARR_SLICE = Array.prototype.slice;\nvar Common = {\n BREAK: {},\n extend: function extend(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (!this.isUndefined(obj[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n defaults: function defaults(target) {\n this.each(ARR_SLICE.call(arguments, 1), function (obj) {\n var keys = this.isObject(obj) ? Object.keys(obj) : [];\n keys.forEach(function (key) {\n if (this.isUndefined(target[key])) {\n target[key] = obj[key];\n }\n }.bind(this));\n }, this);\n return target;\n },\n compose: function compose() {\n var toCall = ARR_SLICE.call(arguments);\n return function () {\n var args = ARR_SLICE.call(arguments);\n for (var i = toCall.length - 1; i >= 0; i--) {\n args = [toCall[i].apply(this, args)];\n }\n return args[0];\n };\n },\n each: function each(obj, itr, scope) {\n if (!obj) {\n return;\n }\n if (ARR_EACH && obj.forEach && obj.forEach === ARR_EACH) {\n obj.forEach(itr, scope);\n } else if (obj.length === obj.length + 0) {\n var key = void 0;\n var l = void 0;\n for (key = 0, l = obj.length; key < l; key++) {\n if (key in obj && itr.call(scope, obj[key], key) === this.BREAK) {\n return;\n }\n }\n } else {\n for (var _key in obj) {\n if (itr.call(scope, obj[_key], _key) === this.BREAK) {\n return;\n }\n }\n }\n },\n defer: function defer(fnc) {\n setTimeout(fnc, 0);\n },\n debounce: function debounce(func, threshold, callImmediately) {\n var timeout = void 0;\n return function () {\n var obj = this;\n var args = arguments;\n function delayed() {\n timeout = null;\n if (!callImmediately) func.apply(obj, args);\n }\n var callNow = callImmediately || !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(delayed, threshold);\n if (callNow) {\n func.apply(obj, args);\n }\n };\n },\n toArray: function toArray(obj) {\n if (obj.toArray) return obj.toArray();\n return ARR_SLICE.call(obj);\n },\n isUndefined: function isUndefined(obj) {\n return obj === undefined;\n },\n isNull: function isNull(obj) {\n return obj === null;\n },\n isNaN: function (_isNaN) {\n function isNaN(_x) {\n return _isNaN.apply(this, arguments);\n }\n isNaN.toString = function () {\n return _isNaN.toString();\n };\n return isNaN;\n }(function (obj) {\n return isNaN(obj);\n }),\n isArray: Array.isArray || function (obj) {\n return obj.constructor === Array;\n },\n isObject: function isObject(obj) {\n return obj === Object(obj);\n },\n isNumber: function isNumber(obj) {\n return obj === obj + 0;\n },\n isString: function isString(obj) {\n return obj === obj + '';\n },\n isBoolean: function isBoolean(obj) {\n return obj === false || obj === true;\n },\n isFunction: function isFunction(obj) {\n return obj instanceof Function;\n }\n};\n\nvar INTERPRETATIONS = [\n{\n litmus: Common.isString,\n conversions: {\n THREE_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString() + test[1].toString() + test[2].toString() + test[2].toString() + test[3].toString() + test[3].toString(), 0)\n };\n },\n write: colorToString\n },\n SIX_CHAR_HEX: {\n read: function read(original) {\n var test = original.match(/^#([A-F0-9]{6})$/i);\n if (test === null) {\n return false;\n }\n return {\n space: 'HEX',\n hex: parseInt('0x' + test[1].toString(), 0)\n };\n },\n write: colorToString\n },\n CSS_RGB: {\n read: function read(original) {\n var test = original.match(/^rgb\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3])\n };\n },\n write: colorToString\n },\n CSS_RGBA: {\n read: function read(original) {\n var test = original.match(/^rgba\\(\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*,\\s*(\\S+)\\s*\\)/);\n if (test === null) {\n return false;\n }\n return {\n space: 'RGB',\n r: parseFloat(test[1]),\n g: parseFloat(test[2]),\n b: parseFloat(test[3]),\n a: parseFloat(test[4])\n };\n },\n write: colorToString\n }\n }\n},\n{\n litmus: Common.isNumber,\n conversions: {\n HEX: {\n read: function read(original) {\n return {\n space: 'HEX',\n hex: original,\n conversionName: 'HEX'\n };\n },\n write: function write(color) {\n return color.hex;\n }\n }\n }\n},\n{\n litmus: Common.isArray,\n conversions: {\n RGB_ARRAY: {\n read: function read(original) {\n if (original.length !== 3) {\n return false;\n }\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b];\n }\n },\n RGBA_ARRAY: {\n read: function read(original) {\n if (original.length !== 4) return false;\n return {\n space: 'RGB',\n r: original[0],\n g: original[1],\n b: original[2],\n a: original[3]\n };\n },\n write: function write(color) {\n return [color.r, color.g, color.b, color.a];\n }\n }\n }\n},\n{\n litmus: Common.isObject,\n conversions: {\n RGBA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b) && Common.isNumber(original.a)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n a: color.a\n };\n }\n },\n RGB_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.r) && Common.isNumber(original.g) && Common.isNumber(original.b)) {\n return {\n space: 'RGB',\n r: original.r,\n g: original.g,\n b: original.b\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n r: color.r,\n g: color.g,\n b: color.b\n };\n }\n },\n HSVA_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v) && Common.isNumber(original.a)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v,\n a: original.a\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v,\n a: color.a\n };\n }\n },\n HSV_OBJ: {\n read: function read(original) {\n if (Common.isNumber(original.h) && Common.isNumber(original.s) && Common.isNumber(original.v)) {\n return {\n space: 'HSV',\n h: original.h,\n s: original.s,\n v: original.v\n };\n }\n return false;\n },\n write: function write(color) {\n return {\n h: color.h,\n s: color.s,\n v: color.v\n };\n }\n }\n }\n}];\nvar result = void 0;\nvar toReturn = void 0;\nvar interpret = function interpret() {\n toReturn = false;\n var original = arguments.length > 1 ? Common.toArray(arguments) : arguments[0];\n Common.each(INTERPRETATIONS, function (family) {\n if (family.litmus(original)) {\n Common.each(family.conversions, function (conversion, conversionName) {\n result = conversion.read(original);\n if (toReturn === false && result !== false) {\n toReturn = result;\n result.conversionName = conversionName;\n result.conversion = conversion;\n return Common.BREAK;\n }\n });\n return Common.BREAK;\n }\n });\n return toReturn;\n};\n\nvar tmpComponent = void 0;\nvar ColorMath = {\n hsv_to_rgb: function hsv_to_rgb(h, s, v) {\n var hi = Math.floor(h / 60) % 6;\n var f = h / 60 - Math.floor(h / 60);\n var p = v * (1.0 - s);\n var q = v * (1.0 - f * s);\n var t = v * (1.0 - (1.0 - f) * s);\n var c = [[v, t, p], [q, v, p], [p, v, t], [p, q, v], [t, p, v], [v, p, q]][hi];\n return {\n r: c[0] * 255,\n g: c[1] * 255,\n b: c[2] * 255\n };\n },\n rgb_to_hsv: function rgb_to_hsv(r, g, b) {\n var min = Math.min(r, g, b);\n var max = Math.max(r, g, b);\n var delta = max - min;\n var h = void 0;\n var s = void 0;\n if (max !== 0) {\n s = delta / max;\n } else {\n return {\n h: NaN,\n s: 0,\n v: 0\n };\n }\n if (r === max) {\n h = (g - b) / delta;\n } else if (g === max) {\n h = 2 + (b - r) / delta;\n } else {\n h = 4 + (r - g) / delta;\n }\n h /= 6;\n if (h < 0) {\n h += 1;\n }\n return {\n h: h * 360,\n s: s,\n v: max / 255\n };\n },\n rgb_to_hex: function rgb_to_hex(r, g, b) {\n var hex = this.hex_with_component(0, 2, r);\n hex = this.hex_with_component(hex, 1, g);\n hex = this.hex_with_component(hex, 0, b);\n return hex;\n },\n component_from_hex: function component_from_hex(hex, componentIndex) {\n return hex >> componentIndex * 8 & 0xFF;\n },\n hex_with_component: function hex_with_component(hex, componentIndex, value) {\n return value << (tmpComponent = componentIndex * 8) | hex & ~(0xFF << tmpComponent);\n }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\n\n\n\n\n\n\nvar get = function get(object, property, receiver) {\n if (object === null) object = Function.prototype;\n var desc = Object.getOwnPropertyDescriptor(object, property);\n\n if (desc === undefined) {\n var parent = Object.getPrototypeOf(object);\n\n if (parent === null) {\n return undefined;\n } else {\n return get(parent, property, receiver);\n }\n } else if (\"value\" in desc) {\n return desc.value;\n } else {\n var getter = desc.get;\n\n if (getter === undefined) {\n return undefined;\n }\n\n return getter.call(receiver);\n }\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\n\n\n\n\n\n\n\n\n\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar Color = function () {\n function Color() {\n classCallCheck(this, Color);\n this.__state = interpret.apply(this, arguments);\n if (this.__state === false) {\n throw new Error('Failed to interpret color arguments');\n }\n this.__state.a = this.__state.a || 1;\n }\n createClass(Color, [{\n key: 'toString',\n value: function toString() {\n return colorToString(this);\n }\n }, {\n key: 'toHexString',\n value: function toHexString() {\n return colorToString(this, true);\n }\n }, {\n key: 'toOriginal',\n value: function toOriginal() {\n return this.__state.conversion.write(this);\n }\n }]);\n return Color;\n}();\nfunction defineRGBComponent(target, component, componentHexIndex) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'RGB') {\n return this.__state[component];\n }\n Color.recalculateRGB(this, component, componentHexIndex);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'RGB') {\n Color.recalculateRGB(this, component, componentHexIndex);\n this.__state.space = 'RGB';\n }\n this.__state[component] = v;\n }\n });\n}\nfunction defineHSVComponent(target, component) {\n Object.defineProperty(target, component, {\n get: function get$$1() {\n if (this.__state.space === 'HSV') {\n return this.__state[component];\n }\n Color.recalculateHSV(this);\n return this.__state[component];\n },\n set: function set$$1(v) {\n if (this.__state.space !== 'HSV') {\n Color.recalculateHSV(this);\n this.__state.space = 'HSV';\n }\n this.__state[component] = v;\n }\n });\n}\nColor.recalculateRGB = function (color, component, componentHexIndex) {\n if (color.__state.space === 'HEX') {\n color.__state[component] = ColorMath.component_from_hex(color.__state.hex, componentHexIndex);\n } else if (color.__state.space === 'HSV') {\n Common.extend(color.__state, ColorMath.hsv_to_rgb(color.__state.h, color.__state.s, color.__state.v));\n } else {\n throw new Error('Corrupted color state');\n }\n};\nColor.recalculateHSV = function (color) {\n var result = ColorMath.rgb_to_hsv(color.r, color.g, color.b);\n Common.extend(color.__state, {\n s: result.s,\n v: result.v\n });\n if (!Common.isNaN(result.h)) {\n color.__state.h = result.h;\n } else if (Common.isUndefined(color.__state.h)) {\n color.__state.h = 0;\n }\n};\nColor.COMPONENTS = ['r', 'g', 'b', 'h', 's', 'v', 'hex', 'a'];\ndefineRGBComponent(Color.prototype, 'r', 2);\ndefineRGBComponent(Color.prototype, 'g', 1);\ndefineRGBComponent(Color.prototype, 'b', 0);\ndefineHSVComponent(Color.prototype, 'h');\ndefineHSVComponent(Color.prototype, 's');\ndefineHSVComponent(Color.prototype, 'v');\nObject.defineProperty(Color.prototype, 'a', {\n get: function get$$1() {\n return this.__state.a;\n },\n set: function set$$1(v) {\n this.__state.a = v;\n }\n});\nObject.defineProperty(Color.prototype, 'hex', {\n get: function get$$1() {\n if (this.__state.space !== 'HEX') {\n this.__state.hex = ColorMath.rgb_to_hex(this.r, this.g, this.b);\n this.__state.space = 'HEX';\n }\n return this.__state.hex;\n },\n set: function set$$1(v) {\n this.__state.space = 'HEX';\n this.__state.hex = v;\n }\n});\n\nvar Controller = function () {\n function Controller(object, property) {\n classCallCheck(this, Controller);\n this.initialValue = object[property];\n this.domElement = document.createElement('div');\n this.object = object;\n this.property = property;\n this.__onChange = undefined;\n this.__onFinishChange = undefined;\n }\n createClass(Controller, [{\n key: 'onChange',\n value: function onChange(fnc) {\n this.__onChange = fnc;\n return this;\n }\n }, {\n key: 'onFinishChange',\n value: function onFinishChange(fnc) {\n this.__onFinishChange = fnc;\n return this;\n }\n }, {\n key: 'setValue',\n value: function setValue(newValue) {\n this.object[this.property] = newValue;\n if (this.__onChange) {\n this.__onChange.call(this, newValue);\n }\n this.updateDisplay();\n return this;\n }\n }, {\n key: 'getValue',\n value: function getValue() {\n return this.object[this.property];\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n return this;\n }\n }, {\n key: 'isModified',\n value: function isModified() {\n return this.initialValue !== this.getValue();\n }\n }]);\n return Controller;\n}();\n\nvar EVENT_MAP = {\n HTMLEvents: ['change'],\n MouseEvents: ['click', 'mousemove', 'mousedown', 'mouseup', 'mouseover'],\n KeyboardEvents: ['keydown']\n};\nvar EVENT_MAP_INV = {};\nCommon.each(EVENT_MAP, function (v, k) {\n Common.each(v, function (e) {\n EVENT_MAP_INV[e] = k;\n });\n});\nvar CSS_VALUE_PIXELS = /(\\d+(\\.\\d+)?)px/;\nfunction cssValueToPixels(val) {\n if (val === '0' || Common.isUndefined(val)) {\n return 0;\n }\n var match = val.match(CSS_VALUE_PIXELS);\n if (!Common.isNull(match)) {\n return parseFloat(match[1]);\n }\n return 0;\n}\nvar dom = {\n makeSelectable: function makeSelectable(elem, selectable) {\n if (elem === undefined || elem.style === undefined) return;\n elem.onselectstart = selectable ? function () {\n return false;\n } : function () {};\n elem.style.MozUserSelect = selectable ? 'auto' : 'none';\n elem.style.KhtmlUserSelect = selectable ? 'auto' : 'none';\n elem.unselectable = selectable ? 'on' : 'off';\n },\n makeFullscreen: function makeFullscreen(elem, hor, vert) {\n var vertical = vert;\n var horizontal = hor;\n if (Common.isUndefined(horizontal)) {\n horizontal = true;\n }\n if (Common.isUndefined(vertical)) {\n vertical = true;\n }\n elem.style.position = 'absolute';\n if (horizontal) {\n elem.style.left = 0;\n elem.style.right = 0;\n }\n if (vertical) {\n elem.style.top = 0;\n elem.style.bottom = 0;\n }\n },\n fakeEvent: function fakeEvent(elem, eventType, pars, aux) {\n var params = pars || {};\n var className = EVENT_MAP_INV[eventType];\n if (!className) {\n throw new Error('Event type ' + eventType + ' not supported.');\n }\n var evt = document.createEvent(className);\n switch (className) {\n case 'MouseEvents':\n {\n var clientX = params.x || params.clientX || 0;\n var clientY = params.y || params.clientY || 0;\n evt.initMouseEvent(eventType, params.bubbles || false, params.cancelable || true, window, params.clickCount || 1, 0,\n 0,\n clientX,\n clientY,\n false, false, false, false, 0, null);\n break;\n }\n case 'KeyboardEvents':\n {\n var init = evt.initKeyboardEvent || evt.initKeyEvent;\n Common.defaults(params, {\n cancelable: true,\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n keyCode: undefined,\n charCode: undefined\n });\n init(eventType, params.bubbles || false, params.cancelable, window, params.ctrlKey, params.altKey, params.shiftKey, params.metaKey, params.keyCode, params.charCode);\n break;\n }\n default:\n {\n evt.initEvent(eventType, params.bubbles || false, params.cancelable || true);\n break;\n }\n }\n Common.defaults(evt, aux);\n elem.dispatchEvent(evt);\n },\n bind: function bind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.addEventListener) {\n elem.addEventListener(event, func, bool);\n } else if (elem.attachEvent) {\n elem.attachEvent('on' + event, func);\n }\n return dom;\n },\n unbind: function unbind(elem, event, func, newBool) {\n var bool = newBool || false;\n if (elem.removeEventListener) {\n elem.removeEventListener(event, func, bool);\n } else if (elem.detachEvent) {\n elem.detachEvent('on' + event, func);\n }\n return dom;\n },\n addClass: function addClass(elem, className) {\n if (elem.className === undefined) {\n elem.className = className;\n } else if (elem.className !== className) {\n var classes = elem.className.split(/ +/);\n if (classes.indexOf(className) === -1) {\n classes.push(className);\n elem.className = classes.join(' ').replace(/^\\s+/, '').replace(/\\s+$/, '');\n }\n }\n return dom;\n },\n removeClass: function removeClass(elem, className) {\n if (className) {\n if (elem.className === className) {\n elem.removeAttribute('class');\n } else {\n var classes = elem.className.split(/ +/);\n var index = classes.indexOf(className);\n if (index !== -1) {\n classes.splice(index, 1);\n elem.className = classes.join(' ');\n }\n }\n } else {\n elem.className = undefined;\n }\n return dom;\n },\n hasClass: function hasClass(elem, className) {\n return new RegExp('(?:^|\\\\s+)' + className + '(?:\\\\s+|$)').test(elem.className) || false;\n },\n getWidth: function getWidth(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-left-width']) + cssValueToPixels(style['border-right-width']) + cssValueToPixels(style['padding-left']) + cssValueToPixels(style['padding-right']) + cssValueToPixels(style.width);\n },\n getHeight: function getHeight(elem) {\n var style = getComputedStyle(elem);\n return cssValueToPixels(style['border-top-width']) + cssValueToPixels(style['border-bottom-width']) + cssValueToPixels(style['padding-top']) + cssValueToPixels(style['padding-bottom']) + cssValueToPixels(style.height);\n },\n getOffset: function getOffset(el) {\n var elem = el;\n var offset = { left: 0, top: 0 };\n if (elem.offsetParent) {\n do {\n offset.left += elem.offsetLeft;\n offset.top += elem.offsetTop;\n elem = elem.offsetParent;\n } while (elem);\n }\n return offset;\n },\n isActive: function isActive(elem) {\n return elem === document.activeElement && (elem.type || elem.href);\n }\n};\n\nvar BooleanController = function (_Controller) {\n inherits(BooleanController, _Controller);\n function BooleanController(object, property) {\n classCallCheck(this, BooleanController);\n var _this2 = possibleConstructorReturn(this, (BooleanController.__proto__ || Object.getPrototypeOf(BooleanController)).call(this, object, property));\n var _this = _this2;\n _this2.__prev = _this2.getValue();\n _this2.__checkbox = document.createElement('input');\n _this2.__checkbox.setAttribute('type', 'checkbox');\n function onChange() {\n _this.setValue(!_this.__prev);\n }\n dom.bind(_this2.__checkbox, 'change', onChange, false);\n _this2.domElement.appendChild(_this2.__checkbox);\n _this2.updateDisplay();\n return _this2;\n }\n createClass(BooleanController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n this.__prev = this.getValue();\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (this.getValue() === true) {\n this.__checkbox.setAttribute('checked', 'checked');\n this.__checkbox.checked = true;\n this.__prev = true;\n } else {\n this.__checkbox.checked = false;\n this.__prev = false;\n }\n return get(BooleanController.prototype.__proto__ || Object.getPrototypeOf(BooleanController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return BooleanController;\n}(Controller);\n\nvar OptionController = function (_Controller) {\n inherits(OptionController, _Controller);\n function OptionController(object, property, opts) {\n classCallCheck(this, OptionController);\n var _this2 = possibleConstructorReturn(this, (OptionController.__proto__ || Object.getPrototypeOf(OptionController)).call(this, object, property));\n var options = opts;\n var _this = _this2;\n _this2.__select = document.createElement('select');\n if (Common.isArray(options)) {\n var map = {};\n Common.each(options, function (element) {\n map[element] = element;\n });\n options = map;\n }\n Common.each(options, function (value, key) {\n var opt = document.createElement('option');\n opt.innerHTML = key;\n opt.setAttribute('value', value);\n _this.__select.appendChild(opt);\n });\n _this2.updateDisplay();\n dom.bind(_this2.__select, 'change', function () {\n var desiredValue = this.options[this.selectedIndex].value;\n _this.setValue(desiredValue);\n });\n _this2.domElement.appendChild(_this2.__select);\n return _this2;\n }\n createClass(OptionController, [{\n key: 'setValue',\n value: function setValue(v) {\n var toReturn = get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'setValue', this).call(this, v);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n return toReturn;\n }\n }, {\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (dom.isActive(this.__select)) return this;\n this.__select.value = this.getValue();\n return get(OptionController.prototype.__proto__ || Object.getPrototypeOf(OptionController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return OptionController;\n}(Controller);\n\nvar StringController = function (_Controller) {\n inherits(StringController, _Controller);\n function StringController(object, property) {\n classCallCheck(this, StringController);\n var _this2 = possibleConstructorReturn(this, (StringController.__proto__ || Object.getPrototypeOf(StringController)).call(this, object, property));\n var _this = _this2;\n function onChange() {\n _this.setValue(_this.__input.value);\n }\n function onBlur() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'keyup', onChange);\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n this.blur();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(StringController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n if (!dom.isActive(this.__input)) {\n this.__input.value = this.getValue();\n }\n return get(StringController.prototype.__proto__ || Object.getPrototypeOf(StringController.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return StringController;\n}(Controller);\n\nfunction numDecimals(x) {\n var _x = x.toString();\n if (_x.indexOf('.') > -1) {\n return _x.length - _x.indexOf('.') - 1;\n }\n return 0;\n}\nvar NumberController = function (_Controller) {\n inherits(NumberController, _Controller);\n function NumberController(object, property, params) {\n classCallCheck(this, NumberController);\n var _this = possibleConstructorReturn(this, (NumberController.__proto__ || Object.getPrototypeOf(NumberController)).call(this, object, property));\n var _params = params || {};\n _this.__min = _params.min;\n _this.__max = _params.max;\n _this.__step = _params.step;\n if (Common.isUndefined(_this.__step)) {\n if (_this.initialValue === 0) {\n _this.__impliedStep = 1;\n } else {\n _this.__impliedStep = Math.pow(10, Math.floor(Math.log(Math.abs(_this.initialValue)) / Math.LN10)) / 10;\n }\n } else {\n _this.__impliedStep = _this.__step;\n }\n _this.__precision = numDecimals(_this.__impliedStep);\n return _this;\n }\n createClass(NumberController, [{\n key: 'setValue',\n value: function setValue(v) {\n var _v = v;\n if (this.__min !== undefined && _v < this.__min) {\n _v = this.__min;\n } else if (this.__max !== undefined && _v > this.__max) {\n _v = this.__max;\n }\n if (this.__step !== undefined && _v % this.__step !== 0) {\n _v = Math.round(_v / this.__step) * this.__step;\n }\n return get(NumberController.prototype.__proto__ || Object.getPrototypeOf(NumberController.prototype), 'setValue', this).call(this, _v);\n }\n }, {\n key: 'min',\n value: function min(minValue) {\n this.__min = minValue;\n return this;\n }\n }, {\n key: 'max',\n value: function max(maxValue) {\n this.__max = maxValue;\n return this;\n }\n }, {\n key: 'step',\n value: function step(stepValue) {\n this.__step = stepValue;\n this.__impliedStep = stepValue;\n this.__precision = numDecimals(stepValue);\n return this;\n }\n }]);\n return NumberController;\n}(Controller);\n\nfunction roundToDecimal(value, decimals) {\n var tenTo = Math.pow(10, decimals);\n return Math.round(value * tenTo) / tenTo;\n}\nvar NumberControllerBox = function (_NumberController) {\n inherits(NumberControllerBox, _NumberController);\n function NumberControllerBox(object, property, params) {\n classCallCheck(this, NumberControllerBox);\n var _this2 = possibleConstructorReturn(this, (NumberControllerBox.__proto__ || Object.getPrototypeOf(NumberControllerBox)).call(this, object, property, params));\n _this2.__truncationSuspended = false;\n var _this = _this2;\n var prevY = void 0;\n function onChange() {\n var attempted = parseFloat(_this.__input.value);\n if (!Common.isNaN(attempted)) {\n _this.setValue(attempted);\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onBlur() {\n onFinish();\n }\n function onMouseDrag(e) {\n var diff = prevY - e.clientY;\n _this.setValue(_this.getValue() + diff * _this.__impliedStep);\n prevY = e.clientY;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n onFinish();\n }\n function onMouseDown(e) {\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n prevY = e.clientY;\n }\n _this2.__input = document.createElement('input');\n _this2.__input.setAttribute('type', 'text');\n dom.bind(_this2.__input, 'change', onChange);\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__input, 'mousedown', onMouseDown);\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n _this.__truncationSuspended = true;\n this.blur();\n _this.__truncationSuspended = false;\n onFinish();\n }\n });\n _this2.updateDisplay();\n _this2.domElement.appendChild(_this2.__input);\n return _this2;\n }\n createClass(NumberControllerBox, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n this.__input.value = this.__truncationSuspended ? this.getValue() : roundToDecimal(this.getValue(), this.__precision);\n return get(NumberControllerBox.prototype.__proto__ || Object.getPrototypeOf(NumberControllerBox.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerBox;\n}(NumberController);\n\nfunction map(v, i1, i2, o1, o2) {\n return o1 + (o2 - o1) * ((v - i1) / (i2 - i1));\n}\nvar NumberControllerSlider = function (_NumberController) {\n inherits(NumberControllerSlider, _NumberController);\n function NumberControllerSlider(object, property, min, max, step) {\n classCallCheck(this, NumberControllerSlider);\n var _this2 = possibleConstructorReturn(this, (NumberControllerSlider.__proto__ || Object.getPrototypeOf(NumberControllerSlider)).call(this, object, property, { min: min, max: max, step: step }));\n var _this = _this2;\n _this2.__background = document.createElement('div');\n _this2.__foreground = document.createElement('div');\n dom.bind(_this2.__background, 'mousedown', onMouseDown);\n dom.bind(_this2.__background, 'touchstart', onTouchStart);\n dom.addClass(_this2.__background, 'slider');\n dom.addClass(_this2.__foreground, 'slider-fg');\n function onMouseDown(e) {\n document.activeElement.blur();\n dom.bind(window, 'mousemove', onMouseDrag);\n dom.bind(window, 'mouseup', onMouseUp);\n onMouseDrag(e);\n }\n function onMouseDrag(e) {\n e.preventDefault();\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(e.clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n return false;\n }\n function onMouseUp() {\n dom.unbind(window, 'mousemove', onMouseDrag);\n dom.unbind(window, 'mouseup', onMouseUp);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n function onTouchStart(e) {\n if (e.touches.length !== 1) {\n return;\n }\n dom.bind(window, 'touchmove', onTouchMove);\n dom.bind(window, 'touchend', onTouchEnd);\n onTouchMove(e);\n }\n function onTouchMove(e) {\n var clientX = e.touches[0].clientX;\n var bgRect = _this.__background.getBoundingClientRect();\n _this.setValue(map(clientX, bgRect.left, bgRect.right, _this.__min, _this.__max));\n }\n function onTouchEnd() {\n dom.unbind(window, 'touchmove', onTouchMove);\n dom.unbind(window, 'touchend', onTouchEnd);\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.getValue());\n }\n }\n _this2.updateDisplay();\n _this2.__background.appendChild(_this2.__foreground);\n _this2.domElement.appendChild(_this2.__background);\n return _this2;\n }\n createClass(NumberControllerSlider, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var pct = (this.getValue() - this.__min) / (this.__max - this.__min);\n this.__foreground.style.width = pct * 100 + '%';\n return get(NumberControllerSlider.prototype.__proto__ || Object.getPrototypeOf(NumberControllerSlider.prototype), 'updateDisplay', this).call(this);\n }\n }]);\n return NumberControllerSlider;\n}(NumberController);\n\nvar FunctionController = function (_Controller) {\n inherits(FunctionController, _Controller);\n function FunctionController(object, property, text) {\n classCallCheck(this, FunctionController);\n var _this2 = possibleConstructorReturn(this, (FunctionController.__proto__ || Object.getPrototypeOf(FunctionController)).call(this, object, property));\n var _this = _this2;\n _this2.__button = document.createElement('div');\n _this2.__button.innerHTML = text === undefined ? 'Fire' : text;\n dom.bind(_this2.__button, 'click', function (e) {\n e.preventDefault();\n _this.fire();\n return false;\n });\n dom.addClass(_this2.__button, 'button');\n _this2.domElement.appendChild(_this2.__button);\n return _this2;\n }\n createClass(FunctionController, [{\n key: 'fire',\n value: function fire() {\n if (this.__onChange) {\n this.__onChange.call(this);\n }\n this.getValue().call(this.object);\n if (this.__onFinishChange) {\n this.__onFinishChange.call(this, this.getValue());\n }\n }\n }]);\n return FunctionController;\n}(Controller);\n\nvar ColorController = function (_Controller) {\n inherits(ColorController, _Controller);\n function ColorController(object, property) {\n classCallCheck(this, ColorController);\n var _this2 = possibleConstructorReturn(this, (ColorController.__proto__ || Object.getPrototypeOf(ColorController)).call(this, object, property));\n _this2.__color = new Color(_this2.getValue());\n _this2.__temp = new Color(0);\n var _this = _this2;\n _this2.domElement = document.createElement('div');\n dom.makeSelectable(_this2.domElement, false);\n _this2.__selector = document.createElement('div');\n _this2.__selector.className = 'selector';\n _this2.__saturation_field = document.createElement('div');\n _this2.__saturation_field.className = 'saturation-field';\n _this2.__field_knob = document.createElement('div');\n _this2.__field_knob.className = 'field-knob';\n _this2.__field_knob_border = '2px solid ';\n _this2.__hue_knob = document.createElement('div');\n _this2.__hue_knob.className = 'hue-knob';\n _this2.__hue_field = document.createElement('div');\n _this2.__hue_field.className = 'hue-field';\n _this2.__input = document.createElement('input');\n _this2.__input.type = 'text';\n _this2.__input_textShadow = '0 1px 1px ';\n dom.bind(_this2.__input, 'keydown', function (e) {\n if (e.keyCode === 13) {\n onBlur.call(this);\n }\n });\n dom.bind(_this2.__input, 'blur', onBlur);\n dom.bind(_this2.__selector, 'mousedown', function () {\n dom.addClass(this, 'drag').bind(window, 'mouseup', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n dom.bind(_this2.__selector, 'touchstart', function () {\n dom.addClass(this, 'drag').bind(window, 'touchend', function () {\n dom.removeClass(_this.__selector, 'drag');\n });\n });\n var valueField = document.createElement('div');\n Common.extend(_this2.__selector.style, {\n width: '122px',\n height: '102px',\n padding: '3px',\n backgroundColor: '#222',\n boxShadow: '0px 1px 3px rgba(0,0,0,0.3)'\n });\n Common.extend(_this2.__field_knob.style, {\n position: 'absolute',\n width: '12px',\n height: '12px',\n border: _this2.__field_knob_border + (_this2.__color.v < 0.5 ? '#fff' : '#000'),\n boxShadow: '0px 1px 3px rgba(0,0,0,0.5)',\n borderRadius: '12px',\n zIndex: 1\n });\n Common.extend(_this2.__hue_knob.style, {\n position: 'absolute',\n width: '15px',\n height: '2px',\n borderRight: '4px solid #fff',\n zIndex: 1\n });\n Common.extend(_this2.__saturation_field.style, {\n width: '100px',\n height: '100px',\n border: '1px solid #555',\n marginRight: '3px',\n display: 'inline-block',\n cursor: 'pointer'\n });\n Common.extend(valueField.style, {\n width: '100%',\n height: '100%',\n background: 'none'\n });\n linearGradient(valueField, 'top', 'rgba(0,0,0,0)', '#000');\n Common.extend(_this2.__hue_field.style, {\n width: '15px',\n height: '100px',\n border: '1px solid #555',\n cursor: 'ns-resize',\n position: 'absolute',\n top: '3px',\n right: '3px'\n });\n hueGradient(_this2.__hue_field);\n Common.extend(_this2.__input.style, {\n outline: 'none',\n textAlign: 'center',\n color: '#fff',\n border: 0,\n fontWeight: 'bold',\n textShadow: _this2.__input_textShadow + 'rgba(0,0,0,0.7)'\n });\n dom.bind(_this2.__saturation_field, 'mousedown', fieldDown);\n dom.bind(_this2.__saturation_field, 'touchstart', fieldDown);\n dom.bind(_this2.__field_knob, 'mousedown', fieldDown);\n dom.bind(_this2.__field_knob, 'touchstart', fieldDown);\n dom.bind(_this2.__hue_field, 'mousedown', fieldDownH);\n dom.bind(_this2.__hue_field, 'touchstart', fieldDownH);\n function fieldDown(e) {\n setSV(e);\n dom.bind(window, 'mousemove', setSV);\n dom.bind(window, 'touchmove', setSV);\n dom.bind(window, 'mouseup', fieldUpSV);\n dom.bind(window, 'touchend', fieldUpSV);\n }\n function fieldDownH(e) {\n setH(e);\n dom.bind(window, 'mousemove', setH);\n dom.bind(window, 'touchmove', setH);\n dom.bind(window, 'mouseup', fieldUpH);\n dom.bind(window, 'touchend', fieldUpH);\n }\n function fieldUpSV() {\n dom.unbind(window, 'mousemove', setSV);\n dom.unbind(window, 'touchmove', setSV);\n dom.unbind(window, 'mouseup', fieldUpSV);\n dom.unbind(window, 'touchend', fieldUpSV);\n onFinish();\n }\n function fieldUpH() {\n dom.unbind(window, 'mousemove', setH);\n dom.unbind(window, 'touchmove', setH);\n dom.unbind(window, 'mouseup', fieldUpH);\n dom.unbind(window, 'touchend', fieldUpH);\n onFinish();\n }\n function onBlur() {\n var i = interpret(this.value);\n if (i !== false) {\n _this.__color.__state = i;\n _this.setValue(_this.__color.toOriginal());\n } else {\n this.value = _this.__color.toString();\n }\n }\n function onFinish() {\n if (_this.__onFinishChange) {\n _this.__onFinishChange.call(_this, _this.__color.toOriginal());\n }\n }\n _this2.__saturation_field.appendChild(valueField);\n _this2.__selector.appendChild(_this2.__field_knob);\n _this2.__selector.appendChild(_this2.__saturation_field);\n _this2.__selector.appendChild(_this2.__hue_field);\n _this2.__hue_field.appendChild(_this2.__hue_knob);\n _this2.domElement.appendChild(_this2.__input);\n _this2.domElement.appendChild(_this2.__selector);\n _this2.updateDisplay();\n function setSV(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__saturation_field.getBoundingClientRect();\n var _ref = e.touches && e.touches[0] || e,\n clientX = _ref.clientX,\n clientY = _ref.clientY;\n var s = (clientX - fieldRect.left) / (fieldRect.right - fieldRect.left);\n var v = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (v > 1) {\n v = 1;\n } else if (v < 0) {\n v = 0;\n }\n if (s > 1) {\n s = 1;\n } else if (s < 0) {\n s = 0;\n }\n _this.__color.v = v;\n _this.__color.s = s;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n function setH(e) {\n if (e.type.indexOf('touch') === -1) {\n e.preventDefault();\n }\n var fieldRect = _this.__hue_field.getBoundingClientRect();\n var _ref2 = e.touches && e.touches[0] || e,\n clientY = _ref2.clientY;\n var h = 1 - (clientY - fieldRect.top) / (fieldRect.bottom - fieldRect.top);\n if (h > 1) {\n h = 1;\n } else if (h < 0) {\n h = 0;\n }\n _this.__color.h = h * 360;\n _this.setValue(_this.__color.toOriginal());\n return false;\n }\n return _this2;\n }\n createClass(ColorController, [{\n key: 'updateDisplay',\n value: function updateDisplay() {\n var i = interpret(this.getValue());\n if (i !== false) {\n var mismatch = false;\n Common.each(Color.COMPONENTS, function (component) {\n if (!Common.isUndefined(i[component]) && !Common.isUndefined(this.__color.__state[component]) && i[component] !== this.__color.__state[component]) {\n mismatch = true;\n return {};\n }\n }, this);\n if (mismatch) {\n Common.extend(this.__color.__state, i);\n }\n }\n Common.extend(this.__temp.__state, this.__color.__state);\n this.__temp.a = 1;\n var flip = this.__color.v < 0.5 || this.__color.s > 0.5 ? 255 : 0;\n var _flip = 255 - flip;\n Common.extend(this.__field_knob.style, {\n marginLeft: 100 * this.__color.s - 7 + 'px',\n marginTop: 100 * (1 - this.__color.v) - 7 + 'px',\n backgroundColor: this.__temp.toHexString(),\n border: this.__field_knob_border + 'rgb(' + flip + ',' + flip + ',' + flip + ')'\n });\n this.__hue_knob.style.marginTop = (1 - this.__color.h / 360) * 100 + 'px';\n this.__temp.s = 1;\n this.__temp.v = 1;\n linearGradient(this.__saturation_field, 'left', '#fff', this.__temp.toHexString());\n this.__input.value = this.__color.toString();\n Common.extend(this.__input.style, {\n backgroundColor: this.__color.toHexString(),\n color: 'rgb(' + flip + ',' + flip + ',' + flip + ')',\n textShadow: this.__input_textShadow + 'rgba(' + _flip + ',' + _flip + ',' + _flip + ',.7)'\n });\n }\n }]);\n return ColorController;\n}(Controller);\nvar vendors = ['-moz-', '-o-', '-webkit-', '-ms-', ''];\nfunction linearGradient(elem, x, a, b) {\n elem.style.background = '';\n Common.each(vendors, function (vendor) {\n elem.style.cssText += 'background: ' + vendor + 'linear-gradient(' + x + ', ' + a + ' 0%, ' + b + ' 100%); ';\n });\n}\nfunction hueGradient(elem) {\n elem.style.background = '';\n elem.style.cssText += 'background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);';\n elem.style.cssText += 'background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n elem.style.cssText += 'background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);';\n}\n\nvar css = {\n load: function load(url, indoc) {\n var doc = indoc || document;\n var link = doc.createElement('link');\n link.type = 'text/css';\n link.rel = 'stylesheet';\n link.href = url;\n doc.getElementsByTagName('head')[0].appendChild(link);\n },\n inject: function inject(cssContent, indoc) {\n var doc = indoc || document;\n var injected = document.createElement('style');\n injected.type = 'text/css';\n injected.innerHTML = cssContent;\n var head = doc.getElementsByTagName('head')[0];\n try {\n head.appendChild(injected);\n } catch (e) {\n }\n }\n};\n\nvar saveDialogContents = \"<div id=\\\"dg-save\\\" class=\\\"dg dialogue\\\">\\n\\n Here's the new load parameter for your <code>GUI</code>'s constructor:\\n\\n <textarea id=\\\"dg-new-constructor\\\"></textarea>\\n\\n <div id=\\\"dg-save-locally\\\">\\n\\n <input id=\\\"dg-local-storage\\\" type=\\\"checkbox\\\"/> Automatically save\\n values to <code>localStorage</code> on exit.\\n\\n <div id=\\\"dg-local-explain\\\">The values saved to <code>localStorage</code> will\\n override those passed to <code>dat.GUI</code>'s constructor. This makes it\\n easier to work incrementally, but <code>localStorage</code> is fragile,\\n and your friends may not see the same values you do.\\n\\n </div>\\n\\n </div>\\n\\n</div>\";\n\nvar ControllerFactory = function ControllerFactory(object, property) {\n var initialValue = object[property];\n if (Common.isArray(arguments[2]) || Common.isObject(arguments[2])) {\n return new OptionController(object, property, arguments[2]);\n }\n if (Common.isNumber(initialValue)) {\n if (Common.isNumber(arguments[2]) && Common.isNumber(arguments[3])) {\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerSlider(object, property, arguments[2], arguments[3], arguments[4]);\n }\n return new NumberControllerSlider(object, property, arguments[2], arguments[3]);\n }\n if (Common.isNumber(arguments[4])) {\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3], step: arguments[4] });\n }\n return new NumberControllerBox(object, property, { min: arguments[2], max: arguments[3] });\n }\n if (Common.isString(initialValue)) {\n return new StringController(object, property);\n }\n if (Common.isFunction(initialValue)) {\n return new FunctionController(object, property, '');\n }\n if (Common.isBoolean(initialValue)) {\n return new BooleanController(object, property);\n }\n return null;\n};\n\nfunction requestAnimationFrame(callback) {\n setTimeout(callback, 1000 / 60);\n}\nvar requestAnimationFrame$1 = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || requestAnimationFrame;\n\nvar CenteredDiv = function () {\n function CenteredDiv() {\n classCallCheck(this, CenteredDiv);\n this.backgroundElement = document.createElement('div');\n Common.extend(this.backgroundElement.style, {\n backgroundColor: 'rgba(0,0,0,0.8)',\n top: 0,\n left: 0,\n display: 'none',\n zIndex: '1000',\n opacity: 0,\n WebkitTransition: 'opacity 0.2s linear',\n transition: 'opacity 0.2s linear'\n });\n dom.makeFullscreen(this.backgroundElement);\n this.backgroundElement.style.position = 'fixed';\n this.domElement = document.createElement('div');\n Common.extend(this.domElement.style, {\n position: 'fixed',\n display: 'none',\n zIndex: '1001',\n opacity: 0,\n WebkitTransition: '-webkit-transform 0.2s ease-out, opacity 0.2s linear',\n transition: 'transform 0.2s ease-out, opacity 0.2s linear'\n });\n document.body.appendChild(this.backgroundElement);\n document.body.appendChild(this.domElement);\n var _this = this;\n dom.bind(this.backgroundElement, 'click', function () {\n _this.hide();\n });\n }\n createClass(CenteredDiv, [{\n key: 'show',\n value: function show() {\n var _this = this;\n this.backgroundElement.style.display = 'block';\n this.domElement.style.display = 'block';\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n this.layout();\n Common.defer(function () {\n _this.backgroundElement.style.opacity = 1;\n _this.domElement.style.opacity = 1;\n _this.domElement.style.webkitTransform = 'scale(1)';\n });\n }\n }, {\n key: 'hide',\n value: function hide() {\n var _this = this;\n var hide = function hide() {\n _this.domElement.style.display = 'none';\n _this.backgroundElement.style.display = 'none';\n dom.unbind(_this.domElement, 'webkitTransitionEnd', hide);\n dom.unbind(_this.domElement, 'transitionend', hide);\n dom.unbind(_this.domElement, 'oTransitionEnd', hide);\n };\n dom.bind(this.domElement, 'webkitTransitionEnd', hide);\n dom.bind(this.domElement, 'transitionend', hide);\n dom.bind(this.domElement, 'oTransitionEnd', hide);\n this.backgroundElement.style.opacity = 0;\n this.domElement.style.opacity = 0;\n this.domElement.style.webkitTransform = 'scale(1.1)';\n }\n }, {\n key: 'layout',\n value: function layout() {\n this.domElement.style.left = window.innerWidth / 2 - dom.getWidth(this.domElement) / 2 + 'px';\n this.domElement.style.top = window.innerHeight / 2 - dom.getHeight(this.domElement) / 2 + 'px';\n }\n }]);\n return CenteredDiv;\n}();\n\nvar styleSheet = ___$insertStyle(\".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\\n\");\n\ncss.inject(styleSheet);\nvar CSS_NAMESPACE = 'dg';\nvar HIDE_KEY_CODE = 72;\nvar CLOSE_BUTTON_HEIGHT = 20;\nvar DEFAULT_DEFAULT_PRESET_NAME = 'Default';\nvar SUPPORTS_LOCAL_STORAGE = function () {\n try {\n return !!window.localStorage;\n } catch (e) {\n return false;\n }\n}();\nvar SAVE_DIALOGUE = void 0;\nvar autoPlaceVirgin = true;\nvar autoPlaceContainer = void 0;\nvar hide = false;\nvar hideableGuis = [];\nvar GUI = function GUI(pars) {\n var _this = this;\n var params = pars || {};\n this.domElement = document.createElement('div');\n this.__ul = document.createElement('ul');\n this.domElement.appendChild(this.__ul);\n dom.addClass(this.domElement, CSS_NAMESPACE);\n this.__folders = {};\n this.__controllers = [];\n this.__rememberedObjects = [];\n this.__rememberedObjectIndecesToControllers = [];\n this.__listening = [];\n params = Common.defaults(params, {\n closeOnTop: false,\n autoPlace: true,\n width: GUI.DEFAULT_WIDTH\n });\n params = Common.defaults(params, {\n resizable: params.autoPlace,\n hideable: params.autoPlace\n });\n if (!Common.isUndefined(params.load)) {\n if (params.preset) {\n params.load.preset = params.preset;\n }\n } else {\n params.load = { preset: DEFAULT_DEFAULT_PRESET_NAME };\n }\n if (Common.isUndefined(params.parent) && params.hideable) {\n hideableGuis.push(this);\n }\n params.resizable = Common.isUndefined(params.parent) && params.resizable;\n if (params.autoPlace && Common.isUndefined(params.scrollable)) {\n params.scrollable = true;\n }\n var useLocalStorage = SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(this, 'isLocal')) === 'true';\n var saveToLocalStorage = void 0;\n var titleRow = void 0;\n Object.defineProperties(this,\n {\n parent: {\n get: function get$$1() {\n return params.parent;\n }\n },\n scrollable: {\n get: function get$$1() {\n return params.scrollable;\n }\n },\n autoPlace: {\n get: function get$$1() {\n return params.autoPlace;\n }\n },\n closeOnTop: {\n get: function get$$1() {\n return params.closeOnTop;\n }\n },\n preset: {\n get: function get$$1() {\n if (_this.parent) {\n return _this.getRoot().preset;\n }\n return params.load.preset;\n },\n set: function set$$1(v) {\n if (_this.parent) {\n _this.getRoot().preset = v;\n } else {\n params.load.preset = v;\n }\n setPresetSelectIndex(this);\n _this.revert();\n }\n },\n width: {\n get: function get$$1() {\n return params.width;\n },\n set: function set$$1(v) {\n params.width = v;\n setWidth(_this, v);\n }\n },\n name: {\n get: function get$$1() {\n return params.name;\n },\n set: function set$$1(v) {\n params.name = v;\n if (titleRow) {\n titleRow.innerHTML = params.name;\n }\n }\n },\n closed: {\n get: function get$$1() {\n return params.closed;\n },\n set: function set$$1(v) {\n params.closed = v;\n if (params.closed) {\n dom.addClass(_this.__ul, GUI.CLASS_CLOSED);\n } else {\n dom.removeClass(_this.__ul, GUI.CLASS_CLOSED);\n }\n this.onResize();\n if (_this.__closeButton) {\n _this.__closeButton.innerHTML = v ? GUI.TEXT_OPEN : GUI.TEXT_CLOSED;\n }\n }\n },\n load: {\n get: function get$$1() {\n return params.load;\n }\n },\n useLocalStorage: {\n get: function get$$1() {\n return useLocalStorage;\n },\n set: function set$$1(bool) {\n if (SUPPORTS_LOCAL_STORAGE) {\n useLocalStorage = bool;\n if (bool) {\n dom.bind(window, 'unload', saveToLocalStorage);\n } else {\n dom.unbind(window, 'unload', saveToLocalStorage);\n }\n localStorage.setItem(getLocalStorageHash(_this, 'isLocal'), bool);\n }\n }\n }\n });\n if (Common.isUndefined(params.parent)) {\n this.closed = params.closed || false;\n dom.addClass(this.domElement, GUI.CLASS_MAIN);\n dom.makeSelectable(this.domElement, false);\n if (SUPPORTS_LOCAL_STORAGE) {\n if (useLocalStorage) {\n _this.useLocalStorage = true;\n var savedGui = localStorage.getItem(getLocalStorageHash(this, 'gui'));\n if (savedGui) {\n params.load = JSON.parse(savedGui);\n }\n }\n }\n this.__closeButton = document.createElement('div');\n this.__closeButton.innerHTML = GUI.TEXT_CLOSED;\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BUTTON);\n if (params.closeOnTop) {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_TOP);\n this.domElement.insertBefore(this.__closeButton, this.domElement.childNodes[0]);\n } else {\n dom.addClass(this.__closeButton, GUI.CLASS_CLOSE_BOTTOM);\n this.domElement.appendChild(this.__closeButton);\n }\n dom.bind(this.__closeButton, 'click', function () {\n _this.closed = !_this.closed;\n });\n } else {\n if (params.closed === undefined) {\n params.closed = true;\n }\n var titleRowName = document.createTextNode(params.name);\n dom.addClass(titleRowName, 'controller-name');\n titleRow = addRow(_this, titleRowName);\n var onClickTitle = function onClickTitle(e) {\n e.preventDefault();\n _this.closed = !_this.closed;\n return false;\n };\n dom.addClass(this.__ul, GUI.CLASS_CLOSED);\n dom.addClass(titleRow, 'title');\n dom.bind(titleRow, 'click', onClickTitle);\n if (!params.closed) {\n this.closed = false;\n }\n }\n if (params.autoPlace) {\n if (Common.isUndefined(params.parent)) {\n if (autoPlaceVirgin) {\n autoPlaceContainer = document.createElement('div');\n dom.addClass(autoPlaceContainer, CSS_NAMESPACE);\n dom.addClass(autoPlaceContainer, GUI.CLASS_AUTO_PLACE_CONTAINER);\n document.body.appendChild(autoPlaceContainer);\n autoPlaceVirgin = false;\n }\n autoPlaceContainer.appendChild(this.domElement);\n dom.addClass(this.domElement, GUI.CLASS_AUTO_PLACE);\n }\n if (!this.parent) {\n setWidth(_this, params.width);\n }\n }\n this.__resizeHandler = function () {\n _this.onResizeDebounced();\n };\n dom.bind(window, 'resize', this.__resizeHandler);\n dom.bind(this.__ul, 'webkitTransitionEnd', this.__resizeHandler);\n dom.bind(this.__ul, 'transitionend', this.__resizeHandler);\n dom.bind(this.__ul, 'oTransitionEnd', this.__resizeHandler);\n this.onResize();\n if (params.resizable) {\n addResizeHandle(this);\n }\n saveToLocalStorage = function saveToLocalStorage() {\n if (SUPPORTS_LOCAL_STORAGE && localStorage.getItem(getLocalStorageHash(_this, 'isLocal')) === 'true') {\n localStorage.setItem(getLocalStorageHash(_this, 'gui'), JSON.stringify(_this.getSaveObject()));\n }\n };\n this.saveToLocalStorageIfPossible = saveToLocalStorage;\n function resetWidth() {\n var root = _this.getRoot();\n root.width += 1;\n Common.defer(function () {\n root.width -= 1;\n });\n }\n if (!params.parent) {\n resetWidth();\n }\n};\nGUI.toggleHide = function () {\n hide = !hide;\n Common.each(hideableGuis, function (gui) {\n gui.domElement.style.display = hide ? 'none' : '';\n });\n};\nGUI.CLASS_AUTO_PLACE = 'a';\nGUI.CLASS_AUTO_PLACE_CONTAINER = 'ac';\nGUI.CLASS_MAIN = 'main';\nGUI.CLASS_CONTROLLER_ROW = 'cr';\nGUI.CLASS_TOO_TALL = 'taller-than-window';\nGUI.CLASS_CLOSED = 'closed';\nGUI.CLASS_CLOSE_BUTTON = 'close-button';\nGUI.CLASS_CLOSE_TOP = 'close-top';\nGUI.CLASS_CLOSE_BOTTOM = 'close-bottom';\nGUI.CLASS_DRAG = 'drag';\nGUI.DEFAULT_WIDTH = 245;\nGUI.TEXT_CLOSED = 'Close Controls';\nGUI.TEXT_OPEN = 'Open Controls';\nGUI._keydownHandler = function (e) {\n if (document.activeElement.type !== 'text' && (e.which === HIDE_KEY_CODE || e.keyCode === HIDE_KEY_CODE)) {\n GUI.toggleHide();\n }\n};\ndom.bind(window, 'keydown', GUI._keydownHandler, false);\nCommon.extend(GUI.prototype,\n{\n add: function add(object, property) {\n return _add(this, object, property, {\n factoryArgs: Array.prototype.slice.call(arguments, 2)\n });\n },\n addColor: function addColor(object, property) {\n return _add(this, object, property, {\n color: true\n });\n },\n remove: function remove(controller) {\n this.__ul.removeChild(controller.__li);\n this.__controllers.splice(this.__controllers.indexOf(controller), 1);\n var _this = this;\n Common.defer(function () {\n _this.onResize();\n });\n },\n destroy: function destroy() {\n if (this.parent) {\n throw new Error('Only the root GUI should be removed with .destroy(). ' + 'For subfolders, use gui.removeFolder(folder) instead.');\n }\n if (this.autoPlace) {\n autoPlaceContainer.removeChild(this.domElement);\n }\n var _this = this;\n Common.each(this.__folders, function (subfolder) {\n _this.removeFolder(subfolder);\n });\n dom.unbind(window, 'keydown', GUI._keydownHandler, false);\n removeListeners(this);\n },\n addFolder: function addFolder(name) {\n if (this.__folders[name] !== undefined) {\n throw new Error('You already have a folder in this GUI by the' + ' name \"' + name + '\"');\n }\n var newGuiParams = { name: name, parent: this };\n newGuiParams.autoPlace = this.autoPlace;\n if (this.load &&\n this.load.folders &&\n this.load.folders[name]) {\n newGuiParams.closed = this.load.folders[name].closed;\n newGuiParams.load = this.load.folders[name];\n }\n var gui = new GUI(newGuiParams);\n this.__folders[name] = gui;\n var li = addRow(this, gui.domElement);\n dom.addClass(li, 'folder');\n return gui;\n },\n removeFolder: function removeFolder(folder) {\n this.__ul.removeChild(folder.domElement.parentElement);\n delete this.__folders[folder.name];\n if (this.load &&\n this.load.folders &&\n this.load.folders[folder.name]) {\n delete this.load.folders[folder.name];\n }\n removeListeners(folder);\n var _this = this;\n Common.each(folder.__folders, function (subfolder) {\n folder.removeFolder(subfolder);\n });\n Common.defer(function () {\n _this.onResize();\n });\n },\n open: function open() {\n this.closed = false;\n },\n close: function close() {\n this.closed = true;\n },\n hide: function hide() {\n this.domElement.style.display = 'none';\n },\n show: function show() {\n this.domElement.style.display = '';\n },\n onResize: function onResize() {\n var root = this.getRoot();\n if (root.scrollable) {\n var top = dom.getOffset(root.__ul).top;\n var h = 0;\n Common.each(root.__ul.childNodes, function (node) {\n if (!(root.autoPlace && node === root.__save_row)) {\n h += dom.getHeight(node);\n }\n });\n if (window.innerHeight - top - CLOSE_BUTTON_HEIGHT < h) {\n dom.addClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = window.innerHeight - top - CLOSE_BUTTON_HEIGHT + 'px';\n } else {\n dom.removeClass(root.domElement, GUI.CLASS_TOO_TALL);\n root.__ul.style.height = 'auto';\n }\n }\n if (root.__resize_handle) {\n Common.defer(function () {\n root.__resize_handle.style.height = root.__ul.offsetHeight + 'px';\n });\n }\n if (root.__closeButton) {\n root.__closeButton.style.width = root.width + 'px';\n }\n },\n onResizeDebounced: Common.debounce(function () {\n this.onResize();\n }, 50),\n remember: function remember() {\n if (Common.isUndefined(SAVE_DIALOGUE)) {\n SAVE_DIALOGUE = new CenteredDiv();\n SAVE_DIALOGUE.domElement.innerHTML = saveDialogContents;\n }\n if (this.parent) {\n throw new Error('You can only call remember on a top level GUI.');\n }\n var _this = this;\n Common.each(Array.prototype.slice.call(arguments), function (object) {\n if (_this.__rememberedObjects.length === 0) {\n addSaveMenu(_this);\n }\n if (_this.__rememberedObjects.indexOf(object) === -1) {\n _this.__rememberedObjects.push(object);\n }\n });\n if (this.autoPlace) {\n setWidth(this, this.width);\n }\n },\n getRoot: function getRoot() {\n var gui = this;\n while (gui.parent) {\n gui = gui.parent;\n }\n return gui;\n },\n getSaveObject: function getSaveObject() {\n var toReturn = this.load;\n toReturn.closed = this.closed;\n if (this.__rememberedObjects.length > 0) {\n toReturn.preset = this.preset;\n if (!toReturn.remembered) {\n toReturn.remembered = {};\n }\n toReturn.remembered[this.preset] = getCurrentPreset(this);\n }\n toReturn.folders = {};\n Common.each(this.__folders, function (element, key) {\n toReturn.folders[key] = element.getSaveObject();\n });\n return toReturn;\n },\n save: function save() {\n if (!this.load.remembered) {\n this.load.remembered = {};\n }\n this.load.remembered[this.preset] = getCurrentPreset(this);\n markPresetModified(this, false);\n this.saveToLocalStorageIfPossible();\n },\n saveAs: function saveAs(presetName) {\n if (!this.load.remembered) {\n this.load.remembered = {};\n this.load.remembered[DEFAULT_DEFAULT_PRESET_NAME] = getCurrentPreset(this, true);\n }\n this.load.remembered[presetName] = getCurrentPreset(this);\n this.preset = presetName;\n addPresetOption(this, presetName, true);\n this.saveToLocalStorageIfPossible();\n },\n revert: function revert(gui) {\n Common.each(this.__controllers, function (controller) {\n if (!this.getRoot().load.remembered) {\n controller.setValue(controller.initialValue);\n } else {\n recallSavedValue(gui || this.getRoot(), controller);\n }\n if (controller.__onFinishChange) {\n controller.__onFinishChange.call(controller, controller.getValue());\n }\n }, this);\n Common.each(this.__folders, function (folder) {\n folder.revert(folder);\n });\n if (!gui) {\n markPresetModified(this.getRoot(), false);\n }\n },\n listen: function listen(controller) {\n var init = this.__listening.length === 0;\n this.__listening.push(controller);\n if (init) {\n updateDisplays(this.__listening);\n }\n },\n updateDisplay: function updateDisplay() {\n Common.each(this.__controllers, function (controller) {\n controller.updateDisplay();\n });\n Common.each(this.__folders, function (folder) {\n folder.updateDisplay();\n });\n }\n});\nfunction addRow(gui, newDom, liBefore) {\n var li = document.createElement('li');\n if (newDom) {\n li.appendChild(newDom);\n }\n if (liBefore) {\n gui.__ul.insertBefore(li, liBefore);\n } else {\n gui.__ul.appendChild(li);\n }\n gui.onResize();\n return li;\n}\nfunction removeListeners(gui) {\n dom.unbind(window, 'resize', gui.__resizeHandler);\n if (gui.saveToLocalStorageIfPossible) {\n dom.unbind(window, 'unload', gui.saveToLocalStorageIfPossible);\n }\n}\nfunction markPresetModified(gui, modified) {\n var opt = gui.__preset_select[gui.__preset_select.selectedIndex];\n if (modified) {\n opt.innerHTML = opt.value + '*';\n } else {\n opt.innerHTML = opt.value;\n }\n}\nfunction augmentController(gui, li, controller) {\n controller.__li = li;\n controller.__gui = gui;\n Common.extend(controller, {\n options: function options(_options) {\n if (arguments.length > 1) {\n var nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: nextSibling,\n factoryArgs: [Common.toArray(arguments)]\n });\n }\n if (Common.isArray(_options) || Common.isObject(_options)) {\n var _nextSibling = controller.__li.nextElementSibling;\n controller.remove();\n return _add(gui, controller.object, controller.property, {\n before: _nextSibling,\n factoryArgs: [_options]\n });\n }\n },\n name: function name(_name) {\n controller.__li.firstElementChild.firstElementChild.innerHTML = _name;\n return controller;\n },\n listen: function listen() {\n controller.__gui.listen(controller);\n return controller;\n },\n remove: function remove() {\n controller.__gui.remove(controller);\n return controller;\n }\n });\n if (controller instanceof NumberControllerSlider) {\n var box = new NumberControllerBox(controller.object, controller.property, { min: controller.__min, max: controller.__max, step: controller.__step });\n Common.each(['updateDisplay', 'onChange', 'onFinishChange', 'step', 'min', 'max'], function (method) {\n var pc = controller[method];\n var pb = box[method];\n controller[method] = box[method] = function () {\n var args = Array.prototype.slice.call(arguments);\n pb.apply(box, args);\n return pc.apply(controller, args);\n };\n });\n dom.addClass(li, 'has-slider');\n controller.domElement.insertBefore(box.domElement, controller.domElement.firstElementChild);\n } else if (controller instanceof NumberControllerBox) {\n var r = function r(returned) {\n if (Common.isNumber(controller.__min) && Common.isNumber(controller.__max)) {\n var oldName = controller.__li.firstElementChild.firstElementChild.innerHTML;\n var wasListening = controller.__gui.__listening.indexOf(controller) > -1;\n controller.remove();\n var newController = _add(gui, controller.object, controller.property, {\n before: controller.__li.nextElementSibling,\n factoryArgs: [controller.__min, controller.__max, controller.__step]\n });\n newController.name(oldName);\n if (wasListening) newController.listen();\n return newController;\n }\n return returned;\n };\n controller.min = Common.compose(r, controller.min);\n controller.max = Common.compose(r, controller.max);\n } else if (controller instanceof BooleanController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__checkbox, 'click');\n });\n dom.bind(controller.__checkbox, 'click', function (e) {\n e.stopPropagation();\n });\n } else if (controller instanceof FunctionController) {\n dom.bind(li, 'click', function () {\n dom.fakeEvent(controller.__button, 'click');\n });\n dom.bind(li, 'mouseover', function () {\n dom.addClass(controller.__button, 'hover');\n });\n dom.bind(li, 'mouseout', function () {\n dom.removeClass(controller.__button, 'hover');\n });\n } else if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n controller.updateDisplay = Common.compose(function (val) {\n li.style.borderLeftColor = controller.__color.toString();\n return val;\n }, controller.updateDisplay);\n controller.updateDisplay();\n }\n controller.setValue = Common.compose(function (val) {\n if (gui.getRoot().__preset_select && controller.isModified()) {\n markPresetModified(gui.getRoot(), true);\n }\n return val;\n }, controller.setValue);\n}\nfunction recallSavedValue(gui, controller) {\n var root = gui.getRoot();\n var matchedIndex = root.__rememberedObjects.indexOf(controller.object);\n if (matchedIndex !== -1) {\n var controllerMap = root.__rememberedObjectIndecesToControllers[matchedIndex];\n if (controllerMap === undefined) {\n controllerMap = {};\n root.__rememberedObjectIndecesToControllers[matchedIndex] = controllerMap;\n }\n controllerMap[controller.property] = controller;\n if (root.load && root.load.remembered) {\n var presetMap = root.load.remembered;\n var preset = void 0;\n if (presetMap[gui.preset]) {\n preset = presetMap[gui.preset];\n } else if (presetMap[DEFAULT_DEFAULT_PRESET_NAME]) {\n preset = presetMap[DEFAULT_DEFAULT_PRESET_NAME];\n } else {\n return;\n }\n if (preset[matchedIndex] && preset[matchedIndex][controller.property] !== undefined) {\n var value = preset[matchedIndex][controller.property];\n controller.initialValue = value;\n controller.setValue(value);\n }\n }\n }\n}\nfunction _add(gui, object, property, params) {\n if (object[property] === undefined) {\n throw new Error('Object \"' + object + '\" has no property \"' + property + '\"');\n }\n var controller = void 0;\n if (params.color) {\n controller = new ColorController(object, property);\n } else {\n var factoryArgs = [object, property].concat(params.factoryArgs);\n controller = ControllerFactory.apply(gui, factoryArgs);\n }\n if (params.before instanceof Controller) {\n params.before = params.before.__li;\n }\n recallSavedValue(gui, controller);\n dom.addClass(controller.domElement, 'c');\n var name = document.createElement('span');\n dom.addClass(name, 'property-name');\n name.innerHTML = controller.property;\n var container = document.createElement('div');\n container.appendChild(name);\n container.appendChild(controller.domElement);\n var li = addRow(gui, container, params.before);\n dom.addClass(li, GUI.CLASS_CONTROLLER_ROW);\n if (controller instanceof ColorController) {\n dom.addClass(li, 'color');\n } else {\n dom.addClass(li, _typeof(controller.getValue()));\n }\n augmentController(gui, li, controller);\n gui.__controllers.push(controller);\n return controller;\n}\nfunction getLocalStorageHash(gui, key) {\n return document.location.href + '.' + key;\n}\nfunction addPresetOption(gui, name, setSelected) {\n var opt = document.createElement('option');\n opt.innerHTML = name;\n opt.value = name;\n gui.__preset_select.appendChild(opt);\n if (setSelected) {\n gui.__preset_select.selectedIndex = gui.__preset_select.length - 1;\n }\n}\nfunction showHideExplain(gui, explain) {\n explain.style.display = gui.useLocalStorage ? 'block' : 'none';\n}\nfunction addSaveMenu(gui) {\n var div = gui.__save_row = document.createElement('li');\n dom.addClass(gui.domElement, 'has-save');\n gui.__ul.insertBefore(div, gui.__ul.firstChild);\n dom.addClass(div, 'save-row');\n var gears = document.createElement('span');\n gears.innerHTML = '&nbsp;';\n dom.addClass(gears, 'button gears');\n var button = document.createElement('span');\n button.innerHTML = 'Save';\n dom.addClass(button, 'button');\n dom.addClass(button, 'save');\n var button2 = document.createElement('span');\n button2.innerHTML = 'New';\n dom.addClass(button2, 'button');\n dom.addClass(button2, 'save-as');\n var button3 = document.createElement('span');\n button3.innerHTML = 'Revert';\n dom.addClass(button3, 'button');\n dom.addClass(button3, 'revert');\n var select = gui.__preset_select = document.createElement('select');\n if (gui.load && gui.load.remembered) {\n Common.each(gui.load.remembered, function (value, key) {\n addPresetOption(gui, key, key === gui.preset);\n });\n } else {\n addPresetOption(gui, DEFAULT_DEFAULT_PRESET_NAME, false);\n }\n dom.bind(select, 'change', function () {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n gui.__preset_select[index].innerHTML = gui.__preset_select[index].value;\n }\n gui.preset = this.value;\n });\n div.appendChild(select);\n div.appendChild(gears);\n div.appendChild(button);\n div.appendChild(button2);\n div.appendChild(button3);\n if (SUPPORTS_LOCAL_STORAGE) {\n var explain = document.getElementById('dg-local-explain');\n var localStorageCheckBox = document.getElementById('dg-local-storage');\n var saveLocally = document.getElementById('dg-save-locally');\n saveLocally.style.display = 'block';\n if (localStorage.getItem(getLocalStorageHash(gui, 'isLocal')) === 'true') {\n localStorageCheckBox.setAttribute('checked', 'checked');\n }\n showHideExplain(gui, explain);\n dom.bind(localStorageCheckBox, 'change', function () {\n gui.useLocalStorage = !gui.useLocalStorage;\n showHideExplain(gui, explain);\n });\n }\n var newConstructorTextArea = document.getElementById('dg-new-constructor');\n dom.bind(newConstructorTextArea, 'keydown', function (e) {\n if (e.metaKey && (e.which === 67 || e.keyCode === 67)) {\n SAVE_DIALOGUE.hide();\n }\n });\n dom.bind(gears, 'click', function () {\n newConstructorTextArea.innerHTML = JSON.stringify(gui.getSaveObject(), undefined, 2);\n SAVE_DIALOGUE.show();\n newConstructorTextArea.focus();\n newConstructorTextArea.select();\n });\n dom.bind(button, 'click', function () {\n gui.save();\n });\n dom.bind(button2, 'click', function () {\n var presetName = prompt('Enter a new preset name.');\n if (presetName) {\n gui.saveAs(presetName);\n }\n });\n dom.bind(button3, 'click', function () {\n gui.revert();\n });\n}\nfunction addResizeHandle(gui) {\n var pmouseX = void 0;\n gui.__resize_handle = document.createElement('div');\n Common.extend(gui.__resize_handle.style, {\n width: '6px',\n marginLeft: '-3px',\n height: '200px',\n cursor: 'ew-resize',\n position: 'absolute'\n });\n function drag(e) {\n e.preventDefault();\n gui.width += pmouseX - e.clientX;\n gui.onResize();\n pmouseX = e.clientX;\n return false;\n }\n function dragStop() {\n dom.removeClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.unbind(window, 'mousemove', drag);\n dom.unbind(window, 'mouseup', dragStop);\n }\n function dragStart(e) {\n e.preventDefault();\n pmouseX = e.clientX;\n dom.addClass(gui.__closeButton, GUI.CLASS_DRAG);\n dom.bind(window, 'mousemove', drag);\n dom.bind(window, 'mouseup', dragStop);\n return false;\n }\n dom.bind(gui.__resize_handle, 'mousedown', dragStart);\n dom.bind(gui.__closeButton, 'mousedown', dragStart);\n gui.domElement.insertBefore(gui.__resize_handle, gui.domElement.firstElementChild);\n}\nfunction setWidth(gui, w) {\n gui.domElement.style.width = w + 'px';\n if (gui.__save_row && gui.autoPlace) {\n gui.__save_row.style.width = w + 'px';\n }\n if (gui.__closeButton) {\n gui.__closeButton.style.width = w + 'px';\n }\n}\nfunction getCurrentPreset(gui, useInitialValues) {\n var toReturn = {};\n Common.each(gui.__rememberedObjects, function (val, index) {\n var savedValues = {};\n var controllerMap = gui.__rememberedObjectIndecesToControllers[index];\n Common.each(controllerMap, function (controller, property) {\n savedValues[property] = useInitialValues ? controller.initialValue : controller.getValue();\n });\n toReturn[index] = savedValues;\n });\n return toReturn;\n}\nfunction setPresetSelectIndex(gui) {\n for (var index = 0; index < gui.__preset_select.length; index++) {\n if (gui.__preset_select[index].value === gui.preset) {\n gui.__preset_select.selectedIndex = index;\n }\n }\n}\nfunction updateDisplays(controllerArray) {\n if (controllerArray.length !== 0) {\n requestAnimationFrame$1.call(window, function () {\n updateDisplays(controllerArray);\n });\n }\n Common.each(controllerArray, function (c) {\n c.updateDisplay();\n });\n}\n\nvar color = {\n Color: Color,\n math: ColorMath,\n interpret: interpret\n};\nvar controllers = {\n Controller: Controller,\n BooleanController: BooleanController,\n OptionController: OptionController,\n StringController: StringController,\n NumberController: NumberController,\n NumberControllerBox: NumberControllerBox,\n NumberControllerSlider: NumberControllerSlider,\n FunctionController: FunctionController,\n ColorController: ColorController\n};\nvar dom$1 = { dom: dom };\nvar gui = { GUI: GUI };\nvar GUI$1 = GUI;\nvar index = {\n color: color,\n controllers: controllers,\n dom: dom$1,\n gui: gui,\n GUI: GUI$1\n};\n\nexport { color, controllers, dom$1 as dom, gui, GUI$1 as GUI };\nexport default index;\n//# sourceMappingURL=dat.gui.module.js.map\n","import * as THREE from 'three'\r\nimport { GUI } from 'dat.gui'\r\nimport { Plugin } from '../Plugin'\r\nimport type { OrbitControllerPlugin } from '../controls/OrbitController'\r\nimport type { TransformControllerPlugin } from '../controls/TransformController'\r\nimport type { ComposerPlugin } from '../postprocessing/ComposerPlugin'\r\n\r\n/**\r\n * GUI 插件配置\r\n */\r\nexport interface GUIPluginConfig {\r\n /** 是否自动挂载 */\r\n autoPlace: boolean\r\n /** 宽度 */\r\n width: number\r\n /** 是否使用代理(空对象) */\r\n useProxy: boolean\r\n /** 是否默认关闭所有文件夹 */\r\n closed: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GUI_CONFIG: GUIPluginConfig = {\r\n autoPlace: true,\r\n width: 300,\r\n useProxy: false,\r\n closed: false\r\n}\r\n\r\n/**\r\n * 几何体类型列表\r\n */\r\nexport const geometryList = ['立方体', '球体', '圆柱体', '圆锥体', '圆环', '平面', '圆环结', '十二面体', '二十面体', '八面体', '四面体']\r\n\r\n/**\r\n * 材质类型列表\r\n */\r\nexport const materialList = ['基础材质', '标准材质', 'Lambert材质', 'Phong材质', '物理材质', 'Toon材质']\r\n\r\n/**\r\n * 光源类型列表\r\n */\r\nexport const lightTypeList = ['AmbientLight', 'DirectionalLight', 'PointLight', 'SpotLight', 'HemisphereLight', 'RectAreaLight']\r\n\r\n/**\r\n * 绘制模式列表\r\n */\r\nexport const drawModeList = ['围栏物体', '平面绘制', '曲线路径', '直线路径']\r\n\r\n/**\r\n * 点模式列表\r\n */\r\nexport const pointModeList = ['场景交点', '地图区域中心', '地图行政中心']\r\n\r\n/**\r\n * GUI 插件\r\n * 提供 dat.gui 配置面板功能,完整迁移原有所有功能\r\n */\r\nexport class GUIPlugin extends Plugin<GUIPluginConfig> {\r\n readonly name = 'gui'\r\n\r\n /** dat.gui 实例 */\r\n private _gui: GUI | null = null\r\n\r\n /** 场景配置文件夹 */\r\n private sceneFolder: GUI | null = null\r\n\r\n /** 控制配置文件夹 */\r\n private controlFolder: GUI | null = null\r\n\r\n /** 3D物体文件夹 */\r\n private meshFolder: GUI | null = null\r\n\r\n /** 动画配置文件夹 */\r\n private animationFolder: GUI | null = null\r\n\r\n /** 选择面板 */\r\n selectPanel: GUI | null = null\r\n\r\n /** 模型列表文件夹 */\r\n private modelListFolder: GUI | null = null\r\n\r\n /** 内置物体列表文件夹 */\r\n private innerMeshListFolder: GUI | null = null\r\n\r\n /** 绘制物体列表文件夹 */\r\n private drawMeshListFolder: GUI | null = null\r\n\r\n /** 地图列表文件夹 */\r\n private geoMapListFolder: GUI | null = null\r\n\r\n /** 粒子列表文件夹 */\r\n private particleListFolder: GUI | null = null\r\n\r\n /** 边界物体列表文件夹 */\r\n private borderGroupListFolder: GUI | null = null\r\n\r\n /** 文本物体列表文件夹 */\r\n private textMeshListFolder: GUI | null = null\r\n\r\n /** 设计物体列表文件夹 */\r\n private designMeshListFolder: GUI | null = null\r\n\r\n /** 灯光列表文件夹 */\r\n private lightListFolder: GUI | null = null\r\n\r\n /** 控制参数 */\r\n private handlerParams = {\r\n mode: '变换',\r\n isTransformChildren: false,\r\n openKey: false\r\n }\r\n\r\n /** 内置物体控制参数 */\r\n private innerMeshParams = {\r\n geometryType: '立方体',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 绘制控制参数 */\r\n private drawParams = {\r\n mode: '围栏物体',\r\n pointMode: '场景交点',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 地图控制参数 */\r\n private geoMapParams = {\r\n url: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 粒子控制参数 */\r\n private particleParams = {\r\n particlesSum: 100000,\r\n inner: 0,\r\n outer: 2000,\r\n maxVelocity: 50,\r\n mapUrl: 'https://z2586300277.github.io/three-editor/dist/files/channels/snow.png',\r\n sportType: '全随机',\r\n shaderCodeName: '水波纹'\r\n }\r\n\r\n /** 边界物体控制参数 */\r\n private borderGroupParams = {\r\n url: 'https://geo.datav.aliyun.com/areas_v3/bound/100000.json',\r\n materialType: '基础材质',\r\n dlength: 0\r\n }\r\n\r\n /** 文本物体控制参数 */\r\n private textMeshParams = {\r\n fontLink: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n text: '',\r\n materialType: '标准材质'\r\n }\r\n\r\n /** 设计物体控制参数 */\r\n private designMeshParams = {\r\n type: '镜面'\r\n }\r\n\r\n /** 灯光控制参数 */\r\n private lightParams = {\r\n lightType: 'AmbientLight'\r\n }\r\n\r\n constructor(config?: Partial<GUIPluginConfig>) {\r\n super({ ...DEFAULT_GUI_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n this.createGUI()\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.destroy()\r\n }\r\n\r\n /**\r\n * 获取 GUI 实例\r\n */\r\n get gui(): GUI | null {\r\n return this._gui\r\n }\r\n\r\n /**\r\n * 获取 GUI DOM 元素\r\n */\r\n get domElement(): HTMLElement | null {\r\n return this._gui?.domElement ?? null\r\n }\r\n\r\n /**\r\n * 创建 GUI\r\n */\r\n private createGUI(): void {\r\n if (this.config.useProxy) {\r\n return\r\n }\r\n\r\n this._gui = new GUI({\r\n autoPlace: this.config.autoPlace,\r\n width: this.config.width\r\n })\r\n\r\n // 创建场景配置\r\n this.createSceneFolder()\r\n\r\n // 创建控制配置\r\n this.createControlFolder()\r\n\r\n // 创建 3D 物体配置\r\n this.createMeshFolder()\r\n\r\n // 创建动画配置\r\n this.createAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建场景配置文件夹\r\n */\r\n private createSceneFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.sceneFolder = this._gui.addFolder('场景配置')\r\n\r\n // 渲染器配置\r\n this.createRendererFolder()\r\n\r\n // 相机配置\r\n this.createCameraFolder()\r\n\r\n // 轨道控制配置\r\n this.createOrbitControlsFolder()\r\n\r\n // 环境配置\r\n this.createEnvironmentFolder()\r\n\r\n // 灯光配置\r\n this.createLightGroupFolder()\r\n\r\n // 后期处理配置\r\n this.createComposerFolder()\r\n\r\n if (!this.config.closed) {\r\n this.sceneFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建渲染器配置\r\n */\r\n private createRendererFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('渲染器配置')\r\n const renderer = this.renderer\r\n\r\n const params = {\r\n toneMapping: renderer.toneMapping,\r\n toneMappingExposure: renderer.toneMappingExposure,\r\n shadowMapEnabled: renderer.shadowMap.enabled,\r\n shadowMapType: renderer.shadowMap.type,\r\n pixelRatio: renderer.getPixelRatio(),\r\n outputColorSpace: renderer.outputColorSpace\r\n }\r\n\r\n folder.add(params, 'toneMapping', {\r\n '无': THREE.NoToneMapping,\r\n '线性': THREE.LinearToneMapping,\r\n 'Reinhard': THREE.ReinhardToneMapping,\r\n 'Cineon': THREE.CineonToneMapping,\r\n 'ACESFilmic': THREE.ACESFilmicToneMapping\r\n }).name('色调映射').onChange((v: number) => {\r\n renderer.toneMapping = v as THREE.ToneMapping\r\n })\r\n\r\n folder.add(params, 'toneMappingExposure', 0, 3, 0.1).name('曝光度').onChange((v: number) => {\r\n renderer.toneMappingExposure = v\r\n })\r\n\r\n folder.add(params, 'shadowMapEnabled').name('阴影').onChange((v: boolean) => {\r\n renderer.shadowMap.enabled = v\r\n })\r\n\r\n folder.add(params, 'pixelRatio', 0.5, 3, 0.1).name('像素比').onChange((v: number) => {\r\n renderer.setPixelRatio(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建相机配置\r\n */\r\n private createCameraFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('相机配置')\r\n const camera = this.camera\r\n\r\n folder.add(camera, 'fov', 10, 120, 1).name('视角').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'near', 0.01, 100, 0.01).name('近裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n folder.add(camera, 'far', 100, 100000, 100).name('远裁剪面').onChange(() => {\r\n camera.updateProjectionMatrix()\r\n })\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(camera.position, 'x', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'y', -1000, 1000, 1).listen()\r\n posFolder.add(camera.position, 'z', -1000, 1000, 1).listen()\r\n }\r\n\r\n /**\r\n * 创建轨道控制配置\r\n */\r\n private createOrbitControlsFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const orbitController = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitController?.controls) return\r\n\r\n const folder = this.sceneFolder.addFolder('轨道控制')\r\n const controls = orbitController.controls\r\n\r\n folder.add(controls, 'enableDamping').name('阻尼')\r\n folder.add(controls, 'dampingFactor', 0, 1, 0.01).name('阻尼系数')\r\n folder.add(controls, 'enableZoom').name('缩放')\r\n folder.add(controls, 'enableRotate').name('旋转')\r\n folder.add(controls, 'enablePan').name('平移')\r\n folder.add(controls, 'autoRotate').name('自动旋转')\r\n folder.add(controls, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度')\r\n folder.add(controls, 'minDistance', 0, 1000, 1).name('最小距离')\r\n folder.add(controls, 'maxDistance', 0, 10000, 10).name('最大距离')\r\n folder.add(controls, 'maxPolarAngle', 0, Math.PI, 0.01).name('最大极角')\r\n }\r\n\r\n /**\r\n * 创建环境配置\r\n */\r\n private createEnvironmentFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('环境配置')\r\n const scene = this.scene\r\n\r\n // 雾配置\r\n const fogFolder = folder.addFolder('雾配置')\r\n const fogParams = {\r\n enabled: !!scene.fog,\r\n color: scene.fog ? '#' + (scene.fog as THREE.Fog).color.getHexString() : '#cccccc',\r\n near: (scene.fog as THREE.Fog)?.near ?? 1,\r\n far: (scene.fog as THREE.Fog)?.far ?? 1000\r\n }\r\n\r\n fogFolder.add(fogParams, 'enabled').name('启用').onChange((v: boolean) => {\r\n if (v) {\r\n scene.fog = new THREE.Fog(fogParams.color, fogParams.near, fogParams.far)\r\n } else {\r\n scene.fog = null\r\n }\r\n })\r\n\r\n fogFolder.addColor(fogParams, 'color').name('颜色').onChange((v: string) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).color.set(v)\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'near', 0, 1000, 1).name('近距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).near = v\r\n }\r\n })\r\n\r\n fogFolder.add(fogParams, 'far', 0, 10000, 10).name('远距离').onChange((v: number) => {\r\n if (scene.fog) {\r\n (scene.fog as THREE.Fog).far = v\r\n }\r\n })\r\n\r\n // 背景配置\r\n const bgParams = {\r\n color: '#000000'\r\n }\r\n\r\n folder.addColor(bgParams, 'color').name('背景颜色').onChange((v: string) => {\r\n scene.background = new THREE.Color(v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光配置文件夹\r\n */\r\n private createLightGroupFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const folder = this.sceneFolder.addFolder('灯光配置')\r\n this.lightListFolder = folder.addFolder('灯光列表')\r\n\r\n folder.add(this.lightParams, 'lightType', lightTypeList).name('光源类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const light = this.createLight(this.lightParams.lightType)\r\n this.scene.add(light)\r\n this.addLightPanel(light)\r\n this.events.emit('light:add' as any, { light })\r\n }\r\n }, 'fn').name('添加光源')\r\n\r\n // 添加已有灯光\r\n this.scene.children.forEach(child => {\r\n if (child instanceof THREE.Light) {\r\n this.addLightPanel(child)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 创建灯光\r\n */\r\n private createLight(type: string): THREE.Light {\r\n switch (type) {\r\n case 'AmbientLight':\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n case 'DirectionalLight':\r\n const dirLight = new THREE.DirectionalLight(0xffffff, 1)\r\n dirLight.position.set(5, 10, 5)\r\n dirLight.castShadow = true\r\n return dirLight\r\n case 'PointLight':\r\n const pointLight = new THREE.PointLight(0xffffff, 1, 100)\r\n pointLight.position.set(0, 5, 0)\r\n return pointLight\r\n case 'SpotLight':\r\n const spotLight = new THREE.SpotLight(0xffffff, 1)\r\n spotLight.position.set(0, 10, 0)\r\n spotLight.castShadow = true\r\n return spotLight\r\n case 'HemisphereLight':\r\n return new THREE.HemisphereLight(0xffffff, 0x444444, 1)\r\n case 'RectAreaLight':\r\n const rectLight = new THREE.RectAreaLight(0xffffff, 1, 10, 10)\r\n rectLight.position.set(0, 5, 0)\r\n return rectLight\r\n default:\r\n return new THREE.AmbientLight(0xffffff, 0.5)\r\n }\r\n }\r\n\r\n /**\r\n * 添加灯光面板\r\n */\r\n private addLightPanel(light: THREE.Light): void {\r\n if (!this.lightListFolder) return\r\n\r\n const folder = this.lightListFolder.addFolder(light.type + light.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n // 颜色\r\n const colorParams = { color: '#' + light.color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n light.color.set(v)\r\n })\r\n\r\n // 强度\r\n folder.add(light, 'intensity', 0, 10, 0.1).name('强度')\r\n\r\n // 位置(非环境光)\r\n if (!(light instanceof THREE.AmbientLight) && !(light instanceof THREE.HemisphereLight)) {\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(light.position, 'x', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'y', -100, 100, 0.1).listen()\r\n posFolder.add(light.position, 'z', -100, 100, 0.1).listen()\r\n }\r\n\r\n // 阴影\r\n if ((light as any).castShadow !== undefined) {\r\n folder.add(light, 'castShadow').name('投射阴影')\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(light)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n light.parent?.remove(light)\r\n this.lightListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建后期处理配置\r\n */\r\n private createComposerFolder(): void {\r\n if (!this.sceneFolder) return\r\n\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n if (!composerPlugin) return\r\n\r\n const folder = this.sceneFolder.addFolder('后期处理')\r\n\r\n // 轮廓光\r\n const outlineFolder = folder.addFolder('轮廓光')\r\n const outlinePass = composerPlugin.outlinePass\r\n if (outlinePass) {\r\n outlineFolder.add(outlinePass, 'enabled').name('启用')\r\n outlineFolder.add(outlinePass, 'edgeStrength', 0, 10, 0.1).name('边缘强度')\r\n outlineFolder.add(outlinePass, 'edgeGlow', 0, 5, 0.1).name('边缘发光')\r\n outlineFolder.add(outlinePass, 'edgeThickness', 0, 5, 0.1).name('边缘厚度')\r\n outlineFolder.add(outlinePass, 'pulsePeriod', 0, 5, 0.1).name('脉冲周期')\r\n \r\n const colorParams = {\r\n visibleEdgeColor: '#' + outlinePass.visibleEdgeColor.getHexString(),\r\n hiddenEdgeColor: '#' + outlinePass.hiddenEdgeColor.getHexString()\r\n }\r\n outlineFolder.addColor(colorParams, 'visibleEdgeColor').name('可见边缘颜色').onChange((v: string) => {\r\n outlinePass.visibleEdgeColor.set(v)\r\n })\r\n outlineFolder.addColor(colorParams, 'hiddenEdgeColor').name('隐藏边缘颜色').onChange((v: string) => {\r\n outlinePass.hiddenEdgeColor.set(v)\r\n })\r\n }\r\n\r\n // 泛光\r\n const bloomFolder = folder.addFolder('泛光')\r\n const bloomPass = composerPlugin.bloomPass\r\n if (bloomPass) {\r\n bloomFolder.add(bloomPass, 'enabled').name('启用')\r\n bloomFolder.add(bloomPass, 'strength', 0, 3, 0.1).name('强度')\r\n bloomFolder.add(bloomPass, 'radius', 0, 1, 0.01).name('半径')\r\n bloomFolder.add(bloomPass, 'threshold', 0, 1, 0.01).name('阈值')\r\n }\r\n }\r\n\r\n /**\r\n * 创建控制配置文件夹\r\n */\r\n private createControlFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.controlFolder = this._gui.addFolder('控制配置')\r\n\r\n this.controlFolder.add(this.handlerParams, 'mode', ['选择', '根选择', '变换', '场景绘制', '点击信息'])\r\n .name('模式')\r\n .listen()\r\n .onChange((v: string) => {\r\n this.events.emit('mode:change' as any, { mode: v })\r\n })\r\n\r\n this.controlFolder.add(this.handlerParams, 'isTransformChildren').name('子变换').listen()\r\n this.controlFolder.add(this.handlerParams, 'openKey').name('开启按键').listen().onChange((v: boolean) => {\r\n this.events.emit('keyboard:toggle' as any, { enabled: v })\r\n })\r\n\r\n // 同步控制\r\n this.createSyncTransformFolder()\r\n\r\n // 性能监控\r\n this.createStatsFolder()\r\n\r\n // 辅助工具配置\r\n this.createHelpersFolder()\r\n\r\n // 变换控制器配置\r\n this.createTransformControlsFolder()\r\n\r\n if (!this.config.closed) {\r\n this.controlFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建同步控制文件夹\r\n */\r\n private createSyncTransformFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('同步控制')\r\n const params = {\r\n syncPosition: false,\r\n syncRotation: false,\r\n syncScale: false\r\n }\r\n\r\n folder.add(params, 'syncPosition').name('同步位置')\r\n folder.add(params, 'syncRotation').name('同步旋转')\r\n folder.add(params, 'syncScale').name('同步缩放')\r\n }\r\n\r\n /**\r\n * 创建性能监控文件夹\r\n */\r\n private createStatsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('性能监控')\r\n const params = {\r\n showStats: false,\r\n statsMode: 0\r\n }\r\n\r\n folder.add(params, 'showStats').name('显示性能').onChange((v: boolean) => {\r\n this.events.emit('stats:toggle' as any, { enabled: v })\r\n })\r\n\r\n folder.add(params, 'statsMode', { 'FPS': 0, 'MS': 1, 'MB': 2 }).name('模式').onChange((v: number) => {\r\n this.events.emit('stats:mode' as any, { mode: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建辅助工具配置\r\n */\r\n private createHelpersFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const folder = this.controlFolder.addFolder('辅助工具')\r\n\r\n const params = {\r\n showGrid: true,\r\n showAxes: true,\r\n gridSize: 100,\r\n gridDivisions: 100,\r\n axesSize: 5\r\n }\r\n\r\n folder.add(params, 'showGrid').name('显示网格').onChange((v: boolean) => {\r\n this.events.emit('helper:grid' as any, { enabled: v, size: params.gridSize, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridSize', 10, 500, 10).name('网格大小').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: v, divisions: params.gridDivisions })\r\n })\r\n\r\n folder.add(params, 'gridDivisions', 10, 200, 10).name('网格分割').onChange((v: number) => {\r\n this.events.emit('helper:grid' as any, { enabled: params.showGrid, size: params.gridSize, divisions: v })\r\n })\r\n\r\n folder.add(params, 'showAxes').name('显示坐标轴').onChange((v: boolean) => {\r\n this.events.emit('helper:axes' as any, { enabled: v, size: params.axesSize })\r\n })\r\n\r\n folder.add(params, 'axesSize', 1, 50, 1).name('坐标轴大小').onChange((v: number) => {\r\n this.events.emit('helper:axes' as any, { enabled: params.showAxes, size: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建变换控制器配置\r\n */\r\n private createTransformControlsFolder(): void {\r\n if (!this.controlFolder) return\r\n\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n if (!transformPlugin?.controls) return\r\n\r\n const folder = this.controlFolder.addFolder('变换控制器配置')\r\n const controls = transformPlugin.controls\r\n\r\n folder.add(controls, 'mode', ['translate', 'rotate', 'scale']).name('模式')\r\n folder.add(controls, 'space', ['world', 'local']).name('空间')\r\n folder.add(controls, 'size', 0.1, 5, 0.1).name('大小')\r\n folder.add(controls, 'showX').name('显示X轴')\r\n folder.add(controls, 'showY').name('显示Y轴')\r\n folder.add(controls, 'showZ').name('显示Z轴')\r\n \r\n // 使用代理对象来处理可能为 null 的 snap 值\r\n const snapParams = {\r\n translationSnap: controls.translationSnap ?? 0,\r\n rotationSnap: controls.rotationSnap ?? 0\r\n }\r\n \r\n folder.add(snapParams, 'translationSnap', 0, 10, 0.1).name('平移吸附').onChange((v: number) => {\r\n controls.setTranslationSnap(v === 0 ? null : v)\r\n })\r\n folder.add(snapParams, 'rotationSnap', 0, Math.PI / 4, 0.01).name('旋转吸附').onChange((v: number) => {\r\n controls.setRotationSnap(v === 0 ? null : v)\r\n })\r\n }\r\n\r\n /**\r\n * 创建 3D 物体配置文件夹\r\n */\r\n private createMeshFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.meshFolder = this._gui.addFolder('3D物体')\r\n\r\n // 模型配置\r\n this.createModelFolder()\r\n\r\n // 绘制配置\r\n this.createDrawFolder()\r\n\r\n // 内置物体\r\n this.createInnerMeshFolder()\r\n\r\n // 三维地图\r\n this.createGeoMapFolder()\r\n\r\n // 粒子物体\r\n this.createParticleFolder()\r\n\r\n // 边界物体\r\n this.createBorderGroupFolder()\r\n\r\n // 文本物体\r\n this.createTextMeshFolder()\r\n\r\n // 设计物体\r\n this.createDesignMeshFolder()\r\n\r\n if (!this.config.closed) {\r\n this.meshFolder.open()\r\n }\r\n }\r\n\r\n /**\r\n * 创建模型配置\r\n */\r\n private createModelFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('模型配置')\r\n this.modelListFolder = folder.addFolder('已有列表')\r\n\r\n const params = {\r\n dracoPath: '/draco/',\r\n loadGLTF: () => {\r\n this.openFileDialog('.glb,.gltf', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'GLTF' })\r\n })\r\n },\r\n loadFBX: () => {\r\n this.openFileDialog('.fbx', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'FBX' })\r\n })\r\n },\r\n loadOBJ: () => {\r\n this.openFileDialog('.obj', (file) => {\r\n this.events.emit('model:load' as any, { file, type: 'OBJ' })\r\n })\r\n }\r\n }\r\n\r\n folder.add(params, 'dracoPath').name('Draco路径')\r\n folder.add(params, 'loadGLTF').name('加载GLTF')\r\n folder.add(params, 'loadFBX').name('加载FBX')\r\n folder.add(params, 'loadOBJ').name('加载OBJ')\r\n }\r\n\r\n /**\r\n * 添加模型到列表面板\r\n */\r\n addModelPanel(model: THREE.Object3D): void {\r\n if (!this.modelListFolder) return\r\n\r\n const folder = this.modelListFolder.addFolder(model.name + model.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n const composerPlugin = this.pluginManager?.get('composer') as ComposerPlugin | undefined\r\n\r\n // 物体控制\r\n this.addMeshControlPanel(model, folder.addFolder('物体控制'))\r\n\r\n // 全局和子项控制\r\n this.addGroupGlobalPanel(model, folder.addFolder('全局和子项控制'))\r\n\r\n // 动画配置(如果有动画)\r\n if ((model as any).animations?.length > 0) {\r\n this.addGroupAnimationPanel(model, folder.addFolder('动画配置'))\r\n }\r\n\r\n // 选中\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n // 定位物体\r\n folder.add({\r\n fn: () => {\r\n if (orbitPlugin?.controls) {\r\n const box = new THREE.Box3().setFromObject(model)\r\n const center = box.getCenter(new THREE.Vector3())\r\n const size = box.getSize(new THREE.Vector3())\r\n const maxDim = Math.max(size.x, size.y, size.z)\r\n const distance = maxDim * 2\r\n\r\n orbitPlugin.controls.target.copy(center)\r\n this.camera.position.copy(center).add(new THREE.Vector3(distance, distance, distance))\r\n }\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(model)\r\n }\r\n if (composerPlugin) {\r\n composerPlugin.setOutlineObjects([model])\r\n }\r\n }\r\n }, 'fn').name('定位物体')\r\n\r\n // 删除\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n model.parent?.remove(model)\r\n this.modelListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加物体控制面板\r\n */\r\n private addMeshControlPanel(mesh: THREE.Object3D, folder: GUI): void {\r\n // 可见性\r\n folder.add(mesh, 'visible').name('可见')\r\n\r\n // 位置\r\n const posFolder = folder.addFolder('位置')\r\n posFolder.add(mesh.position, 'x', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'y', -1000, 1000, 0.1).listen()\r\n posFolder.add(mesh.position, 'z', -1000, 1000, 0.1).listen()\r\n\r\n // 旋转\r\n const rotFolder = folder.addFolder('旋转')\r\n rotFolder.add(mesh.rotation, 'x', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'y', -Math.PI, Math.PI, 0.01).listen()\r\n rotFolder.add(mesh.rotation, 'z', -Math.PI, Math.PI, 0.01).listen()\r\n\r\n // 缩放\r\n const scaleFolder = folder.addFolder('缩放')\r\n scaleFolder.add(mesh.scale, 'x', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'y', 0.01, 10, 0.01).listen()\r\n scaleFolder.add(mesh.scale, 'z', 0.01, 10, 0.01).listen()\r\n\r\n // 统一缩放\r\n const uniformScale = { scale: 1 }\r\n scaleFolder.add(uniformScale, 'scale', 0.01, 10, 0.01).name('统一缩放').onChange((v: number) => {\r\n mesh.scale.set(v, v, v)\r\n })\r\n\r\n // 阴影(如果是 Mesh)\r\n if ((mesh as THREE.Mesh).isMesh) {\r\n folder.add(mesh, 'castShadow').name('投射阴影')\r\n folder.add(mesh, 'receiveShadow').name('接收阴影')\r\n }\r\n }\r\n\r\n /**\r\n * 添加全局和子项控制面板\r\n */\r\n private addGroupGlobalPanel(group: THREE.Object3D, folder: GUI): void {\r\n const globalConfig = (group as any).globalConfig || {\r\n useGlobalConfig: false,\r\n isSaveChildren: true,\r\n isSaveMaterials: true,\r\n mesh: { castShadow: false, receiveShadow: false },\r\n material: { envMap: false, envMapIntensity: 1, reflectivity: 0.98 }\r\n }\r\n ;(group as any).globalConfig = globalConfig\r\n\r\n folder.add(globalConfig, 'useGlobalConfig').name('使用全局配置')\r\n folder.add(globalConfig, 'isSaveChildren').name('保存子项')\r\n folder.add(globalConfig, 'isSaveMaterials').name('保存材质')\r\n\r\n // 网格配置\r\n const meshFolder = folder.addFolder('网格配置')\r\n meshFolder.add(globalConfig.mesh, 'castShadow').name('投射阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.castShadow = v\r\n }\r\n })\r\n }\r\n })\r\n meshFolder.add(globalConfig.mesh, 'receiveShadow').name('接收阴影').onChange((v: boolean) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.receiveShadow = v\r\n }\r\n })\r\n }\r\n })\r\n\r\n // 材质配置\r\n const matFolder = folder.addFolder('材质配置')\r\n matFolder.add(globalConfig.material, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度').onChange((v: number) => {\r\n if (globalConfig.useGlobalConfig) {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const materials = Array.isArray((child as THREE.Mesh).material) \r\n ? (child as THREE.Mesh).material as THREE.Material[]\r\n : [(child as THREE.Mesh).material as THREE.Material]\r\n materials.forEach(mat => {\r\n if ((mat as any).envMapIntensity !== undefined) {\r\n (mat as any).envMapIntensity = v\r\n }\r\n })\r\n }\r\n })\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 添加组动画面板\r\n */\r\n private addGroupAnimationPanel(group: THREE.Object3D, folder: GUI): void {\r\n const animations = (group as any).animations as THREE.AnimationClip[]\r\n if (!animations || animations.length === 0) return\r\n\r\n const animParams = (group as any).animationPlayParams || {\r\n initPlay: false,\r\n speed: 0.5,\r\n actionIndexs: new Array(animations.length).fill(false),\r\n startTime: 0,\r\n loop: false\r\n }\r\n ;(group as any).animationPlayParams = animParams\r\n\r\n folder.add(animParams, 'initPlay').name('初始播放')\r\n folder.add(animParams, 'speed', 0, 2, 0.1).name('速度')\r\n folder.add(animParams, 'startTime', 0, 10, 0.1).name('开始时间')\r\n folder.add(animParams, 'loop').name('循环')\r\n\r\n // 动画列表\r\n const listFolder = folder.addFolder('动画列表')\r\n animations.forEach((clip, index) => {\r\n listFolder.add(animParams.actionIndexs, index.toString()).name(clip.name || `动画${index}`)\r\n })\r\n\r\n // 播放控制\r\n folder.add({\r\n play: () => {\r\n this.events.emit('animation:play' as any, { group, params: animParams })\r\n }\r\n }, 'play').name('播放')\r\n\r\n folder.add({\r\n stop: () => {\r\n this.events.emit('animation:stop' as any, { group })\r\n }\r\n }, 'stop').name('停止')\r\n }\r\n\r\n /**\r\n * 创建绘制配置\r\n */\r\n private createDrawFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('绘制配置')\r\n this.drawMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.drawParams, 'mode', drawModeList).name('绘制模式')\r\n folder.add(this.drawParams, 'pointMode', pointModeList).name('点模式')\r\n folder.add(this.drawParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('draw:start' as any, {\r\n mode: this.drawParams.mode,\r\n pointMode: this.drawParams.pointMode,\r\n materialType: this.drawParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加绘制组')\r\n }\r\n\r\n /**\r\n * 添加绘制物体到列表面板\r\n */\r\n addDrawMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.drawMeshListFolder) return\r\n\r\n const folder = this.drawMeshListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.drawMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建内置物体配置\r\n */\r\n private createInnerMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('内置物体')\r\n this.innerMeshListFolder = folder.addFolder('已有列表')\r\n\r\n folder.add(this.innerMeshParams, 'geometryType', geometryList).name('几何体')\r\n folder.add(this.innerMeshParams, 'materialType', materialList).name('材质')\r\n\r\n folder.add({\r\n fn: () => {\r\n const geometry = this.createGeometry(this.innerMeshParams.geometryType)\r\n const material = this.createMaterial(this.innerMeshParams.materialType)\r\n const mesh = new THREE.Mesh(geometry, material)\r\n ;(mesh as any).isInnerMesh = true\r\n ;(mesh as any).geometryType = this.innerMeshParams.geometryType\r\n ;(mesh as any).materialType = this.innerMeshParams.materialType\r\n \r\n this.scene.add(mesh)\r\n this.addInnerMeshPanel(mesh)\r\n \r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n \r\n this.events.emit('innermesh:add' as any, { mesh })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加内置物体到列表面板\r\n */\r\n addInnerMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.innerMeshListFolder) return\r\n\r\n const geoType = (mesh as any).geometryType || '立方体'\r\n const folder = this.innerMeshListFolder.addFolder(geoType + ':' + mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.innerMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 添加材质面板\r\n */\r\n private addMaterialPanel(material: THREE.Material, folder: GUI): void {\r\n if (!material) return\r\n\r\n // 颜色\r\n if ((material as any).color) {\r\n const colorParams = { color: '#' + (material as any).color.getHexString() }\r\n folder.addColor(colorParams, 'color').name('颜色').onChange((v: string) => {\r\n (material as any).color.set(v)\r\n })\r\n }\r\n\r\n // 发光颜色\r\n if ((material as any).emissive) {\r\n const emissiveParams = { emissive: '#' + (material as any).emissive.getHexString() }\r\n folder.addColor(emissiveParams, 'emissive').name('发光颜色').onChange((v: string) => {\r\n (material as any).emissive.set(v)\r\n })\r\n folder.add(material as any, 'emissiveIntensity', 0, 5, 0.1).name('发光强度')\r\n }\r\n\r\n // 透明度\r\n folder.add(material, 'transparent').name('透明')\r\n folder.add(material, 'opacity', 0, 1, 0.01).name('透明度')\r\n\r\n // 双面渲染\r\n folder.add(material, 'side', { '正面': THREE.FrontSide, '背面': THREE.BackSide, '双面': THREE.DoubleSide }).name('渲染面')\r\n\r\n // 线框\r\n if ((material as any).wireframe !== undefined) {\r\n folder.add(material as any, 'wireframe').name('线框')\r\n }\r\n\r\n // 金属度和粗糙度(标准材质)\r\n if ((material as any).metalness !== undefined) {\r\n folder.add(material as any, 'metalness', 0, 1, 0.01).name('金属度')\r\n }\r\n if ((material as any).roughness !== undefined) {\r\n folder.add(material as any, 'roughness', 0, 1, 0.01).name('粗糙度')\r\n }\r\n\r\n // 环境贴图强度\r\n if ((material as any).envMapIntensity !== undefined) {\r\n folder.add(material as any, 'envMapIntensity', 0, 5, 0.1).name('环境贴图强度')\r\n }\r\n }\r\n\r\n /**\r\n * 创建三维地图配置\r\n */\r\n private createGeoMapFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('三维地图')\r\n this.geoMapListFolder = folder.addFolder('地图列表')\r\n\r\n folder.add(this.geoMapParams, 'url').name('地图数据地址')\r\n folder.add(this.geoMapParams, 'materialType', materialList).name('地图材质类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n const url = this.geoMapParams.url || 'https://z2586300277.github.io/3d-file-server/files/json/guangdong.json'\r\n this.events.emit('geomap:load' as any, {\r\n url,\r\n materialType: this.geoMapParams.materialType\r\n })\r\n }\r\n }, 'fn').name('添加地图')\r\n }\r\n\r\n /**\r\n * 添加地图到列表面板\r\n */\r\n addGeoMapPanel(group: THREE.Object3D): void {\r\n if (!this.geoMapListFolder) return\r\n\r\n const folder = this.geoMapListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.geoMapListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建粒子物体配置\r\n */\r\n private createParticleFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('粒子物体')\r\n this.particleListFolder = folder.addFolder('粒子列表')\r\n\r\n const initFolder = folder.addFolder('初始化参数')\r\n initFolder.add(this.particleParams, 'particlesSum').name('数量')\r\n initFolder.add(this.particleParams, 'inner').name('内半径')\r\n initFolder.add(this.particleParams, 'outer').name('外半径')\r\n initFolder.add(this.particleParams, 'maxVelocity').name('最大速度')\r\n initFolder.add(this.particleParams, 'mapUrl').name('贴图路径')\r\n initFolder.add(this.particleParams, 'shaderCodeName', ['水波纹', '火焰', '烟雾', '雪花', '星空']).name('着色器')\r\n initFolder.add(this.particleParams, 'sportType', ['全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下']).name('运动方式')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('particle:create' as any, { ...this.particleParams })\r\n }\r\n }, 'fn').name('增加一个粒子物体')\r\n }\r\n\r\n /**\r\n * 添加粒子到列表面板\r\n */\r\n addParticlePanel(mesh: THREE.Object3D): void {\r\n if (!this.particleListFolder) return\r\n\r\n const folder = this.particleListFolder.addFolder(mesh.name + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.particleListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建边界物体配置\r\n */\r\n private createBorderGroupFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('边界物体')\r\n this.borderGroupListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.borderGroupParams, 'url').name('边界物体数据源')\r\n folder.add(this.borderGroupParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.borderGroupParams, 'dlength', 0).name('低于点数舍弃')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('bordergroup:create' as any, { ...this.borderGroupParams })\r\n }\r\n }, 'fn').name('添加边界物体')\r\n }\r\n\r\n /**\r\n * 添加边界物体到列表面板\r\n */\r\n addBorderGroupPanel(group: THREE.Object3D): void {\r\n if (!this.borderGroupListFolder) return\r\n\r\n const folder = this.borderGroupListFolder.addFolder(group.name + group.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(group, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(group)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n group.parent?.remove(group)\r\n this.borderGroupListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建文本物体配置\r\n */\r\n private createTextMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('文本物体')\r\n this.textMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.textMeshParams, 'fontLink').name('字体链接')\r\n folder.add(this.textMeshParams, 'materialType', materialList).name('材质类型')\r\n folder.add(this.textMeshParams, 'text').name('文本内容')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (!this.textMeshParams.text) return\r\n this.events.emit('textmesh:create' as any, { ...this.textMeshParams })\r\n }\r\n }, 'fn').name('添加文本物体')\r\n }\r\n\r\n /**\r\n * 添加文本物体到列表面板\r\n */\r\n addTextMeshPanel(mesh: THREE.Mesh): void {\r\n if (!this.textMeshListFolder) return\r\n\r\n const text = (mesh as any).text || mesh.name\r\n const folder = this.textMeshListFolder.addFolder(text + mesh.id)\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n this.addMaterialPanel(mesh.material as THREE.Material, folder.addFolder('材质配置'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.textMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建设计物体配置\r\n */\r\n private createDesignMeshFolder(): void {\r\n if (!this.meshFolder) return\r\n\r\n const folder = this.meshFolder.addFolder('设计物体')\r\n this.designMeshListFolder = folder.addFolder('列表')\r\n\r\n folder.add(this.designMeshParams, 'type', ['镜面', '水面', '玻璃', '发光体']).name('类型')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('designmesh:create' as any, { type: this.designMeshParams.type })\r\n }\r\n }, 'fn').name('添加')\r\n }\r\n\r\n /**\r\n * 添加设计物体到列表面板\r\n */\r\n addDesignMeshPanel(mesh: THREE.Object3D): void {\r\n if (!this.designMeshListFolder) return\r\n\r\n const folder = this.designMeshListFolder.addFolder(mesh.id + (mesh.name || ''))\r\n const transformPlugin = this.pluginManager?.get('transform-controller') as TransformControllerPlugin | undefined\r\n\r\n this.addMeshControlPanel(mesh, folder.addFolder('物体控制'))\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.attach(mesh)\r\n }\r\n }\r\n }, 'fn').name('选中')\r\n\r\n folder.add({\r\n fn: () => {\r\n if (transformPlugin?.controls) {\r\n transformPlugin.controls.detach()\r\n }\r\n mesh.parent?.remove(mesh)\r\n this.designMeshListFolder?.removeFolder(folder)\r\n }\r\n }, 'fn').name('删除')\r\n }\r\n\r\n /**\r\n * 创建动画配置文件夹\r\n */\r\n private createAnimationFolder(): void {\r\n if (!this._gui) return\r\n\r\n this.animationFolder = this._gui.addFolder('动画配置')\r\n\r\n // 视角控制\r\n this.createOrbitAnimationFolder()\r\n\r\n // 物体动画\r\n this.createMeshAnimationFolder()\r\n\r\n // 运动动画\r\n this.createMoveAnimationFolder()\r\n }\r\n\r\n /**\r\n * 创建视角控制动画\r\n */\r\n private createOrbitAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('视角控制')\r\n const orbitPlugin = this.pluginManager?.get('orbit-controller') as OrbitControllerPlugin | undefined\r\n\r\n if (!orbitPlugin?.controls) return\r\n\r\n const controls = orbitPlugin.controls\r\n const params = {\r\n autoRotate: controls.autoRotate,\r\n autoRotateSpeed: controls.autoRotateSpeed,\r\n enableDamping: controls.enableDamping,\r\n dampingFactor: controls.dampingFactor\r\n }\r\n\r\n folder.add(params, 'autoRotate').name('自动旋转').onChange((v: boolean) => {\r\n controls.autoRotate = v\r\n })\r\n\r\n folder.add(params, 'autoRotateSpeed', 0, 10, 0.1).name('旋转速度').onChange((v: number) => {\r\n controls.autoRotateSpeed = v\r\n })\r\n\r\n // 视角预设\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'front' })\r\n }\r\n }, 'fn').name('正视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'top' })\r\n }\r\n }, 'fn').name('俯视图')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('camera:preset' as any, { preset: 'side' })\r\n }\r\n }, 'fn').name('侧视图')\r\n }\r\n\r\n /**\r\n * 创建物体动画配置\r\n */\r\n private createMeshAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('物体动画')\r\n\r\n const params = {\r\n duration: 2,\r\n ease: 'power2.inOut',\r\n repeat: 0,\r\n yoyo: false\r\n }\r\n\r\n folder.add(params, 'duration', 0.1, 10, 0.1).name('持续时间')\r\n folder.add(params, 'ease', ['none', 'power1.in', 'power1.out', 'power1.inOut', 'power2.in', 'power2.out', 'power2.inOut', 'elastic.out', 'bounce.out']).name('缓动函数')\r\n folder.add(params, 'repeat', -1, 10, 1).name('重复次数')\r\n folder.add(params, 'yoyo').name('往返')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'start', params })\r\n }\r\n }, 'fn').name('记录起始')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:record' as any, { type: 'end', params })\r\n }\r\n }, 'fn').name('记录结束')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('animation:play' as any, { params })\r\n }\r\n }, 'fn').name('播放动画')\r\n }\r\n\r\n /**\r\n * 创建运动动画配置\r\n */\r\n private createMoveAnimationFolder(): void {\r\n if (!this.animationFolder) return\r\n\r\n const folder = this.animationFolder.addFolder('运动动画')\r\n\r\n const params = {\r\n speed: 1,\r\n loop: false\r\n }\r\n\r\n folder.add(params, 'speed', 0.1, 10, 0.1).name('速度')\r\n folder.add(params, 'loop').name('循环')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'start', params })\r\n }\r\n }, 'fn').name('开始运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'pause', params })\r\n }\r\n }, 'fn').name('暂停运动')\r\n\r\n folder.add({\r\n fn: () => {\r\n this.events.emit('curve:animate' as any, { action: 'stop', params })\r\n }\r\n }, 'fn').name('停止运动')\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择子物体\r\n */\r\n createSelectMeshPanel(model: THREE.Object3D): void {\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('#:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 材质配置\r\n if ((model as THREE.Mesh).isMesh) {\r\n const mesh = model as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, this.selectPanel!.addFolder('材质配置' + index))\r\n })\r\n } else {\r\n this.addMaterialPanel(mesh.material, this.selectPanel.addFolder('材质配置'))\r\n }\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n // 设计配置\r\n this.addDesignPanel(model, this.selectPanel.addFolder('设计配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 创建选择面板 - 选择根物体\r\n */\r\n createSelectRootGroupPanel(model: THREE.Object3D): void {\r\n if (!(model as any).RootMaterials) {\r\n this.createSelectMeshPanel(model)\r\n return\r\n }\r\n\r\n this.destroySelectPanel()\r\n\r\n if (!this._gui) return\r\n\r\n this.selectPanel = this._gui.addFolder('$:' + model.name + '配置')\r\n\r\n // 基础配置\r\n this.addMeshControlPanel(model, this.selectPanel.addFolder('基础配置'))\r\n\r\n // 遍历材质配置\r\n const rootMaterials = (model as any).RootMaterials as THREE.Material[]\r\n if (rootMaterials && rootMaterials.length > 0) {\r\n const matFolder = this.selectPanel.addFolder('遍历材质配置')\r\n rootMaterials.forEach((mat, index) => {\r\n this.addMaterialPanel(mat, matFolder.addFolder('材质' + index))\r\n })\r\n }\r\n\r\n // 着色器配置\r\n this.addShaderPanel(model, this.selectPanel.addFolder('着色器配置'))\r\n\r\n this.selectPanel.open()\r\n }\r\n\r\n /**\r\n * 销毁选择面板\r\n */\r\n destroySelectPanel(): void {\r\n if (this.selectPanel && this._gui) {\r\n this._gui.removeFolder(this.selectPanel)\r\n this.selectPanel = null\r\n }\r\n }\r\n\r\n /**\r\n * 添加着色器面板\r\n */\r\n private addShaderPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n shaderType: '无',\r\n intensity: 1\r\n }\r\n\r\n folder.add(params, 'shaderType', ['无', '发光', '扫描', '流动', '渐变']).name('着色器类型').onChange((v: string) => {\r\n this.events.emit('shader:apply' as any, { model, type: v, intensity: params.intensity })\r\n })\r\n\r\n folder.add(params, 'intensity', 0, 5, 0.1).name('强度').onChange((v: number) => {\r\n this.events.emit('shader:update' as any, { model, intensity: v })\r\n })\r\n }\r\n\r\n /**\r\n * 添加设计面板\r\n */\r\n private addDesignPanel(model: THREE.Object3D, folder: GUI): void {\r\n const params = {\r\n reflector: false,\r\n refractor: false\r\n }\r\n\r\n folder.add(params, 'reflector').name('镜面反射').onChange((v: boolean) => {\r\n this.events.emit('design:reflector' as any, { model, enabled: v })\r\n })\r\n\r\n folder.add(params, 'refractor').name('折射').onChange((v: boolean) => {\r\n this.events.emit('design:refractor' as any, { model, enabled: v })\r\n })\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n private createGeometry(type: string): THREE.BufferGeometry {\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n case '球体':\r\n return new THREE.SphereGeometry(0.5, 32, 32)\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(0.5, 0.5, 1, 32)\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(0.5, 1, 32)\r\n case '圆环':\r\n return new THREE.TorusGeometry(0.5, 0.2, 16, 100)\r\n case '平面':\r\n return new THREE.PlaneGeometry(1, 1)\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(0.5, 0.15, 100, 16)\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(0.5)\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(0.5)\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(0.5)\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(0.5)\r\n default:\r\n return new THREE.BoxGeometry(1, 1, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n private createMaterial(type: string): THREE.Material {\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({ color: 0xffffff })\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({ color: 0xffffff })\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({ color: 0xffffff })\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({ color: 0xffffff, metalness: 0.5, roughness: 0.5 })\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({ color: 0xffffff })\r\n default:\r\n return new THREE.MeshStandardMaterial({ color: 0xffffff })\r\n }\r\n }\r\n\r\n /**\r\n * 打开文件对话框\r\n */\r\n private openFileDialog(accept: string, callback: (file: File) => void): void {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = accept\r\n input.onchange = (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n callback(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n /**\r\n * 添加自定义文件夹\r\n */\r\n addFolder(name: string): GUI | null {\r\n return this._gui?.addFolder(name) ?? null\r\n }\r\n\r\n /**\r\n * 设置 GUI DOM 位置\r\n */\r\n setPosition(container: HTMLElement): void {\r\n if (this._gui && this._gui.domElement) {\r\n container.appendChild(this._gui.domElement)\r\n }\r\n }\r\n\r\n /**\r\n * 更新显示\r\n */\r\n updateDisplay(): void {\r\n // dat.gui 没有全局 updateDisplay,需要遍历所有控制器\r\n }\r\n\r\n /**\r\n * 显示 GUI\r\n */\r\n show(): void {\r\n if (this._gui) {\r\n this._gui.show()\r\n }\r\n }\r\n\r\n /**\r\n * 隐藏 GUI\r\n */\r\n hide(): void {\r\n if (this._gui) {\r\n this._gui.hide()\r\n }\r\n }\r\n\r\n /**\r\n * 销毁 GUI\r\n */\r\n destroy(): void {\r\n if (this._gui) {\r\n this._gui.destroy()\r\n this._gui = null\r\n }\r\n this.sceneFolder = null\r\n this.controlFolder = null\r\n this.meshFolder = null\r\n this.animationFolder = null\r\n this.selectPanel = null\r\n this.modelListFolder = null\r\n this.innerMeshListFolder = null\r\n this.drawMeshListFolder = null\r\n this.geoMapListFolder = null\r\n this.particleListFolder = null\r\n this.borderGroupListFolder = null\r\n this.textMeshListFolder = null\r\n this.designMeshListFolder = null\r\n this.lightListFolder = null\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GUIPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置模式\r\n */\r\n setMode(mode: string): void {\r\n this.handlerParams.mode = mode\r\n }\r\n\r\n /**\r\n * 获取当前模式\r\n */\r\n getMode(): string {\r\n return this.handlerParams.mode\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport Stats from 'three/examples/jsm/libs/stats.module.js'\r\nimport { ViewHelper } from 'three/examples/jsm/helpers/ViewHelper.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 辅助工具配置\r\n */\r\nexport interface GizmoPluginConfig {\r\n // 网格配置\r\n grid: {\r\n enabled: boolean\r\n size: number\r\n divisions: number\r\n colorCenterLine: number\r\n colorGrid: number\r\n }\r\n // 坐标轴配置\r\n axes: {\r\n enabled: boolean\r\n size: number\r\n }\r\n // 性能监控配置\r\n stats: {\r\n enabled: boolean\r\n mode: 0 | 1 | 2\r\n }\r\n // 视图助手配置\r\n viewHelper: {\r\n enabled: boolean\r\n size: number\r\n position: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'\r\n }\r\n // Box3 辅助配置\r\n box3Helper: {\r\n enabled: boolean\r\n color: number\r\n }\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_GIZMO_CONFIG: GizmoPluginConfig = {\r\n grid: {\r\n enabled: true,\r\n size: 100,\r\n divisions: 100,\r\n colorCenterLine: 0x444444,\r\n colorGrid: 0x888888\r\n },\r\n axes: {\r\n enabled: true,\r\n size: 5\r\n },\r\n stats: {\r\n enabled: false,\r\n mode: 0\r\n },\r\n viewHelper: {\r\n enabled: false,\r\n size: 128,\r\n position: 'bottom-right'\r\n },\r\n box3Helper: {\r\n enabled: false,\r\n color: 0xffff00\r\n }\r\n}\r\n\r\n/**\r\n * 辅助工具插件\r\n * 提供网格、坐标轴、性能监控、视图助手等辅助功能\r\n */\r\nexport class GizmoPlugin extends Plugin<GizmoPluginConfig> {\r\n readonly name = 'gizmo'\r\n\r\n /** 网格辅助 */\r\n private gridHelper: THREE.GridHelper | null = null\r\n\r\n /** 坐标轴辅助 */\r\n private axesHelper: THREE.AxesHelper | null = null\r\n\r\n /** 性能监控 */\r\n private stats: Stats | null = null\r\n\r\n /** 视图助手 */\r\n private viewHelper: ViewHelper | null = null\r\n\r\n /** Box3 辅助 */\r\n private box3Helper: THREE.Box3Helper | null = null\r\n\r\n /** 当前选中物体的 Box3 */\r\n private currentBox3: THREE.Box3 | null = null\r\n\r\n constructor(config?: Partial<GizmoPluginConfig>) {\r\n super({ ...DEFAULT_GIZMO_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 初始化各辅助工具\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n if (this.config.stats.enabled) {\r\n this.createStats()\r\n }\r\n if (this.config.viewHelper.enabled) {\r\n this.createViewHelper()\r\n }\r\n\r\n // 监听选择事件,更新 Box3\r\n this.subscribe('object:selected', (data) => {\r\n if (data.object) {\r\n this.onObjectSelected(data.object)\r\n }\r\n })\r\n this.subscribe('object:deselected', () => this.onObjectDeselected())\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.removeGridHelper()\r\n this.removeAxesHelper()\r\n this.removeStats()\r\n this.removeViewHelper()\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 创建网格辅助\r\n */\r\n createGridHelper(): THREE.GridHelper {\r\n this.removeGridHelper()\r\n\r\n const { size, divisions, colorCenterLine, colorGrid } = this.config.grid\r\n this.gridHelper = new THREE.GridHelper(size, divisions, colorCenterLine, colorGrid)\r\n this.gridHelper.name = '__gridHelper__'\r\n this.scene.add(this.gridHelper)\r\n\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 移除网格辅助\r\n */\r\n removeGridHelper(): void {\r\n if (this.gridHelper) {\r\n this.scene.remove(this.gridHelper)\r\n this.gridHelper.dispose()\r\n this.gridHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置网格可见性\r\n */\r\n setGridVisible(visible: boolean): void {\r\n if (visible && !this.gridHelper) {\r\n this.createGridHelper()\r\n } else if (!visible && this.gridHelper) {\r\n this.removeGridHelper()\r\n }\r\n this.config.grid.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新网格配置\r\n */\r\n updateGrid(config: Partial<GizmoPluginConfig['grid']>): void {\r\n Object.assign(this.config.grid, config)\r\n if (this.config.grid.enabled) {\r\n this.createGridHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建坐标轴辅助\r\n */\r\n createAxesHelper(): THREE.AxesHelper {\r\n this.removeAxesHelper()\r\n\r\n this.axesHelper = new THREE.AxesHelper(this.config.axes.size)\r\n this.axesHelper.name = '__axesHelper__'\r\n this.scene.add(this.axesHelper)\r\n\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 移除坐标轴辅助\r\n */\r\n removeAxesHelper(): void {\r\n if (this.axesHelper) {\r\n this.scene.remove(this.axesHelper)\r\n this.axesHelper.dispose()\r\n this.axesHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置坐标轴可见性\r\n */\r\n setAxesVisible(visible: boolean): void {\r\n if (visible && !this.axesHelper) {\r\n this.createAxesHelper()\r\n } else if (!visible && this.axesHelper) {\r\n this.removeAxesHelper()\r\n }\r\n this.config.axes.enabled = visible\r\n }\r\n\r\n /**\r\n * 更新坐标轴配置\r\n */\r\n updateAxes(config: Partial<GizmoPluginConfig['axes']>): void {\r\n Object.assign(this.config.axes, config)\r\n if (this.config.axes.enabled) {\r\n this.createAxesHelper()\r\n }\r\n }\r\n\r\n /**\r\n * 创建性能监控\r\n */\r\n createStats(): Stats {\r\n this.removeStats()\r\n\r\n this.stats = new Stats()\r\n this.stats.showPanel(this.config.stats.mode)\r\n this.stats.dom.style.position = 'absolute'\r\n this.stats.dom.style.top = '0'\r\n this.stats.dom.style.left = '0'\r\n\r\n this.renderer.domElement.parentElement?.appendChild(this.stats.dom)\r\n\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 移除性能监控\r\n */\r\n removeStats(): void {\r\n if (this.stats) {\r\n this.stats.dom.parentElement?.removeChild(this.stats.dom)\r\n this.stats = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置性能监控可见性\r\n */\r\n setStatsVisible(visible: boolean): void {\r\n if (visible && !this.stats) {\r\n this.createStats()\r\n } else if (!visible && this.stats) {\r\n this.removeStats()\r\n }\r\n this.config.stats.enabled = visible\r\n }\r\n\r\n /**\r\n * 设置性能监控模式\r\n */\r\n setStatsMode(mode: 0 | 1 | 2): void {\r\n this.config.stats.mode = mode\r\n if (this.stats) {\r\n this.stats.showPanel(mode)\r\n }\r\n }\r\n\r\n /**\r\n * 更新性能监控\r\n */\r\n updateStats(): void {\r\n if (this.stats) {\r\n this.stats.update()\r\n }\r\n }\r\n\r\n /**\r\n * 创建视图助手\r\n * Note: ViewHelper API varies between Three.js versions\r\n */\r\n createViewHelper(): ViewHelper | null {\r\n this.removeViewHelper()\r\n\r\n try {\r\n // ViewHelper requires a DOM element in newer versions\r\n const container = this.renderer.domElement.parentElement\r\n if (!container) return null\r\n\r\n this.viewHelper = new ViewHelper(this.camera, container as HTMLElement)\r\n return this.viewHelper\r\n } catch (e) {\r\n console.warn('ViewHelper creation failed:', e)\r\n return null\r\n }\r\n }\r\n\r\n /**\r\n * 移除视图助手\r\n */\r\n removeViewHelper(): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.dispose()\r\n this.viewHelper = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置视图助手可见性\r\n */\r\n setViewHelperVisible(visible: boolean): void {\r\n if (visible && !this.viewHelper) {\r\n this.createViewHelper()\r\n } else if (!visible && this.viewHelper) {\r\n this.removeViewHelper()\r\n }\r\n this.config.viewHelper.enabled = visible\r\n }\r\n\r\n /**\r\n * 渲染视图助手\r\n */\r\n renderViewHelper(delta: number): void {\r\n if (this.viewHelper) {\r\n this.viewHelper.render(this.renderer)\r\n if (this.viewHelper.animating) {\r\n this.viewHelper.update(delta)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 创建 Box3 辅助\r\n */\r\n createBox3Helper(object: THREE.Object3D): THREE.Box3Helper {\r\n this.removeBox3Helper()\r\n\r\n this.currentBox3 = new THREE.Box3().setFromObject(object)\r\n this.box3Helper = new THREE.Box3Helper(this.currentBox3, new THREE.Color(this.config.box3Helper.color))\r\n this.box3Helper.name = '__box3Helper__'\r\n this.scene.add(this.box3Helper)\r\n\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 更新 Box3 辅助\r\n */\r\n updateBox3Helper(object: THREE.Object3D): void {\r\n if (this.currentBox3 && this.box3Helper) {\r\n this.currentBox3.setFromObject(object)\r\n }\r\n }\r\n\r\n /**\r\n * 移除 Box3 辅助\r\n */\r\n removeBox3Helper(): void {\r\n if (this.box3Helper) {\r\n this.scene.remove(this.box3Helper)\r\n this.box3Helper.dispose()\r\n this.box3Helper = null\r\n this.currentBox3 = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置 Box3 辅助可见性\r\n */\r\n setBox3HelperVisible(visible: boolean): void {\r\n this.config.box3Helper.enabled = visible\r\n if (!visible) {\r\n this.removeBox3Helper()\r\n }\r\n }\r\n\r\n /**\r\n * 物体选中事件处理\r\n */\r\n private onObjectSelected(object: THREE.Object3D): void {\r\n if (this.config.box3Helper.enabled) {\r\n this.createBox3Helper(object)\r\n }\r\n }\r\n\r\n /**\r\n * 物体取消选中事件处理\r\n */\r\n private onObjectDeselected(): void {\r\n this.removeBox3Helper()\r\n }\r\n\r\n /**\r\n * 获取网格辅助\r\n */\r\n getGridHelper(): THREE.GridHelper | null {\r\n return this.gridHelper\r\n }\r\n\r\n /**\r\n * 获取坐标轴辅助\r\n */\r\n getAxesHelper(): THREE.AxesHelper | null {\r\n return this.axesHelper\r\n }\r\n\r\n /**\r\n * 获取性能监控\r\n */\r\n getStats(): Stats | null {\r\n return this.stats\r\n }\r\n\r\n /**\r\n * 获取视图助手\r\n */\r\n getViewHelper(): ViewHelper | null {\r\n return this.viewHelper\r\n }\r\n\r\n /**\r\n * 获取 Box3 辅助\r\n */\r\n getBox3Helper(): THREE.Box3Helper | null {\r\n return this.box3Helper\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): GizmoPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\n\r\n/**\r\n * 获取两点之间指定比例的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param scale 比例 (0-1)\r\n * @returns 比例点\r\n */\r\nexport function getDistanceScalePoint(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n scale: number = 0.9\r\n): THREE.Vector3 {\r\n const distance = point1.distanceTo(point2)\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance * scale).add(point1)\r\n}\r\n\r\n/**\r\n * 获取两点之间指定距离的点\r\n * @param point1 起点\r\n * @param point2 终点\r\n * @param distance 距离\r\n * @returns 距离点\r\n */\r\nexport function getPointAtDistance(\r\n point1: THREE.Vector3,\r\n point2: THREE.Vector3,\r\n distance: number\r\n): THREE.Vector3 {\r\n const direction = new THREE.Vector3().subVectors(point2, point1).normalize()\r\n return direction.multiplyScalar(distance).add(point1)\r\n}\r\n\r\n/**\r\n * 角度转弧度\r\n */\r\nexport function degToRad(degrees: number): number {\r\n return degrees * (Math.PI / 180)\r\n}\r\n\r\n/**\r\n * 弧度转角度\r\n */\r\nexport function radToDeg(radians: number): number {\r\n return radians * (180 / Math.PI)\r\n}\r\n\r\n/**\r\n * 限制值在范围内\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.max(min, Math.min(max, value))\r\n}\r\n\r\n/**\r\n * 线性插值\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * t\r\n}\r\n\r\n/**\r\n * 平滑插值\r\n */\r\nexport function smoothstep(edge0: number, edge1: number, x: number): number {\r\n const t = clamp((x - edge0) / (edge1 - edge0), 0, 1)\r\n return t * t * (3 - 2 * t)\r\n}\r\n","import * as THREE from 'three'\r\nimport type { Box3Info, ViewAngle } from '../types/core.types'\r\nimport { getPointAtDistance } from './math'\r\n\r\n/**\r\n * 获取物体的包围盒信息\r\n * @param object 物体\r\n * @returns 包围盒信息\r\n */\r\nexport function getObjectBox3(object: THREE.Object3D): Box3Info {\r\n const box = new THREE.Box3().setFromObject(object)\r\n const { max, min } = box\r\n\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n const radius = new THREE.Vector3().subVectors(max, min).length() / 2\r\n\r\n return { max, min, center, radius }\r\n}\r\n\r\n/**\r\n * 获取物体的最佳观察视角\r\n * @param object 物体\r\n * @param scale 视角缩放比例\r\n * @returns 视角信息\r\n */\r\nexport function getBestViewTarget(object: THREE.Object3D, scale: number = 2.5): ViewAngle {\r\n const { center, max } = getObjectBox3(object)\r\n const distance = new THREE.Vector3().subVectors(max, center).length() * scale\r\n const position = getPointAtDistance(center, max, distance)\r\n\r\n return { position, target: center }\r\n}\r\n\r\n/**\r\n * 获取物体的六个视图位置\r\n * @param object 物体\r\n * @param fov 相机视野角度\r\n * @returns 六个视图位置\r\n */\r\nexport function getObjectViews(object: THREE.Object3D, fov: number = 50) {\r\n const { center, max, min, radius } = getObjectBox3(object)\r\n\r\n // 计算相机距离\r\n const distance = radius / Math.tan((fov * Math.PI) / 360)\r\n\r\n return {\r\n frontView: new THREE.Vector3(center.x, center.y, max.z + distance),\r\n backView: new THREE.Vector3(center.x, center.y, min.z - distance),\r\n leftView: new THREE.Vector3(min.x - distance, center.y, center.z),\r\n rightView: new THREE.Vector3(max.x + distance, center.y, center.z),\r\n topView: new THREE.Vector3(center.x, max.y + distance, center.z),\r\n bottomView: new THREE.Vector3(center.x, min.y - distance, center.z),\r\n target: center\r\n }\r\n}\r\n\r\n/**\r\n * 创建包围盒辅助器\r\n * @param color 颜色\r\n * @returns Box3Helper\r\n */\r\nexport function createBox3Helper(color: number = 0xffff00): THREE.Box3Helper {\r\n const box = new THREE.Box3()\r\n const helper = new THREE.Box3Helper(box, color)\r\n helper.name = 'Box3Helper'\r\n helper.visible = false\r\n return helper\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ShaderPluginConfig } from '../../types/config.types'\r\n\r\n/**\r\n * 着色器 Uniform 定义\r\n */\r\nexport interface ShaderUniform {\r\n type: string\r\n value: any\r\n unit: string\r\n}\r\n\r\n/**\r\n * 着色器预设\r\n */\r\nexport interface ShaderPreset {\r\n name: string\r\n uniforms: Record<string, ShaderUniform>\r\n vertexHeader?: string\r\n fragHeader: string\r\n fragFunc?: string\r\n fragBody: string\r\n animate?: (uniforms: Record<string, ShaderUniform>, delta: number) => void\r\n}\r\n\r\n/**\r\n * 着色器控制器\r\n */\r\nexport interface ShaderController {\r\n uniforms: Record<string, ShaderUniform>\r\n update: () => void\r\n destroy: () => void\r\n}\r\n\r\n/**\r\n * 默认着色器配置\r\n */\r\nexport const DEFAULT_SHADER_CONFIG: ShaderPluginConfig = {\r\n speed: 0.01,\r\n mixRatio: 0.5\r\n}\r\n\r\n/**\r\n * 着色器插件\r\n * 提供着色器混合和预设管理功能\r\n */\r\nexport class ShaderPlugin extends Plugin<ShaderPluginConfig> {\r\n readonly name = 'shader'\r\n\r\n /** 预设着色器库 */\r\n private presets = new Map<string, ShaderPreset>()\r\n\r\n /** 已应用着色器的物体 */\r\n private appliedObjects = new Map<THREE.Object3D, ShaderController>()\r\n\r\n /** 着色器动画列表 */\r\n private shaderAnimations: Array<{ object: THREE.Object3D; controller: ShaderController }> = []\r\n\r\n constructor(config?: Partial<ShaderPluginConfig>) {\r\n super({ ...DEFAULT_SHADER_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 注册内置预设\r\n this.registerBuiltinPresets()\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 移除所有着色器\r\n for (const [object] of this.appliedObjects) {\r\n this.remove(object)\r\n }\r\n this.presets.clear()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新着色器动画\r\n for (const { controller } of this.shaderAnimations) {\r\n controller.update()\r\n }\r\n }\r\n\r\n /**\r\n * 注册内置预设着色器\r\n */\r\n private registerBuiltinPresets(): void {\r\n // 彩虹光\r\n this.registerPreset('彩虹光', {\r\n name: '彩虹光',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec3 rainbow = vec3(\r\n sin(vUv.x * 10.0 + iTime) * 0.5 + 0.5,\r\n sin(vUv.y * 10.0 + iTime + 2.094) * 0.5 + 0.5,\r\n sin((vUv.x + vUv.y) * 5.0 + iTime + 4.188) * 0.5 + 0.5\r\n );\r\n vec4 diffuseColor = vec4(mix(diffuse, rainbow, mixRatio), opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.5\r\n }\r\n })\r\n\r\n // 水波纹\r\n this.registerPreset('水波纹', {\r\n name: '水波纹',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float wave = sin(length(vUv - 0.5) * 20.0 - iTime * 3.0) * 0.5 + 0.5;\r\n vec3 waterColor = mix(diffuse, vec3(0.0, 0.5, 1.0), wave * mixRatio);\r\n vec4 diffuseColor = vec4(waterColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 光圈扫射\r\n this.registerPreset('光圈扫射', {\r\n name: '光圈扫射',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n },\r\n fragHeader: this.getUniformDeclarations({\r\n ...this.getCommonUniforms(),\r\n circleWidth: { type: 'number', value: 0.1, unit: 'float' },\r\n isDisCard: { type: 'bool', value: false, unit: 'bool' }\r\n }),\r\n fragBody: `\r\n float dist = length(vUv - 0.5);\r\n float circle = smoothstep(iTime - circleWidth, iTime, dist) - smoothstep(iTime, iTime + circleWidth, dist);\r\n vec3 scanColor = mix(diffuse, mixColor, circle * intensity);\r\n vec4 diffuseColor = vec4(scanColor, opacity);\r\n if (isDisCard && circle < 0.01) discard;\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.3\r\n if (uniforms.iTime.value > 1.0) uniforms.iTime.value = 0.0\r\n }\r\n })\r\n\r\n // 流光围栏\r\n this.registerPreset('流光围栏', {\r\n name: '流光围栏',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float flow = fract(vUv.y - iTime * speed * 10.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * (1.0 - flow * 0.5));\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光围栏2\r\n this.registerPreset('流光围栏2', {\r\n name: '流光围栏2',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gradient = 1.0 - vUv.y;\r\n float flow = fract(vUv.y * 2.0 - iTime * speed * 5.0);\r\n vec3 fenceColor = mix(diffuse, mixColor, flow * gradient * intensity);\r\n vec4 diffuseColor = vec4(fenceColor, opacity * gradient);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 雪片着色\r\n this.registerPreset('雪片着色', {\r\n name: '雪片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float snow = fract(sin(dot(vUv, vec2(12.9898, 78.233)) + iTime) * 43758.5453);\r\n vec3 snowColor = mix(diffuse, vec3(1.0), snow * mixRatio * 0.3);\r\n vec4 diffuseColor = vec4(snowColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta * 0.1\r\n }\r\n })\r\n\r\n // 光线叠加\r\n this.registerPreset('光线叠加', {\r\n name: '光线叠加',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float glow = pow(1.0 - length(vUv - 0.5) * 2.0, 2.0);\r\n vec3 glowColor = diffuse + mixColor * glow * intensity;\r\n vec4 diffuseColor = vec4(glowColor, opacity);\r\n `\r\n })\r\n\r\n // 绚烂线条\r\n this.registerPreset('绚烂线条', {\r\n name: '绚烂线条',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float line = abs(sin(vUv.x * 50.0 + iTime * 2.0)) * abs(sin(vUv.y * 50.0 + iTime * 2.0));\r\n vec3 lineColor = mix(diffuse, mixColor, line * intensity);\r\n vec4 diffuseColor = vec4(lineColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光闪电\r\n this.registerPreset('流光闪电', {\r\n name: '流光闪电',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float lightning = pow(fract(sin(vUv.x * 100.0 + iTime * 10.0) * 43758.5453), 10.0);\r\n vec3 lightningColor = mix(diffuse, vec3(0.8, 0.9, 1.0), lightning * intensity);\r\n vec4 diffuseColor = vec4(lightningColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 火焰燃烧\r\n this.registerPreset('火焰燃烧', {\r\n name: '火焰燃烧',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float noise = fract(sin(dot(vUv + iTime * 0.1, vec2(12.9898, 78.233))) * 43758.5453);\r\n float fire = pow(1.0 - vUv.y, 2.0) * noise;\r\n vec3 fireColor = mix(vec3(1.0, 0.3, 0.0), vec3(1.0, 0.8, 0.0), fire);\r\n vec3 finalColor = mix(diffuse, fireColor, fire * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 流光栅格\r\n this.registerPreset('流光栅格', {\r\n name: '流光栅格',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n float gridX = step(0.9, fract(vUv.x * 10.0));\r\n float gridY = step(0.9, fract(vUv.y * 10.0));\r\n float grid = max(gridX, gridY);\r\n float flow = fract(vUv.x + vUv.y - iTime * speed * 2.0);\r\n vec3 gridColor = mix(diffuse, mixColor, grid * flow * intensity);\r\n vec4 diffuseColor = vec4(gridColor, opacity);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 着色天空\r\n this.registerPreset('着色天空', {\r\n name: '着色天空',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n topColor: { type: 'color', value: new THREE.Color(0x0077ff), unit: 'vec3' },\r\n bottomColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n offset: { type: 'number', value: 0.0, unit: 'float' },\r\n exponent: { type: 'number', value: 0.6, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 topColor;\r\n uniform vec3 bottomColor;\r\n uniform float offset;\r\n uniform float exponent;\r\n varying vec3 vWorldPosition;\r\n `,\r\n vertexHeader: `\r\n varying vec3 vWorldPosition;\r\n void main() {\r\n vec4 worldPosition = modelMatrix * vec4(position, 1.0);\r\n vWorldPosition = worldPosition.xyz;\r\n `,\r\n fragBody: `\r\n float h = normalize(vWorldPosition + offset).y;\r\n vec3 skyColor = mix(bottomColor, topColor, max(pow(max(h, 0.0), exponent), 0.0));\r\n vec4 diffuseColor = vec4(skyColor, opacity);\r\n `\r\n })\r\n\r\n // 水面着色\r\n this.registerPreset('水面着色', {\r\n name: '水面着色',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n waterColor: { type: 'color', value: new THREE.Color(0x001e0f), unit: 'vec3' },\r\n waveHeight: { type: 'number', value: 0.1, unit: 'float' },\r\n waveSpeed: { type: 'number', value: 1.0, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 waterColor;\r\n uniform float waveHeight;\r\n uniform float waveSpeed;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float wave1 = sin(vUv.x * 10.0 + iTime * waveSpeed) * waveHeight;\r\n float wave2 = sin(vUv.y * 8.0 + iTime * waveSpeed * 0.8) * waveHeight;\r\n float wave = (wave1 + wave2) * 0.5 + 0.5;\r\n vec3 finalColor = mix(waterColor, mixColor, wave * intensity);\r\n vec4 diffuseColor = vec4(finalColor, opacity * 0.8);\r\n `,\r\n animate: (uniforms, delta) => {\r\n uniforms.iTime.value += delta\r\n }\r\n })\r\n\r\n // 热力图\r\n this.registerPreset('热力图', {\r\n name: '热力图',\r\n uniforms: {\r\n ...this.getCommonUniforms(),\r\n Points: { type: 'array', value: [], unit: 'vec3' },\r\n PointsCount: { type: 'number', value: 0, unit: 'int' },\r\n radius: { type: 'number', value: 0.3, unit: 'float' }\r\n },\r\n fragHeader: `\r\n uniform vec3 Points[100];\r\n uniform int PointsCount;\r\n uniform float radius;\r\n ${this.getUniformDeclarations(this.getCommonUniforms())}\r\n `,\r\n fragBody: `\r\n float heat = 0.0;\r\n for (int i = 0; i < 100; i++) {\r\n if (i >= PointsCount) break;\r\n float dist = distance(vec2(vUv.x, vUv.y), Points[i].xy);\r\n heat += Points[i].z * smoothstep(radius, 0.0, dist);\r\n }\r\n heat = clamp(heat, 0.0, 1.0);\r\n vec3 heatColor = mix(vec3(0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), heat);\r\n heatColor = mix(heatColor, vec3(1.0, 1.0, 0.0), smoothstep(0.5, 1.0, heat));\r\n vec4 diffuseColor = vec4(mix(diffuse, heatColor, heat * intensity), opacity);\r\n `\r\n })\r\n\r\n // 晶片着色\r\n this.registerPreset('晶片着色', {\r\n name: '晶片着色',\r\n uniforms: this.getCommonUniforms(),\r\n fragHeader: this.getUniformDeclarations(this.getCommonUniforms()),\r\n fragBody: `\r\n vec2 cell = floor(vUv * 20.0);\r\n float noise = fract(sin(dot(cell, vec2(12.9898, 78.233))) * 43758.5453);\r\n vec3 crystalColor = mix(diffuse, mixColor, noise * intensity);\r\n vec4 diffuseColor = vec4(crystalColor, opacity);\r\n `\r\n })\r\n }\r\n\r\n /**\r\n * 获取公共 Uniforms\r\n */\r\n private getCommonUniforms(): Record<string, ShaderUniform> {\r\n return {\r\n iTime: { type: 'number', value: 0.0, unit: 'float' },\r\n speed: { type: 'number', value: this.config.speed, unit: 'float' },\r\n intensity: { type: 'number', value: 1.0, unit: 'float' },\r\n mixRatio: { type: 'number', value: this.config.mixRatio, unit: 'float' },\r\n mixColor: { type: 'color', value: new THREE.Color(0xffffff), unit: 'vec3' },\r\n hasUv: { type: 'bool', value: true, unit: 'bool' }\r\n }\r\n }\r\n\r\n /**\r\n * 获取 Uniform 声明\r\n */\r\n private getUniformDeclarations(uniforms: Record<string, ShaderUniform>): string {\r\n return Object.entries(uniforms)\r\n .map(([name, uniform]) => `uniform ${uniform.unit} ${name};`)\r\n .join('\\n')\r\n }\r\n\r\n /**\r\n * 注册预设着色器\r\n */\r\n registerPreset(name: string, preset: ShaderPreset): void {\r\n this.presets.set(name, preset)\r\n }\r\n\r\n /**\r\n * 获取预设着色器\r\n */\r\n getPreset(name: string): ShaderPreset | undefined {\r\n return this.presets.get(name)\r\n }\r\n\r\n /**\r\n * 获取所有预设名称\r\n */\r\n getPresetNames(): string[] {\r\n return Array.from(this.presets.keys())\r\n }\r\n\r\n /**\r\n * 应用着色器到物体\r\n */\r\n apply(object: THREE.Object3D, presetName: string): ShaderController | null {\r\n const preset = this.presets.get(presetName)\r\n if (!preset) {\r\n console.warn(`Shader preset \"${presetName}\" not found`)\r\n return null\r\n }\r\n\r\n // 克隆 uniforms\r\n const uniforms: Record<string, ShaderUniform> = {}\r\n for (const [key, value] of Object.entries(preset.uniforms)) {\r\n uniforms[key] = {\r\n ...value,\r\n value: value.value instanceof THREE.Color\r\n ? value.value.clone()\r\n : value.value\r\n }\r\n }\r\n\r\n // 获取材质列表\r\n const materials = this.getMaterials(object)\r\n if (materials.length === 0) return null\r\n\r\n // 应用着色器到材质\r\n materials.forEach(material => {\r\n this.applyShaderToMaterial(material, uniforms, preset)\r\n })\r\n\r\n // 创建控制器\r\n const controller: ShaderController = {\r\n uniforms,\r\n update: () => {\r\n if (preset.animate) {\r\n preset.animate(uniforms, 0.016) // 约 60fps\r\n }\r\n },\r\n destroy: () => {\r\n this.remove(object)\r\n }\r\n }\r\n\r\n // 保存引用\r\n this.appliedObjects.set(object, controller)\r\n\r\n // 如果有动画,添加到动画列表\r\n if (preset.animate) {\r\n this.shaderAnimations.push({ object, controller })\r\n }\r\n\r\n // 发射事件\r\n this.events.emit('shader:applied', { object, shaderName: presetName })\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 应用着色器到材质\r\n */\r\n private applyShaderToMaterial(\r\n material: THREE.Material,\r\n uniforms: Record<string, ShaderUniform>,\r\n preset: ShaderPreset\r\n ): void {\r\n material.dispose()\r\n\r\n material.onBeforeCompile = (shader) => {\r\n // 写入 uniforms\r\n for (const [key, uniform] of Object.entries(uniforms)) {\r\n shader.uniforms[key] = { value: uniform.value }\r\n }\r\n\r\n // 顶点着色器注入\r\n if (preset.vertexHeader) {\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n preset.vertexHeader\r\n )\r\n }\r\n\r\n // 添加 varying vUv\r\n if (!shader.vertexShader.includes('varying vec2 vUv')) {\r\n shader.vertexShader = 'varying vec2 vUv;\\n' + shader.vertexShader\r\n shader.vertexShader = shader.vertexShader.replace(\r\n 'void main() {',\r\n 'void main() {\\nvUv = uv;'\r\n )\r\n }\r\n\r\n // 片段着色器头部注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n '#include <common>',\r\n `varying vec2 vUv;\\n${preset.fragHeader}\\n#include <common>\\n${preset.fragFunc || ''}`\r\n )\r\n\r\n // 片段着色器主体注入\r\n shader.fragmentShader = shader.fragmentShader.replace(\r\n 'vec4 diffuseColor = vec4( diffuse, opacity );',\r\n preset.fragBody\r\n )\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 移除物体的着色器\r\n */\r\n remove(object: THREE.Object3D): void {\r\n const controller = this.appliedObjects.get(object)\r\n if (!controller) return\r\n\r\n // 重置材质\r\n const materials = this.getMaterials(object)\r\n materials.forEach(material => {\r\n material.onBeforeCompile = () => {}\r\n material.dispose()\r\n material.needsUpdate = true\r\n })\r\n\r\n // 从动画列表移除\r\n const animIndex = this.shaderAnimations.findIndex(a => a.object === object)\r\n if (animIndex > -1) {\r\n this.shaderAnimations.splice(animIndex, 1)\r\n }\r\n\r\n // 移除引用\r\n this.appliedObjects.delete(object)\r\n\r\n // 发射事件\r\n this.events.emit('shader:removed', { object })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n private getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport gsap from 'gsap'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GsapQuery } from '../../types/core.types'\r\nimport type { AnimationPlayParams, CurveAnimationController, ExtendedObject3D, ViewAngle } from '../../types/core.types'\r\n\r\n/**\r\n * 动画插件配置\r\n */\r\nexport interface AnimationPluginConfig {\r\n defaultDuration: number\r\n defaultEase: string\r\n}\r\n\r\n/**\r\n * 混合器信息\r\n */\r\nexport interface MixerInfo {\r\n mixer: THREE.AnimationMixer\r\n object: THREE.Object3D\r\n actions: THREE.AnimationAction[]\r\n clock: THREE.Clock\r\n}\r\n\r\n/**\r\n * 补间动画控制器\r\n */\r\nexport interface TweenController {\r\n play: () => void\r\n pause: () => void\r\n resume: () => void\r\n kill: () => void\r\n progress: (value?: number) => number\r\n}\r\n\r\n/**\r\n * 默认动画配置\r\n */\r\nexport const DEFAULT_ANIMATION_CONFIG: AnimationPluginConfig = {\r\n defaultDuration: 2,\r\n defaultEase: 'power2.inOut'\r\n}\r\n\r\n/**\r\n * 动画插件\r\n * 提供模型动画、补间动画、路径动画等功能\r\n */\r\nexport class AnimationPlugin extends Plugin<AnimationPluginConfig> {\r\n readonly name = 'animation'\r\n\r\n /** 混合器列表 */\r\n private mixers: MixerInfo[] = []\r\n\r\n /** 曲线动画列表 */\r\n private curveAnimations: CurveAnimationController[] = []\r\n\r\n /** 补间动画列表 */\r\n private tweens: gsap.core.Tween[] = []\r\n\r\n constructor(config?: Partial<AnimationPluginConfig>) {\r\n super({ ...DEFAULT_ANIMATION_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n // 停止所有动画\r\n this.stopAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新混合器\r\n for (const info of this.mixers) {\r\n info.mixer.update(info.clock.getDelta())\r\n }\r\n\r\n // 更新曲线动画\r\n for (const anim of this.curveAnimations) {\r\n if (anim.pause) continue\r\n\r\n anim.time += anim.speed / 1000\r\n\r\n if (anim.time > 1 || anim.time < 0) {\r\n anim.time = anim.time > 1 ? 1 : 0\r\n anim.pause = true\r\n anim.frameEndCallback?.()\r\n continue\r\n }\r\n\r\n const point = anim.curve.getPointAt(anim.time)\r\n anim.frameCallback?.(point)\r\n }\r\n }\r\n\r\n // ============ 模型动画 ============\r\n\r\n /**\r\n * 播放模型动画\r\n */\r\n playModelAnimation(\r\n object: ExtendedObject3D,\r\n params?: Partial<AnimationPlayParams>\r\n ): MixerInfo | null {\r\n const obj = object as THREE.Object3D\r\n const animations = (object as any).animations as THREE.AnimationClip[] | undefined\r\n \r\n if (!animations || animations.length === 0) {\r\n console.warn('Object has no animations')\r\n return null\r\n }\r\n\r\n const defaultParams: AnimationPlayParams = {\r\n initPlay: true,\r\n speed: 1,\r\n actionIndexs: animations.map(() => true),\r\n startTime: 0,\r\n loop: true\r\n }\r\n\r\n const playParams = { ...defaultParams, ...params, ...(object as any).animationPlayParams }\r\n\r\n const clock = new THREE.Clock()\r\n const mixer = new THREE.AnimationMixer(obj)\r\n\r\n const actions = animations\r\n .filter((_, index) => playParams.actionIndexs[index])\r\n .map(clip => {\r\n const action = mixer.clipAction(clip)\r\n action.loop = playParams.loop ? THREE.LoopRepeat : THREE.LoopOnce\r\n action.time = playParams.startTime\r\n action.timeScale = playParams.speed\r\n action.clampWhenFinished = true\r\n if (playParams.initPlay) {\r\n action.play()\r\n }\r\n return action\r\n })\r\n\r\n const info: MixerInfo = { mixer, object: obj, actions, clock }\r\n this.mixers.push(info)\r\n\r\n // 保存到物体\r\n ;(object as any).animationPlayParams = playParams\r\n\r\n this.events.emit('animation:start', { object: obj })\r\n\r\n return info\r\n }\r\n\r\n /**\r\n * 停止模型动画\r\n */\r\n stopModelAnimation(object: THREE.Object3D): void {\r\n const index = this.mixers.findIndex(m => m.object === object)\r\n if (index > -1) {\r\n const info = this.mixers[index]\r\n info.actions.forEach(action => action.stop())\r\n this.mixers.splice(index, 1)\r\n this.events.emit('animation:stop', { object })\r\n }\r\n }\r\n\r\n /**\r\n * 暂停/恢复模型动画\r\n */\r\n toggleModelAnimation(object: THREE.Object3D, paused: boolean): void {\r\n const info = this.mixers.find(m => m.object === object)\r\n if (info) {\r\n info.actions.forEach(action => {\r\n action.paused = paused\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 获取模型的混合器信息\r\n */\r\n getMixerInfo(object: THREE.Object3D): MixerInfo | undefined {\r\n return this.mixers.find(m => m.object === object)\r\n }\r\n\r\n // ============ 补间动画 ============\r\n\r\n /**\r\n * 创建补间动画\r\n */\r\n tween(\r\n target: object,\r\n to: object,\r\n query?: GsapQuery\r\n ): TweenController {\r\n const tween = gsap.to(target, {\r\n ...to,\r\n duration: query?.duration ?? this.config.defaultDuration,\r\n ease: query?.ease ?? this.config.defaultEase,\r\n repeat: query?.repeat ?? 0,\r\n yoyo: query?.yoyo ?? false,\r\n yoyoEase: query?.yoyoEase ?? true,\r\n onUpdate: query?.onUpdate,\r\n onComplete: () => {\r\n query?.onComplete?.()\r\n // 从列表移除\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n }\r\n })\r\n\r\n this.tweens.push(tween)\r\n\r\n return {\r\n play: () => tween.play(),\r\n pause: () => tween.pause(),\r\n resume: () => tween.resume(),\r\n kill: () => {\r\n tween.kill()\r\n const index = this.tweens.indexOf(tween)\r\n if (index > -1) this.tweens.splice(index, 1)\r\n },\r\n progress: (value?: number) => {\r\n if (value !== undefined) {\r\n tween.progress(value)\r\n }\r\n return tween.progress()\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 相机视角动画\r\n */\r\n animateCamera(\r\n camera: THREE.Camera,\r\n controls: { target: THREE.Vector3 },\r\n viewAngle: ViewAngle,\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n return Promise.all([\r\n new Promise<void>(resolve => {\r\n this.tween(camera.position, viewAngle.position, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }),\r\n new Promise<void>(resolve => {\r\n this.tween(controls.target, viewAngle.target, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n })\r\n ]).then(() => {})\r\n }\r\n\r\n /**\r\n * 物体变换动画\r\n */\r\n animateTransform(\r\n object: THREE.Object3D,\r\n transform: {\r\n position?: { x?: number; y?: number; z?: number }\r\n rotation?: { x?: number; y?: number; z?: number }\r\n scale?: { x?: number; y?: number; z?: number }\r\n },\r\n query?: GsapQuery\r\n ): Promise<void> {\r\n const promises: Promise<void>[] = []\r\n\r\n if (transform.position) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.position, transform.position!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.rotation) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.rotation, transform.rotation!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n if (transform.scale) {\r\n promises.push(new Promise(resolve => {\r\n this.tween(object.scale, transform.scale!, {\r\n ...query,\r\n onComplete: resolve\r\n })\r\n }))\r\n }\r\n\r\n return Promise.all(promises).then(() => {})\r\n }\r\n\r\n // ============ 曲线动画 ============\r\n\r\n /**\r\n * 创建曲线动画\r\n */\r\n createCurveAnimation(\r\n curve: THREE.Curve<THREE.Vector3>,\r\n speed: number = 1\r\n ): CurveAnimationController {\r\n const controller: CurveAnimationController = {\r\n id: Date.now(),\r\n curve,\r\n time: 0,\r\n pause: true,\r\n speed,\r\n frameCallback: null,\r\n frameEndCallback: null,\r\n start: () => {\r\n if (!this.curveAnimations.includes(controller)) {\r\n this.curveAnimations.push(controller)\r\n }\r\n controller.pause = false\r\n },\r\n destroy: () => {\r\n const index = this.curveAnimations.indexOf(controller)\r\n if (index > -1) {\r\n this.curveAnimations.splice(index, 1)\r\n }\r\n }\r\n }\r\n\r\n return controller\r\n }\r\n\r\n /**\r\n * 物体沿曲线运动\r\n */\r\n animateAlongCurve(\r\n object: THREE.Object3D,\r\n curve: THREE.Curve<THREE.Vector3>,\r\n options?: {\r\n speed?: number\r\n lookAhead?: boolean\r\n onComplete?: () => void\r\n }\r\n ): CurveAnimationController {\r\n const controller = this.createCurveAnimation(curve, options?.speed ?? 1)\r\n\r\n controller.frameCallback = (point) => {\r\n object.position.copy(point)\r\n\r\n // 朝向前方\r\n if (options?.lookAhead) {\r\n const nextT = Math.min(controller.time + 0.01, 1)\r\n const nextPoint = curve.getPointAt(nextT)\r\n object.lookAt(nextPoint)\r\n }\r\n }\r\n\r\n controller.frameEndCallback = options?.onComplete ?? null\r\n\r\n return controller\r\n }\r\n\r\n // ============ 工具方法 ============\r\n\r\n /**\r\n * 停止所有动画\r\n */\r\n stopAll(): void {\r\n // 停止模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => action.stop())\r\n }\r\n this.mixers = []\r\n\r\n // 停止曲线动画\r\n this.curveAnimations = []\r\n\r\n // 停止补间动画\r\n for (const tween of this.tweens) {\r\n tween.kill()\r\n }\r\n this.tweens = []\r\n }\r\n\r\n /**\r\n * 暂停所有动画\r\n */\r\n pauseAll(): void {\r\n // 暂停模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = true\r\n })\r\n }\r\n\r\n // 暂停曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = true\r\n }\r\n\r\n // 暂停补间动画\r\n for (const tween of this.tweens) {\r\n tween.pause()\r\n }\r\n }\r\n\r\n /**\r\n * 恢复所有动画\r\n */\r\n resumeAll(): void {\r\n // 恢复模型动画\r\n for (const info of this.mixers) {\r\n info.actions.forEach(action => {\r\n action.paused = false\r\n })\r\n }\r\n\r\n // 恢复曲线动画\r\n for (const anim of this.curveAnimations) {\r\n anim.pause = false\r\n }\r\n\r\n // 恢复补间动画\r\n for (const tween of this.tweens) {\r\n tween.resume()\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { DrawMode, PointMode, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 绘制插件配置\r\n */\r\nexport interface DrawingPluginConfig {\r\n defaultMode: DrawMode\r\n defaultPointMode: PointMode\r\n defaultMaterialType: string\r\n fenceHeight: number\r\n lineWidth: number\r\n}\r\n\r\n/**\r\n * 绘制结果\r\n */\r\nexport interface DrawResult {\r\n mesh: THREE.Object3D\r\n points: THREE.Vector3[]\r\n mode: DrawMode\r\n}\r\n\r\n/**\r\n * 默认绘制配置\r\n */\r\nexport const DEFAULT_DRAWING_CONFIG: DrawingPluginConfig = {\r\n defaultMode: '围栏物体',\r\n defaultPointMode: '场景交点',\r\n defaultMaterialType: '标准材质',\r\n fenceHeight: 5,\r\n lineWidth: 0.01\r\n}\r\n\r\n/**\r\n * 绘制插件\r\n * 提供场景绘制功能(围栏、平面、曲线、直线)\r\n */\r\nexport class DrawingPlugin extends Plugin<DrawingPluginConfig> {\r\n readonly name = 'drawing'\r\n\r\n /** 当前绘制模式 */\r\n private _mode: DrawMode\r\n\r\n /** 当前点位模式 */\r\n private _pointMode: PointMode\r\n\r\n /** 当前绘制的点列表 */\r\n private currentPoints: THREE.Vector3[] = []\r\n\r\n /** 预览网格 */\r\n private previewMesh: THREE.Object3D | null = null\r\n\r\n /** 是否正在绘制 */\r\n private _isDrawing = false\r\n\r\n /** 已绘制的物体列表 */\r\n private drawnObjects: DrawResult[] = []\r\n\r\n constructor(config?: Partial<DrawingPluginConfig>) {\r\n super({ ...DEFAULT_DRAWING_CONFIG, ...config })\r\n this._mode = this.config.defaultMode\r\n this._pointMode = this.config.defaultPointMode\r\n }\r\n\r\n /**\r\n * 获取当前绘制模式\r\n */\r\n get mode(): DrawMode {\r\n return this._mode\r\n }\r\n\r\n /**\r\n * 获取当前点位模式\r\n */\r\n get pointMode(): PointMode {\r\n return this._pointMode\r\n }\r\n\r\n /**\r\n * 是否正在绘制\r\n */\r\n get isDrawing(): boolean {\r\n return this._isDrawing\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.cancel()\r\n // 清理预览网格\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n }\r\n\r\n /**\r\n * 设置绘制模式\r\n */\r\n setMode(mode: DrawMode): void {\r\n this._mode = mode\r\n }\r\n\r\n /**\r\n * 设置点位模式\r\n */\r\n setPointMode(mode: PointMode): void {\r\n this._pointMode = mode\r\n }\r\n\r\n /**\r\n * 开始绘制\r\n */\r\n start(): void {\r\n this._isDrawing = true\r\n this.currentPoints = []\r\n this.events.emit('draw:start', { mode: this._mode })\r\n }\r\n\r\n /**\r\n * 添加点\r\n */\r\n addPoint(point: THREE.Vector3): void {\r\n if (!this._isDrawing) {\r\n this.start()\r\n }\r\n\r\n this.currentPoints.push(point.clone())\r\n this.events.emit('draw:point', { point })\r\n\r\n // 更新预览\r\n this.updatePreview()\r\n }\r\n\r\n /**\r\n * 处理场景点击\r\n */\r\n handleSceneClick(point: THREE.Vector3, object?: ExtendedObject3D): void {\r\n let targetPoint = point\r\n\r\n // 根据点位模式处理\r\n if (this._pointMode === '地图区域中心' && object?.geoInfo?.properties?.centroidCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const centroid = object.geoInfo.properties.centroidCoord3.clone()\r\n centroid.add(object.position)\r\n if (object.initTranslate) {\r\n centroid.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(centroid)\r\n }\r\n } else if (this._pointMode === '地图行政中心' && object?.geoInfo?.properties?.centerCoord3) {\r\n const parent = object.parent as ExtendedObject3D\r\n if (parent?.getTransformedVector) {\r\n const center = object.geoInfo.properties.centerCoord3.clone()\r\n center.add(object.position)\r\n if (object.initTranslate) {\r\n center.sub(object.initTranslate)\r\n }\r\n targetPoint = parent.getTransformedVector(center)\r\n }\r\n }\r\n\r\n this.addPoint(targetPoint)\r\n }\r\n\r\n /**\r\n * 完成绘制\r\n */\r\n complete(): DrawResult | null {\r\n if (this.currentPoints.length < 2) {\r\n console.warn('Need at least 2 points to complete drawing')\r\n return null\r\n }\r\n\r\n let mesh: THREE.Object3D\r\n\r\n switch (this._mode) {\r\n case '围栏物体':\r\n mesh = this.createFence(this.currentPoints)\r\n break\r\n case '平面绘制':\r\n mesh = this.createPlane(this.currentPoints)\r\n break\r\n case '曲线路径':\r\n mesh = this.createCurve(this.currentPoints)\r\n break\r\n case '直线路径':\r\n mesh = this.createLine(this.currentPoints)\r\n break\r\n default:\r\n return null\r\n }\r\n\r\n // 标记为绘制物体\r\n (mesh as ExtendedObject3D).isDrawMesh = true\r\n\r\n // 添加到场景\r\n this.scene.add(mesh)\r\n\r\n // 清理预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n const result: DrawResult = {\r\n mesh,\r\n points: [...this.currentPoints],\r\n mode: this._mode\r\n }\r\n\r\n this.drawnObjects.push(result)\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n this.events.emit('draw:complete', { mesh })\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 取消绘制\r\n */\r\n cancel(): void {\r\n this._isDrawing = false\r\n this.currentPoints = []\r\n\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n this.previewMesh = null\r\n }\r\n\r\n this.events.emit('draw:cancel', undefined)\r\n }\r\n\r\n /**\r\n * 撤销最后一个点\r\n */\r\n undoPoint(): void {\r\n if (this.currentPoints.length > 0) {\r\n this.currentPoints.pop()\r\n this.updatePreview()\r\n }\r\n }\r\n\r\n /**\r\n * 更新预览\r\n */\r\n private updatePreview(): void {\r\n if (this.currentPoints.length < 2) return\r\n\r\n // 移除旧预览\r\n if (this.previewMesh) {\r\n this.scene.remove(this.previewMesh)\r\n }\r\n\r\n // 创建新预览\r\n switch (this._mode) {\r\n case '围栏物体':\r\n this.previewMesh = this.createFence(this.currentPoints, true)\r\n break\r\n case '平面绘制':\r\n this.previewMesh = this.createPlane(this.currentPoints, true)\r\n break\r\n case '曲线路径':\r\n this.previewMesh = this.createCurve(this.currentPoints, true)\r\n break\r\n case '直线路径':\r\n this.previewMesh = this.createLine(this.currentPoints, true)\r\n break\r\n }\r\n\r\n if (this.previewMesh) {\r\n this.scene.add(this.previewMesh)\r\n }\r\n }\r\n\r\n /**\r\n * 创建围栏\r\n */\r\n private createFence(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n const height = this.config.fenceHeight\r\n const vertices: number[] = []\r\n const indices: number[] = []\r\n const uvs: number[] = []\r\n\r\n // 生成顶点\r\n for (let i = 0; i < points.length; i++) {\r\n const p = points[i]\r\n // 底部点\r\n vertices.push(p.x, p.y, p.z)\r\n // 顶部点\r\n vertices.push(p.x, p.y + height, p.z)\r\n\r\n // UV\r\n const u = i / (points.length - 1)\r\n uvs.push(u, 0)\r\n uvs.push(u, 1)\r\n }\r\n\r\n // 生成索引\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const base = i * 2\r\n // 两个三角形组成一个面\r\n indices.push(base, base + 1, base + 2)\r\n indices.push(base + 1, base + 3, base + 2)\r\n }\r\n\r\n const geometry = new THREE.BufferGeometry()\r\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3))\r\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2))\r\n geometry.setIndex(indices)\r\n geometry.computeVertexNormals()\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Fence'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建平面\r\n */\r\n private createPlane(points: THREE.Vector3[], isPreview = false): THREE.Mesh {\r\n if (points.length < 3) {\r\n // 不足3点,创建简单线条\r\n return this.createLine(points, isPreview) as THREE.Mesh\r\n }\r\n\r\n // 使用 Shape 创建平面\r\n const shape = new THREE.Shape()\r\n shape.moveTo(points[0].x, points[0].z)\r\n for (let i = 1; i < points.length; i++) {\r\n shape.lineTo(points[i].x, points[i].z)\r\n }\r\n shape.closePath()\r\n\r\n const geometry = new THREE.ShapeGeometry(shape)\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n // 设置 Y 位置\r\n const avgY = points.reduce((sum, p) => sum + p.y, 0) / points.length\r\n geometry.translate(0, avgY, 0)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: isPreview ? 0x00ff00 : 0x4488ff,\r\n side: THREE.DoubleSide,\r\n transparent: true,\r\n opacity: isPreview ? 0.5 : 0.8\r\n })\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = 'Plane'\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建曲线\r\n */\r\n private createCurve(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const curve = new THREE.CatmullRomCurve3(points)\r\n const curvePoints = curve.getPoints(50)\r\n\r\n const geometry = new THREE.BufferGeometry().setFromPoints(curvePoints)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xff4488,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Curve'\r\n\r\n // 保存曲线路径\r\n ;(line as ExtendedObject3D).isCurveMesh = true\r\n ;(line as ExtendedObject3D).curvePath = curve\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 创建直线\r\n */\r\n private createLine(points: THREE.Vector3[], isPreview = false): THREE.Object3D {\r\n const geometry = new THREE.BufferGeometry().setFromPoints(points)\r\n\r\n const material = new THREE.LineBasicMaterial({\r\n color: isPreview ? 0x00ff00 : 0xffff00,\r\n linewidth: 2\r\n })\r\n\r\n const line = new THREE.Line(geometry, material)\r\n line.name = 'Line'\r\n\r\n return line\r\n }\r\n\r\n /**\r\n * 获取所有绘制的物体\r\n */\r\n getDrawnObjects(): DrawResult[] {\r\n return this.drawnObjects\r\n }\r\n\r\n /**\r\n * 删除绘制的物体\r\n */\r\n removeDrawnObject(mesh: THREE.Object3D): void {\r\n const index = this.drawnObjects.findIndex(d => d.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n this.drawnObjects.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有绘制的物体\r\n */\r\n clearAll(): void {\r\n for (const result of this.drawnObjects) {\r\n this.scene.remove(result.mesh)\r\n }\r\n this.drawnObjects = []\r\n }\r\n\r\n /**\r\n * 获取场景中的所有曲线\r\n */\r\n getCurveList(): Array<{ path: THREE.Curve<THREE.Vector3>; mesh: THREE.Object3D }> {\r\n return this.scene.children\r\n .filter(obj => (obj as ExtendedObject3D).isCurveMesh)\r\n .map(obj => ({\r\n path: (obj as ExtendedObject3D).curvePath!,\r\n mesh: obj\r\n }))\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport proj4 from 'proj4'\r\nimport { Plugin } from '../Plugin'\r\nimport type { GeoMapPluginConfig } from '../../types/config.types'\r\nimport type { ExtendedObject3D, GeoInfo } from '../../types/core.types'\r\n\r\n/**\r\n * GeoJSON Feature\r\n */\r\nexport interface GeoJSONFeature {\r\n type: 'Feature'\r\n properties: Record<string, any>\r\n geometry: {\r\n type: 'Polygon' | 'MultiPolygon'\r\n coordinates: number[][][] | number[][][][]\r\n }\r\n}\r\n\r\n/**\r\n * GeoJSON 数据\r\n */\r\nexport interface GeoJSONData {\r\n type: 'FeatureCollection'\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 地图组信息\r\n */\r\nexport interface GeoGroupInfo {\r\n group: THREE.Group\r\n url: string\r\n materialType: string\r\n features: GeoJSONFeature[]\r\n}\r\n\r\n/**\r\n * 默认地图配置\r\n */\r\nexport const DEFAULT_GEOMAP_CONFIG: GeoMapPluginConfig = {\r\n materialType: '标准材质',\r\n coordinateScale: 10000\r\n}\r\n\r\n/**\r\n * 地图插件\r\n * 提供 GeoJSON 地图加载和渲染功能\r\n */\r\nexport class GeoMapPlugin extends Plugin<GeoMapPluginConfig> {\r\n readonly name = 'geomap'\r\n\r\n /** 已加载的地图组 */\r\n private geoGroups: GeoGroupInfo[] = []\r\n\r\n /** 加载完成回调 */\r\n onGroupLoaded?: (group: THREE.Group) => void\r\n\r\n /** 所有地图加载完成回调 */\r\n onAllLoaded?: () => void\r\n\r\n constructor(config?: Partial<GeoMapPluginConfig>) {\r\n super({ ...DEFAULT_GEOMAP_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 加载 GeoJSON 地图\r\n */\r\n async load(url: string, options?: {\r\n materialType?: string\r\n depth?: number\r\n color?: number\r\n opacity?: number\r\n }): Promise<THREE.Group> {\r\n const response = await fetch(url)\r\n const data: GeoJSONData = await response.json()\r\n\r\n const group = this.createGeoGroup(data, {\r\n materialType: options?.materialType ?? this.config.materialType,\r\n depth: options?.depth ?? 1,\r\n color: options?.color ?? 0x4488ff,\r\n opacity: options?.opacity ?? 0.8\r\n })\r\n\r\n // 标记为地图组\r\n ;(group as ExtendedObject3D).isGeoGroup = true\r\n\r\n // 设置中心点\r\n this.centerGroup(group)\r\n\r\n // 添加到场景\r\n this.scene.add(group)\r\n\r\n // 保存信息\r\n this.geoGroups.push({\r\n group,\r\n url,\r\n materialType: options?.materialType ?? this.config.materialType,\r\n features: data.features\r\n })\r\n\r\n // 触发回调\r\n this.onGroupLoaded?.(group)\r\n this.events.emit('geomap:load:complete', { group })\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建地图组\r\n */\r\n private createGeoGroup(data: GeoJSONData, options: {\r\n materialType: string\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Group {\r\n const group = new THREE.Group()\r\n group.name = 'GeoGroup'\r\n\r\n for (const feature of data.features) {\r\n const meshes = this.createFeatureMeshes(feature, options)\r\n for (const mesh of meshes) {\r\n group.add(mesh)\r\n }\r\n }\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 创建 Feature 网格\r\n */\r\n private createFeatureMeshes(feature: GeoJSONFeature, options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh[] {\r\n const meshes: THREE.Mesh[] = []\r\n const { geometry, properties } = feature\r\n\r\n let polygons: number[][][][] = []\r\n\r\n if (geometry.type === 'Polygon') {\r\n polygons = [geometry.coordinates as number[][][]]\r\n } else if (geometry.type === 'MultiPolygon') {\r\n polygons = geometry.coordinates as number[][][][]\r\n }\r\n\r\n for (const polygon of polygons) {\r\n const mesh = this.createPolygonMesh(polygon, options)\r\n mesh.name = properties.name || 'Region'\r\n\r\n // 保存地理信息\r\n const geoInfo: GeoInfo = {\r\n properties: { ...properties }\r\n }\r\n\r\n // 计算中心点\r\n if (properties.center) {\r\n geoInfo.properties!.centerCoord3 = this.coordToVector3(properties.center)\r\n }\r\n if (properties.centroid) {\r\n geoInfo.properties!.centroidCoord3 = this.coordToVector3(properties.centroid)\r\n }\r\n\r\n ;(mesh as ExtendedObject3D).geoInfo = geoInfo\r\n\r\n meshes.push(mesh)\r\n }\r\n\r\n return meshes\r\n }\r\n\r\n /**\r\n * 创建多边形网格\r\n */\r\n private createPolygonMesh(polygon: number[][][], options: {\r\n depth: number\r\n color: number\r\n opacity: number\r\n }): THREE.Mesh {\r\n // 外环\r\n const outerRing = polygon[0]\r\n const shape = new THREE.Shape()\r\n\r\n const firstPoint = this.coordToVector2(outerRing[0])\r\n shape.moveTo(firstPoint.x, firstPoint.y)\r\n\r\n for (let i = 1; i < outerRing.length; i++) {\r\n const point = this.coordToVector2(outerRing[i])\r\n shape.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.closePath()\r\n\r\n // 内环(孔洞)\r\n for (let i = 1; i < polygon.length; i++) {\r\n const hole = new THREE.Path()\r\n const holeRing = polygon[i]\r\n const holeFirst = this.coordToVector2(holeRing[0])\r\n hole.moveTo(holeFirst.x, holeFirst.y)\r\n\r\n for (let j = 1; j < holeRing.length; j++) {\r\n const point = this.coordToVector2(holeRing[j])\r\n hole.lineTo(point.x, point.y)\r\n }\r\n\r\n shape.holes.push(hole)\r\n }\r\n\r\n // 创建挤压几何体\r\n const geometry = new THREE.ExtrudeGeometry(shape, {\r\n depth: options.depth,\r\n bevelEnabled: false\r\n })\r\n\r\n // 旋转到 XZ 平面\r\n geometry.rotateX(-Math.PI / 2)\r\n\r\n const material = new THREE.MeshStandardMaterial({\r\n color: options.color,\r\n transparent: true,\r\n opacity: options.opacity,\r\n side: THREE.DoubleSide\r\n })\r\n\r\n return new THREE.Mesh(geometry, material)\r\n }\r\n\r\n /**\r\n * 经纬度转二维坐标\r\n */\r\n coordToVector2(coord: number[]): THREE.Vector2 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector2(x / this.config.coordinateScale, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 经纬度转三维坐标\r\n */\r\n coordToVector3(coord: number[]): THREE.Vector3 {\r\n const [lng, lat] = coord\r\n const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [lng, lat])\r\n return new THREE.Vector3(x / this.config.coordinateScale, 0, y / this.config.coordinateScale)\r\n }\r\n\r\n /**\r\n * 将组中心移到原点\r\n */\r\n private centerGroup(group: THREE.Group): void {\r\n const box = new THREE.Box3().setFromObject(group)\r\n const center = new THREE.Vector3()\r\n box.getCenter(center)\r\n\r\n // 保存偏移量\r\n ;(group as ExtendedObject3D).translationOriginDiff = center.clone()\r\n\r\n // 添加坐标转换方法\r\n ;(group as ExtendedObject3D).getTransformedVector = (vec3: THREE.Vector3) => {\r\n const transformed = vec3.clone()\r\n transformed.sub(center)\r\n transformed.multiply(group.scale)\r\n transformed.applyEuler(group.rotation)\r\n transformed.add(group.position)\r\n return transformed\r\n }\r\n\r\n // 移动子物体\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n child.position.sub(center)\r\n ;(child as ExtendedObject3D).initTranslate = child.position.clone()\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取所有地图组\r\n */\r\n getGeoGroups(): GeoGroupInfo[] {\r\n return this.geoGroups\r\n }\r\n\r\n /**\r\n * 移除地图组\r\n */\r\n removeGeoGroup(group: THREE.Group): void {\r\n const index = this.geoGroups.findIndex(g => g.group === group)\r\n if (index > -1) {\r\n this.scene.remove(group)\r\n this.geoGroups.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有地图\r\n */\r\n clearAll(): void {\r\n for (const info of this.geoGroups) {\r\n this.scene.remove(info.group)\r\n }\r\n this.geoGroups = []\r\n }\r\n\r\n /**\r\n * 根据名称查找区域\r\n */\r\n findRegionByName(name: string): THREE.Mesh | null {\r\n for (const info of this.geoGroups) {\r\n const found = info.group.children.find(\r\n child => child.name === name\r\n ) as THREE.Mesh | undefined\r\n\r\n if (found) return found\r\n }\r\n return null\r\n }\r\n\r\n /**\r\n * 高亮区域\r\n */\r\n highlightRegion(mesh: THREE.Mesh, color: number = 0xff0000): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissive.setHex(color)\r\n mesh.material.emissiveIntensity = 0.3\r\n }\r\n }\r\n\r\n /**\r\n * 取消高亮\r\n */\r\n unhighlightRegion(mesh: THREE.Mesh): void {\r\n if (mesh.material instanceof THREE.MeshStandardMaterial) {\r\n mesh.material.emissiveIntensity = 0\r\n }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 几何体类型\r\n */\r\nexport type GeometryType =\r\n | '立方体'\r\n | '球体'\r\n | '圆柱体'\r\n | '圆锥体'\r\n | '平面'\r\n | '圆环'\r\n | '圆环结'\r\n | '十二面体'\r\n | '二十面体'\r\n | '八面体'\r\n | '四面体'\r\n | '胶囊体'\r\n\r\n/**\r\n * 几何体参数\r\n */\r\nexport interface GeometryParams {\r\n // 立方体\r\n width?: number\r\n height?: number\r\n depth?: number\r\n widthSegments?: number\r\n heightSegments?: number\r\n depthSegments?: number\r\n\r\n // 球体\r\n radius?: number\r\n phiStart?: number\r\n phiLength?: number\r\n thetaStart?: number\r\n thetaLength?: number\r\n\r\n // 圆柱体/圆锥体\r\n radiusTop?: number\r\n radiusBottom?: number\r\n radialSegments?: number\r\n openEnded?: boolean\r\n\r\n // 圆环\r\n tube?: number\r\n tubularSegments?: number\r\n arc?: number\r\n\r\n // 圆环结\r\n p?: number\r\n q?: number\r\n\r\n // 胶囊体\r\n capSegments?: number\r\n}\r\n\r\n/**\r\n * 几何体插件配置\r\n */\r\nexport interface GeometryPluginConfig {\r\n defaultSize: number\r\n}\r\n\r\n/**\r\n * 默认几何体配置\r\n */\r\nexport const DEFAULT_GEOMETRY_CONFIG: GeometryPluginConfig = {\r\n defaultSize: 1\r\n}\r\n\r\n/**\r\n * 几何体插件\r\n * 提供内置几何体创建功能\r\n */\r\nexport class GeometryPlugin extends Plugin<GeometryPluginConfig> {\r\n readonly name = 'geometry'\r\n\r\n /** 几何体类型列表 */\r\n readonly geometryTypes: GeometryType[] = [\r\n '立方体', '球体', '圆柱体', '圆锥体', '平面',\r\n '圆环', '圆环结', '十二面体', '二十面体', '八面体', '四面体', '胶囊体'\r\n ]\r\n\r\n /** 已创建的内置物体 */\r\n private innerMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<GeometryPluginConfig>) {\r\n super({ ...DEFAULT_GEOMETRY_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n /**\r\n * 创建几何体\r\n */\r\n createGeometry(type: GeometryType, params?: GeometryParams): THREE.BufferGeometry {\r\n const size = this.config.defaultSize\r\n const p = params || {}\r\n\r\n switch (type) {\r\n case '立方体':\r\n return new THREE.BoxGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.depth ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1,\r\n p.depthSegments ?? 1\r\n )\r\n\r\n case '球体':\r\n return new THREE.SphereGeometry(\r\n p.radius ?? size / 2,\r\n p.widthSegments ?? 32,\r\n p.heightSegments ?? 16,\r\n p.phiStart ?? 0,\r\n p.phiLength ?? Math.PI * 2,\r\n p.thetaStart ?? 0,\r\n p.thetaLength ?? Math.PI\r\n )\r\n\r\n case '圆柱体':\r\n return new THREE.CylinderGeometry(\r\n p.radiusTop ?? size / 2,\r\n p.radiusBottom ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '圆锥体':\r\n return new THREE.ConeGeometry(\r\n p.radius ?? size / 2,\r\n p.height ?? size,\r\n p.radialSegments ?? 32,\r\n p.heightSegments ?? 1,\r\n p.openEnded ?? false\r\n )\r\n\r\n case '平面':\r\n return new THREE.PlaneGeometry(\r\n p.width ?? size,\r\n p.height ?? size,\r\n p.widthSegments ?? 1,\r\n p.heightSegments ?? 1\r\n )\r\n\r\n case '圆环':\r\n return new THREE.TorusGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.radialSegments ?? 16,\r\n p.tubularSegments ?? 100,\r\n p.arc ?? Math.PI * 2\r\n )\r\n\r\n case '圆环结':\r\n return new THREE.TorusKnotGeometry(\r\n p.radius ?? size / 2,\r\n p.tube ?? size / 6,\r\n p.tubularSegments ?? 64,\r\n p.radialSegments ?? 8,\r\n p.p ?? 2,\r\n p.q ?? 3\r\n )\r\n\r\n case '十二面体':\r\n return new THREE.DodecahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '二十面体':\r\n return new THREE.IcosahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '八面体':\r\n return new THREE.OctahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '四面体':\r\n return new THREE.TetrahedronGeometry(p.radius ?? size / 2)\r\n\r\n case '胶囊体':\r\n return new THREE.CapsuleGeometry(\r\n p.radius ?? size / 4,\r\n p.height ?? size / 2,\r\n p.capSegments ?? 4,\r\n p.radialSegments ?? 8\r\n )\r\n\r\n default:\r\n return new THREE.BoxGeometry(size, size, size)\r\n }\r\n }\r\n\r\n /**\r\n * 创建内置网格物体\r\n */\r\n createMesh(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const geometry = this.createGeometry(geometryType, params)\r\n\r\n // 保存几何体类型\r\n ;(geometry as any).geometryType = geometryType\r\n\r\n const mesh = new THREE.Mesh(\r\n geometry,\r\n material ?? new THREE.MeshStandardMaterial({ color: 0x808080 })\r\n )\r\n\r\n mesh.name = geometryType\r\n\r\n // 标记为内置物体\r\n ;(mesh as ExtendedObject3D).isInnerMesh = true\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加内置物体到场景\r\n */\r\n addToScene(\r\n geometryType: GeometryType,\r\n material?: THREE.Material,\r\n params?: GeometryParams\r\n ): THREE.Mesh {\r\n const mesh = this.createMesh(geometryType, material, params)\r\n this.scene.add(mesh)\r\n this.innerMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 创建简单立方体\r\n */\r\n createBox(size: number = 1, color: number = 0xffffff): THREE.Mesh {\r\n const geometry = new THREE.BoxGeometry(size, size, size)\r\n const material = new THREE.MeshBasicMaterial({ color })\r\n const mesh = new THREE.Mesh(geometry, material)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 获取所有内置物体\r\n */\r\n getInnerMeshes(): THREE.Mesh[] {\r\n return this.innerMeshes\r\n }\r\n\r\n /**\r\n * 移除内置物体\r\n */\r\n removeMesh(mesh: THREE.Mesh): void {\r\n const index = this.innerMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.innerMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有内置物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.innerMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.innerMeshes = []\r\n }\r\n\r\n /**\r\n * 更新几何体参数\r\n */\r\n updateGeometry(mesh: THREE.Mesh, type: GeometryType, params?: GeometryParams): void {\r\n const oldGeometry = mesh.geometry\r\n mesh.geometry = this.createGeometry(type, params)\r\n ;(mesh.geometry as any).geometryType = type\r\n oldGeometry.dispose()\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 材质类型\r\n */\r\nexport type MaterialType =\r\n | '基础材质'\r\n | '标准材质'\r\n | '物理材质'\r\n | 'Lambert材质'\r\n | 'Phong材质'\r\n | 'Toon材质'\r\n | '法线材质'\r\n | '深度材质'\r\n\r\n/**\r\n * 材质参数\r\n */\r\nexport interface MaterialParams {\r\n color?: number | string\r\n opacity?: number\r\n transparent?: boolean\r\n side?: THREE.Side\r\n wireframe?: boolean\r\n flatShading?: boolean\r\n map?: THREE.Texture\r\n emissive?: number | string\r\n emissiveIntensity?: number\r\n roughness?: number\r\n metalness?: number\r\n envMapIntensity?: number\r\n}\r\n\r\n/**\r\n * 材质插件配置\r\n */\r\nexport interface MaterialPluginConfig {\r\n defaultType: MaterialType\r\n defaultColor: number\r\n}\r\n\r\n/**\r\n * 默认材质配置\r\n */\r\nexport const DEFAULT_MATERIAL_CONFIG: MaterialPluginConfig = {\r\n defaultType: '标准材质',\r\n defaultColor: 0x808080\r\n}\r\n\r\n/**\r\n * 材质插件\r\n * 提供材质创建和管理功能\r\n */\r\nexport class MaterialPlugin extends Plugin<MaterialPluginConfig> {\r\n readonly name = 'material'\r\n\r\n /** 材质类型列表 */\r\n readonly materialTypes: MaterialType[] = [\r\n '基础材质', '标准材质', '物理材质', 'Lambert材质',\r\n 'Phong材质', 'Toon材质', '法线材质', '深度材质'\r\n ]\r\n\r\n constructor(config?: Partial<MaterialPluginConfig>) {\r\n super({ ...DEFAULT_MATERIAL_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 创建材质\r\n */\r\n createMaterial(type: MaterialType, params?: MaterialParams): THREE.Material {\r\n const p = params || {}\r\n const color = p.color ?? this.config.defaultColor\r\n\r\n const commonParams = {\r\n color,\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false\r\n }\r\n\r\n switch (type) {\r\n case '基础材质':\r\n return new THREE.MeshBasicMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '标准材质':\r\n return new THREE.MeshStandardMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case '物理材质':\r\n return new THREE.MeshPhysicalMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1,\r\n roughness: p.roughness ?? 0.5,\r\n metalness: p.metalness ?? 0.5,\r\n envMapIntensity: p.envMapIntensity ?? 1\r\n })\r\n\r\n case 'Lambert材质':\r\n return new THREE.MeshLambertMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Phong材质':\r\n return new THREE.MeshPhongMaterial({\r\n ...commonParams,\r\n flatShading: p.flatShading ?? false,\r\n map: p.map,\r\n emissive: p.emissive ?? 0x000000,\r\n emissiveIntensity: p.emissiveIntensity ?? 1\r\n })\r\n\r\n case 'Toon材质':\r\n return new THREE.MeshToonMaterial({\r\n ...commonParams,\r\n map: p.map\r\n })\r\n\r\n case '法线材质':\r\n return new THREE.MeshNormalMaterial({\r\n opacity: p.opacity ?? 1,\r\n transparent: p.transparent ?? false,\r\n side: p.side ?? THREE.FrontSide,\r\n wireframe: p.wireframe ?? false,\r\n flatShading: p.flatShading ?? false\r\n })\r\n\r\n case '深度材质':\r\n return new THREE.MeshDepthMaterial({\r\n opacity: p.opacity ?? 1,\r\n wireframe: p.wireframe ?? false\r\n })\r\n\r\n default:\r\n return new THREE.MeshStandardMaterial(commonParams)\r\n }\r\n }\r\n\r\n /**\r\n * 修改网格材质\r\n */\r\n changeMaterial(mesh: THREE.Mesh, params: MaterialParams): void {\r\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material]\r\n\r\n // 保存原始材质用于恢复\r\n if (!(mesh as any)._originalMaterials) {\r\n (mesh as any)._originalMaterials = materials.map(m => m.clone())\r\n }\r\n\r\n for (const material of materials) {\r\n this.applyParams(material, params)\r\n }\r\n }\r\n\r\n /**\r\n * 修改组材质\r\n */\r\n changeGroupMaterial(group: THREE.Group, params: MaterialParams): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.changeMaterial(child as THREE.Mesh, params)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 应用参数到材质\r\n */\r\n private applyParams(material: THREE.Material, params: MaterialParams): void {\r\n const mat = material as any\r\n\r\n if (params.color !== undefined) {\r\n if (mat.color) mat.color.set(params.color)\r\n }\r\n if (params.opacity !== undefined) {\r\n mat.opacity = params.opacity\r\n }\r\n if (params.transparent !== undefined) {\r\n mat.transparent = params.transparent\r\n }\r\n if (params.side !== undefined) {\r\n mat.side = params.side\r\n }\r\n if (params.wireframe !== undefined) {\r\n mat.wireframe = params.wireframe\r\n }\r\n if (params.emissive !== undefined && mat.emissive) {\r\n mat.emissive.set(params.emissive)\r\n }\r\n if (params.emissiveIntensity !== undefined) {\r\n mat.emissiveIntensity = params.emissiveIntensity\r\n }\r\n if (params.roughness !== undefined) {\r\n mat.roughness = params.roughness\r\n }\r\n if (params.metalness !== undefined) {\r\n mat.metalness = params.metalness\r\n }\r\n\r\n material.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 恢复原始材质\r\n */\r\n revertMaterial(mesh: THREE.Mesh): void {\r\n const originalMaterials = (mesh as any)._originalMaterials\r\n if (!originalMaterials) return\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach((m, i) => {\r\n if (originalMaterials[i]) {\r\n this.copyMaterialProperties(originalMaterials[i], m)\r\n }\r\n })\r\n } else if (originalMaterials[0]) {\r\n this.copyMaterialProperties(originalMaterials[0], mesh.material)\r\n }\r\n }\r\n\r\n /**\r\n * 恢复组的原始材质\r\n */\r\n revertGroupMaterial(group: THREE.Group): void {\r\n group.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n this.revertMaterial(child as THREE.Mesh)\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 复制材质属性\r\n */\r\n private copyMaterialProperties(source: THREE.Material, target: THREE.Material): void {\r\n const src = source as any\r\n const tgt = target as any\r\n\r\n if (src.color && tgt.color) tgt.color.copy(src.color)\r\n if (src.emissive && tgt.emissive) tgt.emissive.copy(src.emissive)\r\n tgt.opacity = src.opacity\r\n tgt.transparent = src.transparent\r\n tgt.side = src.side\r\n if (src.wireframe !== undefined) tgt.wireframe = src.wireframe\r\n if (src.emissiveIntensity !== undefined) tgt.emissiveIntensity = src.emissiveIntensity\r\n if (src.roughness !== undefined) tgt.roughness = src.roughness\r\n if (src.metalness !== undefined) tgt.metalness = src.metalness\r\n\r\n target.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 克隆物体材质\r\n */\r\n cloneMaterial(object: THREE.Object3D): void {\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n ;(mesh as any).isCloneMaterial = true\r\n ;(mesh as any).originMaterial = mesh.material\r\n\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material = mesh.material.map(m => m.clone())\r\n } else {\r\n mesh.material = mesh.material.clone()\r\n }\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 获取物体的所有材质\r\n */\r\n getMaterials(object: THREE.Object3D): THREE.Material[] {\r\n const materials: THREE.Material[] = []\r\n\r\n object.traverse(child => {\r\n if ((child as THREE.Mesh).isMesh) {\r\n const mesh = child as THREE.Mesh\r\n if (Array.isArray(mesh.material)) {\r\n materials.push(...mesh.material)\r\n } else if (mesh.material) {\r\n materials.push(mesh.material)\r\n }\r\n }\r\n })\r\n\r\n return [...new Set(materials)]\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ParticlePluginConfig } from '../../types/config.types'\r\nimport type { ParticleSportType, ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 粒子系统信息\r\n */\r\nexport interface ParticleSystemInfo {\r\n mesh: THREE.Points\r\n velocities: Float32Array\r\n config: ParticleConfig\r\n}\r\n\r\n/**\r\n * 粒子配置\r\n */\r\nexport interface ParticleConfig {\r\n particlesSum: number\r\n inner: number\r\n outer: number\r\n maxVelocity: number\r\n mapUrl: string\r\n sportType: ParticleSportType\r\n size: number\r\n color: number\r\n opacity: number\r\n}\r\n\r\n/**\r\n * 默认粒子配置\r\n */\r\nexport const DEFAULT_PARTICLE_CONFIG: ParticlePluginConfig = {\r\n particlesSum: 10000,\r\n inner: 0,\r\n outer: 100,\r\n maxVelocity: 10,\r\n mapUrl: '',\r\n shaderCodeName: '雪片着色',\r\n sportType: '全随机'\r\n}\r\n\r\n/**\r\n * 粒子插件\r\n * 提供粒子系统创建和管理功能\r\n */\r\nexport class ParticlePlugin extends Plugin<ParticlePluginConfig> {\r\n readonly name = 'particle'\r\n\r\n /** 运动方式列表 */\r\n readonly sportTypes: ParticleSportType[] = [\r\n '全随机', '随机向下', '随机向上', '直线匀速向上', '直线匀速向下'\r\n ]\r\n\r\n /** 粒子系统列表 */\r\n private particleSystems: ParticleSystemInfo[] = []\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n constructor(config?: Partial<ParticlePluginConfig>) {\r\n super({ ...DEFAULT_PARTICLE_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n // 更新所有粒子系统\r\n for (const system of this.particleSystems) {\r\n this.updateParticleSystem(system, delta)\r\n }\r\n }\r\n\r\n /**\r\n * 创建粒子系统\r\n */\r\n createParticleSystem(config?: Partial<ParticleConfig>): THREE.Points {\r\n const cfg: ParticleConfig = {\r\n particlesSum: config?.particlesSum ?? this.config.particlesSum,\r\n inner: config?.inner ?? this.config.inner,\r\n outer: config?.outer ?? this.config.outer,\r\n maxVelocity: config?.maxVelocity ?? this.config.maxVelocity,\r\n mapUrl: config?.mapUrl ?? this.config.mapUrl,\r\n sportType: config?.sportType ?? (this.config.sportType as ParticleSportType),\r\n size: config?.size ?? 1,\r\n color: config?.color ?? 0xffffff,\r\n opacity: config?.opacity ?? 1\r\n }\r\n\r\n const { particlesSum, inner, outer, maxVelocity, sportType } = cfg\r\n\r\n // 创建几何体\r\n const geometry = new THREE.BufferGeometry()\r\n const positions = new Float32Array(particlesSum * 3)\r\n const velocities = new Float32Array(particlesSum * 3)\r\n\r\n // 初始化粒子位置和速度\r\n for (let i = 0; i < particlesSum; i++) {\r\n const i3 = i * 3\r\n\r\n // 随机位置(球形分布)\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i3] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i3 + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i3 + 2] = radius * Math.cos(phi)\r\n\r\n // 根据运动方式设置速度\r\n switch (sportType) {\r\n case '全随机':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 1] = (Math.random() - 0.5) * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity\r\n break\r\n case '随机向下':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = -Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '随机向上':\r\n velocities[i3] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n velocities[i3 + 1] = Math.random() * maxVelocity\r\n velocities[i3 + 2] = (Math.random() - 0.5) * maxVelocity * 0.2\r\n break\r\n case '直线匀速向上':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n case '直线匀速向下':\r\n velocities[i3] = 0\r\n velocities[i3 + 1] = -maxVelocity\r\n velocities[i3 + 2] = 0\r\n break\r\n }\r\n }\r\n\r\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3))\r\n\r\n // 创建材质\r\n const material = new THREE.PointsMaterial({\r\n size: cfg.size,\r\n color: cfg.color,\r\n transparent: true,\r\n opacity: cfg.opacity,\r\n depthWrite: false,\r\n blending: THREE.AdditiveBlending\r\n })\r\n\r\n // 加载纹理\r\n if (cfg.mapUrl) {\r\n this.textureLoader.load(cfg.mapUrl, (texture) => {\r\n material.map = texture\r\n material.needsUpdate = true\r\n })\r\n }\r\n\r\n // 创建粒子系统\r\n const points = new THREE.Points(geometry, material)\r\n points.name = 'ParticleSystem'\r\n\r\n // 标记为粒子物体\r\n ;(points as ExtendedObject3D).isParticleMesh = true\r\n\r\n // 保存系统信息\r\n const systemInfo: ParticleSystemInfo = {\r\n mesh: points,\r\n velocities,\r\n config: cfg\r\n }\r\n this.particleSystems.push(systemInfo)\r\n\r\n return points\r\n }\r\n\r\n /**\r\n * 添加粒子系统到场景\r\n */\r\n addToScene(config?: Partial<ParticleConfig>): THREE.Points {\r\n const points = this.createParticleSystem(config)\r\n this.scene.add(points)\r\n return points\r\n }\r\n\r\n /**\r\n * 更新粒子系统\r\n */\r\n private updateParticleSystem(system: ParticleSystemInfo, delta: number): void {\r\n const { mesh, velocities, config } = system\r\n const positions = mesh.geometry.attributes.position.array as Float32Array\r\n const { inner, outer, sportType } = config\r\n\r\n for (let i = 0; i < positions.length; i += 3) {\r\n // 更新位置\r\n positions[i] += velocities[i] * delta\r\n positions[i + 1] += velocities[i + 1] * delta\r\n positions[i + 2] += velocities[i + 2] * delta\r\n\r\n // 计算到中心的距离\r\n const distance = Math.sqrt(\r\n positions[i] ** 2 +\r\n positions[i + 1] ** 2 +\r\n positions[i + 2] ** 2\r\n )\r\n\r\n // 边界检测和重置\r\n if (distance > outer || distance < inner) {\r\n // 重新生成位置\r\n const radius = inner + Math.random() * (outer - inner)\r\n const theta = Math.random() * Math.PI * 2\r\n const phi = Math.acos(2 * Math.random() - 1)\r\n\r\n positions[i] = radius * Math.sin(phi) * Math.cos(theta)\r\n positions[i + 1] = radius * Math.sin(phi) * Math.sin(theta)\r\n positions[i + 2] = radius * Math.cos(phi)\r\n }\r\n }\r\n\r\n mesh.geometry.attributes.position.needsUpdate = true\r\n }\r\n\r\n /**\r\n * 获取所有粒子系统\r\n */\r\n getParticleSystems(): ParticleSystemInfo[] {\r\n return this.particleSystems\r\n }\r\n\r\n /**\r\n * 移除粒子系统\r\n */\r\n removeParticleSystem(mesh: THREE.Points): void {\r\n const index = this.particleSystems.findIndex(s => s.mesh === mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n ;(mesh.material as THREE.Material).dispose()\r\n this.particleSystems.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有粒子系统\r\n */\r\n clearAll(): void {\r\n for (const system of this.particleSystems) {\r\n this.scene.remove(system.mesh)\r\n system.mesh.geometry.dispose()\r\n ;(system.mesh.material as THREE.Material).dispose()\r\n }\r\n this.particleSystems = []\r\n }\r\n\r\n /**\r\n * 暂停/恢复粒子系统\r\n */\r\n setEnabled(mesh: THREE.Points, enabled: boolean): void {\r\n mesh.visible = enabled\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport * as CANNON from 'cannon-es'\r\nimport { Plugin } from '../Plugin'\r\nimport type { PhysicsPluginConfig } from '../../types/config.types'\r\nimport { getObjectBox3 } from '../../utils/box3'\r\n\r\n/**\r\n * 物理刚体信息\r\n */\r\nexport interface PhysicsBodyInfo {\r\n body: CANNON.Body\r\n mesh: THREE.Object3D\r\n isUpdate: boolean\r\n}\r\n\r\n/**\r\n * 默认物理配置\r\n */\r\nexport const DEFAULT_PHYSICS_CONFIG: PhysicsPluginConfig = {\r\n gravity: { x: 0, y: -9.82, z: 0 },\r\n defaultMass: 1\r\n}\r\n\r\n/**\r\n * 物理插件\r\n * 提供基于 cannon-es 的物理模拟功能\r\n */\r\nexport class PhysicsPlugin extends Plugin<PhysicsPluginConfig> {\r\n readonly name = 'physics'\r\n\r\n /** 物理世界 */\r\n private world!: CANNON.World\r\n\r\n /** 刚体列表 */\r\n private bodies: PhysicsBodyInfo[] = []\r\n\r\n /** 是否启用物理模拟 */\r\n private _enabled = true\r\n\r\n constructor(config?: Partial<PhysicsPluginConfig>) {\r\n super({ ...DEFAULT_PHYSICS_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 获取物理世界\r\n */\r\n get physicsWorld(): CANNON.World {\r\n return this.world\r\n }\r\n\r\n /**\r\n * 是否启用\r\n */\r\n get enabled(): boolean {\r\n return this._enabled\r\n }\r\n\r\n set enabled(value: boolean) {\r\n this._enabled = value\r\n }\r\n\r\n protected onInstall(): void {\r\n // 创建物理世界\r\n this.world = new CANNON.World()\r\n this.world.gravity.set(\r\n this.config.gravity.x,\r\n this.config.gravity.y,\r\n this.config.gravity.z\r\n )\r\n\r\n // 设置碰撞检测\r\n this.world.broadphase = new CANNON.NaiveBroadphase()\r\n // solver.iterations may not exist in all versions\r\n if ((this.world.solver as any).iterations !== undefined) {\r\n (this.world.solver as any).iterations = 10\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n }\r\n\r\n onUpdate(delta: number): void {\r\n if (!this._enabled) return\r\n\r\n // 更新物理世界\r\n this.world.step(1 / 60, delta, 3)\r\n\r\n // 同步物体位置\r\n for (const info of this.bodies) {\r\n if (info.isUpdate) {\r\n info.mesh.position.copy(info.body.position as any)\r\n info.mesh.quaternion.copy(info.body.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置重力\r\n */\r\n setGravity(x: number, y: number, z: number): void {\r\n this.world.gravity.set(x, y, z)\r\n this.config.gravity = { x, y, z }\r\n }\r\n\r\n /**\r\n * 为物体添加物理刚体\r\n */\r\n addBody(\r\n mesh: THREE.Object3D,\r\n options?: {\r\n mass?: number\r\n shape?: 'box' | 'sphere' | 'cylinder'\r\n isStatic?: boolean\r\n friction?: number\r\n restitution?: number\r\n }\r\n ): CANNON.Body {\r\n const { center, max, min, radius } = getObjectBox3(mesh)\r\n const mass = options?.isStatic ? 0 : (options?.mass ?? this.config.defaultMass)\r\n\r\n // 创建形状\r\n let shape: CANNON.Shape\r\n\r\n switch (options?.shape) {\r\n case 'sphere':\r\n shape = new CANNON.Sphere(radius)\r\n break\r\n case 'cylinder':\r\n const cylinderRadius = Math.max(max.x - min.x, max.z - min.z) / 2\r\n const cylinderHeight = max.y - min.y\r\n shape = new CANNON.Cylinder(cylinderRadius, cylinderRadius, cylinderHeight, 16)\r\n break\r\n case 'box':\r\n default:\r\n shape = new CANNON.Box(new CANNON.Vec3(\r\n (max.x - min.x) / 2,\r\n (max.y - min.y) / 2,\r\n (max.z - min.z) / 2\r\n ))\r\n break\r\n }\r\n\r\n // 创建刚体\r\n const body = new CANNON.Body({\r\n mass,\r\n shape,\r\n position: new CANNON.Vec3(center.x, center.y, center.z)\r\n })\r\n\r\n // 设置材质属性\r\n if (options?.friction !== undefined || options?.restitution !== undefined) {\r\n body.material = new CANNON.Material()\r\n if (options.friction !== undefined) {\r\n body.material.friction = options.friction\r\n }\r\n if (options.restitution !== undefined) {\r\n body.material.restitution = options.restitution\r\n }\r\n }\r\n\r\n // 添加到物理世界\r\n this.world.addBody(body)\r\n\r\n // 保存信息\r\n const info: PhysicsBodyInfo = {\r\n body,\r\n mesh,\r\n isUpdate: !options?.isStatic\r\n }\r\n this.bodies.push(info)\r\n\r\n // 保存到物体\r\n ;(mesh as any).physicsBody = body\r\n\r\n return body\r\n }\r\n\r\n /**\r\n * 添加地面\r\n */\r\n addGround(y: number = 0): CANNON.Body {\r\n const groundBody = new CANNON.Body({\r\n mass: 0,\r\n shape: new CANNON.Plane(),\r\n position: new CANNON.Vec3(0, y, 0)\r\n })\r\n groundBody.quaternion.setFromEuler(-Math.PI / 2, 0, 0)\r\n\r\n this.world.addBody(groundBody)\r\n\r\n return groundBody\r\n }\r\n\r\n /**\r\n * 移除刚体\r\n */\r\n removeBody(mesh: THREE.Object3D): void {\r\n const index = this.bodies.findIndex(b => b.mesh === mesh)\r\n if (index > -1) {\r\n const info = this.bodies[index]\r\n this.world.removeBody(info.body)\r\n this.bodies.splice(index, 1)\r\n delete (mesh as any).physicsBody\r\n }\r\n }\r\n\r\n /**\r\n * 获取物体的刚体\r\n */\r\n getBody(mesh: THREE.Object3D): CANNON.Body | undefined {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n return info?.body\r\n }\r\n\r\n /**\r\n * 设置刚体是否更新\r\n */\r\n setBodyUpdate(mesh: THREE.Object3D, isUpdate: boolean): void {\r\n const info = this.bodies.find(b => b.mesh === mesh)\r\n if (info) {\r\n info.isUpdate = isUpdate\r\n if (isUpdate) {\r\n // 同步当前位置到物理世界\r\n info.body.position.copy(mesh.position as any)\r\n info.body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加力\r\n */\r\n applyForce(mesh: THREE.Object3D, force: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const forceVec = new CANNON.Vec3(force.x, force.y, force.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyForce(forceVec, pointVec)\r\n } else {\r\n body.applyForce(forceVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 施加冲量\r\n */\r\n applyImpulse(mesh: THREE.Object3D, impulse: THREE.Vector3, point?: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n const impulseVec = new CANNON.Vec3(impulse.x, impulse.y, impulse.z)\r\n if (point) {\r\n const pointVec = new CANNON.Vec3(point.x, point.y, point.z)\r\n body.applyImpulse(impulseVec, pointVec)\r\n } else {\r\n body.applyImpulse(impulseVec)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 设置速度\r\n */\r\n setVelocity(mesh: THREE.Object3D, velocity: THREE.Vector3): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.set(velocity.x, velocity.y, velocity.z)\r\n }\r\n }\r\n\r\n /**\r\n * 重置刚体\r\n */\r\n resetBody(mesh: THREE.Object3D): void {\r\n const body = this.getBody(mesh)\r\n if (body) {\r\n body.velocity.setZero()\r\n body.angularVelocity.setZero()\r\n body.position.copy(mesh.position as any)\r\n body.quaternion.copy(mesh.quaternion as any)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有刚体\r\n */\r\n clearAll(): void {\r\n for (const info of this.bodies) {\r\n this.world.removeBody(info.body)\r\n delete (info.mesh as any).physicsBody\r\n }\r\n this.bodies = []\r\n }\r\n\r\n /**\r\n * 获取所有刚体信息\r\n */\r\n getBodies(): PhysicsBodyInfo[] {\r\n return this.bodies\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { FontLoader, Font } from 'three/examples/jsm/loaders/FontLoader.js'\r\nimport { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js'\r\nimport { Plugin } from '../Plugin'\r\nimport type { ExtendedObject3D } from '../../types/core.types'\r\n\r\n/**\r\n * 文本配置\r\n */\r\nexport interface TextConfig {\r\n text: string\r\n fontUrl: string\r\n size?: number\r\n height?: number\r\n curveSegments?: number\r\n bevelEnabled?: boolean\r\n bevelThickness?: number\r\n bevelSize?: number\r\n bevelOffset?: number\r\n bevelSegments?: number\r\n color?: number\r\n materialType?: 'basic' | 'standard' | 'phong'\r\n}\r\n\r\n/**\r\n * 文本插件配置\r\n */\r\nexport interface TextPluginConfig {\r\n defaultFontUrl: string\r\n defaultSize: number\r\n defaultHeight: number\r\n}\r\n\r\n/**\r\n * 默认文本配置\r\n */\r\nexport const DEFAULT_TEXT_CONFIG: TextPluginConfig = {\r\n defaultFontUrl: 'https://z2586300277.github.io/three-editor/dist/files/font/cn1.json',\r\n defaultSize: 1,\r\n defaultHeight: 0.2\r\n}\r\n\r\n/**\r\n * 文本插件\r\n * 提供 3D 文本创建功能\r\n */\r\nexport class TextPlugin extends Plugin<TextPluginConfig> {\r\n readonly name = 'text'\r\n\r\n /** 字体加载器 */\r\n private fontLoader = new FontLoader()\r\n\r\n /** 字体缓存 */\r\n private fontCache = new Map<string, Font>()\r\n\r\n /** 已创建的文本物体 */\r\n private textMeshes: THREE.Mesh[] = []\r\n\r\n constructor(config?: Partial<TextPluginConfig>) {\r\n super({ ...DEFAULT_TEXT_CONFIG, ...config })\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearAll()\r\n this.fontCache.clear()\r\n }\r\n\r\n /**\r\n * 加载字体\r\n */\r\n async loadFont(url: string): Promise<Font> {\r\n // 检查缓存\r\n const cached = this.fontCache.get(url)\r\n if (cached) return cached\r\n\r\n return new Promise((resolve, reject) => {\r\n this.fontLoader.load(\r\n url,\r\n (font) => {\r\n this.fontCache.set(url, font)\r\n resolve(font)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 创建文本几何体\r\n */\r\n async createTextGeometry(config: TextConfig): Promise<TextGeometry> {\r\n const font = await this.loadFont(config.fontUrl || this.config.defaultFontUrl)\r\n\r\n const geometry = new TextGeometry(config.text, {\r\n font,\r\n size: config.size ?? this.config.defaultSize,\r\n height: config.height ?? this.config.defaultHeight,\r\n curveSegments: config.curveSegments ?? 12,\r\n bevelEnabled: config.bevelEnabled ?? false,\r\n bevelThickness: config.bevelThickness ?? 0.1,\r\n bevelSize: config.bevelSize ?? 0.05,\r\n bevelOffset: config.bevelOffset ?? 0,\r\n bevelSegments: config.bevelSegments ?? 3\r\n })\r\n\r\n // 居中\r\n geometry.computeBoundingBox()\r\n geometry.center()\r\n\r\n return geometry\r\n }\r\n\r\n /**\r\n * 创建文本网格\r\n */\r\n async createTextMesh(config: TextConfig): Promise<THREE.Mesh> {\r\n const geometry = await this.createTextGeometry(config)\r\n\r\n // 创建材质\r\n let material: THREE.Material\r\n\r\n switch (config.materialType) {\r\n case 'basic':\r\n material = new THREE.MeshBasicMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'phong':\r\n material = new THREE.MeshPhongMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n case 'standard':\r\n default:\r\n material = new THREE.MeshStandardMaterial({\r\n color: config.color ?? 0xffffff\r\n })\r\n break\r\n }\r\n\r\n const mesh = new THREE.Mesh(geometry, material)\r\n mesh.name = config.text\r\n\r\n // 标记为文本物体\r\n ;(mesh as ExtendedObject3D).isTextMesh = true\r\n ;(mesh as any).fontLink = config.fontUrl || this.config.defaultFontUrl\r\n ;(mesh as any).text = config.text\r\n\r\n return mesh\r\n }\r\n\r\n /**\r\n * 添加文本到场景\r\n */\r\n async addToScene(config: TextConfig): Promise<THREE.Mesh> {\r\n const mesh = await this.createTextMesh(config)\r\n this.scene.add(mesh)\r\n this.textMeshes.push(mesh)\r\n return mesh\r\n }\r\n\r\n /**\r\n * 更新文本内容\r\n */\r\n async updateText(mesh: THREE.Mesh, newText: string): Promise<void> {\r\n const fontUrl = (mesh as any).fontLink || this.config.defaultFontUrl\r\n const oldGeometry = mesh.geometry\r\n\r\n const newGeometry = await this.createTextGeometry({\r\n text: newText,\r\n fontUrl\r\n })\r\n\r\n mesh.geometry = newGeometry\r\n mesh.name = newText\r\n ;(mesh as any).text = newText\r\n\r\n oldGeometry.dispose()\r\n }\r\n\r\n /**\r\n * 获取所有文本物体\r\n */\r\n getTextMeshes(): THREE.Mesh[] {\r\n return this.textMeshes\r\n }\r\n\r\n /**\r\n * 移除文本物体\r\n */\r\n removeTextMesh(mesh: THREE.Mesh): void {\r\n const index = this.textMeshes.indexOf(mesh)\r\n if (index > -1) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n this.textMeshes.splice(index, 1)\r\n }\r\n }\r\n\r\n /**\r\n * 清除所有文本物体\r\n */\r\n clearAll(): void {\r\n for (const mesh of this.textMeshes) {\r\n this.scene.remove(mesh)\r\n mesh.geometry.dispose()\r\n if (Array.isArray(mesh.material)) {\r\n mesh.material.forEach(m => m.dispose())\r\n } else {\r\n mesh.material.dispose()\r\n }\r\n }\r\n this.textMeshes = []\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 雾配置\r\n */\r\nexport interface FogConfig {\r\n enabled: boolean\r\n type: 'linear' | 'exponential'\r\n color: number\r\n near?: number\r\n far?: number\r\n density?: number\r\n}\r\n\r\n/**\r\n * 天空盒配置\r\n */\r\nexport interface SkyboxConfig {\r\n type: 'color' | 'texture' | 'cubeTexture' | 'hdr' | 'equirectangular'\r\n color?: number\r\n url?: string\r\n urls?: string[]\r\n}\r\n\r\n/**\r\n * 环境插件配置\r\n */\r\nexport interface EnvironmentPluginConfig {\r\n fog: FogConfig\r\n skybox: SkyboxConfig | null\r\n environmentMap: string | null\r\n environmentIntensity: number\r\n backgroundBlurriness: number\r\n backgroundIntensity: number\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_ENVIRONMENT_CONFIG: EnvironmentPluginConfig = {\r\n fog: {\r\n enabled: false,\r\n type: 'linear',\r\n color: 0xcccccc,\r\n near: 1,\r\n far: 1000,\r\n density: 0.00025\r\n },\r\n skybox: null,\r\n environmentMap: null,\r\n environmentIntensity: 1,\r\n backgroundBlurriness: 0,\r\n backgroundIntensity: 1\r\n}\r\n\r\n/**\r\n * 环境插件\r\n * 提供雾、天空盒、环境贴图等环境功能\r\n */\r\nexport class EnvironmentPlugin extends Plugin<EnvironmentPluginConfig> {\r\n readonly name = 'environment'\r\n\r\n /** RGBE 加载器 */\r\n private rgbeLoader = new RGBELoader()\r\n\r\n /** 立方体纹理加载器 */\r\n private cubeTextureLoader = new THREE.CubeTextureLoader()\r\n\r\n /** 纹理加载器 */\r\n private textureLoader = new THREE.TextureLoader()\r\n\r\n /** 当前环境贴图 */\r\n private currentEnvMap: THREE.Texture | null = null\r\n\r\n /** 当前背景 */\r\n private currentBackground: THREE.Color | THREE.Texture | null = null\r\n\r\n constructor(config?: Partial<EnvironmentPluginConfig>) {\r\n super({ ...DEFAULT_ENVIRONMENT_CONFIG, ...config })\r\n }\r\n\r\n protected onInstall(): void {\r\n // 应用初始配置\r\n if (this.config.fog.enabled) {\r\n this.setFog(this.config.fog)\r\n }\r\n if (this.config.skybox) {\r\n this.setSkybox(this.config.skybox)\r\n }\r\n if (this.config.environmentMap) {\r\n this.setEnvironmentMap(this.config.environmentMap)\r\n }\r\n }\r\n\r\n protected onUninstall(): void {\r\n this.clearFog()\r\n this.clearBackground()\r\n this.clearEnvironmentMap()\r\n }\r\n\r\n /**\r\n * 设置雾\r\n */\r\n setFog(config: Partial<FogConfig>): void {\r\n Object.assign(this.config.fog, config)\r\n\r\n if (!this.config.fog.enabled) {\r\n this.clearFog()\r\n return\r\n }\r\n\r\n const color = new THREE.Color(this.config.fog.color)\r\n\r\n if (this.config.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n color,\r\n this.config.fog.near ?? 1,\r\n this.config.fog.far ?? 1000\r\n )\r\n } else {\r\n this.scene.fog = new THREE.FogExp2(\r\n color,\r\n this.config.fog.density ?? 0.00025\r\n )\r\n }\r\n }\r\n\r\n /**\r\n * 清除雾\r\n */\r\n clearFog(): void {\r\n this.scene.fog = null\r\n this.config.fog.enabled = false\r\n }\r\n\r\n /**\r\n * 更新雾颜色\r\n */\r\n setFogColor(color: number): void {\r\n this.config.fog.color = color\r\n if (this.scene.fog) {\r\n this.scene.fog.color.setHex(color)\r\n }\r\n }\r\n\r\n /**\r\n * 设置天空盒/背景\r\n */\r\n async setSkybox(config: SkyboxConfig): Promise<void> {\r\n this.config.skybox = config\r\n\r\n switch (config.type) {\r\n case 'color':\r\n this.setBackgroundColor(config.color ?? 0x000000)\r\n break\r\n case 'texture':\r\n if (config.url) {\r\n await this.setBackgroundTexture(config.url)\r\n }\r\n break\r\n case 'cubeTexture':\r\n if (config.urls && config.urls.length === 6) {\r\n await this.setBackgroundCubeTexture(config.urls)\r\n }\r\n break\r\n case 'hdr':\r\n if (config.url) {\r\n await this.setBackgroundHDR(config.url)\r\n }\r\n break\r\n case 'equirectangular':\r\n if (config.url) {\r\n await this.setBackgroundEquirectangular(config.url)\r\n }\r\n break\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景颜色\r\n */\r\n setBackgroundColor(color: number): void {\r\n this.currentBackground = new THREE.Color(color)\r\n this.scene.background = this.currentBackground\r\n }\r\n\r\n /**\r\n * 设置背景纹理\r\n */\r\n async setBackgroundTexture(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置立方体纹理背景\r\n */\r\n async setBackgroundCubeTexture(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置 HDR 背景\r\n */\r\n async setBackgroundHDR(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置等距柱状投影背景\r\n */\r\n async setBackgroundEquirectangular(url: string): Promise<THREE.Texture> {\r\n return new Promise((resolve, reject) => {\r\n this.textureLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentBackground = texture\r\n this.scene.background = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 清除背景\r\n */\r\n clearBackground(): void {\r\n if (this.currentBackground instanceof THREE.Texture) {\r\n this.currentBackground.dispose()\r\n }\r\n this.scene.background = null\r\n this.currentBackground = null\r\n this.config.skybox = null\r\n }\r\n\r\n /**\r\n * 设置环境贴图\r\n */\r\n async setEnvironmentMap(url: string): Promise<THREE.Texture> {\r\n this.config.environmentMap = url\r\n\r\n return new Promise((resolve, reject) => {\r\n this.rgbeLoader.load(\r\n url,\r\n (texture) => {\r\n texture.mapping = THREE.EquirectangularReflectionMapping\r\n this.currentEnvMap = texture\r\n this.scene.environment = texture\r\n // environmentIntensity is available in Three.js r155+\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = this.config.environmentIntensity\r\n }\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 设置立方体环境贴图\r\n */\r\n async setCubeEnvironmentMap(urls: string[]): Promise<THREE.CubeTexture> {\r\n return new Promise((resolve, reject) => {\r\n this.cubeTextureLoader.load(\r\n urls,\r\n (texture) => {\r\n this.currentEnvMap = texture\r\n this.scene.environment = texture\r\n resolve(texture)\r\n },\r\n undefined,\r\n reject\r\n )\r\n })\r\n }\r\n\r\n /**\r\n * 清除环境贴图\r\n */\r\n clearEnvironmentMap(): void {\r\n if (this.currentEnvMap) {\r\n this.currentEnvMap.dispose()\r\n }\r\n this.scene.environment = null\r\n this.currentEnvMap = null\r\n this.config.environmentMap = null\r\n }\r\n\r\n /**\r\n * 设置环境强度\r\n */\r\n setEnvironmentIntensity(intensity: number): void {\r\n this.config.environmentIntensity = intensity\r\n if ('environmentIntensity' in this.scene) {\r\n (this.scene as any).environmentIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景模糊度\r\n */\r\n setBackgroundBlurriness(blurriness: number): void {\r\n this.config.backgroundBlurriness = blurriness\r\n if ('backgroundBlurriness' in this.scene) {\r\n (this.scene as any).backgroundBlurriness = blurriness\r\n }\r\n }\r\n\r\n /**\r\n * 设置背景强度\r\n */\r\n setBackgroundIntensity(intensity: number): void {\r\n this.config.backgroundIntensity = intensity\r\n if ('backgroundIntensity' in this.scene) {\r\n (this.scene as any).backgroundIntensity = intensity\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前环境贴图\r\n */\r\n getEnvironmentMap(): THREE.Texture | null {\r\n return this.currentEnvMap\r\n }\r\n\r\n /**\r\n * 获取当前背景\r\n */\r\n getBackground(): THREE.Color | THREE.Texture | null {\r\n return this.currentBackground\r\n }\r\n\r\n /**\r\n * 获取雾配置\r\n */\r\n getFogConfig(): FogConfig {\r\n return { ...this.config.fog }\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): EnvironmentPluginConfig {\r\n return { ...this.config }\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * 序列化数据结构\r\n */\r\nexport interface SerializedScene {\r\n version: string\r\n metadata: {\r\n generator: string\r\n timestamp: number\r\n }\r\n scene: {\r\n background: any\r\n fog: any\r\n environment: any\r\n }\r\n camera: {\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n fov?: number\r\n near: number\r\n far: number\r\n zoom: number\r\n }\r\n objects: SerializedObject[]\r\n plugins: Record<string, any>\r\n}\r\n\r\n/**\r\n * 序列化物体结构\r\n */\r\nexport interface SerializedObject {\r\n uuid: string\r\n name: string\r\n type: string\r\n position: { x: number; y: number; z: number }\r\n rotation: { x: number; y: number; z: number }\r\n scale: { x: number; y: number; z: number }\r\n visible: boolean\r\n userData: any\r\n children?: SerializedObject[]\r\n geometry?: any\r\n material?: any\r\n}\r\n\r\n/**\r\n * 序列化插件配置\r\n */\r\nexport interface SerializationPluginConfig {\r\n version: string\r\n includeGeometry: boolean\r\n includeMaterial: boolean\r\n includeUserData: boolean\r\n excludeHelpers: boolean\r\n}\r\n\r\n/**\r\n * 默认配置\r\n */\r\nexport const DEFAULT_SERIALIZATION_CONFIG: SerializationPluginConfig = {\r\n version: '1.0.0',\r\n includeGeometry: false,\r\n includeMaterial: true,\r\n includeUserData: true,\r\n excludeHelpers: true\r\n}\r\n\r\n/**\r\n * 序列化插件\r\n * 提供场景保存和恢复功能\r\n */\r\nexport class SerializationPlugin extends Plugin<SerializationPluginConfig> {\r\n readonly name = 'serialization'\r\n\r\n constructor(config?: Partial<SerializationPluginConfig>) {\r\n super({ ...DEFAULT_SERIALIZATION_CONFIG, ...config })\r\n }\r\n\r\n /**\r\n * 序列化场景\r\n */\r\n serialize(): SerializedScene {\r\n const scene = this.scene\r\n const camera = this.camera\r\n\r\n return {\r\n version: this.config.version,\r\n metadata: {\r\n generator: 'ThreeEditor',\r\n timestamp: Date.now()\r\n },\r\n scene: this.serializeSceneProperties(),\r\n camera: this.serializeCamera(camera),\r\n objects: this.serializeObjects(scene.children),\r\n plugins: this.serializePlugins()\r\n }\r\n }\r\n\r\n /**\r\n * 序列化场景属性\r\n */\r\n private serializeSceneProperties(): SerializedScene['scene'] {\r\n const scene = this.scene\r\n\r\n return {\r\n background: this.serializeBackground(scene.background),\r\n fog: this.serializeFog(scene.fog as THREE.Fog | THREE.FogExp2 | null),\r\n environment: scene.environment ? 'has_environment' : null\r\n }\r\n }\r\n\r\n /**\r\n * 序列化背景\r\n */\r\n private serializeBackground(background: THREE.Color | THREE.Texture | THREE.CubeTexture | null): any {\r\n if (!background) return null\r\n\r\n if (background instanceof THREE.Color) {\r\n return {\r\n type: 'color',\r\n value: background.getHex()\r\n }\r\n }\r\n\r\n if (background instanceof THREE.Texture) {\r\n return {\r\n type: 'texture',\r\n // 纹理 URL 需要从 userData 或其他地方获取\r\n url: (background as any).sourceFile || null\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化雾\r\n */\r\n private serializeFog(fog: THREE.Fog | THREE.FogExp2 | null): any {\r\n if (!fog) return null\r\n\r\n if (fog instanceof THREE.Fog) {\r\n return {\r\n type: 'linear',\r\n color: fog.color.getHex(),\r\n near: fog.near,\r\n far: fog.far\r\n }\r\n }\r\n\r\n if (fog instanceof THREE.FogExp2) {\r\n return {\r\n type: 'exponential',\r\n color: fog.color.getHex(),\r\n density: fog.density\r\n }\r\n }\r\n\r\n return null\r\n }\r\n\r\n /**\r\n * 序列化相机\r\n */\r\n private serializeCamera(camera: THREE.Camera): SerializedScene['camera'] {\r\n const result: SerializedScene['camera'] = {\r\n type: camera.type,\r\n position: {\r\n x: camera.position.x,\r\n y: camera.position.y,\r\n z: camera.position.z\r\n },\r\n rotation: {\r\n x: camera.rotation.x,\r\n y: camera.rotation.y,\r\n z: camera.rotation.z\r\n },\r\n near: (camera as THREE.PerspectiveCamera).near,\r\n far: (camera as THREE.PerspectiveCamera).far,\r\n zoom: (camera as THREE.PerspectiveCamera).zoom\r\n }\r\n\r\n if (camera instanceof THREE.PerspectiveCamera) {\r\n result.fov = camera.fov\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化物体列表\r\n */\r\n private serializeObjects(objects: THREE.Object3D[]): SerializedObject[] {\r\n const result: SerializedObject[] = []\r\n\r\n for (const obj of objects) {\r\n // 排除辅助物体\r\n if (this.config.excludeHelpers && this.isHelper(obj)) {\r\n continue\r\n }\r\n\r\n const serialized = this.serializeObject(obj)\r\n if (serialized) {\r\n result.push(serialized)\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化单个物体\r\n */\r\n private serializeObject(obj: THREE.Object3D): SerializedObject | null {\r\n const result: SerializedObject = {\r\n uuid: obj.uuid,\r\n name: obj.name,\r\n type: obj.type,\r\n position: {\r\n x: obj.position.x,\r\n y: obj.position.y,\r\n z: obj.position.z\r\n },\r\n rotation: {\r\n x: obj.rotation.x,\r\n y: obj.rotation.y,\r\n z: obj.rotation.z\r\n },\r\n scale: {\r\n x: obj.scale.x,\r\n y: obj.scale.y,\r\n z: obj.scale.z\r\n },\r\n visible: obj.visible,\r\n userData: this.config.includeUserData ? obj.userData : {}\r\n }\r\n\r\n // 序列化几何体\r\n if (this.config.includeGeometry && (obj as THREE.Mesh).geometry) {\r\n result.geometry = this.serializeGeometry((obj as THREE.Mesh).geometry)\r\n }\r\n\r\n // 序列化材质\r\n if (this.config.includeMaterial && (obj as THREE.Mesh).material) {\r\n result.material = this.serializeMaterial((obj as THREE.Mesh).material)\r\n }\r\n\r\n // 递归序列化子物体\r\n if (obj.children.length > 0) {\r\n result.children = this.serializeObjects(obj.children)\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化几何体\r\n */\r\n private serializeGeometry(geometry: THREE.BufferGeometry): any {\r\n return {\r\n type: geometry.type,\r\n uuid: geometry.uuid,\r\n parameters: (geometry as any).parameters || {}\r\n }\r\n }\r\n\r\n /**\r\n * 序列化材质\r\n */\r\n private serializeMaterial(material: THREE.Material | THREE.Material[]): any {\r\n if (Array.isArray(material)) {\r\n return material.map(m => this.serializeSingleMaterial(m))\r\n }\r\n return this.serializeSingleMaterial(material)\r\n }\r\n\r\n /**\r\n * 序列化单个材质\r\n */\r\n private serializeSingleMaterial(material: THREE.Material): any {\r\n const result: any = {\r\n type: material.type,\r\n uuid: material.uuid,\r\n name: material.name,\r\n opacity: material.opacity,\r\n transparent: material.transparent,\r\n visible: material.visible,\r\n side: material.side\r\n }\r\n\r\n // 添加颜色属性\r\n if ((material as THREE.MeshBasicMaterial).color) {\r\n result.color = (material as THREE.MeshBasicMaterial).color.getHex()\r\n }\r\n\r\n // 添加其他常用属性\r\n if ((material as THREE.MeshStandardMaterial).metalness !== undefined) {\r\n result.metalness = (material as THREE.MeshStandardMaterial).metalness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).roughness !== undefined) {\r\n result.roughness = (material as THREE.MeshStandardMaterial).roughness\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissive) {\r\n result.emissive = (material as THREE.MeshStandardMaterial).emissive.getHex()\r\n }\r\n if ((material as THREE.MeshStandardMaterial).emissiveIntensity !== undefined) {\r\n result.emissiveIntensity = (material as THREE.MeshStandardMaterial).emissiveIntensity\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 序列化插件状态\r\n */\r\n private serializePlugins(): Record<string, any> {\r\n const result: Record<string, any> = {}\r\n\r\n // 获取所有已安装的插件并序列化它们的配置\r\n // Note: This requires access to plugin manager through context\r\n const pluginManager = (this.context as any).pluginManager\r\n if (pluginManager && typeof pluginManager.getAll === 'function') {\r\n const plugins = pluginManager.getAll()\r\n for (const plugin of plugins) {\r\n if (plugin.name !== this.name && typeof (plugin as any).getConfig === 'function') {\r\n result[plugin.name] = (plugin as any).getConfig()\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }\r\n\r\n /**\r\n * 判断是否为辅助物体\r\n */\r\n private isHelper(obj: THREE.Object3D): boolean {\r\n return (\r\n obj.name.startsWith('__') ||\r\n obj.type.includes('Helper') ||\r\n obj.type === 'TransformControls' ||\r\n obj.type === 'TransformControlsPlane'\r\n )\r\n }\r\n\r\n /**\r\n * 反序列化场景\r\n */\r\n async deserialize(data: SerializedScene): Promise<void> {\r\n // 恢复相机\r\n this.deserializeCamera(data.camera)\r\n\r\n // 恢复场景属性\r\n this.deserializeSceneProperties(data.scene)\r\n\r\n // 恢复插件配置\r\n this.deserializePlugins(data.plugins)\r\n\r\n // 发出事件\r\n this.events.emit('scene:deserialized' as any, data)\r\n }\r\n\r\n /**\r\n * 反序列化相机\r\n */\r\n private deserializeCamera(cameraData: SerializedScene['camera']): void {\r\n const camera = this.camera\r\n\r\n camera.position.set(\r\n cameraData.position.x,\r\n cameraData.position.y,\r\n cameraData.position.z\r\n )\r\n\r\n camera.rotation.set(\r\n cameraData.rotation.x,\r\n cameraData.rotation.y,\r\n cameraData.rotation.z\r\n )\r\n\r\n if (camera instanceof THREE.PerspectiveCamera && cameraData.fov) {\r\n camera.fov = cameraData.fov\r\n camera.near = cameraData.near\r\n camera.far = cameraData.far\r\n camera.zoom = cameraData.zoom\r\n camera.updateProjectionMatrix()\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化场景属性\r\n */\r\n private deserializeSceneProperties(sceneData: SerializedScene['scene']): void {\r\n // 恢复背景\r\n if (sceneData.background) {\r\n if (sceneData.background.type === 'color') {\r\n this.scene.background = new THREE.Color(sceneData.background.value)\r\n }\r\n }\r\n\r\n // 恢复雾\r\n if (sceneData.fog) {\r\n if (sceneData.fog.type === 'linear') {\r\n this.scene.fog = new THREE.Fog(\r\n sceneData.fog.color,\r\n sceneData.fog.near,\r\n sceneData.fog.far\r\n )\r\n } else if (sceneData.fog.type === 'exponential') {\r\n this.scene.fog = new THREE.FogExp2(\r\n sceneData.fog.color,\r\n sceneData.fog.density\r\n )\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 反序列化插件配置\r\n */\r\n private deserializePlugins(pluginsData: Record<string, any>): void {\r\n const pluginManager = (this.context as any).pluginManager\r\n if (!pluginManager || typeof pluginManager.get !== 'function') return\r\n\r\n for (const [pluginName, config] of Object.entries(pluginsData)) {\r\n const plugin = pluginManager.get(pluginName)\r\n if (plugin && typeof (plugin as any).setConfig === 'function') {\r\n (plugin as any).setConfig(config)\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 导出为 JSON 字符串\r\n */\r\n toJSON(): string {\r\n return JSON.stringify(this.serialize(), null, 2)\r\n }\r\n\r\n /**\r\n * 从 JSON 字符串导入\r\n */\r\n async fromJSON(json: string): Promise<void> {\r\n const data = JSON.parse(json) as SerializedScene\r\n await this.deserialize(data)\r\n }\r\n\r\n /**\r\n * 下载场景文件\r\n */\r\n download(filename: string = 'scene.json'): void {\r\n const json = this.toJSON()\r\n const blob = new Blob([json], { type: 'application/json' })\r\n const url = URL.createObjectURL(blob)\r\n\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = filename\r\n link.click()\r\n\r\n URL.revokeObjectURL(url)\r\n }\r\n\r\n /**\r\n * 从文件加载场景\r\n */\r\n async loadFromFile(file: File): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader()\r\n reader.onload = async (e) => {\r\n try {\r\n const json = e.target?.result as string\r\n await this.fromJSON(json)\r\n resolve()\r\n } catch (error) {\r\n reject(error)\r\n }\r\n }\r\n reader.onerror = reject\r\n reader.readAsText(file)\r\n })\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getConfig(): SerializationPluginConfig {\r\n return { ...this.config }\r\n }\r\n\r\n /**\r\n * 设置配置\r\n */\r\n setConfig(config: Partial<SerializationPluginConfig>): void {\r\n Object.assign(this.config, config)\r\n }\r\n}\r\n","import * as THREE from 'three'\r\nimport { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js'\r\nimport { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.js'\r\nimport { Plugin } from '../Plugin'\r\n\r\n/**\r\n * CSS 渲染器插件\r\n * 提供 CSS2D 和 CSS3D 渲染功能\r\n */\r\nexport class CSSRendererPlugin extends Plugin {\r\n readonly name = 'css-renderer'\r\n\r\n /** CSS2D 渲染器 */\r\n private _css2dRenderer!: CSS2DRenderer\r\n\r\n /** CSS3D 渲染器 */\r\n private _css3dRenderer!: CSS3DRenderer\r\n\r\n /** CSS2DObject 类 */\r\n readonly CSS2DObject = CSS2DObject\r\n\r\n /** CSS3DObject 类 */\r\n readonly CSS3DObject = CSS3DObject\r\n\r\n /**\r\n * 获取 CSS2D 渲染器\r\n */\r\n get css2dRenderer(): CSS2DRenderer {\r\n return this._css2dRenderer\r\n }\r\n\r\n /**\r\n * 获取 CSS3D 渲染器\r\n */\r\n get css3dRenderer(): CSS3DRenderer {\r\n return this._css3dRenderer\r\n }\r\n\r\n protected onInstall(): void {\r\n const container = this.renderer.domElement.parentElement!\r\n const width = container.clientWidth\r\n const height = container.clientHeight\r\n\r\n // 初始化 CSS3D 渲染器\r\n this._css3dRenderer = new CSS3DRenderer()\r\n this.setupCSSRenderer(this._css3dRenderer, container, width, height)\r\n\r\n // 初始化 CSS2D 渲染器\r\n this._css2dRenderer = new CSS2DRenderer()\r\n this.setupCSSRenderer(this._css2dRenderer, container, width, height)\r\n }\r\n\r\n /**\r\n * 设置 CSS 渲染器\r\n */\r\n private setupCSSRenderer(\r\n renderer: CSS2DRenderer | CSS3DRenderer,\r\n container: HTMLElement,\r\n width: number,\r\n height: number\r\n ): void {\r\n renderer.setSize(width, height)\r\n renderer.domElement.style.position = 'absolute'\r\n renderer.domElement.style.top = '0'\r\n renderer.domElement.style.left = '0'\r\n renderer.domElement.style.pointerEvents = 'none'\r\n renderer.domElement.style.zIndex = '1'\r\n container.appendChild(renderer.domElement)\r\n }\r\n\r\n protected onUninstall(): void {\r\n this._css2dRenderer.domElement.parentElement?.removeChild(this._css2dRenderer.domElement)\r\n this._css3dRenderer.domElement.parentElement?.removeChild(this._css3dRenderer.domElement)\r\n }\r\n\r\n onUpdate(): void {\r\n this._css2dRenderer.render(this.scene, this.camera)\r\n this._css3dRenderer.render(this.scene, this.camera)\r\n }\r\n\r\n onResize(width: number, height: number): void {\r\n this._css2dRenderer.setSize(width, height)\r\n this._css3dRenderer.setSize(width, height)\r\n }\r\n\r\n /**\r\n * 创建 CSS2D 对象\r\n * @param element DOM 元素\r\n * @param position 位置\r\n * @param enablePointerEvents 是否启用指针事件\r\n */\r\n createCSS2DObject(\r\n element: HTMLElement,\r\n position?: THREE.Vector3,\r\n enablePointerEvents = true\r\n ): CSS2DObject {\r\n if (enablePointerEvents) {\r\n element.style.pointerEvents = 'auto'\r\n }\r\n\r\n const object = new CSS2DObject(element)\r\n\r\n if (position) {\r\n object.position.copy(position)\r\n }\r\n\r\n // 添加销毁方法\r\n (object as any).destroy = () => {\r\n this.scene.remove(object)\r\n }\r\n\r\n return object\r\n }\r\n\r\n /**\r\n * 创建 CSS3D 对象\r\n * @param element DOM 元素\r\n * @param position 位置\r\n * @param enablePointerEvents 是否启用指针事件\r\n */\r\n createCSS3DObject(\r\n element: HTMLElement,\r\n position?: THREE.Vector3,\r\n enablePointerEvents = false\r\n ): CSS3DObject {\r\n if (enablePointerEvents) {\r\n element.style.pointerEvents = 'auto'\r\n }\r\n\r\n const object = new CSS3DObject(element)\r\n\r\n if (position) {\r\n object.position.copy(position)\r\n }\r\n\r\n // 添加销毁方法\r\n (object as any).destroy = () => {\r\n this.scene.remove(object)\r\n }\r\n\r\n return object\r\n }\r\n\r\n /**\r\n * 添加 CSS2D 对象到场景\r\n */\r\n addCSS2D(element: HTMLElement, position: THREE.Vector3): CSS2DObject {\r\n const object = this.createCSS2DObject(element, position)\r\n this.scene.add(object)\r\n return object\r\n }\r\n\r\n /**\r\n * 添加 CSS3D 对象到场景\r\n */\r\n addCSS3D(element: HTMLElement, position: THREE.Vector3): CSS3DObject {\r\n const object = this.createCSS3DObject(element, position)\r\n this.scene.add(object)\r\n return object\r\n }\r\n}\r\n","import type { IPlugin, IPluginManager, PluginContext } from '../types/plugin.types'\r\n\r\n/**\r\n * 插件管理器\r\n * 负责插件的注册、获取和生命周期管理\r\n */\r\nexport class PluginManager implements IPluginManager {\r\n /** 已注册的插件 */\r\n private plugins = new Map<string, IPlugin>()\r\n\r\n /** 插件上下文 */\r\n private context: PluginContext\r\n\r\n constructor(context: Omit<PluginContext, 'pluginManager'>) {\r\n // 将 pluginManager 添加到上下文中\r\n this.context = {\r\n ...context,\r\n pluginManager: this\r\n }\r\n }\r\n\r\n /**\r\n * 注册插件\r\n * @param plugin 插件实例\r\n */\r\n use<T extends IPlugin>(plugin: T): this {\r\n const { name } = plugin\r\n\r\n // 检查是否已存在\r\n if (this.plugins.has(name)) {\r\n console.warn(`Plugin \"${name}\" is already registered, skipping...`)\r\n return this\r\n }\r\n\r\n // 检查依赖\r\n if (plugin.dependencies) {\r\n for (const dep of plugin.dependencies) {\r\n if (!this.plugins.has(dep)) {\r\n throw new Error(`Plugin \"${name}\" depends on \"${dep}\", but it's not installed`)\r\n }\r\n }\r\n }\r\n\r\n // 安装插件\r\n const result = plugin.install(this.context)\r\n\r\n // 处理异步安装\r\n if (result instanceof Promise) {\r\n result.then(() => {\r\n this.plugins.set(name, plugin)\r\n this.context.events.emit('plugin:installed', { name })\r\n }).catch((error) => {\r\n console.error(`Failed to install plugin \"${name}\":`, error)\r\n })\r\n } else {\r\n this.plugins.set(name, plugin)\r\n this.context.events.emit('plugin:installed', { name })\r\n }\r\n\r\n return this\r\n }\r\n\r\n /**\r\n * 批量注册插件\r\n * @param plugins 插件实例数组\r\n */\r\n useAll(plugins: IPlugin[]): this {\r\n for (const plugin of plugins) {\r\n this.use(plugin)\r\n }\r\n return this\r\n }\r\n\r\n /**\r\n * 获取插件\r\n * @param name 插件名称\r\n */\r\n get<T extends IPlugin>(name: string): T | undefined {\r\n return this.plugins.get(name) as T | undefined\r\n }\r\n\r\n /**\r\n * 移除插件\r\n * @param name 插件名称\r\n */\r\n remove(name: string): boolean {\r\n const plugin = this.plugins.get(name)\r\n if (!plugin) {\r\n return false\r\n }\r\n\r\n // 检查是否有其他插件依赖此插件\r\n for (const [otherName, otherPlugin] of this.plugins) {\r\n if (otherPlugin.dependencies?.includes(name)) {\r\n console.warn(`Cannot remove plugin \"${name}\" because \"${otherName}\" depends on it`)\r\n return false\r\n }\r\n }\r\n\r\n // 卸载插件\r\n const result = plugin.uninstall()\r\n\r\n // 处理异步卸载\r\n if (result instanceof Promise) {\r\n result.then(() => {\r\n this.plugins.delete(name)\r\n this.context.events.emit('plugin:uninstalled', { name })\r\n }).catch((error) => {\r\n console.error(`Failed to uninstall plugin \"${name}\":`, error)\r\n })\r\n } else {\r\n this.plugins.delete(name)\r\n this.context.events.emit('plugin:uninstalled', { name })\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 检查插件是否存在\r\n * @param name 插件名称\r\n */\r\n has(name: string): boolean {\r\n return this.plugins.has(name)\r\n }\r\n\r\n /**\r\n * 获取所有插件\r\n */\r\n getAll(): IPlugin[] {\r\n return Array.from(this.plugins.values())\r\n }\r\n\r\n /**\r\n * 获取所有插件名称\r\n */\r\n getNames(): string[] {\r\n return Array.from(this.plugins.keys())\r\n }\r\n\r\n /**\r\n * 销毁所有插件\r\n */\r\n dispose(): void {\r\n // 按照注册的逆序卸载插件\r\n const names = Array.from(this.plugins.keys()).reverse()\r\n for (const name of names) {\r\n this.remove(name)\r\n }\r\n }\r\n}\r\n"],"names":["Plugin","config","this","_installed","unsubscribers","context","registerLifecycleHooks","onInstall","uninstall","onUninstall","unsubscribe","isInstalled","events","onSceneReady","on","scene","push","onUpdate","prototype","delta","elapsed","onResize","width","height","onBeforeDispose","engine","camera","renderer","pluginManager","event","callback","DEFAULT_ORBIT_CONFIG","enableDamping","dampingFactor","minDistance","maxDistance","minZoom","maxPolarAngle","Math","PI","enablePan","enableZoom","enableRotate","DEFAULT_TRANSFORM_CONFIG","mode","space","showX","showY","showZ","translationSnap","rotationSnap","scaleSnap","DEFAULT_LOADER_CONFIG","dracoPath","useDraco","DEFAULT_COMPOSER_CONFIG","enabled","outline","edgeStrength","edgeGlow","edgeThickness","pulsePeriod","visibleEdgeColor","hiddenEdgeColor","bloom","strength","radius","threshold","ssao","intensity","scale","ssr","thickness","infiniteThick","opacity","screenMask","getWebGLMouse","target","THREE","Vector2","offsetX","clientWidth","offsetY","clientHeight","raycastObjects","mouse","objects","raycaster","Raycaster","setFromCamera","intersectObjects","filter","i","obj","object","isTransformControls","text","isMesh","visible","getRootModel","current","parent","type","DEFAULT_EDITOR_CONFIG","modes","defaultMode","isTransformChildren","enableKeyboard","colorToString","color","forceCSSHex","colorFormat","__state","conversionName","toString","r","round","g","b","a","h","s","toFixed","v","str","hex","length","ARR_EACH","Array","forEach","ARR_SLICE","slice","Common","BREAK","extend","each","call","arguments","isObject","Object","keys","key","isUndefined","bind","defaults","compose","toCall","args","apply","itr","scope","l","_key","defer","fnc","setTimeout","debounce","func","callImmediately","timeout","callNow","clearTimeout","toArray","isNull","isNaN","_isNaN","_x","isArray","constructor","isNumber","isString","isBoolean","isFunction","Function","INTERPRETATIONS","litmus","conversions","THREE_CHAR_HEX","read","original","test","match","parseInt","write","SIX_CHAR_HEX","CSS_RGB","parseFloat","CSS_RGBA","HEX","RGB_ARRAY","RGBA_ARRAY","RGBA_OBJ","RGB_OBJ","HSVA_OBJ","HSV_OBJ","result","toReturn","interpret","family","conversion","tmpComponent","ColorMath","hsv_to_rgb","hi","floor","f","p","q","t","c","rgb_to_hsv","min","max","NaN","rgb_to_hex","hex_with_component","component_from_hex","componentIndex","value","_typeof","Symbol","iterator","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","get","property","receiver","desc","getOwnPropertyDescriptor","getPrototypeOf","getter","inherits","subClass","superClass","create","setPrototypeOf","__proto__","possibleConstructorReturn","self","ReferenceError","Color","Error","defineRGBComponent","component","componentHexIndex","recalculateRGB","set","defineHSVComponent","recalculateHSV","COMPONENTS","Controller","initialValue","domElement","document","createElement","__onChange","__onFinishChange","newValue","updateDisplay","getValue","EVENT_MAP_INV","HTMLEvents","MouseEvents","KeyboardEvents","k","e","CSS_VALUE_PIXELS","cssValueToPixels","val","dom","makeSelectable","elem","selectable","style","onselectstart","MozUserSelect","KhtmlUserSelect","unselectable","makeFullscreen","hor","vert","vertical","horizontal","position","left","right","top","bottom","fakeEvent","eventType","pars","aux","params","className","evt","createEvent","clientX","x","clientY","y","initMouseEvent","bubbles","cancelable","window","clickCount","init","initKeyboardEvent","initKeyEvent","ctrlKey","altKey","shiftKey","metaKey","keyCode","charCode","undefined","initEvent","dispatchEvent","newBool","bool","addEventListener","attachEvent","unbind","removeEventListener","detachEvent","addClass","classes","split","indexOf","join","replace","removeClass","removeAttribute","index","splice","hasClass","RegExp","getWidth","getComputedStyle","getHeight","getOffset","el","offset","offsetParent","offsetLeft","offsetTop","isActive","activeElement","href","BooleanController","_this2","_this","__prev","__checkbox","setAttribute","setValue","appendChild","checked","OptionController","opts","options","__select","map","element","opt","innerHTML","desiredValue","selectedIndex","StringController","onChange","__input","blur","numDecimals","NumberController","_params","__min","__max","__step","step","__impliedStep","pow","log","abs","LN10","__precision","_v","minValue","maxValue","stepValue","NumberControllerBox","__truncationSuspended","prevY","onFinish","onMouseDrag","diff","onMouseUp","attempted","decimals","tenTo","i1","i2","o1","o2","NumberControllerSlider","preventDefault","bgRect","__background","getBoundingClientRect","onTouchMove","touches","onTouchEnd","__foreground","pct","FunctionController","__button","fire","ColorController","__color","__temp","__selector","__saturation_field","__field_knob","__field_knob_border","__hue_knob","__hue_field","__input_textShadow","onBlur","valueField","fieldDown","setSV","fieldUpSV","fieldDownH","setH","fieldUpH","toOriginal","fieldRect","_ref","padding","backgroundColor","boxShadow","border","borderRadius","zIndex","borderRight","marginRight","display","cursor","background","linearGradient","cssText","textAlign","fontWeight","textShadow","mismatch","flip","_flip","marginLeft","marginTop","toHexString","vendors","vendor","css","cssContent","indoc","doc","injected","head","getElementsByTagName","ControllerFactory","requestAnimationFrame$1","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","CenteredDiv","backgroundElement","WebkitTransition","transition","body","hide","webkitTransform","layout","innerWidth","innerHeight","styleSheet","DEFAULT_DEFAULT_PRESET_NAME","SUPPORTS_LOCAL_STORAGE","localStorage","SAVE_DIALOGUE","autoPlaceVirgin","autoPlaceContainer","hideableGuis","GUI","__ul","__folders","__controllers","__rememberedObjects","__rememberedObjectIndecesToControllers","__listening","closeOnTop","autoPlace","DEFAULT_WIDTH","resizable","hideable","load","preset","scrollable","root","useLocalStorage","getItem","getLocalStorageHash","saveToLocalStorage","titleRow","getRoot","gui","__preset_select","revert","setWidth","name","closed","CLASS_CLOSED","__closeButton","TEXT_OPEN","TEXT_CLOSED","setItem","CLASS_MAIN","savedGui","JSON","parse","CLASS_CLOSE_BUTTON","CLASS_CLOSE_TOP","insertBefore","childNodes","CLASS_CLOSE_BOTTOM","titleRowName","createTextNode","addRow","CLASS_AUTO_PLACE_CONTAINER","CLASS_AUTO_PLACE","__resizeHandler","onResizeDebounced","addResizeHandle","stringify","getSaveObject","saveToLocalStorageIfPossible","newDom","liBefore","li","removeListeners","markPresetModified","modified","recallSavedValue","controller","matchedIndex","controllerMap","remembered","presetMap","_add","factoryArgs","concat","before","__li","container","CLASS_CONTROLLER_ROW","__gui","_options","nextSibling","nextElementSibling","remove","_nextSibling","_name","firstElementChild","listen","box","method","pc","pb","returned","oldName","wasListening","newController","stopPropagation","borderLeftColor","isModified","location","addPresetOption","setSelected","showHideExplain","explain","pmouseX","drag","dragStop","CLASS_DRAG","dragStart","__resize_handle","w","__save_row","getCurrentPreset","useInitialValues","savedValues","updateDisplays","controllerArray","toggleHide","CLASS_TOO_TALL","_keydownHandler","which","add","addColor","removeChild","destroy","subfolder","removeFolder","addFolder","newGuiParams","folders","folder","parentElement","open","close","show","node","offsetHeight","remember","div","firstChild","gears","button","button2","button3","select","getElementById","localStorageCheckBox","newConstructorTextArea","focus","save","presetName","prompt","saveAs","GUI$1","DEFAULT_GUI_CONFIG","useProxy","geometryList","materialList","lightTypeList","drawModeList","pointModeList","DEFAULT_GIZMO_CONFIG","grid","size","divisions","colorCenterLine","colorGrid","axes","stats","viewHelper","box3Helper","getPointAtDistance","point1","point2","distance","Vector3","subVectors","normalize","multiplyScalar","clamp","getObjectBox3","Box3","setFromObject","center","getCenter","DEFAULT_SHADER_CONFIG","speed","mixRatio","DEFAULT_ANIMATION_CONFIG","defaultDuration","defaultEase","DEFAULT_DRAWING_CONFIG","defaultPointMode","defaultMaterialType","fenceHeight","lineWidth","DEFAULT_GEOMAP_CONFIG","materialType","coordinateScale","DEFAULT_GEOMETRY_CONFIG","defaultSize","DEFAULT_MATERIAL_CONFIG","defaultType","defaultColor","DEFAULT_PARTICLE_CONFIG","particlesSum","inner","outer","maxVelocity","mapUrl","shaderCodeName","sportType","DEFAULT_PHYSICS_CONFIG","gravity","z","defaultMass","DEFAULT_TEXT_CONFIG","defaultFontUrl","defaultHeight","DEFAULT_ENVIRONMENT_CONFIG","fog","near","far","density","skybox","environmentMap","environmentIntensity","backgroundBlurriness","backgroundIntensity","DEFAULT_SERIALIZATION_CONFIG","version","includeGeometry","includeMaterial","includeUserData","excludeHelpers","super","mixers","curveAnimations","tweens","stopAll","info","mixer","update","clock","getDelta","anim","pause","time","frameEndCallback","point","curve","getPointAt","frameCallback","animations","playParams","initPlay","actionIndexs","startTime","loop","animationPlayParams","Clock","AnimationMixer","actions","_","clip","action","clipAction","LoopRepeat","LoopOnce","timeScale","clampWhenFinished","play","emit","findIndex","m","stop","paused","find","to","query","tween","gsap","duration","ease","repeat","yoyo","yoyoEase","onComplete","resume","kill","progress","controls","viewAngle","Promise","all","resolve","then","transform","promises","rotation","id","Date","now","start","includes","createCurveAnimation","copy","lookAhead","nextT","nextPoint","lookAt","pauseAll","CSS2DObject","CSS3DObject","css2dRenderer","_css2dRenderer","_css3dRenderer","CSS3DRenderer","setupCSSRenderer","CSS2DRenderer","setSize","pointerEvents","render","enablePointerEvents","createCSS2DObject","createCSS3DObject","_renderWay","ssrMeshList","composer","_composer","outlinePass","_outlinePass","bloomPass","_bloomPass","_saoPass","ssrPass","_ssrPass","renderWay","pixelRatio","getPixelRatio","EffectComposer","setPixelRatio","renderPass","RenderPass","addPass","SAOPass","saoIntensity","saoScale","UnrealBloomPass","SSRPass","selects","groundReflector","OutlinePass","renderToScreen","overlayMaterial","blending","CustomBlending","blendSrc","OneFactor","outputPass","OutputPass","_fxaaPass","ShaderPass","FXAAShader","material","uniforms","dispose","way","selectedObjects","clearOutlineObjects","mesh","currentPoints","previewMesh","_isDrawing","drawnObjects","_mode","_pointMode","pointMode","isDrawing","cancel","clone","updatePreview","targetPoint","geoInfo","properties","centroidCoord3","getTransformedVector","centroid","initTranslate","sub","centerCoord3","addPoint","complete","createFence","createPlane","createCurve","createLine","isDrawMesh","points","undoPoint","pop","isPreview","vertices","indices","uvs","u","base","geometry","BufferGeometry","Float32BufferAttribute","setIndex","computeVertexNormals","MeshStandardMaterial","side","DoubleSide","transparent","Mesh","shape","Shape","moveTo","lineTo","closePath","ShapeGeometry","rotateX","avgY","reduce","sum","translate","CatmullRomCurve3","curvePoints","getPoints","setFromPoints","LineBasicMaterial","linewidth","line","Line","isCurveMesh","curvePath","getDrawnObjects","d","clearAll","getCurveList","children","path","dependencies","_currentInfo","keydownHandler","currentInfo","disableKeyboard","previous","transformPlugin","getPlugin","composerPlugin","detach","rect","intersect","rootObj","rootModel","attach","setOutlineObjects","drawEventCallback","currentModel","currentRootModel","targetObjects","intersects","deselect","toLowerCase","setMode","rgbeLoader","RGBELoader","cubeTextureLoader","CubeTextureLoader","textureLoader","TextureLoader","currentEnvMap","currentBackground","setFog","setSkybox","setEnvironmentMap","clearFog","clearBackground","clearEnvironmentMap","assign","Fog","FogExp2","setHex","setBackgroundColor","url","setBackgroundTexture","urls","setBackgroundCubeTexture","setBackgroundHDR","setBackgroundEquirectangular","reject","texture","mapping","EquirectangularReflectionMapping","Texture","environment","blurriness","getEnvironmentMap","getBackground","getFogConfig","getConfig","_gui","sceneFolder","controlFolder","meshFolder","animationFolder","selectPanel","modelListFolder","innerMeshListFolder","drawMeshListFolder","geoMapListFolder","particleListFolder","borderGroupListFolder","textMeshListFolder","designMeshListFolder","lightListFolder","handlerParams","openKey","innerMeshParams","geometryType","drawParams","geoMapParams","particleParams","borderGroupParams","dlength","textMeshParams","fontLink","designMeshParams","lightParams","lightType","createGUI","createSceneFolder","createControlFolder","createMeshFolder","createAnimationFolder","createRendererFolder","createCameraFolder","createOrbitControlsFolder","createEnvironmentFolder","createLightGroupFolder","createComposerFolder","toneMapping","toneMappingExposure","shadowMapEnabled","shadowMap","shadowMapType","outputColorSpace","NoToneMapping","LinearToneMapping","Reinhard","ReinhardToneMapping","Cineon","CineonToneMapping","ACESFilmic","ACESFilmicToneMapping","updateProjectionMatrix","posFolder","orbitController","fogFolder","fogParams","getHexString","fn","light","createLight","addLightPanel","child","Light","AmbientLight","dirLight","DirectionalLight","castShadow","pointLight","PointLight","spotLight","SpotLight","HemisphereLight","rectLight","RectAreaLight","colorParams","outlineFolder","bloomFolder","createSyncTransformFolder","createStatsFolder","createHelpersFolder","createTransformControlsFolder","syncPosition","syncRotation","syncScale","showStats","statsMode","FPS","MS","MB","showGrid","showAxes","gridSize","gridDivisions","axesSize","snapParams","setTranslationSnap","setRotationSnap","createModelFolder","createDrawFolder","createInnerMeshFolder","createGeoMapFolder","createParticleFolder","createBorderGroupFolder","createTextMeshFolder","createDesignMeshFolder","loadGLTF","openFileDialog","file","loadFBX","loadOBJ","model","orbitPlugin","addMeshControlPanel","addGroupGlobalPanel","addGroupAnimationPanel","getSize","rotFolder","scaleFolder","group","globalConfig","useGlobalConfig","isSaveChildren","isSaveMaterials","receiveShadow","envMap","envMapIntensity","reflectivity","traverse","mat","animParams","fill","listFolder","createGeometry","createMaterial","isInnerMesh","addInnerMeshPanel","geoType","addMaterialPanel","emissive","emissiveParams","FrontSide","BackSide","wireframe","metalness","roughness","initFolder","createOrbitAnimationFolder","createMeshAnimationFolder","createMoveAnimationFolder","autoRotate","autoRotateSpeed","destroySelectPanel","addShaderPanel","addDesignPanel","RootMaterials","createSelectMeshPanel","rootMaterials","matFolder","shaderType","reflector","refractor","BoxGeometry","SphereGeometry","CylinderGeometry","ConeGeometry","TorusGeometry","PlaneGeometry","TorusKnotGeometry","DodecahedronGeometry","IcosahedronGeometry","OctahedronGeometry","TetrahedronGeometry","MeshBasicMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshPhysicalMaterial","MeshToonMaterial","accept","input","onchange","files","click","getMode","geoGroups","response","fetch","data","json","createGeoGroup","depth","isGeoGroup","centerGroup","features","onGroupLoaded","Group","feature","meshes","createFeatureMeshes","polygons","coordinates","polygon","createPolygonMesh","coordToVector3","outerRing","firstPoint","coordToVector2","hole","Path","holeRing","holeFirst","j","holes","ExtrudeGeometry","bevelEnabled","coord","lng","lat","proj4","translationOriginDiff","vec3","transformed","multiply","applyEuler","getGeoGroups","found","emissiveIntensity","geometryTypes","innerMeshes","widthSegments","heightSegments","depthSegments","phiStart","phiLength","thetaStart","thetaLength","radiusTop","radiusBottom","radialSegments","openEnded","tube","tubularSegments","arc","CapsuleGeometry","capSegments","createMesh","getInnerMeshes","oldGeometry","gridHelper","axesHelper","currentBox3","createGridHelper","createAxesHelper","createStats","createViewHelper","subscribe","onObjectSelected","onObjectDeselected","removeGridHelper","removeAxesHelper","removeStats","removeViewHelper","removeBox3Helper","GridHelper","AxesHelper","Stats","showPanel","updateStats","ViewHelper","animating","Box3Helper","createBox3Helper","getGridHelper","getAxesHelper","getStats","getViewHelper","fontCache","Map","dracoLoader","DRACOLoader","setDecoderPath","gltfLoader","GLTFLoader","setDRACOLoader","fbxLoader","FBXLoader","objLoader","OBJLoader","mtlLoader","MTLLoader","fontLoader","FontLoader","clear","rootInfo","service","gltf","xhr","percent","loaded","total","error","mtlUrl","materials","preload","setMaterials","cached","font","video","crossOrigin","src","muted","VideoTexture","Set","materialTypes","commonParams","flatShading","MeshNormalMaterial","MeshDepthMaterial","_originalMaterials","applyParams","changeMaterial","needsUpdate","originalMaterials","copyMaterialProperties","revertMaterial","source","tgt","isCloneMaterial","originMaterial","viewAngleList","_controls","OrbitControls","applyConfig","getViewAngleList","clearViewAngleList","reset","sportTypes","particleSystems","system","updateParticleSystem","cfg","positions","Float32Array","velocities","i3","random","theta","phi","acos","sin","cos","BufferAttribute","PointsMaterial","depthWrite","AdditiveBlending","Points","isParticleMesh","systemInfo","createParticleSystem","attributes","array","sqrt","getParticleSystems","bodies","_enabled","physicsWorld","world","CANNON","World","broadphase","NaiveBroadphase","solver","iterations","isUpdate","quaternion","mass","isStatic","Sphere","cylinderRadius","cylinderHeight","Cylinder","Box","Vec3","Body","friction","restitution","Material","addBody","physicsBody","groundBody","Plane","setFromEuler","removeBody","force","getBody","forceVec","pointVec","applyForce","impulse","impulseVec","applyImpulse","velocity","setZero","angularVelocity","getBodies","plugins","plugin","has","dep","install","catch","use","otherName","otherPlugin","delete","getAll","from","values","names","reverse","serialize","metadata","generator","timestamp","serializeSceneProperties","serializeCamera","serializeObjects","serializePlugins","serializeBackground","serializeFog","getHex","sourceFile","zoom","PerspectiveCamera","fov","isHelper","serialized","serializeObject","uuid","userData","serializeGeometry","serializeMaterial","parameters","serializeSingleMaterial","startsWith","deserializeCamera","deserializeSceneProperties","deserializePlugins","cameraData","sceneData","pluginsData","pluginName","entries","setConfig","deserialize","filename","toJSON","blob","Blob","URL","createObjectURL","link","download","revokeObjectURL","reader","FileReader","onload","async","fromJSON","onerror","readAsText","presets","appliedObjects","shaderAnimations","registerBuiltinPresets","registerPreset","getCommonUniforms","fragHeader","getUniformDeclarations","fragBody","animate","iTime","circleWidth","unit","isDisCard","topColor","bottomColor","exponent","vertexHeader","waterColor","waveHeight","waveSpeed","PointsCount","mixColor","hasUv","uniform","getPresetNames","getMaterials","applyShaderToMaterial","shaderName","onBeforeCompile","shader","vertexShader","fragmentShader","fragFunc","animIndex","textMeshes","loadFont","fontUrl","TextGeometry","curveSegments","bevelThickness","bevelSize","bevelOffset","bevelSegments","computeBoundingBox","createTextGeometry","isTextMesh","createTextMesh","newText","newGeometry","getTextMeshes","TransformControls","dragChangeCallback","setSpace","setScaleSnap","helper","degrees","distanceTo","tan","frontView","backView","leftView","rightView","topView","bottomView","end","radians","edge0","edge1"],"mappings":";;;;;;;;;;;;;AAOO,MAAeA,EAAAA;AAAAA,EAsBpB,YAAYC,IAAAA;AALZC,SAAQC,oBAGRD,KAAUE,gBAAmC,CAAA,GAG3CF,KAAKD,SAAUA,MAAU,CAAA;AAAA,EAC3B;AAAA,EAKA,QAAQI,IAAAA;;AACFH,SAAKC,eAKTD,KAAKG,UAAUA,IACfH,KAAKC,mBAGLD,KAAKI,2BAGLJ,UAAKK,cAALL;AAAAA,EACF;AAAA,EAKA,YAAAM;;AACE,QAAKN,KAAKC,YAAV;AAMAD,iBAAKO,gBAALP;AAGA,iBAAWQ,MAAeR,KAAKE,cAC7BM,CAAAA,GAAAA;AAEFR,WAAKE,gBAAgB,CAAA,GAErBF,KAAKC;IAXL;AAAA,EAYF;AAAA,EAKA,cAAAQ;AACE,WAAOT,KAAKC;AAAAA,EACd;AAAA,EAKQ;AACN,UAAA,EAAMS,QAAEA,OAAWV,KAAKG;AAGxB,QAA0C,cAAA,OAA9BH,KAAaW,cAA6B;AACpD,YAAMH,KAAcE,GAAOE,GAAG,eAAe,CAAA,EAAGC,OAAAA,GAAAA,MAAAA;AAC9Cb,aAAKW,aAAcE;;AAErBb,WAAKE,cAAcY,KAAKN,EAAAA;AAAAA,IAC1B;AAKA,QAFsD,cAAA,OAA1BR,KAAae,YACtCf,KAAae,aAAajB,EAAOkB,UAAUD,UAC7B;AACf,YAAMP,KAAcE,GAAOE,GAAG,iBAAiB,CAAA,EAAGK,WAAOC,SAAAA,GAAAA,MAAAA;AACvDlB,aAAKe,SAAUE,IAAOC,EAAAA;AAAAA,MAAAA,CAAAA;AAExBlB,WAAKE,cAAcY,KAAKN;IAC1B;AAGA,QAAsC,qBAA1BR,KAAamB,UAAyB;AAChD,YAAMX,KAAcE,GAAOE,GAAG,UAAU,CAAA,EAAGQ,OAAAA,IAAOC;AAChDrB,aAAKmB,SAAUC,IAAOC,EAAAA;AAAAA,MAAAA,CAAAA;AAExBrB,WAAKE,cAAcY,KAAKN,EAAAA;AAAAA,IAC1B;AAGA,QAA6C,qBAAjCR,KAAasB,iBAAgC;AACvD,YAAMd,KAAcE,GAAOE,GAAG,kBAAkB,MAAA;AAC9CZ,aAAKsB;;AAEPtB,WAAKE,cAAcY,KAAKN,EAAAA;AAAAA,IAC1B;AAAA,EACF;AAAA,EAKA,IAAA,SAAce;AACZ,WAAOvB,KAAKG,QAAQoB;AAAAA,EACtB;AAAA,EAKA,IAAA;AACE,WAAOvB,KAAKG,QAAQoB,OAAOV;AAAAA,EAC7B;AAAA,EAKA,IAAA;AACE,WAAOb,KAAKG,QAAQoB,OAAOC;AAAAA,EAC7B;AAAA,EAKA,IAAA,WAAcC;AACZ,WAAOzB,KAAKG,QAAQoB,OAAOE;AAAAA,EAC7B;AAAA,EAKA,IAAA,SAAcf;AACZ,WAAOV,KAAKG,QAAQO;AAAAA,EACtB;AAAA,EAKA,oBAAcgB;AACZ,WAAO1B,KAAKG,QAAQuB;AAAAA,EACtB;AAAA,EAKU,UACRC,IACAC,IAAAA;AAEA,UAAMpB,KAAcR,KAAKU,OAAOE,GAAGe,IAAOC,EAAAA;AAC1C5B,SAAKE,cAAcY,KAAKN,EAAAA;AAAAA,EAC1B;AAAA;ACnKK,MAAMqB,IAA8C,EACzDC,qBACAC,eAAe,MACfC,aAAa,GACbC,aAAa,KACbC,SAAS,KACTC,eAAeC,KAAKC,IACpBC,WAAAA,MACAC,YAAAA,MACAC,cAAAA,KAAc;ACTT,MAAMC,IAAsD,EACjEC,MAAM,aACNC,OAAO,SACPC,OAAAA,MACAC,aACAC,OAAAA,MACAC,iBAAiB,MACjBC,cAAc,MACdC,WAAW;ACHN,MAAMC,IAAsC,EACjDC,WAAW,WACXC,UAAAA,KAAU;ACCL,MAAMC,IAA0C,EACrDC,eACAC,SAAS,EACPD,SAAAA,MACAE,cAAc,GACdC,UAAU,GACVC,eAAe,GACfC,aAAa,GACbC,kBAAkB,UAClBC,iBAAiB,SAAA,GAEnBC,OAAO,EACLR,SAAAA,OACAS,UAAU,KACVC,QAAQ,KACRC,WAAW,KAAA,GAEbC,MAAM,EACJZ,SAAAA,OACAa,WAAW,MACXC,OAAO,IAAA,GAETC,KAAK,EACHf,SAAAA,OACAgB,WAAW,OACXC,sBACAtC,aAAa,MACbuC,SAAS,IAAA,GAEXC,YAAY,EACVnB,eAAS,EAAA;ACxCN,SAASoB,EAAc/C,IAAAA;AAC5B,QAAMgD,KAAShD,GAAMgD;AAErB,SAAO,IAAIC,EAAMC,QACdlD,GAAMmD,UAAUH,GAAOI,cAAe,IAAI,GAAA,CACzCpD,GAAMqD,UAAUL,GAAOM,eAAgB,IAAI,CAAA;AAEjD;AAuBO,SAASC,EACdC,IACA3D,IACA4D,IAAAA;AAEA,QAAMC,KAAY,IAAIT,EAAMU;AAC5BD,EAAAA,GAAUE,cAAcJ,IAAO3D,EAAAA;AAK/B,SAHmB6D,GAAUG,iBAAiBJ,IAAAA,IAAS,EAGrCK,OAAOC,CAAAA,OAAAA;AACvB,UAAMC,KAAMD,GAAEE;AAGd,aAD2BD,GAAIE,uBAAoC,wBAAbF,GAAIG,SAEnDH,GAAII,UACJJ,GAAIK;AAAAA,EAAAA,CAAAA;AAEf;AAOO,SAASC,EAAaL,IAAAA;AAC3B,MAAIM,KAAUN;AACd,SAAOM,GAAQC,UAAkC,YAAxBD,GAAQC,OAAOC,OACtCF,CAAAA,KAAUA,GAAQC;AAEpB,SAAOD;AACT;AC1DO,MAAMG,IAA4C,EACvDC,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ,SACnCC,aAAa,MACbC,4BACAC,gBAAAA;ACeF,SAASC,EAAeC,IAAOC,IAAAA;AAC7B,MAAIC,KAAcF,GAAMG,QAAQC,eAAeC,SAAAA,GAC3CC,KAAI7E,KAAK8E,MAAMP,GAAMM,CAAAA,GACrBE,KAAI/E,KAAK8E,MAAMP,GAAMQ,IACrBC,KAAIhF,KAAK8E,MAAMP,GAAMS,CAAAA,GACrBC,KAAIV,GAAMU,GACVC,KAAIlF,KAAK8E,MAAMP,GAAMW,CAAAA,GACrBC,KAAIZ,GAAMY,EAAEC,QAAQ,CAAA,GACpBC,KAAId,GAAMc,EAAED,QAAQ,CAAA;AACxB,MAAIZ,MAA+B,qBAAhBC,MAAoD,mBAAhBA,IAAgC;AAErF,aADIa,KAAMf,GAAMgB,IAAIX,SAAS,EAAA,GACtBU,GAAIE,SAAS,IAClBF,CAAAA,KAAM,MAAMA;AAEd,WAAO,MAAMA;AAAAA,EACf;AAAO,SAAoB,cAAhBb,KACF,SAASI,KAAI,MAAME,KAAI,MAAMC,KAAI,MACf,eAAhBP,KACF,UAAUI,KAAI,MAAME,KAAI,MAAMC,KAAI,MAAMC,KAAI,MAC1B,UAAhBR,KACF,OAAOF,GAAMgB,IAAIX,SAAS,MACR,gBAAhBH,KACF,MAAMI,KAAI,MAAME,KAAI,MAAMC,KAAI,MACZ,iBAAhBP,KACF,MAAMI,KAAI,MAAME,KAAI,MAAMC,KAAI,MAAMC,KAAI,MACtB,cAAhBR,KACF,QAAQI,KAAI,QAAQE,KAAI,QAAQC,KAAI,MAClB,eAAhBP,KACF,QAAQI,KAAI,QAAQE,KAAI,QAAQC,KAAI,QAAQC,KAAI,MAC9B,cAAhBR,KACF,QAAQS,KAAI,QAAQC,KAAI,QAAQE,KAAI,MAClB,eAAhBZ,KACF,QAAQS,KAAI,QAAQC,KAAI,QAAQE,KAAI,QAAQJ,KAAI,MAElD;AACT;AAEA,IAAIQ,IAAWC,MAAM9G,UAAU+G,SAC3BC,IAAYF,MAAM9G,UAAUiH,OAC5BC,IAAS,EACXC,OAAO,CAAA,GACPC,QAAQ,SAAgBzD;AAStB,SARA3E,KAAKqI,KAAKL,EAAUM,KAAKC,WAAW,CAAA,GAAI,SAAU5C,IAAAA;AAAAA,KACrC3F,KAAKwI,SAAS7C,EAAAA,IAAO8C,OAAOC,KAAK/C,EAAAA,IAAO,CAAA,GAC9CoC,SAAQ,SAAUY,IAAAA;AAChB3I,WAAK4I,YAAYjD,GAAIgD,SACxBhE,GAAOgE,EAAAA,IAAOhD,GAAIgD,EAAAA;AAAAA,IAEtB,GAAEE,KAAK7I,IAAAA,CAAAA;AAAAA,EACT,GAAGA,IAAAA,GACI2E;AACT,GACAmE,UAAU,SAAkBnE;AAS1B,SARA3E,KAAKqI,KAAKL,EAAUM,KAAKC,WAAW,CAAA,GAAI,SAAU5C,IAAAA;AAAAA,KACrC3F,KAAKwI,SAAS7C,EAAAA,IAAO8C,OAAOC,KAAK/C,EAAAA,IAAO,CAAA,GAC9CoC,SAAQ,SAAUY;AACjB3I,WAAK4I,YAAYjE,GAAOgE,EAAAA,CAAAA,MAC1BhE,GAAOgE,MAAOhD,GAAIgD,EAAAA;AAAAA,IAEtB,GAAEE,KAAK7I,IAAAA,CAAAA;AAAAA,EACT,GAAGA,IAAAA,GACI2E;AACT,GACAoE,SAAS,WAAA;AACP,MAAIC,KAAShB,EAAUM,KAAKC,SAAAA;AAC5B,SAAO,WAAA;AAEL,aADIU,KAAOjB,EAAUM,KAAKC,SAAAA,GACjB7C,KAAIsD,GAAOpB,SAAS,GAAGlC,MAAK,GAAGA,KACtCuD,CAAAA,KAAO,CAACD,GAAOtD,EAAAA,EAAGwD,MAAMlJ,MAAMiJ,EAAAA,CAAAA;AAEhC,WAAOA,GAAK,CAAA;AAAA,EACd;AACF,GACAZ,MAAM,SAAc1C,IAAKwD,IAAKC;AAC5B,MAAKzD;AAGL,QAAIkC,KAAYlC,GAAIoC,WAAWpC,GAAIoC,YAAYF,EAC7ClC,CAAAA,GAAIoC,QAAQoB,IAAKC,EAAAA;AAAAA,aACRzD,GAAIiC,WAAWjC,GAAIiC,SAAS,GAAG;AACxC,UACIyB,IADAV,KAAAA;AAEJ,WAAKA,KAAM,GAAGU,KAAI1D,GAAIiC,QAAQe,KAAMU,IAAGV,KACrC,KAAIA,MAAOhD,MAAOwD,GAAIb,KAAKc,IAAOzD,GAAIgD,EAAAA,GAAMA,QAAS3I,KAAKmI,MACxD;AAAA,IAGN,MACE,UAASmB,MAAQ3D,GACf,KAAIwD,GAAIb,KAAKc,IAAOzD,GAAI2D,EAAAA,GAAOA,EAAAA,MAAUtJ,KAAKmI,MAC5C;AAAA;AAIR,GACAoB,OAAO,SAAeC,IAAAA;AACpBC,aAAWD,IAAK,CAAA;AAClB,GACAE,UAAU,SAAkBC,IAAM1F,IAAW2F;AAC3C,MAAIC,KAAAA;AACJ,SAAO,WAAA;AACL,QAAIlE,KAAM3F,MACNiJ,KAAOV;AAKX,QAAIuB,KAAUF,MAAAA,CAAoBC;AAClCE,iBAAaF,EAAAA,GACbA,KAAUJ,WANV,WAAA;AACEI,MAAAA,KAAU,MACLD,MAAiBD,GAAKT,MAAMvD,IAAKsD;IACxC,GAG8BhF,EAAAA,GAC1B6F,MACFH,GAAKT,MAAMvD,IAAKsD,EAAAA;AAAAA,EAEpB;AACF,GACAe,SAAS,SAAiBrE,IAAAA;AACxB,SAAIA,GAAIqE,UAAgBrE,GAAIqE,QAAAA,IACrBhC,EAAUM,KAAK3C,EAAAA;AACxB,GACAiD,aAAa,SAAqBjD,IAAAA;AAChC,SAAA,WAAOA;AACT,GACAsE,QAAQ,SAAgBtE,IAAAA;AACtB,SAAe,SAARA;AACT,GACAuE,OAAO,SAAUC,IAAAA;AACf,WAASD,GAAME,IAAAA;AACb,WAAOD,GAAOjB,MAAMlJ,MAAMuI,SAAAA;AAAAA,EAC5B;AAIA,SAHA2B,GAAMlD,WAAW,WAAA;AACf,WAAOmD,GAAOnD,SAAAA;AAAAA,EAChB,GACOkD;AACT,EAAE,SAAUvE,IAAAA;AACV,SAAOuE,MAAMvE,EAAAA;AACf,IACA0E,SAASvC,MAAMuC,WAAW,SAAU1E,IAAAA;AAClC,SAAOA,GAAI2E,gBAAgBxC;AAC7B,GACAU,UAAU,SAAkB7C,IAAAA;AAC1B,SAAOA,OAAQ8C,OAAO9C;AACxB,GACA4E,UAAU,SAAkB5E,IAAAA;AAC1B,SAAOA,OAAQA,KAAM;AACvB,GACA6E,UAAU,SAAkB7E,IAAAA;AAC1B,SAAOA,OAAQA,KAAM;AACvB,GACA8E,WAAW,SAAmB9E;AAC5B,SAAA,UAAOA,MAAAA,SAAiBA;AAC1B,GACA+E,YAAY,SAAoB/E,IAAAA;AAC9B,SAAOA,cAAegF;AACxB,EAAA,GAGEC,IAAkB,CACtB,EACEC,QAAQ3C,EAAOsC,UACfM,aAAa,EACXC,gBAAgB,EACdC,MAAM,SAAcC,IAAAA;AAClB,MAAIC,KAAOD,GAASE,MAAM;AAC1B,SAAa,SAATD,MAGG,EACLvI,OAAO,OACPgF,KAAKyD,SAAS,OAAOF,GAAK,GAAGlE,SAAAA,IAAakE,GAAK,GAAGlE,SAAAA,IAAakE,GAAK,CAAA,EAAGlE,SAAAA,IAAakE,GAAK,CAAA,EAAGlE,SAAAA,IAAakE,GAAK,CAAA,EAAGlE,SAAAA,IAAakE,GAAK,CAAA,EAAGlE,SAAAA,GAAY,CAAA,EAAA;AAEtJ,GACAqE,OAAO3E,EAAAA,GAET4E,cAAc,EACZN,MAAM,SAAcC;AAClB,MAAIC,KAAOD,GAASE,MAAM,mBAAA;AAC1B,SAAa,SAATD,MAGG,EACLvI,OAAO,OACPgF,KAAKyD,SAAS,OAAOF,GAAK,CAAA,EAAGlE,YAAY,CAAA,EAAA;AAE7C,GACAqE,OAAO3E,EAAAA,GAET6E,SAAS,EACPP,MAAM,SAAcC,IAAAA;AAClB,MAAIC,KAAOD,GAASE,MAAM;AAC1B,SAAa,SAATD,MAGG,EACLvI,OAAO,OACPsE,GAAGuE,WAAWN,GAAK,CAAA,CAAA,GACnB/D,GAAGqE,WAAWN,GAAK,KACnB9D,GAAGoE,WAAWN,GAAK,CAAA,CAAA,EAAA;AAEvB,GACAG,OAAO3E,EAAAA,GAET+E,UAAU,EACRT,MAAM,SAAcC;AAClB,MAAIC,KAAOD,GAASE,MAAM;AAC1B,SAAa,SAATD,MAGG,EACLvI,OAAO,OACPsE,GAAGuE,WAAWN,GAAK,CAAA,CAAA,GACnB/D,GAAGqE,WAAWN,GAAK,KACnB9D,GAAGoE,WAAWN,GAAK,CAAA,CAAA,GACnB7D,GAAGmE,WAAWN,GAAK;AAEvB,GACAG,OAAO3E,SAIb,EACEmE,QAAQ3C,EAAOqC,UACfO,aAAa,EACXY,KAAK,EACHV,MAAM,SAAcC,IAAAA;AAClB,SAAO,EACLtI,OAAO,OACPgF,KAAKsD,IACLlE,gBAAgB,MAAA;AAEpB,GACAsE,OAAO,SAAe1E;AACpB,SAAOA,GAAMgB;AACf,EAAA,EAAA,EAAA,GAIN,EACEkD,QAAQ3C,EAAOmC,SACfS,aAAa,EACXa,WAAW,EACTX,MAAM,SAAcC,IAAAA;AAClB,SAAwB,MAApBA,GAASrD,UAGN,EACLjF,OAAO,OACPsE,GAAGgE,GAAS,IACZ9D,GAAG8D,GAAS,IACZ7D,GAAG6D,GAAS;AAEhB,GACAI,OAAO,SAAe1E,IAAAA;AACpB,SAAO,CAACA,GAAMM,GAAGN,GAAMQ,GAAGR,GAAMS,CAAAA;AAClC,EAAA,GAEFwE,YAAY,EACVZ,MAAM,SAAcC,IAAAA;AAClB,SAAwB,MAApBA,GAASrD,UACN,EACLjF,OAAO,OACPsE,GAAGgE,GAAS,IACZ9D,GAAG8D,GAAS,CAAA,GACZ7D,GAAG6D,GAAS,CAAA,GACZ5D,GAAG4D,GAAS,CAAA,EAAA;AAEhB,GACAI,OAAO,SAAe1E,IAAAA;AACpB,SAAO,CAACA,GAAMM,GAAGN,GAAMQ,GAAGR,GAAMS,GAAGT,GAAMU;AAC3C,EAAA,EAAA,EAAA,GAIN,EACEwD,QAAQ3C,EAAOM,UACfsC,aAAa,EACXe,UAAU,EACRb,MAAM,SAAcC,IAAAA;AAClB,SAAA,CAAA,EAAI/C,EAAOqC,SAASU,GAAShE,CAAAA,KAAMiB,EAAOqC,SAASU,GAAS9D,CAAAA,KAAMe,EAAOqC,SAASU,GAAS7D,CAAAA,KAAMc,EAAOqC,SAASU,GAAS5D,CAAAA,MACjH,EACL1E,OAAO,OACPsE,GAAGgE,GAAShE,GACZE,GAAG8D,GAAS9D,GACZC,GAAG6D,GAAS7D,GACZC,GAAG4D,GAAS5D,EAAAA;AAIlB,GACAgE,OAAO,SAAe1E,IAAAA;AACpB,SAAO,EACLM,GAAGN,GAAMM,GACTE,GAAGR,GAAMQ,GACTC,GAAGT,GAAMS,GACTC,GAAGV,GAAMU,EAAAA;AAEb,EAAA,GAEFyE,SAAS,EACPd,MAAM,SAAcC,IAAAA;AAClB,SAAA,CAAA,EAAI/C,EAAOqC,SAASU,GAAShE,CAAAA,KAAMiB,EAAOqC,SAASU,GAAS9D,CAAAA,KAAMe,EAAOqC,SAASU,GAAS7D,OAClF,EACLzE,OAAO,OACPsE,GAAGgE,GAAShE,GACZE,GAAG8D,GAAS9D,GACZC,GAAG6D,GAAS7D,EAAAA;AAIlB,GACAiE,OAAO,SAAe1E,IAAAA;AACpB,SAAO,EACLM,GAAGN,GAAMM,GACTE,GAAGR,GAAMQ,GACTC,GAAGT,GAAMS,EAAAA;AAEb,EAAA,GAEF2E,UAAU,EACRf,MAAM,SAAcC,IAAAA;AAClB,SAAA,CAAA,EAAI/C,EAAOqC,SAASU,GAAS3D,CAAAA,KAAMY,EAAOqC,SAASU,GAAS1D,CAAAA,KAAMW,EAAOqC,SAASU,GAASxD,MAAMS,EAAOqC,SAASU,GAAS5D,CAAAA,MACjH,EACL1E,OAAO,OACP2E,GAAG2D,GAAS3D,GACZC,GAAG0D,GAAS1D,GACZE,GAAGwD,GAASxD,GACZJ,GAAG4D,GAAS5D,EAAAA;AAIlB,GACAgE,OAAO,SAAe1E,IAAAA;AACpB,SAAO,EACLW,GAAGX,GAAMW,GACTC,GAAGZ,GAAMY,GACTE,GAAGd,GAAMc,GACTJ,GAAGV,GAAMU,EAAAA;AAEb,EAAA,GAEF2E,SAAS,EACPhB,MAAM,SAAcC,IAAAA;AAClB,SAAA,CAAA,EAAI/C,EAAOqC,SAASU,GAAS3D,MAAMY,EAAOqC,SAASU,GAAS1D,CAAAA,KAAMW,EAAOqC,SAASU,GAASxD,CAAAA,MAClF,EACL9E,OAAO,OACP2E,GAAG2D,GAAS3D,GACZC,GAAG0D,GAAS1D,GACZE,GAAGwD,GAASxD,EAAAA;AAIlB,GACA4D,OAAO,SAAe1E,IAAAA;AACpB,SAAO,EACLW,GAAGX,GAAMW,GACTC,GAAGZ,GAAMY,GACTE,GAAGd,GAAMc,EAAAA;AAEb,UAIFwE,IAAAA,QACAC,YACAC,IAAY;AACdD,MAAAA;AACA,MAAIjB,KAAW1C,UAAUX,SAAS,IAAIM,EAAO8B,QAAQzB,SAAAA,IAAaA,UAAU,CAAA;AAe5E,SAdAL,EAAOG,KAAKuC,GAAiB,SAAUwB,IAAAA;AACrC,QAAIA,GAAOvB,OAAOI,EAAAA,EAUhB,QATA/C,EAAOG,KAAK+D,GAAOtB,aAAa,SAAUuB,IAAYtF,IAAAA;AAEpD,UADAkF,IAASI,GAAWrB,KAAKC,EAAAA,GAAAA,UACrBiB,KAAAA,UAAsBD,EAIxB,QAHAC,IAAWD,GACXA,EAAOlF,iBAAiBA,IACxBkF,EAAOI,aAAaA,IACbnE,EAAOC;AAAAA,IAElB,IACOD,EAAOC;AAAAA,EAElB,IACO+D;AACT,GAEII,IAAAA,QACAC,IAAY,EACdC,YAAY,SAAoBlF,IAAGC,IAAGE;AACpC,MAAIgF,KAAKrK,KAAKsK,MAAMpF,KAAI,EAAA,IAAM,GAC1BqF,KAAIrF,KAAI,KAAKlF,KAAKsK,MAAMpF,KAAI,EAAA,GAC5BsF,KAAInF,MAAK,IAAMF,KACfsF,KAAIpF,MAAK,IAAMkF,KAAIpF,KACnBuF,KAAIrF,MAAK,KAAO,IAAMkF,MAAKpF,KAC3BwF,KAAI,CAAC,CAACtF,IAAGqF,IAAGF,EAAAA,GAAI,CAACC,IAAGpF,IAAGmF,KAAI,CAACA,IAAGnF,IAAGqF,EAAAA,GAAI,CAACF,IAAGC,IAAGpF,EAAAA,GAAI,CAACqF,IAAGF,IAAGnF,EAAAA,GAAI,CAACA,IAAGmF,IAAGC,EAAAA,CAAAA,EAAIJ;AAC3E,SAAO,EACLxF,GAAU,MAAP8F,GAAE,CAAA,GACL5F,GAAU,MAAP4F,GAAE,CAAA,GACL3F,GAAU,MAAP2F,GAAE;AAET,GACAC,YAAY,SAAoB/F,IAAGE,IAAGC;AACpC,MAAI6F,KAAM7K,KAAK6K,IAAIhG,IAAGE,IAAGC,EAAAA,GACrB8F,KAAM9K,KAAK8K,IAAIjG,IAAGE,IAAGC,EAAAA,GACrBnG,KAAQiM,KAAMD,IACd3F,KAAAA;AAEJ,SAAY,MAAR4F,KAGK,EACL5F,GAAG6F,KACH5F,GAAG,GACHE,GAAG,EAAA,KAILH,KADEL,OAAMiG,MACH/F,KAAIC,MAAKnG,KACLkG,OAAM+F,KACX,KAAK9F,KAAIH,MAAKhG,KAEd,KAAKgG,KAAIE,MAAKlG,KAEpBqG,MAAK,KACG,MACNA,MAAK,IAEA,EACLA,GAAO,MAAJA,IACHC,GArBItG,KAAQiM,IAsBZzF,GAAGyF,KAAM;AAEb,GACAE,YAAY,SAAoBnG,IAAGE,IAAGC,IAAAA;AACpC,MAAIO,KAAM3H,KAAKqN,mBAAmB,GAAG,GAAGpG,EAAAA;AAGxC,SAFAU,KAAM3H,KAAKqN,mBAAmB1F,IAAK,GAAGR,EAAAA,GACtCQ,KAAM3H,KAAKqN,mBAAmB1F,IAAK,GAAGP,EAAAA;AAExC,GACAkG,oBAAoB,SAA4B3F,IAAK4F;AACnD,SAAO5F,MAAwB,IAAjB4F,KAAqB;AACrC,GACAF,oBAAoB,SAA4B1F,IAAK4F,IAAgBC;AACnE,SAAOA,OAAUlB,IAAgC,IAAjBiB,MAAsB5F,KAAAA,EAAQ,OAAQ2E;AACxE,EAAA,GAGEmB,IAA4B,qBAAXC,UAAoD,YAAA,OAApBA,OAAOC,WAAwB,SAAUhI,IAAAA;AAC5F,SAAA,OAAcA;AAChB,IAAI,SAAUA;AACZ,SAAOA,MAAyB,qBAAX+H,UAAyB/H,GAAI2E,gBAAgBoD,UAAU/H,OAAQ+H,OAAO1M,YAAY,WAAA,OAAkB2E;AAC3H,GAYIiI,IAAiB,SAAUC,IAAUC,IAAAA;AACvC,MAAA,EAAMD,cAAoBC,IACxB,OAAM,IAAIC,UAAU,mCAAA;AAExB,GAEIC,IAAc,2BAAA;AAChB,WAASC,GAAiBtJ,IAAQuJ;AAChC,aAASxI,KAAI,GAAGA,KAAIwI,GAAMtG,QAAQlC,MAAK;AACrC,UAAIyI,KAAaD,GAAMxI,EAAAA;AACvByI,MAAAA,GAAWC,aAAaD,GAAWC,qBACnCD,GAAWE,qBACP,WAAWF,OAAYA,GAAWG,WAAAA,OACtC7F,OAAO8F,eAAe5J,IAAQwJ,GAAWxF,KAAKwF,EAAAA;AAAAA,IAChD;AAAA,EACF;AAEA,SAAO,SAAUL,IAAaU,IAAYC,IAAAA;AAGxC,WAFID,MAAYP,GAAiBH,GAAY9M,WAAWwN,KACpDC,MAAaR,GAAiBH,IAAaW,EAAAA,GACxCX;AAAAA,EACT;AACF,EAhBkB,GAwBdY,IAAM,SAASA,GAAI9I,IAAQ+I,IAAUC;AACxB,WAAXhJ,OAAiBA,KAAS+E,SAAS3J;AACvC,MAAI6N,KAAOpG,OAAOqG,yBAAyBlJ,IAAQ+I,EAAAA;AAEnD,iBAAIE,IAAoB;AACtB,QAAI1I,KAASsC,OAAOsG,eAAenJ;AAEnC,WAAe,SAAXO,cAGKuI,GAAIvI,IAAQwI,IAAUC,EAAAA;AAAAA,EAEjC;AAAO,MAAI,WAAWC,GACpB,QAAOA,GAAKrB;AAEZ,MAAIwB,KAASH,GAAKH;AAElB,SAAA,WAAIM,KAIGA,GAAO1G,KAAKsG;AAEvB,GAEIK,IAAW,SAAUC,IAAUC;AACjC,MAA0B,cAAA,OAAfA,MAA4C,SAAfA,GACtC,OAAM,IAAIpB,UAAU,oEAAoEoB,EAAAA;AAG1FD,EAAAA,GAASlO,YAAYyH,OAAO2G,OAAOD,MAAcA,GAAWnO,WAAW,EACrEsJ,aAAa,EACXkD,OAAO0B,IACPd,YAAAA,OACAE,gBACAD,cAAAA,WAGAc,OAAY1G,OAAO4G,iBAAiB5G,OAAO4G,eAAeH,IAAUC,EAAAA,IAAcD,GAASI,YAAYH;AAC7G,GAYII,KAA4B,SAAUC,IAAMlH,IAAAA;AAC9C,MAAA,CAAKkH,GACH,OAAM,IAAIC,eAAe,2DAAA;AAG3B,SAAA,CAAOnH,MAAyB,YAAA,OAATA,MAAqC,qBAATA,KAA8BkH,KAAPlH;AAC5E,GAEIoH,KAAQ,WAAA;AACV,WAASA;AAGP,QAFA9B,EAAe5N,MAAM0P,EAAAA,GACrB1P,KAAK8G,UAAUqF,EAAUjD,MAAMlJ,MAAMuI,SAAAA,GAAAA,UACjCvI,KAAK8G,QACP,OAAM,IAAI6I,MAAM,qCAAA;AAElB3P,SAAK8G,QAAQO,IAAIrH,KAAK8G,QAAQO,KAAK;AAAA,EACrC;AAiBA,SAhBA2G,EAAY0B,IAAO,CAAC,EAClB/G,KAAK,YACL6E,OAAO;AACL,WAAO9G,EAAc1G;EACvB,EAAA,GACC,EACD2I,KAAK,eACL6E,OAAO,WAAA;AACL,WAAO9G,EAAc1G,MAAAA,IAAM;AAAA,EAC7B,KACC,EACD2I,KAAK,cACL6E,OAAO;AACL,WAAOxN,KAAK8G,QAAQuF,WAAWhB,MAAMrL;EACvC,EAAA,CAAA,CAAA,GAEK0P;AACT,EA1BY;AA2BZ,SAASE,GAAmBjL,IAAQkL,IAAWC,IAAAA;AAC7CrH,SAAO8F,eAAe5J,IAAQkL,IAAW,EACvCnB,KAAK,WAAA;AACH,WAA2B,UAAvB1O,KAAK8G,QAAQnE,SAGjB+M,GAAMK,eAAe/P,MAAM6P,IAAWC,EAAAA,GAF7B9P,KAAK8G,QAAQ+I,EAAAA;AAAAA,EAIxB,GACAG,KAAK,SAAgBvI,IAAAA;AACQ,cAAvBzH,KAAK8G,QAAQnE,UACf+M,GAAMK,eAAe/P,MAAM6P,IAAWC,KACtC9P,KAAK8G,QAAQnE,QAAQ,QAEvB3C,KAAK8G,QAAQ+I,EAAAA,IAAapI;AAAAA,EAC5B,EAAA,CAAA;AAEJ;AACA,SAASwI,GAAmBtL,IAAQkL;AAClCpH,SAAO8F,eAAe5J,IAAQkL,IAAW,EACvCnB,KAAK,WAAA;AACH,WAA2B,UAAvB1O,KAAK8G,QAAQnE,SAGjB+M,GAAMQ,eAAelQ,IAAAA,GAFZA,KAAK8G,QAAQ+I,EAAAA;AAAAA,EAIxB,GACAG,KAAK,SAAgBvI,IAAAA;AACQ,cAAvBzH,KAAK8G,QAAQnE,UACf+M,GAAMQ,eAAelQ,IAAAA,GACrBA,KAAK8G,QAAQnE,QAAQ,QAEvB3C,KAAK8G,QAAQ+I,EAAAA,IAAapI;AAAAA,EAC5B,EAAA,CAAA;AAEJ;AACAiI,GAAMK,iBAAiB,SAAUpJ,IAAOkJ,IAAWC;AACjD,MAA4B,UAAxBnJ,GAAMG,QAAQnE,MAChBgE,CAAAA,GAAMG,QAAQ+I,EAAAA,IAAatD,EAAUe,mBAAmB3G,GAAMG,QAAQa,KAAKmI,EAAAA;AAAAA,OACtE;AAAA,QAA4B,UAAxBnJ,GAAMG,QAAQnE,MAGvB,OAAM,IAAIgN,MAAM;AAFhBzH,MAAOE,OAAOzB,GAAMG,SAASyF,EAAUC,WAAW7F,GAAMG,QAAQQ,GAAGX,GAAMG,QAAQS,GAAGZ,GAAMG,QAAQW,CAAAA,CAAAA;AAAAA,EAGpG;AACF,GACAiI,GAAMQ,iBAAiB,SAAUvJ,IAAAA;AAC/B,MAAIsF,KAASM,EAAUS,WAAWrG,GAAMM,GAAGN,GAAMQ,GAAGR,GAAMS;AAC1Dc,IAAOE,OAAOzB,GAAMG,SAAS,EAC3BS,GAAG0E,GAAO1E,GACVE,GAAGwE,GAAOxE,MAEPS,EAAOgC,MAAM+B,GAAO3E,CAAAA,IAEdY,EAAOU,YAAYjC,GAAMG,QAAQQ,CAAAA,MAC1CX,GAAMG,QAAQQ,IAAI,KAFlBX,GAAMG,QAAQQ,IAAI2E,GAAO3E;AAI7B,GACAoI,GAAMS,aAAa,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,GAAA,GACzDP,GAAmBF,GAAM1O,WAAW,KAAK,CAAA,GACzC4O,GAAmBF,GAAM1O,WAAW,KAAK,CAAA,GACzC4O,GAAmBF,GAAM1O,WAAW,KAAK,IACzCiP,GAAmBP,GAAM1O,WAAW,GAAA,GACpCiP,GAAmBP,GAAM1O,WAAW,MACpCiP,GAAmBP,GAAM1O,WAAW,GAAA,GACpCyH,OAAO8F,eAAemB,GAAM1O,WAAW,KAAK,EAC1C0N,KAAK,WAAA;AACH,SAAO1O,KAAK8G,QAAQO;AACtB,GACA2I,KAAK,SAAgBvI;AACnBzH,OAAK8G,QAAQO,IAAII;AACnB,EAAA,CAAA,GAEFgB,OAAO8F,eAAemB,GAAM1O,WAAW,OAAO,EAC5C0N,KAAK,WAAA;AAKH,SAJ2B,UAAvB1O,KAAK8G,QAAQnE,UACf3C,KAAK8G,QAAQa,MAAM4E,EAAUa,WAAWpN,KAAKiH,GAAGjH,KAAKmH,GAAGnH,KAAKoH,CAAAA,GAC7DpH,KAAK8G,QAAQnE,QAAQ,QAEhB3C,KAAK8G,QAAQa;AACtB,GACAqI,KAAK,SAAgBvI,IAAAA;AACnBzH,OAAK8G,QAAQnE,QAAQ,OACrB3C,KAAK8G,QAAQa,MAAMF;AACrB,EAAA,CAAA;AAGF,IAAI2I,KAAa,WAAA;AACf,WAASA,GAAWxK,IAAQ+I,IAAAA;AAC1Bf,MAAe5N,MAAMoQ,KACrBpQ,KAAKqQ,eAAezK,GAAO+I,EAAAA,GAC3B3O,KAAKsQ,aAAaC,SAASC,cAAc,KAAA,GACzCxQ,KAAK4F,SAASA,IACd5F,KAAK2O,WAAWA,IAChB3O,KAAKyQ,qBACLzQ,KAAK0Q,mBAAAA;AAAAA,EACP;AAuCA,SAtCA1C,EAAYoC,IAAY,CAAC,EACvBzH,KAAK,YACL6E,OAAO,SAAkBhE,IAAAA;AAEvB,WADAxJ,KAAKyQ,aAAajH,IACXxJ;AAAAA,EACT,EAAA,GACC,EACD2I,KAAK,kBACL6E,OAAO,SAAwBhE,IAAAA;AAE7B,WADAxJ,KAAK0Q,mBAAmBlH,IACjBxJ;AAAAA,EACT,EAAA,GACC,EACD2I,KAAK,YACL6E,OAAO,SAAkBmD;AAMvB,WALA3Q,KAAK4F,OAAO5F,KAAK2O,QAAAA,IAAYgC,IACzB3Q,KAAKyQ,cACPzQ,KAAKyQ,WAAWnI,KAAKtI,MAAM2Q,EAAAA,GAE7B3Q,KAAK4Q,cAAAA,GACE5Q;AAAAA,EACT,KACC,EACD2I,KAAK,YACL6E,OAAO,WAAA;AACL,WAAOxN,KAAK4F,OAAO5F,KAAK2O,QAAAA;AAAAA,EAC1B,EAAA,GACC,EACDhG,KAAK,iBACL6E,OAAO,WAAA;AACL,WAAOxN;AAAAA,EACT,EAAA,GACC,EACD2I,KAAK,cACL6E,OAAO,WAAA;AACL,WAAOxN,KAAKqQ,iBAAiBrQ,KAAK6Q,SAAAA;AAAAA,EACpC,EAAA,CAAA,CAAA,GAEKT;AACT,EAjDiB,GAwDbU,KAAgB,CAAA;AACpB5I,EAAOG,KANS,EACd0I,YAAY,CAAC,WACbC,aAAa,CAAC,SAAS,aAAa,aAAa,WAAW,WAAA,GAC5DC,gBAAgB,CAAC,SAAA,EAAA,GAGI,SAAUxJ,IAAGyJ,IAAAA;AAClChJ,IAAOG,KAAKZ,IAAG,SAAU0J,IAAAA;AACvBL,OAAcK,MAAKD;AAAAA,EACrB,CAAA;AACF;AACA,IAAIE,KAAmB;AACvB,SAASC,GAAiBC,IAAAA;AACxB,MAAY,QAARA,MAAepJ,EAAOU,YAAY0I,EAAAA,EACpC,QAAO;AAET,MAAInG,KAAQmG,GAAInG,MAAMiG;AACtB,SAAKlJ,EAAO+B,OAAOkB,EAAAA,IAGZ,IAFEK,WAAWL,GAAM,CAAA,CAAA;AAG5B;AACA,IAAIoG,KAAM,EACRC,gBAAgB,SAAwBC,IAAMC,IAAAA;AAAAA,aACxCD,iBAAsBA,GAAKE,UAC/BF,GAAKG,gBAAgBF,KAAa,WAAA;AAChC;EACF,IAAI;EAAa,GACjBD,GAAKE,MAAME,gBAAgBH,KAAa,SAAS,QACjDD,GAAKE,MAAMG,kBAAkBJ,KAAa,SAAS,QACnDD,GAAKM,eAAeL,KAAa,OAAO;AAC1C,GACAM,gBAAgB,SAAwBP,IAAMQ,IAAKC,IAAAA;AACjD,MAAIC,KAAWD,IACXE,KAAaH;AACb/J,IAAOU,YAAYwJ,EAAAA,MACrBA,KAAAA,OAEElK,EAAOU,YAAYuJ,EAAAA,MACrBA,KAAAA,OAEFV,GAAKE,MAAMU,WAAW,YAClBD,OACFX,GAAKE,MAAMW,OAAO,GAClBb,GAAKE,MAAMY,QAAQ,IAEjBJ,OACFV,GAAKE,MAAMa,MAAM,GACjBf,GAAKE,MAAMc,SAAS;AAExB,GACAC,WAAW,SAAmBjB,IAAMkB,IAAWC,IAAMC,IAAAA;AACnD,MAAIC,KAASF,MAAQ,CAAA,GACjBG,KAAYjC,GAAc6B;AAC9B,MAAA,CAAKI,GACH,OAAM,IAAIpD,MAAM,gBAAgBgD,KAAY;AAE9C,MAAIK,KAAMzC,SAAS0C,YAAYF,EAAAA;AAC/B,UAAQA,IAAAA;AAAAA,IACN,KAAK;AAED,UAAIG,KAAUJ,GAAOK,KAAKL,GAAOI,WAAW,GACxCE,KAAUN,GAAOO,KAAKP,GAAOM,WAAW;AAC5CJ,MAAAA,GAAIM,eAAeX,IAAWG,GAAOS,WAAAA,OAAkBT,GAAOU,cAAAA,MAAoBC,QAAQX,GAAOY,cAAc,GAAG,GAClH,GACAR,IACAE,IAAAA,cACO,OAAO,OAAc,GAAG;AAC/B;AAAA,IAEJ,KAAK;AAED,UAAIO,KAAOX,GAAIY,qBAAqBZ,GAAIa;AACxC3L,QAAOY,SAASgK,IAAQ,EACtBU,kBACAM,SAAAA,OACAC,QAAAA,OACAC,UAAAA,OACAC,gBACAC,SAAAA,QACAC,UAAAA,OAAUC,CAAAA,GAEZT,GAAKhB,IAAWG,GAAOS,kBAAkBT,GAAOU,YAAYC,QAAQX,GAAOgB,SAAShB,GAAOiB,QAAQjB,GAAOkB,UAAUlB,GAAOmB,SAASnB,GAAOoB,SAASpB,GAAOqB,QAAAA;AAC3J;AAAA,IAEJ;AAEInB,MAAAA,GAAIqB,UAAU1B,IAAWG,GAAOS,WAAAA,OAAkBT,GAAOU,cAAAA,IAAc;AAAA,EAAA;AAI7EtL,IAAOY,SAASkK,IAAKH,KACrBpB,GAAK6C,cAActB,EAAAA;AACrB,GACAnK,MAAM,SAAc4I,IAAM9P,IAAOgI,IAAM4K,IAAAA;AACrC,MAAIC,KAAOD,MAAAA;AAMX,SALI9C,GAAKgD,mBACPhD,GAAKgD,iBAAiB9S,IAAOgI,IAAM6K,EAAAA,IAC1B/C,GAAKiD,eACdjD,GAAKiD,YAAY,OAAO/S,IAAOgI,EAAAA,GAE1B4H;AACT,GACAoD,QAAQ,SAAgBlD,IAAM9P,IAAOgI,IAAM4K,IAAAA;AACzC,MAAIC,KAAOD,MAAAA;AAMX,SALI9C,GAAKmD,sBACPnD,GAAKmD,oBAAoBjT,IAAOgI,IAAM6K,EAAAA,IAC7B/C,GAAKoD,eACdpD,GAAKoD,YAAY,OAAOlT,IAAOgI,KAE1B4H;AACT,GACAuD,UAAU,SAAkBrD,IAAMsB;AAChC,MAAA,WAAItB,GAAKsB,UACPtB,CAAAA,GAAKsB,YAAYA;AAAAA,WACRtB,GAAKsB,cAAcA,IAAW;AACvC,QAAIgC,KAAUtD,GAAKsB,UAAUiC,MAAM,IAAA;AAAA,WAC/BD,GAAQE,QAAQlC,QAClBgC,GAAQjU,KAAKiS,KACbtB,GAAKsB,YAAYgC,GAAQG,KAAK,GAAA,EAAKC,QAAQ,QAAQ,IAAIA,QAAQ,QAAQ;EAE3E;AACA,SAAO5D;AACT,GACA6D,aAAa,SAAqB3D,IAAMsB,IAAAA;AACtC,MAAIA,GACF,KAAItB,GAAKsB,cAAcA,GACrBtB,CAAAA,GAAK4D,gBAAgB,OAAA;AAAA,OAChB;AACL,QAAIN,KAAUtD,GAAKsB,UAAUiC,MAAM,IAAA,GAC/BM,KAAQP,GAAQE,QAAQlC,EAAAA;AAAAA,WACxBuC,OACFP,GAAQQ,OAAOD,IAAO,CAAA,GACtB7D,GAAKsB,YAAYgC,GAAQG,KAAK,GAAA;AAAA,EAElC;AAAA,MAEAzD,CAAAA,GAAKsB,YAAAA;AAEP,SAAOxB;AACT,GACAiE,UAAU,SAAkB/D,IAAMsB,IAAAA;AAChC,SAAO,IAAI0C,OAAO,eAAe1C,KAAY,YAAA,EAAc7H,KAAKuG,GAAKsB,SAAAA,KAAAA;AACvE,GACA2C,UAAU,SAAkBjE,IAAAA;AAC1B,MAAIE,KAAQgE,iBAAiBlE,EAAAA;AAC7B,SAAOJ,GAAiBM,GAAM,wBAAwBN,GAAiBM,GAAM,oBAAA,CAAA,IAAyBN,GAAiBM,GAAM,cAAA,CAAA,IAAmBN,GAAiBM,GAAM,eAAA,CAAA,IAAoBN,GAAiBM,GAAMvQ,KAAAA;AACpN,GACAwU,WAAW,SAAmBnE;AAC5B,MAAIE,KAAQgE,iBAAiBlE,EAAAA;AAC7B,SAAOJ,GAAiBM,GAAM,kBAAA,CAAA,IAAuBN,GAAiBM,GAAM,qBAAA,CAAA,IAA0BN,GAAiBM,GAAM,aAAA,CAAA,IAAkBN,GAAiBM,GAAM,gBAAA,CAAA,IAAqBN,GAAiBM,GAAMtQ,MAAAA;AACpN,GACAwU,WAAW,SAAmBC,IAAAA;AAC5B,MAAIrE,KAAOqE,IACPC,KAAS,EAAEzD,MAAM,GAAGE,KAAK,EAAA;AAC7B,MAAIf,GAAKuE,aACP;AACED,IAAAA,GAAOzD,QAAQb,GAAKwE,YACpBF,GAAOvD,OAAOf,GAAKyE,WACnBzE,KAAOA,GAAKuE;AAAAA,WACLvE;AAEX,SAAOsE;AACT,GACAI,UAAU,SAAkB1E,IAAAA;AAC1B,SAAOA,OAASlB,SAAS6F,kBAAkB3E,GAAKrL,QAAQqL,GAAK4E;AAC/D,EAAA,GAGEC,KAAoB,WAAA;AAEtB,WAASA,GAAkB1Q,IAAQ+I,IAAAA;AACjCf,MAAe5N,MAAMsW,EAAAA;AACrB,QAAIC,KAAShH,GAA0BvP,OAAOsW,GAAkBhH,aAAa7G,OAAOsG,eAAeuH,KAAoBhO,KAAKtI,MAAM4F,IAAQ+I,EAAAA,CAAAA,GACtI6H,KAAQD;AAUZ,WATAA,GAAOE,SAASF,GAAO1F,YACvB0F,GAAOG,aAAanG,SAASC,cAAc,OAAA,GAC3C+F,GAAOG,WAAWC,aAAa,QAAQ,UAAA,GAIvCpF,GAAI1I,KAAK0N,GAAOG,YAAY,UAH5B,WAAA;AACEF,MAAAA,GAAMI,SAAAA,CAAUJ,GAAMC;IACxB,GAAA,KACgD,GAChDF,GAAOjG,WAAWuG,YAAYN,GAAOG,UAAAA,GACrCH,GAAO3F,cAAAA,GACA2F;AAAAA,EACT;AAyBA,SAxCAtH,EAASqH,IAyCTlG,EAAAA,GAzBApC,EAAYsI,IAAmB,CAAC,EAC9B3N,KAAK,YACL6E,OAAO,SAAkB/F,IAAAA;AACvB,QAAIyE,KAAWwC,EAAI4H,GAAkBtV,UAAUsO,aAAa7G,OAAOsG,eAAeuH,GAAkBtV,YAAY,YAAYhB,IAAAA,EAAMsI,KAAKtI,MAAMyH,EAAAA;AAK7I,WAJIzH,KAAK0Q,oBACP1Q,KAAK0Q,iBAAiBpI,KAAKtI,MAAMA,KAAK6Q,aAExC7Q,KAAKyW,SAASzW,KAAK6Q,SAAAA,GACZ3E;AAAAA,EACT,EAAA,GACC,EACDvD,KAAK,iBACL6E,OAAO;AASL,WAAA,SARIxN,KAAK6Q,SAAAA,KACP7Q,KAAK0W,WAAWC,aAAa,WAAW,SAAA,GACxC3W,KAAK0W,WAAWI,UAAAA,MAChB9W,KAAKyW,SAAAA,SAELzW,KAAK0W,WAAWI,UAAAA,OAChB9W,KAAKyW,SAAAA,QAEA/H,EAAI4H,GAAkBtV,UAAUsO,aAAa7G,OAAOsG,eAAeuH,GAAkBtV,YAAY,iBAAiBhB,IAAAA,EAAMsI,KAAKtI,IAAAA;AAAAA,EACtI,EAAA,CAAA,CAAA,GAEKsW;AACT,EA1CwB,GA4CpBS,KAAmB,WAAA;AAErB,WAASA,GAAiBnR,IAAQ+I,IAAUqI,IAAAA;AAC1CpJ,MAAe5N,MAAM+W,EAAAA;AACrB,QAAIR,KAAShH,GAA0BvP,OAAO+W,GAAiBzH,aAAa7G,OAAOsG,eAAegI,EAAAA,GAAmBzO,KAAKtI,MAAM4F,IAAQ+I,MACpIsI,KAAUD,IACVR,KAAQD;AAEZ,QADAA,GAAOW,WAAW3G,SAASC,cAAc,QAAA,GACrCtI,EAAOmC,QAAQ4M,EAAAA,GAAU;AAC3B,UAAIE,KAAM,CAAA;AACVjP,QAAOG,KAAK4O,IAAS,SAAUG,IAAAA;AAC7BD,QAAAA,GAAIC,MAAWA;AAAAA,MACjB,CAAA,GACAH,KAAUE;AAAAA,IACZ;AAaA,WAZAjP,EAAOG,KAAK4O,IAAS,SAAUzJ,IAAO7E,IAAAA;AACpC,UAAI0O,KAAM9G,SAASC,cAAc;AACjC6G,MAAAA,GAAIC,YAAY3O,IAChB0O,GAAIV,aAAa,SAASnJ,EAAAA,GAC1BgJ,GAAMU,SAASL,YAAYQ,EAAAA;AAAAA,IAC7B,IACAd,GAAO3F,cAAAA,GACPW,GAAI1I,KAAK0N,GAAOW,UAAU,UAAU;AAClC,UAAIK,KAAevX,KAAKiX,QAAQjX,KAAKwX,aAAAA,EAAehK;AACpDgJ,MAAAA,GAAMI,SAASW,EAAAA;AAAAA,IACjB,IACAhB,GAAOjG,WAAWuG,YAAYN,GAAOW,QAAAA,GAC9BX;AAAAA,EACT;AAkBA,SA7CAtH,EAAS8H,IA8CT3G,KAlBApC,EAAY+I,IAAkB,CAAC,EAC7BpO,KAAK,YACL6E,OAAO,SAAkB/F;AACvB,QAAIyE,KAAWwC,EAAIqI,GAAiB/V,UAAUsO,aAAa7G,OAAOsG,eAAegI,GAAiB/V,SAAAA,GAAY,YAAYhB,IAAAA,EAAMsI,KAAKtI,MAAMyH,EAAAA;AAI3I,WAHIzH,KAAK0Q,oBACP1Q,KAAK0Q,iBAAiBpI,KAAKtI,MAAMA,KAAK6Q,SAAAA,CAAAA,GAEjC3E;AAAAA,EACT,EAAA,GACC,EACDvD,KAAK,iBACL6E,OAAO,WAAA;AACL,WAAI+D,GAAI4E,SAASnW,KAAKkX,YAAkBlX,QACxCA,KAAKkX,SAAS1J,QAAQxN,KAAK6Q,YACpBnC,EAAIqI,GAAiB/V,UAAUsO,aAAa7G,OAAOsG,eAAegI,GAAiB/V,SAAAA,GAAY,iBAAiBhB,IAAAA,EAAMsI,KAAKtI,IAAAA;AAAAA,EACpI,EAAA,CAAA,CAAA,GAEK+W;AACT,EA/CuB,GAiDnBU,KAAmB,WAAA;AAErB,WAASA,GAAiB7R,IAAQ+I,IAAAA;AAChCf,MAAe5N,MAAMyX;AACrB,QAAIlB,KAAShH,GAA0BvP,OAAOyX,GAAiBnI,aAAa7G,OAAOsG,eAAe0I,EAAAA,GAAmBnP,KAAKtI,MAAM4F,IAAQ+I,EAAAA,CAAAA,GACpI6H,KAAQD;AACZ,aAASmB;AACPlB,MAAAA,GAAMI,SAASJ,GAAMmB,QAAQnK,KAAAA;AAAAA,IAC/B;AAkBA,WAZA+I,GAAOoB,UAAUpH,SAASC,cAAc,UACxC+F,GAAOoB,QAAQhB,aAAa,QAAQ,SACpCpF,GAAI1I,KAAK0N,GAAOoB,SAAS,SAASD,KAClCnG,GAAI1I,KAAK0N,GAAOoB,SAAS,UAAUD,EAAAA,GACnCnG,GAAI1I,KAAK0N,GAAOoB,SAAS,QATzB,WAAA;AACMnB,MAAAA,GAAM9F,oBACR8F,GAAM9F,iBAAiBpI,KAAKkO,IAAOA,GAAM3F,SAAAA,CAAAA;AAAAA,IAE7C,CAAA,GAMAU,GAAI1I,KAAK0N,GAAOoB,SAAS,WAAW,SAAUxG;AAC1B,aAAdA,GAAE+C,WACJlU,KAAK4X,KAAAA;AAAAA,IAET,IACArB,GAAO3F,cAAAA,GACP2F,GAAOjG,WAAWuG,YAAYN,GAAOoB,OAAAA,GAC9BpB;AAAAA,EACT;AAUA,SApCAtH,EAASwI,IAqCTrH,EAAAA,GAVApC,EAAYyJ,IAAkB,CAAC,EAC7B9O,KAAK,iBACL6E,OAAO,WAAA;AAIL,WAHK+D,GAAI4E,SAASnW,KAAK2X,OAAAA,MACrB3X,KAAK2X,QAAQnK,QAAQxN,KAAK6Q,SAAAA,IAErBnC,EAAI+I,GAAiBzW,UAAUsO,aAAa7G,OAAOsG,eAAe0I,GAAiBzW,YAAY,iBAAiBhB,IAAAA,EAAMsI,KAAKtI,IAAAA;AAAAA,EACpI,EAAA,CAAA,CAAA,GAEKyX;AACT,EAtCuB;AAwCvB,SAASI,GAAY1E;AACnB,MAAI/I,KAAK+I,GAAEnM,SAAAA;AACX,SAAIoD,GAAG6K,QAAQ,GAAA,IAAA,KACN7K,GAAGxC,SAASwC,GAAG6K,QAAQ,OAAO,IAEhC;AACT;AACA,IAAI6C,KAAmB,WAAA;AAErB,WAASA,GAAiBlS,IAAQ+I,IAAUmE;AAC1ClF,MAAe5N,MAAM8X;AACrB,QAAItB,KAAQjH,GAA0BvP,OAAO8X,GAAiBxI,aAAa7G,OAAOsG,eAAe+I,KAAmBxP,KAAKtI,MAAM4F,IAAQ+I,EAAAA,CAAAA,GACnIoJ,KAAUjF,MAAU,CAAA;AAcxB,WAbA0D,GAAMwB,QAAQD,GAAQ9K,KACtBuJ,GAAMyB,QAAQF,GAAQ7K,KACtBsJ,GAAM0B,SAASH,GAAQI,MACnBjQ,EAAOU,YAAY4N,GAAM0B,UACA,MAAvB1B,GAAMnG,eACRmG,GAAM4B,gBAAgB,IAEtB5B,GAAM4B,gBAAgBhW,KAAKiW,IAAI,IAAIjW,KAAKsK,MAAMtK,KAAKkW,IAAIlW,KAAKmW,IAAI/B,GAAMnG,YAAAA,CAAAA,IAAiBjO,KAAKoW,IAAAA,CAAAA,IAAS,KAGvGhC,GAAM4B,gBAAgB5B,GAAM0B,QAE9B1B,GAAMiC,cAAcZ,GAAYrB,GAAM4B,gBAC/B5B;AAAAA,EACT;AAoCA,SAvDAvH,EAAS6I,IAwDT1H,EAAAA,GApCApC,EAAY8J,IAAkB,CAAC,EAC7BnP,KAAK,YACL6E,OAAO,SAAkB/F,IAAAA;AACvB,QAAIiR,KAAKjR;AAST,sBARIzH,KAAKgY,SAAuBU,KAAK1Y,KAAKgY,QACxCU,KAAK1Y,KAAKgY,mBACDhY,KAAKiY,SAAuBS,KAAK1Y,KAAKiY,UAC/CS,KAAK1Y,KAAKiY,mBAERjY,KAAKkY,UAAwBQ,KAAK1Y,KAAKkY,WAAW,MACpDQ,KAAKtW,KAAK8E,MAAMwR,KAAK1Y,KAAKkY,MAAAA,IAAUlY,KAAKkY,SAEpCxJ,EAAIoJ,GAAiB9W,UAAUsO,aAAa7G,OAAOsG,eAAe+I,GAAiB9W,SAAAA,GAAY,YAAYhB,IAAAA,EAAMsI,KAAKtI,MAAM0Y,EAAAA;AAAAA,EACrI,EAAA,GACC,EACD/P,KAAK,OACL6E,OAAO,SAAamL,IAAAA;AAElB,WADA3Y,KAAKgY,QAAQW,IACN3Y;AAAAA,EACT,EAAA,GACC,EACD2I,KAAK,OACL6E,OAAO,SAAaoL,IAAAA;AAElB,WADA5Y,KAAKiY,QAAQW,IACN5Y;AAAAA,EACT,KACC,EACD2I,KAAK,QACL6E,OAAO,SAAcqL,IAAAA;AAInB,WAHA7Y,KAAKkY,SAASW,IACd7Y,KAAKoY,gBAAgBS,IACrB7Y,KAAKyY,cAAcZ,GAAYgB,EAAAA,GACxB7Y;AAAAA,EACT,OAEK8X;AACT;AAMA,IAAIgB,KAAsB;AAExB,WAASA,GAAoBlT,IAAQ+I,IAAUmE,IAAAA;AAC7ClF,MAAe5N,MAAM8Y,EAAAA;AACrB,QAAIvC,KAAShH,GAA0BvP,OAAO8Y,GAAoBxJ,aAAa7G,OAAOsG,eAAe+J,KAAsBxQ,KAAKtI,MAAM4F,IAAQ+I,IAAUmE,EAAAA,CAAAA;AACxJyD,IAAAA,GAAOwC,wBAAAA;AACP,QAAIvC,KAAQD,IACRyC,KAAAA;AAOJ,aAASC,KAAAA;AACHzC,MAAAA,GAAM9F,oBACR8F,GAAM9F,iBAAiBpI,KAAKkO,IAAOA,GAAM3F,SAAAA,CAAAA;AAAAA,IAE7C;AAIA,aAASqI,GAAY/H,IAAAA;AACnB,UAAIgI,KAAOH,KAAQ7H,GAAEiC;AACrBoD,MAAAA,GAAMI,SAASJ,GAAM3F,SAAAA,IAAasI,KAAO3C,GAAM4B,aAAAA,GAC/CY,KAAQ7H,GAAEiC;AAAAA,IACZ;AACA,aAASgG;AACP7H,SAAIoD,OAAOlB,QAAQ,aAAayF,EAAAA,GAChC3H,GAAIoD,OAAOlB,QAAQ,WAAW2F,EAAAA,GAC9BH;IACF;AAqBA,WAfA1C,GAAOoB,UAAUpH,SAASC,cAAc,OAAA,GACxC+F,GAAOoB,QAAQhB,aAAa,QAAQ,MAAA,GACpCpF,GAAI1I,KAAK0N,GAAOoB,SAAS,UA/BzB,WAAA;AACE,UAAI0B,KAAY7N,WAAWgL,GAAMmB,QAAQnK,KAAAA;AACpCtF,QAAOgC,MAAMmP,EAAAA,KAChB7C,GAAMI,SAASyC,EAAAA;AAAAA,IAEnB,CAAA,GA2BA9H,GAAI1I,KAAK0N,GAAOoB,SAAS,QArBzB;AACEsB,MAAAA,GAAAA;AAAAA,IACF,CAAA,GAoBA1H,GAAI1I,KAAK0N,GAAOoB,SAAS,aATzB,SAAqBxG,IAAAA;AACnBI,SAAI1I,KAAK4K,QAAQ,aAAayF,KAC9B3H,GAAI1I,KAAK4K,QAAQ,WAAW2F,KAC5BJ,KAAQ7H,GAAEiC;AAAAA,IACZ,CAAA,GAMA7B,GAAI1I,KAAK0N,GAAOoB,SAAS,WAAW,SAAUxG,IAAAA;AAC1B,aAAdA,GAAE+C,YACJsC,GAAMuC,wBAAAA,MACN/Y,KAAK4X,KAAAA,GACLpB,GAAMuC,wBAAAA,OACNE;IAEJ,CAAA,GACA1C,GAAO3F,iBACP2F,GAAOjG,WAAWuG,YAAYN,GAAOoB,OAAAA,GAC9BpB;AAAAA,EACT;AAQA,SA5DAtH,EAAS6J,IA6DThB,KARA9J,EAAY8K,IAAqB,CAAC,EAChCnQ,KAAK,iBACL6E,OAAO;AA5DX,QAAwBA,IAAO8L,IACzBC;AA6DA,WADAvZ,KAAK2X,QAAQnK,QAAQxN,KAAK+Y,wBAAwB/Y,KAAK6Q,cA7DrCrD,KA6DiExN,KAAK6Q,YA7D/DyI,KA6D2EtZ,KAAKyY,aA5DzGc,KAAQnX,KAAKiW,IAAI,IAAIiB,KAClBlX,KAAK8E,MAAMsG,KAAQ+L,EAAAA,IAASA,KA4DxB7K,EAAIoK,GAAoB9X,UAAUsO,aAAa7G,OAAOsG,eAAe+J,GAAoB9X,SAAAA,GAAY,iBAAiBhB,IAAAA,EAAMsI,KAAKtI;EAC1I,EAAA,CAAA,CAAA,GAEK8Y;AACT,EA9D0B;AAgE1B,SAAS3B,GAAI1P,IAAG+R,IAAIC,IAAIC,IAAIC;AAC1B,SAAOD,MAAmBjS,KAAI+R,OAAOC,KAAKD,OAA7BG,KAAKD;AACpB;AACA,IAAIE,KAAyB;AAE3B,WAASA,GAAuBhU,IAAQ+I,IAAU1B,IAAKC,IAAKiL,IAAAA;AAC1DvK,MAAe5N,MAAM4Z,EAAAA;AACrB,QAAIrD,KAAShH,GAA0BvP,OAAO4Z,GAAuBtK,aAAa7G,OAAOsG,eAAe6K,KAAyBtR,KAAKtI,MAAM4F,IAAQ+I,IAAU,EAAE1B,KAAKA,IAAKC,KAAKA,IAAKiL,MAAMA,QACtL3B,KAAQD;AAaZ,aAAS2C,GAAY/H,IAAAA;AACnBA,MAAAA,GAAE0I,eAAAA;AACF,UAAIC,KAAStD,GAAMuD,aAAaC;AAEhC,aADAxD,GAAMI,SAASO,GAAIhG,GAAE+B,SAAS4G,GAAOxH,MAAMwH,GAAOvH,OAAOiE,GAAMwB,OAAOxB,GAAMyB;IAE9E;AACA,aAASmB,KAAAA;AACP7H,SAAIoD,OAAOlB,QAAQ,aAAayF,EAAAA,GAChC3H,GAAIoD,OAAOlB,QAAQ,WAAW2F,EAAAA,GAC1B5C,GAAM9F,oBACR8F,GAAM9F,iBAAiBpI,KAAKkO,IAAOA,GAAM3F;IAE7C;AASA,aAASoJ,GAAY9I,IAAAA;AACnB,UAAI+B,KAAU/B,GAAE+I,QAAQ,GAAGhH,SACvB4G,KAAStD,GAAMuD,aAAaC,sBAAAA;AAChCxD,MAAAA,GAAMI,SAASO,GAAIjE,IAAS4G,GAAOxH,MAAMwH,GAAOvH,OAAOiE,GAAMwB,OAAOxB,GAAMyB,KAAAA,CAAAA;AAAAA,IAC5E;AACA,aAASkC,KAAAA;AACP5I,SAAIoD,OAAOlB,QAAQ,aAAawG,KAChC1I,GAAIoD,OAAOlB,QAAQ,YAAY0G,KAC3B3D,GAAM9F,oBACR8F,GAAM9F,iBAAiBpI,KAAKkO,IAAOA,GAAM3F,SAAAA,CAAAA;AAAAA,IAE7C;AAIA,WAhDA0F,GAAOwD,eAAexJ,SAASC,cAAc,QAC7C+F,GAAO6D,eAAe7J,SAASC,cAAc,KAAA,GAC7Ce,GAAI1I,KAAK0N,GAAOwD,cAAc,aAI9B,SAAqB5I,IAAAA;AACnBZ,eAAS6F,cAAcwB,KAAAA,GACvBrG,GAAI1I,KAAK4K,QAAQ,aAAayF,EAAAA,GAC9B3H,GAAI1I,KAAK4K,QAAQ,WAAW2F,KAC5BF,GAAY/H,EAAAA;AAAAA,IACd,CAAA,GARAI,GAAI1I,KAAK0N,GAAOwD,cAAc,cAsB9B,SAAsB5I,IAAAA;AACpB,UAAyB,MAArBA,GAAE+I,QAAQtS,OACZ;AAEF2J,SAAI1I,KAAK4K,QAAQ,aAAawG,EAAAA,GAC9B1I,GAAI1I,KAAK4K,QAAQ,YAAY0G,EAAAA,GAC7BF,GAAY9I;IACd,CAAA,GA5BAI,GAAIuD,SAASyB,GAAOwD,cAAc,WAClCxI,GAAIuD,SAASyB,GAAO6D,cAAc,cAwClC7D,GAAO3F,cAAAA,GACP2F,GAAOwD,aAAalD,YAAYN,GAAO6D,YAAAA,GACvC7D,GAAOjG,WAAWuG,YAAYN,GAAOwD,YAAAA,GAC9BxD;AAAAA,EACT;AASA,SA/DAtH,EAAS2K,IAgET9B,EAAAA,GATA9J,EAAY4L,IAAwB,CAAC,EACnCjR,KAAK,iBACL6E,OAAO;AACL,QAAI6M,MAAOra,KAAK6Q,SAAAA,IAAa7Q,KAAKgY,UAAUhY,KAAKiY,QAAQjY,KAAKgY;AAE9D,WADAhY,KAAKoa,aAAazI,MAAMvQ,QAAc,MAANiZ,KAAY,KACrC3L,EAAIkL,GAAuB5Y,UAAUsO,aAAa7G,OAAOsG,eAAe6K,GAAuB5Y,SAAAA,GAAY,iBAAiBhB,IAAAA,EAAMsI,KAAKtI;EAChJ,EAAA,CAAA,CAAA,GAEK4Z;AACT,EAjE6B,GAmEzBU,KAAqB;AAEvB,WAASA,GAAmB1U,IAAQ+I,IAAU7I,IAAAA;AAC5C8H,MAAe5N,MAAMsa,EAAAA;AACrB,QAAI/D,KAAShH,GAA0BvP,OAAOsa,GAAmBhL,aAAa7G,OAAOsG,eAAeuL,KAAqBhS,KAAKtI,MAAM4F,IAAQ+I,EAAAA,CAAAA,GACxI6H,KAAQD;AAUZ,WATAA,GAAOgE,WAAWhK,SAASC,cAAc,KAAA,GACzC+F,GAAOgE,SAASjD,YAAAA,WAAYxR,KAAqB,SAASA,IAC1DyL,GAAI1I,KAAK0N,GAAOgE,UAAU,SAAS,SAAUpJ,IAAAA;AAG3C,aAFAA,GAAE0I,eAAAA,GACFrD,GAAMgE;IAER,CAAA,GACAjJ,GAAIuD,SAASyB,GAAOgE,UAAU,QAAA,GAC9BhE,GAAOjG,WAAWuG,YAAYN,GAAOgE,QAAAA,GAC9BhE;AAAAA,EACT;AAaA,SA5BAtH,EAASqL,IA6BTlK,EAAAA,GAbApC,EAAYsM,IAAoB,CAAC,EAC/B3R,KAAK,QACL6E,OAAO,WAAA;AACDxN,SAAKyQ,cACPzQ,KAAKyQ,WAAWnI,KAAKtI,IAAAA,GAEvBA,KAAK6Q,SAAAA,EAAWvI,KAAKtI,KAAK4F,MAAAA,GACtB5F,KAAK0Q,oBACP1Q,KAAK0Q,iBAAiBpI,KAAKtI,MAAMA,KAAK6Q;EAE1C,EAAA,CAAA,CAAA,GAEKyJ;AACT,EA9ByB,GAgCrBG,KAAkB;AAEpB,WAASA,GAAgB7U,IAAQ+I,IAAAA;AAC/Bf,MAAe5N,MAAMya,EAAAA;AACrB,QAAIlE,KAAShH,GAA0BvP,OAAOya,GAAgBnL,aAAa7G,OAAOsG,eAAe0L,EAAAA,GAAkBnS,KAAKtI,MAAM4F,IAAQ+I,EAAAA,CAAAA;AACtI4H,IAAAA,GAAOmE,UAAU,IAAIhL,GAAM6G,GAAO1F,SAAAA,CAAAA,GAClC0F,GAAOoE,SAAS,IAAIjL,GAAM,CAAA;AAC1B,QAAI8G,KAAQD;AACZA,IAAAA,GAAOjG,aAAaC,SAASC,cAAc,QAC3Ce,GAAIC,eAAe+E,GAAOjG,YAAAA,KAAY,GACtCiG,GAAOqE,aAAarK,SAASC,cAAc,KAAA,GAC3C+F,GAAOqE,WAAW7H,YAAY,YAC9BwD,GAAOsE,qBAAqBtK,SAASC,cAAc,KAAA,GACnD+F,GAAOsE,mBAAmB9H,YAAY,oBACtCwD,GAAOuE,eAAevK,SAASC,cAAc,KAAA,GAC7C+F,GAAOuE,aAAa/H,YAAY,cAChCwD,GAAOwE,sBAAsB,cAC7BxE,GAAOyE,aAAazK,SAASC,cAAc,QAC3C+F,GAAOyE,WAAWjI,YAAY,YAC9BwD,GAAO0E,cAAc1K,SAASC,cAAc,QAC5C+F,GAAO0E,YAAYlI,YAAY,aAC/BwD,GAAOoB,UAAUpH,SAASC,cAAc,OAAA,GACxC+F,GAAOoB,QAAQvR,OAAO,QACtBmQ,GAAO2E,qBAAqB,cAC5B3J,GAAI1I,KAAK0N,GAAOoB,SAAS,WAAW,SAAUxG,IAAAA;AAC1B,aAAdA,GAAE+C,WACJiH,GAAO7S,KAAKtI,IAAAA;AAAAA,IAEhB,CAAA,GACAuR,GAAI1I,KAAK0N,GAAOoB,SAAS,QAAQwD,KACjC5J,GAAI1I,KAAK0N,GAAOqE,YAAY,aAAa;AACvCrJ,SAAIuD,SAAS9U,MAAM,MAAA,EAAQ6I,KAAK4K,QAAQ,WAAW,WAAA;AACjDlC,WAAI6D,YAAYoB,GAAMoE,YAAY,MAAA;AAAA,MACpC;IACF,CAAA,GACArJ,GAAI1I,KAAK0N,GAAOqE,YAAY,cAAc,WAAA;AACxCrJ,SAAIuD,SAAS9U,MAAM,QAAQ6I,KAAK4K,QAAQ,YAAY,WAAA;AAClDlC,WAAI6D,YAAYoB,GAAMoE,YAAY,MAAA;AAAA,MACpC,CAAA;AAAA,IACF;AACA,QA2MiBnJ,IA3Mb2J,KAAa7K,SAASC,cAAc;AA8DxC,aAAS6K,GAAUlK;AACjBmK,MAAAA,GAAMnK,EAAAA,GACNI,GAAI1I,KAAK4K,QAAQ,aAAa6H,EAAAA,GAC9B/J,GAAI1I,KAAK4K,QAAQ,aAAa6H,EAAAA,GAC9B/J,GAAI1I,KAAK4K,QAAQ,WAAW8H,KAC5BhK,GAAI1I,KAAK4K,QAAQ,YAAY8H,EAAAA;AAAAA,IAC/B;AACA,aAASC,GAAWrK,IAAAA;AAClBsK,MAAAA,GAAKtK,KACLI,GAAI1I,KAAK4K,QAAQ,aAAagI,EAAAA,GAC9BlK,GAAI1I,KAAK4K,QAAQ,aAAagI,EAAAA,GAC9BlK,GAAI1I,KAAK4K,QAAQ,WAAWiI,EAAAA,GAC5BnK,GAAI1I,KAAK4K,QAAQ,YAAYiI;IAC/B;AACA,aAASH;AACPhK,SAAIoD,OAAOlB,QAAQ,aAAa6H,EAAAA,GAChC/J,GAAIoD,OAAOlB,QAAQ,aAAa6H,EAAAA,GAChC/J,GAAIoD,OAAOlB,QAAQ,WAAW8H,EAAAA,GAC9BhK,GAAIoD,OAAOlB,QAAQ,YAAY8H,EAAAA,GAC/BtC,GAAAA;AAAAA,IACF;AACA,aAASyC,KAAAA;AACPnK,SAAIoD,OAAOlB,QAAQ,aAAagI,EAAAA,GAChClK,GAAIoD,OAAOlB,QAAQ,aAAagI,EAAAA,GAChClK,GAAIoD,OAAOlB,QAAQ,WAAWiI,KAC9BnK,GAAIoD,OAAOlB,QAAQ,YAAYiI,EAAAA,GAC/BzC;IACF;AACA,aAASkC;AACP,UAAIzV,KAAIyG,EAAUnM,KAAKwN;gBACnB9H,MACF8Q,GAAMkE,QAAQ5T,UAAUpB,IACxB8Q,GAAMI,SAASJ,GAAMkE,QAAQiB,iBAE7B3b,KAAKwN,QAAQgJ,GAAMkE,QAAQ1T,SAAAA;AAAAA,IAE/B;AACA,aAASiS,KAAAA;AACHzC,MAAAA,GAAM9F,oBACR8F,GAAM9F,iBAAiBpI,KAAKkO,IAAOA,GAAMkE,QAAQiB;IAErD;AASA,aAASL,GAAMnK,IAAAA;AAAAA,aACTA,GAAE/K,KAAK6O,QAAQ,YACjB9D,GAAE0I,eAAAA;AAEJ,UAAI+B,KAAYpF,GAAMqE,mBAAmBb,sBAAAA,GACrC6B,KAAO1K,GAAE+I,WAAW/I,GAAE+I,QAAQ,CAAA,KAAM/I,IACpC+B,KAAU2I,GAAK3I,SACfE,KAAUyI,GAAKzI,SACf7L,MAAK2L,KAAU0I,GAAUtJ,SAASsJ,GAAUrJ,QAAQqJ,GAAUtJ,OAC9D7K,KAAI,KAAK2L,KAAUwI,GAAUpJ,QAAQoJ,GAAUnJ,SAASmJ,GAAUpJ;AActE,aAbI/K,KAAI,IACNA,KAAI,IACKA,KAAI,MACbA,KAAI,IAEFF,KAAI,IACNA,KAAI,IACKA,KAAI,MACbA,KAAI,IAENiP,GAAMkE,QAAQjT,IAAIA,IAClB+O,GAAMkE,QAAQnT,IAAIA,IAClBiP,GAAMI,SAASJ,GAAMkE,QAAQiB;IAE/B;AACA,aAASF,GAAKtK,IAAAA;AAAAA,aACRA,GAAE/K,KAAK6O,QAAQ,OAAA,KACjB9D,GAAE0I,eAAAA;AAEJ,UAAI+B,KAAYpF,GAAMyE,YAAYjB,yBAG9B1S,KAAI,MAFI6J,GAAE+I,WAAW/I,GAAE+I,QAAQ,CAAA,KAAM/I,IACrBiC,UACGwI,GAAUpJ,QAAQoJ,GAAUnJ,SAASmJ,GAAUpJ;AAQtE,aAPIlL,KAAI,IACNA,KAAI,IACKA,KAAI,MACbA,KAAI,IAENkP,GAAMkE,QAAQpT,IAAQ,MAAJA,IAClBkP,GAAMI,SAASJ,GAAMkE,QAAQiB,WAAAA,CAAAA,GAAAA;AAAAA,IAE/B;AACA,WAzJAzT,EAAOE,OAAOmO,GAAOqE,WAAWjJ,OAAO,EACrCvQ,OAAO,SACPC,QAAQ,SACRya,SAAS,OACTC,iBAAiB,QACjBC,WAAW,8BAAA,CAAA,GAEb9T,EAAOE,OAAOmO,GAAOuE,aAAanJ,OAAO,EACvCU,UAAU,YACVjR,OAAO,QACPC,QAAQ,QACR4a,QAAQ1F,GAAOwE,uBAAuBxE,GAAOmE,QAAQjT,IAAI,MAAM,SAAS,SACxEuU,WAAW,+BACXE,cAAc,QACdC,QAAQ,EAAA,CAAA,GAEVjU,EAAOE,OAAOmO,GAAOyE,WAAWrJ,OAAO,EACrCU,UAAU,YACVjR,OAAO,QACPC,QAAQ,OACR+a,aAAa,kBACbD,QAAQ,MAEVjU,EAAOE,OAAOmO,GAAOsE,mBAAmBlJ,OAAO,EAC7CvQ,OAAO,SACPC,QAAQ,SACR4a,QAAQ,kBACRI,aAAa,OACbC,SAAS,gBACTC,QAAQ,UAAA,CAAA,GAEVrU,EAAOE,OAAOgT,GAAWzJ,OAAO,EAC9BvQ,OAAO,QACPC,QAAQ,QACRmb,YAAY,OAAA,CAAA,GAEdC,GAAerB,IAAY,OAAO,iBAAiB,MAAA,GACnDlT,EAAOE,OAAOmO,GAAO0E,YAAYtJ,OAAO,EACtCvQ,OAAO,QACPC,QAAQ,SACR4a,QAAQ,kBACRM,QAAQ,aACRlK,UAAU,YACVG,KAAK,OACLD,OAAO,MAAA,CAAA,IA8JQd,KA5JL8E,GAAO0E,aA6JhBtJ,MAAM6K,aAAa,IACxB/K,GAAKE,MAAM+K,WAAW,sIACtBjL,GAAKE,MAAM+K,WAAW,mIACtBjL,GAAKE,MAAM+K,WAAW,8HACtBjL,GAAKE,MAAM+K,WAAW,+HACtBjL,GAAKE,MAAM+K,WAAW,2HAjKpBxU,EAAOE,OAAOmO,GAAOoB,QAAQhG,OAAO,EAClCpO,SAAS,QACToZ,WAAW,UACXhW,OAAO,QACPsV,QAAQ,GACRW,YAAY,QACZC,YAAYtG,GAAO2E,qBAAqB,kBAAA,CAAA,GAE1C3J,GAAI1I,KAAK0N,GAAOsE,oBAAoB,aAAaQ,EAAAA,GACjD9J,GAAI1I,KAAK0N,GAAOsE,oBAAoB,cAAcQ,KAClD9J,GAAI1I,KAAK0N,GAAOuE,cAAc,aAAaO,EAAAA,GAC3C9J,GAAI1I,KAAK0N,GAAOuE,cAAc,cAAcO,EAAAA,GAC5C9J,GAAI1I,KAAK0N,GAAO0E,aAAa,aAAaO,EAAAA,GAC1CjK,GAAI1I,KAAK0N,GAAO0E,aAAa,cAAcO,EAAAA,GA2C3CjF,GAAOsE,mBAAmBhE,YAAYuE,EAAAA,GACtC7E,GAAOqE,WAAW/D,YAAYN,GAAOuE,YAAAA,GACrCvE,GAAOqE,WAAW/D,YAAYN,GAAOsE,kBAAAA,GACrCtE,GAAOqE,WAAW/D,YAAYN,GAAO0E,WAAAA,GACrC1E,GAAO0E,YAAYpE,YAAYN,GAAOyE,aACtCzE,GAAOjG,WAAWuG,YAAYN,GAAOoB,UACrCpB,GAAOjG,WAAWuG,YAAYN,GAAOqE,UAAAA,GACrCrE,GAAO3F,cAAAA,GA2CA2F;AAAAA,EACT;AAuCA,SAzOAtH,EAASwL,IA0OTrK,EAAAA,GAvCApC,EAAYyM,IAAiB,CAAC,EAC5B9R,KAAK,iBACL6E,OAAO,WAAA;AACL,QAAI9H,KAAIyG,EAAUnM,KAAK6Q;AACvB,QAAA,UAAInL,IAAa;AACf,UAAIoX,KAAAA;AACJ5U,QAAOG,KAAKqH,GAAMS,YAAY,SAAUN,IAAAA;AACtC,aAAK3H,EAAOU,YAAYlD,GAAEmK,EAAAA,CAAAA,KAAAA,CAAgB3H,EAAOU,YAAY5I,KAAK0a,QAAQ5T,QAAQ+I,EAAAA,CAAAA,KAAenK,GAAEmK,EAAAA,MAAe7P,KAAK0a,QAAQ5T,QAAQ+I,EAAAA,EAErI,QADAiN,KAAAA,MACO,CAAA;AAAA,MAEX,GAAG9c,OACC8c,MACF5U,EAAOE,OAAOpI,KAAK0a,QAAQ5T,SAASpB,EAAAA;AAAAA,IAExC;AACAwC,MAAOE,OAAOpI,KAAK2a,OAAO7T,SAAS9G,KAAK0a,QAAQ5T,UAChD9G,KAAK2a,OAAOtT,IAAI;AAChB,QAAI0V,KAAO/c,KAAK0a,QAAQjT,IAAI,OAAOzH,KAAK0a,QAAQnT,IAAI,MAAM,MAAM,GAC5DyV,KAAQ,MAAMD;AAClB7U,MAAOE,OAAOpI,KAAK8a,aAAanJ,OAAO,EACrCsL,YAAY,MAAMjd,KAAK0a,QAAQnT,IAAI,IAAI,MACvC2V,WAAW,OAAO,IAAIld,KAAK0a,QAAQjT,KAAK,IAAI,MAC5CsU,iBAAiB/b,KAAK2a,OAAOwC,YAAAA,GAC7BlB,QAAQjc,KAAK+a,sBAAsB,SAASgC,KAAO,MAAMA,KAAO,MAAMA,KAAO,IAAA,CAAA,GAE/E/c,KAAKgb,WAAWrJ,MAAMuL,YAAyC,OAA5B,IAAIld,KAAK0a,QAAQpT,IAAI,OAAa,MACrEtH,KAAK2a,OAAOpT,IAAI,GAChBvH,KAAK2a,OAAOlT,IAAI,GAChBgV,GAAezc,KAAK6a,oBAAoB,QAAQ,QAAQ7a,KAAK2a,OAAOwC,YAAAA,CAAAA,GACpEnd,KAAK2X,QAAQnK,QAAQxN,KAAK0a,QAAQ1T,SAAAA,GAClCkB,EAAOE,OAAOpI,KAAK2X,QAAQhG,OAAO,EAChCoK,iBAAiB/b,KAAK0a,QAAQyC,YAAAA,GAC9BxW,OAAO,SAASoW,KAAO,MAAMA,KAAO,MAAMA,KAAO,KACjDF,YAAY7c,KAAKkb,qBAAqB,UAAU8B,KAAQ,MAAMA,KAAQ,MAAMA,KAAQ,OAAA,CAAA;AAAA,EAExF,OAEKvC;AACT,KACI2C,KAAU,CAAC,SAAS,OAAO,YAAY,QAAQ,EAAA;AACnD,SAASX,GAAehL,IAAM0B,IAAG9L,IAAGD,IAAAA;AAClCqK,EAAAA,GAAKE,MAAM6K,aAAa,IACxBtU,EAAOG,KAAK+U,IAAS,SAAUC;AAC7B5L,IAAAA,GAAKE,MAAM+K,WAAW,iBAAiBW,KAAS,qBAAqBlK,KAAI,OAAO9L,KAAI,UAAUD,KAAI;AAAA,EACpG,CAAA;AACF;AAUA,IAAIkW,KASM,SAAgBC,IAAYC,IAAAA;AAClC,MAAIC,KAAMD,MAASjN,UACfmN,KAAWnN,SAASC,cAAc,OAAA;AACtCkN,EAAAA,GAAStX,OAAO,YAChBsX,GAASpG,YAAYiG;AACrB,MAAII,KAAOF,GAAIG,qBAAqB,MAAA,EAAQ;AAC5C,MAAA;AACED,IAAAA,GAAK9G,YAAY6G,EAAAA;AAAAA,EACnB,SAASvM,IAAAA;AAAAA,EACT;AACF,GAKE0M,KAAoB,SAA2BjY,IAAQ+I,IAAAA;AACzD,MAAI0B,KAAezK,GAAO+I;AAC1B,SAAIzG,EAAOmC,QAAQ9B,UAAU,CAAA,CAAA,KAAOL,EAAOM,SAASD,UAAU,MACrD,IAAIwO,GAAiBnR,IAAQ+I,IAAUpG,UAAU,CAAA,CAAA,IAEtDL,EAAOqC,SAAS8F,EAAAA,IACdnI,EAAOqC,SAAShC,UAAU,CAAA,CAAA,KAAOL,EAAOqC,SAAShC,UAAU,CAAA,CAAA,IACzDL,EAAOqC,SAAShC,UAAU,CAAA,CAAA,IACrB,IAAIqR,GAAuBhU,IAAQ+I,IAAUpG,UAAU,CAAA,GAAIA,UAAU,CAAA,GAAIA,UAAU,CAAA,CAAA,IAErF,IAAIqR,GAAuBhU,IAAQ+I,IAAUpG,UAAU,CAAA,GAAIA,UAAU,MAE1EL,EAAOqC,SAAShC,UAAU,CAAA,CAAA,IACrB,IAAIuQ,GAAoBlT,IAAQ+I,IAAU,EAAE1B,KAAK1E,UAAU,CAAA,GAAI2E,KAAK3E,UAAU,CAAA,GAAI4P,MAAM5P,UAAU,CAAA,EAAA,CAAA,IAEpG,IAAIuQ,GAAoBlT,IAAQ+I,IAAU,EAAE1B,KAAK1E,UAAU,CAAA,GAAI2E,KAAK3E,UAAU,CAAA,EAAA,CAAA,IAEnFL,EAAOsC,SAAS6F,EAAAA,IACX,IAAIoH,GAAiB7R,IAAQ+I,MAElCzG,EAAOwC,WAAW2F,MACb,IAAIiK,GAAmB1U,IAAQ+I,IAAU,EAAA,IAE9CzG,EAAOuC,UAAU4F,EAAAA,IACZ,IAAIiG,GAAkB1Q,IAAQ+I,MAEhC;AACT;AAKA,IAAImP,KAA0BrK,OAAOsK,yBAAyBtK,OAAOuK,+BAA+BvK,OAAOwK,4BAA4BxK,OAAOyK,0BAA0BzK,OAAO0K,2BAH/K,SAA+Bvc,IAAAA;AAC7B6H,aAAW7H,IAAU,MAAO,EAAA;AAC9B,GAGIwc,KAAc,WAAA;AAChB,WAASA;AACPxQ,MAAe5N,MAAMoe,EAAAA,GACrBpe,KAAKqe,oBAAoB9N,SAASC,cAAc,QAChDtI,EAAOE,OAAOpI,KAAKqe,kBAAkB1M,OAAO,EAC1CoK,iBAAiB,mBACjBvJ,KAAK,GACLF,MAAM,GACNgK,SAAS,QACTH,QAAQ,QACR3X,SAAS,GACT8Z,kBAAkB,uBAClBC,YAAY,sBAAA,CAAA,GAEdhN,GAAIS,eAAehS,KAAKqe,oBACxBre,KAAKqe,kBAAkB1M,MAAMU,WAAW,SACxCrS,KAAKsQ,aAAaC,SAASC,cAAc,KAAA,GACzCtI,EAAOE,OAAOpI,KAAKsQ,WAAWqB,OAAO,EACnCU,UAAU,SACViK,SAAS,QACTH,QAAQ,QACR3X,SAAS,GACT8Z,kBAAkB,wDAClBC,YAAY,mDAEdhO,SAASiO,KAAK3H,YAAY7W,KAAKqe,iBAAAA,GAC/B9N,SAASiO,KAAK3H,YAAY7W,KAAKsQ,UAAAA;AAC/B,QAAIkG,KAAQxW;AACZuR,OAAI1I,KAAK7I,KAAKqe,mBAAmB,SAAS,WAAA;AACxC7H,MAAAA,GAAMiI,KAAAA;AAAAA,IACR;EACF;AAyCA,SAxCAzQ,EAAYoQ,IAAa,CAAC,EACxBzV,KAAK,QACL6E,OAAO,WAAA;AACL,QAAIgJ,KAAQxW;AACZA,SAAKqe,kBAAkB1M,MAAM2K,UAAU,SACvCtc,KAAKsQ,WAAWqB,MAAM2K,UAAU,SAChCtc,KAAKsQ,WAAWqB,MAAMnN,UAAU,GAChCxE,KAAKsQ,WAAWqB,MAAM+M,kBAAkB,cACxC1e,KAAK2e,OAAAA,GACLzW,EAAOqB,MAAM,WAAA;AACXiN,MAAAA,GAAM6H,kBAAkB1M,MAAMnN,UAAU,GACxCgS,GAAMlG,WAAWqB,MAAMnN,UAAU,GACjCgS,GAAMlG,WAAWqB,MAAM+M,kBAAkB;AAAA,IAC3C,CAAA;AAAA,EACF,EAAA,GACC,EACD/V,KAAK,QACL6E,OAAO,WAAA;AACL,QAAIgJ,KAAQxW,MACRye,KAAO,SAASA,KAAAA;AAClBjI,MAAAA,GAAMlG,WAAWqB,MAAM2K,UAAU,QACjC9F,GAAM6H,kBAAkB1M,MAAM2K,UAAU,QACxC/K,GAAIoD,OAAO6B,GAAMlG,YAAY,uBAAuBmO,KACpDlN,GAAIoD,OAAO6B,GAAMlG,YAAY,iBAAiBmO,EAAAA,GAC9ClN,GAAIoD,OAAO6B,GAAMlG,YAAY,kBAAkBmO,EAAAA;AAAAA,IACjD;AACAlN,OAAI1I,KAAK7I,KAAKsQ,YAAY,uBAAuBmO,KACjDlN,GAAI1I,KAAK7I,KAAKsQ,YAAY,iBAAiBmO,KAC3ClN,GAAI1I,KAAK7I,KAAKsQ,YAAY,kBAAkBmO,KAC5Cze,KAAKqe,kBAAkB1M,MAAMnN,UAAU,GACvCxE,KAAKsQ,WAAWqB,MAAMnN,UAAU,GAChCxE,KAAKsQ,WAAWqB,MAAM+M,kBAAkB;AAAA,EAC1C,EAAA,GACC,EACD/V,KAAK,UACL6E,OAAO,WAAA;AACLxN,SAAKsQ,WAAWqB,MAAMW,OAAOmB,OAAOmL,aAAa,IAAIrN,GAAImE,SAAS1V,KAAKsQ,UAAAA,IAAc,IAAI,MACzFtQ,KAAKsQ,WAAWqB,MAAMa,MAAMiB,OAAOoL,cAAc,IAAItN,GAAIqE,UAAU5V,KAAKsQ,cAAc,IAAI;AAAA,EAC5F,OAEK8N;AACT,KAEIU,KArnDJ,SAAyBxB,IAAAA;AAIvB,MAAsB,sBAAX7J,QAAX;AAIA,QAAI9B,KAAQpB,SAASC,cAAc,OAAA;AAMnC,WAJAmB,GAAMgF,aAAa,QAAQ,UAAA,GAC3BhF,GAAM2F,YAAYgG,IAClB/M,SAASoN,KAAK9G,YAAYlF,EAAAA,GAEnB2L;AAAAA,EARP;AASF,EAsmDiC,+tLAAA;AAEjCA,GAAWwB,EAAAA;AACX,IAGIC,KAA8B,WAC9BC,KAAyB;AAC3B,MAAA;AACE,WAAA,CAAA,CAASvL,OAAOwL;AAAAA,EAClB,SAAS9N,IAAAA;AACP,WAAA;AAAA,EACF;AACF,EAN6B,GAOzB+N,KAAAA,QACAC,KAAAA,MACAC,aACAX,KAAAA,OACAY,KAAe,CAAA,GACfC,KAAM,SAASA,GAAI1M,IAAAA;AACrB,MAAI4D,KAAQxW,MACR8S,KAASF,MAAQ,CAAA;AACrB5S,OAAKsQ,aAAaC,SAASC,cAAc,KAAA,GACzCxQ,KAAKuf,OAAOhP,SAASC,cAAc,IAAA,GACnCxQ,KAAKsQ,WAAWuG,YAAY7W,KAAKuf,OACjChO,GAAIuD,SAAS9U,KAAKsQ,YAtBA,IAAA,GAuBlBtQ,KAAKwf,YAAY,CAAA,GACjBxf,KAAKyf,gBAAgB,CAAA,GACrBzf,KAAK0f,sBAAsB,CAAA,GAC3B1f,KAAK2f,yCAAyC,CAAA,GAC9C3f,KAAK4f,cAAc,CAAA,GACnB9M,KAAS5K,EAAOY,SAASgK,IAAQ,EAC/B+M,YAAAA,OACAC,WAAAA,MACA1e,OAAOke,GAAIS,kBAEbjN,KAAS5K,EAAOY,SAASgK,IAAQ,EAC/BkN,WAAWlN,GAAOgN,WAClBG,UAAUnN,GAAOgN,UAAAA,CAAAA,GAEd5X,EAAOU,YAAYkK,GAAOoN,QAK7BpN,GAAOoN,OAAO,EAAEC,QAAQpB,GAAAA,IAJpBjM,GAAOqN,WACTrN,GAAOoN,KAAKC,SAASrN,GAAOqN,SAK5BjY,EAAOU,YAAYkK,GAAO3M,MAAAA,KAAW2M,GAAOmN,YAC9CZ,GAAave,KAAKd,IAAAA,GAEpB8S,GAAOkN,YAAY9X,EAAOU,YAAYkK,GAAO3M,MAAAA,KAAW2M,GAAOkN,WAC3DlN,GAAOgN,aAAa5X,EAAOU,YAAYkK,GAAOsN,UAAAA,MAChDtN,GAAOsN,aAAAA;AAET,MAoLMC,IApLFC,KAAkBtB,MAAyF,WAA/DC,aAAasB,QAAQC,GAAoBxgB,MAAM,aAC3FygB,KAAAA,QACAC,KAAAA;AAmGJ,MAlGAjY,OAAOwF,iBAAiBjO,MACxB,EACEmG,QAAQ,EACNuI,KAAK,WAAA;AACH,WAAOoE,GAAO3M;AAAAA,EAChB,KAEFia,YAAY,EACV1R,KAAK,WAAA;AACH,WAAOoE,GAAOsN;AAAAA,EAChB,EAAA,GAEFN,WAAW,EACTpR,KAAK,WAAA;AACH,WAAOoE,GAAOgN;AAAAA,EAChB,EAAA,GAEFD,YAAY,EACVnR,KAAK;AACH,WAAOoE,GAAO+M;AAAAA,EAChB,EAAA,GAEFM,QAAQ,EACNzR,KAAK,WAAA;AACH,WAAI8H,GAAMrQ,SACDqQ,GAAMmK,QAAAA,EAAUR,SAElBrN,GAAOoN,KAAKC;AAAAA,EACrB,GACAnQ,KAAK,SAAgBvI,IAAAA;AACf+O,IAAAA,GAAMrQ,SACRqQ,GAAMmK,UAAUR,SAAS1Y,KAEzBqL,GAAOoN,KAAKC,SAAS1Y,IAgtB/B,SAA8BmZ,IAAAA;AAC5B,eAAStL,KAAQ,GAAGA,KAAQsL,GAAIC,gBAAgBjZ,QAAQ0N,KAClDsL,CAAAA,GAAIC,gBAAgBvL,IAAO9H,UAAUoT,GAAIT,WAC3CS,GAAIC,gBAAgBrJ,gBAAgBlC;AAAAA,IAG1C,EAptB6BtV,IAAAA,GACrBwW,GAAMsK,OAAAA;AAAAA,EACR,EAAA,GAEF1f,OAAO,EACLsN,KAAK;AACH,WAAOoE,GAAO1R;AAAAA,EAChB,GACA4O,KAAK,SAAgBvI,IAAAA;AACnBqL,IAAAA,GAAO1R,QAAQqG,IACfsZ,GAASvK,IAAO/O,EAAAA;AAAAA,EAClB,KAEFuZ,MAAM,EACJtS,KAAK,WAAA;AACH,WAAOoE,GAAOkO;AAAAA,EAChB,GACAhR,KAAK,SAAgBvI;AACnBqL,IAAAA,GAAOkO,OAAOvZ,IACViZ,OACFA,GAASpJ,YAAYxE,GAAOkO;AAAAA,EAEhC,KAEFC,QAAQ,EACNvS,KAAK,WAAA;AACH,WAAOoE,GAAOmO;AAAAA,EAChB,GACAjR,KAAK,SAAgBvI;AACnBqL,IAAAA,GAAOmO,SAASxZ,IACZqL,GAAOmO,SACT1P,GAAIuD,SAAS0B,GAAM+I,MAAMD,GAAI4B,gBAE7B3P,GAAI6D,YAAYoB,GAAM+I,MAAMD,GAAI4B,YAAAA,GAElClhB,KAAKmB,YACDqV,GAAM2K,kBACR3K,GAAM2K,cAAc7J,YAAY7P,KAAI6X,GAAI8B,YAAY9B,GAAI+B;AAAAA,EAE5D,EAAA,GAEFnB,MAAM,EACJxR,KAAK;AACH,WAAOoE,GAAOoN;AAAAA,EAChB,EAAA,GAEFI,iBAAiB,EACf5R,KAAK;AACH,WAAO4R;AAAAA,EACT,GACAtQ,KAAK,SAAgBwE;AACfwK,WACFsB,KAAkB9L,IACdA,KACFjD,GAAI1I,KAAK4K,QAAQ,UAAUgN,EAAAA,IAE3BlP,GAAIoD,OAAOlB,QAAQ,UAAUgN,EAAAA,GAE/BxB,aAAaqC,QAAQd,GAAoBhK,IAAO,YAAYhC,EAAAA;AAAAA,EAEhE,EAAA,EAAA,CAAA,GAGAtM,EAAOU,YAAYkK,GAAO3M,SAAS;AAIrC,QAHAnG,KAAKihB,SAASnO,GAAOmO,iBACrB1P,GAAIuD,SAAS9U,KAAKsQ,YAAYgP,GAAIiC,UAAAA,GAClChQ,GAAIC,eAAexR,KAAKsQ,iBAAY,GAChC0O,MACEsB,IAAiB;AACnB9J,MAAAA,GAAM8J,kBAAAA;AACN,UAAIkB,KAAWvC,aAAasB,QAAQC,GAAoBxgB,MAAM;AAC1DwhB,MAAAA,OACF1O,GAAOoN,OAAOuB,KAAKC,MAAMF,EAAAA;AAAAA,IAE7B;AAEFxhB,SAAKmhB,gBAAgB5Q,SAASC,cAAc,KAAA,GAC5CxQ,KAAKmhB,cAAc7J,YAAYgI,GAAI+B,aACnC9P,GAAIuD,SAAS9U,KAAKmhB,eAAe7B,GAAIqC,qBACjC7O,GAAO+M,cACTtO,GAAIuD,SAAS9U,KAAKmhB,eAAe7B,GAAIsC,kBACrC5hB,KAAKsQ,WAAWuR,aAAa7hB,KAAKmhB,eAAenhB,KAAKsQ,WAAWwR,WAAW,CAAA,CAAA,MAE5EvQ,GAAIuD,SAAS9U,KAAKmhB,eAAe7B,GAAIyC,kBAAAA,GACrC/hB,KAAKsQ,WAAWuG,YAAY7W,KAAKmhB,aAAAA,IAEnC5P,GAAI1I,KAAK7I,KAAKmhB,eAAe,SAAS,WAAA;AACpC3K,MAAAA,GAAMyK,UAAUzK,GAAMyK;AAAAA,IACxB;EACF,OAAO;AAAA,eACDnO,GAAOmO,WACTnO,GAAOmO,SAAAA;AAET,QAAIe,KAAezR,SAAS0R,eAAenP,GAAOkO;AAClDzP,OAAIuD,SAASkN,IAAc,iBAAA,GAC3BtB,KAAWwB,GAAO1L,IAAOwL;AAMzBzQ,OAAIuD,SAAS9U,KAAKuf,MAAMD,GAAI4B,eAC5B3P,GAAIuD,SAAS4L,IAAU,OAAA,GACvBnP,GAAI1I,KAAK6X,IAAU,SAPA,SAAsBvP,IAAAA;AAGvC,aAFAA,GAAE0I,eAAAA,GACFrD,GAAMyK,SAAAA,CAAUzK,GAAMyK;IAExB,CAAA,GAIKnO,GAAOmO,WACVjhB,KAAKihB;EAET;AACInO,EAAAA,GAAOgN,cACL5X,EAAOU,YAAYkK,GAAO3M,YACxBgZ,OACFC,KAAqB7O,SAASC,cAAc,KAAA,GAC5Ce,GAAIuD,SAASsK,IAzMD,IAAA,GA0MZ7N,GAAIuD,SAASsK,IAAoBE,GAAI6C,6BACrC5R,SAASiO,KAAK3H,YAAYuI,EAAAA,GAC1BD,aAEFC,GAAmBvI,YAAY7W,KAAKsQ,UAAAA,GACpCiB,GAAIuD,SAAS9U,KAAKsQ,YAAYgP,GAAI8C,gBAAAA,IAE/BpiB,KAAKmG,UACR4a,GAASvK,IAAO1D,GAAO1R,KAAAA,IAG3BpB,KAAKqiB,kBAAkB,WAAA;AACrB7L,IAAAA,GAAM8L,kBAAAA;AAAAA,EACR,GACA/Q,GAAI1I,KAAK4K,QAAQ,UAAUzT,KAAKqiB,kBAChC9Q,GAAI1I,KAAK7I,KAAKuf,MAAM,uBAAuBvf,KAAKqiB,eAAAA,GAChD9Q,GAAI1I,KAAK7I,KAAKuf,MAAM,iBAAiBvf,KAAKqiB,eAAAA,GAC1C9Q,GAAI1I,KAAK7I,KAAKuf,MAAM,kBAAkBvf,KAAKqiB,eAAAA,GAC3CriB,KAAKmB,SAAAA,GACD2R,GAAOkN,aACTuC,GAAgBviB,IAAAA,GAElBygB,KAAqB,WAAA;AACfzB,UAA0F,WAAhEC,aAAasB,QAAQC,GAAoBhK,IAAO,SAAA,CAAA,KAC5EyI,aAAaqC,QAAQd,GAAoBhK,IAAO,KAAA,GAAQiL,KAAKe,UAAUhM,GAAMiM;EAEjF,GACAziB,KAAK0iB,+BAA+BjC,IAQ/B3N,GAAO3M,YANNka,KAAO7J,GAAMmK,QAAAA,GACZvf,SAAS,GACd8G,EAAOqB,MAAM,WAAA;AACX8W,IAAAA,GAAKjf,SAAS;AAAA,EAChB,CAAA;AAKJ;AAyOA,SAAS8gB,GAAOtB,IAAK+B,IAAQC,IAAAA;AAC3B,MAAIC,KAAKtS,SAASC,cAAc,IAAA;AAUhC,SATImS,MACFE,GAAGhM,YAAY8L,KAEbC,KACFhC,GAAIrB,KAAKsC,aAAagB,IAAID,EAAAA,IAE1BhC,GAAIrB,KAAK1I,YAAYgM,EAAAA,GAEvBjC,GAAIzf,SAAAA,GACG0hB;AACT;AACA,SAASC,GAAgBlC,IAAAA;AACvBrP,KAAIoD,OAAOlB,QAAQ,UAAUmN,GAAIyB,eAAAA,GAC7BzB,GAAI8B,gCACNnR,GAAIoD,OAAOlB,QAAQ,UAAUmN,GAAI8B,4BAAAA;AAErC;AACA,SAASK,GAAmBnC,IAAKoC;AAC/B,MAAI3L,KAAMuJ,GAAIC,gBAAgBD,GAAIC,gBAAgBrJ,aAAAA;AAEhDH,EAAAA,GAAIC,YADF0L,KACc3L,GAAI7J,QAAQ,MAEZ6J,GAAI7J;AAExB;AAmGA,SAASyV,GAAiBrC,IAAKsC;AAC7B,MAAI7C,KAAOO,GAAID,QAAAA,GACXwC,KAAe9C,GAAKX,oBAAoBzK,QAAQiO,GAAWtd,MAAAA;AAC/D,aAAIud,IAAqB;AACvB,QAAIC,KAAgB/C,GAAKV,uCAAuCwD;AAMhE,QAAA,WALIC,OACFA,KAAgB,CAAA,GAChB/C,GAAKV,uCAAuCwD,MAAgBC,KAE9DA,GAAcF,GAAWvU,QAAAA,IAAYuU,IACjC7C,GAAKH,QAAQG,GAAKH,KAAKmD,YAAY;AACrC,UAAIC,KAAYjD,GAAKH,KAAKmD,YACtBlD;AACJ,UAAImD,GAAU1C,GAAIT,QAChBA,CAAAA,KAASmD,GAAU1C,GAAIT,MAAAA;AAAAA,WAClB;AAAA,YAAA,CAAImD,GAAUvE,EAAAA,EAGnB;AAFAoB,QAAAA,KAASmD,GAAUvE;MAGrB;AACA,UAAIoB,GAAOgD,EAAAA,KAAAA,WAAiBhD,GAAOgD,EAAAA,EAAcD,GAAWvU,WAAyB;AACnF,YAAInB,KAAQ2S,GAAOgD,EAAAA,EAAcD,GAAWvU,QAAAA;AAC5CuU,QAAAA,GAAW7S,eAAe7C,IAC1B0V,GAAWtM,SAASpJ,EAAAA;AAAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AACA,SAAS+V,GAAK3C,IAAKhb,IAAQ+I,IAAUmE,IAAAA;AACnC,MAAA,WAAIlN,GAAO+I,EAAAA,EACT,OAAM,IAAIgB,MAAM,aAAa/J,KAAS,wBAAwB+I,KAAW,GAAA;AAE3E,MAAIuU,KAAAA;AACJ,MAAIpQ,GAAOnM,MACTuc,CAAAA,KAAa,IAAIzI,GAAgB7U,IAAQ+I,EAAAA;AAAAA,OACpC;AACL,QAAI6U,KAAc,CAAC5d,IAAQ+I,EAAAA,EAAU8U,OAAO3Q,GAAO0Q,WAAAA;AACnDN,IAAAA,KAAarF,GAAkB3U,MAAM0X,IAAK4C,EAAAA;AAAAA,EAC5C;AACI1Q,EAAAA,GAAO4Q,kBAAkBtT,OAC3B0C,GAAO4Q,SAAS5Q,GAAO4Q,OAAOC,OAEhCV,GAAiBrC,IAAKsC,EAAAA,GACtB3R,GAAIuD,SAASoO,GAAW5S,YAAY,GAAA;AACpC,MAAI0Q,KAAOzQ,SAASC,cAAc,MAAA;AAClCe,KAAIuD,SAASkM,IAAM,eAAA,GACnBA,GAAK1J,YAAY4L,GAAWvU;AAC5B,MAAIiV,KAAYrT,SAASC,cAAc,KAAA;AACvCoT,EAAAA,GAAU/M,YAAYmK,EAAAA,GACtB4C,GAAU/M,YAAYqM,GAAW5S,UAAAA;AACjC,MAAIuS,KAAKX,GAAOtB,IAAKgD,IAAW9Q,GAAO4Q,MAAAA;AASvC,SARAnS,GAAIuD,SAAS+N,IAAIvD,GAAIuE,uBACjBX,cAAsBzI,KACxBlJ,GAAIuD,SAAS+N,IAAI,WAEjBtR,GAAIuD,SAAS+N,IAAIpV,EAAQyV,GAAWrS,SAAAA,CAAAA,CAAAA,GAzJxC,SAA2B+P,IAAKiC,IAAIK,IAAAA;AAmClC,QAlCAA,GAAWS,OAAOd,IAClBK,GAAWY,QAAQlD,IACnB1Y,EAAOE,OAAO8a,IAAY,EACxBjM,SAAS,SAAiB8M,IAAAA;AACxB,UAAIxb,UAAUX,SAAS,GAAG;AACxB,YAAIoc,KAAcd,GAAWS,KAAKM;AAElC,eADAf,GAAWgB,OAAAA,GACJX,GAAK3C,IAAKsC,GAAWtd,QAAQsd,GAAWvU,UAAU,EACvD+U,QAAQM,IACRR,aAAa,CAACtb,EAAO8B,QAAQzB,SAAAA,CAAAA,EAAAA,CAAAA;AAAAA,MAEjC;AACA,UAAIL,EAAOmC,QAAQ0Z,OAAa7b,EAAOM,SAASub,KAAW;AACzD,YAAII,KAAejB,GAAWS,KAAKM;AAEnC,eADAf,GAAWgB,UACJX,GAAK3C,IAAKsC,GAAWtd,QAAQsd,GAAWvU,UAAU,EACvD+U,QAAQS,IACRX,aAAa,CAACO,EAAAA,EAAAA,CAAAA;AAAAA,MAElB;AAAA,IACF,GACA/C,MAAM,SAAcoD,IAAAA;AAElB,aADAlB,GAAWS,KAAKU,kBAAkBA,kBAAkB/M,YAAY8M,IACzDlB;AAAAA,IACT,GACAoB,QAAQ,WAAA;AAEN,aADApB,GAAWY,MAAMQ,OAAOpB,KACjBA;AAAAA,IACT,GACAgB,QAAQ,WAAA;AAEN,aADAhB,GAAWY,MAAMI,OAAOhB,KACjBA;AAAAA,IACT,EAAA,CAAA,GAEEA,cAAsBtJ,IAAwB;AAChD,UAAI2K,KAAM,IAAIzL,GAAoBoK,GAAWtd,QAAQsd,GAAWvU,UAAU,EAAE1B,KAAKiW,GAAWlL,OAAO9K,KAAKgW,GAAWjL,OAAOE,MAAM+K,GAAWhL,OAAAA,CAAAA;AAC3IhQ,QAAOG,KAAK,CAAC,iBAAiB,YAAY,kBAAkB,QAAQ,OAAO,KAAA,GAAQ,SAAUmc,IAAAA;AAC3F,YAAIC,KAAKvB,GAAWsB,EAAAA,GAChBE,KAAKH,GAAIC,EAAAA;AACbtB,QAAAA,GAAWsB,EAAAA,IAAUD,GAAIC,MAAU,WAAA;AACjC,cAAIvb,KAAOnB,MAAM9G,UAAUiH,MAAMK,KAAKC;AAEtC,iBADAmc,GAAGxb,MAAMqb,IAAKtb,EAAAA,GACPwb,GAAGvb,MAAMga,IAAYja,EAAAA;AAAAA,QAC9B;AAAA,MACF,IACAsI,GAAIuD,SAAS+N,IAAI,YAAA,GACjBK,GAAW5S,WAAWuR,aAAa0C,GAAIjU,YAAY4S,GAAW5S,WAAW+T,iBAAAA;AAAAA,IAC3E,WAAWnB,cAAsBpK,IAAqB;AACpD,UAAI7R,KAAI,SAAW0d,IAAAA;AACjB,YAAIzc,EAAOqC,SAAS2Y,GAAWlL,UAAU9P,EAAOqC,SAAS2Y,GAAWjL,KAAAA,GAAQ;AAC1E,cAAI2M,KAAU1B,GAAWS,KAAKU,kBAAkBA,kBAAkB/M,WAC9DuN,KAAe3B,GAAWY,MAAMlE,YAAY3K,QAAQiO,EAAAA,IAAAA;AACxDA,UAAAA,GAAWgB,OAAAA;AACX,cAAIY,KAAgBvB,GAAK3C,IAAKsC,GAAWtd,QAAQsd,GAAWvU,UAAU,EACpE+U,QAAQR,GAAWS,KAAKM,oBACxBT,aAAa,CAACN,GAAWlL,OAAOkL,GAAWjL,OAAOiL,GAAWhL;AAI/D,iBAFA4M,GAAc9D,KAAK4D,EAAAA,GACfC,MAAcC,GAAcR,OAAAA,GACzBQ;AAAAA,QACT;AACA,eAAOH;AAAAA,MACT;AACAzB,MAAAA,GAAWjW,MAAM/E,EAAOa,QAAQ9B,IAAGic,GAAWjW,GAAAA,GAC9CiW,GAAWhW,MAAMhF,EAAOa,QAAQ9B,IAAGic,GAAWhW,GAAAA;AAAAA,IAChD,MAAWgW,CAAAA,cAAsB5M,MAC/B/E,GAAI1I,KAAKga,IAAI,SAAS,WAAA;AACpBtR,SAAImB,UAAUwQ,GAAWxM,YAAY;IACvC,CAAA,GACAnF,GAAI1I,KAAKqa,GAAWxM,YAAY,SAAS,SAAUvF,IAAAA;AACjDA,MAAAA,GAAE4T,gBAAAA;AAAAA,IACJ,CAAA,KACS7B,cAAsB5I,MAC/B/I,GAAI1I,KAAKga,IAAI,SAAS,WAAA;AACpBtR,SAAImB,UAAUwQ,GAAW3I,UAAU;IACrC,CAAA,GACAhJ,GAAI1I,KAAKga,IAAI,aAAa,WAAA;AACxBtR,SAAIuD,SAASoO,GAAW3I,UAAU;IACpC,CAAA,GACAhJ,GAAI1I,KAAKga,IAAI,YAAY,WAAA;AACvBtR,SAAI6D,YAAY8N,GAAW3I,UAAU;IACvC,CAAA,KACS2I,cAAsBzI,OAC/BlJ,GAAIuD,SAAS+N,IAAI,OAAA,GACjBK,GAAWtS,gBAAgB1I,EAAOa,QAAQ,SAAUuI,IAAAA;AAElD,aADAuR,GAAGlR,MAAMqT,kBAAkB9B,GAAWxI,QAAQ1T,YACvCsK;AAAAA,IACT,GAAG4R,GAAWtS,aAAAA,GACdsS,GAAWtS,cAAAA;AAEbsS,IAAAA,GAAWtM,WAAW1O,EAAOa,QAAQ,SAAUuI,IAAAA;AAI7C,aAHIsP,GAAID,QAAAA,EAAUE,mBAAmBqC,GAAW+B,WAAAA,KAC9ClC,GAAmBnC,GAAID,QAAAA,GAAAA,OAElBrP;AAAAA,IACT,GAAG4R,GAAWtM,QAAAA;AAAAA,EAChB,EA0DoBgK,IAAKiC,IAAIK,KAC3BtC,GAAInB,cAAc3e,KAAKoiB,EAAAA,GAChBA;AACT;AACA,SAAS1C,GAAoBI,IAAKjY,IAAAA;AAChC,SAAO4H,SAAS2U,SAAS7O,OAAO,MAAM1N;AACxC;AACA,SAASwc,GAAgBvE,IAAKI,IAAMoE;AAClC,MAAI/N,KAAM9G,SAASC,cAAc,QAAA;AACjC6G,EAAAA,GAAIC,YAAY0J,IAChB3J,GAAI7J,QAAQwT,IACZJ,GAAIC,gBAAgBhK,YAAYQ,EAAAA,GAC5B+N,OACFxE,GAAIC,gBAAgBrJ,gBAAgBoJ,GAAIC,gBAAgBjZ,SAAS;AAErE;AACA,SAASyd,GAAgBzE,IAAK0E,IAAAA;AAC5BA,EAAAA,GAAQ3T,MAAM2K,UAAUsE,GAAIN,kBAAkB,UAAU;AAC1D;AA+EA,SAASiC,GAAgB3B,IAAAA;AACvB,MAAI2E,KAAAA;AASJ,WAASC,GAAKrU;AAKZ,WAJAA,GAAE0I,kBACF+G,GAAIxf,SAASmkB,KAAUpU,GAAE+B,SACzB0N,GAAIzf,SAAAA,GACJokB,KAAUpU,GAAE+B,SAAAA;AAAAA,EAEd;AACA,WAASuS;AACPlU,OAAI6D,YAAYwL,GAAIO,eAAe7B,GAAIoG,aACvCnU,GAAIoD,OAAOlB,QAAQ,aAAa+R,EAAAA,GAChCjU,GAAIoD,OAAOlB,QAAQ,WAAWgS,EAAAA;AAAAA,EAChC;AACA,WAASE,GAAUxU;AAMjB,WALAA,GAAE0I,kBACF0L,KAAUpU,GAAE+B,SACZ3B,GAAIuD,SAAS8L,GAAIO,eAAe7B,GAAIoG,UAAAA,GACpCnU,GAAI1I,KAAK4K,QAAQ,aAAa+R,EAAAA,GAC9BjU,GAAI1I,KAAK4K,QAAQ,WAAWgS;EAE9B;AA3BA7E,EAAAA,GAAIgF,kBAAkBrV,SAASC,cAAc,KAAA,GAC7CtI,EAAOE,OAAOwY,GAAIgF,gBAAgBjU,OAAO,EACvCvQ,OAAO,OACP6b,YAAY,QACZ5b,QAAQ,SACRkb,QAAQ,aACRlK,UAAU,eAsBZd,GAAI1I,KAAK+X,GAAIgF,iBAAiB,aAAaD,EAAAA,GAC3CpU,GAAI1I,KAAK+X,GAAIO,eAAe,aAAawE,EAAAA,GACzC/E,GAAItQ,WAAWuR,aAAajB,GAAIgF,iBAAiBhF,GAAItQ,WAAW+T,iBAAAA;AAClE;AACA,SAAStD,GAASH,IAAKiF;AACrBjF,EAAAA,GAAItQ,WAAWqB,MAAMvQ,QAAQykB,KAAI,MAC7BjF,GAAIkF,cAAclF,GAAId,cACxBc,GAAIkF,WAAWnU,MAAMvQ,QAAQykB,KAAI,OAE/BjF,GAAIO,kBACNP,GAAIO,cAAcxP,MAAMvQ,QAAQykB,KAAI;AAExC;AACA,SAASE,GAAiBnF,IAAKoF,IAAAA;AAC7B,MAAI9Z,KAAW,CAAA;AASf,SARAhE,EAAOG,KAAKuY,GAAIlB,qBAAqB,SAAUpO,IAAKgE,IAAAA;AAClD,QAAI2Q,KAAc,CAAA,GACd7C,KAAgBxC,GAAIjB,uCAAuCrK,EAAAA;AAC/DpN,MAAOG,KAAK+a,IAAe,SAAUF,IAAYvU,IAAAA;AAC/CsX,MAAAA,GAAYtX,MAAYqX,KAAmB9C,GAAW7S,eAAe6S,GAAWrS;IAClF,CAAA,GACA3E,GAASoJ,MAAS2Q;AAAAA,EACpB,CAAA,GACO/Z;AACT;AAQA,SAASga,GAAeC,IAAAA;AACS,QAA3BA,GAAgBve,UAClBkW,GAAwBxV,KAAKmL,QAAQ;AACnCyS,OAAeC,EAAAA;AAAAA,EACjB,CAAA,GAEFje,EAAOG,KAAK8d,IAAiB,SAAUpZ;AACrCA,IAAAA,GAAE6D,cAAAA;AAAAA,EACJ;AACF;AAtkBA0O,GAAI8G,aAAa,WAAA;AACf3H,OAAAA,CAAQA,IACRvW,EAAOG,KAAKgX,IAAc,SAAUuB,IAAAA;AAClCA,IAAAA,GAAItQ,WAAWqB,MAAM2K,UAAUmC,KAAO,SAAS;AAAA,EACjD,CAAA;AACF,GACAa,GAAI8C,mBAAmB,KACvB9C,GAAI6C,6BAA6B,MACjC7C,GAAIiC,aAAa,QACjBjC,GAAIuE,uBAAuB,MAC3BvE,GAAI+G,iBAAiB,sBACrB/G,GAAI4B,eAAe,UACnB5B,GAAIqC,qBAAqB,gBACzBrC,GAAIsC,kBAAkB,aACtBtC,GAAIyC,qBAAqB,gBACzBzC,GAAIoG,aAAa,QACjBpG,GAAIS,gBAAgB,KACpBT,GAAI+B,cAAc,kBAClB/B,GAAI8B,YAAY,iBAChB9B,GAAIgH,kBAAkB,SAAUnV,IAAAA;AACM,aAAhCZ,SAAS6F,cAAchQ,QApQT,OAoQ6B+K,GAAEoV,SApQ/B,OAoQ0DpV,GAAE+C,WAC5EoL,GAAI8G,WAAAA;AAER,GACA7U,GAAI1I,KAAK4K,QAAQ,WAAW6L,GAAIgH,iBAAAA,KAAiB,GACjDpe,EAAOE,OAAOkX,GAAIte,WAClB,EACEwlB,KAAK,SAAa5gB,IAAQ+I,IAAAA;AACxB,SAAO4U,GAAKvjB,MAAM4F,IAAQ+I,IAAU,EAClC6U,aAAa1b,MAAM9G,UAAUiH,MAAMK,KAAKC,WAAW,CAAA,EAAA,CAAA;AAEvD,GACAke,UAAU,SAAkB7gB,IAAQ+I,IAAAA;AAClC,SAAO4U,GAAKvjB,MAAM4F,IAAQ+I,IAAU,EAClChI,OAAAA,KAAO,CAAA;AAEX,GACAud,QAAQ,SAAgBhB;AACtBljB,OAAKuf,KAAKmH,YAAYxD,GAAWS,IAAAA,GACjC3jB,KAAKyf,cAAclK,OAAOvV,KAAKyf,cAAcxK,QAAQiO,EAAAA,GAAa,CAAA;AAClE,MAAI1M,KAAQxW;AACZkI,IAAOqB,MAAM,WAAA;AACXiN,IAAAA,GAAMrV,SAAAA;AAAAA,EACR,CAAA;AACF,GACAwlB,SAAS,WAAA;AACP,MAAI3mB,KAAKmG,OACP,OAAM,IAAIwJ,MAAM,4GAAA;AAEd3P,OAAK8f,aACPV,GAAmBsH,YAAY1mB,KAAKsQ,UAAAA;AAEtC,MAAIkG,KAAQxW;AACZkI,IAAOG,KAAKrI,KAAKwf,WAAW,SAAUoH,IAAAA;AACpCpQ,IAAAA,GAAMqQ,aAAaD,EAAAA;AAAAA,EACrB,CAAA,GACArV,GAAIoD,OAAOlB,QAAQ,WAAW6L,GAAIgH,iBAAAA,KAAiB,GACnDxD,GAAgB9iB,IAAAA;AAClB,GACA8mB,WAAW,SAAmB9F,IAAAA;AAC5B,iBAAIhhB,KAAKwf,UAAUwB,EAAAA,EACjB,OAAM,IAAIrR,MAAM,wDAA6DqR,KAAO,GAAA;AAEtF,MAAI+F,KAAe,EAAE/F,MAAMA,IAAM7a,QAAQnG;AACzC+mB,EAAAA,GAAajH,YAAY9f,KAAK8f,WAC1B9f,KAAKkgB,QACTlgB,KAAKkgB,KAAK8G,WACVhnB,KAAKkgB,KAAK8G,QAAQhG,EAAAA,MAChB+F,GAAa9F,SAASjhB,KAAKkgB,KAAK8G,QAAQhG,IAAMC,QAC9C8F,GAAa7G,OAAOlgB,KAAKkgB,KAAK8G,QAAQhG,EAAAA;AAExC,MAAIJ,KAAM,IAAItB,GAAIyH;AAClB/mB,OAAKwf,UAAUwB,MAAQJ;AACvB,MAAIiC,KAAKX,GAAOliB,MAAM4gB,GAAItQ,UAAAA;AAE1B,SADAiB,GAAIuD,SAAS+N,IAAI,QAAA,GACVjC;AACT,GACAiG,cAAc,SAAsBI,IAAAA;AAClCjnB,OAAKuf,KAAKmH,YAAYO,GAAO3W,WAAW4W,aAAAA,GAAAA,OACjClnB,KAAKwf,UAAUyH,GAAOjG,OACzBhhB,KAAKkgB,QACTlgB,KAAKkgB,KAAK8G,WACVhnB,KAAKkgB,KAAK8G,QAAQC,GAAOjG,IAAAA,KAAAA,OAChBhhB,KAAKkgB,KAAK8G,QAAQC,GAAOjG,OAElC8B,GAAgBmE,EAAAA;AAChB,MAAIzQ,KAAQxW;AACZkI,IAAOG,KAAK4e,GAAOzH,WAAW,SAAUoH;AACtCK,IAAAA,GAAOJ,aAAaD;EACtB,CAAA,GACA1e,EAAOqB,MAAM,WAAA;AACXiN,IAAAA,GAAMrV,SAAAA;AAAAA,EACR,CAAA;AACF,GACAgmB,MAAM,WAAA;AACJnnB,OAAKihB,SAAAA;AACP,GACAmG,OAAO;AACLpnB,OAAKihB,SAAAA;AACP,GACAxC,MAAM;AACJze,OAAKsQ,WAAWqB,MAAM2K,UAAU;AAClC,GACA+K,MAAM,WAAA;AACJrnB,OAAKsQ,WAAWqB,MAAM2K,UAAU;AAClC,GACAnb,UAAU,WAAA;AACR,MAAIkf,KAAOrgB,KAAK2gB;AAChB,MAAIN,GAAKD,YAAY;AACnB,QAAI5N,KAAMjB,GAAIsE,UAAUwK,GAAKd,IAAAA,EAAM/M,KAC/BlL,KAAI;AACRY,MAAOG,KAAKgY,GAAKd,KAAKuC,YAAY,SAAUwF,IAAAA;AACpCjH,MAAAA,GAAKP,aAAawH,OAASjH,GAAKyF,eACpCxe,MAAKiK,GAAIqE,UAAU0R,EAAAA;AAAAA,IAEvB,CAAA,GACI7T,OAAOoL,cAAcrM,KAnWL,KAmWiClL,MACnDiK,GAAIuD,SAASuL,GAAK/P,YAAYgP,GAAI+G,cAAAA,GAClChG,GAAKd,KAAK5N,MAAMtQ,SAASoS,OAAOoL,cAAcrM,KArW5B,KAqWwD,SAE1EjB,GAAI6D,YAAYiL,GAAK/P,YAAYgP,GAAI+G,iBACrChG,GAAKd,KAAK5N,MAAMtQ,SAAS;AAAA,EAE7B;AACIgf,EAAAA,GAAKuF,mBACP1d,EAAOqB,MAAM;AACX8W,IAAAA,GAAKuF,gBAAgBjU,MAAMtQ,SAASgf,GAAKd,KAAKgI,eAAe;AAAA,EAC/D,IAEElH,GAAKc,kBACPd,GAAKc,cAAcxP,MAAMvQ,QAAQif,GAAKjf,QAAQ;AAElD,GACAkhB,mBAAmBpa,EAAOwB,SAAS;AACjC1J,OAAKmB,SAAAA;AACP,GAAG,EAAA,GACHqmB,UAAU,WAAA;AAKR,MAJItf,EAAOU,YAAYsW,EAAAA,OACrBA,KAAgB,IAAId,MACN9N,WAAWgH,YA9eN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAgfjBtX,KAAKmG,OACP,OAAM,IAAIwJ,MAAM;AAElB,MAAI6G,KAAQxW;AACZkI,IAAOG,KAAKP,MAAM9G,UAAUiH,MAAMK,KAAKC,SAAAA,GAAY,SAAU3C;AAClB,UAArC4Q,GAAMkJ,oBAAoB9X,UA+RpC,SAAqBgZ,IAAAA;AACnB,UAAI6G,KAAM7G,GAAIkF,aAAavV,SAASC,cAAc,IAAA;AAClDe,SAAIuD,SAAS8L,GAAItQ,YAAY,UAAA,GAC7BsQ,GAAIrB,KAAKsC,aAAa4F,IAAK7G,GAAIrB,KAAKmI,aACpCnW,GAAIuD,SAAS2S,IAAK,UAAA;AAClB,UAAIE,KAAQpX,SAASC,cAAc,MAAA;AACnCmX,MAAAA,GAAMrQ,YAAY,UAClB/F,GAAIuD,SAAS6S,IAAO,cAAA;AACpB,UAAIC,KAASrX,SAASC,cAAc,MAAA;AACpCoX,MAAAA,GAAOtQ,YAAY,QACnB/F,GAAIuD,SAAS8S,IAAQ,WACrBrW,GAAIuD,SAAS8S,IAAQ,MAAA;AACrB,UAAIC,KAAUtX,SAASC,cAAc,MAAA;AACrCqX,MAAAA,GAAQvQ,YAAY,OACpB/F,GAAIuD,SAAS+S,IAAS,QAAA,GACtBtW,GAAIuD,SAAS+S,IAAS,SAAA;AACtB,UAAIC,KAAUvX,SAASC,cAAc;AACrCsX,MAAAA,GAAQxQ,YAAY,UACpB/F,GAAIuD,SAASgT,IAAS,QAAA,GACtBvW,GAAIuD,SAASgT,IAAS,QAAA;AACtB,UAAIC,KAASnH,GAAIC,kBAAkBtQ,SAASC,cAAc,QAAA;AACtDoQ,MAAAA,GAAIV,QAAQU,GAAIV,KAAKmD,aACvBnb,EAAOG,KAAKuY,GAAIV,KAAKmD,YAAY,SAAU7V,IAAO7E;AAChDwc,WAAgBvE,IAAKjY,IAAKA,OAAQiY,GAAIT;MACxC,CAAA,IAEAgF,GAAgBvE,IAAK7B,IAAAA;AAavB,UAXAxN,GAAI1I,KAAKkf,IAAQ,UAAU;AACzB,iBAASzS,KAAQ,GAAGA,KAAQsL,GAAIC,gBAAgBjZ,QAAQ0N,KACtDsL,CAAAA,GAAIC,gBAAgBvL,IAAOgC,YAAYsJ,GAAIC,gBAAgBvL,EAAAA,EAAO9H;AAEpEoT,QAAAA,GAAIT,SAASngB,KAAKwN;AAAAA,MACpB,CAAA,GACAia,GAAI5Q,YAAYkR,EAAAA,GAChBN,GAAI5Q,YAAY8Q,KAChBF,GAAI5Q,YAAY+Q,KAChBH,GAAI5Q,YAAYgR,KAChBJ,GAAI5Q,YAAYiR,EAAAA,GACZ9I,IAAwB;AAC1B,YAAIsG,KAAU/U,SAASyX,eAAe,kBAAA,GAClCC,KAAuB1X,SAASyX,eAAe;AACjCzX,iBAASyX,eAAe,mBAC9BrW,MAAM2K,UAAU,SACsC,WAA9D2C,aAAasB,QAAQC,GAAoBI,IAAK,SAAA,CAAA,KAChDqH,GAAqBtR,aAAa,WAAW,SAAA,GAE/C0O,GAAgBzE,IAAK0E,EAAAA,GACrB/T,GAAI1I,KAAKof,IAAsB,UAAU,WAAA;AACvCrH,UAAAA,GAAIN,kBAAAA,CAAmBM,GAAIN,iBAC3B+E,GAAgBzE,IAAK0E;QACvB,CAAA;AAAA,MACF;AACA,UAAI4C,KAAyB3X,SAASyX,eAAe,oBAAA;AACrDzW,SAAI1I,KAAKqf,IAAwB,WAAW,SAAU/W,IAAAA;AAAAA,SAChDA,GAAE8C,WAAwB,OAAZ9C,GAAEoV,SAA8B,OAAdpV,GAAE+C,WACpCgL,GAAcT;MAElB,CAAA,GACAlN,GAAI1I,KAAK8e,IAAO,SAAS,WAAA;AACvBO,QAAAA,GAAuB5Q,YAAYmK,KAAKe,UAAU5B,GAAI6B,cAAAA,GAAAA,QAA4B,CAAA,GAClFvD,GAAcmI,QACda,GAAuBC,MAAAA,GACvBD,GAAuBH,OAAAA;AAAAA,MACzB,CAAA,GACAxW,GAAI1I,KAAK+e,IAAQ,SAAS,WAAA;AACxBhH,QAAAA,GAAIwH,KAAAA;AAAAA,MACN,CAAA,GACA7W,GAAI1I,KAAKgf,IAAS,SAAS,WAAA;AACzB,YAAIQ,KAAaC,OAAO,0BAAA;AACpBD,QAAAA,MACFzH,GAAI2H,OAAOF;MAEf,CAAA,GACA9W,GAAI1I,KAAKif,IAAS,SAAS,WAAA;AACzBlH,QAAAA,GAAIE;MACN,CAAA;AAAA,IACF,EA3WoBtK,EAAAA,GAAAA,OAEVA,GAAMkJ,oBAAoBzK,QAAQrP,EAAAA,KACpC4Q,GAAMkJ,oBAAoB5e,KAAK8E,EAAAA;AAAAA,EAEnC,IACI5F,KAAK8f,aACPiB,GAAS/gB,MAAMA,KAAKoB,KAAAA;AAExB,GACAuf,SAAS,WAAA;AAEP,WADIC,KAAM5gB,MACH4gB,GAAIza,SACTya,CAAAA,KAAMA,GAAIza;AAEZ,SAAOya;AACT,GACA6B,eAAe;AACb,MAAIvW,KAAWlM,KAAKkgB;AAapB,SAZAhU,GAAS+U,SAASjhB,KAAKihB,QACnBjhB,KAAK0f,oBAAoB9X,SAAS,MACpCsE,GAASiU,SAASngB,KAAKmgB,QAClBjU,GAASmX,eACZnX,GAASmX,aAAa,CAAA,IAExBnX,GAASmX,WAAWrjB,KAAKmgB,MAAAA,IAAU4F,GAAiB/lB,IAAAA,IAEtDkM,GAAS8a,UAAU,CAAA,GACnB9e,EAAOG,KAAKrI,KAAKwf,WAAW,SAAUpI,IAASzO,IAAAA;AAC7CuD,IAAAA,GAAS8a,QAAQre,EAAAA,IAAOyO,GAAQqL;EAClC,CAAA,GACOvW;AACT,GACAkc,MAAM,WAAA;AACCpoB,OAAKkgB,KAAKmD,eACbrjB,KAAKkgB,KAAKmD,aAAa,CAAA,IAEzBrjB,KAAKkgB,KAAKmD,WAAWrjB,KAAKmgB,MAAAA,IAAU4F,GAAiB/lB,IAAAA,GACrD+iB,GAAmB/iB,WAAM,GACzBA,KAAK0iB;AACP,GACA6F,QAAQ,SAAgBF,IAAAA;AACjBroB,OAAKkgB,KAAKmD,eACbrjB,KAAKkgB,KAAKmD,aAAa,CAAA,GACvBrjB,KAAKkgB,KAAKmD,WAAWtE,EAAAA,IAA+BgH,GAAiB/lB,MAAAA,IAAM,IAE7EA,KAAKkgB,KAAKmD,WAAWgF,MAActC,GAAiB/lB,IAAAA,GACpDA,KAAKmgB,SAASkI,IACdlD,GAAgBnlB,MAAMqoB,QAAY,GAClCroB,KAAK0iB;AACP,GACA5B,QAAQ,SAAgBF,IAAAA;AACtB1Y,IAAOG,KAAKrI,KAAKyf,eAAe,SAAUyD,IAAAA;AACnCljB,SAAK2gB,QAAAA,EAAUT,KAAKmD,aAGvBJ,GAAiBrC,MAAO5gB,KAAK2gB,QAAAA,GAAWuC,MAFxCA,GAAWtM,SAASsM,GAAW7S,YAAAA,GAI7B6S,GAAWxS,oBACbwS,GAAWxS,iBAAiBpI,KAAK4a,IAAYA,GAAWrS;EAE5D,GAAG7Q,IAAAA,GACHkI,EAAOG,KAAKrI,KAAKwf,WAAW,SAAUyH;AACpCA,IAAAA,GAAOnG,OAAOmG;EAChB,CAAA,GACKrG,MACHmC,GAAmB/iB,KAAK2gB,QAAAA,GAAAA,KAAW;AAEvC,GACA2D,QAAQ,SAAgBpB,IAAAA;AACtB,MAAIvP,KAAmC,MAA5B3T,KAAK4f,YAAYhY;AAC5B5H,OAAK4f,YAAY9e,KAAKoiB,EAAAA,GAClBvP,MACFuS,GAAelmB,KAAK4f,WAAAA;AAExB,GACAhP,eAAe,WAAA;AACb1I,IAAOG,KAAKrI,KAAKyf,eAAe,SAAUyD,IAAAA;AACxCA,IAAAA,GAAWtS,cAAAA;AAAAA,EACb,CAAA,GACA1I,EAAOG,KAAKrI,KAAKwf,WAAW,SAAUyH;AACpCA,IAAAA,GAAOrW,cAAAA;AAAAA,EACT;AACF,EAAA,CAAA;AAoXF,IAAI4X,KAAQlJ;ACx7EL,MAAMmJ,KAAsC,EACjD3I,iBACA1e,OAAO,KACPsnB,UAAAA,OACAzH,cAAQ,GAMG0H,KAAe,CAAC,OAAO,MAAM,OAAO,OAAO,MAAM,MAAM,OAAO,QAAQ,QAAQ,OAAO,QAKrFC,KAAe,CAAC,QAAQ,QAAQ,aAAa,WAAW,QAAQ,QAAA,GAKhEC,KAAgB,CAAC,gBAAgB,oBAAoB,cAAc,aAAa,mBAAmB,eAAA,GAKnGC,KAAe,CAAC,QAAQ,QAAQ,QAAQ,MAAA,GAKxCC,KAAgB,CAAC,QAAQ,UAAU,QAAA;ACXzC,MAAMC,KAA0C,EACrDC,MAAM,EACJ3lB,SAAAA,MACA4lB,MAAM,KACNC,WAAW,KACXC,iBAAiB,SACjBC,WAAW,WAEbC,MAAM,EACJhmB,eACA4lB,MAAM,KAERK,OAAO,EACLjmB,gBACAZ,MAAM,KAER8mB,YAAY,EACVlmB,SAAAA,OACA4lB,MAAM,KACN7W,UAAU,kBAEZoX,YAAY,EACVnmB,gBACAqD,OAAO,SAAA,EAAA;ACxCJ,SAAS+iB,GACdC,IACAC,IACAC;AAGA,SADkB,IAAIjlB,EAAMklB,UAAUC,WAAWH,IAAQD,EAAAA,EAAQK,YAChDC,eAAeJ,EAAAA,EAAUrD,IAAImD,EAAAA;AAChD;AAmBO,SAASO,GAAM1c,IAAeP,IAAaC,IAAAA;AAChD,SAAO9K,KAAK8K,IAAID,IAAK7K,KAAK6K,IAAIC,IAAKM;AACrC;AC7CO,SAAS2c,GAAcvkB,IAAAA;AAC5B,QAAM2e,KAAM,IAAI3f,EAAMwlB,OAAOC,cAAczkB,OACrCsH,KAAEA,IAAAD,KAAKA,GAAAA,IAAQsX,IAEf+F,KAAS,IAAI1lB,EAAMklB;AACzBvF,EAAAA,GAAIgG,UAAUD,EAAAA;AAId,SAAO,EAAEpd,KAAAA,IAAKD,SAAKqd,QAAAA,IAAQtmB,QAFZ,IAAIY,EAAMklB,UAAUC,WAAW7c,IAAKD,EAAAA,EAAKrF,WAAW,EAAA;AAGrE;ACmBO,MAAM4iB,KAA4C,EACvDC,OAAO,MACPC,UAAU;ACFL,MAAMC,KAAkD,EAC7DC,iBAAiB,GACjBC,aAAa,eAAA;ACbR,MAAMC,KAA8C,EACzDvkB,aAAa,QACbwkB,kBAAkB,QAClBC,qBAAqB,QACrBC,aAAa,GACbC,WAAW,KAAA;ACON,MAAMC,KAA4C,EACvDC,cAAc,QACdC,iBAAiB;AC4BZ,MAAMC,KAAgD,EAC3DC,aAAa,EAAA;ACzBR,MAAMC,KAAgD,EAC3DC,aAAa,QACbC,cAAc;ACfT,MAAMC,KAAgD,EAC3DC,cAAc,KACdC,OAAO,GACPC,OAAO,KACPC,aAAa,IACbC,QAAQ,IACRC,gBAAgB,QAChBC,WAAW;ACrBN,MAAMC,KAA8C,EACzDC,SAAS,EAAEjZ,GAAG,GAAGE,UAAUgZ,GAAG,KAC9BC,aAAa,EAAA;ACgBR,MAAMC,KAAwC,EACnDC,gBAAgB,uEAChBjB,aAAa,GACbkB,eAAe;ACEV,MAAMC,KAAsD,EACjEC,KAAK,EACHrpB,gBACA8C,MAAM,UACNO,OAAO,UACPimB,MAAM,GACNC,KAAK,KACLC,SAAS,SAEXC,QAAQ,MACRC,gBAAgB,MAChBC,sBAAsB,GACtBC,sBAAsB,GACtBC,qBAAqB,EAAA;ACOhB,MAAMC,KAA0D,EACrEC,SAAS,SACTC,iBAAAA,OACAC,iBAAAA,MACAC,iBAAAA,MACAC,qBAAgB;0BTnBX,cAA8B3tB,EAAAA;AAAAA,EAYnC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAK/C,IAAAA,GAA6B5qB,OAZ1CC,KAASghB,OAAO,aAGhBhhB,KAAQ2tB,SAAsB,IAG9B3tB,KAAQ4tB,kBAA8C,CAAA,GAGtD5tB,KAAQ6tB,SAA4B,CAAA;AAAA,EAIpC;AAAA,EAEU,cAAAttB;AAERP,SAAK8tB;EACP;AAAA,EAEA,SAAS7sB,IAAAA;;AAEP,eAAW8sB,MAAQ/tB,KAAK2tB,OACtBI,CAAAA,GAAKC,MAAMC,OAAOF,GAAKG,MAAMC,SAAAA,CAAAA;AAI/B,eAAWC,MAAQpuB,KAAK4tB,iBAAiB;AACvC,UAAIQ,GAAKC,MAAO;AAIhB,UAFAD,GAAKE,QAAQF,GAAK3D,QAAQ,KAEtB2D,GAAKE,OAAO,KAAKF,GAAKE,OAAO,GAAG;AAClCF,QAAAA,GAAKE,OAAOF,GAAKE,OAAO,IAAI,IAAI,GAChCF,GAAKC,QAAAA,OACLD,KAAAA,GAAKG,qBAALH,wBAAAA;AACA;AAAA,MACF;AAEA,YAAMI,KAAQJ,GAAKK,MAAMC,WAAWN,GAAKE,IAAAA;AACzCF,YAAAA,GAAKO,kBAALP,wBAAAA,IAAqBI;AAAAA,IACvB;AAAA,EACF;AAAA,EAOA,mBACE5oB,IACAkN,IAAAA;AAEA,UAAMnN,KAAMC,IACNgpB,KAAchpB,GAAegpB;AAEnC,QAAA,CAAKA,MAAoC,MAAtBA,GAAWhnB,OAE5B,QAAO;AAGT,UAQMinB,KAAa,KARwB,EACzCC,UAAAA,MACArE,OAAO,GACPsE,cAAcH,GAAWzX,IAAI,MAAA,IAAM,GACnC6X,WAAW,GACXC,MAAAA,WAGwCnc,IAAAA,GAAYlN,GAAespB,uBAE/DhB,KAAQ,IAAItpB,EAAMuqB,SAClBnB,KAAQ,IAAIppB,EAAMwqB,eAAezpB,EAAAA,GAEjC0pB,KAAUT,GACbnpB,OAAO,CAAC6pB,IAAGha,OAAUuZ,GAAWE,aAAazZ,EAAAA,CAAAA,EAC7C6B,IAAIoY,CAAAA;AACH,YAAMC,KAASxB,GAAMyB,WAAWF,EAAAA;AAQhC,aAPAC,GAAOP,OAAOJ,GAAWI,OAAOrqB,EAAM8qB,aAAa9qB,EAAM+qB,UACzDH,GAAOlB,OAAOO,GAAWG,WACzBQ,GAAOI,YAAYf,GAAWpE,OAC9B+E,GAAOK,oBAAAA,MACHhB,GAAWC,YACbU,GAAOM,KAAAA,GAEFN;AAAAA,QAGLzB,KAAkB,EAAEC,WAAOpoB,QAAQD,IAAK0pB,aAASnB,OAAAA,GAAAA;AAQvD,WAPAluB,KAAK2tB,OAAO7sB,KAAKitB,KAGfnoB,GAAespB,sBAAsBL,IAEvC7uB,KAAKU,OAAOqvB,KAAK,mBAAmB,EAAEnqB,QAAQD,GAAAA,CAAAA,GAEvCooB;AAAAA,EACT;AAAA,EAKA,mBAAmBnoB,IAAAA;AACjB,UAAM0P,KAAQtV,KAAK2tB,OAAOqC,UAAUC,CAAAA,OAAKA,GAAErqB,WAAWA,EAAAA;AACtD,QAAI0P,KAAAA,IAAY;AACDtV,WAAK2tB,OAAOrY,EAAAA,EACpB+Z,QAAQtnB,QAAQynB,CAAAA,OAAUA,GAAOU,SACtClwB,KAAK2tB,OAAOpY,OAAOD,IAAO,CAAA,GAC1BtV,KAAKU,OAAOqvB,KAAK,kBAAkB,EAAEnqB,QAAAA,GAAAA,CAAAA;AAAAA,IACvC;AAAA,EACF;AAAA,EAKA,qBAAqBA,IAAwBuqB,IAAAA;AAC3C,UAAMpC,KAAO/tB,KAAK2tB,OAAOyC,KAAKH,CAAAA,OAAKA,GAAErqB,WAAWA;AAC5CmoB,IAAAA,MACFA,GAAKsB,QAAQtnB,QAAQynB,CAAAA,OAAAA;AACnBA,MAAAA,GAAOW,SAASA;AAAAA,IAAAA,CAAAA;AAAAA,EAGtB;AAAA,EAKA,aAAavqB;AACX,WAAO5F,KAAK2tB,OAAOyC,KAAKH,CAAAA,OAAKA,GAAErqB,WAAWA;EAC5C;AAAA,EAOA,MACEjB,IACA0rB,IACAC;AAEA,UAAMC,KAAQC,EAAKH,GAAG1rB,IAAQ,KACzB0rB,IACHI,WAAUH,MAAAA,gBAAAA,GAAOG,aAAYzwB,KAAKD,OAAO6qB,iBACzC8F,OAAMJ,MAAAA,gBAAAA,GAAOI,SAAQ1wB,KAAKD,OAAO8qB,aACjC8F,SAAQL,MAAAA,gBAAAA,GAAOK,WAAU,GACzBC,OAAMN,MAAAA,gBAAAA,GAAOM,SAAAA,OACbC,WAAUP,MAAAA,gBAAAA,GAAOO,aAAAA,MACjB9vB,UAAUuvB,MAAAA,gBAAAA,GAAOvvB,UACjB+vB,YAAY;;AACVR,YAAAA,MAAAA,gBAAAA,GAAOQ,eAAPR,wBAAAA;AAEA,YAAMhb,KAAQtV,KAAK6tB,OAAO5Y,QAAQsb,EAAAA;AAC9Bjb,MAAAA,WAAYtV,KAAK6tB,OAAOtY,OAAOD,IAAO;;AAM9C,WAFAtV,KAAK6tB,OAAO/sB,KAAKyvB,EAAAA,GAEV,EACLT,MAAM,MAAMS,GAAMT,KAAAA,GAClBzB,OAAO,MAAMkC,GAAMlC,SACnB0C,QAAQ,MAAMR,GAAMQ,OAAAA,GACpBC,MAAM,MAAA;AACJT,MAAAA,GAAMS;AACN,YAAM1b,KAAQtV,KAAK6tB,OAAO5Y,QAAQsb,EAAAA;AAC9Bjb,MAAAA,KAAAA,MAAYtV,KAAK6tB,OAAOtY,OAAOD,IAAO,CAAA;AAAA,IAAA,GAE5C2b,UAAWzjB,CAAAA,QAAAA,WACLA,MACF+iB,GAAMU,SAASzjB,KAEV+iB,GAAMU,SAAAA,GAAAA;AAAAA,EAGnB;AAAA,EAKA,cACEzvB,IACA0vB,IACAC,IACAb,IAAAA;AAEA,WAAOc,QAAQC,IAAI,CACjB,IAAID,QAAcE,CAAAA,OAAAA;AAChBtxB,WAAKuwB,MAAM/uB,GAAO6Q,UAAU8e,GAAU9e,UAAU,EAAA,GAC3Cie,IACHQ,YAAYQ,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAGhB,IAAIF,QAAcE,CAAAA,OAAAA;AAChBtxB,WAAKuwB,MAAMW,GAASvsB,QAAQwsB,GAAUxsB,QAAQ,KACzC2rB,IACHQ,YAAYQ;SAGfC,KAAK,MAAA;AAAA,IAAA,CAAA;AAAA,EACV;AAAA,EAKA,iBACE3rB,IACA4rB,IAKAlB,IAAAA;AAEA,UAAMmB,KAA4B,CAAA;AA6BlC,WA3BID,GAAUnf,YACZof,GAAS3wB,KAAK,IAAIswB,QAAQE,CAAAA,OAAAA;AACxBtxB,WAAKuwB,MAAM3qB,GAAOyM,UAAUmf,GAAUnf,UAAW,EAAA,GAC5Cie,IACHQ,YAAYQ,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,CAAAA,GAKdE,GAAUE,YACZD,GAAS3wB,KAAK,IAAIswB,QAAQE,CAAAA,OAAAA;AACxBtxB,WAAKuwB,MAAM3qB,GAAO8rB,UAAUF,GAAUE,UAAW,EAAA,GAC5CpB,IACHQ,YAAYQ,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,CAAAA,GAKdE,GAAUptB,SACZqtB,GAAS3wB,KAAK,IAAIswB,QAAQE,CAAAA,OAAAA;AACxBtxB,WAAKuwB,MAAM3qB,GAAOxB,OAAOotB,GAAUptB,OAAQ,EAAA,GACtCksB,IACHQ,YAAYQ,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,CAAAA,GAKXF,QAAQC,IAAII,EAAAA,EAAUF,KAAK;;EACpC;AAAA,EAOA,qBACE9C,IACAhE,KAAgB,GAAA;AAEhB,UAAMvH,KAAuC,EAC3CyO,IAAIC,KAAKC,IAAAA,GACTpD,OAAAA,IACAH,MAAM,GACND,aACA5D,OAAAA,IACAkE,eAAe,MACfJ,kBAAkB,MAClBuD,OAAO,MAAA;AACA9xB,WAAK4tB,gBAAgBmE,SAAS7O,OACjCljB,KAAK4tB,gBAAgB9sB,KAAKoiB,EAAAA,GAE5BA,GAAWmL;IAAQ,GAErB1H,SAAS,MAAA;AACP,YAAMrR,KAAQtV,KAAK4tB,gBAAgB3Y,QAAQiO,EAAAA;AACvC5N,MAAAA,KAAAA,MACFtV,KAAK4tB,gBAAgBrY,OAAOD,IAAO;;AAKzC,WAAO4N;AAAAA,EACT;AAAA,EAKA,kBACEtd,IACA6oB,IACAxX,IAAAA;AAMA,UAAMiM,KAAaljB,KAAKgyB,qBAAqBvD,KAAOxX,MAAAA,gBAAAA,GAASwT,UAAS,CAAA;AAetE,WAbAvH,GAAWyL,gBAAiBH,CAAAA;AAI1B,UAHA5oB,GAAOyM,SAAS4f,KAAKzD,EAAAA,GAGjBvX,MAAAA,gBAAAA,GAASib,WAAW;AACtB,cAAMC,KAAQ/vB,KAAK6K,IAAIiW,GAAWoL,OAAO,MAAM,CAAA,GACzC8D,KAAY3D,GAAMC,WAAWyD;AACnCvsB,QAAAA,GAAOysB,OAAOD,EAAAA;AAAAA,MAChB;AAAA,IAAA,GAGFlP,GAAWqL,oBAAmBtX,MAAAA,gBAAAA,GAAS6Z,eAAc,MAE9C5N;AAAAA,EACT;AAAA,EAOA,UAAA4K;AAEE,eAAWC,MAAQ/tB,KAAK2tB,OACtBI,CAAAA,GAAKsB,QAAQtnB,QAAQynB,CAAAA,OAAUA,GAAOU,KAAAA,CAAAA;AAExClwB,SAAK2tB,SAAS,CAAA,GAGd3tB,KAAK4tB,kBAAkB,CAAA;AAGvB,eAAW2C,MAASvwB,KAAK6tB,OACvB0C,CAAAA,GAAMS,KAAAA;AAERhxB,SAAK6tB,SAAS,CAAA;AAAA,EAChB;AAAA,EAKA,WAAAyE;AAEE,eAAWvE,MAAQ/tB,KAAK2tB,OACtBI,CAAAA,GAAKsB,QAAQtnB,QAAQynB,CAAAA,OAAAA;AACnBA,MAAAA,GAAOW,SAAAA;AAAAA,IAAS,CAAA;AAKpB,eAAW/B,MAAQpuB,KAAK4tB,gBACtBQ,CAAAA,GAAKC,QAAAA;AAIP,eAAWkC,MAASvwB,KAAK6tB,OACvB0C,CAAAA,GAAMlC;EAEV;AAAA,EAKA;AAEE,eAAWN,MAAQ/tB,KAAK2tB,OACtBI,CAAAA,GAAKsB,QAAQtnB,QAAQynB,CAAAA,OAAAA;AACnBA,MAAAA,GAAOW;IAAS,CAAA;AAKpB,eAAW/B,MAAQpuB,KAAK4tB,gBACtBQ,CAAAA,GAAKC,QAAAA;AAIP,eAAWkC,MAASvwB,KAAK6tB,OACvB0C,CAAAA,GAAMQ,OAAAA;AAAAA,EAEV;+BU7ZK,cAAgCjxB,EAAAA;AAAAA,EAAhC,cAAAwK;AAAAojB,UAAAA,GAAAnlB,YACLvI,KAASghB,OAAO,gBAShBhhB,KAASuyB,cAAcA,EAAAA,aAGvBvyB,KAASwyB,cAAcA,EAAAA;AAAAA,EAAA;AAAA,EAKvB,IAAA,gBAAIC;AACF,WAAOzyB,KAAK0yB;AAAAA,EACd;AAAA,EAKA,IAAA;AACE,WAAO1yB,KAAK2yB;AAAAA,EACd;AAAA,EAEU;AACR,UAAM/O,KAAY5jB,KAAKyB,SAAS6O,WAAW4W,eACrC9lB,KAAQwiB,GAAU7e,aAClB1D,KAASuiB,GAAU3e;AAGzBjF,SAAK2yB,iBAAiB,IAAIC,mBAC1B5yB,KAAK6yB,iBAAiB7yB,KAAK2yB,gBAAgB/O,IAAWxiB,IAAOC,EAAAA,GAG7DrB,KAAK0yB,iBAAiB,IAAII,mBAC1B9yB,KAAK6yB,iBAAiB7yB,KAAK0yB,gBAAgB9O,IAAWxiB,IAAOC,EAAAA;AAAAA,EAC/D;AAAA,EAKQ,iBACNI,IACAmiB,IACAxiB,IACAC,IAAAA;AAEAI,IAAAA,GAASsxB,QAAQ3xB,IAAOC,EAAAA,GACxBI,GAAS6O,WAAWqB,MAAMU,WAAW,YACrC5Q,GAAS6O,WAAWqB,MAAMa,MAAM,KAChC/Q,GAAS6O,WAAWqB,MAAMW,OAAO,KACjC7Q,GAAS6O,WAAWqB,MAAMqhB,gBAAgB,QAC1CvxB,GAAS6O,WAAWqB,MAAMwK,SAAS,KACnCyH,GAAU/M,YAAYpV,GAAS6O;EACjC;AAAA,EAEU;;AACRtQ,eAAK0yB,eAAepiB,WAAW4W,kBAA/BlnB,mBAA8C0mB,YAAY1mB,KAAK0yB,eAAepiB,cAC9EtQ,UAAK2yB,eAAeriB,WAAW4W,kBAA/BlnB,mBAA8C0mB,YAAY1mB,KAAK2yB,eAAeriB;AAAAA,EAChF;AAAA,EAEA;AACEtQ,SAAK0yB,eAAeO,OAAOjzB,KAAKa,OAAOb,KAAKwB,MAAAA,GAC5CxB,KAAK2yB,eAAeM,OAAOjzB,KAAKa,OAAOb,KAAKwB;EAC9C;AAAA,EAEA,SAASJ,IAAeC,IAAAA;AACtBrB,SAAK0yB,eAAeK,QAAQ3xB,IAAOC,EAAAA,GACnCrB,KAAK2yB,eAAeI,QAAQ3xB,IAAOC,EAAAA;AAAAA,EACrC;AAAA,EAQA,kBACE+V,IACA/E,IACA6gB,KAAAA,MAAsB;AAElBA,IAAAA,OACF9b,GAAQzF,MAAMqhB,gBAAgB;AAGhC,UAAMptB,KAAS,IAAI2sB,EAAAA,YAAYnb,EAAAA;AAW/B,WATI/E,MACFzM,GAAOyM,SAAS4f,KAAK5f,KAItBzM,GAAe+gB,UAAU;AACxB3mB,WAAKa,MAAMqjB,OAAOte,EAAAA;AAAAA,IAAAA,GAGbA;AAAAA,EACT;AAAA,EAQA,kBACEwR,IACA/E,IACA6gB,KAAAA;AAEIA,IAAAA,OACF9b,GAAQzF,MAAMqhB,gBAAgB;AAGhC,UAAMptB,KAAS,IAAI4sB,EAAAA,YAAYpb;AAW/B,WATI/E,MACFzM,GAAOyM,SAAS4f,KAAK5f,EAAAA,GAItBzM,GAAe+gB,UAAU,MAAA;AACxB3mB,WAAKa,MAAMqjB,OAAOte,EAAAA;AAAAA,IAAAA,GAGbA;AAAAA,EACT;AAAA,EAKA,SAASwR,IAAsB/E;AAC7B,UAAMzM,KAAS5F,KAAKmzB,kBAAkB/b,IAAS/E;AAE/C,WADArS,KAAKa,MAAM2lB,IAAI5gB,EAAAA,GACRA;AAAAA,EACT;AAAA,EAKA,SAASwR,IAAsB/E,IAAAA;AAC7B,UAAMzM,KAAS5F,KAAKozB,kBAAkBhc,IAAS/E;AAE/C,WADArS,KAAKa,MAAM2lB,IAAI5gB,EAAAA,GACRA;AAAAA,EACT;AAAA,4BnBxGK,cAA6B9F;EAiClC,YAAYC;AACV2tB,UAAM,EAAA,GAAKrqB,MAA4BtD,GAAAA,CAAAA,GAjCzCC,KAASghB,OAAO,YA2BhBhhB,KAAQqzB,aAAwB,QAGhCrzB,KAAQszB,cAA4B,CAAA;AAAA,EAIpC;AAAA,EAKA,IAAA,WAAIC;AACF,WAAOvzB,KAAKwzB;AAAAA,EACd;AAAA,EAKA,IAAA,cAAIC;AACF,WAAOzzB,KAAK0zB;AAAAA,EACd;AAAA,EAKA,IAAA,YAAIC;AACF,WAAO3zB,KAAK4zB;AAAAA,EACd;AAAA,EAKA,IAAA;AACE,WAAO5zB,KAAK6zB;AAAAA,EACd;AAAA,EAKA,IAAA,UAAIC;AACF,WAAO9zB,KAAK+zB;AAAAA,EACd;AAAA,EAKA,gBAAIC;AACF,WAAOh0B,KAAKqzB;AAAAA,EACd;AAAA,EAEU,YAAAhzB;;AACR,YAAMQ,OAAEA,IAAAW,QAAOA,IAAAC,UAAQA,OAAazB,KAAKuB,QACnCqiB,KAAYniB,GAAS6O,WAAW4W,eAChC9lB,KAAQwiB,GAAU7e,aAClB1D,KAASuiB,GAAU3e,cACnBgvB,KAAaxyB,GAASyyB,cAAAA;AAG5Bl0B,SAAKwzB,YAAY,IAAIW,EAAAA,eAAe1yB,EAAAA,GACpCzB,KAAKwzB,UAAUT,QAAQ3xB,IAAOC,EAAAA,GAC9BrB,KAAKwzB,UAAUY,cAAcH,EAAAA,GAG7Bj0B,KAAKq0B,aAAa,IAAIC,aAAWzzB,IAAOW,EAAAA,GACxCxB,KAAKwzB,UAAUe,QAAQv0B,KAAKq0B,aAG5Br0B,KAAK6zB,WAAW,IAAIW,UAAQ3zB,IAAOW,EAAAA,GACnCxB,KAAK6zB,SAASvwB,YAAUtD,UAAKD,OAAOmE,SAAZlE,mBAAkBsD,YAAAA,OACtCtD,KAAKD,OAAOmE,SACdlE,KAAK6zB,SAAS/gB,OAAO2hB,eAAez0B,KAAKD,OAAOmE,KAAKC,WACrDnE,KAAK6zB,SAAS/gB,OAAO4hB,WAAW10B,KAAKD,OAAOmE,KAAKE,QAEnDpE,KAAKwzB,UAAUe,QAAQv0B,KAAK6zB,QAAAA,GAG5B7zB,KAAK4zB,aAAa,IAAIe,EAAAA,gBACpB,IAAI/vB,EAAMC,QAAQzD,IAAOC,EAAAA,KACzBrB,UAAKD,OAAO+D,UAAZ9D,mBAAmB+D,aAAY,OAC/B/D,UAAKD,OAAO+D,UAAZ9D,mBAAmBgE,WAAU,OAC7BhE,UAAKD,OAAO+D,UAAZ9D,mBAAmBiE,cAAa,IAAA,GAElCjE,KAAK4zB,WAAWtwB,YAAUtD,MAAAA,KAAKD,OAAO+D,UAAZ9D,gBAAAA,IAAmBsD,mBAC7CtD,KAAKwzB,UAAUe,QAAQv0B,KAAK4zB,UAAAA,GAG5B5zB,KAAK+zB,WAAW,IAAIa,UAAQ,EAC1BnzB,UAAAA,IACAZ,OAAAA,IACAW,QAAAA,IACAJ,WACAC,QAAAA,IACAwzB,SAAS70B,KAAKszB,aACdwB,iBAAiB,SAEnB90B,KAAK+zB,SAASzwB,YAAUtD,UAAKD,OAAOsE,QAAZrE,mBAAiBsD,YAAAA,OACrCtD,KAAKD,OAAOsE,QACdrE,KAAK+zB,SAASzvB,YAAYtE,KAAKD,OAAOsE,IAAIC,WAC1CtE,KAAK+zB,SAASxvB,gBAAgBvE,KAAKD,OAAOsE,IAAIE,eAC9CvE,KAAK+zB,SAAS9xB,cAAcjC,KAAKD,OAAOsE,IAAIpC,aAC5CjC,KAAK+zB,SAASvvB,UAAUxE,KAAKD,OAAOsE,IAAIG,UAE1CxE,KAAKwzB,UAAUe,QAAQv0B,KAAK+zB,QAAAA,GAG5B/zB,KAAK0zB,eAAe,IAAIqB,EAAAA,YACtB,IAAInwB,EAAMC,QAAQzD,IAAOC,KACzBR,IACAW,EAAAA,GAEFxB,KAAK0zB,aAAasB,iBAAAA,MACdh1B,KAAKD,OAAOwD,YACdvD,KAAK0zB,aAAalwB,eAAexD,KAAKD,OAAOwD,QAAQC,cACrDxD,KAAK0zB,aAAajwB,WAAWzD,KAAKD,OAAOwD,QAAQE,UACjDzD,KAAK0zB,aAAahwB,gBAAgB1D,KAAKD,OAAOwD,QAAQG,eACtD1D,KAAK0zB,aAAa/vB,cAAc3D,KAAKD,OAAOwD,QAAQI,aACpD3D,KAAK0zB,aAAa9vB,iBAAiBoM,IAAIhQ,KAAKD,OAAOwD,QAAQK,mBAC3D5D,KAAK0zB,aAAa7vB,gBAAgBmM,IAAIhQ,KAAKD,OAAOwD,QAAQM,mBAE5D7D,KAAK0zB,aAAauB,gBAAgBC,WAAWtwB,EAAMuwB,gBACnDn1B,KAAK0zB,aAAauB,gBAAgBG,WAAWxwB,EAAMywB,WACnDr1B,KAAKwzB,UAAUe,QAAQv0B,KAAK0zB,eAG5B1zB,KAAKs1B,aAAa,IAAIC,gBACtBv1B,KAAKwzB,UAAUe,QAAQv0B,KAAKs1B,UAAAA,GAG5Bt1B,KAAKw1B,YAAY,IAAIC,EAAAA,WAAWC,eAChC11B,KAAKw1B,UAAUG,SAASC,SAAqB,WAAEpoB,MAAM2F,IAAI,KAAK/R,KAAQ6yB,KACtEj0B,KAAKw1B,UAAUG,SAASC,SAAqB,WAAEpoB,MAAM6F,IAAI,KAAKhS,KAAS4yB,KACvEj0B,KAAKwzB,UAAUe,QAAQv0B,KAAKw1B;EAC9B;AAAA,EAEU;AACRx1B,SAAKwzB,UAAUqC,QAAAA;AAAAA,EACjB;AAAA,EAEA,SAASz0B,IAAeC;AACtB,UAAM4yB,KAAaj0B,KAAKyB,SAASyyB,cAAAA;AAEjCl0B,SAAKwzB,UAAUT,QAAQ3xB,IAAOC,EAAAA,GAC9BrB,KAAK4zB,WAAWb,QAAQ3xB,IAAOC,KAE/BrB,KAAKw1B,UAAUG,SAASC,SAAqB,WAAEpoB,MAAM2F,IAAI,KAAK/R,KAAQ6yB,KACtEj0B,KAAKw1B,UAAUG,SAASC,SAAqB,WAAEpoB,MAAM6F,IAAI,KAAKhS,KAAS4yB;AAAAA,EACzE;AAAA,EAKA,SAAAhB;AAC0B,eAApBjzB,KAAKqzB,aACPrzB,KAAKwzB,UAAUP,OAAAA,IAEfjzB,KAAKyB,SAASwxB,OAAOjzB,KAAKa,OAAOb,KAAKwB;EAE1C;AAAA,EAKA,aAAas0B,IAAAA;AACX91B,SAAKqzB,aAAayC;AAAAA,EACpB;AAAA,EAKA,kBAAkB1wB,IAAAA;AAChBpF,SAAK0zB,aAAaqC,kBAAkB3wB;AAAAA,EACtC;AAAA,EAKA,sBAAA4wB;AACEh2B,SAAK0zB,aAAaqC,kBAAkB,CAAA;AAAA,EACtC;AAAA,EAKA,iBAAiBh2B,IAAAA;AAAAA,eACXA,GAAOuD,YACTtD,KAAK0zB,aAAapwB,UAAUvD,GAAOuD,UAAAA,WAEjCvD,GAAOyD,iBACTxD,KAAK0zB,aAAalwB,eAAezD,GAAOyD,0BAEtCzD,GAAO0D,aACTzD,KAAK0zB,aAAajwB,WAAW1D,GAAO0D,WAAAA,WAElC1D,GAAO2D,kBACT1D,KAAK0zB,aAAahwB,gBAAgB3D,GAAO2D,gBAAAA,WAEvC3D,GAAO4D,gBACT3D,KAAK0zB,aAAa/vB,cAAc5D,GAAO4D,cAAAA,WAErC5D,GAAO6D,oBACT5D,KAAK0zB,aAAa9vB,iBAAiBoM,IAAIjQ,GAAO6D,gBAAAA,GAAAA,WAE5C7D,GAAO8D,mBACT7D,KAAK0zB,aAAa7vB,gBAAgBmM,IAAIjQ,GAAO8D;EAEjD;AAAA,EAKA,eAAe9D,IAAAA;AAAAA,eACTA,GAAOuD,YACTtD,KAAK4zB,WAAWtwB,UAAUvD,GAAOuD,qBAE/BvD,GAAOgE,aACT/D,KAAK4zB,WAAW7vB,WAAWhE,GAAOgE,sBAEhChE,GAAOiE,WACThE,KAAK4zB,WAAW5vB,SAASjE,GAAOiE,SAAAA,WAE9BjE,GAAOkE,cACTjE,KAAK4zB,WAAW3vB,YAAYlE,GAAOkE;AAAAA,EAEvC;AAAA,EAKA,cAAclE,IAAAA;AAAAA,eACRA,GAAOuD,YACTtD,KAAK6zB,SAASvwB,UAAUvD,GAAOuD,qBAE7BvD,GAAOoE,cACTnE,KAAK6zB,SAAS/gB,OAAO2hB,eAAe10B,GAAOoE,uBAEzCpE,GAAOqE,UACTpE,KAAK6zB,SAAS/gB,OAAO4hB,WAAW30B,GAAOqE;AAAAA,EAE3C;AAAA,EAKA,aAAarE,IAAAA;AAAAA,eACPA,GAAOuD,YACTtD,KAAK+zB,SAASzwB,UAAUvD,GAAOuD,UAAAA,WAE7BvD,GAAOuE,cACTtE,KAAK+zB,SAASzvB,YAAYvE,GAAOuE,YAAAA,WAE/BvE,GAAOwE,kBACTvE,KAAK+zB,SAASxvB,gBAAgBxE,GAAOwE,gBAAAA,WAEnCxE,GAAOkC,gBACTjC,KAAK+zB,SAAS9xB,cAAclC,GAAOkC,yBAEjClC,GAAOyE,YACTxE,KAAK+zB,SAASvvB,UAAUzE,GAAOyE;AAAAA,EAEnC;AAAA,EAKA,WAAWyxB,IAAAA;AACJj2B,SAAKszB,YAAYvB,SAASkE,EAAAA,KAC7Bj2B,KAAKszB,YAAYxyB,KAAKm1B,EAAAA;AAAAA,EAE1B;AAAA,EAKA,cAAcA,IAAAA;AACZ,UAAM3gB,KAAQtV,KAAKszB,YAAYre,QAAQghB;AACnC3gB,IAAAA,KAAAA,MACFtV,KAAKszB,YAAY/d,OAAOD,IAAO,CAAA;AAAA,EAEnC;AAAA,0hBUnUK,cAA4BxV;EAqBjC,YAAYC;AACV2tB,UAAM,EAAA,GAAK5C,OAA2B/qB,GAAAA,CAAAA,GArBxCC,KAASghB,OAAO,WAShBhhB,KAAQk2B,gBAAiC,CAAA,GAGzCl2B,KAAQm2B,cAAqC,MAG7Cn2B,KAAQo2B,aAAAA,OAGRp2B,KAAQq2B,eAA6B,CAAA,GAInCr2B,KAAKs2B,QAAQt2B,KAAKD,OAAOwG,aACzBvG,KAAKu2B,aAAav2B,KAAKD,OAAOgrB;AAAAA,EAChC;AAAA,EAKA,IAAA,OAAIroB;AACF,WAAO1C,KAAKs2B;AAAAA,EACd;AAAA,EAKA,IAAA,YAAIE;AACF,WAAOx2B,KAAKu2B;AAAAA,EACd;AAAA,EAKA,IAAA,YAAIE;AACF,WAAOz2B,KAAKo2B;AAAAA,EACd;AAAA,EAEU,cAAA71B;AACRP,SAAK02B,OAAAA,GAED12B,KAAKm2B,gBACPn2B,KAAKa,MAAMqjB,OAAOlkB,KAAKm2B,cACvBn2B,KAAKm2B,cAAc;AAAA,EAEvB;AAAA,EAKA,QAAQzzB,IAAAA;AACN1C,SAAKs2B,QAAQ5zB;AAAAA,EACf;AAAA,EAKA,aAAaA,IAAAA;AACX1C,SAAKu2B,aAAa7zB;AAAAA,EACpB;AAAA,EAKA;AACE1C,SAAKo2B,aAAAA,MACLp2B,KAAKk2B,gBAAgB,IACrBl2B,KAAKU,OAAOqvB,KAAK,cAAc,EAAErtB,MAAM1C,KAAKs2B,MAAAA,CAAAA;AAAAA,EAC9C;AAAA,EAKA,SAAS9H;AACFxuB,SAAKo2B,cACRp2B,KAAK8xB,MAAAA,GAGP9xB,KAAKk2B,cAAcp1B,KAAK0tB,GAAMmI,MAAAA,CAAAA,GAC9B32B,KAAKU,OAAOqvB,KAAK,cAAc,EAAEvB,OAAAA,GAAAA,CAAAA,GAGjCxuB,KAAK42B,cAAAA;AAAAA,EACP;AAAA,EAKA,iBAAiBpI,IAAsB5oB;;AACrC,QAAIixB,KAAcrI;AAGlB,QAAwB,aAApBxuB,KAAKu2B,gBAA2B3wB,WAAAA,MAAAA,gBAAAA,GAAQkxB,YAARlxB,mBAAiBmxB,eAAjBnxB,mBAA6BoxB,iBAAgB;AAC/E,YAAM7wB,KAASP,GAAOO;AACtB,UAAIA,MAAAA,gBAAAA,GAAQ8wB,sBAAsB;AAChC,cAAMC,KAAWtxB,GAAOkxB,QAAQC,WAAWC,eAAeL,MAAAA;AAC1DO,QAAAA,GAAS1Q,IAAI5gB,GAAOyM,WAChBzM,GAAOuxB,iBACTD,GAASE,IAAIxxB,GAAOuxB,aAAAA,GAEtBN,KAAc1wB,GAAO8wB,qBAAqBC,EAAAA;AAAAA,MAC5C;AAAA,IACF,WAA+B,aAApBl3B,KAAKu2B,gBAA2B3wB,WAAAA,MAAAA,gBAAAA,GAAQkxB,YAARlxB,mBAAiBmxB,eAAjBnxB,mBAA6ByxB,eAAc;AACpF,YAAMlxB,KAASP,GAAOO;AACtB,UAAIA,MAAAA,gBAAAA,GAAQ8wB,sBAAsB;AAChC,cAAM3M,KAAS1kB,GAAOkxB,QAAQC,WAAWM,aAAaV,MAAAA;AACtDrM,QAAAA,GAAO9D,IAAI5gB,GAAOyM,QAAAA,GACdzM,GAAOuxB,iBACT7M,GAAO8M,IAAIxxB,GAAOuxB,aAAAA,GAEpBN,KAAc1wB,GAAO8wB,qBAAqB3M,EAAAA;AAAAA,MAC5C;AAAA,IACF;AAEAtqB,SAAKs3B,SAAST,EAAAA;AAAAA,EAChB;AAAA,EAKA,WAAAU;AACE,QAAIv3B,KAAKk2B,cAActuB,SAAS,EAE9B,QAAO;AAGT,QAAIquB;AAEJ,YAAQj2B,KAAKs2B;MACX,KAAK;AACHL,QAAAA,KAAOj2B,KAAKw3B,YAAYx3B,KAAKk2B,aAAAA;AAC7B;AAAA,MACF,KAAK;AACHD,QAAAA,KAAOj2B,KAAKy3B,YAAYz3B,KAAKk2B,aAAAA;AAC7B;AAAA,MACF,KAAK;AACHD,QAAAA,KAAOj2B,KAAK03B,YAAY13B,KAAKk2B;AAC7B;AAAA,MACF,KAAK;AACHD,QAAAA,KAAOj2B,KAAK23B,WAAW33B,KAAKk2B;AAC5B;AAAA,MACF;AACE,eAAO;AAAA,IAAA;AAIVD,IAAAA,GAA0B2B,aAAAA,MAG3B53B,KAAKa,MAAM2lB,IAAIyP,KAGXj2B,KAAKm2B,gBACPn2B,KAAKa,MAAMqjB,OAAOlkB,KAAKm2B,WAAAA,GACvBn2B,KAAKm2B,cAAc;AAGrB,UAAMlqB,KAAqB,EACzBgqB,MAAAA,IACA4B,QAAQ,CAAA,GAAI73B,KAAKk2B,aAAAA,GACjBxzB,MAAM1C,KAAKs2B,MAAAA;AASb,WANAt2B,KAAKq2B,aAAav1B,KAAKmL,KACvBjM,KAAKo2B,aAAAA,OACLp2B,KAAKk2B,gBAAgB,CAAA,GAErBl2B,KAAKU,OAAOqvB,KAAK,iBAAiB,EAAEkG,MAAAA,GAAAA,CAAAA,GAE7BhqB;AAAAA,EACT;AAAA,EAKA;AACEjM,SAAKo2B,aAAAA,OACLp2B,KAAKk2B,gBAAgB,IAEjBl2B,KAAKm2B,gBACPn2B,KAAKa,MAAMqjB,OAAOlkB,KAAKm2B,WAAAA,GACvBn2B,KAAKm2B,cAAc,OAGrBn2B,KAAKU,OAAOqvB,KAAK,eAAA,MAAe;AAAA,EAClC;AAAA,EAKA,YAAA+H;AACM93B,SAAKk2B,cAActuB,SAAS,MAC9B5H,KAAKk2B,cAAc6B,IAAAA,GACnB/3B,KAAK42B,cAAAA;AAAAA,EAET;AAAA,EAKQ,gBAAAA;AACN,UAAI52B,KAAKk2B,cAActuB,SAAS,IAAhC;AAQA,cALI5H,KAAKm2B,eACPn2B,KAAKa,MAAMqjB,OAAOlkB,KAAKm2B,WAAAA,GAIjBn2B,KAAKs2B,OAAAA;AAAAA,QACX,KAAK;AACHt2B,eAAKm2B,cAAcn2B,KAAKw3B,YAAYx3B,KAAKk2B,mBAAe;AACxD;AAAA,QACF,KAAK;AACHl2B,eAAKm2B,cAAcn2B,KAAKy3B,YAAYz3B,KAAKk2B,eAAAA;AACzC;AAAA,QACF,KAAK;AACHl2B,eAAKm2B,cAAcn2B,KAAK03B,YAAY13B,KAAKk2B,eAAAA,IAAe;AACxD;AAAA,QACF,KAAK;AACHl2B,eAAKm2B,cAAcn2B,KAAK23B,WAAW33B,KAAKk2B,mBAAe;AAAA,MAAA;AAIvDl2B,WAAKm2B,eACPn2B,KAAKa,MAAM2lB,IAAIxmB,KAAKm2B,WAAAA;AAAAA,IAxBa;AAAA,EA0BrC;AAAA,EAKQ,YAAY0B,IAAyBG,KAAAA;AAC3C,UAAM32B,KAASrB,KAAKD,OAAOkrB,aACrBgN,KAAqB,CAAA,GACrBC,KAAoB,CAAA,GACpBC,KAAgB;AAGtB,aAASzyB,KAAI,GAAGA,KAAImyB,GAAOjwB,QAAQlC,MAAK;AACtC,YAAMkH,KAAIirB,GAAOnyB,EAAAA;AAEjBuyB,MAAAA,GAASn3B,KAAK8L,GAAEuG,GAAGvG,GAAEyG,GAAGzG,GAAEyf,CAAAA,GAE1B4L,GAASn3B,KAAK8L,GAAEuG,GAAGvG,GAAEyG,IAAIhS,IAAQuL,GAAEyf,CAAAA;AAGnC,YAAM+L,KAAI1yB,MAAKmyB,GAAOjwB,SAAS;AAC/BuwB,MAAAA,GAAIr3B,KAAKs3B,IAAG,CAAA,GACZD,GAAIr3B,KAAKs3B,IAAG,CAAA;AAAA,IACd;AAGA,aAAS1yB,KAAI,GAAGA,KAAImyB,GAAOjwB,SAAS,GAAGlC,MAAK;AAC1C,YAAM2yB,KAAW,IAAJ3yB;AAEbwyB,MAAAA,GAAQp3B,KAAKu3B,IAAMA,KAAO,GAAGA,KAAO,CAAA,GACpCH,GAAQp3B,KAAKu3B,KAAO,GAAGA,KAAO,GAAGA,KAAO,CAAA;AAAA,IAC1C;AAEA,UAAMC,KAAW,IAAI1zB,EAAM2zB;AAC3BD,IAAAA,GAAS3hB,aAAa,YAAY,IAAI/R,EAAM4zB,uBAAuBP,IAAU,CAAA,CAAA,GAC7EK,GAAS3hB,aAAa,MAAM,IAAI/R,EAAM4zB,uBAAuBL,IAAK,CAAA,CAAA,GAClEG,GAASG,SAASP,EAAAA,GAClBI,GAASI;AAET,UAAM/C,KAAW,IAAI/wB,EAAM+zB,qBAAqB,EAC9ChyB,OAAOqxB,KAAY,QAAW,SAC9BY,MAAMh0B,EAAMi0B,YACZC,mBACAt0B,SAASwzB,KAAY,MAAM,IAAA,CAAA,GAGvB/B,KAAO,IAAIrxB,EAAMm0B,KAAKT,IAAU3C,EAAAA;AAGtC,WAFAM,GAAKjV,OAAO,SAELiV;AAAAA,EACT;AAAA,EAKQ,YAAY4B,IAAyBG,KAAAA,OAAY;AACvD,QAAIH,GAAOjwB,SAAS,EAElB,QAAO5H,KAAK23B,WAAWE,IAAQG;AAIjC,UAAMgB,KAAQ,IAAIp0B,EAAMq0B;AACxBD,IAAAA,GAAME,OAAOrB,GAAO,CAAA,EAAG1kB,GAAG0kB,GAAO,CAAA,EAAGxL,CAAAA;AACpC,aAAS3mB,KAAI,GAAGA,KAAImyB,GAAOjwB,QAAQlC,KACjCszB,CAAAA,GAAMG,OAAOtB,GAAOnyB,EAAAA,EAAGyN,GAAG0kB,GAAOnyB,EAAAA,EAAG2mB,CAAAA;AAEtC2M,IAAAA,GAAMI;AAEN,UAAMd,KAAW,IAAI1zB,EAAMy0B,cAAcL;AAGzCV,IAAAA,GAASgB,QAAAA,CAASl3B,KAAKC,KAAK;AAG5B,UAAMk3B,KAAO1B,GAAO2B,OAAO,CAACC,IAAK7sB,OAAM6sB,KAAM7sB,GAAEyG,GAAG,KAAKwkB,GAAOjwB;AAC9D0wB,IAAAA,GAASoB,UAAU,GAAGH,IAAM,CAAA;AAE5B,UAAM5D,KAAW,IAAI/wB,EAAM+zB,qBAAqB,EAC9ChyB,OAAOqxB,KAAY,QAAW,SAC9BY,MAAMh0B,EAAMi0B,YACZC,aAAAA,MACAt0B,SAASwzB,KAAY,MAAM,QAGvB/B,KAAO,IAAIrxB,EAAMm0B,KAAKT,IAAU3C,EAAAA;AAGtC,WAFAM,GAAKjV,OAAO,SAELiV;AAAAA,EACT;AAAA,EAKQ,YAAY4B,IAAyBG,KAAAA,OAAY;AACvD,UAAMvJ,KAAQ,IAAI7pB,EAAM+0B,iBAAiB9B,EAAAA,GACnC+B,KAAcnL,GAAMoL,UAAU,EAAA,GAE9BvB,KAAW,IAAI1zB,EAAM2zB,iBAAiBuB,cAAcF,EAAAA,GAEpDjE,KAAW,IAAI/wB,EAAMm1B,kBAAkB,EAC3CpzB,OAAOqxB,KAAY,QAAW,UAC9BgC,WAAW,EAAA,CAAA,GAGPC,KAAO,IAAIr1B,EAAMs1B,KAAK5B,IAAU3C,EAAAA;AAOtC,WANAsE,GAAKjZ,OAAO,SAGViZ,GAA0BE,oBAC1BF,GAA0BG,YAAY3L,IAEjCwL;AAAAA,EACT;AAAA,EAKQ,WAAWpC,IAAyBG,KAAAA;AAC1C,UAAMM,KAAW,IAAI1zB,EAAM2zB,iBAAiBuB,cAAcjC,EAAAA,GAEpDlC,KAAW,IAAI/wB,EAAMm1B,kBAAkB,EAC3CpzB,OAAOqxB,KAAY,QAAW,UAC9BgC,WAAW,EAAA,CAAA,GAGPC,KAAO,IAAIr1B,EAAMs1B,KAAK5B,IAAU3C,EAAAA;AAGtC,WAFAsE,GAAKjZ,OAAO,QAELiZ;AAAAA,EACT;AAAA,EAKA,kBAAAI;AACE,WAAOr6B,KAAKq2B;AAAAA,EACd;AAAA,EAKA,kBAAkBJ,IAAAA;AAChB,UAAM3gB,KAAQtV,KAAKq2B,aAAarG,UAAUsK,CAAAA,OAAKA,GAAErE,SAASA;AACtD3gB,IAAAA,KAAAA,OACFtV,KAAKa,MAAMqjB,OAAO+R,KAClBj2B,KAAKq2B,aAAa9gB,OAAOD,IAAO,CAAA;AAAA,EAEpC;AAAA,EAKA,WAAAilB;AACE,eAAWtuB,MAAUjM,KAAKq2B,aACxBr2B,MAAKa,MAAMqjB,OAAOjY,GAAOgqB,IAAAA;AAE3Bj2B,SAAKq2B,eAAe,CAAA;AAAA,EACtB;AAAA,EAKA,eAAAmE;AACE,WAAOx6B,KAAKa,MAAM45B,SACfh1B,eAAeE,GAAyBw0B,WAAAA,EACxChjB,IAAIxR,CAAAA,QAAA,EACH+0B,MAAO/0B,GAAyBy0B,WAChCnE,MAAMtwB;EAEZ;AAAA,0BRxaK,cAA2B7F,EAAAA;AAAAA,EAgBhC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAKrnB,GAAAA,GAA0BtG,OAhBvCC,KAASghB,OAAO,UAChBhhB,KAAS26B,eAAe,CAAC,wBAAwB,aAMjD36B,KAAQ46B,eAAiC,MAGzC56B,KAAQ66B,iBAAsD,MAO5D76B,KAAKs2B,QAASt2B,KAAKD,OAAOwG,eAA+B;AAAA,EAC3D;AAAA,EAKA,WAAI7D;AACF,WAAO1C,KAAKs2B;AAAAA,EACd;AAAA,EAKA,IAAA,cAAIwE;AACF,WAAO96B,KAAK46B;AAAAA,EACd;AAAA,EAKA,IAAA,sBAAIp0B;AACF,WAAOxG,KAAKD,OAAOyG;AAAAA,EACrB;AAAA,EAKA,IAAA,oBAAwBgH,IAAAA;AACtBxN,SAAKD,OAAOyG,sBAAsBgH;AAAAA,EACpC;AAAA,EAEU;AAEJxN,SAAKD,OAAO0G,kBACdzG,KAAKyG,eAAAA;AAAAA,EAET;AAAA,EAEU,cAAAlG;AACRP,SAAK+6B,gBAAAA;AAAAA,EACP;AAAA,EAKA,QAAQr4B;AACN,UAAMs4B,KAAWh7B,KAAKs2B;AACtBt2B,SAAKs2B,QAAQ5zB,IACb1C,KAAKU,OAAOqvB,KAAK,eAAe,EAAErtB,MAAAA,IAAMs4B;EAC1C;AAAA,EAKA,YAAYr5B,IAAAA;;AACV,UAAMs5B,KAAkBj7B,KAAKk7B,UAAqC,yBAC5DC,KAAiBn7B,KAAKk7B,UAA0B,UAAA;AAEtD,QAAA,CAAKD,MAAAA,CAAoBE,GAAgB,QAAO;AAGhDF,IAAAA,GAAgBG;AAGhB,UAAMC,KAAOr7B,KAAKyB,SAAS6O,WAAW0J,sBAAAA,GAUhCshB,KAHap2B,EANL,IAAIN,EAAMC,SACpBlD,GAAMuR,UAAUmoB,GAAK/oB,QAAQ+oB,GAAKj6B,QAAS,IAAI,KAC9CO,GAAMyR,UAAUioB,GAAK7oB,OAAO6oB,GAAKh6B,SAAU,IAAI,CAAA,GAIXrB,KAAKwB,QAAQxB,KAAKa,MAAM45B,QAAAA,EAGpCrK,KAAK1qB,CAAAA;AACpBA,MAAAA,GAAEE;AACd,YAAM21B,KAAUt1B,EAAaP,GAAEE,MAAAA;AAC/B,aAAQF,GAAEE,OAA0BI,WAAWu1B,GAAQv1B;AAAAA,IAAAA,CAAAA;AAGzD,SAAKs1B,GAGH,QAFAt7B,KAAK46B,eAAe,MACpB56B,KAAKU,OAAOqvB,KAAK,SAAS,EAAEpuB,WAAOosB,MAAM,KAAA,CAAA,GAClC;AAGT,UAAA,EAAMnoB,QAAEA,IAAA4oB,OAAQA,OAAU8M,IACpBE,KAAYv1B,EAAaL,EAAAA;AAG/B,YAAQ5F,KAAKs2B,OAAAA;AAAAA,MACX,KAAK;AACH6E,QAAAA,GAAenF,oBAAAA,GACXh2B,KAAKD,OAAOyG,sBACdy0B,GAAgBQ,OAAO71B,EAAAA,IAEvBq1B,GAAgBQ,OAAOD;AAEzB;AAAA,MAEF,KAAK;AACHL,QAAAA,GAAeO,kBAAkB,CAAC91B,EAAAA,CAAAA;AAClC;AAAA,MAEF,KAAK;AACHu1B,QAAAA,GAAeO,kBAAkB,CAACF;AAClC;AAAA,MAEF,KAAK;AACHx7B,mBAAK27B,sBAAL37B,8BAAyBwuB,IAAO5oB;AAAAA,IAAAA;AAsBpC,WAbA5F,KAAK46B,eAAe,EAClBgB,cAAch2B,IACdi2B,kBAAkBL,IAClBhN,OAAOA,GAAMmI,MAAAA,GACbj0B,MAAM1C,KAAKs2B,MAAAA,GAGbt2B,KAAKU,OAAOqvB,KAAK,SAAS,EAAEpuB,OAAAA,IAAOosB,MAAM/tB,KAAK46B,aAAAA,CAAAA,GAC9C56B,KAAKU,OAAOqvB,KAAK,mBAAmB,EAClCnqB,QAAuB,SAAf5F,KAAKs2B,QAAiB1wB,KAAS41B,IACvCR,UAAU,KAAA,CAAA,GAGLh7B,KAAK46B;AAAAA,EACd;AAAA,EAKA,cAAcj5B,IAAmByD,IAAAA;AAI/B,UAAMD,KAAQT,EAAc/C,EAAAA,GACtB0D,KAAY,IAAIT,EAAMU;AAC5BD,IAAAA,GAAUE,cAAcJ,IAAOnF,KAAKwB,MAAAA;AAEpC,UAAMs6B,KAAgB12B,MAAWpF,KAAKa,MAAM45B,UACtCsB,KAAa12B,GAAUG,iBAAiBs2B,IAAAA,IAAe;AAE7D,WAAO,EAAEz2B,WAAAA,IAAW02B,YAAAA,GAAAA;AAAAA,EACtB;AAAA,EAKA,OAAOn2B;;AACL,UAAMq1B,KAAkBj7B,KAAKk7B,UAAqC,yBAC5DC,KAAiBn7B,KAAKk7B,UAA0B,UAAA;AAEjDD,IAAAA,MAAoBE,OAErBv1B,MACiB,SAAf5F,KAAKs2B,SACP2E,GAAgBQ,OAAO71B,EAAAA,GAEzBu1B,GAAeO,kBAAkB,CAAC91B,MAClC5F,KAAKU,OAAOqvB,KAAK,mBAAmB,EAAEnqB,YAAQo1B,YAAUh7B,UAAK46B,iBAAL56B,mBAAmB47B,iBAAgB,KAAA,CAAA,MAE3FX,GAAgBG,OAAAA,GAChBD,GAAenF,oBAAAA,GACfh2B,KAAKU,OAAOqvB,KAAK,qBAAqB,EAAEnqB,SAAQ5F,UAAK46B,iBAAL56B,mBAAmB47B,aAAAA,CAAAA;AAAAA,EAEvE;AAAA,EAKA,WAAAI;AACEh8B,SAAK+nB,OAAO,IAAA,GACZ/nB,KAAK46B,eAAe;AAAA,EACtB;AAAA,EAKA,iBAAAn0B;AACE,QAAIzG,KAAK66B,eAAgB;AAEzB,UAAMI,KAAkBj7B,KAAKk7B,UAAqC;AAElEl7B,SAAK66B,iBAAkB1pB,CAAAA;;AACrB,UAAK8pB,GAEL,SAAQ9pB,GAAExI,IAAIszB;QACZ,KAAK;AACHhB,UAAAA,GAAgBiB,QAAQ,WAAA;AACxB;AAAA,QACF,KAAK;AACHjB,UAAAA,GAAgBiB,QAAQ;AACxB;AAAA,QACF,KAAK;AACHjB,UAAAA,GAAgBiB,QAAQ,OAAA;AACxB;AAAA,QACF,KAAK;AACHl8B,eAAKg8B;AACL;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACCh8B,sBAAK46B,iBAAL56B,mBAAmB67B,sBACrB77B,KAAKa,MAAMqjB,OAAOlkB,KAAK46B,aAAaiB,mBACpC77B,KAAKg8B,SAAAA;AAAAA,MAAAA;AAAAA,IAAAA,GAMbzrB,SAASkE,iBAAiB,WAAWzU,KAAK66B,cAAAA,GAC1C76B,KAAKD,OAAO0G,iBAAAA;AAAAA,EACd;AAAA,EAKA,kBAAAs0B;AACM/6B,SAAK66B,mBACPtqB,SAASqE,oBAAoB,WAAW5U,KAAK66B,cAAAA,GAC7C76B,KAAK66B,iBAAiB,OAExB76B,KAAKD,OAAO0G,iBAAAA;AAAAA,EACd;AAAA,EAKQ,UAAaua,IAAAA;;AACnB,YAAOhhB,UAAK0B,kBAAL1B,mBAAoB0O,IAAIsS;AAAAA,EACjC;AAAA,+BetNK,cAAgClhB;EAkBrC,YAAYC;AACV2tB,UAAM,EAAA,GAAKhB,OAA+B3sB,GAAAA,CAAAA,GAlB5CC,KAASghB,OAAO,eAGhBhhB,KAAQm8B,aAAa,IAAIC,gBAGzBp8B,KAAQq8B,oBAAoB,IAAIz3B,EAAM03B,qBAGtCt8B,KAAQu8B,gBAAgB,IAAI33B,EAAM43B,iBAGlCx8B,KAAQy8B,gBAAsC,MAG9Cz8B,KAAQ08B,oBAAwD;AAAA,EAIhE;AAAA,EAEU;AAEJ18B,SAAKD,OAAO4sB,IAAIrpB,WAClBtD,KAAK28B,OAAO38B,KAAKD,OAAO4sB,GAAAA,GAEtB3sB,KAAKD,OAAOgtB,UACd/sB,KAAK48B,UAAU58B,KAAKD,OAAOgtB,SAEzB/sB,KAAKD,OAAOitB,kBACdhtB,KAAK68B,kBAAkB78B,KAAKD,OAAOitB,cAAAA;AAAAA,EAEvC;AAAA,EAEU,cAAAzsB;AACRP,SAAK88B,SAAAA,GACL98B,KAAK+8B,gBAAAA,GACL/8B,KAAKg9B;EACP;AAAA,EAKA,OAAOj9B,IAAAA;AAGL,QAFA0I,OAAOw0B,OAAOj9B,KAAKD,OAAO4sB,KAAK5sB,MAE1BC,KAAKD,OAAO4sB,IAAIrpB,QAEnB,QAAA,KADAtD,KAAK88B,SAAAA;AAIP,UAAMn2B,KAAQ,IAAI/B,EAAM8K,MAAM1P,KAAKD,OAAO4sB,IAAIhmB,KAAAA;AAEjB,iBAAzB3G,KAAKD,OAAO4sB,IAAIvmB,OAClBpG,KAAKa,MAAM8rB,MAAM,IAAI/nB,EAAMs4B,IACzBv2B,IACA3G,KAAKD,OAAO4sB,IAAIC,QAAQ,GACxB5sB,KAAKD,OAAO4sB,IAAIE,OAAO,GAAA,IAGzB7sB,KAAKa,MAAM8rB,MAAM,IAAI/nB,EAAMu4B,QACzBx2B,IACA3G,KAAKD,OAAO4sB,IAAIG,WAAW,KAAA;AAAA,EAGjC;AAAA,EAKA;AACE9sB,SAAKa,MAAM8rB,MAAM,MACjB3sB,KAAKD,OAAO4sB,IAAIrpB,UAAAA;AAAAA,EAClB;AAAA,EAKA,YAAYqD,IAAAA;AACV3G,SAAKD,OAAO4sB,IAAIhmB,QAAQA,IACpB3G,KAAKa,MAAM8rB,OACb3sB,KAAKa,MAAM8rB,IAAIhmB,MAAMy2B,OAAOz2B,EAAAA;AAAAA,EAEhC;AAAA,EAKA,gBAAgB5G,IAAAA;AAGd,YAFAC,KAAKD,OAAOgtB,SAAShtB,IAEbA,GAAOqG,MAAAA;AAAAA,MACb,KAAK;AACHpG,aAAKq9B,mBAAmBt9B,GAAO4G,SAAS;AACxC;AAAA,MACF,KAAK;AACC5G,QAAAA,GAAOu9B,OAAAA,MACHt9B,KAAKu9B,qBAAqBx9B,GAAOu9B;AAEzC;AAAA,MACF,KAAK;AACCv9B,QAAAA,GAAOy9B,QAA+B,MAAvBz9B,GAAOy9B,KAAK51B,gBACvB5H,KAAKy9B,yBAAyB19B,GAAOy9B,IAAAA;AAE7C;AAAA,MACF,KAAK;AACCz9B,QAAAA,GAAOu9B,OAAAA,MACHt9B,KAAK09B,iBAAiB39B,GAAOu9B,GAAAA;AAErC;AAAA,MACF,KAAK;AACCv9B,QAAAA,GAAOu9B,OAAAA,MACHt9B,KAAK29B,6BAA6B59B,GAAOu9B;;EAIvD;AAAA,EAKA,mBAAmB32B,IAAAA;AACjB3G,SAAK08B,oBAAoB,IAAI93B,EAAM8K,MAAM/I,EAAAA,GACzC3G,KAAKa,MAAM2b,aAAaxc,KAAK08B;AAAAA,EAC/B;AAAA,EAKA,2BAA2BY,IAAAA;AACzB,WAAO,IAAIlM,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAKu8B,cAAcrc,KACjBod,IACCO,CAAAA,OAAAA;AACC79B,aAAK08B,oBAAoBmB,IACzB79B,KAAKa,MAAM2b,aAAaqhB,IACxBvM,GAAQuM,EAAAA;AAAAA,MAAAA,GAAAA,QAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,+BAA+BJ,IAAAA;AAC7B,WAAO,IAAIpM,QAAQ,CAACE,IAASsM;AAC3B59B,WAAKq8B,kBAAkBnc,KACrBsd,IACCK,CAAAA,OAAAA;AACC79B,aAAK08B,oBAAoBmB,IACzB79B,KAAKa,MAAM2b,aAAaqhB,IACxBvM,GAAQuM,EAAAA;AAAAA,MAAAA,GAAAA,QAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,uBAAuBN,IAAAA;AACrB,WAAO,IAAIlM,QAAQ,CAACE,IAASsM;AAC3B59B,WAAKm8B,WAAWjc,KACdod,IACCO,CAAAA,OAAAA;AACCA,QAAAA,GAAQC,UAAUl5B,EAAMm5B,kCACxB/9B,KAAK08B,oBAAoBmB,IACzB79B,KAAKa,MAAM2b,aAAaqhB,IACxBvM,GAAQuM,EAAAA;AAAAA,MAAAA,GAAAA,QAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,mCAAmCN,IAAAA;AACjC,WAAO,IAAIlM,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAKu8B,cAAcrc,KACjBod,IACCO,CAAAA,OAAAA;AACCA,QAAAA,GAAQC,UAAUl5B,EAAMm5B,kCACxB/9B,KAAK08B,oBAAoBmB,IACzB79B,KAAKa,MAAM2b,aAAaqhB,IACxBvM,GAAQuM;iBAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA;AACM59B,SAAK08B,6BAA6B93B,EAAMo5B,WAC1Ch+B,KAAK08B,kBAAkB7G,QAAAA,GAEzB71B,KAAKa,MAAM2b,aAAa,MACxBxc,KAAK08B,oBAAoB,MACzB18B,KAAKD,OAAOgtB,SAAS;AAAA,EACvB;AAAA,EAKA,wBAAwBuQ,IAAAA;AAGtB,WAFAt9B,KAAKD,OAAOitB,iBAAiBsQ,IAEtB,IAAIlM,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAKm8B,WAAWjc,KACdod,IACCO,CAAAA;AACCA,QAAAA,GAAQC,UAAUl5B,EAAMm5B,kCACxB/9B,KAAKy8B,gBAAgBoB,IACrB79B,KAAKa,MAAMo9B,cAAcJ,IAErB,0BAA0B79B,KAAKa,UAChCb,KAAKa,MAAcosB,uBAAuBjtB,KAAKD,OAAOktB,uBAEzDqE,GAAQuM;iBAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,MAAA,sBAA4BJ;AAC1B,WAAO,IAAIpM,QAAQ,CAACE,IAASsM;AAC3B59B,WAAKq8B,kBAAkBnc,KACrBsd,IACCK,CAAAA,OAAAA;AACC79B,aAAKy8B,gBAAgBoB,IACrB79B,KAAKa,MAAMo9B,cAAcJ,IACzBvM,GAAQuM;iBAGVD,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA;AACM59B,SAAKy8B,iBACPz8B,KAAKy8B,cAAc5G,QAAAA,GAErB71B,KAAKa,MAAMo9B,cAAc,MACzBj+B,KAAKy8B,gBAAgB,MACrBz8B,KAAKD,OAAOitB,iBAAiB;AAAA,EAC/B;AAAA,EAKA,wBAAwB7oB;AACtBnE,SAAKD,OAAOktB,uBAAuB9oB,IAC/B,0BAA0BnE,KAAKa,UAChCb,KAAKa,MAAcosB,uBAAuB9oB;AAAAA,EAE/C;AAAA,EAKA,wBAAwB+5B,IAAAA;AACtBl+B,SAAKD,OAAOmtB,uBAAuBgR,IAC/B,0BAA0Bl+B,KAAKa,UAChCb,KAAKa,MAAcqsB,uBAAuBgR;AAAAA,EAE/C;AAAA,EAKA,uBAAuB/5B,IAAAA;AACrBnE,SAAKD,OAAOotB,sBAAsBhpB,IAC9B,yBAAyBnE,KAAKa,UAC/Bb,KAAKa,MAAcssB,sBAAsBhpB;AAAAA,EAE9C;AAAA,EAKA,oBAAAg6B;AACE,WAAOn+B,KAAKy8B;AAAAA,EACd;AAAA,EAKA,gBAAA2B;AACE,WAAOp+B,KAAK08B;AAAAA,EACd;AAAA,EAKA,eAAA2B;AACE,WAAO,EAAA,GAAKr+B,KAAKD,OAAO4sB,IAAAA;AAAAA,EAC1B;AAAA,EAKA,YAAA2R;AACE,WAAO,EAAA,GAAKt+B,KAAKD,OAAAA;AAAAA,EACnB;AAAA,uBbrUK,cAAwBD;EA6G7B,YAAYC;AACV2tB,UAAM,EAAA,GAAKjF,IAAAA,GAAuB1oB,GAAAA,CAAAA,GA7GpCC,KAASghB,OAAO,OAGhBhhB,KAAQu+B,OAAmB,MAG3Bv+B,KAAQw+B,cAA0B,MAGlCx+B,KAAQy+B,gBAA4B,MAGpCz+B,KAAQ0+B,aAAyB,MAGjC1+B,KAAQ2+B,kBAA8B,MAGtC3+B,KAAA4+B,cAA0B,MAG1B5+B,KAAQ6+B,kBAA8B,MAGtC7+B,KAAQ8+B,sBAAkC,MAG1C9+B,KAAQ++B,qBAAiC,MAGzC/+B,KAAQg/B,mBAA+B,MAGvCh/B,KAAQi/B,qBAAiC,MAGzCj/B,KAAQk/B,wBAAoC,MAG5Cl/B,KAAQm/B,qBAAiC,MAGzCn/B,KAAQo/B,uBAAmC,MAG3Cp/B,KAAQq/B,kBAA8B,MAGtCr/B,KAAQs/B,gBAAgB,EACtB58B,MAAM,MACN8D,qBAAAA,OACA+4B,SAAAA,MAAS,GAIXv/B,KAAQw/B,kBAAkB,EACxBC,cAAc,OACdrU,cAAc,UAIhBprB,KAAQ0/B,aAAa,EACnBh9B,MAAM,QACN8zB,WAAW,QACXpL,cAAc,OAAA,GAIhBprB,KAAQ2/B,eAAe,EACrBrC,KAAK,IACLlS,cAAc,UAIhBprB,KAAQ4/B,iBAAiB,EACvBhU,cAAc,KACdC,OAAO,GACPC,OAAO,KACPC,aAAa,IACbC,QAAQ,2EACRE,WAAW,OACXD,gBAAgB,SAIlBjsB,KAAQ6/B,oBAAoB,EAC1BvC,KAAK,2DACLlS,cAAc,QACd0U,SAAS,KAIX9/B,KAAQ+/B,iBAAiB,EACvBC,UAAU,uEACVl6B,MAAM,IACNslB,cAAc,OAAA,GAIhBprB,KAAQigC,mBAAmB,EACzB75B,MAAM,QAIRpG,KAAQkgC,cAAc,EACpBC,WAAW;EAKb;AAAA,EAEU;AACRngC,SAAKogC,UAAAA;AAAAA,EACP;AAAA,EAEU,cAAA7/B;AACRP,SAAK2mB,QAAAA;AAAAA,EACP;AAAA,EAKA,IAAA,MAAI/F;AACF,WAAO5gB,KAAKu+B;AAAAA,EACd;AAAA,EAKA,IAAA,aAAIjuB;;AACF,aAAOtQ,UAAKu+B,SAALv+B,mBAAWsQ,eAAc;AAAA,EAClC;AAAA,EAKQ,YAAA8vB;AACFpgC,SAAKD,OAAO2oB,aAIhB1oB,KAAKu+B,OAAO,IAAIjf,GAAI,EAClBQ,WAAW9f,KAAKD,OAAO+f,WACvB1e,OAAOpB,KAAKD,OAAOqB,MAAAA,CAAAA,GAIrBpB,KAAKqgC,qBAGLrgC,KAAKsgC,oBAAAA,GAGLtgC,KAAKugC,iBAAAA,GAGLvgC,KAAKwgC;EACP;AAAA,EAKQ,oBAAAH;AACDrgC,SAAKu+B,SAEVv+B,KAAKw+B,cAAcx+B,KAAKu+B,KAAKzX,UAAU,SAGvC9mB,KAAKygC,qBAAAA,GAGLzgC,KAAK0gC,mBAAAA,GAGL1gC,KAAK2gC,6BAGL3gC,KAAK4gC,wBAAAA,GAGL5gC,KAAK6gC,uBAAAA,GAGL7gC,KAAK8gC,wBAEA9gC,KAAKD,OAAOkhB,UACfjhB,KAAKw+B,YAAYrX,KAAAA;AAAAA,EAErB;AAAA,EAKQ,uBAAAsZ;AACN,QAAA,CAAKzgC,KAAKw+B,YAAa;AAEvB,UAAMvX,KAASjnB,KAAKw+B,YAAY1X,UAAU,UACpCrlB,KAAWzB,KAAKyB,UAEhBqR,KAAS,EACbiuB,aAAat/B,GAASs/B,aACtBC,qBAAqBv/B,GAASu/B,qBAC9BC,kBAAkBx/B,GAASy/B,UAAU59B,SACrC69B,eAAe1/B,GAASy/B,UAAU96B,MAClC6tB,YAAYxyB,GAASyyB,cAAAA,GACrBkN,kBAAkB3/B,GAAS2/B,iBAAAA;AAG7Bna,IAAAA,GAAOT,IAAI1T,IAAQ,eAAe,EAChC,KAAKlO,EAAMy8B,eACX,MAAMz8B,EAAM08B,mBACZC,UAAY38B,EAAM48B,qBAClBC,QAAU78B,EAAM88B,mBAChBC,YAAc/8B,EAAMg9B,yBACnB5gB,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACxBhG,MAAAA,GAASs/B,cAAct5B;AAAAA,IAAAA,CAAAA,GAGzBwf,GAAOT,IAAI1T,IAAQ,uBAAuB,GAAG,GAAG,KAAKkO,KAAK,KAAA,EAAOtJ,SAAUjQ,CAAAA,OAAAA;AACzEhG,MAAAA,GAASu/B,sBAAsBv5B;AAAAA,IAAAA,CAAAA,GAGjCwf,GAAOT,IAAI1T,IAAQ,kBAAA,EAAoBkO,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA,OAAAA;AAC1DhG,MAAAA,GAASy/B,UAAU59B,UAAUmE;AAAAA,IAAAA,CAAAA,GAG/Bwf,GAAOT,IAAI1T,IAAQ,cAAc,KAAK,GAAG,GAAA,EAAKkO,KAAK,OAAOtJ,SAAUjQ,CAAAA,OAAAA;AAClEhG,MAAAA,GAAS2yB,cAAc3sB,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAE3B;AAAA,EAKQ,qBAAAi5B;AACN,QAAA,CAAK1gC,KAAKw+B,YAAa;AAEvB,UAAMvX,KAASjnB,KAAKw+B,YAAY1X,UAAU,MAAA,GACpCtlB,KAASxB,KAAKwB;AAEpBylB,IAAAA,GAAOT,IAAIhlB,IAAQ,OAAO,IAAI,KAAK,CAAA,EAAGwf,KAAK,IAAA,EAAMtJ,SAAS,MAAA;AACxDlW,MAAAA,GAAOqgC;QAGT5a,GAAOT,IAAIhlB,IAAQ,QAAQ,MAAM,KAAK,IAAA,EAAMwf,KAAK,MAAA,EAAQtJ,SAAS;AAChElW,MAAAA,GAAOqgC,uBAAAA;AAAAA,IAAAA,CAAAA,GAGT5a,GAAOT,IAAIhlB,IAAQ,OAAO,KAAK,KAAQ,GAAA,EAAKwf,KAAK,QAAQtJ,SAAS,MAAA;AAChElW,MAAAA,GAAOqgC,uBAAAA;AAAAA,IAAAA,CAAAA;AAIT,UAAMC,KAAY7a,GAAOH,UAAU;AACnCgb,IAAAA,GAAUtb,IAAIhlB,GAAO6Q,UAAU,KAAA,MAAY,KAAM,CAAA,EAAGiS,UACpDwd,GAAUtb,IAAIhlB,GAAO6Q,UAAU,WAAY,KAAM,GAAGiS,OAAAA,GACpDwd,GAAUtb,IAAIhlB,GAAO6Q,UAAU,KAAA,MAAY,KAAM,CAAA,EAAGiS,OAAAA;AAAAA,EACtD;AAAA,EAKQ,4BAAAqc;;AACN,SAAK3gC,KAAKw+B,YAAa;AAEvB,UAAMuD,MAAkB/hC,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD,QAAA,EAAKqzB,MAAAA,gBAAAA,GAAiB7Q,UAAU;AAEhC,UAAMjK,KAASjnB,KAAKw+B,YAAY1X,UAAU,MAAA,GACpCoK,KAAW6Q,GAAgB7Q;AAEjCjK,IAAAA,GAAOT,IAAI0K,IAAU,eAAA,EAAiBlQ,KAAK,OAC3CiG,GAAOT,IAAI0K,IAAU,iBAAiB,GAAG,GAAG,IAAA,EAAMlQ,KAAK,MAAA,GACvDiG,GAAOT,IAAI0K,IAAU,YAAA,EAAclQ,KAAK,IAAA,GACxCiG,GAAOT,IAAI0K,IAAU,cAAA,EAAgBlQ,KAAK,IAAA,GAC1CiG,GAAOT,IAAI0K,IAAU,aAAalQ,KAAK,IAAA,GACvCiG,GAAOT,IAAI0K,IAAU,cAAclQ,KAAK,MAAA,GACxCiG,GAAOT,IAAI0K,IAAU,mBAAmB,GAAG,IAAI,KAAKlQ,KAAK,MAAA,GACzDiG,GAAOT,IAAI0K,IAAU,eAAe,GAAG,KAAM,CAAA,EAAGlQ,KAAK,SACrDiG,GAAOT,IAAI0K,IAAU,eAAe,GAAG,KAAO,EAAA,EAAIlQ,KAAK,MAAA,GACvDiG,GAAOT,IAAI0K,IAAU,iBAAiB,GAAG9uB,KAAKC,IAAI,IAAA,EAAM2e,KAAK;EAC/D;AAAA,EAKQ;;AACN,QAAA,CAAKhhB,KAAKw+B,YAAa;AAEvB,UAAMvX,KAASjnB,KAAKw+B,YAAY1X,UAAU,MAAA,GACpCjmB,KAAQb,KAAKa,OAGbmhC,KAAY/a,GAAOH,UAAU,QAC7Bmb,KAAY,EAChB3+B,WAAWzC,GAAM8rB,KACjBhmB,OAAO9F,GAAM8rB,MAAM,MAAO9rB,GAAM8rB,IAAkBhmB,MAAMu7B,aAAAA,IAAiB,WACzEtV,QAAO/rB,KAAAA,GAAM8rB,QAAN9rB,mBAAyB+rB,SAAQ,GACxCC,OAAMhsB,KAAAA,GAAM8rB,QAAN9rB,mBAAyBgsB,QAAO,IAAA;AAGxCmV,IAAAA,GAAUxb,IAAIyb,IAAW,WAAWjhB,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA,OAAAA;AAErD5G,MAAAA,GAAM8rB,MADJllB,KACU,IAAI7C,EAAMs4B,IAAI+E,GAAUt7B,OAAOs7B,GAAUrV,MAAMqV,GAAUpV,GAAAA,IAEzD;AAAA,QAIhBmV,GAAUvb,SAASwb,IAAW,OAAA,EAASjhB,KAAK,MAAMtJ,SAAUjQ,CAAAA,OAAAA;AACtD5G,MAAAA,GAAM8rB,OACP9rB,GAAM8rB,IAAkBhmB,MAAMqJ,IAAIvI,EAAAA;AAAAA,IAAAA,CAAAA,GAIvCu6B,GAAUxb,IAAIyb,IAAW,QAAQ,GAAG,KAAM,GAAGjhB,KAAK,KAAA,EAAOtJ,SAAUjQ,CAAAA,OAAAA;AAC7D5G,MAAAA,GAAM8rB,QACP9rB,GAAM8rB,IAAkBC,OAAOnlB;AAAAA,IAAAA,CAAAA,GAIpCu6B,GAAUxb,IAAIyb,IAAW,OAAO,GAAG,KAAO,EAAA,EAAIjhB,KAAK,KAAA,EAAOtJ,SAAUjQ,CAAAA,OAAAA;AAC9D5G,MAAAA,GAAM8rB,QACP9rB,GAAM8rB,IAAkBE,MAAMplB;AAAAA,IAAAA,CAAAA;AASnCwf,IAAAA,GAAOR,SAJU,EACf9f,OAAO,UAAA,GAGiB,OAAA,EAASqa,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA;AACxD5G,MAAAA,GAAM2b,aAAa,IAAI5X,EAAM8K,MAAMjI,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAEvC;AAAA,EAKQ,yBAAAo5B;AACN,QAAA,CAAK7gC,KAAKw+B,YAAa;AAEvB,UAAMvX,KAASjnB,KAAKw+B,YAAY1X,UAAU,MAAA;AAC1C9mB,SAAKq/B,kBAAkBpY,GAAOH,UAAU,MAAA,GAExCG,GAAOT,IAAIxmB,KAAKkgC,aAAa,aAAarX,EAAAA,EAAe7H,KAAK,MAAA,GAE9DiG,GAAOT,IAAI,EACT2b,IAAI;AACF,YAAMC,KAAQpiC,KAAKqiC,YAAYriC,KAAKkgC,YAAYC,SAAAA;AAChDngC,WAAKa,MAAM2lB,IAAI4b,KACfpiC,KAAKsiC,cAAcF,EAAAA,GACnBpiC,KAAKU,OAAOqvB,KAAK,aAAoB,EAAEqS,OAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAExC,IAAA,EAAMphB,KAAK,MAAA,GAGdhhB,KAAKa,MAAM45B,SAAS1yB,QAAQw6B,CAAAA;AACtBA,MAAAA,cAAiB39B,EAAM49B,SACzBxiC,KAAKsiC,cAAcC;;EAGzB;AAAA,EAKQ,YAAYn8B,IAAAA;AAClB,YAAQA,IAAAA;AAAAA,MACN,KAAK;AAAA,MAsBL;AACE,eAAO,IAAIxB,EAAM69B,aAAa,UAAU,GAAA;AAAA,MArB1C,KAAK;AACH,cAAMC,KAAW,IAAI99B,EAAM+9B,iBAAiB,UAAU,CAAA;AAGtD,eAFAD,GAASrwB,SAASrC,IAAI,GAAG,IAAI,CAAA,GAC7B0yB,GAASE,mBACFF;AAAAA,MACT,KAAK;AACH,cAAMG,KAAa,IAAIj+B,EAAMk+B,WAAW,UAAU,GAAG;AAErD,eADAD,GAAWxwB,SAASrC,IAAI,GAAG,GAAG,CAAA,GACvB6yB;AAAAA,MACT,KAAK;AACH,cAAME,KAAY,IAAIn+B,EAAMo+B,UAAU,UAAU,CAAA;AAGhD,eAFAD,GAAU1wB,SAASrC,IAAI,GAAG,IAAI,CAAA,GAC9B+yB,GAAUH,aAAAA,MACHG;AAAAA,MACT,KAAK;AACH,eAAO,IAAIn+B,EAAMq+B,gBAAgB,UAAU,SAAU,CAAA;AAAA,MACvD,KAAK;AACH,cAAMC,KAAY,IAAIt+B,EAAMu+B,cAAc,UAAU,GAAG,IAAI,EAAA;AAE3D,eADAD,GAAU7wB,SAASrC,IAAI,GAAG,GAAG,CAAA,GACtBkzB;AAAAA;EAIb;AAAA,EAKQ,cAAcd,IAAAA;;AACpB,SAAKpiC,KAAKq/B,gBAAiB;AAE3B,UAAMpY,KAASjnB,KAAKq/B,gBAAgBvY,UAAUsb,GAAMh8B,OAAOg8B,GAAMzQ,EAAAA,GAC3DsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI,yBAG1C00B,KAAc,EAAEz8B,OAAO,MAAMy7B,GAAMz7B,MAAMu7B,aAAAA,EAAAA;AAS/C,QARAjb,GAAOR,SAAS2c,IAAa,SAASpiB,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA,OAAAA;AACzD26B,MAAAA,GAAMz7B,MAAMqJ,IAAIvI;QAIlBwf,GAAOT,IAAI4b,IAAO,aAAa,GAAG,IAAI,GAAA,EAAKphB,KAAK,IAAA,GAAA,EAG1CohB,cAAiBx9B,EAAM69B,gBAAmBL,cAAiBx9B,EAAMq+B,kBAAkB;AACvF,YAAMnB,KAAY7a,GAAOH,UAAU,IAAA;AACnCgb,MAAAA,GAAUtb,IAAI4b,GAAM/vB,UAAU,KAAA,MAAW,KAAK,GAAA,EAAKiS,OAAAA,GACnDwd,GAAUtb,IAAI4b,GAAM/vB,UAAU,KAAA,MAAW,KAAK,GAAA,EAAKiS,OAAAA,GACnDwd,GAAUtb,IAAI4b,GAAM/vB,UAAU,KAAA,MAAW,KAAK,GAAA,EAAKiS;IACrD;AAAA,eAGK8d,GAAcQ,cACjB3b,GAAOT,IAAI4b,IAAO,cAAcphB,KAAK,MAAA,GAIvCiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAO2G,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMphB,KAAK,IAAA,GAGdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACFC,OAAAA,MAAAA,GAAMj8B,WAANi8B,gBAAAA,IAAcle,OAAOke,MACrBpiC,UAAKq/B,oBAALr/B,mBAAsB6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAEpC,IAAA,EAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ,uBAAA8f;;AACN,QAAA,CAAK9gC,KAAKw+B,YAAa;AAEvB,UAAMrD,MAAiBn7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAE/C,QAAA,CAAKysB,GAAgB;AAErB,UAAMlU,KAASjnB,KAAKw+B,YAAY1X,UAAU,MAAA,GAGpCuc,KAAgBpc,GAAOH,UAAU,KAAA,GACjC2M,KAAc0H,GAAe1H;AACnC,QAAIA,IAAa;AACf4P,MAAAA,GAAc7c,IAAIiN,IAAa,WAAWzS,KAAK,IAAA,GAC/CqiB,GAAc7c,IAAIiN,IAAa,gBAAgB,GAAG,IAAI,GAAA,EAAKzS,KAAK,SAChEqiB,GAAc7c,IAAIiN,IAAa,YAAY,GAAG,GAAG,GAAA,EAAKzS,KAAK,MAAA,GAC3DqiB,GAAc7c,IAAIiN,IAAa,iBAAiB,GAAG,GAAG,GAAA,EAAKzS,KAAK,MAAA,GAChEqiB,GAAc7c,IAAIiN,IAAa,eAAe,GAAG,GAAG,KAAKzS,KAAK,MAAA;AAE9D,YAAMoiB,KAAc,EAClBx/B,kBAAkB,MAAM6vB,GAAY7vB,iBAAiBs+B,aAAAA,GACrDr+B,iBAAiB,MAAM4vB,GAAY5vB,gBAAgBq+B,aAAAA,EAAAA;AAErDmB,MAAAA,GAAc5c,SAAS2c,IAAa,kBAAA,EAAoBpiB,KAAK,QAAA,EAAUtJ,SAAUjQ,CAAAA;AAC/EgsB,QAAAA,GAAY7vB,iBAAiBoM,IAAIvI,EAAAA;AAAAA,MAAAA,CAAAA,GAEnC47B,GAAc5c,SAAS2c,IAAa,mBAAmBpiB,KAAK,QAAA,EAAUtJ,SAAUjQ,CAAAA,OAAAA;AAC9EgsB,QAAAA,GAAY5vB,gBAAgBmM,IAAIvI;;IAEpC;AAGA,UAAM67B,KAAcrc,GAAOH,UAAU,OAC/B6M,KAAYwH,GAAexH;AAC7BA,IAAAA,OACF2P,GAAY9c,IAAImN,IAAW,SAAA,EAAW3S,KAAK,IAAA,GAC3CsiB,GAAY9c,IAAImN,IAAW,YAAY,GAAG,GAAG,KAAK3S,KAAK,IAAA,GACvDsiB,GAAY9c,IAAImN,IAAW,UAAU,GAAG,GAAG,IAAA,EAAM3S,KAAK,OACtDsiB,GAAY9c,IAAImN,IAAW,aAAa,GAAG,GAAG,IAAA,EAAM3S,KAAK,IAAA;AAAA,EAE7D;AAAA,EAKQ,sBAAAsf;AACDtgC,SAAKu+B,SAEVv+B,KAAKy+B,gBAAgBz+B,KAAKu+B,KAAKzX,UAAU,SAEzC9mB,KAAKy+B,cAAcjY,IAAIxmB,KAAKs/B,eAAe,QAAQ,CAAC,MAAM,OAAO,MAAM,QAAQ,MAAA,CAAA,EAC5Ete,KAAK,MACLsD,OAAAA,EACA5M,SAAUjQ,CAAAA;AACTzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAErtB,MAAM+E,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAGnDzH,KAAKy+B,cAAcjY,IAAIxmB,KAAKs/B,eAAe,qBAAA,EAAuBte,KAAK,KAAA,EAAOsD,OAAAA,GAC9EtkB,KAAKy+B,cAAcjY,IAAIxmB,KAAKs/B,eAAe,WAAWte,KAAK,MAAA,EAAQsD,SAAS5M,SAAUjQ,CAAAA,OAAAA;AACpFzH,WAAKU,OAAOqvB,KAAK,mBAA0B,EAAEzsB,SAASmE;QAIxDzH,KAAKujC,0BAAAA,GAGLvjC,KAAKwjC,kBAAAA,GAGLxjC,KAAKyjC,oBAAAA,GAGLzjC,KAAK0jC,iCAEA1jC,KAAKD,OAAOkhB,UACfjhB,KAAKy+B,cAActX;EAEvB;AAAA,EAKQ;AACN,QAAA,CAAKnnB,KAAKy+B,cAAe;AAEzB,UAAMxX,KAASjnB,KAAKy+B,cAAc3X,UAAU,MAAA,GACtChU,KAAS,EACb6wB,cAAAA,OACAC,cAAAA,OACAC,iBAAW;AAGb5c,IAAAA,GAAOT,IAAI1T,IAAQ,cAAA,EAAgBkO,KAAK,MAAA,GACxCiG,GAAOT,IAAI1T,IAAQ,cAAA,EAAgBkO,KAAK,MAAA,GACxCiG,GAAOT,IAAI1T,IAAQ,WAAA,EAAakO,KAAK,MAAA;AAAA,EACvC;AAAA,EAKQ,oBAAAwiB;AACN,SAAKxjC,KAAKy+B,cAAe;AAEzB,UAAMxX,KAASjnB,KAAKy+B,cAAc3X,UAAU,MAAA,GACtChU,KAAS,EACbgxB,WAAAA,OACAC,WAAW,EAAA;AAGb9c,IAAAA,GAAOT,IAAI1T,IAAQ,aAAakO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACrDzH,WAAKU,OAAOqvB,KAAK,gBAAuB,EAAEzsB,SAASmE,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAGrDwf,GAAOT,IAAI1T,IAAQ,aAAa,EAAEkxB,KAAO,GAAGC,IAAM,GAAGC,IAAM,EAAA,CAAA,EAAKljB,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA;AACnFzH,WAAKU,OAAOqvB,KAAK,cAAqB,EAAErtB,MAAM+E,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAElD;AAAA,EAKQ,sBAAAg8B;AACN,SAAKzjC,KAAKy+B,cAAe;AAEzB,UAAMxX,KAASjnB,KAAKy+B,cAAc3X,UAAU,MAAA,GAEtChU,KAAS,EACbqxB,UAAAA,MACAC,gBACAC,UAAU,KACVC,eAAe,KACfC,UAAU,EAAA;AAGZtd,IAAAA,GAAOT,IAAI1T,IAAQ,UAAA,EAAYkO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACpDzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAEzsB,SAASmE,IAAGyhB,MAAMpW,GAAOuxB,UAAUlb,WAAWrW,GAAOwxB;QAGhGrd,GAAOT,IAAI1T,IAAQ,YAAY,IAAI,KAAK,EAAA,EAAIkO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA;AACjEzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAEzsB,SAASwP,GAAOqxB,UAAUjb,MAAMzhB,IAAG0hB,WAAWrW,GAAOwxB,cAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAGhGrd,GAAOT,IAAI1T,IAAQ,iBAAiB,IAAI,KAAK,EAAA,EAAIkO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACtEzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAEzsB,SAASwP,GAAOqxB,UAAUjb,MAAMpW,GAAOuxB,UAAUlb,WAAW1hB;QAGvGwf,GAAOT,IAAI1T,IAAQ,UAAA,EAAYkO,KAAK,OAAA,EAAStJ,SAAUjQ,CAAAA;AACrDzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAEzsB,SAASmE,IAAGyhB,MAAMpW,GAAOyxB,SAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAGpEtd,GAAOT,IAAI1T,IAAQ,YAAY,GAAG,IAAI,CAAA,EAAGkO,KAAK,OAAA,EAAStJ,SAAUjQ,CAAAA,OAAAA;AAC/DzH,WAAKU,OAAOqvB,KAAK,eAAsB,EAAEzsB,SAASwP,GAAOsxB,UAAUlb,MAAMzhB,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAE7E;AAAA,EAKQ;;AACN,QAAA,CAAKzH,KAAKy+B,cAAe;AAEzB,UAAMxD,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD,UAAKusB,MAAAA,gBAAAA,GAAiB/J,UAAU;AAEhC,UAAMjK,KAASjnB,KAAKy+B,cAAc3X,UAAU,YACtCoK,KAAW+J,GAAgB/J;AAEjCjK,IAAAA,GAAOT,IAAI0K,IAAU,QAAQ,CAAC,aAAa,UAAU,OAAA,CAAA,EAAUlQ,KAAK,IAAA,GACpEiG,GAAOT,IAAI0K,IAAU,SAAS,CAAC,SAAS,UAAUlQ,KAAK,IAAA,GACvDiG,GAAOT,IAAI0K,IAAU,QAAQ,KAAK,GAAG,GAAA,EAAKlQ,KAAK,OAC/CiG,GAAOT,IAAI0K,IAAU,OAAA,EAASlQ,KAAK,MAAA,GACnCiG,GAAOT,IAAI0K,IAAU,OAAA,EAASlQ,KAAK,MAAA,GACnCiG,GAAOT,IAAI0K,IAAU,OAAA,EAASlQ,KAAK,MAAA;AAGnC,UAAMwjB,KAAa,EACjBzhC,iBAAiBmuB,GAASnuB,mBAAmB,GAC7CC,cAAckuB,GAASluB,gBAAgB,EAAA;AAGzCikB,IAAAA,GAAOT,IAAIge,IAAY,mBAAmB,GAAG,IAAI,GAAA,EAAKxjB,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AAC3EypB,MAAAA,GAASuT,mBAAyB,MAANh9B,KAAU,OAAOA,EAAAA;AAAAA,IAAAA,CAAAA,GAE/Cwf,GAAOT,IAAIge,IAAY,gBAAgB,GAAGpiC,KAAKC,KAAK,GAAG,IAAA,EAAM2e,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA;AAClFypB,MAAAA,GAASwT,gBAAsB,MAANj9B,KAAU,OAAOA;;EAE9C;AAAA,EAKQ;AACDzH,SAAKu+B,SAEVv+B,KAAK0+B,aAAa1+B,KAAKu+B,KAAKzX,UAAU,SAGtC9mB,KAAK2kC,kBAAAA,GAGL3kC,KAAK4kC,iBAAAA,GAGL5kC,KAAK6kC,sBAAAA,GAGL7kC,KAAK8kC,sBAGL9kC,KAAK+kC,qBAAAA,GAGL/kC,KAAKglC,wBAAAA,GAGLhlC,KAAKilC,wBAGLjlC,KAAKklC,uBAAAA,GAEAllC,KAAKD,OAAOkhB,UACfjhB,KAAK0+B,WAAWvX;EAEpB;AAAA,EAKQ;AACN,QAAA,CAAKnnB,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAK6+B,kBAAkB5X,GAAOH,UAAU,MAAA;AAExC,UAAMhU,KAAS,EACb3P,WAAW,WACXgiC,UAAU,MAAA;AACRnlC,WAAKolC,eAAe,cAAeC,CAAAA,OAAAA;AACjCrlC,aAAKU,OAAOqvB,KAAK,cAAqB,EAAEsV,MAAAA,IAAMj/B,MAAM;;OAGxDk/B,SAAS,MAAA;AACPtlC,WAAKolC,eAAe,QAASC,CAAAA,OAAAA;AAC3BrlC,aAAKU,OAAOqvB,KAAK,cAAqB,EAAEsV,MAAAA,IAAMj/B,MAAM;;OAGxDm/B,SAAS,MAAA;AACPvlC,WAAKolC,eAAe,QAASC,CAAAA;AAC3BrlC,aAAKU,OAAOqvB,KAAK,cAAqB,EAAEsV,MAAAA,IAAMj/B,MAAM;;;AAK1D6gB,IAAAA,GAAOT,IAAI1T,IAAQ,WAAA,EAAakO,KAAK,YACrCiG,GAAOT,IAAI1T,IAAQ,UAAA,EAAYkO,KAAK,QAAA,GACpCiG,GAAOT,IAAI1T,IAAQ,SAAA,EAAWkO,KAAK,OAAA,GACnCiG,GAAOT,IAAI1T,IAAQ,WAAWkO,KAAK,OAAA;AAAA,EACrC;AAAA,EAKA,cAAcwkB;;AACZ,QAAA,CAAKxlC,KAAK6+B,gBAAiB;AAE3B,UAAM5X,KAASjnB,KAAK6+B,gBAAgB/X,UAAU0e,GAAMxkB,OAAOwkB,GAAM7T,EAAAA,GAC3DsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI,yBAC1C+2B,MAAczlC,UAAK0B,kBAAL1B,mBAAoB0O,IAAI,qBACtCysB,MAAiBn7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAG/C1O,SAAK0lC,oBAAoBF,IAAOve,GAAOH,UAAU,UAGjD9mB,KAAK2lC,oBAAoBH,IAAOve,GAAOH,UAAU,SAAA,CAAA,KAG5C0e,KAAAA,GAAc5W,eAAd4W,mBAA0B59B,UAAS,KACtC5H,KAAK4lC,uBAAuBJ,IAAOve,GAAOH,UAAU,MAAA,CAAA,GAItDG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAO+J,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMxkB,KAAK,IAAA,GAGdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACF,UAAIsD,MAAAA,gBAAAA,GAAavU,UAAU;AACzB,cAAM3M,KAAM,IAAI3f,EAAMwlB,OAAOC,cAAcmb,EAAAA,GACrClb,KAAS/F,GAAIgG,UAAU,IAAI3lB,EAAMklB,SAAAA,GACjCZ,KAAO3E,GAAIshB,QAAQ,IAAIjhC,EAAMklB,SAAAA,GAE7BD,KAAoB,IADXznB,KAAK8K,IAAIgc,GAAK/V,GAAG+V,GAAK7V,GAAG6V,GAAKmD;AAG7CoZ,QAAAA,GAAYvU,SAASvsB,OAAOstB,KAAK3H,KACjCtqB,KAAKwB,OAAO6Q,SAAS4f,KAAK3H,EAAAA,EAAQ9D,IAAI,IAAI5hB,EAAMklB,QAAQD,IAAUA,IAAUA,EAAAA,CAAAA;AAAAA,MAC9E;AACIoR,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAO+J,EAAAA,GAE9BrK,MACFA,GAAeO,kBAAkB,CAAC8J,EAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAGrC,MAAMxkB,KAAK,MAAA,GAGdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,WAE3BoK,MAAAA,GAAMr/B,WAANq/B,gBAAAA,IAActhB,OAAOshB,MACrBxlC,MAAAA,KAAK6+B,oBAAL7+B,gBAAAA,IAAsB6mB,aAAaI;AAAAA,SAEpC,IAAA,EAAMjG,KAAK;EAChB;AAAA,EAKQ,oBAAoBiV,IAAsBhP,IAAAA;AAEhDA,IAAAA,GAAOT,IAAIyP,IAAM,SAAA,EAAWjV,KAAK;AAGjC,UAAM8gB,KAAY7a,GAAOH,UAAU,IAAA;AACnCgb,IAAAA,GAAUtb,IAAIyP,GAAK5jB,UAAU,KAAA,MAAY,KAAM,GAAA,EAAKiS,UACpDwd,GAAUtb,IAAIyP,GAAK5jB,UAAU,KAAA,MAAY,KAAM,GAAA,EAAKiS,UACpDwd,GAAUtb,IAAIyP,GAAK5jB,UAAU,KAAA,MAAY,KAAM,KAAKiS,OAAAA;AAGpD,UAAMwhB,KAAY7e,GAAOH,UAAU;AACnCgf,IAAAA,GAAUtf,IAAIyP,GAAKvE,UAAU,MAAMtvB,KAAKC,IAAID,KAAKC,IAAI,IAAA,EAAMiiB,UAC3DwhB,GAAUtf,IAAIyP,GAAKvE,UAAU,MAAMtvB,KAAKC,IAAID,KAAKC,IAAI,IAAA,EAAMiiB,UAC3DwhB,GAAUtf,IAAIyP,GAAKvE,UAAU,KAAA,CAAMtvB,KAAKC,IAAID,KAAKC,IAAI,IAAA,EAAMiiB,OAAAA;AAG3D,UAAMyhB,KAAc9e,GAAOH,UAAU,IAAA;AACrCif,IAAAA,GAAYvf,IAAIyP,GAAK7xB,OAAO,KAAK,MAAM,IAAI,IAAA,EAAMkgB,OAAAA,GACjDyhB,GAAYvf,IAAIyP,GAAK7xB,OAAO,KAAK,MAAM,IAAI,IAAA,EAAMkgB,UACjDyhB,GAAYvf,IAAIyP,GAAK7xB,OAAO,KAAK,MAAM,IAAI,MAAMkgB,OAAAA;AAIjDyhB,IAAAA,GAAYvf,IADS,EAAEpiB,OAAO,KACA,SAAS,MAAM,IAAI,IAAA,EAAM4c,KAAK,QAAQtJ,SAAUjQ,CAAAA,OAAAA;AAC5EwuB,MAAAA,GAAK7xB,MAAM4L,IAAIvI,IAAGA,IAAGA;QAIlBwuB,GAAoBlwB,WACvBkhB,GAAOT,IAAIyP,IAAM,cAAcjV,KAAK,MAAA,GACpCiG,GAAOT,IAAIyP,IAAM,eAAA,EAAiBjV,KAAK;EAE3C;AAAA,EAKQ,oBAAoBglB,IAAuB/e,IAAAA;AACjD,UAAMgf,KAAgBD,GAAcC,gBAAgB,EAClDC,wBACAC,gBAAAA,MACAC,iBAAAA,MACAnQ,MAAM,EAAE2M,YAAAA,OAAmByD,eAAAA,MAAe,GAC1C1Q,UAAU,EAAE2Q,QAAAA,OAAeC,iBAAiB,GAAGC,cAAc,KAAA,EAAA;AAE7DR,IAAAA,GAAcC,eAAeA,IAE/Bhf,GAAOT,IAAIyf,IAAc,mBAAmBjlB,KAAK,QAAA,GACjDiG,GAAOT,IAAIyf,IAAc,gBAAA,EAAkBjlB,KAAK,SAChDiG,GAAOT,IAAIyf,IAAc,iBAAA,EAAmBjlB,KAAK,MAAA;AAGjD,UAAM0d,KAAazX,GAAOH,UAAU;AACpC4X,IAAAA,GAAWlY,IAAIyf,GAAahQ,MAAM,YAAA,EAAcjV,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA;AACjEw+B,MAAAA,GAAaC,mBACfF,GAAMS,SAASlE,CAAAA,OAAAA;AACRA,QAAAA,GAAqBx8B,WACxBw8B,GAAMK,aAAan7B;AAAAA,MAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAK3Bi3B,GAAWlY,IAAIyf,GAAahQ,MAAM,eAAA,EAAiBjV,KAAK,QAAQtJ,SAAUjQ,CAAAA,OAAAA;AACpEw+B,MAAAA,GAAaC,mBACfF,GAAMS,SAASlE,CAAAA,OAAAA;AACRA,QAAAA,GAAqBx8B,WACxBw8B,GAAM8D,gBAAgB5+B;AAAAA,MAAAA,CAAAA;AAAAA,IAAAA,CAAAA;AAOZwf,IAAAA,GAAOH,UAAU,MAAA,EACzBN,IAAIyf,GAAatQ,UAAU,mBAAmB,GAAG,GAAG,KAAK3U,KAAK,QAAA,EAAUtJ,SAAUjQ,CAAAA,OAAAA;AACtFw+B,MAAAA,GAAaC,mBACfF,GAAMS,SAASlE,CAAAA;AACb,YAAKA,GAAqBx8B,QAAQ;AAAA,WACd+B,MAAMuC,QAASk4B,GAAqB5M,YACjD4M,GAAqB5M,WACtB,CAAE4M,GAAqB5M,QAAAA,GACjB5tB,QAAQ2+B,CAAAA,OAAAA;AAAAA,uBACXA,GAAYH,oBACdG,GAAYH,kBAAkB9+B;AAAAA,UAAAA,CAAAA;AAAAA,QAGrC;AAAA;;EAIR;AAAA,EAKQ,uBAAuBu+B,IAAuB/e,IAAAA;AACpD,UAAM2H,KAAcoX,GAAcpX;AAClC,QAAA,CAAKA,MAAoC,MAAtBA,GAAWhnB,OAAc;AAE5C,UAAM++B,KAAcX,GAAc9W,uBAAuB,EACvDJ,UAAAA,OACArE,OAAO,KACPsE,cAAc,IAAIjnB,MAAM8mB,GAAWhnB,MAAAA,EAAQg/B,KAAAA,QAC3C5X,WAAW,GACXC,YAAM;AAEN+W,IAAAA,GAAc9W,sBAAsByX,IAEtC1f,GAAOT,IAAImgB,IAAY,YAAY3lB,KAAK,MAAA,GACxCiG,GAAOT,IAAImgB,IAAY,SAAS,GAAG,GAAG,GAAA,EAAK3lB,KAAK,OAChDiG,GAAOT,IAAImgB,IAAY,aAAa,GAAG,IAAI,GAAA,EAAK3lB,KAAK,SACrDiG,GAAOT,IAAImgB,IAAY,MAAA,EAAQ3lB,KAAK;AAGpC,UAAM6lB,KAAa5f,GAAOH,UAAU,MAAA;AACpC8H,IAAAA,GAAW7mB,QAAQ,CAACwnB,IAAMja,OAAAA;AACxBuxB,MAAAA,GAAWrgB,IAAImgB,GAAW5X,cAAczZ,GAAMtO,SAAAA,CAAAA,EAAYga,KAAKuO,GAAKvO,QAAQ,KAAK1L,EAAAA,EAAAA;AAAAA,IAAAA,CAAAA,GAInF2R,GAAOT,IAAI,EACTsJ,MAAM,MAAA;AACJ9vB,WAAKU,OAAOqvB,KAAK,kBAAyB,EAAEiW,OAAAA,IAAOlzB,QAAQ6zB,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE5D,MAAA,EAAQ3lB,KAAK,IAAA,GAEhBiG,GAAOT,IAAI,EACT0J,MAAM;AACJlwB,WAAKU,OAAOqvB,KAAK,kBAAyB,EAAEiW;SAE7C,MAAA,EAAQhlB,KAAK,IAAA;AAAA,EAClB;AAAA,EAKQ,mBAAA4jB;AACN,QAAA,CAAK5kC,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU;AACzC9mB,SAAK++B,qBAAqB9X,GAAOH,UAAU,MAAA,GAE3CG,GAAOT,IAAIxmB,KAAK0/B,YAAY,QAAQ5W,IAAc9H,KAAK,MAAA,GACvDiG,GAAOT,IAAIxmB,KAAK0/B,YAAY,aAAa3W,EAAAA,EAAe/H,KAAK,KAAA,GAC7DiG,GAAOT,IAAIxmB,KAAK0/B,YAAY,gBAAgB9W,EAAAA,EAAc5H,KAAK,OAE/DiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,cAAqB,EACpCrtB,MAAM1C,KAAK0/B,WAAWh9B,MACtB8zB,WAAWx2B,KAAK0/B,WAAWlJ,WAC3BpL,cAAcprB,KAAK0/B,WAAWtU;SAGjC,IAAA,EAAMpK,KAAK,OAAA;AAAA,EAChB;AAAA,EAKA,iBAAiBiV,IAAAA;;AACf,SAAKj2B,KAAK++B,mBAAoB;AAE9B,UAAM9X,KAASjnB,KAAK++B,mBAAmBjY,UAAUmP,GAAKjV,OAAOiV,GAAKtE,KAC5DsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBzP,IAAMhP,GAAOH,UAAU,UAEhDG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF;SAGnC,IAAA,EAAMjV,KAAK,OAEdiG,GAAOT,IAAI,EACT2b,IAAI;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3BnF,MAAAA,GAAK9vB,WAAL8vB,gBAAAA,IAAa/R,OAAO+R,MACpBj2B,UAAK++B,uBAAL/+B,mBAAyB6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAEvC,IAAA,EAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ,wBAAA6jB;AACN,QAAA,CAAK7kC,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU;AACzC9mB,SAAK8+B,sBAAsB7X,GAAOH,UAAU,SAE5CG,GAAOT,IAAIxmB,KAAKw/B,iBAAiB,gBAAgB7W,IAAc3H,KAAK,KAAA,GACpEiG,GAAOT,IAAIxmB,KAAKw/B,iBAAiB,gBAAgB5W,IAAc5H,KAAK,IAAA,GAEpEiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACF,YAAM7J,KAAWt4B,KAAK8mC,eAAe9mC,KAAKw/B,gBAAgBC,YAAAA,GACpD9J,KAAW31B,KAAK+mC,eAAe/mC,KAAKw/B,gBAAgBpU,eACpD6K,KAAO,IAAIrxB,EAAMm0B,KAAKT,IAAU3C;AACpCM,MAAAA,GAAa+Q,cAAAA,MACb/Q,GAAawJ,eAAez/B,KAAKw/B,gBAAgBC,cACjDxJ,GAAa7K,eAAeprB,KAAKw/B,gBAAgBpU,cAEnDprB,KAAKa,MAAM2lB,IAAIyP,EAAAA,GACfj2B,KAAKinC,kBAAkBhR,EAAAA;AAEvB,YAAMgF,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAC5CusB,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF,EAAAA,GAGlCj2B,KAAKU,OAAOqvB,KAAK,iBAAwB,EAAEkG,MAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE5C,MAAMjV,KAAK,IAAA;AAAA,EAChB;AAAA,EAKA,kBAAkBiV;;AAChB,QAAA,CAAKj2B,KAAK8+B,oBAAqB;AAE/B,UAAMoI,KAAWjR,GAAawJ,gBAAgB,OACxCxY,KAASjnB,KAAK8+B,oBAAoBhY,UAAUogB,KAAU,MAAMjR,GAAKjV,OAAOiV,GAAKtE,KAC7EsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBzP,IAAMhP,GAAOH,UAAU,MAAA,CAAA,GAChD9mB,KAAKmnC,iBAAiBlR,GAAKN,UAA4B1O,GAAOH,UAAU,MAAA,CAAA,GAExEG,GAAOT,IAAI,EACT2b,IAAI;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,IAAA,EAAMjV,KAAK,IAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,WAE3BnF,MAAAA,GAAK9vB,WAAL8vB,gBAAAA,IAAa/R,OAAO+R,MACpBj2B,UAAK8+B,wBAAL9+B,mBAA0B6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAExC,MAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ,iBAAiB2U,IAA0B1O,IAAAA;AACjD,QAAK0O,IAAL;AAGA,UAAKA,GAAiBhvB,OAAO;AAC3B,cAAMy8B,KAAc,EAAEz8B,OAAO,MAAOgvB,GAAiBhvB,MAAMu7B,aAAAA,EAAAA;AAC3Djb,QAAAA,GAAOR,SAAS2c,IAAa,OAAA,EAASpiB,KAAK,MAAMtJ,SAAUjQ,CAAAA,OAAAA;AACxDkuB,UAAAA,GAAiBhvB,MAAMqJ,IAAIvI,EAAAA;AAAAA,QAAAA,CAAAA;AAAAA,MAEhC;AAGA,UAAKkuB,GAAiByR,UAAU;AAC9B,cAAMC,KAAiB,EAAED,UAAU,MAAOzR,GAAiByR,SAASlF,aAAAA,EAAAA;AACpEjb,QAAAA,GAAOR,SAAS4gB,IAAgB,YAAYrmB,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AAChEkuB,UAAAA,GAAiByR,SAASp3B,IAAIvI;YAEjCwf,GAAOT,IAAImP,IAAiB,qBAAqB,GAAG,GAAG,GAAA,EAAK3U,KAAK,MAAA;AAAA,MACnE;AAGAiG,MAAAA,GAAOT,IAAImP,IAAU,eAAe3U,KAAK,IAAA,GACzCiG,GAAOT,IAAImP,IAAU,WAAW,GAAG,GAAG,IAAA,EAAM3U,KAAK,QAGjDiG,GAAOT,IAAImP,IAAU,QAAQ,EAAE,MAAM/wB,EAAM0iC,WAAW,MAAM1iC,EAAM2iC,UAAU,MAAM3iC,EAAMi0B,WAAAA,CAAAA,EAAc7X,KAAK,KAAA,GAAA,WAGtG2U,GAAiB6R,aACpBvgB,GAAOT,IAAImP,IAAiB,aAAa3U,KAAK,IAAA,GAAA,WAI3C2U,GAAiB8R,aACpBxgB,GAAOT,IAAImP,IAAiB,aAAa,GAAG,GAAG,MAAM3U,KAAK,KAAA,GAAA,WAEvD2U,GAAiB+R,aACpBzgB,GAAOT,IAAImP,IAAiB,aAAa,GAAG,GAAG,IAAA,EAAM3U,KAAK,mBAIvD2U,GAAiB4Q,mBACpBtf,GAAOT,IAAImP,IAAiB,mBAAmB,GAAG,GAAG,GAAA,EAAK3U,KAAK;IAzClD;AAAA,EA2CjB;AAAA,EAKQ,qBAAA8jB;AACN,SAAK9kC,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAKg/B,mBAAmB/X,GAAOH,UAAU,SAEzCG,GAAOT,IAAIxmB,KAAK2/B,cAAc,KAAA,EAAO3e,KAAK,QAAA,GAC1CiG,GAAOT,IAAIxmB,KAAK2/B,cAAc,gBAAgB/W,EAAAA,EAAc5H,KAAK,QAAA,GAEjEiG,GAAOT,IAAI,EACT2b,IAAI;AACF,YAAM7E,KAAMt9B,KAAK2/B,aAAarC,OAAO;AACrCt9B,WAAKU,OAAOqvB,KAAK,eAAsB,EACrCuN,KAAAA,IACAlS,cAAcprB,KAAK2/B,aAAavU,aAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMpK,KAAK,MAAA;AAAA,EAChB;AAAA,EAKA,eAAeglB,IAAAA;;AACb,QAAA,CAAKhmC,KAAKg/B,iBAAkB;AAE5B,UAAM/X,KAASjnB,KAAKg/B,iBAAiBlY,UAAUkf,GAAMhlB,OAAOglB,GAAMrU,KAC5DsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBM,IAAO/e,GAAOH,UAAU,MAAA,CAAA,GAEjDG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOuK,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMhlB,KAAK,IAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3B4K,MAAAA,GAAM7/B,WAAN6/B,gBAAAA,IAAc9hB,OAAO8hB,MACrBhmC,UAAKg/B,qBAALh/B,mBAAuB6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAErC,IAAA,EAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ,uBAAA+jB;AACN,QAAA,CAAK/kC,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAKi/B,qBAAqBhY,GAAOH,UAAU,MAAA;AAE3C,UAAM6gB,KAAa1gB,GAAOH,UAAU,OAAA;AACpC6gB,IAAAA,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,cAAA,EAAgB5e,KAAK,OACzD2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,OAAA,EAAS5e,KAAK,KAAA,GAClD2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,OAAA,EAAS5e,KAAK,QAClD2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,aAAA,EAAe5e,KAAK,MAAA,GACxD2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,UAAU5e,KAAK,MAAA,GACnD2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,kBAAkB,CAAC,OAAO,MAAM,MAAM,MAAM,IAAA,CAAA,EAAO5e,KAAK,KAAA,GAC5F2mB,GAAWnhB,IAAIxmB,KAAK4/B,gBAAgB,aAAa,CAAC,OAAO,QAAQ,QAAQ,UAAU,QAAA,CAAA,EAAW5e,KAAK,MAAA,GAEnGiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,mBAA0B,EAAA,GAAK/vB,KAAK4/B,eAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAEtD,IAAA,EAAM5e,KAAK,UAAA;AAAA,EAChB;AAAA,EAKA,iBAAiBiV,IAAAA;;AACf,SAAKj2B,KAAKi/B,mBAAoB;AAE9B,UAAMhY,KAASjnB,KAAKi/B,mBAAmBnY,UAAUmP,GAAKjV,OAAOiV,GAAKtE,EAAAA,GAC5DsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBzP,IAAMhP,GAAOH,UAAU,MAAA,CAAA,GAEhDG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,IAAA,EAAMjV,KAAK,IAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3BnF,MAAAA,GAAK9vB,WAAL8vB,gBAAAA,IAAa/R,OAAO+R,MACpBj2B,UAAKi/B,uBAALj/B,mBAAyB6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAEvC,MAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ;AACN,QAAA,CAAKhhB,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAKk/B,wBAAwBjY,GAAOH,UAAU,IAAA,GAE9CG,GAAOT,IAAIxmB,KAAK6/B,mBAAmB,OAAO7e,KAAK,SAAA,GAC/CiG,GAAOT,IAAIxmB,KAAK6/B,mBAAmB,gBAAgBjX,EAAAA,EAAc5H,KAAK,MAAA,GACtEiG,GAAOT,IAAIxmB,KAAK6/B,mBAAmB,WAAW,CAAA,EAAG7e,KAAK,QAAA,GAEtDiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,sBAA6B,KAAK/vB,KAAK6/B,kBAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAEzD,MAAM7e,KAAK,QAAA;AAAA,EAChB;AAAA,EAKA,oBAAoBglB,IAAAA;;AAClB,QAAA,CAAKhmC,KAAKk/B,sBAAuB;AAEjC,UAAMjY,KAASjnB,KAAKk/B,sBAAsBpY,UAAUkf,GAAMhlB,OAAOglB,GAAMrU,EAAAA,GACjEsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBM,IAAO/e,GAAOH,UAAU,MAAA,CAAA,GAEjDG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOuK,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMhlB,KAAK,IAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3B4K,MAAAA,GAAM7/B,WAAN6/B,gBAAAA,IAAc9hB,OAAO8hB,MACrBhmC,UAAKk/B,0BAALl/B,mBAA4B6mB,aAAaI;AAAAA,SAE1C,IAAA,EAAMjG,KAAK;EAChB;AAAA,EAKQ;AACN,QAAA,CAAKhhB,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAKm/B,qBAAqBlY,GAAOH,UAAU,IAAA,GAE3CG,GAAOT,IAAIxmB,KAAK+/B,gBAAgB,UAAA,EAAY/e,KAAK,SACjDiG,GAAOT,IAAIxmB,KAAK+/B,gBAAgB,gBAAgBnX,EAAAA,EAAc5H,KAAK,SACnEiG,GAAOT,IAAIxmB,KAAK+/B,gBAAgB,MAAA,EAAQ/e,KAAK,MAAA,GAE7CiG,GAAOT,IAAI,EACT2b,IAAI;AACGniC,WAAK+/B,eAAej6B,QACzB9F,KAAKU,OAAOqvB,KAAK,mBAA0B,KAAK/vB,KAAK+/B,eAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAEtD,MAAM/e,KAAK,QAAA;AAAA,EAChB;AAAA,EAKA,iBAAiBiV,IAAAA;;AACf,QAAA,CAAKj2B,KAAKm/B,mBAAoB;AAE9B,UAAMr5B,KAAQmwB,GAAanwB,QAAQmwB,GAAKjV,MAClCiG,KAASjnB,KAAKm/B,mBAAmBrY,UAAUhhB,KAAOmwB,GAAKtE,EAAAA,GACvDsJ,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBzP,IAAMhP,GAAOH,UAAU,UAChD9mB,KAAKmnC,iBAAiBlR,GAAKN,UAA4B1O,GAAOH,UAAU,MAAA,CAAA,GAExEG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF,EAAAA;AAAAA,IAAAA,EAAAA,GAGnC,MAAMjV,KAAK,IAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3BnF,MAAAA,GAAK9vB,WAAL8vB,gBAAAA,IAAa/R,OAAO+R,MACpBj2B,UAAKm/B,uBAALn/B,mBAAyB6mB,aAAaI;AAAAA,SAEvC,IAAA,EAAMjG,KAAK;EAChB;AAAA,EAKQ;AACN,QAAA,CAAKhhB,KAAK0+B,WAAY;AAEtB,UAAMzX,KAASjnB,KAAK0+B,WAAW5X,UAAU,MAAA;AACzC9mB,SAAKo/B,uBAAuBnY,GAAOH,UAAU,IAAA,GAE7CG,GAAOT,IAAIxmB,KAAKigC,kBAAkB,QAAQ,CAAC,MAAM,MAAM,MAAM,QAAQjf,KAAK,IAAA,GAE1EiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,qBAA4B,EAAE3pB,MAAMpG,KAAKigC,iBAAiB75B,KAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE5E,MAAM4a,KAAK,IAAA;AAAA,EAChB;AAAA,EAKA,mBAAmBiV;;AACjB,QAAA,CAAKj2B,KAAKo/B,qBAAsB;AAEhC,UAAMnY,KAASjnB,KAAKo/B,qBAAqBtY,UAAUmP,GAAKtE,MAAMsE,GAAKjV,QAAQ,GAAA,GACrEia,MAAkBj7B,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAEhD1O,SAAK0lC,oBAAoBzP,IAAMhP,GAAOH,UAAU,MAAA,CAAA,GAEhDG,GAAOT,IAAI,EACT2b,IAAI;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASuK,OAAOxF;SAGnC,IAAA,EAAMjV,KAAK,OAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;;AACElH,OAAAA,MAAAA,gBAAAA,GAAiB/J,aACnB+J,GAAgB/J,SAASkK,OAAAA,IAE3BnF,MAAAA,GAAK9vB,WAAL8vB,gBAAAA,IAAa/R,OAAO+R,MACpBj2B,UAAKo/B,yBAALp/B,mBAA2B6mB,aAAaI;AAAAA,IAAAA,EAAAA,GAEzC,IAAA,EAAMjG,KAAK,IAAA;AAAA,EAChB;AAAA,EAKQ,wBAAAwf;AACDxgC,SAAKu+B,SAEVv+B,KAAK2+B,kBAAkB3+B,KAAKu+B,KAAKzX,UAAU,MAAA,GAG3C9mB,KAAK4nC,2BAAAA,GAGL5nC,KAAK6nC,6BAGL7nC,KAAK8nC,0BAAAA;AAAAA,EACP;AAAA,EAKQ,6BAAAF;;AACN,SAAK5nC,KAAK2+B,gBAAiB;AAE3B,UAAM1X,KAASjnB,KAAK2+B,gBAAgB7X,UAAU,SACxC2e,MAAczlC,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAE5C,QAAA,EAAK+2B,MAAAA,gBAAAA,GAAavU,UAAU;AAE5B,UAAMA,KAAWuU,GAAYvU,UACvBpe,KAAS,EACbi1B,YAAY7W,GAAS6W,YACrBC,iBAAiB9W,GAAS8W,iBAC1BlmC,eAAeovB,GAASpvB,eACxBC,eAAemvB,GAASnvB;AAG1BklB,IAAAA,GAAOT,IAAI1T,IAAQ,YAAA,EAAckO,KAAK,QAAQtJ,SAAUjQ,CAAAA,OAAAA;AACtDypB,MAAAA,GAAS6W,aAAatgC;AAAAA,IAAAA,CAAAA,GAGxBwf,GAAOT,IAAI1T,IAAQ,mBAAmB,GAAG,IAAI,KAAKkO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACvEypB,MAAAA,GAAS8W,kBAAkBvgC;AAAAA,IAAAA,CAAAA,GAI7Bwf,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAE5P,QAAQ;SAEpD,IAAA,EAAMa,KAAK,QAEdiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAE5P,QAAQ,MAAA,CAAA;AAAA,IAAA,EAAA,GAEpD,IAAA,EAAMa,KAAK,KAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAE5P,QAAQ,OAAA,CAAA;AAAA,IAAA,EAAA,GAEpD,MAAMa,KAAK,KAAA;AAAA,EAChB;AAAA,EAKQ,4BAAA6mB;AACN,SAAK7nC,KAAK2+B,gBAAiB;AAE3B,UAAM1X,KAASjnB,KAAK2+B,gBAAgB7X,UAAU,MAAA,GAExChU,KAAS,EACb2d,UAAU,GACVC,MAAM,gBACNC,QAAQ,GACRC,MAAAA;AAGF3J,IAAAA,GAAOT,IAAI1T,IAAQ,YAAY,KAAK,IAAI,GAAA,EAAKkO,KAAK,SAClDiG,GAAOT,IAAI1T,IAAQ,QAAQ,CAAC,QAAQ,aAAa,cAAc,gBAAgB,aAAa,cAAc,gBAAgB,eAAe,eAAekO,KAAK,MAAA,GAC7JiG,GAAOT,IAAI1T,IAAQ,UAAA,IAAc,IAAI,CAAA,EAAGkO,KAAK,SAC7CiG,GAAOT,IAAI1T,IAAQ,MAAA,EAAQkO,KAAK,IAAA,GAEhCiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,oBAA2B,EAAE3pB,MAAM,SAAS0M,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE9D,MAAMkO,KAAK,MAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,oBAA2B,EAAE3pB,MAAM,OAAO0M,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE5D,IAAA,EAAMkO,KAAK,MAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,kBAAyB,EAAEjd,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE7C,IAAA,EAAMkO,KAAK,MAAA;AAAA,EAChB;AAAA,EAKQ,4BAAA8mB;AACN,SAAK9nC,KAAK2+B,gBAAiB;AAE3B,UAAM1X,KAASjnB,KAAK2+B,gBAAgB7X,UAAU,SAExChU,KAAS,EACb2X,OAAO,GACPwE,MAAAA;AAGFhI,IAAAA,GAAOT,IAAI1T,IAAQ,SAAS,KAAK,IAAI,GAAA,EAAKkO,KAAK,IAAA,GAC/CiG,GAAOT,IAAI1T,IAAQ,MAAA,EAAQkO,KAAK,IAAA,GAEhCiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAEP,QAAQ,SAAS1c,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE7D,IAAA,EAAMkO,KAAK,MAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAEP,QAAQ,SAAS1c,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE7D,MAAMkO,KAAK,MAAA,GAEdiG,GAAOT,IAAI,EACT2b,IAAI,MAAA;AACFniC,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAEP,QAAQ,QAAQ1c,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,EAAAA,GAE5D,MAAMkO,KAAK,MAAA;AAAA,EAChB;AAAA,EAKA,sBAAsBwkB;AAGpB,QAFAxlC,KAAKioC,mBAAAA,GAEAjoC,KAAKu+B,MAAV;AAQA,UANAv+B,KAAK4+B,cAAc5+B,KAAKu+B,KAAKzX,UAAU,OAAO0e,GAAMxkB,OAAO,IAAA,GAG3DhhB,KAAK0lC,oBAAoBF,IAAOxlC,KAAK4+B,YAAY9X,UAAU,UAGtD0e,GAAqBz/B,QAAQ;AAChC,cAAMkwB,KAAOuP;AACT19B,cAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrBM,GAAKN,SAAS5tB,QAAQ,CAAC2+B,IAAKpxB;AAC1BtV,eAAKmnC,iBAAiBT,IAAK1mC,KAAK4+B,YAAa9X,UAAU,SAASxR,EAAAA,CAAAA;AAAAA,QAAAA,CAAAA,IAGlEtV,KAAKmnC,iBAAiBlR,GAAKN,UAAU31B,KAAK4+B,YAAY9X,UAAU,MAAA,CAAA;AAAA,MAEpE;AAGA9mB,WAAKkoC,eAAe1C,IAAOxlC,KAAK4+B,YAAY9X,UAAU,OAAA,CAAA,GAGtD9mB,KAAKmoC,eAAe3C,IAAOxlC,KAAK4+B,YAAY9X,UAAU,MAAA,CAAA,GAEtD9mB,KAAK4+B,YAAYzX;IAzBD;AAAA,EA0BlB;AAAA,EAKA,2BAA2Bqe,IAAAA;AACzB,SAAMA,GAAc4C,cAElB,QAAA,KADApoC,KAAKqoC,sBAAsB7C,EAAAA;AAM7B,QAFAxlC,KAAKioC,mBAAAA,GAAAA,CAEAjoC,KAAKu+B,KAAM;AAEhBv+B,SAAK4+B,cAAc5+B,KAAKu+B,KAAKzX,UAAU,OAAO0e,GAAMxkB,OAAO,IAAA,GAG3DhhB,KAAK0lC,oBAAoBF,IAAOxlC,KAAK4+B,YAAY9X,UAAU;AAG3D,UAAMwhB,KAAiB9C,GAAc4C;AACrC,QAAIE,MAAiBA,GAAc1gC,SAAS,GAAG;AAC7C,YAAM2gC,KAAYvoC,KAAK4+B,YAAY9X,UAAU,QAAA;AAC7CwhB,MAAAA,GAAcvgC,QAAQ,CAAC2+B,IAAKpxB,OAAAA;AAC1BtV,aAAKmnC,iBAAiBT,IAAK6B,GAAUzhB,UAAU,OAAOxR;;IAE1D;AAGAtV,SAAKkoC,eAAe1C,IAAOxlC,KAAK4+B,YAAY9X,UAAU,WAEtD9mB,KAAK4+B,YAAYzX;EACnB;AAAA,EAKA;AACMnnB,SAAK4+B,eAAe5+B,KAAKu+B,SAC3Bv+B,KAAKu+B,KAAK1X,aAAa7mB,KAAK4+B,cAC5B5+B,KAAK4+B,cAAc;AAAA,EAEvB;AAAA,EAKQ,eAAe4G,IAAuBve;AAC5C,UAAMnU,KAAS,EACb01B,YAAY,KACZrkC,WAAW,EAAA;AAGb8iB,IAAAA,GAAOT,IAAI1T,IAAQ,cAAc,CAAC,KAAK,MAAM,MAAM,MAAM,IAAA,CAAA,EAAOkO,KAAK,SAAStJ,SAAUjQ,CAAAA,OAAAA;AACtFzH,WAAKU,OAAOqvB,KAAK,gBAAuB,EAAEyV,OAAAA,IAAOp/B,MAAMqB,IAAGtD,WAAW2O,GAAO3O,UAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAG9E8iB,GAAOT,IAAI1T,IAAQ,aAAa,GAAG,GAAG,GAAA,EAAKkO,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA,OAAAA;AAC9DzH,WAAKU,OAAOqvB,KAAK,iBAAwB,EAAEyV,OAAAA,IAAOrhC,WAAWsD,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAEjE;AAAA,EAKQ,eAAe+9B,IAAuBve;AAC5C,UAAMnU,KAAS,EACb21B,WAAAA,OACAC,WAAAA,MAAW;AAGbzhB,IAAAA,GAAOT,IAAI1T,IAAQ,aAAakO,KAAK,MAAA,EAAQtJ,SAAUjQ,CAAAA,OAAAA;AACrDzH,WAAKU,OAAOqvB,KAAK,oBAA2B,EAAEyV,OAAAA,IAAOliC,SAASmE;QAGhEwf,GAAOT,IAAI1T,IAAQ,WAAA,EAAakO,KAAK,IAAA,EAAMtJ,SAAUjQ,CAAAA;AACnDzH,WAAKU,OAAOqvB,KAAK,oBAA2B,EAAEyV,WAAOliC,SAASmE,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAElE;AAAA,EAKQ,eAAerB,IAAAA;AACrB,YAAQA;MACN,KAAK;AAAA,MAsBL;AACE,eAAO,IAAIxB,EAAM+jC,YAAY,GAAG,GAAG,CAAA;AAAA,MArBrC,KAAK;AACH,eAAO,IAAI/jC,EAAMgkC,eAAe,KAAK,IAAI,EAAA;AAAA,MAC3C,KAAK;AACH,eAAO,IAAIhkC,EAAMikC,iBAAiB,KAAK,KAAK,GAAG,EAAA;AAAA,MACjD,KAAK;AACH,eAAO,IAAIjkC,EAAMkkC,aAAa,KAAK,GAAG,EAAA;AAAA,MACxC,KAAK;AACH,eAAO,IAAIlkC,EAAMmkC,cAAc,KAAK,KAAK,IAAI;MAC/C,KAAK;AACH,eAAO,IAAInkC,EAAMokC,cAAc,GAAG;MACpC,KAAK;AACH,eAAO,IAAIpkC,EAAMqkC,kBAAkB,KAAK,MAAM,KAAK,EAAA;AAAA,MACrD,KAAK;AACH,eAAO,IAAIrkC,EAAMskC,qBAAqB,GAAA;AAAA,MACxC,KAAK;AACH,eAAO,IAAItkC,EAAMukC,oBAAoB,GAAA;AAAA,MACvC,KAAK;AACH,eAAO,IAAIvkC,EAAMwkC,mBAAmB;MACtC,KAAK;AACH,eAAO,IAAIxkC,EAAMykC,oBAAoB,GAAA;AAAA,IAAA;AAAA,EAI3C;AAAA,EAKQ,eAAejjC;AACrB,YAAQA,IAAAA;AAAAA,MACN,KAAK;AACH,eAAO,IAAIxB,EAAM0kC,kBAAkB,EAAE3iC,OAAO,SAAA,CAAA;AAAA,MAC9C,KAAK;AACH,eAAO,IAAI/B,EAAM+zB,qBAAqB,EAAEhyB,OAAO,UAAU8gC,WAAW,KAAKC,WAAW,IAAA,CAAA;AAAA,MACtF,KAAK;AACH,eAAO,IAAI9iC,EAAM2kC,oBAAoB,EAAE5iC,OAAO,SAAA,CAAA;AAAA,MAChD,KAAK;AACH,eAAO,IAAI/B,EAAM4kC,kBAAkB,EAAE7iC,OAAO,SAAA,CAAA;AAAA,MAC9C,KAAK;AACH,eAAO,IAAI/B,EAAM6kC,qBAAqB,EAAE9iC,OAAO,UAAU8gC,WAAW,KAAKC,WAAW,IAAA,CAAA;AAAA,MACtF,KAAK;AACH,eAAO,IAAI9iC,EAAM8kC,iBAAiB,EAAE/iC,OAAO,SAAA,CAAA;AAAA,MAC7C;AACE,eAAO,IAAI/B,EAAM+zB,qBAAqB,EAAEhyB,OAAO,SAAA,CAAA;AAAA,IAAA;AAAA,EAErD;AAAA,EAKQ,eAAegjC,IAAgB/nC;AACrC,UAAMgoC,KAAQr5B,SAASC,cAAc,OAAA;AACrCo5B,IAAAA,GAAMxjC,OAAO,QACbwjC,GAAMD,SAASA,IACfC,GAAMC,WAAY14B,CAAAA;;AAChB,YAAMk0B,MAAQl0B,KAAAA,GAAExM,OAA4BmlC,UAA9B34B,mBAAsC;AAChDk0B,MAAAA,MACFzjC,GAASyjC;OAGbuE,GAAMG,MAAAA;AAAAA,EACR;AAAA,EAKA,UAAU/oB;;AACR,aAAOhhB,UAAKu+B,SAALv+B,mBAAW8mB,UAAU9F,QAAS;AAAA,EACvC;AAAA,EAKA,YAAY4C,IAAAA;AACN5jB,SAAKu+B,QAAQv+B,KAAKu+B,KAAKjuB,cACzBsT,GAAU/M,YAAY7W,KAAKu+B,KAAKjuB,UAAAA;AAAAA,EAEpC;AAAA,EAKA,gBAAAM;AAAAA,EAEA;AAAA,EAKA,OAAAyW;AACMrnB,SAAKu+B,QACPv+B,KAAKu+B,KAAKlX,KAAAA;AAAAA,EAEd;AAAA,EAKA,OAAA5I;AACMze,SAAKu+B,QACPv+B,KAAKu+B,KAAK9f;EAEd;AAAA,EAKA;AACMze,SAAKu+B,SACPv+B,KAAKu+B,KAAK5X,QAAAA,GACV3mB,KAAKu+B,OAAO,OAEdv+B,KAAKw+B,cAAc,MACnBx+B,KAAKy+B,gBAAgB,MACrBz+B,KAAK0+B,aAAa,MAClB1+B,KAAK2+B,kBAAkB,MACvB3+B,KAAK4+B,cAAc,MACnB5+B,KAAK6+B,kBAAkB,MACvB7+B,KAAK8+B,sBAAsB,MAC3B9+B,KAAK++B,qBAAqB,MAC1B/+B,KAAKg/B,mBAAmB,MACxBh/B,KAAKi/B,qBAAqB,MAC1Bj/B,KAAKk/B,wBAAwB,MAC7Bl/B,KAAKm/B,qBAAqB,MAC1Bn/B,KAAKo/B,uBAAuB,MAC5Bp/B,KAAKq/B,kBAAkB;AAAA,EACzB;AAAA,EAKA,YAAAf;AACE,WAAO,EAAA,GAAKt+B,KAAKD,OAAAA;AAAAA,EACnB;AAAA,EAKA,QAAQ2C,IAAAA;AACN1C,SAAKs/B,cAAc58B,OAAOA;AAAAA,EAC5B;AAAA,EAKA,UAAAsnC;AACE,WAAOhqC,KAAKs/B,cAAc58B;AAAAA,EAC5B;0BOhuDK,cAA2B5C,EAAAA;AAAAA,EAYhC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAKvC,IAAAA,GAA0BprB,OAZvCC,KAASghB,OAAO,UAGhBhhB,KAAQiqC,YAA4B;EAUpC;AAAA,EAEU;AACRjqC,SAAKu6B,SAAAA;AAAAA,EACP;AAAA,EAKA,MAAA,KAAW+C,IAAarmB,IAAAA;;AAMtB,UAAMizB,KAAAA,MAAiBC,MAAM7M,KACvB8M,KAAAA,MAA0BF,GAASG,QAEnCrE,KAAQhmC,KAAKsqC,eAAeF,IAAM,EACtChf,eAAcnU,MAAAA,gBAAAA,GAASmU,iBAAgBprB,KAAKD,OAAOqrB,cACnDmf,QAAOtzB,MAAAA,gBAAAA,GAASszB,UAAS,GACzB5jC,QAAOsQ,MAAAA,gBAAAA,GAAStQ,UAAS,SACzBnC,UAASyS,MAAAA,gBAAAA,GAASzS,YAAW,IAAA,CAAA;AAwB/B,WApBEwhC,GAA2BwE,aAAAA,MAG7BxqC,KAAKyqC,YAAYzE,EAAAA,GAGjBhmC,KAAKa,MAAM2lB,IAAIwf,KAGfhmC,KAAKiqC,UAAUnpC,KAAK,EAClBklC,WACA1I,KAAAA,IACAlS,eAAcnU,MAAAA,gBAAAA,GAASmU,iBAAgBprB,KAAKD,OAAOqrB,cACnDsf,UAAUN,GAAKM,SAAAA,CAAAA,IAIjB1qC,UAAK2qC,kBAAL3qC,8BAAqBgmC,KACrBhmC,KAAKU,OAAOqvB,KAAK,wBAAwB,EAAEiW,OAAAA,GAAAA,CAAAA,GAEpCA;AAAAA,EACT;AAAA,EAKQ,eAAeoE,IAAmBnzB;AAMxC,UAAM+uB,KAAQ,IAAIphC,EAAMgmC;AACxB5E,IAAAA,GAAMhlB,OAAO;AAEb,eAAW6pB,MAAWT,GAAKM,UAAU;AACnC,YAAMI,KAAS9qC,KAAK+qC,oBAAoBF,IAAS5zB;AACjD,iBAAWgf,MAAQ6U,GACjB9E,CAAAA,GAAMxf,IAAIyP,EAAAA;AAAAA,IAEd;AAEA,WAAO+P;AAAAA,EACT;AAAA,EAKQ,oBAAoB6E,IAAyB5zB,IAAAA;AAKnD,UAAM6zB,KAAuB,CAAA,GAAA,EACvBxS,UAAEA,IAAAvB,YAAUA,OAAe8T;AAEjC,QAAIG,KAA2B,CAAA;AAET,kBAAlB1S,GAASlyB,OACX4kC,KAAW,CAAC1S,GAAS2S,WAAAA,IACM,mBAAlB3S,GAASlyB,SAClB4kC,KAAW1S,GAAS2S;AAGtB,eAAWC,MAAWF,IAAU;AAC9B,YAAM/U,KAAOj2B,KAAKmrC,kBAAkBD,IAASj0B,EAAAA;AAC7Cgf,MAAAA,GAAKjV,OAAO+V,GAAW/V,QAAQ;AAG/B,YAAM8V,KAAmB,EACvBC,YAAY,EAAA,GAAKA,GAAAA,EAAAA;AAIfA,MAAAA,GAAWzM,WACbwM,GAAQC,WAAYM,eAAer3B,KAAKorC,eAAerU,GAAWzM,UAEhEyM,GAAWG,aACbJ,GAAQC,WAAYC,iBAAiBh3B,KAAKorC,eAAerU,GAAWG,YAGpEjB,GAA0Ba,UAAUA,IAEtCgU,GAAOhqC,KAAKm1B;IACd;AAEA,WAAO6U;AAAAA,EACT;AAAA,EAKQ,kBAAkBI,IAAuBj0B;AAM/C,UAAMo0B,KAAYH,GAAQ,CAAA,GACpBlS,KAAQ,IAAIp0B,EAAMq0B,SAElBqS,KAAatrC,KAAKurC,eAAeF,GAAU,CAAA,CAAA;AACjDrS,IAAAA,GAAME,OAAOoS,GAAWn4B,GAAGm4B,GAAWj4B;AAEtC,aAAS3N,KAAI,GAAGA,KAAI2lC,GAAUzjC,QAAQlC,MAAK;AACzC,YAAM8oB,KAAQxuB,KAAKurC,eAAeF,GAAU3lC;AAC5CszB,MAAAA,GAAMG,OAAO3K,GAAMrb,GAAGqb,GAAMnb,CAAAA;AAAAA,IAC9B;AAEA2lB,IAAAA,GAAMI,UAAAA;AAGN,aAAS1zB,KAAI,GAAGA,KAAIwlC,GAAQtjC,QAAQlC,MAAK;AACvC,YAAM8lC,KAAO,IAAI5mC,EAAM6mC,QACjBC,KAAWR,GAAQxlC,EAAAA,GACnBimC,KAAY3rC,KAAKurC,eAAeG,GAAS,CAAA,CAAA;AAC/CF,MAAAA,GAAKtS,OAAOyS,GAAUx4B,GAAGw4B,GAAUt4B,CAAAA;AAEnC,eAASu4B,KAAI,GAAGA,KAAIF,GAAS9jC,QAAQgkC,MAAK;AACxC,cAAMpd,KAAQxuB,KAAKurC,eAAeG,GAASE,EAAAA,CAAAA;AAC3CJ,QAAAA,GAAKrS,OAAO3K,GAAMrb,GAAGqb,GAAMnb,CAAAA;AAAAA,MAC7B;AAEA2lB,MAAAA,GAAM6S,MAAM/qC,KAAK0qC,EAAAA;AAAAA,IACnB;AAGA,UAAMlT,KAAW,IAAI1zB,EAAMknC,gBAAgB9S,IAAO,EAChDuR,OAAOtzB,GAAQszB,OACfwB,oBAAc,CAAA;AAIhBzT,IAAAA,GAASgB,SAASl3B,KAAKC,KAAK;AAE5B,UAAMszB,KAAW,IAAI/wB,EAAM+zB,qBAAqB,EAC9ChyB,OAAOsQ,GAAQtQ,OACfmyB,aAAAA,MACAt0B,SAASyS,GAAQzS,SACjBo0B,MAAMh0B,EAAMi0B;AAGd,WAAO,IAAIj0B,EAAMm0B,KAAKT,IAAU3C;EAClC;AAAA,EAKA,eAAeqW,IAAAA;AACb,WAAOC,IAAKC,EAAAA,IAAOF,KACZ74B,IAAGE,EAAAA,IAAK84B,EAAM,aAAa,aAAa,CAACF,IAAKC;AACrD,WAAO,IAAItnC,EAAMC,QAAQsO,KAAInT,KAAKD,OAAOsrB,iBAAiBhY,KAAIrT,KAAKD,OAAOsrB;EAC5E;AAAA,EAKA,eAAe2gB,IAAAA;AACb,UAAA,CAAOC,IAAKC,EAAAA,IAAOF,IAAAA,CACZ74B,IAAGE,EAAAA,IAAK84B,EAAM,aAAa,aAAa,CAACF,IAAKC,EAAAA,CAAAA;AACrD,WAAO,IAAItnC,EAAMklB,QAAQ3W,KAAInT,KAAKD,OAAOsrB,iBAAiB,GAAGhY,KAAIrT,KAAKD,OAAOsrB,eAAAA;AAAAA,EAC/E;AAAA,EAKQ,YAAY2a;AAClB,UAAMzhB,KAAM,IAAI3f,EAAMwlB,OAAOC,cAAc2b,EAAAA,GACrC1b,KAAS,IAAI1lB,EAAMklB;AACzBvF,IAAAA,GAAIgG,UAAUD,EAAAA,GAGZ0b,GAA2BoG,wBAAwB9hB,GAAOqM,SAG1DqP,GAA2B/O,uBAAwBoV,CAAAA,OAAAA;AACnD,YAAMC,KAAcD,GAAK1V,MAAAA;AAKzB,aAJA2V,GAAYlV,IAAI9M,KAChBgiB,GAAYC,SAASvG,GAAM5hC,KAAAA,GAC3BkoC,GAAYE,WAAWxG,GAAMtU,WAC7B4a,GAAY9lB,IAAIwf,GAAM3zB,QAAAA,GACfi6B;AAAAA,IAAAA,GAITtG,GAAMS,SAASlE,CAAAA;AACRA,MAAAA,GAAqBx8B,WACxBw8B,GAAMlwB,SAAS+kB,IAAI9M,KACjBiY,GAA2BpL,gBAAgBoL,GAAMlwB,SAASskB,MAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGlE;AAAA,EAKA,eAAA8V;AACE,WAAOzsC,KAAKiqC;AAAAA,EACd;AAAA,EAKA,eAAejE,IAAAA;AACb,UAAM1wB,KAAQtV,KAAKiqC,UAAUja,UAAU7oB,CAAAA,OAAKA,GAAE6+B,UAAUA,EAAAA;AACpD1wB,IAAAA,KAAAA,OACFtV,KAAKa,MAAMqjB,OAAO8hB,EAAAA,GAClBhmC,KAAKiqC,UAAU10B,OAAOD,IAAO,CAAA;AAAA,EAEjC;AAAA,EAKA,WAAAilB;AACE,eAAWxM,MAAQ/tB,KAAKiqC,UACtBjqC,MAAKa,MAAMqjB,OAAO6J,GAAKiY;AAEzBhmC,SAAKiqC,YAAY;EACnB;AAAA,EAKA,iBAAiBjpB,IAAAA;AACf,eAAW+M,MAAQ/tB,KAAKiqC,WAAW;AACjC,YAAMyC,KAAQ3e,GAAKiY,MAAMvL,SAASrK,KAChCmS,CAAAA,OAASA,GAAMvhB,SAASA,EAAAA;AAG1B,UAAI0rB,GAAO,QAAOA;AAAAA,IACpB;AACA,WAAO;AAAA,EACT;AAAA,EAKA,gBAAgBzW,IAAkBtvB,KAAgB;AAC5CsvB,IAAAA,GAAKN,oBAAoB/wB,EAAM+zB,yBACjC1C,GAAKN,SAASyR,SAAShK,OAAOz2B,KAC9BsvB,GAAKN,SAASgX,oBAAoB;AAAA,EAEtC;AAAA,EAKA,kBAAkB1W,IAAAA;AACZA,IAAAA,GAAKN,oBAAoB/wB,EAAM+zB,yBACjC1C,GAAKN,SAASgX,oBAAoB;AAAA,EAEtC;4BCvQK,cAA6B7sC,EAAAA;AAAAA,EAYlC,YAAYC,IAAAA;AACV2tB,UAAM,KAAKpC,IAAAA,GAA4BvrB,GAAAA,CAAAA,GAZzCC,KAASghB,OAAO,YAGhBhhB,KAAS4sC,gBAAgC,CACvC,OAAO,MAAM,OAAO,OAAO,MAC3B,MAAM,OAAO,QAAQ,QAAQ,OAAO,OAAO,QAI7C5sC,KAAQ6sC,cAA4B;EAIpC;AAAA,EAEU;AACR7sC,SAAKu6B,SAAAA;AAAAA,EACP;AAAA,EAKA,eAAen0B,IAAoB0M,IAAAA;AACjC,UAAMoW,KAAOlpB,KAAKD,OAAOwrB,aACnB3e,KAAIkG,MAAU,CAAA;AAEpB,YAAQ1M,IAAAA;AAAAA,MACN,KAAK;AACH,eAAO,IAAIxB,EAAM+jC,YACf/7B,GAAExL,SAAS8nB,IACXtc,GAAEvL,UAAU6nB,IACZtc,GAAE29B,SAASrhB,IACXtc,GAAEkgC,iBAAiB,GACnBlgC,GAAEmgC,kBAAkB,GACpBngC,GAAEogC,iBAAiB;MAGvB,KAAK;AACH,eAAO,IAAIpoC,EAAMgkC,eACfh8B,GAAE5I,UAAUklB,KAAO,GACnBtc,GAAEkgC,iBAAiB,IACnBlgC,GAAEmgC,kBAAkB,IACpBngC,GAAEqgC,YAAY,GACdrgC,GAAEsgC,aAAuB,IAAV9qC,KAAKC,IACpBuK,GAAEugC,cAAc,GAChBvgC,GAAEwgC,eAAehrC,KAAKC,EAAAA;AAAAA,MAG1B,KAAK;AACH,eAAO,IAAIuC,EAAMikC,iBACfj8B,GAAEygC,aAAankB,KAAO,GACtBtc,GAAE0gC,gBAAgBpkB,KAAO,GACzBtc,GAAEvL,UAAU6nB,IACZtc,GAAE2gC,kBAAkB,IACpB3gC,GAAEmgC,kBAAkB,GACpBngC,GAAE4gC,kBAAa;AAAA,MAGnB,KAAK;AACH,eAAO,IAAI5oC,EAAMkkC,aACfl8B,GAAE5I,UAAUklB,KAAO,GACnBtc,GAAEvL,UAAU6nB,IACZtc,GAAE2gC,kBAAkB,IACpB3gC,GAAEmgC,kBAAkB,GACpBngC,GAAE4gC,kBAAa;AAAA,MAGnB,KAAK;AACH,eAAO,IAAI5oC,EAAMokC,cACfp8B,GAAExL,SAAS8nB,IACXtc,GAAEvL,UAAU6nB,IACZtc,GAAEkgC,iBAAiB,GACnBlgC,GAAEmgC,kBAAkB,CAAA;AAAA,MAGxB,KAAK;AACH,eAAO,IAAInoC,EAAMmkC,cACfn8B,GAAE5I,UAAUklB,KAAO,GACnBtc,GAAE6gC,QAAQvkB,KAAO,GACjBtc,GAAE2gC,kBAAkB,IACpB3gC,GAAE8gC,mBAAmB,KACrB9gC,GAAE+gC,OAAiB,IAAVvrC,KAAKC,EAAAA;AAAAA,MAGlB,KAAK;AACH,eAAO,IAAIuC,EAAMqkC,kBACfr8B,GAAE5I,UAAUklB,KAAO,GACnBtc,GAAE6gC,QAAQvkB,KAAO,GACjBtc,GAAE8gC,mBAAmB,IACrB9gC,GAAE2gC,kBAAkB,GACpB3gC,GAAEA,KAAK,GACPA,GAAEC,KAAK,CAAA;AAAA,MAGX,KAAK;AACH,eAAO,IAAIjI,EAAMskC,qBAAqBt8B,GAAE5I,UAAUklB,KAAO,CAAA;AAAA,MAE3D,KAAK;AACH,eAAO,IAAItkB,EAAMukC,oBAAoBv8B,GAAE5I,UAAUklB,KAAO;MAE1D,KAAK;AACH,eAAO,IAAItkB,EAAMwkC,mBAAmBx8B,GAAE5I,UAAUklB,KAAO,CAAA;AAAA,MAEzD,KAAK;AACH,eAAO,IAAItkB,EAAMykC,oBAAoBz8B,GAAE5I,UAAUklB,KAAO,CAAA;AAAA,MAE1D,KAAK;AACH,eAAO,IAAItkB,EAAMgpC,gBACfhhC,GAAE5I,UAAUklB,KAAO,GACnBtc,GAAEvL,UAAU6nB,KAAO,GACnBtc,GAAEihC,eAAe,GACjBjhC,GAAE2gC,kBAAkB;MAGxB;AACE,eAAO,IAAI3oC,EAAM+jC,YAAYzf,IAAMA,IAAMA;;EAE/C;AAAA,EAKA,WACEuW,IACA9J,IACA7iB;AAEA,UAAMwlB,KAAWt4B,KAAK8mC,eAAerH,IAAc3sB;AAGjDwlB,IAAAA,GAAiBmH,eAAeA;AAElC,UAAMxJ,KAAO,IAAIrxB,EAAMm0B,KACrBT,IACA3C,MAAY,IAAI/wB,EAAM+zB,qBAAqB,EAAEhyB,OAAO,QAAA,CAAA,CAAA;AAQtD,WALAsvB,GAAKjV,OAAOye,IAGVxJ,GAA0B+Q,oBAErB/Q;AAAAA,EACT;AAAA,EAKA,WACEwJ,IACA9J,IACA7iB;AAEA,UAAMmjB,KAAOj2B,KAAK8tC,WAAWrO,IAAc9J,IAAU7iB,EAAAA;AAGrD,WAFA9S,KAAKa,MAAM2lB,IAAIyP,KACfj2B,KAAK6sC,YAAY/rC,KAAKm1B,EAAAA,GACfA;AAAAA,EACT;AAAA,EAKA,UAAU/M,KAAe,GAAGviB,KAAgB,UAAA;AAC1C,UAAM2xB,KAAW,IAAI1zB,EAAM+jC,YAAYzf,IAAMA,IAAMA,EAAAA,GAC7CyM,KAAW,IAAI/wB,EAAM0kC,kBAAkB,EAAE3iC,OAAAA,GAAAA,CAAAA;AAE/C,WADa,IAAI/B,EAAMm0B,KAAKT,IAAU3C,EAAAA;AAAAA,EAExC;AAAA,EAKA,iBAAAoY;AACE,WAAO/tC,KAAK6sC;AAAAA,EACd;AAAA,EAKA,WAAW5W;AACT,UAAM3gB,KAAQtV,KAAK6sC,YAAY53B,QAAQghB;AACnC3gB,IAAAA,KAAAA,OACFtV,KAAKa,MAAMqjB,OAAO+R,EAAAA,GAClBA,GAAKqC,SAASzC,QAAAA,GACV/tB,MAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrBM,GAAKN,SAAS5tB,QAAQkoB,CAAAA,OAAKA,GAAE4F,aAE7BI,GAAKN,SAASE,WAEhB71B,KAAK6sC,YAAYt3B,OAAOD,IAAO,CAAA;AAAA,EAEnC;AAAA,EAKA;AACE,eAAW2gB,MAAQj2B,KAAK6sC,YACtB7sC,MAAKa,MAAMqjB,OAAO+R,KAClBA,GAAKqC,SAASzC,WACV/tB,MAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrBM,GAAKN,SAAS5tB,QAAQkoB,CAAAA,OAAKA,GAAE4F,QAAAA,CAAAA,IAE7BI,GAAKN,SAASE,QAAAA;AAGlB71B,SAAK6sC,cAAc,CAAA;AAAA,EACrB;AAAA,EAKA,eAAe5W,IAAkB7vB,IAAoB0M;AACnD,UAAMk7B,KAAc/X,GAAKqC;AACzBrC,IAAAA,GAAKqC,WAAWt4B,KAAK8mC,eAAe1gC,IAAM0M,EAAAA,GACxCmjB,GAAKqC,SAAiBmH,eAAer5B,IACvC4nC,GAAYnY,QAAAA;AAAAA,EACd;yBP7NK,cAA0B/1B,EAAAA;AAAAA,EAqB/B,YAAYC,IAAAA;AACV2tB,UAAM,KAAK1E,IAAAA,GAAyBjpB,GAAAA,CAAAA,GArBtCC,KAASghB,OAAO,SAGhBhhB,KAAQiuC,aAAsC,MAG9CjuC,KAAQkuC,aAAsC,MAG9CluC,KAAQupB,QAAsB,MAG9BvpB,KAAQwpB,aAAgC,MAGxCxpB,KAAQypB,aAAsC,MAG9CzpB,KAAQmuC,cAAiC;AAAA,EAIzC;AAAA,EAEU,YAAA9tC;AAEJL,SAAKD,OAAOkpB,KAAK3lB,WACnBtD,KAAKouC,iBAAAA,GAEHpuC,KAAKD,OAAOupB,KAAKhmB,WACnBtD,KAAKquC,iBAAAA,GAEHruC,KAAKD,OAAOwpB,MAAMjmB,WACpBtD,KAAKsuC,YAAAA,GAEHtuC,KAAKD,OAAOypB,WAAWlmB,WACzBtD,KAAKuuC,iBAAAA,GAIPvuC,KAAKwuC,UAAU,mBAAoBpE,CAAAA,OAAAA;AAC7BA,MAAAA,GAAKxkC,UACP5F,KAAKyuC,iBAAiBrE,GAAKxkC,MAAAA;AAAAA,IAAAA,CAAAA,GAG/B5F,KAAKwuC,UAAU,qBAAqB,MAAMxuC,KAAK0uC,mBAAAA,CAAAA;AAAAA,EACjD;AAAA,EAEU,cAAAnuC;AACRP,SAAK2uC,iBAAAA,GACL3uC,KAAK4uC,iBAAAA,GACL5uC,KAAK6uC,eACL7uC,KAAK8uC,iBAAAA,GACL9uC,KAAK+uC,iBAAAA;AAAAA,EACP;AAAA,EAKA,mBAAAX;AACEpuC,SAAK2uC;AAEL,UAAA,EAAMzlB,MAAEA,IAAAC,WAAMA,IAAAC,iBAAWA,eAAiBC,OAAcrpB,KAAKD,OAAOkpB;AAKpE,WAJAjpB,KAAKiuC,aAAa,IAAIrpC,EAAMoqC,WAAW9lB,IAAMC,IAAWC,IAAiBC,EAAAA,GACzErpB,KAAKiuC,WAAWjtB,OAAO,kBACvBhhB,KAAKa,MAAM2lB,IAAIxmB,KAAKiuC,aAEbjuC,KAAKiuC;AAAAA,EACd;AAAA,EAKA;AACMjuC,SAAKiuC,eACPjuC,KAAKa,MAAMqjB,OAAOlkB,KAAKiuC,UAAAA,GACvBjuC,KAAKiuC,WAAWpY,QAAAA,GAChB71B,KAAKiuC,aAAa;AAAA,EAEtB;AAAA,EAKA,eAAejoC,IAAAA;AACTA,IAAAA,OAAYhG,KAAKiuC,aACnBjuC,KAAKouC,iBAAAA,IAAAA,CACKpoC,MAAWhG,KAAKiuC,cAC1BjuC,KAAK2uC,iBAAAA,GAEP3uC,KAAKD,OAAOkpB,KAAK3lB,UAAU0C;AAAAA,EAC7B;AAAA,EAKA,WAAWjG,IAAAA;AACT0I,WAAOw0B,OAAOj9B,KAAKD,OAAOkpB,MAAMlpB,EAAAA,GAC5BC,KAAKD,OAAOkpB,KAAK3lB,WACnBtD,KAAKouC;EAET;AAAA,EAKA;AAOE,WANApuC,KAAK4uC,oBAEL5uC,KAAKkuC,aAAa,IAAItpC,EAAMqqC,WAAWjvC,KAAKD,OAAOupB,KAAKJ,OACxDlpB,KAAKkuC,WAAWltB,OAAO,kBACvBhhB,KAAKa,MAAM2lB,IAAIxmB,KAAKkuC,UAAAA,GAEbluC,KAAKkuC;AAAAA,EACd;AAAA,EAKA,mBAAAU;AACM5uC,SAAKkuC,eACPluC,KAAKa,MAAMqjB,OAAOlkB,KAAKkuC,UAAAA,GACvBluC,KAAKkuC,WAAWrY,QAAAA,GAChB71B,KAAKkuC,aAAa;AAAA,EAEtB;AAAA,EAKA,eAAeloC,IAAAA;AACTA,IAAAA,MAAAA,CAAYhG,KAAKkuC,aACnBluC,KAAKquC,sBACKroC,MAAWhG,KAAKkuC,cAC1BluC,KAAK4uC,iBAAAA,GAEP5uC,KAAKD,OAAOupB,KAAKhmB,UAAU0C;AAAAA,EAC7B;AAAA,EAKA,WAAWjG;AACT0I,WAAOw0B,OAAOj9B,KAAKD,OAAOupB,MAAMvpB,KAC5BC,KAAKD,OAAOupB,KAAKhmB,WACnBtD,KAAKquC;EAET;AAAA,EAKA;;AAWE,WAVAruC,KAAK6uC,eAEL7uC,KAAKupB,QAAQ,IAAI2lB,KACjBlvC,KAAKupB,MAAM4lB,UAAUnvC,KAAKD,OAAOwpB,MAAM7mB,OACvC1C,KAAKupB,MAAMhY,IAAII,MAAMU,WAAW,YAChCrS,KAAKupB,MAAMhY,IAAII,MAAMa,MAAM,KAC3BxS,KAAKupB,MAAMhY,IAAII,MAAMW,OAAO,MAE5BtS,UAAKyB,SAAS6O,WAAW4W,kBAAzBlnB,mBAAwC6W,YAAY7W,KAAKupB,MAAMhY,MAExDvR,KAAKupB;AAAAA,EACd;AAAA,EAKA;;AACMvpB,SAAKupB,WACPvpB,UAAKupB,MAAMhY,IAAI2V,kBAAflnB,mBAA8B0mB,YAAY1mB,KAAKupB,MAAMhY,MACrDvR,KAAKupB,QAAQ;AAAA,EAEjB;AAAA,EAKA,gBAAgBvjB;AACVA,IAAAA,MAAAA,CAAYhG,KAAKupB,QACnBvpB,KAAKsuC,YAAAA,IAAAA,CACKtoC,MAAWhG,KAAKupB,SAC1BvpB,KAAK6uC,YAAAA,GAEP7uC,KAAKD,OAAOwpB,MAAMjmB,UAAU0C;AAAAA,EAC9B;AAAA,EAKA,aAAatD,IAAAA;AACX1C,SAAKD,OAAOwpB,MAAM7mB,OAAOA,IACrB1C,KAAKupB,SACPvpB,KAAKupB,MAAM4lB,UAAUzsC,EAAAA;AAAAA,EAEzB;AAAA,EAKA,cAAA0sC;AACMpvC,SAAKupB,SACPvpB,KAAKupB,MAAM0E,OAAAA;AAAAA,EAEf;AAAA,EAMA,mBAAAsgB;AACEvuC,SAAK8uC,iBAAAA;AAEL,QAAA;AAEE,YAAMlrB,KAAY5jB,KAAKyB,SAAS6O,WAAW4W;AAC3C,aAAKtD,MAEL5jB,KAAKwpB,aAAa,IAAI6lB,EAAAA,WAAWrvC,KAAKwB,QAAQoiB,EAAAA,GACvC5jB,KAAKwpB,cAHW;AAAA,IAIzB,SAASrY,IAAAA;AAEP,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAKA,mBAAA29B;AACM9uC,SAAKwpB,eACPxpB,KAAKwpB,WAAWqM,QAAAA,GAChB71B,KAAKwpB,aAAa;AAAA,EAEtB;AAAA,EAKA,qBAAqBxjB;AACfA,IAAAA,MAAAA,CAAYhG,KAAKwpB,aACnBxpB,KAAKuuC,iBAAAA,IAAAA,CACKvoC,MAAWhG,KAAKwpB,cAC1BxpB,KAAK8uC,iBAAAA,GAEP9uC,KAAKD,OAAOypB,WAAWlmB,UAAU0C;AAAAA,EACnC;AAAA,EAKA,iBAAiB/E,IAAAA;AACXjB,SAAKwpB,eACPxpB,KAAKwpB,WAAWyJ,OAAOjzB,KAAKyB,WACxBzB,KAAKwpB,WAAW8lB,aAClBtvC,KAAKwpB,WAAWyE,OAAOhtB,EAAAA;AAAAA,EAG7B;AAAA,EAKA,iBAAiB2E;AAQf,WAPA5F,KAAK+uC,iBAAAA,GAEL/uC,KAAKmuC,cAAc,IAAIvpC,EAAMwlB,OAAOC,cAAczkB,EAAAA,GAClD5F,KAAKypB,aAAa,IAAI7kB,EAAM2qC,WAAWvvC,KAAKmuC,aAAa,IAAIvpC,EAAM8K,MAAM1P,KAAKD,OAAO0pB,WAAW9iB,KAAAA,CAAAA,GAChG3G,KAAKypB,WAAWzI,OAAO,kBACvBhhB,KAAKa,MAAM2lB,IAAIxmB,KAAKypB,UAAAA,GAEbzpB,KAAKypB;AAAAA,EACd;AAAA,EAKA,iBAAiB7jB;AACX5F,SAAKmuC,eAAenuC,KAAKypB,cAC3BzpB,KAAKmuC,YAAY9jB,cAAczkB,EAAAA;AAAAA,EAEnC;AAAA,EAKA;AACM5F,SAAKypB,eACPzpB,KAAKa,MAAMqjB,OAAOlkB,KAAKypB,UAAAA,GACvBzpB,KAAKypB,WAAWoM,QAAAA,GAChB71B,KAAKypB,aAAa,MAClBzpB,KAAKmuC,cAAc;AAAA,EAEvB;AAAA,EAKA,qBAAqBnoC,IAAAA;AACnBhG,SAAKD,OAAO0pB,WAAWnmB,UAAU0C,IAC5BA,MACHhG,KAAK+uC,iBAAAA;AAAAA,EAET;AAAA,EAKQ,iBAAiBnpC,IAAAA;AACnB5F,SAAKD,OAAO0pB,WAAWnmB,WACzBtD,KAAKwvC,iBAAiB5pC,EAAAA;AAAAA,EAE1B;AAAA,EAKQ,qBAAA8oC;AACN1uC,SAAK+uC,iBAAAA;AAAAA,EACP;AAAA,EAKA,gBAAAU;AACE,WAAOzvC,KAAKiuC;AAAAA,EACd;AAAA,EAKA,gBAAAyB;AACE,WAAO1vC,KAAKkuC;AAAAA,EACd;AAAA,EAKA,WAAAyB;AACE,WAAO3vC,KAAKupB;AAAAA,EACd;AAAA,EAKA,gBAAAqmB;AACE,WAAO5vC,KAAKwpB;AAAAA,EACd;AAAA,EAKA;AACE,WAAOxpB,KAAKypB;AAAAA,EACd;AAAA,EAKA,YAAA6U;AACE,WAAO,KAAKt+B,KAAKD,OAAAA;AAAAA,EACnB;0BN9ZK,cAA2BD,EAAAA;AAAAA,EA8BhC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAKxqB,GAAAA,GAA0BnD,OA9BvCC,KAASghB,OAAO,UA2BhBhhB,KAAQ6vC,gCAAgBC;AAAAA,EAIxB;AAAA,EAEU,YAAAzvC;AAERL,SAAK+vC,cAAc,IAAIC,iBACvBhwC,KAAK+vC,YAAYE,eAAejwC,KAAKD,OAAOoD,SAAAA,GAG5CnD,KAAKkwC,aAAa,IAAIC,gBAClBnwC,KAAKD,OAAOqD,YACdpD,KAAKkwC,WAAWE,eAAepwC,KAAK+vC,cAItC/vC,KAAKqwC,YAAY,IAAIC,eACrBtwC,KAAKuwC,YAAY,IAAIC,eACrBxwC,KAAKywC,YAAY,IAAIC,eACrB1wC,KAAKu8B,gBAAgB,IAAI33B,EAAM43B,iBAC/Bx8B,KAAKq8B,oBAAoB,IAAIz3B,EAAM03B,qBACnCt8B,KAAK2wC,aAAa,IAAIC;EACxB;AAAA,EAEU,cAAArwC;AACRP,SAAK+vC,YAAYla,QAAAA,GACjB71B,KAAK6vC,UAAUgB,MAAAA;AAAAA,EACjB;AAAA,EAKA,aAAanW,IAAAA;AACX16B,SAAKD,OAAOoD,YAAYu3B,IACxB16B,KAAK+vC,YAAYE,eAAevV,EAAAA;AAAAA,EAClC;AAAA,EAKA,UAAUoW,IAAAA;AACR,YAAM1qC,MAAEA,IAAAk3B,KAAMA,GAAAA,IAAQwT;AAEtB,YAAQ1qC,IAAAA;AAAAA,MACN,KAAK;AACH,eAAOpG,KAAKmlC,SAAS7H,EAAAA;AAAAA,MACvB,KAAK;AACH,eAAOt9B,KAAKslC,QAAQhI,EAAAA;AAAAA,MACtB,KAAK;AACH,eAAOt9B,KAAKulC,QAAQjI,EAAAA;AAAAA,MACtB;AACE,cAAM,IAAI3tB,MAAM,2BAA2BvJ;;EAEjD;AAAA,EAKA,SAASk3B,IAAAA;AACP,UAAMyT,KAAyC,EAC7C9f,UAAU,MAAA;AAAA,IAAA,GACVsG,UAAU;;AA4BZ,WAzBAv3B,KAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAKl3B,MAAM,WAE5CpG,KAAKkwC,WAAWhwB,KACdod,IACC0T,CAAAA,OAAAA;AACC,YAAMxL,KAAQwL,GAAKnwC;AACnB2kC,MAAAA,GAAM5W,aAAaoiB,GAAKpiB,YACxBmiB,GAAQxZ,SAASiO,EAAAA,GACjBxlC,KAAKU,OAAOqvB,KAAK,iBAAiB,EAAEuN,KAAAA,IAAK13B,QAAQ4/B,GAAAA,CAAAA;AAAAA,IAAAA,GAElDyL,CAAAA;AACC,YAAMC,KAAUD,GAAIE,SAASF,GAAIG;AACjCL,MAAAA,GAAQ9f,SAASigB,IAASD,EAAAA,GAC1BjxC,KAAKU,OAAOqvB,KAAK,iBAAiB,EAChCuN,KAAAA,IACA6T,QAAQF,GAAIE,QACZC,OAAOH,GAAIG,OACXF;OAGHG,CAAAA,OAAAA;AACCrxC,WAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAK+T,OAAAA,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAInCN;AAAAA,EACT;AAAA,EAKA,QAAQzT,IAAAA;AACN,UAAMyT,KAAyC,EAC7C9f,UAAU,MAAA;AAAA,IAAA,GACVsG,UAAU,MAAA;AAAA,IAAA,EAAA;AAwCZ,WArCAv3B,KAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAKl3B,MAAM,MAAA,CAAA,GAE5CpG,KAAKqwC,UAAUnwB,KACbod,IACC13B,CAAAA,OAAAA;AAECA,MAAAA,GAAO6gC,SAAUlE,CAAAA,OAAAA;AACf,YAAKA,GAAqBx8B,QAAQ;AAChC,gBAAMkwB,KAAOsM;AACTz6B,gBAAMuC,QAAQ4rB,GAAKN,YACrBM,GAAKN,SAAS5tB,QAASkoB,CAAAA,OAAAA;AACrBA,YAAAA,GAAE2I,OAAOh0B,EAAMi0B;AAAAA,eAER5C,GAAKN,aACdM,GAAKN,SAASiD,OAAOh0B,EAAMi0B;AAAAA,QAE/B;AAAA,MAAA,CAAA,GAGFkY,GAAQxZ,SAAS3xB,KACjB5F,KAAKU,OAAOqvB,KAAK,iBAAiB,EAAEuN,SAAK13B,QAAAA,GAAAA,CAAAA;AAAAA,IAAAA,GAE1CqrC,CAAAA,OAAAA;AACC,YAAMC,KAAUD,GAAIE,SAASF,GAAIG;AACjCL,MAAAA,GAAQ9f,SAASigB,IAASD,EAAAA,GAC1BjxC,KAAKU,OAAOqvB,KAAK,iBAAiB,EAChCuN,KAAAA,IACA6T,QAAQF,GAAIE,QACZC,OAAOH,GAAIG,OACXF,SAAAA,GAAAA,CAAAA;AAAAA,IAAAA,GAGHG,CAAAA,OAAAA;AACCrxC,WAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAK+T,OAAAA,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAInCN;AAAAA,EACT;AAAA,EAKA,QAAQzT,IAAAA;AACN,UAAMyT,KAAyC,EAC7C9f,UAAU,MAAA;AAAA,IAAA,GACVsG,UAAU;;AAGZv3B,SAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAKl3B,MAAM;AAE5C,UAAMkrC,KAAShU,GAAInoB,QAAQ,QAAQ;AAiDnC,WA/CAnV,KAAKywC,UAAUvwB,KACboxB,IACCC,CAAAA;AACCA,MAAAA,GAAUC,QAAAA,GACVxxC,KAAKuwC,UAAUkB,aAAaF,EAAAA,GAE5BvxC,KAAKuwC,UAAUrwB,KACbod,IACC13B,CAAAA;AACCmrC,QAAAA,GAAQxZ,SAAS3xB,KACjB5F,KAAKU,OAAOqvB,KAAK,iBAAiB,EAAEuN,KAAAA,IAAK13B,QAAAA,GAAAA,CAAAA;AAAAA,MAAAA,GAE1CqrC,CAAAA;AACC,cAAMC,KAAUD,GAAIE,SAASF,GAAIG;AACjCL,QAAAA,GAAQ9f,SAASigB,IAASD,EAAAA,GAC1BjxC,KAAKU,OAAOqvB,KAAK,iBAAiB,EAChCuN,KAAAA,IACA6T,QAAQF,GAAIE,QACZC,OAAOH,GAAIG,OACXF;SAGHG,CAAAA,OAAAA;AACCrxC,aAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAK+T;;eAK5C,MAAA;AAEErxC,WAAKuwC,UAAUrwB,KACbod,IACC13B,CAAAA,OAAAA;AACCmrC,QAAAA,GAAQxZ,SAAS3xB,EAAAA,GACjB5F,KAAKU,OAAOqvB,KAAK,iBAAiB,EAAEuN,KAAAA,IAAK13B;SAE1CqrC,CAAAA,OAAAA;AACC,cAAMC,KAAUD,GAAIE,SAASF,GAAIG;AACjCL,QAAAA,GAAQ9f,SAASigB,IAASD;SAE3BI,CAAAA,OAAAA;AACCrxC,aAAKU,OAAOqvB,KAAK,cAAc,EAAEuN,KAAAA,IAAK+T,OAAAA,GAAAA,CAAAA;AAAAA,MAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAMvCN;AAAAA,EACT;AAAA,EAKA,YAAYzT,IAAAA;AACV,WAAO,IAAIlM,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAKu8B,cAAcrc,KAAKod,IAAKhM,IAAAA,QAAoBsM,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAErD;AAAA,EAKA,gBAAgBJ,IAAAA;AACd,WAAO,IAAIpM,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAKq8B,kBAAkBnc,KAAKsd,IAAMlM,IAAAA,QAAoBsM,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAE1D;AAAA,EAKA,SAASN,IAAAA;AAEP,UAAMoU,KAAS1xC,KAAK6vC,UAAUnhC,IAAI4uB,EAAAA;AAClC,WAAIoU,KACKtgB,QAAQE,QAAQogB,EAAAA,IAGlB,IAAItgB,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAK2wC,WAAWzwB,KACdod,IACCqU,CAAAA;AACC3xC,aAAK6vC,UAAU7/B,IAAIstB,IAAKqU,KACxBrgB,GAAQqgB,EAAAA;AAAAA,MAAAA,GAAAA,QAGV/T,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,mBAAmBN,IAAAA;AACjB,UAAMsU,KAAQrhC,SAASC,cAAc,OAAA;AAOrC,WANAohC,GAAMC,cAAc,aACpBD,GAAME,MAAMxU,IACZsU,GAAMG,QAAAA,MACNH,GAAM3iB,OAAAA,MACN2iB,GAAM9hB,KAAAA,GAEC,IAAIlrB,EAAMotC,aAAaJ,EAAAA;AAAAA,EAChC;AAAA,EAKA,aAAahsC,IAAAA;AACX,UAAM2rC,KAA8B,CAAA;AAapC,WAXA3rC,GAAO6gC,SAAUlE,CAAAA,OAAAA;AACf,UAAKA,GAAqBx8B,QAAQ;AAChC,cAAMkwB,KAAOsM;AACTz6B,cAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrB4b,GAAUzwC,QAAQm1B,GAAKN,QAAAA,IACdM,GAAKN,YACd4b,GAAUzwC,KAAKm1B,GAAKN,QAAAA;AAAAA,MAExB;AAAA,QAGK,CAAA,GAAI,IAAIsc,IAAIV,EAAAA,CAAAA;AAAAA,EACrB;AAAA,4BcpRK,cAA6BzxC;EASlC,YAAYC,IAAAA;AACV2tB,UAAM,KAAKlC,IAAAA,GAA4BzrB,GAAAA,CAAAA,GATzCC,KAASghB,OAAO,YAGhBhhB,KAASkyC,gBAAgC,CACvC,QAAQ,QAAQ,QAAQ,aACxB,WAAW,UAAU,QAAQ,MAAA;AAAA,EAK/B;AAAA,EAKA,eAAe9rC,IAAoB0M,IAAAA;AACjC,UAAMlG,KAAIkG,MAAU,CAAA,GAGdq/B,KAAe,EACnBxrC,OAHYiG,GAAEjG,SAAS3G,KAAKD,OAAO2rB,cAInClnB,SAASoI,GAAEpI,WAAW,GACtBs0B,aAAalsB,GAAEksB,eAAAA,OACfF,MAAMhsB,GAAEgsB,QAAQh0B,EAAM0iC,WACtBE,WAAW56B,GAAE46B,aAAAA;AAGf,YAAQphC,IAAAA;AAAAA,MACN,KAAK;AACH,eAAO,IAAIxB,EAAM0kC,kBAAkB,EAAA,GAC9B6I,IACHh7B,KAAKvK,GAAEuK,IAAAA,CAAAA;AAAAA,MAGX,KAAK;AACH,eAAO,IAAIvS,EAAM+zB,qBAAqB,EAAA,GACjCwZ,IACHC,aAAaxlC,GAAEwlC,eAAAA,OACfj7B,KAAKvK,GAAEuK,KACPiwB,UAAUx6B,GAAEw6B,YAAY,GACxBuF,mBAAmB//B,GAAE+/B,qBAAqB,GAC1CjF,WAAW96B,GAAE86B,aAAa,KAC1BD,WAAW76B,GAAE66B,aAAa,KAC1BlB,iBAAiB35B,GAAE25B,mBAAmB,EAAA,CAAA;AAAA,MAG1C,KAAK;AACH,eAAO,IAAI3hC,EAAM6kC,qBAAqB,EAAA,GACjC0I,IACHC,aAAaxlC,GAAEwlC,eAAAA,OACfj7B,KAAKvK,GAAEuK,KACPiwB,UAAUx6B,GAAEw6B,YAAY,GACxBuF,mBAAmB//B,GAAE+/B,qBAAqB,GAC1CjF,WAAW96B,GAAE86B,aAAa,KAC1BD,WAAW76B,GAAE66B,aAAa,KAC1BlB,iBAAiB35B,GAAE25B,mBAAmB,EAAA,CAAA;AAAA,MAG1C,KAAK;AACH,eAAO,IAAI3hC,EAAM2kC,oBAAoB,KAChC4I,IACHC,aAAaxlC,GAAEwlC,eAAAA,OACfj7B,KAAKvK,GAAEuK,KACPiwB,UAAUx6B,GAAEw6B,YAAY,GACxBuF,mBAAmB//B,GAAE+/B,qBAAqB;MAG9C,KAAK;AACH,eAAO,IAAI/nC,EAAM4kC,kBAAkB,EAAA,GAC9B2I,IACHC,aAAaxlC,GAAEwlC,eAAAA,OACfj7B,KAAKvK,GAAEuK,KACPiwB,UAAUx6B,GAAEw6B,YAAY,GACxBuF,mBAAmB//B,GAAE+/B,qBAAqB;MAG9C,KAAK;AACH,eAAO,IAAI/nC,EAAM8kC,iBAAiB,EAAA,GAC7ByI,IACHh7B,KAAKvK,GAAEuK;MAGX,KAAK;AACH,eAAO,IAAIvS,EAAMytC,mBAAmB,EAClC7tC,SAASoI,GAAEpI,WAAW,GACtBs0B,aAAalsB,GAAEksB,sBACfF,MAAMhsB,GAAEgsB,QAAQh0B,EAAM0iC,WACtBE,WAAW56B,GAAE46B,oBACb4K,aAAaxlC,GAAEwlC,eAAAA,MAAe,CAAA;AAAA,MAGlC,KAAK;AACH,eAAO,IAAIxtC,EAAM0tC,kBAAkB,EACjC9tC,SAASoI,GAAEpI,WAAW,GACtBgjC,WAAW56B,GAAE46B,aAAAA,MAAa,CAAA;AAAA,MAG9B;AACE,eAAO,IAAI5iC,EAAM+zB,qBAAqBwZ,EAAAA;AAAAA,IAAAA;AAAAA,EAE5C;AAAA,EAKA,eAAelc,IAAkBnjB,IAAAA;AAC/B,UAAMy+B,KAAYzpC,MAAMuC,QAAQ4rB,GAAKN,QAAAA,IAAYM,GAAKN,WAAW,CAACM,GAAKN;AAGjEM,IAAAA,GAAasc,uBAChBtc,GAAasc,qBAAqBhB,GAAUp6B,IAAI8Y,CAAAA,OAAKA,GAAE0G;AAG1D,eAAWhB,MAAY4b,GACrBvxC,MAAKwyC,YAAY7c,IAAU7iB;EAE/B;AAAA,EAKA,oBAAoBkzB,IAAoBlzB,IAAAA;AACtCkzB,IAAAA,GAAMS,SAASlE,CAAAA;AACRA,MAAAA,GAAqBx8B,UACxB/F,KAAKyyC,eAAelQ,IAAqBzvB;;EAG/C;AAAA,EAKQ,YAAY6iB,IAA0B7iB;AAC5C,UAAM4zB,KAAM/Q;eAER7iB,GAAOnM,SACL+/B,GAAI//B,SAAO+/B,GAAI//B,MAAMqJ,IAAI8C,GAAOnM,KAAAA,GAAAA,WAElCmM,GAAOtO,YACTkiC,GAAIliC,UAAUsO,GAAOtO,UAAAA,WAEnBsO,GAAOgmB,gBACT4N,GAAI5N,cAAchmB,GAAOgmB,cAAAA,WAEvBhmB,GAAO8lB,SACT8N,GAAI9N,OAAO9lB,GAAO8lB,kBAEhB9lB,GAAO00B,cACTd,GAAIc,YAAY10B,GAAO00B,YAAAA,WAErB10B,GAAOs0B,YAA0BV,GAAIU,YACvCV,GAAIU,SAASp3B,IAAI8C,GAAOs0B,sBAEtBt0B,GAAO65B,sBACTjG,GAAIiG,oBAAoB75B,GAAO65B,oBAAAA,WAE7B75B,GAAO40B,cACThB,GAAIgB,YAAY50B,GAAO40B,YAAAA,WAErB50B,GAAO20B,cACTf,GAAIe,YAAY30B,GAAO20B,YAGzB9R,GAAS+c;EACX;AAAA,EAKA,eAAezc;AACb,UAAM0c,KAAqB1c,GAAasc;AACnCI,IAAAA,OAED7qC,MAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrBM,GAAKN,SAAS5tB,QAAQ,CAACkoB,IAAGvqB,OAAAA;AACpBitC,MAAAA,GAAkBjtC,OACpB1F,KAAK4yC,uBAAuBD,GAAkBjtC,EAAAA,GAAIuqB,EAAAA;AAAAA,IAAAA,CAAAA,IAG7C0iB,GAAkB,CAAA,KAC3B3yC,KAAK4yC,uBAAuBD,GAAkB,CAAA,GAAI1c,GAAKN,QAAAA;AAAAA,EAE3D;AAAA,EAKA,oBAAoBqQ;AAClBA,IAAAA,GAAMS,SAASlE,CAAAA;AACRA,MAAAA,GAAqBx8B,UACxB/F,KAAK6yC,eAAetQ,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAG1B;AAAA,EAKQ,uBAAuBuQ,IAAwBnuC,IAAAA;AACrD,UAAMmtC,KAAMgB,IACNC,KAAMpuC;AAERmtC,IAAAA,GAAInrC,SAASosC,GAAIpsC,YAAWA,MAAMsrB,KAAK6f,GAAInrC,KAAAA,GAC3CmrC,GAAI1K,YAAY2L,GAAI3L,eAAcA,SAASnV,KAAK6f,GAAI1K,QAAAA,GACxD2L,GAAIvuC,UAAUstC,GAAIttC,SAClBuuC,GAAIja,cAAcgZ,GAAIhZ,aACtBia,GAAIna,OAAOkZ,GAAIlZ,iBACXkZ,GAAItK,cAAyBuL,GAAIvL,YAAYsK,GAAItK,YAAAA,WACjDsK,GAAInF,sBAAiCoG,GAAIpG,oBAAoBmF,GAAInF,+BACjEmF,GAAIpK,cAAyBqL,GAAIrL,YAAYoK,GAAIpK,YAAAA,WACjDoK,GAAIrK,cAAyBsL,GAAItL,YAAYqK,GAAIrK,YAErD9iC,GAAO+tC,cAAAA;AAAAA,EACT;AAAA,EAKA,cAAc9sC,IAAAA;AACZA,IAAAA,GAAO6gC,SAASlE,CAAAA,OAAAA;AACd,UAAKA,GAAqBx8B,QAAQ;AAChC,cAAMkwB,KAAOsM;AACXtM,QAAAA,GAAa+c,kBAAAA,MACb/c,GAAagd,iBAAiBhd,GAAKN,UAEjC7tB,MAAMuC,QAAQ4rB,GAAKN,YACrBM,GAAKN,WAAWM,GAAKN,SAASxe,IAAI8Y,CAAAA,OAAKA,GAAE0G,WAEzCV,GAAKN,WAAWM,GAAKN,SAASgB,MAAAA;AAAAA,MAElC;AAAA;EAEJ;AAAA,EAKA,aAAa/wB,IAAAA;AACX,UAAM2rC,KAA8B,CAAA;AAapC,WAXA3rC,GAAO6gC,SAASlE,CAAAA,OAAAA;AACd,UAAKA,GAAqBx8B,QAAQ;AAChC,cAAMkwB,KAAOsM;AACTz6B,cAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrB4b,GAAUzwC,KAAAA,GAAQm1B,GAAKN,YACdM,GAAKN,YACd4b,GAAUzwC,KAAKm1B,GAAKN;MAExB;AAAA,IAAA,CAAA,GAGK,CAAA,GAAI,IAAIsc,IAAIV,EAAAA,CAAAA;AAAAA,EACrB;AAAA,mChB1RK,cAAoCzxC,EAAAA;AAAAA,EASzC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAK7rB,GAAAA,GAAyB9B,OATtCC,KAASghB,OAAO,oBAMhBhhB,KAAQkzC,gBAA6B;EAIrC;AAAA,EAKA,IAAA;AACE,WAAOlzC,KAAKmzC;AAAAA,EACd;AAAA,EAKA,aAAIxuC;AACF,WAAO3E,KAAKmzC,UAAUxuC;AAAAA,EACxB;AAAA,EAEU,YAAAtE;AACR,UAAA,EAAMmB,QAAEA,IAAAC,UAAQA,GAAAA,IAAazB,KAAKuB;AAElCvB,SAAKmzC,YAAY,IAAIC,EAAAA,cAAc5xC,IAAQC,GAAS6O,UAAAA,GAGpDtQ,KAAKqzC,YAAYrzC,KAAKD,MAAAA,GAGtBC,KAAKwuC,UAAU,iBAAiB;AAC9BxuC,WAAKmzC,UAAUllB;QAIjBjuB,KAAKmzC,UAAU1+B,iBAAiB,SAAS,MAAA;AACvCzU,WAAKU,OAAOqvB,KAAK,kBAAA,MAAkB;AAAA,IAAA,CAAA,GAGrC/vB,KAAKmzC,UAAU1+B,iBAAiB,OAAO,MAAA;AACrCzU,WAAKU,OAAOqvB,KAAK,gBAAA,MAAgB;AAAA,IAAA,CAAA,GAGnC/vB,KAAKmzC,UAAU1+B,iBAAiB,UAAU;AACxCzU,WAAKU,OAAOqvB,KAAK,mBAAA,MAAmB;AAAA,IAAA,CAAA;AAAA,EAExC;AAAA,EAEU;AACR/vB,SAAKmzC,UAAUtd;EACjB;AAAA,EAKA,YAAY91B,IAAAA;AAAAA,eACNA,GAAO+B,kBACT9B,KAAKmzC,UAAUrxC,gBAAgB/B,GAAO+B,2BAEpC/B,GAAOgC,kBACT/B,KAAKmzC,UAAUpxC,gBAAgBhC,GAAOgC,2BAEpChC,GAAOiC,gBACThC,KAAKmzC,UAAUnxC,cAAcjC,GAAOiC,cAAAA,WAElCjC,GAAOkC,gBACTjC,KAAKmzC,UAAUlxC,cAAclC,GAAOkC,cAAAA,WAElClC,GAAOoC,kBACTnC,KAAKmzC,UAAUhxC,gBAAgBpC,GAAOoC,gBAAAA,WAEpCpC,GAAOuC,cACTtC,KAAKmzC,UAAU7wC,YAAYvC,GAAOuC,YAAAA,WAEhCvC,GAAOwC,eACTvC,KAAKmzC,UAAU5wC,aAAaxC,GAAOwC,wBAEjCxC,GAAOyC,iBACTxC,KAAKmzC,UAAU3wC,eAAezC,GAAOyC;AAAAA,EAEzC;AAAA,EAKA;AACE,WAAO,EACLV,eAAe9B,KAAKmzC,UAAUrxC,eAC9BC,eAAe/B,KAAKmzC,UAAUpxC,eAC9BC,aAAahC,KAAKmzC,UAAUnxC,aAC5BC,aAAajC,KAAKmzC,UAAUlxC,aAC5BC,SAASlC,KAAKmzC,UAAUjxC,SACxBC,eAAenC,KAAKmzC,UAAUhxC,eAC9BG,WAAWtC,KAAKmzC,UAAU7wC,WAC1BC,YAAYvC,KAAKmzC,UAAU5wC,YAC3BC,cAAcxC,KAAKmzC,UAAU3wC,aAAAA;AAAAA,EAEjC;AAAA,EAKA,UAAU2Q,IAAWE,IAAWgZ,IAAAA;AAC9BrsB,SAAKmzC,UAAUxuC,OAAOqL,IAAImD,IAAGE,IAAGgZ,EAAAA,GAChCrsB,KAAKmzC,UAAUllB,OAAAA;AAAAA,EACjB;AAAA,EAKA,WAAW3qB,IAAAA;AACTtD,SAAKmzC,UAAU7vC,UAAUA;AAAAA,EAC3B;AAAA,EAKA,cAAc0d,IAAAA;AACZ,UAAMmQ,KAAuB,EAC3B9e,UAAUrS,KAAKwB,OAAO6Q,SAASskB,MAAAA,GAC/BhyB,QAAQ3E,KAAKmzC,UAAUxuC,OAAOgyB;AAGhC,WADA32B,KAAKkzC,cAAcpyC,KAAKqwB,KACjBA;AAAAA,EACT;AAAA,EAKA,mBAAAmiB;AACE,WAAOtzC,KAAKkzC;AAAAA,EACd;AAAA,EAKA,qBAAAK;AACEvzC,SAAKkzC,gBAAgB,CAAA;AAAA,EACvB;AAAA,EAKA,QAAAM;AACExzC,SAAKmzC,UAAUK,MAAAA;AAAAA,EACjB;AAAA,4BiBlIK,cAA6B1zC,EAAAA;AAAAA,EAclC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAK/B,IAAAA,GAA4B5rB,OAdzCC,KAASghB,OAAO,YAGhBhhB,KAASyzC,aAAkC,CACzC,OAAO,QAAQ,QAAQ,UAAU,QAAA,GAInCzzC,KAAQ0zC,kBAAwC,IAGhD1zC,KAAQu8B,gBAAgB,IAAI33B,EAAM43B;AAAAA,EAIlC;AAAA,EAEU,cAAAj8B;AACRP,SAAKu6B,SAAAA;AAAAA,EACP;AAAA,EAEA,SAASt5B;AAEP,eAAW0yC,MAAU3zC,KAAK0zC,gBACxB1zC,MAAK4zC,qBAAqBD,IAAQ1yC,EAAAA;AAAAA,EAEtC;AAAA,EAKA,qBAAqBlB,IAAAA;AACnB,UAAM8zC,KAAsB,EAC1BjoB,eAAc7rB,MAAAA,gBAAAA,GAAQ6rB,iBAAgB5rB,KAAKD,OAAO6rB,cAClDC,QAAO9rB,MAAAA,gBAAAA,GAAQ8rB,UAAS7rB,KAAKD,OAAO8rB,OACpCC,QAAO/rB,MAAAA,gBAAAA,GAAQ+rB,UAAS9rB,KAAKD,OAAO+rB,OACpCC,cAAahsB,MAAAA,gBAAAA,GAAQgsB,gBAAe/rB,KAAKD,OAAOgsB,aAChDC,SAAQjsB,MAAAA,gBAAAA,GAAQisB,WAAUhsB,KAAKD,OAAOisB,QACtCE,YAAWnsB,MAAAA,gBAAAA,GAAQmsB,cAAclsB,KAAKD,OAAOmsB,WAC7ChD,OAAMnpB,MAAAA,gBAAAA,GAAQmpB,SAAQ,GACtBviB,QAAO5G,MAAAA,gBAAAA,GAAQ4G,UAAS,UACxBnC,UAASzE,MAAAA,gBAAAA,GAAQyE,YAAW,EAAA,GAAA,EAGxBonB,cAAEA,IAAAC,OAAcA,IAAAC,OAAOA,IAAAC,aAAOA,IAAAG,WAAaA,GAAAA,IAAc2nB,IAGzDvb,KAAW,IAAI1zB,EAAM2zB,kBACrBub,KAAY,IAAIC,aAA4B,IAAfnoB,EAAAA,GAC7BooB,KAAa,IAAID,aAA4B,IAAfnoB,EAAAA;AAGpC,aAASlmB,KAAI,GAAGA,KAAIkmB,IAAclmB,MAAK;AACrC,YAAMuuC,KAAS,IAAJvuC,IAGL1B,KAAS6nB,KAAQzpB,KAAK8xC,OAAAA,KAAYpoB,KAAQD,KAC1CsoB,KAAQ/xC,KAAK8xC,WAAW9xC,KAAKC,KAAK,GAClC+xC,KAAMhyC,KAAKiyC,KAAK,IAAIjyC,KAAK8xC,OAAAA,IAAW,CAAA;AAO1C,cALAJ,GAAUG,EAAAA,IAAMjwC,KAAS5B,KAAKkyC,IAAIF,MAAOhyC,KAAKmyC,IAAIJ,EAAAA,GAClDL,GAAUG,KAAK,CAAA,IAAKjwC,KAAS5B,KAAKkyC,IAAIF,EAAAA,IAAOhyC,KAAKkyC,IAAIH,EAAAA,GACtDL,GAAUG,KAAK,KAAKjwC,KAAS5B,KAAKmyC,IAAIH,EAAAA,GAG9BloB,IAAAA;AAAAA,QACN,KAAK;AACH8nB,UAAAA,GAAWC,OAAO7xC,KAAK8xC,OAAAA,IAAW,OAAOnoB,IACzCioB,GAAWC,KAAK,CAAA,KAAM7xC,KAAK8xC,WAAW,OAAOnoB,IAC7CioB,GAAWC,KAAK,MAAM7xC,KAAK8xC,OAAAA,IAAW,OAAOnoB;AAC7C;AAAA,QACF,KAAK;AACHioB,UAAAA,GAAWC,EAAAA,KAAO7xC,KAAK8xC,WAAW,OAAOnoB,KAAc,KACvDioB,GAAWC,KAAK,MAAM7xC,KAAK8xC,OAAAA,IAAWnoB,IACtCioB,GAAWC,KAAK,CAAA,KAAM7xC,KAAK8xC,WAAW,OAAOnoB,KAAc;AAC3D;AAAA,QACF,KAAK;AACHioB,UAAAA,GAAWC,EAAAA,KAAO7xC,KAAK8xC,OAAAA,IAAW,OAAOnoB,KAAc,KACvDioB,GAAWC,KAAK,CAAA,IAAK7xC,KAAK8xC,OAAAA,IAAWnoB,IACrCioB,GAAWC,KAAK,CAAA,KAAM7xC,KAAK8xC,OAAAA,IAAW,OAAOnoB,KAAc;AAC3D;AAAA,QACF,KAAK;AACHioB,UAAAA,GAAWC,EAAAA,IAAM,GACjBD,GAAWC,KAAK,CAAA,IAAKloB,IACrBioB,GAAWC,KAAK,CAAA,IAAK;AACrB;AAAA,QACF,KAAK;AACHD,UAAAA,GAAWC,EAAAA,IAAM,GACjBD,GAAWC,KAAK,CAAA,IAAA,CAAMloB,IACtBioB,GAAWC,KAAK,KAAK;AAAA,MAAA;AAAA,IAG3B;AAEA3b,IAAAA,GAAS3hB,aAAa,YAAY,IAAI/R,EAAM4vC,gBAAgBV,IAAW,CAAA,CAAA;AAGvE,UAAMne,KAAW,IAAI/wB,EAAM6vC,eAAe,EACxCvrB,MAAM2qB,GAAI3qB,MACVviB,OAAOktC,GAAIltC,OACXmyB,aAAAA,MACAt0B,SAASqvC,GAAIrvC,SACbkwC,mBACAxf,UAAUtwB,EAAM+vC,iBAAAA,CAAAA;AAIdd,IAAAA,GAAI7nB,UACNhsB,KAAKu8B,cAAcrc,KAAK2zB,GAAI7nB,QAAS6R,CAAAA,OAAAA;AACnClI,MAAAA,GAASxe,MAAM0mB,IACflI,GAAS+c;IAAc,CAAA;AAK3B,UAAM7a,KAAS,IAAIjzB,EAAMgwC,OAAOtc,IAAU3C,EAAAA;AAC1CkC,IAAAA,GAAO7W,OAAO,kBAGZ6W,GAA4Bgd,iBAAAA;AAG9B,UAAMC,KAAiC,EACrC7e,MAAM4B,IACNmc,YAAAA,IACAj0C,QAAQ8zC;AAIV,WAFA7zC,KAAK0zC,gBAAgB5yC,KAAKg0C,EAAAA,GAEnBjd;AAAAA,EACT;AAAA,EAKA,WAAW93B,IAAAA;AACT,UAAM83B,KAAS73B,KAAK+0C,qBAAqBh1C,EAAAA;AAEzC,WADAC,KAAKa,MAAM2lB,IAAIqR,KACRA;AAAAA,EACT;AAAA,EAKQ,qBAAqB8b,IAA4B1yC;AACvD,UAAA,EAAMg1B,MAAEA,IAAA+d,YAAMA,IAAAj0C,QAAYA,GAAAA,IAAW4zC,IAC/BG,KAAY7d,GAAKqC,SAAS0c,WAAW3iC,SAAS4iC,SAC9CppB,OAAEA,IAAAC,OAAOA,IAAAI,WAAOA,GAAAA,IAAcnsB;AAEpC,aAAS2F,KAAI,GAAGA,KAAIouC,GAAUlsC,QAAQlC,MAAK,GAAG;AAE5CouC,MAAAA,GAAUpuC,OAAMsuC,GAAWtuC,EAAAA,IAAKzE,IAChC6yC,GAAUpuC,KAAI,MAAMsuC,GAAWtuC,KAAI,KAAKzE,IACxC6yC,GAAUpuC,KAAI,CAAA,KAAMsuC,GAAWtuC,KAAI,CAAA,IAAKzE;AAGxC,YAAM4oB,KAAWznB,KAAK8yC,KACpBpB,GAAUpuC,OAAM,IAChBouC,GAAUpuC,KAAI,CAAA,KAAM,IACpBouC,GAAUpuC,KAAI,MAAM,CAAA;AAItB,UAAImkB,KAAWiC,MAASjC,KAAWgC,IAAO;AAExC,cAAM7nB,KAAS6nB,KAAQzpB,KAAK8xC,OAAAA,KAAYpoB,KAAQD,KAC1CsoB,KAAQ/xC,KAAK8xC,WAAW9xC,KAAKC,KAAK,GAClC+xC,KAAMhyC,KAAKiyC,KAAK,IAAIjyC,KAAK8xC,WAAW,CAAA;AAE1CJ,QAAAA,GAAUpuC,MAAK1B,KAAS5B,KAAKkyC,IAAIF,EAAAA,IAAOhyC,KAAKmyC,IAAIJ,EAAAA,GACjDL,GAAUpuC,KAAI,CAAA,IAAK1B,KAAS5B,KAAKkyC,IAAIF,EAAAA,IAAOhyC,KAAKkyC,IAAIH,EAAAA,GACrDL,GAAUpuC,KAAI,CAAA,IAAK1B,KAAS5B,KAAKmyC,IAAIH,EAAAA;AAAAA,MACvC;AAAA,IACF;AAEAne,IAAAA,GAAKqC,SAAS0c,WAAW3iC,SAASqgC,cAAAA;AAAAA,EACpC;AAAA,EAKA,qBAAAyC;AACE,WAAOn1C,KAAK0zC;AAAAA,EACd;AAAA,EAKA,qBAAqBzd;AACnB,UAAM3gB,KAAQtV,KAAK0zC,gBAAgB1jB,UAAUzoB,CAAAA,OAAKA,GAAE0uB,SAASA,EAAAA;AACzD3gB,IAAAA,KAAAA,OACFtV,KAAKa,MAAMqjB,OAAO+R,EAAAA,GAClBA,GAAKqC,SAASzC,QAAAA,GACZI,GAAKN,SAA4BE,QAAAA,GACnC71B,KAAK0zC,gBAAgBn+B,OAAOD,IAAO,CAAA;AAAA,EAEvC;AAAA,EAKA,WAAAilB;AACE,eAAWoZ,MAAU3zC,KAAK0zC,gBACxB1zC,MAAKa,MAAMqjB,OAAOyvB,GAAO1d,OACzB0d,GAAO1d,KAAKqC,SAASzC,QAAAA,GACnB8d,GAAO1d,KAAKN,SAA4BE,QAAAA;AAE5C71B,SAAK0zC,kBAAkB,CAAA;AAAA,EACzB;AAAA,EAKA,WAAWzd,IAAoB3yB,IAAAA;AAC7B2yB,IAAAA,GAAKjwB,UAAU1C;AAAAA,EACjB;2BC3OK,cAA4BxD,EAAAA;AAAAA,EAYjC,YAAYC,IAAAA;AACV2tB,UAAM,EAAA,GAAKvB,IAAAA,GAA2BpsB,OAZxCC,KAASghB,OAAO,WAMhBhhB,KAAQo1C,SAA4B,CAAA,GAGpCp1C,KAAQq1C;EAIR;AAAA,EAKA,mBAAIC;AACF,WAAOt1C,KAAKu1C;AAAAA,EACd;AAAA,EAKA,cAAIjyC;AACF,WAAOtD,KAAKq1C;AAAAA,EACd;AAAA,EAEA,YAAY7nC,IAAAA;AACVxN,SAAKq1C,WAAW7nC;AAAAA,EAClB;AAAA,EAEU;AAERxN,SAAKu1C,QAAQ,IAAIC,EAAOC,SACxBz1C,KAAKu1C,MAAMnpB,QAAQpc,IACjBhQ,KAAKD,OAAOqsB,QAAQjZ,GACpBnT,KAAKD,OAAOqsB,QAAQ/Y,GACpBrT,KAAKD,OAAOqsB,QAAQC,CAAAA,GAItBrsB,KAAKu1C,MAAMG,aAAa,IAAIF,EAAOG,mBAAAA,WAE9B31C,KAAKu1C,MAAMK,OAAeC,eAC5B71C,KAAKu1C,MAAMK,OAAeC,aAAa;AAAA,EAE5C;AAAA,EAEU,cAAAt1C;AACRP,SAAKu6B;EACP;AAAA,EAEA,SAASt5B,IAAAA;AACP,QAAKjB,KAAKq1C,UAAV;AAGAr1C,WAAKu1C,MAAMp9B,KAAK,IAAI,IAAIlX,IAAO,CAAA;AAG/B,iBAAW8sB,MAAQ/tB,KAAKo1C,OAClBrnB,CAAAA,GAAK+nB,aACP/nB,GAAKkI,KAAK5jB,SAAS4f,KAAKlE,GAAKvP,KAAKnM,QAAAA,GAClC0b,GAAKkI,KAAK8f,WAAW9jB,KAAKlE,GAAKvP,KAAKu3B,UAAAA;AAAAA,IATpB;AAAA,EAYtB;AAAA,EAKA,WAAW5iC,IAAWE,IAAWgZ,IAAAA;AAC/BrsB,SAAKu1C,MAAMnpB,QAAQpc,IAAImD,IAAGE,IAAGgZ,EAAAA,GAC7BrsB,KAAKD,OAAOqsB,UAAU,EAAEjZ,GAAAA,IAAGE,OAAGgZ,GAAAA,GAAAA;AAAAA,EAChC;AAAA,EAKA,QACE4J,IACAhf;AAQA,UAAA,EAAMqT,QAAEA,IAAApd,KAAQA,IAAAD,KAAKA,YAAKjJ,GAAAA,IAAWmmB,GAAc8L,KAC7C+f,MAAO/+B,MAAAA,gBAAAA,GAASg/B,YAAW,KAAKh/B,MAAAA,gBAAAA,GAAS++B,SAAQh2C,KAAKD,OAAOusB;AAGnE,QAAI0M;AAEJ,YAAQ/hB,MAAAA,gBAAAA,GAAS+hB,OAAAA;AAAAA,MACf,KAAK;AACHA,QAAAA,KAAQ,IAAIwc,EAAOU,OAAOlyC,EAAAA;AAC1B;AAAA,MACF,KAAK;AACH,cAAMmyC,KAAiB/zC,KAAK8K,IAAIA,GAAIiG,IAAIlG,GAAIkG,GAAGjG,GAAImf,IAAIpf,GAAIof,CAAAA,IAAK,GAC1D+pB,KAAiBlpC,GAAImG,IAAIpG,GAAIoG;AACnC2lB,QAAAA,KAAQ,IAAIwc,EAAOa,SAASF,IAAgBA,IAAgBC,IAAgB,EAAA;AAC5E;AAAA,MAEF;AACEpd,QAAAA,KAAQ,IAAIwc,EAAOc,IAAI,IAAId,EAAOe,MAC/BrpC,GAAIiG,IAAIlG,GAAIkG,KAAK,IACjBjG,GAAImG,IAAIpG,GAAIoG,KAAK,IACjBnG,GAAImf,IAAIpf,GAAIof,KAAK,CAAA,CAAA;AAAA,IAAA;AAMxB,UAAM7N,KAAO,IAAIg3B,EAAOgB,KAAK,EAC3BR,MAAAA,IACAhd,OAAAA,IACA3mB,UAAU,IAAImjC,EAAOe,KAAKjsB,GAAOnX,GAAGmX,GAAOjX,GAAGiX,GAAO+B,CAAAA,EAAAA,CAAAA;AAAAA,gBAInDpV,MAAAA,gBAAAA,GAASw/B,aAAAA,YAA0Bx/B,MAAAA,gBAAAA,GAASy/B,iBAC9Cl4B,GAAKmX,WAAW,IAAI6f,EAAOmB,YAAAA,WACvB1/B,GAAQw/B,aACVj4B,GAAKmX,SAAS8gB,WAAWx/B,GAAQw/B,WAAAA,WAE/Bx/B,GAAQy/B,gBACVl4B,GAAKmX,SAAS+gB,cAAcz/B,GAAQy/B,eAKxC12C,KAAKu1C,MAAMqB,QAAQp4B,EAAAA;AAGnB,UAAMuP,KAAwB,EAC5BvP,MAAAA,IACAyX,MAAAA,IACA6f,YAAW7+B,MAAAA,gBAAAA,GAASg/B,UAAAA;AAOtB,WALAj2C,KAAKo1C,OAAOt0C,KAAKitB,EAAAA,GAGfkI,GAAa4gB,cAAcr4B,IAEtBA;AAAAA,EACT;AAAA,EAKA,UAAUnL,KAAY,GAAA;AACpB,UAAMyjC,KAAa,IAAItB,EAAOgB,KAAK,EACjCR,MAAM,GACNhd,OAAO,IAAIwc,EAAOuB,SAClB1kC,UAAU,IAAImjC,EAAOe,KAAK,GAAGljC,IAAG,CAAA,EAAA,CAAA;AAMlC,WAJAyjC,GAAWf,WAAWiB,aAAAA,CAAc50C,KAAKC,KAAK,GAAG,GAAG,CAAA,GAEpDrC,KAAKu1C,MAAMqB,QAAQE,KAEZA;AAAAA,EACT;AAAA,EAKA,WAAW7gB,IAAAA;AACT,UAAM3gB,KAAQtV,KAAKo1C,OAAOplB,UAAU5oB,CAAAA,OAAKA,GAAE6uB,SAASA,EAAAA;AACpD,QAAI3gB,KAAAA,IAAY;AACd,YAAMyY,KAAO/tB,KAAKo1C,OAAO9/B;AACzBtV,WAAKu1C,MAAM0B,WAAWlpB,GAAKvP,IAAAA,GAC3Bxe,KAAKo1C,OAAO7/B,OAAOD,IAAO,CAAA,GAAA,OAClB2gB,GAAa4gB;AAAAA,IACvB;AAAA,EACF;AAAA,EAKA,QAAQ5gB,IAAAA;AACN,UAAMlI,KAAO/tB,KAAKo1C,OAAOhlB,KAAKhpB,CAAAA,OAAKA,GAAE6uB,SAASA,EAAAA;AAC9C,WAAOlI,MAAAA,gBAAAA,GAAMvP;AAAAA,EACf;AAAA,EAKA,cAAcyX,IAAsB6f;AAClC,UAAM/nB,KAAO/tB,KAAKo1C,OAAOhlB,KAAKhpB,CAAAA,OAAKA,GAAE6uB,SAASA,EAAAA;AAC1ClI,IAAAA,OACFA,GAAK+nB,WAAWA,IACZA,OAEF/nB,GAAKvP,KAAKnM,SAAS4f,KAAKgE,GAAK5jB,QAAAA,GAC7B0b,GAAKvP,KAAKu3B,WAAW9jB,KAAKgE,GAAK8f,UAAAA;AAAAA,EAGrC;AAAA,EAKA,WAAW9f,IAAsBihB,IAAsB1oB,IAAAA;AACrD,UAAMhQ,KAAOxe,KAAKm3C,QAAQlhB,EAAAA;AAC1B,QAAIzX,IAAM;AACR,YAAM44B,KAAW,IAAI5B,EAAOe,KAAKW,GAAM/jC,GAAG+jC,GAAM7jC,GAAG6jC,GAAM7qB,CAAAA;AACzD,UAAImC,IAAO;AACT,cAAM6oB,KAAW,IAAI7B,EAAOe,KAAK/nB,GAAMrb,GAAGqb,GAAMnb,GAAGmb,GAAMnC,CAAAA;AACzD7N,QAAAA,GAAK84B,WAAWF,IAAUC,EAAAA;AAAAA,MAC5B,MACE74B,CAAAA,GAAK84B,WAAWF,EAAAA;AAAAA,IAEpB;AAAA,EACF;AAAA,EAKA,aAAanhB,IAAsBshB,IAAwB/oB,IAAAA;AACzD,UAAMhQ,KAAOxe,KAAKm3C,QAAQlhB,EAAAA;AAC1B,QAAIzX,IAAM;AACR,YAAMg5B,KAAa,IAAIhC,EAAOe,KAAKgB,GAAQpkC,GAAGokC,GAAQlkC,GAAGkkC,GAAQlrB,CAAAA;AACjE,UAAImC,IAAO;AACT,cAAM6oB,KAAW,IAAI7B,EAAOe,KAAK/nB,GAAMrb,GAAGqb,GAAMnb,GAAGmb,GAAMnC,CAAAA;AACzD7N,QAAAA,GAAKi5B,aAAaD,IAAYH,EAAAA;AAAAA,MAChC,MACE74B,CAAAA,GAAKi5B,aAAaD,EAAAA;AAAAA,IAEtB;AAAA,EACF;AAAA,EAKA,YAAYvhB,IAAsByhB,IAAAA;AAChC,UAAMl5B,KAAOxe,KAAKm3C,QAAQlhB;AACtBzX,IAAAA,MACFA,GAAKk5B,SAAS1nC,IAAI0nC,GAASvkC,GAAGukC,GAASrkC,GAAGqkC,GAASrrB,CAAAA;AAAAA,EAEvD;AAAA,EAKA,UAAU4J;AACR,UAAMzX,KAAOxe,KAAKm3C,QAAQlhB,EAAAA;AACtBzX,IAAAA,OACFA,GAAKk5B,SAASC,QAAAA,GACdn5B,GAAKo5B,gBAAgBD,QAAAA,GACrBn5B,GAAKnM,SAAS4f,KAAKgE,GAAK5jB,QAAAA,GACxBmM,GAAKu3B,WAAW9jB,KAAKgE,GAAK8f;EAE9B;AAAA,EAKA;AACE,eAAWhoB,MAAQ/tB,KAAKo1C,OACtBp1C,MAAKu1C,MAAM0B,WAAWlpB,GAAKvP,IAAAA,GAAAA,OACnBuP,GAAKkI,KAAa4gB;AAE5B72C,SAAKo1C,SAAS,CAAA;AAAA,EAChB;AAAA,EAKA,YAAAyC;AACE,WAAO73C,KAAKo1C;AAAAA,EACd;+CKvSK;EAOL,YAAYj1C;AALZH,SAAQ83C,8BAAchI,OAOpB9vC,KAAKG,UAAU,EAAA,GACVA,IACHuB,eAAe1B,KAAAA;AAAAA,EAEnB;AAAA,EAMA,IAAuB+3C;AACrB,UAAA,EAAM/2B,MAAEA,OAAS+2B;AAGjB,QAAI/3C,KAAK83C,QAAQE,IAAIh3B,IAEnB,QAAOhhB;AAIT,QAAI+3C,GAAOpd;AACT,iBAAWsd,MAAOF,GAAOpd,aACvB,MAAK36B,KAAK83C,QAAQE,IAAIC,EAAAA,EACpB,OAAM,IAAItoC,MAAM,WAAWqR,EAAAA,iBAAqBi3B,EAAAA,2BAAAA;AAAAA;AAMtD,UAAMhsC,KAAS8rC,GAAOG,QAAQl4C,KAAKG,OAAAA;AAenC,WAZI8L,cAAkBmlB,UACpBnlB,GAAOslB,KAAK;AACVvxB,WAAK83C,QAAQ9nC,IAAIgR,IAAM+2B,EAAAA,GACvB/3C,KAAKG,QAAQO,OAAOqvB,KAAK,oBAAoB,EAAE/O;OAC9Cm3B,MAAO9G,CAAAA,OAAAA;AAAAA,IAAAA,CAAAA,KAIVrxC,KAAK83C,QAAQ9nC,IAAIgR,IAAM+2B,EAAAA,GACvB/3C,KAAKG,QAAQO,OAAOqvB,KAAK,oBAAoB,EAAE/O,cAG1ChhB;AAAAA,EACT;AAAA,EAMA,OAAO83C;AACL,eAAWC,MAAUD,GACnB93C,MAAKo4C,IAAIL,EAAAA;AAEX,WAAO/3C;AAAAA,EACT;AAAA,EAMA,IAAuBghB,IAAAA;AACrB,WAAOhhB,KAAK83C,QAAQppC,IAAIsS,EAAAA;AAAAA,EAC1B;AAAA,EAMA,OAAOA,IAAAA;;AACL,UAAM+2B,KAAS/3C,KAAK83C,QAAQppC,IAAIsS,EAAAA;AAChC,SAAK+2B,GACH,QAAA;AAIF,gBAAYM,IAAWC,EAAAA,KAAgBt4C,KAAK83C,QAC1C,MAAIQ,KAAAA,GAAY3d,iBAAZ2d,mBAA0BvmB,SAAS/Q,IAErC,QAAA;AAKJ,UAAM/U,KAAS8rC,GAAOz3C,UAAAA;AAetB,WAZI2L,cAAkBmlB,UACpBnlB,GAAOslB,KAAK,MAAA;AACVvxB,WAAK83C,QAAQS,OAAOv3B,KACpBhhB,KAAKG,QAAQO,OAAOqvB,KAAK,sBAAsB,EAAE/O,MAAAA,GAAAA,CAAAA;AAAAA,IAAAA,CAAAA,EAChDm3B,MAAO9G,CAAAA;UAIVrxC,KAAK83C,QAAQS,OAAOv3B,EAAAA,GACpBhhB,KAAKG,QAAQO,OAAOqvB,KAAK,sBAAsB,EAAE/O;EAIrD;AAAA,EAMA,IAAIA,IAAAA;AACF,WAAOhhB,KAAK83C,QAAQE,IAAIh3B,EAAAA;AAAAA,EAC1B;AAAA,EAKA,SAAAw3B;AACE,WAAO1wC,MAAM2wC,KAAKz4C,KAAK83C,QAAQY,OAAAA,CAAAA;AAAAA,EACjC;AAAA,EAKA;AACE,WAAO5wC,MAAM2wC,KAAKz4C,KAAK83C,QAAQpvC;EACjC;AAAA,EAKA;AAEE,UAAMiwC,KAAQ7wC,MAAM2wC,KAAKz4C,KAAK83C,QAAQpvC,KAAAA,CAAAA,EAAQkwC,QAAAA;AAC9C,eAAW53B,MAAQ23B,GACjB34C,MAAKkkB,OAAOlD,EAAAA;AAAAA,EAEhB;AAAA,iCF5EK,cAAkClhB;EAGvC,YAAYC,IAAAA;AACV2tB,UAAM,KAAKN,IAAAA,GAAiCrtB,GAAAA,CAAAA,GAH9CC,KAASghB,OAAO;AAAA,EAIhB;AAAA,EAKA,YAAA63B;AACE,UAAMh4C,KAAQb,KAAKa,OACbW,KAASxB,KAAKwB;AAEpB,WAAO,EACL6rB,SAASrtB,KAAKD,OAAOstB,SACrByrB,UAAU,EACRC,WAAW,eACXC,WAAWpnB,KAAKC,IAAAA,EAAAA,GAElBhxB,OAAOb,KAAKi5C,yBAAAA,GACZz3C,QAAQxB,KAAKk5C,gBAAgB13C,EAAAA,GAC7B4D,SAASpF,KAAKm5C,iBAAiBt4C,GAAM45B,WACrCqd,SAAS93C,KAAKo5C,iBAAAA,EAAAA;AAAAA,EAElB;AAAA,EAKQ,2BAAAH;AACN,UAAMp4C,KAAQb,KAAKa;AAEnB,WAAO,EACL2b,YAAYxc,KAAKq5C,oBAAoBx4C,GAAM2b,UAAAA,GAC3CmQ,KAAK3sB,KAAKs5C,aAAaz4C,GAAM8rB,MAC7BsR,aAAap9B,GAAMo9B,cAAc,oBAAoB,KAAA;AAAA,EAEzD;AAAA,EAKQ,oBAAoBzhB;AAC1B,WAAKA,KAEDA,cAAsB5X,EAAM8K,QACvB,EACLtJ,MAAM,SACNoH,OAAOgP,GAAW+8B,aAIlB/8B,cAAsB5X,EAAMo5B,UACvB,EACL53B,MAAM,WAENk3B,KAAM9gB,GAAmBg9B,cAAc,KAAA,IAIpC,OAjBiB;AAAA,EAkB1B;AAAA,EAKQ,aAAa7sB,IAAAA;AACnB,WAAKA,KAEDA,cAAe/nB,EAAMs4B,MAChB,EACL92B,MAAM,UACNO,OAAOgmB,GAAIhmB,MAAM4yC,UACjB3sB,MAAMD,GAAIC,MACVC,KAAKF,GAAIE,QAITF,cAAe/nB,EAAMu4B,UAChB,EACL/2B,MAAM,eACNO,OAAOgmB,GAAIhmB,MAAM4yC,OAAAA,GACjBzsB,SAASH,GAAIG,QAAAA,IAIV,OAnBU;AAAA,EAoBnB;AAAA,EAKQ,gBAAgBtrB;AACtB,UAAMyK,KAAoC,EACxC7F,MAAM5E,GAAO4E,MACbiM,UAAU,EACRc,GAAG3R,GAAO6Q,SAASc,GACnBE,GAAG7R,GAAO6Q,SAASgB,GACnBgZ,GAAG7qB,GAAO6Q,SAASga,KAErBqF,UAAU,EACRve,GAAG3R,GAAOkwB,SAASve,GACnBE,GAAG7R,GAAOkwB,SAASre,GACnBgZ,GAAG7qB,GAAOkwB,SAASrF,KAErBO,MAAOprB,GAAmCorB,MAC1CC,KAAMrrB,GAAmCqrB,KACzC4sB,MAAOj4C,GAAmCi4C,KAAAA;AAO5C,WAJIj4C,cAAkBoD,EAAM80C,sBAC1BztC,GAAO0tC,MAAMn4C,GAAOm4C,MAGf1tC;AAAAA,EACT;AAAA,EAKQ,iBAAiB7G;AACvB,UAAM6G,KAA6B;AAEnC,eAAWtG,MAAOP,IAAS;AAEzB,UAAIpF,KAAKD,OAAO0tB,kBAAkBztB,KAAK45C,SAASj0C,IAC9C;AAGF,YAAMk0C,KAAa75C,KAAK85C,gBAAgBn0C,EAAAA;AACpCk0C,MAAAA,MACF5tC,GAAOnL,KAAK+4C,EAAAA;AAAAA,IAEhB;AAEA,WAAO5tC;AAAAA,EACT;AAAA,EAKQ,gBAAgBtG,IAAAA;AACtB,UAAMsG,KAA2B,EAC/B8tC,MAAMp0C,GAAIo0C,MACV/4B,MAAMrb,GAAIqb,MACV5a,MAAMT,GAAIS,MACViM,UAAU,EACRc,GAAGxN,GAAI0M,SAASc,GAChBE,GAAG1N,GAAI0M,SAASgB,GAChBgZ,GAAG1mB,GAAI0M,SAASga,EAAAA,GAElBqF,UAAU,EACRve,GAAGxN,GAAI+rB,SAASve,GAChBE,GAAG1N,GAAI+rB,SAASre,GAChBgZ,GAAG1mB,GAAI+rB,SAASrF,EAAAA,GAElBjoB,OAAO,EACL+O,GAAGxN,GAAIvB,MAAM+O,GACbE,GAAG1N,GAAIvB,MAAMiP,GACbgZ,GAAG1mB,GAAIvB,MAAMioB,EAAAA,GAEfrmB,SAASL,GAAIK,SACbg0C,UAAUh6C,KAAKD,OAAOytB,kBAAkB7nB,GAAIq0C,WAAW,CAAA,EAAA;AAkBzD,WAdIh6C,KAAKD,OAAOutB,mBAAoB3nB,GAAmB2yB,aACrDrsB,GAAOqsB,WAAWt4B,KAAKi6C,kBAAmBt0C,GAAmB2yB,QAAAA,IAI3Dt4B,KAAKD,OAAOwtB,mBAAoB5nB,GAAmBgwB,aACrD1pB,GAAO0pB,WAAW31B,KAAKk6C,kBAAmBv0C,GAAmBgwB,QAAAA,IAI3DhwB,GAAI80B,SAAS7yB,SAAS,MACxBqE,GAAOwuB,WAAWz6B,KAAKm5C,iBAAiBxzC,GAAI80B,YAGvCxuB;AAAAA,EACT;AAAA,EAKQ,kBAAkBqsB;AACxB,WAAO,EACLlyB,MAAMkyB,GAASlyB,MACf2zC,MAAMzhB,GAASyhB,MACfI,YAAa7hB,GAAiB6hB,cAAc,CAAA,EAAA;AAAA,EAEhD;AAAA,EAKQ,kBAAkBxkB,IAAAA;AACxB,WAAI7tB,MAAMuC,QAAQsrB,EAAAA,IACTA,GAASxe,IAAI8Y,CAAAA,OAAKjwB,KAAKo6C,wBAAwBnqB,EAAAA,CAAAA,IAEjDjwB,KAAKo6C,wBAAwBzkB,EAAAA;AAAAA,EACtC;AAAA,EAKQ,wBAAwBA;AAC9B,UAAM1pB,KAAc,EAClB7F,MAAMuvB,GAASvvB,MACf2zC,MAAMpkB,GAASokB,MACf/4B,MAAM2U,GAAS3U,MACfxc,SAASmxB,GAASnxB,SAClBs0B,aAAanD,GAASmD,aACtB9yB,SAAS2vB,GAAS3vB,SAClB4yB,MAAMjD,GAASiD,KAAAA;AAsBjB,WAlBKjD,GAAqChvB,UACxCsF,GAAOtF,QAASgvB,GAAqChvB,MAAM4yC,OAAAA,IAAAA,WAIxD5jB,GAAwC8R,cAC3Cx7B,GAAOw7B,YAAa9R,GAAwC8R,YAAAA,WAEzD9R,GAAwC+R,cAC3Cz7B,GAAOy7B,YAAa/R,GAAwC+R,YAEzD/R,GAAwCyR,aAC3Cn7B,GAAOm7B,WAAYzR,GAAwCyR,SAASmS,OAAAA,IAAAA,WAEjE5jB,GAAwCgX,sBAC3C1gC,GAAO0gC,oBAAqBhX,GAAwCgX,oBAG/D1gC;AAAAA,EACT;AAAA,EAKQ,mBAAAmtC;AACN,UAAMntC,KAA8B,CAAA,GAI9BvK,KAAiB1B,KAAKG,QAAgBuB;AAC5C,QAAIA,MAAiD,cAAA,OAAzBA,GAAc82C,QAAuB;AAC/D,YAAMV,KAAUp2C,GAAc82C;AAC9B,iBAAWT,MAAUD,GACfC,CAAAA,GAAO/2B,SAAShhB,KAAKghB,QAA6C,cAAA,OAA7B+2B,GAAezZ,cACtDryB,GAAO8rC,GAAO/2B,QAAS+2B,GAAezZ,UAAAA;AAAAA,IAG5C;AAEA,WAAOryB;AAAAA,EACT;AAAA,EAKQ,SAAStG,IAAAA;AACf,WACEA,GAAIqb,KAAKq5B,WAAW,SACpB10C,GAAIS,KAAK2rB,SAAS,QAAA,KACL,wBAAbpsB,GAAIS,QACS,6BAAbT,GAAIS;AAAAA,EAER;AAAA,EAKA,MAAA,YAAkBgkC;AAEhBpqC,SAAKs6C,kBAAkBlQ,GAAK5oC,MAAAA,GAG5BxB,KAAKu6C,2BAA2BnQ,GAAKvpC,KAAAA,GAGrCb,KAAKw6C,mBAAmBpQ,GAAK0N,OAAAA,GAG7B93C,KAAKU,OAAOqvB,KAAK,sBAA6Bqa;EAChD;AAAA,EAKQ,kBAAkBqQ,IAAAA;AACxB,UAAMj5C,KAASxB,KAAKwB;AAEpBA,IAAAA,GAAO6Q,SAASrC,IACdyqC,GAAWpoC,SAASc,GACpBsnC,GAAWpoC,SAASgB,GACpBonC,GAAWpoC,SAASga,IAGtB7qB,GAAOkwB,SAAS1hB,IACdyqC,GAAW/oB,SAASve,GACpBsnC,GAAW/oB,SAASre,GACpBonC,GAAW/oB,SAASrF,CAAAA,GAGlB7qB,cAAkBoD,EAAM80C,qBAAqBe,GAAWd,QAC1Dn4C,GAAOm4C,MAAMc,GAAWd,KACxBn4C,GAAOorB,OAAO6tB,GAAW7tB,MACzBprB,GAAOqrB,MAAM4tB,GAAW5tB,KACxBrrB,GAAOi4C,OAAOgB,GAAWhB,MACzBj4C,GAAOqgC,uBAAAA;AAAAA,EAEX;AAAA,EAKQ,2BAA2B6Y;AAE7BA,IAAAA,GAAUl+B,cACsB,YAA9Bk+B,GAAUl+B,WAAWpW,SACvBpG,KAAKa,MAAM2b,aAAa,IAAI5X,EAAM8K,MAAMgrC,GAAUl+B,WAAWhP,KAAAA,IAK7DktC,GAAU/tB,QACe,aAAvB+tB,GAAU/tB,IAAIvmB,OAChBpG,KAAKa,MAAM8rB,MAAM,IAAI/nB,EAAMs4B,IACzBwd,GAAU/tB,IAAIhmB,OACd+zC,GAAU/tB,IAAIC,MACd8tB,GAAU/tB,IAAIE,OAEgB,kBAAvB6tB,GAAU/tB,IAAIvmB,SACvBpG,KAAKa,MAAM8rB,MAAM,IAAI/nB,EAAMu4B,QACzBud,GAAU/tB,IAAIhmB,OACd+zC,GAAU/tB,IAAIG,OAAAA;AAAAA,EAItB;AAAA,EAKQ,mBAAmB6tB,IAAAA;AACzB,UAAMj5C,KAAiB1B,KAAKG,QAAgBuB;AAC5C,QAAKA,MAA8C,cAAA,OAAtBA,GAAcgN,IAE3C,YAAA,CAAYksC,IAAY76C,OAAW0I,OAAOoyC,QAAQF,KAAc;AAC9D,YAAM5C,KAASr2C,GAAcgN,IAAIksC,EAAAA;AAC7B7C,MAAAA,MAA+C,qBAA7BA,GAAe+C,aAClC/C,GAAe+C,UAAU/6C,EAAAA;AAAAA,IAE9B;AAAA,EACF;AAAA,EAKA;AACE,WAAO0hB,KAAKe,UAAUxiB,KAAK64C,UAAAA,GAAa,MAAM,CAAA;AAAA,EAChD;AAAA,EAKA,eAAexO,IAAAA;AACb,UAAMD,KAAO3oB,KAAKC,MAAM2oB,EAAAA;AAAAA,UAClBrqC,KAAK+6C,YAAY3Q,EAAAA;AAAAA,EACzB;AAAA,EAKA,SAAS4Q,KAAmB,cAAA;AAC1B,UAAM3Q,KAAOrqC,KAAKi7C,UACZC,KAAO,IAAIC,KAAK,CAAC9Q,EAAAA,GAAO,EAAEjkC,MAAM,uBAChCk3B,KAAM8d,IAAIC,gBAAgBH,EAAAA,GAE1BI,KAAO/qC,SAASC,cAAc,GAAA;AACpC8qC,IAAAA,GAAKjlC,OAAOinB,IACZge,GAAKC,WAAWP,IAChBM,GAAKvR,MAAAA,GAELqR,IAAII,gBAAgBle,EAAAA;AAAAA,EACtB;AAAA,EAKA,MAAA,aAAmB+H;AACjB,WAAO,IAAIjU,QAAQ,CAACE,IAASsM;AAC3B,YAAM6d,KAAS,IAAIC;AACnBD,MAAAA,GAAOE,SAASC,OAAOzqC;;AACrB,YAAA;AACE,gBAAMk5B,MAAOl5B,KAAAA,GAAExM,WAAFwM,mBAAUlF;AAAAA,gBACjBjM,KAAK67C,SAASxR,EAAAA,GACpB/Y,GAAAA;AAAAA,QACF,SAAS+f,IAAAA;AACPzT,UAAAA,GAAOyT,EAAAA;AAAAA,QACT;AAAA,MAAA,GAEFoK,GAAOK,UAAUle,IACjB6d,GAAOM,WAAW1W,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAEtB;AAAA,EAKA,YAAA/G;AACE,WAAO,EAAA,GAAKt+B,KAAKD,OAAAA;AAAAA,EACnB;AAAA,EAKA,UAAUA,IAAAA;AACR0I,WAAOw0B,OAAOj9B,KAAKD,QAAQA,EAAAA;AAAAA,EAC7B;AAAA,0BVlcK,cAA2BD,EAAAA;AAAAA,EAYhC,YAAYC,IAAAA;AACV2tB,UAAM,KAAKlD,IAAAA,GAA0BzqB,GAAAA,CAAAA,GAZvCC,KAASghB,OAAO,UAGhBhhB,KAAQg8C,8BAAclM,OAGtB9vC,KAAQi8C,qCAAqBnM,OAG7B9vC,KAAQk8C,mBAAoF,CAAA;AAAA,EAI5F;AAAA,EAEU,YAAA77C;AAERL,SAAKm8C,uBAAAA;AAAAA,EACP;AAAA,EAEU,cAAA57C;AAER,eAAA,CAAYqF,EAAAA,KAAW5F,KAAKi8C,eAC1Bj8C,MAAKkkB,OAAOte,EAAAA;AAEd5F,SAAKg8C,QAAQnL,MAAAA;AAAAA,EACf;AAAA,EAEA,SAAS5vC;AAEP,eAAA,EAAWiiB,YAAEA,GAAAA,KAAgBljB,KAAKk8C,iBAChCh5B,CAAAA,GAAW+K,OAAAA;AAAAA,EAEf;AAAA,EAKQ;AAENjuB,SAAKo8C,eAAe,OAAO,EACzBp7B,MAAM,OACN4U,UAAU51B,KAAKq8C,qBACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,iTAQVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAAiB,MAARvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,OAAO,EACzBp7B,MAAM,OACN4U,UAAU51B,KAAKq8C,qBACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,kOAKVC,SAAS,CAAC7mB,IAAU30B;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU,KACL51B,KAAKq8C,kBAAAA,GACRM,aAAa,EAAEv2C,MAAM,UAAUoH,OAAO,KAAKovC,MAAM,QAAA,GACjDC,WAAW,EAAEz2C,MAAM,QAAQoH,OAAAA,OAAcovC,MAAM,OAAA,EAAA,GAEjDN,YAAYt8C,KAAKu8C,uBAAuB,KACnCv8C,KAAKq8C,kBAAAA,GACRM,aAAa,EAAEv2C,MAAM,UAAUoH,OAAO,KAAKovC,MAAM,QAAA,GACjDC,WAAW,EAAEz2C,MAAM,QAAQoH,OAAAA,OAAcovC,MAAM,OAAA,EAAA,CAAA,GAEjDJ,UAAU,yVAOVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAAiB,MAARvM,IACpB20B,GAAS8mB,MAAMlvC,QAAQ,MAAKooB,GAAS8mB,MAAMlvC,QAAQ;AAAA,UAK3DxN,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,sBAC7CG,UAAU,yNAKVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,SAAS,EAC3Bp7B,MAAM,SACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,sQAMVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,UAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,qOAKVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAAiB,MAARvM;AAAAA,UAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,qBACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,sBAC7CG,UAAU,kMAAA,CAAA,GAQZx8C,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,qBACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,0OAKVC,SAAS,CAAC7mB,IAAU30B;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,sBAC7CG,UAAU,8PAKVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,qBACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,6WAOVC,SAAS,CAAC7mB,IAAU30B;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU,uWAQVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU,EAAA,GACL51B,KAAKq8C,kBAAAA,GACRS,UAAU,EAAE12C,MAAM,SAASoH,OAAO,IAAI5I,EAAM8K,MAAM,KAAA,GAAWktC,MAAM,OAAA,GACnEG,aAAa,EAAE32C,MAAM,SAASoH,OAAO,IAAI5I,EAAM8K,MAAM,QAAA,GAAWktC,MAAM,UACtE7mC,QAAQ,EAAE3P,MAAM,UAAUoH,OAAO,GAAKovC,MAAM,WAC5CI,UAAU,EAAE52C,MAAM,UAAUoH,OAAO,KAAKovC,MAAM,aAEhDN,YAAY,qLAOZW,cAAc,2LAMdT,UAAU,yNAQZx8C,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU,KACL51B,KAAKq8C,kBAAAA,GACRa,YAAY,EAAE92C,MAAM,SAASoH,OAAO,IAAI5I,EAAM8K,MAAM,IAAA,GAAWktC,MAAM,OAAA,GACrEO,YAAY,EAAE/2C,MAAM,UAAUoH,OAAO,KAAKovC,MAAM,QAAA,GAChDQ,WAAW,EAAEh3C,MAAM,UAAUoH,OAAO,GAAKovC,MAAM,aAEjDN,YAAY;AAAA;AAAA;AAAA;AAAA,UAIRt8C,KAAKu8C,uBAAuBv8C,KAAKq8C;SAErCG,UAAU,gWAOVC,SAAS,CAAC7mB,IAAU30B,OAAAA;AAClB20B,MAAAA,GAAS8mB,MAAMlvC,SAASvM;AAAAA,IAAAA,EAAAA,CAAAA,GAK5BjB,KAAKo8C,eAAe,OAAO,EACzBp7B,MAAM,OACN4U,UAAU,EAAA,GACL51B,KAAKq8C,qBACRzH,QAAQ,EAAExuC,MAAM,SAASoH,OAAO,IAAIovC,MAAM,OAAA,GAC1CS,aAAa,EAAEj3C,MAAM,UAAUoH,OAAO,GAAGovC,MAAM,MAAA,GAC/C54C,QAAQ,EAAEoC,MAAM,UAAUoH,OAAO,KAAKovC,MAAM,QAAA,EAAA,GAE9CN,YAAY;AAAA;AAAA;AAAA;AAAA,UAIRt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,CAAAA;AAAAA,SAErCG,UAAU,yiBAAA,CAAA,GAeZx8C,KAAKo8C,eAAe,QAAQ,EAC1Bp7B,MAAM,QACN4U,UAAU51B,KAAKq8C,kBAAAA,GACfC,YAAYt8C,KAAKu8C,uBAAuBv8C,KAAKq8C,kBAAAA,CAAAA,GAC7CG,UAAU;EAOd;AAAA,EAKQ;AACN,WAAO,EACLE,OAAO,EAAEt2C,MAAM,UAAUoH,OAAO,GAAKovC,MAAM,QAAA,GAC3CnyB,OAAO,EAAErkB,MAAM,UAAUoH,OAAOxN,KAAKD,OAAO0qB,OAAOmyB,MAAM,QAAA,GACzDz4C,WAAW,EAAEiC,MAAM,UAAUoH,OAAO,GAAKovC,MAAM,QAAA,GAC/ClyB,UAAU,EAAEtkB,MAAM,UAAUoH,OAAOxN,KAAKD,OAAO2qB,UAAUkyB,MAAM,QAAA,GAC/DU,UAAU,EAAEl3C,MAAM,SAASoH,OAAO,IAAI5I,EAAM8K,MAAM,QAAA,GAAWktC,MAAM,OAAA,GACnEW,OAAO,EAAEn3C,MAAM,QAAQoH,OAAAA,MAAaovC,MAAM,OAAA,EAAA;AAAA,EAE9C;AAAA,EAKQ,uBAAuBhnB;AAC7B,WAAOntB,OAAOoyC,QAAQjlB,EAAAA,EACnBze,IAAI,EAAE6J,IAAMw8B,EAAAA,MAAa,WAAWA,GAAQZ,QAAQ57B,EAAAA,GAAAA,EACpD9L,KAAK;EACV;AAAA,EAKA,eAAe8L,IAAcb,IAAAA;AAC3BngB,SAAKg8C,QAAQhsC,IAAIgR,IAAMb,EAAAA;AAAAA,EACzB;AAAA,EAKA,UAAUa,IAAAA;AACR,WAAOhhB,KAAKg8C,QAAQttC,IAAIsS,EAAAA;AAAAA,EAC1B;AAAA,EAKA,iBAAAy8B;AACE,WAAO31C,MAAM2wC,KAAKz4C,KAAKg8C,QAAQtzC,KAAAA,CAAAA;AAAAA,EACjC;AAAA,EAKA,MAAM9C,IAAwByiB,IAAAA;AAC5B,UAAMlI,KAASngB,KAAKg8C,QAAQttC,IAAI2Z,EAAAA;AAChC,QAAA,CAAKlI,GAEH,QAAO;AAIT,UAAMyV,KAA0C,CAAA;AAChD,eAAA,CAAYjtB,IAAK6E,OAAU/E,OAAOoyC,QAAQ16B,GAAOyV,QAAAA,EAC/CA,CAAAA,GAASjtB,MAAO,EAAA,GACX6E,IACHA,OAAOA,GAAMA,iBAAiB5I,EAAM8K,QAChClC,GAAMA,MAAMmpB,MAAAA,IACZnpB,GAAMA,MAAAA;AAKd,UAAM+jC,KAAYvxC,KAAK09C,aAAa93C,EAAAA;AACpC,QAAyB,MAArB2rC,GAAU3pC,OAAc,QAAO;AAGnC2pC,IAAAA,GAAUxpC,QAAQ4tB,CAAAA,OAAAA;AAChB31B,WAAK29C,sBAAsBhoB,IAAUC,IAAUzV,EAAAA;AAAAA,IAAAA,CAAAA;AAIjD,UAAM+C,KAA+B,EACnC0S,UAAAA,IACA3H,QAAQ,MAAA;AACF9N,MAAAA,GAAOs8B,WACTt8B,GAAOs8B,QAAQ7mB,IAAU,KAAA;AAAA,IAAA,GAG7BjP,SAAS;AACP3mB,WAAKkkB,OAAOte;;AAehB,WAVA5F,KAAKi8C,eAAejsC,IAAIpK,IAAQsd,EAAAA,GAG5B/C,GAAOs8B,WACTz8C,KAAKk8C,iBAAiBp7C,KAAK,EAAE8E,QAAAA,IAAQsd,YAAAA,GAAAA,CAAAA,GAIvCljB,KAAKU,OAAOqvB,KAAK,kBAAkB,EAAEnqB,QAAAA,IAAQg4C,YAAYv1B,OAElDnF;AAAAA,EACT;AAAA,EAKQ,sBACNyS,IACAC,IACAzV,IAAAA;AAEAwV,IAAAA,GAASE,QAAAA,GAETF,GAASkoB,kBAAmBC,CAAAA,OAAAA;AAE1B,kBAAYn1C,IAAK60C,EAAAA,KAAY/0C,OAAOoyC,QAAQjlB,EAAAA,EAC1CkoB,CAAAA,GAAOloB,SAASjtB,EAAAA,IAAO,EAAE6E,OAAOgwC,GAAQhwC,MAAAA;AAItC2S,MAAAA,GAAO88B,iBACTa,GAAOC,eAAeD,GAAOC,aAAa5oC,QACxC,iBACAgL,GAAO88B,YAAAA,IAKNa,GAAOC,aAAahsB,SAAS,kBAAA,MAChC+rB,GAAOC,eAAe,wBAAwBD,GAAOC,cACrDD,GAAOC,eAAeD,GAAOC,aAAa5oC,QACxC,iBACA,0BAAA,IAKJ2oC,GAAOE,iBAAiBF,GAAOE,eAAe7oC,QAC5C,qBACA;AAAA,EAAsBgL,GAAOm8B,UAAAA;AAAAA;AAAAA,EAAkCn8B,GAAO89B,YAAY,EAAA,EAAA,GAIpFH,GAAOE,iBAAiBF,GAAOE,eAAe7oC,QAC5C,iDACAgL,GAAOq8B,QAAAA;AAAAA,IAAAA,GAIX7mB,GAAS+c,cAAAA;AAAAA,EACX;AAAA,EAKA,OAAO9sC;AAEL,QAAA,CADmB5F,KAAKi8C,eAAevtC,IAAI9I,IAC1B;AAGC5F,SAAK09C,aAAa93C,EAAAA,EAC1BmC,QAAQ4tB,CAAAA;AAChBA,MAAAA,GAASkoB,kBAAkB,MAAA;AAAA,MAAA,GAC3BloB,GAASE,WACTF,GAAS+c,cAAAA;AAAAA;AAIX,UAAMwL,KAAYl+C,KAAKk8C,iBAAiBlsB,UAAU3oB,CAAAA,OAAKA,GAAEzB,WAAWA;AAChEs4C,IAAAA,KAAAA,MACFl+C,KAAKk8C,iBAAiB3mC,OAAO2oC,IAAW,CAAA,GAI1Cl+C,KAAKi8C,eAAe1D,OAAO3yC,KAG3B5F,KAAKU,OAAOqvB,KAAK,kBAAkB,EAAEnqB;EACvC;AAAA,EAKQ,aAAaA,IAAAA;AACnB,UAAM2rC,KAA8B,CAAA;AAapC,WAXA3rC,GAAO6gC,SAASlE,CAAAA;AACd,UAAKA,GAAqBx8B,QAAQ;AAChC,cAAMkwB,KAAOsM;AACTz6B,cAAMuC,QAAQ4rB,GAAKN,YACrB4b,GAAUzwC,KAAAA,GAAQm1B,GAAKN,QAAAA,IACdM,GAAKN,YACd4b,GAAUzwC,KAAKm1B,GAAKN,QAAAA;AAAAA,MAExB;AAAA,IAAA,CAAA,GAGK,IAAI,IAAIsc,IAAIV,EAAAA,CAAAA;AAAAA,EACrB;AAAA,wBQvgBK,cAAyBzxC;EAY9B,YAAYC;AACV2tB,UAAM,EAAA,GAAKnB,IAAAA,GAAwBxsB,GAAAA,CAAAA,GAZrCC,KAASghB,OAAO,QAGhBhhB,KAAQ2wC,aAAa,IAAIC,gBAGzB5wC,KAAQ6vC,gCAAgBC,OAGxB9vC,KAAQm+C,aAA2B;EAInC;AAAA,EAEU;AACRn+C,SAAKu6B,SAAAA,GACLv6B,KAAK6vC,UAAUgB,MAAAA;AAAAA,EACjB;AAAA,EAKA,MAAA,SAAevT;AAEb,UAAMoU,KAAS1xC,KAAK6vC,UAAUnhC,IAAI4uB,EAAAA;AAClC,WAAIoU,MAEG,IAAItgB,QAAQ,CAACE,IAASsM,OAAAA;AAC3B59B,WAAK2wC,WAAWzwB,KACdod,IACCqU,CAAAA,OAAAA;AACC3xC,aAAK6vC,UAAU7/B,IAAIstB,IAAKqU,EAAAA,GACxBrgB,GAAQqgB;iBAGV/T,EAAAA;AAAAA,IAAAA,CAAAA;AAAAA,EAGN;AAAA,EAKA,MAAA,mBAAyB79B,IAAAA;AACvB,UAAM4xC,WAAa3xC,KAAKo+C,SAASr+C,GAAOs+C,WAAWr+C,KAAKD,OAAOysB,cAAAA,GAEzD8L,KAAW,IAAIgmB,eAAav+C,GAAO+F,MAAM,EAC7C6rC,UACAzoB,MAAMnpB,GAAOmpB,QAAQlpB,KAAKD,OAAOwrB,aACjClqB,QAAQtB,GAAOsB,UAAUrB,KAAKD,OAAO0sB,eACrC8xB,eAAex+C,GAAOw+C,iBAAiB,IACvCxS,cAAchsC,GAAOgsC,uBACrByS,gBAAgBz+C,GAAOy+C,kBAAkB,KACzCC,WAAW1+C,GAAO0+C,aAAa,MAC/BC,aAAa3+C,GAAO2+C,eAAe,GACnCC,eAAe5+C,GAAO4+C,iBAAiB;AAOzC,WAHArmB,GAASsmB,sBACTtmB,GAAShO,OAAAA,GAEFgO;AAAAA,EACT;AAAA,EAKA,MAAA,eAAqBv4B,IAAAA;AACnB,UAAMu4B,KAAAA,MAAiBt4B,KAAK6+C,mBAAmB9+C,EAAAA;AAG/C,QAAI41B;AAEJ,YAAQ51B,GAAOqrB;MACb,KAAK;AACHuK,QAAAA,KAAW,IAAI/wB,EAAM0kC,kBAAkB,EACrC3iC,OAAO5G,GAAO4G,SAAS;AAEzB;AAAA,MACF,KAAK;AACHgvB,QAAAA,KAAW,IAAI/wB,EAAM4kC,kBAAkB,EACrC7iC,OAAO5G,GAAO4G,SAAS,SAAA,CAAA;AAEzB;AAAA,MAEF;AACEgvB,QAAAA,KAAW,IAAI/wB,EAAM+zB,qBAAqB,EACxChyB,OAAO5G,GAAO4G,SAAS;;AAK7B,UAAMsvB,KAAO,IAAIrxB,EAAMm0B,KAAKT,IAAU3C,EAAAA;AAQtC,WAPAM,GAAKjV,OAAOjhB,GAAO+F,MAGjBmwB,GAA0B6oB,aAAAA,MAC1B7oB,GAAa+J,WAAWjgC,GAAOs+C,WAAWr+C,KAAKD,OAAOysB,gBACtDyJ,GAAanwB,OAAO/F,GAAO+F,MAEtBmwB;AAAAA,EACT;AAAA,EAKA,MAAA,WAAiBl2B,IAAAA;AACf,UAAMk2B,WAAaj2B,KAAK++C,eAAeh/C;AAGvC,WAFAC,KAAKa,MAAM2lB,IAAIyP,EAAAA,GACfj2B,KAAKm+C,WAAWr9C,KAAKm1B,KACdA;AAAAA,EACT;AAAA,EAKA,MAAA,WAAiBA,IAAkB+oB,IAAAA;AACjC,UAAMX,KAAWpoB,GAAa+J,YAAYhgC,KAAKD,OAAOysB,gBAChDwhB,KAAc/X,GAAKqC,UAEnB2mB,KAAAA,MAAoBj/C,KAAK6+C,mBAAmB,EAChD/4C,MAAMk5C,IACNX,SAAAA,GAAAA,CAAAA;AAGFpoB,IAAAA,GAAKqC,WAAW2mB,IAChBhpB,GAAKjV,OAAOg+B,IACV/oB,GAAanwB,OAAOk5C,IAEtBhR,GAAYnY,QAAAA;AAAAA,EACd;AAAA,EAKA,gBAAAqpB;AACE,WAAOl/C,KAAKm+C;AAAAA,EACd;AAAA,EAKA,eAAeloB,IAAAA;AACb,UAAM3gB,KAAQtV,KAAKm+C,WAAWlpC,QAAQghB;AAClC3gB,IAAAA,KAAAA,OACFtV,KAAKa,MAAMqjB,OAAO+R,KAClBA,GAAKqC,SAASzC,WACV/tB,MAAMuC,QAAQ4rB,GAAKN,QAAAA,IACrBM,GAAKN,SAAS5tB,QAAQkoB,CAAAA,OAAKA,GAAE4F,QAAAA,CAAAA,IAE7BI,GAAKN,SAASE,QAAAA,GAEhB71B,KAAKm+C,WAAW5oC,OAAOD,IAAO,CAAA;AAAA,EAElC;AAAA,EAKA,WAAAilB;AACE,eAAWtE,MAAQj2B,KAAKm+C,WACtBn+C,MAAKa,MAAMqjB,OAAO+R,EAAAA,GAClBA,GAAKqC,SAASzC,QAAAA,GACV/tB,MAAMuC,QAAQ4rB,GAAKN,YACrBM,GAAKN,SAAS5tB,QAAQkoB,CAAAA,OAAKA,GAAE4F,aAE7BI,GAAKN,SAASE,QAAAA;AAGlB71B,SAAKm+C,aAAa,CAAA;AAAA,EACpB;AAAA,uClBnMK,cAAwCr+C;EAa7C,YAAYC,IAAAA;AACV2tB,UAAM,KAAKjrB,GAAAA,GAA6B1C,GAAAA,CAAAA,GAb1CC,KAASghB,OAAO,wBAChBhhB,KAAS26B,eAAe,CAAC,qBAMzB36B,KAAQypB,aAAsC;AAAA,EAO9C;AAAA,EAKA,IAAA;AACE,WAAOzpB,KAAKmzC;AAAAA,EACd;AAAA,EAKA,IAAA,SAAIvtC;AACF,WAAO5F,KAAKmzC,UAAUvtC;AAAAA,EACxB;AAAA,EAEU,YAAAvF;AACR,YAAMmB,QAAEA,IAAAC,UAAQA,IAAAZ,OAAUA,GAAAA,IAAUb,KAAKuB;AAEzCvB,SAAKmzC,YAAY,IAAIgM,EAAAA,kBAAkB39C,IAAQC,GAAS6O,aACxDtQ,KAAKmzC,UAAUnyB,OAAO,qBAGtBhhB,KAAKmzC,UAAU1M,SAAUlE,CAAAA,OAAAA;AACtBA,MAAAA,GAAc18B,sBAAAA;AAAAA,IAAsB,CAAA,GAGvChF,GAAM2lB,IAAIxmB,KAAKmzC,YAGfnzC,KAAKypB,aAAa,IAAI7kB,EAAM2qC,WAAW,IAAI3qC,EAAMwlB,QAAQ,QAAA,GACzDpqB,KAAKypB,WAAWzI,OAAO,cACvBhhB,KAAKypB,WAAWzjB,UAAAA,OAChBnF,GAAM2lB,IAAIxmB,KAAKypB,UAAAA,GAGfzpB,KAAKqzC,YAAYrzC,KAAKD,SAGtBC,KAAKmzC,UAAU1+B,iBAAiB,oBAAqB9S,CAAAA;;AAEnD,YAAMogC,MAAkB/hC,UAAK0B,kBAAL1B,mBAAoB0O,IAAI;AAC5CqzB,MAAAA,OACFA,GAAgB7Q,SAAS5tB,UAAAA,CAAW3B,GAAM6L,SAI5CxN,UAAKo/C,uBAALp/C,8BAA0B2B,GAAM6L,QAG5B7L,GAAM6L,QACRxN,KAAKU,OAAOqvB,KAAK,0BAA0B,EAAEnqB,QAAQ5F,KAAKmzC,UAAUvtC,OAAAA,CAAAA,IAEpE5F,KAAKU,OAAOqvB,KAAK,wBAAwB,EAAEnqB,QAAQ5F,KAAKmzC,UAAUvtC,OAAAA,CAAAA;AAAAA,IAAAA,CAAAA,GAKtE5F,KAAKmzC,UAAU1+B,iBAAiB,UAAU,MAAA;AACxC,UAAIzU,KAAKmzC,UAAUvtC,WACjB5F,KAAKU,OAAOqvB,KAAK,2BAA2B,EAAEnqB,QAAQ5F,KAAKmzC,UAAUvtC,WAGjE5F,KAAKypB,cAAczpB,KAAKmzC,UAAUvtC,SAAQ;AAC5C,cAAM2e,KAAM,IAAI3f,EAAMwlB,OAAOC,cAAcrqB,KAAKmzC,UAAUvtC,MAAAA;AAC1D5F,aAAKypB,WAAWlF,MAAMA,IACtBvkB,KAAKypB,WAAWzjB,UAAAA;AAAAA,MAClB;AAAA,IAAA,CAAA;AAAA,EAGN;AAAA,EAEU,cAAAzF;AACRP,SAAKo7B,OAAAA,GACLp7B,KAAKa,MAAMqjB,OAAOlkB,KAAKmzC,SAAAA,GACvBnzC,KAAKmzC,UAAUtd,QAAAA,GAEX71B,KAAKypB,eACPzpB,KAAKa,MAAMqjB,OAAOlkB,KAAKypB,UAAAA,GACvBzpB,KAAKypB,aAAa;AAAA,EAEtB;AAAA,EAKA,YAAY1pB;eACNA,GAAO2C,QACT1C,KAAKmzC,UAAUjX,QAAQn8B,GAAO2C,kBAE5B3C,GAAO4C,SACT3C,KAAKmzC,UAAUkM,SAASt/C,GAAO4C,KAAAA,GAAAA,WAE7B5C,GAAO6C,UACT5C,KAAKmzC,UAAUvwC,QAAQ7C,GAAO6C,QAAAA,WAE5B7C,GAAO8C,UACT7C,KAAKmzC,UAAUtwC,QAAQ9C,GAAO8C,QAAAA,WAE5B9C,GAAO+C,UACT9C,KAAKmzC,UAAUrwC,QAAQ/C,GAAO+C,QAAAA,WAE5B/C,GAAOgD,mBACT/C,KAAKmzC,UAAU1O,mBAAmB1kC,GAAOgD,6BAEvChD,GAAOiD,gBACThD,KAAKmzC,UAAUzO,gBAAgB3kC,GAAOiD,0BAEpCjD,GAAOkD,aACTjD,KAAKmzC,UAAUmM,aAAav/C,GAAOkD;EAEvC;AAAA,EAKA;AACE,WAAO,EACLP,MAAM1C,KAAKmzC,UAAUzwC,MACrBC,OAAO3C,KAAKmzC,UAAUxwC,OACtBC,OAAO5C,KAAKmzC,UAAUvwC,OACtBC,OAAO7C,KAAKmzC,UAAUtwC,OACtBC,OAAO9C,KAAKmzC,UAAUrwC,OACtBC,iBAAiB/C,KAAKmzC,UAAUpwC,iBAChCC,cAAchD,KAAKmzC,UAAUnwC,cAC7BC,WAAYjD,KAAKmzC,UAAkBlwC,aAAa,KAAA;AAAA,EAEpD;AAAA,EAKA,OAAO2C,IAAAA;AACL5F,SAAKmzC,UAAU1X,OAAO71B,EAAAA;AAAAA,EACxB;AAAA,EAKA,SAAAw1B;AACEp7B,SAAKmzC,UAAU/X,OAAAA,GACXp7B,KAAKypB,eACPzpB,KAAKypB,WAAWzjB,UAAAA;AAAAA,EAEpB;AAAA,EAKA,QAAQtD;AACN1C,SAAKmzC,UAAUjX,QAAQx5B,EAAAA;AAAAA,EACzB;AAAA,EAKA,SAASC,IAAAA;AACP3C,SAAKmzC,UAAUkM,SAAS18C;EAC1B;AAAA,EAKA,QAAQumB,IAAAA;AACNlpB,SAAKmzC,UAAUpgB,QAAQ7J;EACzB;AAAA,EAKA,WAAW5lB,IAAAA;AACTtD,SAAKmzC,UAAU7vC,UAAUA;AAAAA,EAC3B;AAAA,EAKA,eAAe0C,IAAAA;AACThG,SAAKypB,eACPzpB,KAAKypB,WAAWzjB,UAAUA;AAAAA,EAE9B;kDS7JK,SAA0BW,KAAgB,UAAA;AAC/C,QAAM4d,KAAM,IAAI3f,EAAMwlB,QAChBm1B,KAAS,IAAI36C,EAAM2qC,WAAWhrB,IAAK5d,EAAAA;AAGzC,SAFA44C,GAAOv+B,OAAO,cACdu+B,GAAOv5C,UAAAA,OACAu5C;AACT,6BNOO,SAAyB/9C,IAAAA;AAC9B,QAAM6D,KAAY,IAAIT,EAAMU;AAE5B,SAAO,EACLD,eAKA,cAAc1D,IAAmByD,IAAAA;AAC/B,UAAMD,KAAQT,EAAc/C;AAE5B,WADA0D,GAAUE,cAAcJ,IAAO3D,EAAAA,GACxB6D,GAAUG,iBAAiBJ,IAAAA;EACpC,GAKA,SAASwnB,IAAcC,IAAAA;AACrBxnB,IAAAA,GAAUunB,OAAOA,IACjBvnB,GAAUwnB,MAAMA;AAAAA,EAClB,EAAA;AAEJ,sBK7DO,SAAkB2yB;AACvB,SAAOA,MAAWp9C,KAAKC,KAAK;AAC9B,qFCbO,SAA2BuD,IAAwBxB,KAAgB,KAAA;AACxE,UAAMkmB,QAAEA,IAAApd,KAAQA,GAAAA,IAAQid,GAAcvkB;AAItC,SAAO,EAAEyM,UAFQqX,GAAmBY,IAAQpd,IAD3B,IAAItI,EAAMklB,UAAUC,WAAW7c,IAAKod,EAAAA,EAAQ1iB,OAAAA,IAAWxD,KAGrDO,QAAQ2lB,GAAAA;AAC7B,mCDxBO,SACLX,IACAC,IACAxlB,KAAgB,KAAA;AAEhB,QAAMylB,KAAWF,GAAO81B,WAAW71B,EAAAA;AAEnC,SADkB,IAAIhlB,EAAMklB,UAAUC,WAAWH,IAAQD,IAAQK,UAAAA,EAChDC,eAAeJ,KAAWzlB,EAAAA,EAAOoiB,IAAImD;AACxD,wDCwBO,SAAwB/jB,IAAwB+zC,KAAc,IAAA;AACnE,QAAA,EAAMrvB,QAAEA,IAAApd,KAAQA,IAAAD,KAAKA,YAAKjJ,GAAAA,IAAWmmB,GAAcvkB,EAAAA,GAG7CikB,KAAW7lB,KAAS5B,KAAKs9C,IAAK/F,KAAMv3C,KAAKC,KAAM,GAAA;AAErD,SAAO,EACLs9C,WAAW,IAAI/6C,EAAMklB,QAAQQ,GAAOnX,GAAGmX,GAAOjX,GAAGnG,GAAImf,IAAIxC,KACzD+1B,UAAU,IAAIh7C,EAAMklB,QAAQQ,GAAOnX,GAAGmX,GAAOjX,GAAGpG,GAAIof,IAAIxC,EAAAA,GACxDg2B,UAAU,IAAIj7C,EAAMklB,QAAQ7c,GAAIkG,IAAI0W,IAAUS,GAAOjX,GAAGiX,GAAO+B,CAAAA,GAC/DyzB,WAAW,IAAIl7C,EAAMklB,QAAQ5c,GAAIiG,IAAI0W,IAAUS,GAAOjX,GAAGiX,GAAO+B,CAAAA,GAChE0zB,SAAS,IAAIn7C,EAAMklB,QAAQQ,GAAOnX,GAAGjG,GAAImG,IAAIwW,IAAUS,GAAO+B,CAAAA,GAC9D2zB,YAAY,IAAIp7C,EAAMklB,QAAQQ,GAAOnX,GAAGlG,GAAIoG,IAAIwW,IAAUS,GAAO+B,CAAAA,GACjE1nB,QAAQ2lB;AAEZ,8HNlCO,SAAoC3oB,IAAmBiiB,IAAAA;AAC5D,QAAMyX,KAAOzX,GAAU5J;AACvB,SAAO,IAAIpV,EAAMC,SACblD,GAAMuR,UAAUmoB,GAAK/oB,QAAQ+oB,GAAKj6B,QAAS,IAAI,GAAA,EAC9CO,GAAMyR,UAAUioB,GAAK7oB,OAAO6oB,GAAKh6B,SAAU,IAAI;AAEtD,kBK+BO,SAAcywB,IAAemuB,IAAanzC,IAAAA;AAC/C,SAAOglB,MAASmuB,KAAMnuB,MAAShlB;AACjC,yGAhBO,SAAkBozC;AACvB,SAAOA,MAAW,MAAM99C,KAAKC;AAC/B,oDAmBO,SAAoB89C,IAAeC,IAAejtC,IAAAA;AACvD,QAAMrG,KAAIod,IAAO/W,KAAIgtC,OAAUC,KAAQD,KAAQ,GAAG,CAAA;AAClD,SAAOrzC,KAAIA,MAAK,IAAI,IAAIA;AAC1B;","x_google_ignoreList":[7]}