@mml-io/3d-web-client-core 0.5.0 → 0.6.1
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.
- package/build/character/CharacterTooltip.d.ts +0 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +696 -335
- package/build/index.js.map +4 -4
- package/build/rendering/composer.d.ts +9 -2
- package/build/sun/Sun.d.ts +18 -0
- package/build/tweakpane/TweakPane.d.ts +7 -1
- package/build/tweakpane/envSettings.d.ts +40 -0
- package/build/tweakpane/sunSettings.d.ts +31 -0
- package/package.json +3 -3
package/build/index.js.map
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"version": 3,
|
3
|
-
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/tweakpane/tweakPaneActivity.ts", "../src/character/Character.ts", "../src/character/CharacterModel.ts", "../src/character/CharacterMaterial.ts", "../src/rendering/shaders/bayer-dither.ts", "../src/rendering/shaders/shader-helpers.ts", "../src/tweakpane/characterSettings.ts", "../src/character/CharacterState.ts", "../src/character/ModelLoader.ts", "../src/character/CharacterTooltip.ts", "../src/character/CanvasText.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/rendering/composer.ts", "../src/tweakpane/composerSettings.ts", "../src/tweakpane/TweakPane.ts", "../src/rendering/post-effects/bright-contrast-sat.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
-
"sourcesContent": ["import { PerspectiveCamera, Raycaster, Vector3 } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, remap, clamp } from \"../helpers/math-helpers\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n\n public initialDistance: number = 2.5;\n\n private minDistance: number = 0.1;\n private maxDistance: number = 6;\n\n private initialFOV: number = 80;\n private fov: number = this.initialFOV;\n private minFOV: number = 63;\n private maxFOV: number = 85;\n private targetFOV: number = this.initialFOV;\n\n private minPolarAngle: number = Math.PI * 0.25;\n private maxPolarAngle: number = Math.PI * 0.95;\n\n private dampingFactor: number = 0.091;\n\n public targetDistance: number = this.initialDistance;\n private distance: number = this.initialDistance;\n\n private targetPhi: number | null = Math.PI / 2;\n private phi: number | null = Math.PI / 2;\n private targetTheta: number | null = -Math.PI / 2;\n private theta: number | null = -Math.PI / 2;\n private dragging: boolean = false;\n\n private target: Vector3 = new Vector3(0, 1.55, 0);\n\n private hadTarget: boolean = false;\n\n private rayCaster: Raycaster;\n\n constructor(private collisionsManager: CollisionsManager) {\n this.camera = new PerspectiveCamera(this.fov, window.innerWidth / window.innerHeight, 0.1, 400);\n this.camera.position.set(0, 1.4, -this.initialDistance);\n\n this.rayCaster = new Raycaster();\n\n document.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n document.addEventListener(\"mouseup\", this.onMouseUp.bind(this));\n document.addEventListener(\"mousemove\", this.onMouseMove.bind(this));\n document.addEventListener(\"wheel\", this.onMouseWheel.bind(this));\n window.addEventListener(\"resize\", this.onResize.bind(this));\n }\n\n private onResize(): void {\n const width = window.innerWidth;\n const height = window.innerHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n private onMouseDown(_event: MouseEvent): void {\n this.dragging = true;\n }\n\n private onMouseUp(_event: MouseEvent): void {\n this.dragging = false;\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (!this.dragging || getTweakpaneActive() === true) return;\n if (this.targetTheta === null || this.targetPhi === null) return;\n this.targetTheta += event.movementX * 0.01;\n this.targetPhi -= event.movementY * 0.01;\n this.targetPhi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.targetPhi));\n }\n\n private onMouseWheel(event: WheelEvent): void {\n const scrollAmount = event.deltaY * 0.001;\n this.targetDistance += scrollAmount;\n this.targetDistance = Math.max(\n this.minDistance,\n Math.min(this.maxDistance, this.targetDistance),\n );\n }\n\n public setTarget(target: Vector3): void {\n this.target.copy(target);\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n private reverseUpdateFromPositions(): void {\n if (this.phi === null || this.theta == null) return;\n const dx = this.camera.position.x - this.target.x;\n const dy = this.camera.position.y - this.target.y;\n const dz = this.camera.position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.targetTheta = (this.theta + 2 * Math.PI) % (2 * Math.PI);\n this.targetPhi = Math.max(0, Math.min(Math.PI, this.phi));\n this.phi = this.targetPhi;\n this.theta = this.targetTheta;\n this.distance = this.targetDistance;\n }\n\n public adjustCameraPosition(): void {\n this.rayCaster.set(\n this.camera.position,\n this.target.clone().sub(this.camera.position).normalize(),\n );\n const minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n const cameraToPlayerDistance = this.camera.position.distanceTo(this.target);\n\n if (minimumDistance !== null && minimumDistance <= cameraToPlayerDistance) {\n this.targetDistance = cameraToPlayerDistance - minimumDistance;\n this.distance = this.targetDistance;\n }\n }\n\n public update(): void {\n if (this.target === null) return;\n if (\n this.phi !== null &&\n this.targetPhi !== null &&\n this.theta !== null &&\n this.targetTheta !== null\n ) {\n this.distance += (this.targetDistance - this.distance) * this.dampingFactor * 0.21;\n this.phi += (this.targetPhi - this.phi) * this.dampingFactor;\n this.theta += (this.targetTheta - this.theta) * this.dampingFactor;\n\n const x = this.target.x + this.distance * Math.sin(this.phi) * Math.cos(this.theta);\n const y = this.target.y + this.distance * Math.cos(this.phi);\n const z = this.target.z + this.distance * Math.sin(this.phi) * Math.sin(this.theta);\n\n this.targetFOV = remap(\n this.targetDistance,\n this.minDistance,\n this.maxDistance,\n this.minFOV,\n this.maxFOV,\n );\n\n this.fov += ease(this.targetFOV, this.fov, 0.07);\n this.camera.fov = this.fov;\n this.camera.updateProjectionMatrix();\n this.camera.updateMatrixWorld();\n\n this.camera.position.set(x, clamp(y, 0.1, Infinity), z);\n\n this.adjustCameraPosition();\n\n this.camera.lookAt(this.target);\n }\n }\n}\n", "import { Vector3 } from \"three\";\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vector3 => {\n if (id > 0) id += 3;\n const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n const theta = id * goldenAngle;\n const scale = id / positions;\n const scaledRadius = scale * radius;\n const x = Math.cos(theta) * scaledRadius;\n const z = Math.sin(theta) * scaledRadius;\n return new Vector3(x, yPos, z);\n};\n\nexport const round = (n: number, digits: number): number => {\n return Number(n.toFixed(digits));\n};\n\nexport const ease = (target: number, n: number, factor: number): number => {\n return round((target - n) * factor, 5);\n};\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport const remap = (\n value: number,\n minValue: number,\n maxValue: number,\n minScaledValue: number,\n maxScaledValue: number,\n): number => {\n return (\n minScaledValue +\n ((maxScaledValue - minScaledValue) * (value - minValue)) / (maxValue - minValue)\n );\n};\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { CharacterTooltip } from \"./CharacterTooltip\";\nimport { LocalController } from \"./LocalController\";\n\nexport type CharacterDescription = {\n meshFileUrl: string;\n idleAnimationFileUrl: string;\n jogAnimationFileUrl: string;\n sprintAnimationFileUrl: string;\n airAnimationFileUrl: string;\n modelScale: number;\n};\n\nexport class Character {\n public controller: LocalController | null = null;\n\n public name: string | null = null;\n public model: CharacterModel | null = null;\n public color: Color = new Color();\n\n public position: Vector3 = new Vector3();\n\n public tooltip: CharacterTooltip | null = null;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly id: number,\n private readonly isLocal: boolean,\n private readonly modelLoadedCallback: () => void,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription);\n await this.model.init();\n if (this.tooltip === null) {\n this.tooltip = new CharacterTooltip(this.model.mesh!);\n }\n this.color = this.model.material.colorsCube216[this.id];\n if (this.isLocal) {\n this.controller = new LocalController(\n this.model,\n this.id,\n this.collisionsManager,\n this.keyInputManager,\n this.cameraManager,\n this.timeManager,\n );\n }\n this.modelLoadedCallback();\n }\n\n public update(time: number) {\n if (!this.model) return;\n if (this.tooltip) {\n this.tooltip.update(this.cameraManager.camera);\n }\n this.model.mesh!.getWorldPosition(this.position);\n if (typeof this.model.material.uniforms.time !== \"undefined\") {\n this.model.material.uniforms.time.value = time;\n this.model.material.uniforms.diffuseRandomColor.value = this.color;\n this.model.material.update();\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { AnimationState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class CharacterModel {\n /* TODO: pick between below eager instantiation or ModelLoader.getInstance() lazy one */\n private modelLoader = MODEL_LOADER;\n\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(private readonly characterDescription: CharacterDescription) {}\n\n public async init(): Promise<void> {\n await this.loadMainMesh();\n await this.setAnimationFromFile(\n this.characterDescription.idleAnimationFileUrl,\n AnimationState.idle,\n );\n await this.setAnimationFromFile(\n this.characterDescription.jogAnimationFileUrl,\n AnimationState.walking,\n );\n await this.setAnimationFromFile(\n this.characterDescription.sprintAnimationFileUrl,\n AnimationState.running,\n );\n await this.setAnimationFromFile(\n this.characterDescription.airAnimationFileUrl,\n AnimationState.air,\n );\n this.applyMaterialToAllSkinnedMeshes(this.material);\n }\n\n public updateAnimation(targetAnimation: AnimationState, deltaTime: number) {\n if (this.currentAnimation !== targetAnimation) {\n this.transitionToAnimation(targetAnimation);\n }\n this.animationMixer?.update(deltaTime);\n }\n\n public hideMaterialByMeshName(meshName: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\" && child.name === meshName) {\n (child as Mesh).material = new MeshStandardMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0,\n });\n }\n });\n }\n\n private setShadows(\n mesh: Object3D,\n castShadow: boolean = true,\n receiveShadow: boolean = true,\n ): void {\n mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n child.castShadow = castShadow;\n child.receiveShadow = receiveShadow;\n }\n });\n }\n\n private applyMaterialToAllSkinnedMeshes(material: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n (child as Mesh).material = material;\n }\n });\n }\n\n private initAnimationMixer() {\n if (this.animationMixer !== null || this.mesh === null) return;\n this.animationMixer = new AnimationMixer(this.mesh);\n }\n\n private async loadMainMesh(): Promise<void> {\n const mainMeshUrl = this.characterDescription.meshFileUrl;\n const scale = this.characterDescription.modelScale;\n const extension = mainMeshUrl.split(\".\").pop();\n const name = mainMeshUrl.split(\"/\").pop()!.replace(`.${extension}`, \"\");\n const mainMesh = await this.modelLoader.load(mainMeshUrl, \"model\");\n if (typeof mainMesh !== \"undefined\") {\n this.mesh = new Object3D();\n const model = mainMesh as Object3D;\n model.position.set(0, -0.4, 0);\n this.mesh.add(model);\n this.mesh.name = name;\n this.mesh.scale.set(scale, scale, scale);\n this.setShadows(this.mesh);\n }\n }\n\n private async setAnimationFromFile(\n animationFileUrl: string,\n animationType: AnimationState,\n ): Promise<void> {\n return new Promise(async (resolve, reject) => {\n this.initAnimationMixer();\n const animation = await this.modelLoader.load(animationFileUrl, \"animation\");\n if (typeof animation !== \"undefined\" && animation instanceof AnimationClip) {\n this.animations[animationType] = this.animationMixer!.clipAction(animation);\n this.animations[animationType].stop();\n if (animationType === AnimationState.idle) {\n this.animations[animationType].play();\n }\n resolve();\n } else {\n reject(`failed to load ${animationType} from ${animationFileUrl}`);\n }\n });\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (!this.mesh || this.currentAnimation === null) return;\n\n const currentAction = this.animations[this.currentAnimation];\n const targetAction = this.animations[targetAnimation];\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n currentAction.fadeOut(transitionDuration);\n }\n\n if (!targetAction.isRunning()) targetAction.play();\n\n targetAction.setLoop(LoopRepeat, Infinity);\n targetAction.enabled = true;\n targetAction.fadeIn(transitionDuration);\n\n this.currentAnimation = targetAnimation;\n }\n}\n", "import { Color, MeshPhysicalMaterial, UniformsUtils } from \"three\";\n\nimport { bayerDither } from \"../rendering/shaders/bayer-dither\";\nimport {\n injectBefore,\n injectBeforeMain,\n injectInsideMain,\n} from \"../rendering/shaders/shader-helpers\";\nimport { characterValues } from \"../tweakpane/characterSettings\";\n\ntype TUniform<TValue = any> = { value: TValue };\n\nexport class CharacterMaterial extends MeshPhysicalMaterial {\n public uniforms: Record<string, TUniform> = {};\n public colorsCube216: Color[] = [];\n\n constructor() {\n super();\n this.color = new Color(0xffffff);\n this.transmission = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\n\n this.onBeforeCompile = (shader) => {\n this.uniforms = UniformsUtils.clone(shader.uniforms);\n this.uniforms.nearClip = { value: 0.01 };\n this.uniforms.farClip = { value: 1000.0 };\n this.uniforms.ditheringNear = { value: 0.25 };\n this.uniforms.ditheringRange = { value: 0.5 };\n this.uniforms.time = { value: 0.0 };\n this.uniforms.diffuseRandomColor = { value: new Color() };\n shader.uniforms = this.uniforms;\n\n shader.vertexShader = injectBeforeMain(shader.vertexShader, \"varying vec2 vUv;\");\n shader.vertexShader = injectInsideMain(shader.vertexShader, \"vUv = uv;\");\n\n shader.fragmentShader = injectBeforeMain(\n shader.fragmentShader,\n /* glsl */ `\n //#define showPattern\n varying vec2 vUv;\n uniform float nearClip;\n uniform float farClip;\n uniform float ditheringNear;\n uniform float ditheringRange;\n uniform float time;\n uniform vec3 diffuseRandomColor;\n ${bayerDither}\n\n #ifdef showPattern\n vec2 rand2(vec2 p) {\n return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077)));\n }\n float voronoi(in vec2 x) {\n vec2 p = floor(x);\n vec2 f = fract(x);\n float minDistance = 1.0;\n for(int j = -1; j <= 1; j ++)\n for(int i = -1; i <= 1; i ++) {\n vec2 b = vec2(i, j);\n vec2 rand = 0.5 + 0.5 * sin(time * 1.5 + 12.0 * rand2(p + b));\n vec2 r = vec2(b) - f + rand;\n minDistance = min(minDistance, length(r));\n }\n return minDistance;\n }\n #endif\n `,\n );\n\n shader.fragmentShader = injectBefore(\n shader.fragmentShader,\n \"#include <output_fragment>\",\n /* glsl */ `\n float distance = length(vWorldPosition - cameraPosition);\n float normalizedDistance = (distance - nearClip) / (farClip - nearClip);\n ivec2 p = ivec2(mod(gl_FragCoord.xy, 8.0));\n float d = 0.0;\n if (p.x <= 3 && p.y <= 3) {\n d = bayerDither(bayertl, p);\n } else if (p.x > 3 && p.y <= 3) {\n d = bayerDither(bayertr, p - ivec2(4, 0));\n } else if (p.x <= 3 && p.y > 3) {\n d = bayerDither(bayerbl, p - ivec2(0, 4));\n } else if (p.x > 3 && p.y > 3) {\n d = bayerDither(bayerbr, p - ivec2(4, 4));\n }\n if (distance <= ditheringNear + d * ditheringRange) discard;\n\n vec2 uv = vUv;\n float s = clamp(0.35 + 0.35 * sin(5.0 * -time + vUv.y * 600.0), 0.0, 1.0);\n float scanLines = pow(s, 1.33);\n\n outgoingLight *= diffuseRandomColor;\n\n #ifdef showPattern\n float val = pow(voronoi(uv * 8.0) * 1.2, 0.5);\n float thickness = 1.0 / 500.0;\n vec2 g = step(mod(uv, 0.015), vec2(thickness));\n float a = 1.0 - clamp(val * (g.x + g.y), 0.0, 1.0);\n vec3 grid = vec3(smoothstep(0.01, 0.0, a) * 1.15) * diffuseRandomColor;\n outgoingLight += grid;\n #endif\n\n outgoingLight += smoothstep(0.1, 0.0, scanLines) * 0.1;\n `,\n );\n };\n\n this.generateColorCube();\n }\n\n private generateColorCube() {\n const saturation = 0.4;\n const lightness = 0.7;\n const goldenRatioConjugate = 0.618033988749895;\n let hue = 0;\n\n for (let i = 0; i < 216; i++) {\n const color = new Color();\n color.setHSL(hue, saturation, lightness);\n this.colorsCube216.push(color);\n hue = (hue + goldenRatioConjugate) % 1;\n }\n }\n\n public update() {\n this.transmission = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\n }\n}\n", "export const bayerDither: string = /* glsl */ `\nconst mat4 bayertl = mat4( \n 0.0 / 64.0, 32.0 / 64.0, 8.0 / 64.0, 40.0 / 64.0,\n 48.0 / 64.0, 16.0 / 64.0, 56.0 / 64.0, 24.0 / 64.0,\n 12.0 / 64.0, 44.0 / 64.0, 4.0 / 64.0, 36.0 / 64.0,\n 60.0 / 64.0, 28.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0\n);\n\nconst mat4 bayertr = mat4( \n 2.0 / 64.0, 34.0 / 64.0, 10.0 / 64.0, 42.0 / 64.0,\n 50.0 / 64.0, 18.0 / 64.0, 58.0 / 64.0, 26.0 / 64.0,\n 14.0 / 64.0, 46.0 / 64.0, 6.0 / 64.0, 38.0 / 64.0,\n 62.0 / 64.0, 30.0 / 64.0, 54.0 / 64.0, 22.0 / 64.0\n);\n\nconst mat4 bayerbl = mat4( \n 3.0 / 64.0, 35.0 / 64.0, 11.0 / 64.0, 43.0 / 64.0,\n 51.0 / 64.0, 19.0 / 64.0, 59.0 / 64.0, 27.0 / 64.0,\n 15.0 / 64.0, 47.0 / 64.0, 7.0 / 64.0, 39.0 / 64.0,\n 63.0 / 64.0, 31.0 / 64.0, 55.0 / 64.0, 23.0 / 64.0\n);\n\nconst mat4 bayerbr = mat4( \n 1.0 / 64.0, 33.0 / 64.0, 9.0 / 64.0, 41.0 / 64.0,\n 49.0 / 64.0, 17.0 / 64.0, 57.0 / 64.0, 25.0 / 64.0,\n 13.0 / 64.0, 45.0 / 64.0, 5.0 / 64.0, 37.0 / 64.0,\n 61.0 / 64.0, 29.0 / 64.0, 53.0 / 64.0, 21.0 / 64.0\n);\n\nfloat bayerDither(mat4 m, ivec2 p) {\n if (p.y == 0) {\n if (p.x == 0) { return m[0][0]; }\n else if (p.x == 1) { return m[1][0]; }\n else if (p.x == 2) { return m[2][0]; }\n else { return m[3][0]; }\n } else if (p.y == 1) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][1]; }\n else if (p.x == 2) { return m[2][1]; }\n else { return m[3][1]; }\n } else if (p.y == 2) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][2]; }\n else if (p.x == 2) { return m[2][2]; }\n else { return m[3][2]; }\n } else {\n if (p.x == 0) { return m[0][3]; }\n else if (p.x == 1) { return m[1][3]; }\n else if (p.x == 2) { return m[2][3]; }\n else { return m[3][3]; }\n }\n}\n`;\n", "export function injectBeforeMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `\n\n${codeToInject}\n\nvoid main() {`,\n );\n}\n\nexport function injectInsideMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `void main() {\n\n${codeToInject}\n\n `,\n );\n}\n\nexport function injectBefore(shaderSource: string, before: string, codeToInject: string): string {\n return shaderSource.replace(\n before,\n `\n${codeToInject}\n\n${before}\n `,\n );\n}\n\nexport function injectAfter(shaderSource: string, after: string, codeToInject: string): string {\n return shaderSource.replace(\n after,\n `\n${after}\n\n${codeToInject}\n\n `,\n );\n}\n", "export const characterValues = {\n material: {\n transmission: 1,\n metalness: 0.8,\n roughness: 0.12,\n ior: 1.5,\n thickness: 0.1,\n specularColor: { r: 1.0, g: 1.0, b: 1.0 },\n specularIntensity: 0.1,\n emissive: { r: 1.0, g: 1.0, b: 1.0 },\n emissiveIntensity: 0.1,\n envMapIntensity: 1.0,\n sheenColor: { r: 1.0, g: 1.0, b: 1.0 },\n sheen: 0.5,\n clearcoat: 0.0,\n clearcoatRoughness: 0.0,\n },\n};\n\nexport const characterOptions = {\n material: {\n transmission: { min: 0.01, max: 3, step: 0.01 },\n metalness: { min: 0, max: 1, step: 0.01 },\n roughness: { min: 0, max: 1, step: 0.01 },\n ior: { min: 0, max: 5, step: 0.01 },\n thickness: { min: 0, max: 1, step: 0.01 },\n specularIntensity: { min: 0, max: 1, step: 0.01 },\n emissiveIntensity: { min: 0, max: 1, step: 0.01 },\n envMapIntensity: { min: 0, max: 1, step: 0.01 },\n sheen: { min: 0, max: 1, step: 0.01 },\n clearcoat: { min: 0, max: 1, step: 0.01 },\n clearcoatRoughness: { min: 0, max: 1, step: 0.01 },\n },\n};\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n}\n\nexport type CharacterState = {\n id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import { AnimationClip, LoadingManager, Object3D } from \"three\";\nimport { GLTF, GLTFLoader as ThreeGLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nclass CachedGLTFLoader extends ThreeGLTFLoader {\n private blobCache: Map<string, string>;\n\n constructor(manager?: LoadingManager) {\n super(manager);\n this.blobCache = new Map();\n }\n\n setBlobUrl(originalUrl: string, blobUrl: string) {\n this.blobCache.set(originalUrl, blobUrl);\n }\n\n getBlobUrl(originalUrl: string): string | undefined {\n return this.blobCache.get(originalUrl);\n }\n\n load(\n url: string,\n onLoad: (gltf: GLTF) => void,\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\n onError?: ((event: ErrorEvent) => void) | undefined,\n ): void {\n const blobUrl = this.getBlobUrl(url);\n if (blobUrl) {\n console.log(`Loading cached ${url.split(\"/\").pop()}`);\n super.load(blobUrl, onLoad, onProgress, onError);\n } else {\n super.load(url, onLoad, onProgress, onError);\n }\n }\n}\n\nclass LRUCache<K, V> {\n private maxSize: number;\n private cache: Map<K, V>;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key: K): V | undefined {\n const item = this.cache.get(key);\n if (item) {\n this.cache.delete(key);\n this.cache.set(key, item);\n }\n return item;\n }\n\n set(key: K, value: V): void {\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n }\n}\n\ninterface CachedModel {\n blob: Blob;\n originalExtension: string;\n}\n\nexport class ModelLoader {\n private static instance: ModelLoader | null = null;\n\n private readonly loadingManager: LoadingManager;\n private readonly gltfLoader: CachedGLTFLoader;\n private modelCache: LRUCache<string, CachedModel>;\n private ongoingLoads: Map<string, Promise<Object3D | AnimationClip | undefined>> = new Map();\n\n constructor(maxCacheSize: number = 100) {\n this.loadingManager = new LoadingManager();\n this.gltfLoader = new CachedGLTFLoader(this.loadingManager);\n this.modelCache = new LRUCache(maxCacheSize);\n }\n\n /* TODO: decide between below lazy initialization or eager on this file's bottom export */\n static getInstance(): ModelLoader {\n if (!ModelLoader.instance) {\n ModelLoader.instance = new ModelLoader();\n }\n return ModelLoader.instance;\n }\n\n async load(\n fileUrl: string,\n fileType: \"model\" | \"animation\",\n ): Promise<Object3D | AnimationClip | undefined> {\n const cachedModel = this.modelCache.get(fileUrl);\n\n if (cachedModel) {\n const blobURL = URL.createObjectURL(cachedModel.blob);\n this.gltfLoader.setBlobUrl(fileUrl, blobURL);\n return this.loadFromUrl(fileUrl, fileType, cachedModel.originalExtension);\n } else {\n console.log(`Loading ${fileUrl} from server`);\n const ongoingLoad = this.ongoingLoads.get(fileUrl);\n if (ongoingLoad) return ongoingLoad;\n\n const loadPromise = fetch(fileUrl)\n .then((response) => response.blob())\n .then((blob) => {\n const originalExtension = fileUrl.split(\".\").pop() || \"\";\n this.modelCache.set(fileUrl, { blob, originalExtension });\n const blobURL = URL.createObjectURL(blob);\n this.ongoingLoads.delete(fileUrl);\n return this.loadFromUrl(blobURL, fileType, originalExtension);\n });\n\n this.ongoingLoads.set(fileUrl, loadPromise);\n return loadPromise;\n }\n }\n\n private async loadFromUrl(\n url: string,\n fileType: \"model\" | \"animation\",\n extension: string,\n ): Promise<Object3D | AnimationClip | undefined> {\n if ([\"gltf\", \"glb\"].includes(extension)) {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (object: GLTF) => {\n if (fileType === \"model\") {\n resolve(object.scene as Object3D);\n } else if (fileType === \"animation\") {\n resolve(object.animations[0] as AnimationClip);\n } else {\n const error = `Trying to load unknown ${fileType} type of element from file ${url}`;\n console.error(error);\n reject(error);\n }\n },\n undefined,\n (error) => {\n console.error(`Error loading GL(B|TF) from ${url}: ${error}`);\n reject(error);\n },\n );\n });\n } else {\n console.error(`Error: can't recognize ${url} extension: ${extension}`);\n }\n }\n}\n\n/* TODO: decide between below eager initialization or static getInstance() lazy one */\nconst MODEL_LOADER = ModelLoader.getInstance();\nexport default MODEL_LOADER;\n", "import {\n Camera,\n CanvasTexture,\n Color,\n FrontSide,\n LinearFilter,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n PlaneGeometry,\n} from \"three\";\n\nimport { THREECanvasTextTexture } from \"./CanvasText\";\n\nenum LabelAlignment {\n left = \"left\",\n center = \"center\",\n right = \"right\",\n}\n\nconst fontScale = 5;\nconst defaultLabelColor = new Color(0x000000);\nconst defaultFontColor = new Color(0xffffff);\nconst defaultLabelAlignment = LabelAlignment.center;\nconst defaultLabelFontSize = 9;\nconst defaultLabelPadding = 0;\nconst defaultLabelWidth = 0.25;\nconst defaultLabelHeight = 0.125;\nconst defaultLabelCastShadows = true;\n\nexport class CharacterTooltip {\n private texture: CanvasTexture;\n\n private geometry: PlaneGeometry;\n private material: MeshBasicMaterial;\n private mesh: Mesh<PlaneGeometry, MeshBasicMaterial>;\n\n private visibleOpacity: number = 0.85;\n private targetOpacity: number = 0;\n private fadingSpeed: number = 0.02;\n private secondsToFadeOut: number = 15;\n\n private props = {\n content: \"\",\n alignment: defaultLabelAlignment,\n width: defaultLabelWidth,\n height: defaultLabelHeight,\n fontSize: defaultLabelFontSize,\n padding: defaultLabelPadding,\n color: defaultLabelColor,\n fontColor: defaultFontColor,\n castShadows: defaultLabelCastShadows,\n };\n\n constructor(parentModel: Object3D) {\n this.setText = this.setText.bind(this);\n this.material = new MeshBasicMaterial({\n map: this.texture,\n transparent: true,\n opacity: 0,\n });\n this.material.side = FrontSide;\n this.geometry = new PlaneGeometry(1, 1, 1, 1);\n this.mesh = new Mesh(this.geometry, this.material);\n this.mesh.position.set(0, 1.6, 0);\n this.mesh.visible = false;\n parentModel.add(this.mesh);\n }\n\n private redrawText(content: string) {\n if (!this.material) {\n return;\n }\n if (this.material.map) {\n this.material.map.dispose();\n }\n const { texture, width, height } = THREECanvasTextTexture(content, {\n bold: true,\n fontSize: this.props.fontSize * fontScale,\n paddingPx: this.props.padding,\n textColorRGB255A1: {\n r: this.props.fontColor.r * 255,\n g: this.props.fontColor.g * 255,\n b: this.props.fontColor.b * 255,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: this.props.color.r * 255,\n g: this.props.color.g * 255,\n b: this.props.color.b * 255,\n a: 1.0,\n },\n dimensions: {\n width: this.props.width * (100 * fontScale),\n height: this.props.height * (100 * fontScale),\n },\n alignment: this.props.alignment,\n });\n\n this.material.map = texture;\n this.material.map.magFilter = LinearFilter;\n this.material.map.minFilter = LinearFilter;\n this.material.needsUpdate = true;\n\n this.mesh.scale.x = width / (100 * fontScale);\n this.mesh.scale.y = height / (100 * fontScale);\n this.mesh.position.y = 1.6;\n }\n\n setText(text: string, temporary: boolean = false) {\n this.redrawText(text);\n this.mesh.visible = true;\n this.targetOpacity = this.visibleOpacity;\n if (temporary) {\n setTimeout(() => {\n this.hide();\n }, this.secondsToFadeOut * 1000);\n }\n }\n\n hide() {\n this.targetOpacity = 0;\n }\n\n update(camera: Camera) {\n this.mesh.lookAt(camera.position);\n const opacity = this.mesh.material.opacity;\n if (opacity < this.targetOpacity) {\n this.mesh.material.opacity = Math.min(\n this.mesh.material.opacity + this.fadingSpeed,\n this.targetOpacity,\n );\n } else if (opacity > this.targetOpacity) {\n this.mesh.material.opacity = Math.max(\n this.mesh.material.opacity - this.fadingSpeed,\n this.targetOpacity,\n );\n if (opacity >= 1 && this.mesh.material.transparent === true) {\n this.mesh.material.transparent = false;\n this.mesh.material.needsUpdate = true;\n } else if (opacity > 0 && opacity < 1 && this.mesh.material.transparent === false) {\n this.mesh.material.transparent = true;\n this.mesh.material.needsUpdate = true;\n }\n if (this.mesh.material.opacity <= 0) {\n this.mesh.visible = false;\n }\n }\n }\n}\n", "import * as THREE from \"three\";\n\ntype RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\ntype CanvasTextOptions = {\n fontSize: number;\n textColorRGB255A1: RGBA;\n backgroundColorRGB255A1?: RGBA;\n font?: string;\n bold?: boolean;\n paddingPx?: number;\n alignment?: string;\n dimensions?: {\n width: number;\n height: number;\n };\n};\n\nfunction getTextAlignOffset(textAlign: CanvasTextAlign, width: number) {\n switch (textAlign) {\n case \"center\":\n return width / 2;\n case \"right\":\n return width;\n default:\n return 0;\n }\n}\n\nfunction printAtWordWrap(\n context: CanvasRenderingContext2D,\n fullText: string,\n x: number,\n y: number,\n lineHeight: number,\n fitWidth: number,\n padding: number,\n alignment: string,\n) {\n const lines = fullText.split(\"\\n\");\n let currentLine = 0;\n for (const text of lines) {\n fitWidth = fitWidth || 0;\n\n if (fitWidth <= 0) {\n context.fillText(text, x, y + lineHeight * currentLine);\n currentLine++;\n continue;\n }\n let words = text.split(\" \");\n let lastWordIndex = 1;\n while (words.length > 0 && lastWordIndex <= words.length) {\n const str = words.slice(0, lastWordIndex).join(\" \");\n const textWidth = context.measureText(str).width;\n if (textWidth + padding * 2 > fitWidth) {\n if (lastWordIndex === 1) {\n lastWordIndex = 2;\n }\n context.fillText(\n words.slice(0, lastWordIndex - 1).join(\" \"),\n x + padding,\n y + lineHeight * currentLine + padding,\n );\n currentLine++;\n words = words.splice(lastWordIndex - 1);\n lastWordIndex = 1;\n } else {\n lastWordIndex++;\n }\n }\n if (lastWordIndex > 0 && words.length > 0) {\n const xOffset = alignment === \"center\" ? 0 : padding;\n context.fillText(words.join(\" \"), x + xOffset, y + lineHeight * currentLine + padding);\n currentLine++;\n }\n }\n}\n\nexport function CanvasText(message: string, options: CanvasTextOptions): HTMLCanvasElement {\n const fontsize = options.fontSize;\n const textColor = options.textColorRGB255A1;\n const backgroundColor = options.backgroundColorRGB255A1 || { r: 255, g: 255, b: 255, a: 1 };\n const padding = options.paddingPx || 0;\n const font = options.font || \"Arial\";\n const fontString = (options.bold ? \"bold \" : \"\") + fontsize + \"px \" + font;\n\n const canvas = document.createElement(\"canvas\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ct = canvas.getContext(\"2d\")!;\n\n // calculate text alignment offset\n const textAlign = (options.alignment as CanvasTextAlign) ?? \"left\";\n\n if (options.dimensions) {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first\n canvas.width = options.dimensions.width;\n canvas.height = options.dimensions.height;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n printAtWordWrap(\n ct,\n message,\n getTextAlignOffset(textAlign, canvas.width),\n fontsize,\n fontsize,\n canvas.width,\n padding,\n textAlign,\n );\n } else {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first. However, we also need to take into account the\n // font size to measure the text in the first place.\n ct.font = fontString;\n const metrics = ct.measureText(message);\n const textWidth = metrics.width;\n const textHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n canvas.width = textWidth + padding * 2;\n canvas.height = textHeight + padding;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n ct.fillText(message, padding + getTextAlignOffset(textAlign, textWidth), textHeight);\n }\n\n return canvas;\n}\n\nexport function THREECanvasTextTexture(\n text: string,\n options: CanvasTextOptions,\n): { texture: THREE.Texture; width: number; height: number } {\n const canvas = CanvasText(text, options);\n\n const texture = new THREE.Texture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.format = THREE.RGBAFormat;\n texture.needsUpdate = true;\n\n return { texture, width: canvas.width, height: canvas.height };\n}\n\nexport function THREECanvasTextMaterial(\n text: string,\n options: CanvasTextOptions,\n): { material: THREE.MeshBasicMaterial; width: number; height: number } {\n const { texture, width, height } = THREECanvasTextTexture(text, options);\n\n const material = new THREE.MeshBasicMaterial();\n material.map = texture;\n material.transparent = true;\n material.depthWrite = false;\n material.needsUpdate = true;\n\n return { material, width, height };\n}\n", "import { Box3, Line3, Matrix4, PerspectiveCamera, Quaternion, Raycaster, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class LocalController {\n private collisionDetectionSteps = 15;\n\n public capsuleInfo = {\n radius: 0.4,\n segment: new Line3(new Vector3(), new Vector3(0, 1.05, 0)),\n };\n\n private maxWalkSpeed = 6;\n private maxRunSpeed = 8.5;\n private gravity: number = -42;\n private jumpForce: number = 16;\n private coyoteTimeThreshold: number = 70;\n\n private coyoteTime: boolean = false;\n private canJump: boolean = true;\n private characterOnGround: boolean = false;\n private characterWasOnGround: boolean = false;\n private characterAirborneSince: number = 0;\n private currentHeight: number = 0;\n\n private characterVelocity: Vector3 = new Vector3();\n private vectorUp: Vector3 = new Vector3(0, 1, 0);\n private vectorDown: Vector3 = new Vector3(0, -1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempBox: Box3 = new Box3();\n private tempMatrix: Matrix4 = new Matrix4();\n private tempSegment: Line3 = new Line3();\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n private rayCaster: Raycaster = new Raycaster();\n\n private forward: boolean;\n private backward: boolean;\n private left: boolean;\n private right: boolean;\n private run: boolean;\n private jump: boolean;\n private anyDirection: boolean;\n private conflictingDirections: boolean;\n\n private thirdPersonCamera: PerspectiveCamera | null = null;\n\n private speed: number = 0;\n private targetSpeed: number = 0;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n };\n\n constructor(\n private readonly model: CharacterModel,\n private readonly id: number,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n setInterval(() => this.update.bind(this), 3000);\n }\n\n public update(): void {\n if (!this.model?.mesh || !this.model?.animationMixer) return;\n if (!this.thirdPersonCamera) this.thirdPersonCamera = this.cameraManager.camera;\n\n const { forward, backward, left, right, run, jump, anyDirection, conflictingDirection } =\n this.keyInputManager;\n\n this.forward = forward;\n this.backward = backward;\n this.left = left;\n this.right = right;\n this.run = run;\n this.jump = jump;\n this.anyDirection = anyDirection;\n this.conflictingDirections = conflictingDirection;\n\n this.targetSpeed = this.run ? this.maxRunSpeed : this.maxWalkSpeed;\n this.speed += ease(this.targetSpeed, this.speed, 0.07);\n\n this.rayCaster.set(this.model.mesh.position, this.vectorDown);\n const minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n if (minimumDistance !== null) {\n this.currentHeight = minimumDistance;\n }\n\n if (anyDirection || !this.characterOnGround) {\n const targetAnimation = this.getTargetAnimation();\n this.model.updateAnimation(targetAnimation, this.timeManager.deltaTime);\n } else {\n this.model.updateAnimation(AnimationState.idle, this.timeManager.deltaTime);\n }\n\n if (this.anyDirection) this.updateRotation();\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(this.timeManager.deltaTime / this.collisionDetectionSteps, i);\n }\n\n if (this.model.mesh.position.y < 0) this.resetPosition();\n this.updateNetworkState();\n }\n\n private getTargetAnimation(): AnimationState {\n if (!this.model.mesh) return AnimationState.idle;\n\n if (this.conflictingDirections) return AnimationState.idle;\n const jumpHeight = this.characterVelocity.y > 0 ? 0.2 : 1.8;\n if (this.currentHeight > jumpHeight && !this.characterOnGround) {\n return AnimationState.air;\n }\n return this.run && this.anyDirection\n ? AnimationState.running\n : this.anyDirection\n ? AnimationState.walking\n : AnimationState.idle;\n }\n\n private updateRotationOffset(): void {\n if (this.conflictingDirections) return;\n if (this.forward) {\n this.rotationOffset = Math.PI;\n if (this.left) this.rotationOffset = Math.PI + Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI - Math.PI / 4;\n } else if (this.backward) {\n this.rotationOffset = Math.PI * 2;\n if (this.left) this.rotationOffset = -Math.PI * 2 - Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI * 2 + Math.PI / 4;\n } else if (this.left) {\n this.rotationOffset = Math.PI * -0.5;\n } else if (this.right) {\n this.rotationOffset = Math.PI * 0.5;\n }\n }\n\n private updateAzimuthalAngle(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n const camToModelDistance = this.thirdPersonCamera.position.distanceTo(this.model.mesh.position);\n const isCameraFirstPerson = camToModelDistance < 2;\n if (isCameraFirstPerson) {\n const cameraForward = new Vector3(0, 0, 1).applyQuaternion(this.thirdPersonCamera.quaternion);\n this.azimuthalAngle = Math.atan2(cameraForward.x, cameraForward.z);\n } else {\n this.azimuthalAngle = Math.atan2(\n this.thirdPersonCamera.position.x - this.model.mesh.position.x,\n this.thirdPersonCamera.position.z - this.model.mesh.position.z,\n );\n }\n }\n\n private computeAngularDifference(rotationQuaternion: Quaternion): number {\n if (!this.model?.mesh) return 0;\n return 2 * Math.acos(Math.abs(this.model.mesh.quaternion.dot(rotationQuaternion)));\n }\n\n private updateRotation(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuaternion = new Quaternion();\n rotationQuaternion.setFromAxisAngle(this.vectorUp, this.azimuthalAngle + this.rotationOffset);\n const angularDifference = this.computeAngularDifference(rotationQuaternion);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * this.timeManager.deltaTime;\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, frameRotation);\n }\n\n private addScaledVectorToCharacter(deltaTime: number) {\n if (!this.model?.mesh) return;\n this.model.mesh.position.addScaledVector(this.tempVector, this.speed * deltaTime);\n }\n\n private updatePosition(deltaTime: number, _iter: number): void {\n if (!this.model?.mesh) return;\n\n if (this.characterOnGround) {\n if (!this.jump) this.canJump = true;\n\n if (this.jump && this.canJump) {\n this.characterVelocity.y += this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y = deltaTime * this.gravity;\n }\n } else if (this.jump && this.coyoteTime) {\n console.log(\"coyoteJump\");\n this.characterVelocity.y = this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y += deltaTime * this.gravity;\n this.canJump = false;\n }\n\n this.model.mesh.position.addScaledVector(this.characterVelocity, deltaTime);\n\n this.tempVector.set(0, 0, 0);\n\n if (this.forward) {\n const forward = new Vector3(0, 0, -1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(forward);\n }\n\n if (this.backward) {\n const backward = new Vector3(0, 0, 1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(backward);\n }\n\n if (this.left) {\n const left = new Vector3(-1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(left);\n }\n\n if (this.right) {\n const right = new Vector3(1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(right);\n }\n\n if (this.tempVector.length() > 0) {\n this.tempVector.normalize();\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n this.model.mesh.updateMatrixWorld();\n\n this.tempBox.makeEmpty();\n\n this.tempSegment.copy(this.capsuleInfo.segment!);\n this.tempSegment.start.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n this.tempSegment.end.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n\n this.tempBox.expandByPoint(this.tempSegment.start);\n this.tempBox.expandByPoint(this.tempSegment.end);\n\n this.tempBox.min.subScalar(this.capsuleInfo.radius!);\n this.tempBox.max.addScalar(this.capsuleInfo.radius!);\n\n this.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!, this.tempBox);\n\n const newPosition = this.tempVector;\n newPosition.copy(this.tempSegment.start);\n\n const deltaVector = this.tempVector2;\n deltaVector.subVectors(newPosition, this.model.mesh.position);\n\n const offset = Math.max(0.0, deltaVector.length() - 1e-5);\n deltaVector.normalize().multiplyScalar(offset);\n\n this.model.mesh.position.add(deltaVector);\n\n this.characterOnGround = deltaVector.y > Math.abs(deltaTime * this.characterVelocity.y * 0.25);\n\n if (this.characterWasOnGround && !this.characterOnGround) {\n this.characterAirborneSince = Date.now();\n }\n\n this.coyoteTime =\n this.characterVelocity.y < 0 &&\n this.characterOnGround === false &&\n Date.now() - this.characterAirborneSince < this.coyoteTimeThreshold;\n\n this.characterWasOnGround = this.characterOnGround;\n\n if (this.characterOnGround) {\n this.characterVelocity.set(0, 0, 0);\n } else {\n deltaVector.normalize();\n this.characterVelocity.addScaledVector(deltaVector, -deltaVector.dot(this.characterVelocity));\n }\n }\n\n private updateNetworkState(): void {\n if (!this.model?.mesh) return;\n const characterQuaternion = this.model.mesh.getWorldQuaternion(new Quaternion());\n const positionUpdate = new Vector3(\n this.model.mesh.position.x,\n this.model.mesh.position.y,\n this.model.mesh.position.z,\n );\n this.networkState = {\n id: this.id,\n position: positionUpdate,\n rotation: { quaternionY: characterQuaternion?.y, quaternionW: characterQuaternion?.w },\n state: this.model.currentAnimation as AnimationState,\n };\n }\n\n private resetPosition(): void {\n if (!this.model?.mesh) return;\n this.characterVelocity.y = 0;\n this.model.mesh.position.y = 3;\n this.characterOnGround = false;\n }\n}\n", "import { PositionAndRotation } from \"mml-web\";\nimport { Camera, Group, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, getSpawnPositionInsideCircle } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...character.position.toArray(),\n ...character.quaternion.toArray(),\n ...camera.position.toArray(),\n ...camera.quaternion.toArray(),\n ].join(\",\");\n}\n\nfunction decodeCharacterAndCamera(hash: string, character: Object3D, camera: Camera) {\n const values = hash.split(\",\").map(Number);\n character.position.fromArray(values.slice(0, 3));\n character.quaternion.fromArray(values.slice(3, 7));\n camera.position.fromArray(values.slice(7, 10));\n camera.quaternion.fromArray(values.slice(10, 14));\n}\n\nexport class CharacterManager {\n /*\n TODO - re-enable updating location hash when there is a solution that waits for models to load (currently if the \n character was standing on a model and the page is reloaded the character falls into the model before it loads and \n can be trapped).\n */\n private updateLocationHash = false;\n\n public loadingCharacters: Map<number, Promise<Character>> = new Map();\n\n public remoteCharacters: Map<number, Character> = new Map();\n public remoteCharacterControllers: Map<number, RemoteController> = new Map();\n\n private characterDescription: CharacterDescription | null = null;\n public character: Character | null = null;\n\n private cameraOffsetTarget: number = 0;\n private cameraOffset: number = 0;\n\n public readonly group: Group;\n\n constructor(\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n setInterval(() => this.update.bind(this), 3000);\n }\n\n /* TODO: \n 1) Separate this method into spawnLocalCharacter and spawnRemoteCharacter\n 2) Make this synchronous to avoid having loadingCharacters and instead manage\n the mesh loading async (would allow us to show a nameplate where a remote\n user is before the asset loads).\n */\n public spawnCharacter(\n characterDescription: CharacterDescription,\n id: number,\n isLocal: boolean = false,\n spawnPosition: Vector3 = new Vector3(),\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n id,\n isLocal,\n () => {\n if (window.location.hash && window.location.hash.length > 1) {\n decodeCharacterAndCamera(\n window.location.hash.substring(1),\n character.model!.mesh!,\n this.cameraManager.camera,\n );\n } else {\n spawnPosition = getSpawnPositionInsideCircle(3, 30, id, 0.4);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.updateMatrixWorld();\n this.sendUpdate({\n id: id,\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: AnimationState.idle,\n });\n }\n character.model!.hideMaterialByMeshName(\"SK_Mannequin_2\");\n if (!isLocal) {\n character.model?.mesh?.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model?.mesh?.updateMatrixWorld();\n character.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n }\n this.group.add(character.model!.mesh!);\n\n if (isLocal) {\n this.character = character;\n this.character.tooltip?.setText(`${id}`);\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, id);\n remoteController.setAnimationFromFile(\n AnimationState.idle,\n characterDescription.idleAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.walking,\n characterDescription.jogAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.running,\n characterDescription.sprintAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.air,\n characterDescription.airAnimationFileUrl,\n );\n remoteController.characterModel?.position.set(\n spawnPosition.x,\n spawnPosition.y,\n spawnPosition.z,\n );\n this.remoteCharacterControllers.set(id, remoteController);\n character.tooltip?.setText(`${id}`);\n }\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n );\n });\n\n this.loadingCharacters.set(id, characterLoadingPromise);\n return characterLoadingPromise;\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.character && this.character.model && this.character.model.mesh) {\n return {\n position: this.character.model.mesh.position,\n rotation: this.character.model.mesh.rotation,\n };\n }\n return {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n };\n }\n\n public clear() {\n for (const [id, character] of this.remoteCharacters) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n if (this.character) {\n this.group.remove(this.character.model!.mesh!);\n this.character = null;\n }\n this.loadingCharacters.clear();\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n\n if (this.character.model?.mesh) {\n this.cameraOffsetTarget = this.cameraManager.targetDistance <= 0.4 ? 0.6 : 0;\n this.cameraOffset += ease(this.cameraOffsetTarget, this.cameraOffset, 0.1);\n const targetOffset = new Vector3(0, 1.3, this.cameraOffset);\n targetOffset.applyQuaternion(this.character.model.mesh.quaternion);\n this.cameraManager.setTarget(this.character.position.add(targetOffset));\n }\n\n if (this.character.controller) {\n this.character.controller.update();\n if (this.timeManager.frame % 2 === 0) {\n this.sendUpdate(this.character.controller.networkState);\n }\n }\n\n for (const [id, update] of this.clientStates) {\n const { position } = update;\n if (!this.remoteCharacters.has(id) && !this.loadingCharacters.has(id)) {\n this.spawnCharacter(\n this.characterDescription!,\n id,\n false,\n new Vector3(position.x, position.y, position.z),\n ).then((_character) => {\n this.loadingCharacters.delete(id);\n });\n }\n\n const characterController = this.remoteCharacterControllers.get(id);\n if (characterController) {\n characterController.update(update, this.timeManager.time, this.timeManager.deltaTime);\n }\n }\n\n for (const [id, character] of this.remoteCharacters) {\n if (!this.clientStates.has(id)) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n }\n\n if (this.updateLocationHash && this.timeManager.frame % 60 === 0) {\n window.location.hash = encodeCharacterAndCamera(\n this.character.model!.mesh!,\n this.cameraManager.camera,\n );\n }\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n Object3D,\n Quaternion,\n Vector3,\n} from \"three\";\n\nimport { Character } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class RemoteController {\n private modelLoader = MODEL_LOADER;\n\n public characterModel: Object3D | null = null;\n\n private animationMixer: AnimationMixer = new AnimationMixer(new Object3D());\n private animations = new Map<AnimationState, AnimationAction>();\n public currentAnimation: AnimationState = AnimationState.idle;\n\n public networkState: CharacterState = {\n id: 0,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 0 },\n state: this.currentAnimation as AnimationState,\n };\n\n constructor(public readonly character: Character, public readonly id: number) {\n this.characterModel = this.character.model!.mesh!;\n this.characterModel.updateMatrixWorld();\n this.animationMixer = new AnimationMixer(this.characterModel);\n }\n\n public update(clientUpdate: CharacterState, time: number, deltaTime: number): void {\n if (!this.character) return;\n this.character.update(time);\n this.updateFromNetwork(clientUpdate);\n this.animationMixer.update(deltaTime);\n }\n\n public async setAnimationFromFile(\n animationType: AnimationState,\n fileName: string,\n ): Promise<void> {\n const animation = await this.modelLoader.load(fileName, \"animation\");\n const animationAction = this.animationMixer.clipAction(animation as AnimationClip);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (this.currentAnimation === targetAnimation) return;\n\n const currentAction = this.animations.get(this.currentAnimation);\n const targetAction = this.animations.get(targetAnimation);\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n targetAction\n .reset()\n .setEffectiveTimeScale(1)\n .setEffectiveWeight(1)\n .fadeIn(transitionDuration)\n .play();\n currentAction.crossFadeTo(targetAction, transitionDuration, true);\n } else {\n targetAction.play();\n }\n\n this.currentAnimation = targetAnimation;\n }\n\n private updateFromNetwork(clientUpdate: CharacterState): void {\n if (!this.characterModel) return;\n const { position, rotation, state } = clientUpdate;\n this.characterModel.position.lerp(new Vector3(position.x, position.y, position.z), 0.15);\n const rotationQuaternion = new Quaternion(0, rotation.quaternionY, 0, rotation.quaternionW);\n this.characterModel.quaternion.slerp(rotationQuaternion, 0.6);\n if (state !== this.currentAnimation) {\n this.transitionToAnimation(state);\n }\n }\n}\n", "export class KeyInputManager {\n private keys = new Map<string, boolean>();\n\n constructor() {\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.addEventListener(\"keyup\", this.onKeyUp.bind(this));\n window.addEventListener(\"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), true);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [\"w\", \"a\", \"s\", \"d\"].some((key) => this.isKeyPressed(key));\n }\n\n get forward(): boolean {\n return this.isKeyPressed(\"w\");\n }\n\n get backward(): boolean {\n return this.isKeyPressed(\"s\");\n }\n\n get left(): boolean {\n return this.isKeyPressed(\"a\");\n }\n\n get right(): boolean {\n return this.isKeyPressed(\"d\");\n }\n\n get run(): boolean {\n return this.isKeyPressed(\"shift\");\n }\n\n get jump(): boolean {\n return this.isKeyPressed(\" \");\n }\n\n get anyDirection(): boolean {\n return this.isMovementKeyPressed();\n }\n\n get conflictingDirection(): boolean {\n return (\n (this.isKeyPressed(\"w\") && this.isKeyPressed(\"s\")) ||\n (this.isKeyPressed(\"a\") && this.isKeyPressed(\"d\"))\n );\n }\n\n public dispose() {\n document.removeEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.removeEventListener(\"keyup\", this.onKeyDown.bind(this));\n window.removeEventListener(\"blur\", this.handleUnfocus.bind(this));\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MMLClickTrigger,\n PromptManager,\n PromptProps,\n registerCustomElementsToWindow,\n setGlobalMScene,\n PositionAndRotation,\n MElement,\n} from \"mml-web\";\nimport { AudioListener, Group, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\n\nexport class MMLCompositionScene {\n public group: Group;\n private debug: boolean = false;\n\n private readonly mmlScene: Partial<IMMLScene>;\n private readonly promptManager: PromptManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private camera: PerspectiveCamera,\n private audioListener: AudioListener,\n private collisionsManager: CollisionsManager,\n private getUserPositionAndRotation: () => PositionAndRotation,\n documentAddresses: Array<string>,\n ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(document.body);\n\n const { interactionListener } = InteractionManager.init(document.body, this.camera, this.scene);\n this.interactionListener = interactionListener;\n\n this.mmlScene = {\n getAudioListener: () => this.audioListener,\n getRenderer: () => this.renderer,\n getThreeScene: () => this.scene,\n getRootContainer: () => this.group,\n getCamera: () => this.camera,\n addCollider: (object: Object3D, mElement: MElement) => {\n this.collisionsManager.addMeshesGroup(object as Group, mElement);\n },\n updateCollider: (object: Object3D) => {\n this.collisionsManager.updateMeshesGroup(object as Group);\n },\n removeCollider: (object: Object3D) => {\n this.collisionsManager.removeMeshesGroup(object as Group);\n },\n getUserPositionAndRotation: this.getUserPositionAndRotation,\n addInteraction: (interaction: Interaction) => {\n this.interactionListener.addInteraction(interaction);\n },\n updateInteraction: (interaction: Interaction) => {\n this.interactionListener.updateInteraction(interaction);\n },\n removeInteraction: (interaction: Interaction) => {\n this.interactionListener.removeInteraction(interaction);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n setGlobalMScene(this.mmlScene as IMMLScene);\n registerCustomElementsToWindow(window);\n this.clickTrigger = MMLClickTrigger.init(document, this.mmlScene as IMMLScene);\n if (this.debug) {\n console.log(this.clickTrigger);\n }\n for (const address of documentAddresses) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", address);\n document.body.appendChild(frameElement);\n }\n }\n}\n", "import {\n EffectComposer,\n RenderPass,\n EffectPass,\n FXAAEffect,\n ShaderPass,\n BloomEffect,\n SSAOEffect,\n BlendFunction,\n TextureEffect,\n ToneMappingEffect,\n SMAAEffect,\n SMAAPreset,\n EdgeDetectionMode,\n PredicationMode,\n NormalPass,\n} from \"postprocessing\";\nimport {\n Color,\n HalfFloatType,\n LinearSRGBColorSpace,\n LoadingManager,\n PMREMGenerator,\n PerspectiveCamera,\n Scene,\n ShadowMapType,\n ToneMapping,\n Vector2,\n WebGLRenderer,\n} from \"three\";\nimport { RGBELoader } from \"three/examples/jsm/loaders/RGBELoader.js\";\n\nimport { TimeManager } from \"../time/TimeManager\";\nimport { composerValues as vals } from \"../tweakpane/composerSettings\";\nimport { TweakPane } from \"../tweakpane/TweakPane\";\n\nimport { BrightnessContrastSaturation } from \"./post-effects/bright-contrast-sat\";\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\n\nexport class Composer {\n private width: number = window.innerWidth;\n private height: number = window.innerHeight;\n\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private isEnvHDRI: boolean = false;\n\n private readonly scene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n private readonly composer: EffectComposer;\n private readonly renderPass: RenderPass;\n private readonly fxaaEffect: FXAAEffect;\n private readonly fxaaPass: EffectPass;\n private readonly bloomEffect: BloomEffect;\n private readonly bloomPass: EffectPass;\n private readonly toneMappingEffect: ToneMappingEffect;\n private readonly smaaEffect: SMAAEffect;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ssaoEffect: SSAOEffect;\n private readonly ssaoPass: EffectPass;\n private readonly toneMappingPass: EffectPass;\n private readonly smaaPass: EffectPass;\n\n private readonly bcs = BrightnessContrastSaturation;\n private readonly bcsPass: ShaderPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n private tweakPane: TweakPane;\n\n constructor(scene: Scene, camera: PerspectiveCamera) {\n this.scene = scene;\n this.camera = camera;\n this.renderer = new WebGLRenderer({\n powerPreference: \"high-performance\",\n antialias: false,\n stencil: false,\n depth: false,\n });\n this.renderer.info.autoReset = false;\n this.renderer.setSize(this.width, this.height);\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = vals.renderer.shadowMap as ShadowMapType;\n this.renderer.toneMapping = vals.renderer.toneMapping as ToneMapping;\n this.renderer.toneMappingExposure = vals.renderer.exposure;\n\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer, {\n frameBufferType: HalfFloatType,\n });\n\n this.tweakPane = new TweakPane(this.renderer, this.scene, this.composer);\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n this.normalPass = new NormalPass(this.scene, this.camera);\n this.normalTextureEffect = new TextureEffect({\n blendFunction: BlendFunction.SKIP,\n texture: this.normalPass.texture,\n });\n\n this.fxaaEffect = new FXAAEffect();\n this.bloomEffect = new BloomEffect({\n intensity: vals.bloom,\n });\n this.ssaoEffect = new SSAOEffect(this.camera, this.normalPass.texture, {\n blendFunction: vals.ssao.blendFunction,\n distanceScaling: vals.ssao.distanceScaling,\n depthAwareUpsampling: vals.ssao.depthAwareUpsampling,\n samples: vals.ssao.samples,\n rings: vals.ssao.rings,\n luminanceInfluence: vals.ssao.luminanceInfluence,\n radius: vals.ssao.radius,\n intensity: vals.ssao.intensity,\n bias: vals.ssao.bias,\n fade: vals.ssao.fade,\n resolutionScale: vals.ssao.resolutionScale,\n color: new Color().setRGB(vals.ssao.color.r, vals.ssao.color.g, vals.ssao.color.b),\n worldDistanceThreshold: vals.ssao.worldDistanceThreshold,\n worldDistanceFalloff: vals.ssao.worldDistanceFalloff,\n worldProximityThreshold: vals.ssao.worldProximityThreshold,\n worldProximityFalloff: vals.ssao.worldProximityFalloff,\n });\n\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n this.ssaoPass = new EffectPass(this.camera, this.ssaoEffect, this.normalTextureEffect);\n this.toneMappingEffect = new ToneMappingEffect({\n mode: vals.toneMapping.mode,\n resolution: vals.toneMapping.resolution,\n whitePoint: vals.toneMapping.whitePoint,\n middleGrey: vals.toneMapping.middleGrey,\n minLuminance: vals.toneMapping.minLuminance,\n averageLuminance: vals.toneMapping.averageLuminance,\n adaptationRate: vals.toneMapping.adaptationRate,\n });\n this.smaaEffect = new SMAAEffect({\n preset: SMAAPreset.ULTRA,\n edgeDetectionMode: EdgeDetectionMode.COLOR,\n predicationMode: PredicationMode.DEPTH,\n });\n\n this.toneMappingPass = new EffectPass(this.camera, this.toneMappingEffect);\n this.toneMappingPass.enabled =\n vals.renderer.toneMapping === 5 || vals.renderer.toneMapping === 0 ? true : false;\n\n this.bcsPass = new ShaderPass(this.bcs, \"tDiffuse\");\n this.bcs.uniforms.brightness.value = vals.brightness;\n this.bcs.uniforms.contrast.value = vals.contrast;\n this.bcs.uniforms.saturation.value = vals.saturation;\n\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n this.smaaPass = new EffectPass(this.camera, this.smaaEffect);\n\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.normalPass);\n this.composer.addPass(this.ssaoPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.smaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.toneMappingPass);\n this.composer.addPass(this.bcsPass);\n this.composer.addPass(this.gaussGrainPass);\n\n this.tweakPane.setupRenderPane(\n this.ssaoEffect,\n this.toneMappingEffect,\n this.toneMappingPass,\n this.bcs,\n this.bloomEffect,\n this.gaussGrainEffect,\n );\n window.addEventListener(\"resize\", () => this.updateProjection());\n this.updateProjection();\n }\n\n private updateProjection(): void {\n this.width = window.innerWidth;\n this.height = innerHeight;\n this.resolution = new Vector2(this.width, this.height);\n this.composer.setSize(this.width, this.height);\n this.renderPass.setSize(this.width, this.height);\n this.normalPass.setSize(this.width, this.height);\n this.ssaoPass.setSize(this.width, this.height);\n this.fxaaPass.setSize(this.width, this.height);\n this.smaaPass.setSize(this.width, this.height);\n this.bloomPass.setSize(this.width, this.height);\n this.toneMappingPass.setSize(this.width, this.height);\n this.gaussGrainPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n public isTweakPaneVisible(): boolean {\n return this.tweakPane.guiVisible;\n }\n\n public render(timeManager: TimeManager): void {\n this.renderer.info.reset();\n this.normalPass.texture.needsUpdate = true;\n this.gaussGrainEffect.uniforms.resolution.value = this.resolution;\n this.gaussGrainEffect.uniforms.time.value = timeManager.time;\n this.gaussGrainEffect.uniforms.alpha.value = 1.0;\n this.composer.render();\n\n if (this.tweakPane.guiVisible) {\n this.tweakPane.updateStats(timeManager);\n }\n }\n\n public useHDRI(url: string): void {\n if (this.isEnvHDRI || !this.renderer) return;\n const pmremGenerator = new PMREMGenerator(this.renderer);\n new RGBELoader(new LoadingManager()).load(\n url,\n (texture) => {\n const envMap = pmremGenerator!.fromEquirectangular(texture).texture;\n if (envMap) {\n envMap.colorSpace = LinearSRGBColorSpace;\n envMap.needsUpdate = true;\n this.scene.environment = envMap;\n this.scene.background = envMap;\n this.scene.backgroundIntensity = vals.renderer.bgIntensity;\n this.isEnvHDRI = true;\n texture.dispose();\n pmremGenerator!.dispose();\n }\n },\n () => {},\n (error: ErrorEvent) => {\n console.error(`Can't load ${url}: ${JSON.stringify(error)}`);\n },\n );\n }\n}\n", "import { BlendFunction, ToneMappingMode } from \"postprocessing\";\n\nexport const composerValues = {\n renderer: {\n shadowMap: 2,\n toneMapping: 5,\n exposure: 1,\n bgIntensity: 0.5,\n bgBlurriness: 0.0,\n },\n ssao: {\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 17,\n rings: 7,\n luminanceInfluence: 0.7,\n radius: 0.03,\n intensity: 2.5,\n bias: 0.05,\n fade: 0.03,\n resolutionScale: 0.75,\n color: { r: 0, g: 0, b: 0 },\n worldDistanceThreshold: 30,\n worldDistanceFalloff: 7,\n worldProximityThreshold: 0.5,\n worldProximityFalloff: 0.3,\n },\n toneMapping: {\n mode: 2 as ToneMappingMode,\n resolution: 512,\n whitePoint: 32.0,\n middleGrey: 21.0,\n minLuminance: 0.01,\n averageLuminance: 0.01,\n adaptationRate: 2.0,\n },\n brightness: -0.03,\n contrast: 1.3,\n saturation: 0.91,\n grain: 0.061,\n bloom: 0.45,\n};\n\nexport const composerOptions = {\n renderer: {\n shadowMap: { min: 0, max: 2, step: 1 },\n toneMapping: { min: 0, max: 5, step: 1 },\n exposure: { min: 0, max: 3, step: 0.01 },\n bgIntensity: { min: 0, max: 1, step: 0.01 },\n bgBlurriness: { min: 0, max: 0.1, step: 0.001 },\n },\n ssao: {\n samples: { min: 1, max: 50, step: 1 },\n rings: { min: 1, max: 50, step: 1 },\n luminanceInfluence: { min: 0, max: 1, step: 0.01 },\n radius: { min: 0, max: 0.1, step: 0.001 },\n intensity: { min: 0, max: 5, step: 0.1 },\n bias: { min: 0, max: 0.1, step: 0.001 },\n fade: { min: 0, max: 0.1, step: 0.001 },\n resolutionScale: { min: 0.25, max: 2, step: 0.25 },\n worldDistanceThreshold: { min: 0, max: 200, step: 1 },\n worldDistanceFalloff: { min: 0, max: 200, step: 1 },\n worldProximityThreshold: { min: 0, max: 2, step: 0.01 },\n worldProximityFalloff: { min: 0, max: 2, step: 0.01 },\n },\n toneMapping: {\n mode: { min: 0, max: 4, step: 1 },\n resolution: { min: 64, max: 512, step: 64 },\n whitePoint: { min: 0, max: 32, step: 0.01 },\n middleGrey: { min: 0, max: 32, step: 0.01 },\n minLuminance: { min: 0, max: 32, step: 0.001 },\n averageLuminance: { min: 0.001, max: 0.2, step: 0.001 },\n adaptationRate: { min: 0.1, max: 2.0, step: 0.1 },\n },\n brightness: {\n amount: { min: -1.0, max: 1.0, step: 0.01 },\n },\n contrast: {\n amount: { min: 0.0, max: 2.0, step: 0.01 },\n },\n saturation: {\n amount: { min: 0.0, max: 2.0, step: 0.01 },\n },\n grain: {\n amount: { min: 0, max: 0.2, step: 0.002 },\n },\n bloom: {\n amount: { min: 0, max: 2, step: 0.05 },\n },\n};\n\nexport const shadowMapTypes: Record<number, string> = {\n 0: \"BasicShadowMap\",\n 1: \"PCFShadowMap\",\n 2: \"PCFSoftShadowMap\",\n};\n\nexport const rendererToneMappingTypes: Record<number, string> = {\n 0: \"NoToneMapping\",\n 1: \"LinearToneMapping\",\n 2: \"ReinhardToneMapping\",\n 3: \"CineonToneMapping\",\n 4: \"ACESFilmicToneMapping\",\n 5: \"CustomToneMapping\",\n};\n\nexport const customToneMappingTypes: Record<number, string> = {\n 0: \"REINHARD\",\n 1: \"REINHARD2\",\n 2: \"REINHARD2_ADAPTIVE\",\n 3: \"OPTIMIZED_CINEON\",\n 4: \"ACES_FILMIC\",\n};\n\nexport const rendererBlades = {\n shadowMapType: shadowMapTypes[composerValues.renderer.shadowMap],\n toneMappingType: rendererToneMappingTypes[composerValues.renderer.toneMapping],\n};\n\nexport const setShadowMapType = (value: number): void => {\n rendererBlades.shadowMapType = shadowMapTypes[value];\n};\n\nexport const setToneMappingType = (value: number): void => {\n rendererBlades.toneMappingType = rendererToneMappingTypes[value];\n};\n\nexport const customToneMappingBlade = {\n customToneMappingType: customToneMappingTypes[composerValues.toneMapping.mode],\n};\n\nexport const setCustomToneMappingType = (value: number): void => {\n customToneMappingBlade.customToneMappingType = customToneMappingTypes[value];\n};\n\nexport const ssaoMaterialParams = [\n \"fade\",\n \"bias\",\n \"minRadiusScale\",\n \"worldDistanceThreshold\",\n \"worldDistanceFalloff\",\n \"worldProximityThreshold\",\n \"worldProximityFalloff\",\n];\n\nexport const statsData = {\n triangles: \"0\",\n geometries: \"0\",\n textures: \"0\",\n shaders: \"0\",\n postPasses: \"0\",\n drawCalls: \"0\",\n rawDeltaTime: \"0\",\n deltaTime: \"0\",\n FPS: \"0\",\n};\n", "import {\n BlendFunction,\n BloomEffect,\n EffectComposer,\n EffectPass,\n SSAOEffect,\n ToneMappingEffect,\n} from \"postprocessing\";\nimport { Color, Scene, WebGLRenderer } from \"three\";\nimport { FolderApi, Pane, TpChangeEvent } from \"tweakpane\";\n\nimport { GaussGrainEffect } from \"../rendering/post-effects/gauss-grain\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { BrightnessContrastSaturation } from \"./../rendering/post-effects/bright-contrast-sat\";\nimport { characterOptions, characterValues } from \"./characterSettings\";\nimport {\n ssaoMaterialParams,\n statsData,\n composerOptions,\n composerValues,\n rendererBlades,\n setShadowMapType,\n setToneMappingType,\n customToneMappingBlade,\n setCustomToneMappingType,\n} from \"./composerSettings\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\n\nexport class TweakPane {\n private renderer: WebGLRenderer;\n private scene: Scene;\n private composer: EffectComposer;\n\n private gui: Pane = new Pane();\n\n private render: FolderApi;\n private stats: FolderApi;\n private renderOptions: FolderApi;\n private ssao: FolderApi;\n private toneMapping: FolderApi;\n private post: FolderApi;\n private export: FolderApi;\n\n private characterMaterial: FolderApi;\n\n private saveVisibilityInLocalStorage: boolean = true;\n public guiVisible: boolean = false;\n\n constructor(renderer: WebGLRenderer, scene: Scene, composer: EffectComposer) {\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n this.renderer = renderer;\n this.scene = scene;\n this.composer = composer;\n\n this.render = this.gui.addFolder({ title: \"rendering\", expanded: true });\n\n this.stats = this.render.addFolder({ title: \"stats\", expanded: true });\n this.renderOptions = this.render.addFolder({ title: \"renderOptions\", expanded: false });\n this.toneMapping = this.render.addFolder({ title: \"customToneMapping\", expanded: false });\n this.ssao = this.render.addFolder({ title: \"ambientOcclusion\", expanded: false });\n this.post = this.render.addFolder({ title: \"post\", expanded: false });\n\n this.toneMapping.hidden = composerValues.renderer.toneMapping === 5 ? false : true;\n\n this.characterMaterial = this.gui.addFolder({ title: \"characterMaterial\", expanded: false });\n this.characterMaterial.addInput(\n characterValues.material,\n \"transmission\",\n characterOptions.material.transmission,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"metalness\",\n characterOptions.material.metalness,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"roughness\",\n characterOptions.material.roughness,\n );\n this.characterMaterial.addInput(characterValues.material, \"ior\", characterOptions.material.ior);\n this.characterMaterial.addInput(\n characterValues.material,\n \"thickness\",\n characterOptions.material.thickness,\n );\n this.characterMaterial.addInput(characterValues.material, \"specularColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"specularIntensity\",\n characterOptions.material.specularIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"emissive\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"emissiveIntensity\",\n characterOptions.material.emissiveIntensity,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"envMapIntensity\",\n characterOptions.material.envMapIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"sheenColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"sheen\",\n characterOptions.material.sheen,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoat\",\n characterOptions.material.clearcoat,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoatRoughness\",\n characterOptions.material.clearcoatRoughness,\n );\n\n this.characterMaterial.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n if (e.presetKey === \"specularColor\") {\n characterValues.material.specularColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"emissive\") {\n characterValues.material.emissive = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"sheenColor\") {\n characterValues.material.sheenColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n });\n\n this.export = this.gui.addFolder({ title: \"import/export\", expanded: false });\n\n window.addEventListener(\"keydown\", this.processKey.bind(this));\n\n this.setupGUIListeners.bind(this)();\n this.setupRenderPane = this.setupRenderPane.bind(this);\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") this.toggleGUI();\n }\n\n private setupGUIListeners(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"unset\" : \"none\";\n this.gui.element.addEventListener(\"mousedown\", () => setTweakpaneActive(true));\n this.gui.element.addEventListener(\"mouseup\", () => setTweakpaneActive(false));\n this.gui.element.addEventListener(\"mouseleave\", () => setTweakpaneActive(false));\n }\n\n public setupRenderPane(\n ssaoEffect: SSAOEffect,\n toneMappingEffect: ToneMappingEffect,\n toneMappingPass: EffectPass,\n brightnessContrastSaturation: typeof BrightnessContrastSaturation,\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n ): void {\n this.stats.addMonitor(statsData, \"triangles\");\n this.stats.addMonitor(statsData, \"geometries\");\n this.stats.addMonitor(statsData, \"textures\");\n this.stats.addMonitor(statsData, \"shaders\");\n this.stats.addMonitor(statsData, \"postPasses\");\n this.stats.addMonitor(statsData, \"drawCalls\");\n this.stats.addMonitor(statsData, \"rawDeltaTime\");\n this.stats.addMonitor(statsData, \"deltaTime\");\n this.stats.addMonitor(statsData, \"FPS\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"shadowMap\",\n composerOptions.renderer.shadowMap,\n );\n this.renderOptions.addMonitor(rendererBlades, \"shadowMapType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"toneMapping\",\n composerOptions.renderer.toneMapping,\n );\n\n this.renderOptions.addMonitor(rendererBlades, \"toneMappingType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"exposure\",\n composerOptions.renderer.exposure,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgIntensity\",\n composerOptions.renderer.bgIntensity,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgBlurriness\",\n composerOptions.renderer.bgBlurriness,\n );\n\n this.renderOptions.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.target as any;\n switch (target.label) {\n case \"shadowMap\":\n this.renderer.shadowMap.type = e.value;\n setShadowMapType(e.value);\n break;\n case \"toneMapping\":\n this.renderer.toneMapping = e.value;\n this.toneMapping.hidden = e.value !== 5;\n toneMappingPass.enabled = e.value === 5 ? true : false;\n setToneMappingType(e.value);\n break;\n case \"exposure\":\n this.renderer.toneMappingExposure = e.value;\n break;\n case \"bgIntensity\":\n this.scene.backgroundIntensity = e.value;\n break;\n case \"bgBlurriness\":\n this.scene.backgroundBlurriness = e.value;\n break;\n default:\n break;\n }\n });\n\n this.ssao.addInput({ showEffectOnly: false }, \"showEffectOnly\");\n this.ssao.addInput(composerValues.ssao, \"samples\", composerOptions.ssao.samples);\n this.ssao.addInput(composerValues.ssao, \"rings\", composerOptions.ssao.rings);\n this.ssao.addInput(\n composerValues.ssao,\n \"luminanceInfluence\",\n composerOptions.ssao.luminanceInfluence,\n );\n this.ssao.addInput(composerValues.ssao, \"radius\", composerOptions.ssao.radius);\n this.ssao.addInput(composerValues.ssao, \"intensity\", composerOptions.ssao.intensity);\n this.ssao.addInput(composerValues.ssao, \"bias\", composerOptions.ssao.bias);\n this.ssao.addInput(composerValues.ssao, \"fade\", composerOptions.ssao.fade);\n this.ssao.addInput(\n composerValues.ssao,\n \"resolutionScale\",\n composerOptions.ssao.resolutionScale,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceThreshold\",\n composerOptions.ssao.worldDistanceThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceFalloff\",\n composerOptions.ssao.worldDistanceFalloff,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityThreshold\",\n composerOptions.ssao.worldProximityThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityFalloff\",\n composerOptions.ssao.worldProximityFalloff,\n );\n this.ssao.addInput(composerValues.ssao, \"color\", {\n color: { alpha: false, type: \"float\" },\n });\n this.ssao.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"showEffectOnly\") {\n ssaoEffect.blendMode.blendFunction =\n e.value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n return;\n }\n if (preset === \"resolutionScale\") {\n ssaoEffect.resolution.scale = e.value;\n return;\n }\n if (ssaoMaterialParams.includes(e.presetKey!)) {\n (ssaoEffect.ssaoMaterial as any)[preset] = e.value;\n return;\n }\n if (e.presetKey === \"color\") {\n ssaoEffect.color = new Color().setRGB(e.value.r, e.value.g, e.value.b);\n return;\n }\n (ssaoEffect as any)[preset] = e.value;\n });\n\n this.toneMapping.addInput(composerValues.toneMapping, \"mode\", composerOptions.toneMapping.mode);\n this.toneMapping.addMonitor(customToneMappingBlade, \"customToneMappingType\");\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"whitePoint\",\n composerOptions.toneMapping.whitePoint,\n );\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"middleGrey\",\n composerOptions.toneMapping.middleGrey,\n );\n const minLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"minLuminance\",\n composerOptions.toneMapping.minLuminance,\n );\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n const averageLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"averageLuminance\",\n composerOptions.toneMapping.averageLuminance,\n );\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"adaptationRate\",\n composerOptions.toneMapping.adaptationRate,\n );\n this.toneMapping.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"mode\") {\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n setCustomToneMappingType(e.value);\n }\n (toneMappingEffect as any)[preset] = e.value;\n return;\n });\n\n this.post.addInput(composerValues, \"brightness\", composerOptions.brightness.amount);\n this.post.addInput(composerValues, \"contrast\", composerOptions.contrast.amount);\n this.post.addInput(composerValues, \"saturation\", composerOptions.saturation.amount);\n\n this.post.addInput(composerValues, \"bloom\", composerOptions.bloom.amount);\n this.post.addInput(composerValues, \"grain\", composerOptions.grain.amount);\n\n this.post.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n switch (target) {\n case \"brightness\":\n brightnessContrastSaturation.uniforms.brightness.value = e.value;\n break;\n case \"contrast\":\n brightnessContrastSaturation.uniforms.contrast.value = e.value;\n break;\n case \"saturation\":\n brightnessContrastSaturation.uniforms.saturation.value = e.value;\n break;\n case \"bloom\":\n bloomEffect.intensity = e.value;\n break;\n case \"grain\":\n gaussGrainEffect.uniforms.amount.value = e.value;\n break;\n default:\n break;\n }\n });\n\n const exportButton = this.export.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportPreset());\n });\n const importButton = this.export.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importPreset(settings);\n });\n });\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any) {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n public updateStats(timeManager: TimeManager): void {\n const { geometries, textures } = this.renderer.info.memory;\n const { triangles, calls } = this.renderer.info.render;\n statsData.triangles = triangles.toString();\n statsData.geometries = geometries.toString();\n statsData.textures = textures.toString();\n statsData.shaders = this.renderer.info.programs!.length.toString();\n statsData.postPasses = this.composer.passes.length.toString();\n statsData.drawCalls = calls.toString();\n statsData.rawDeltaTime = (Math.round(timeManager.rawDeltaTime * 100000) / 100000).toString();\n statsData.deltaTime = (Math.round(timeManager.deltaTime * 100000) / 100000).toString();\n statsData.FPS = timeManager.fps.toString();\n }\n\n private toggleGUI(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"none\" : \"unset\";\n this.guiVisible = !this.guiVisible;\n if (this.saveVisibilityInLocalStorage) {\n localStorage.setItem(\"guiVisible\", this.guiVisible === true ? \"true\" : \"false\");\n }\n }\n}\n", "import { ShaderMaterial, Uniform } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const BrightnessContrastSaturation = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n brightness: new Uniform(0.0),\n contrast: new Uniform(1.0),\n saturation: new Uniform(1.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform float brightness;\n uniform float contrast;\n uniform float saturation;\n\n mat4 brightnessMatrix(float brightness) {\n return mat4(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n brightness, brightness, brightness, 1\n );\n }\n\n mat4 contrastMatrix(float contrast) {\n float t = (1.0 - contrast) / 2.0;\n\n return mat4(\n contrast, 0, 0, 0,\n 0, contrast, 0, 0,\n 0, 0, contrast, 0,\n t, t, t, 1\n );\n }\n\n mat4 saturationMatrix(float saturation) {\n vec3 luminance = vec3(0.3086, 0.6094, 0.0820);\n float oneMinusSat = 1.0 - saturation;\n vec3 red = vec3(luminance.x * oneMinusSat);\n red += vec3(saturation, 0, 0);\n vec3 green = vec3(luminance.y * oneMinusSat);\n green += vec3(0, saturation, 0);\n vec3 blue = vec3(luminance.z * oneMinusSat);\n blue += vec3(0, 0, saturation);\n return mat4(\n red, 0,\n green, 0,\n blue, 0,\n 0, 0, 0, 1\n );\n }\n\n void main(void) {\n vec4 color = texture(tDiffuse, vUv);\n gl_FragColor = (\n brightnessMatrix(brightness) *\n contrastMatrix(contrast) *\n saturationMatrix(saturation) *\n color\n );\n }\n `,\n dithering: true,\n});\n", "export const vertexShader = /* glsl */ `\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n", "import { ShaderMaterial, Uniform, Vector2 } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const GaussGrainEffect = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n resolution: new Uniform(new Vector2()),\n time: new Uniform(0.0),\n amount: new Uniform(0.0),\n alpha: new Uniform(0.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform vec2 resolution;\n uniform float time;\n uniform float amount;\n uniform float alpha;\n\n const float PI = acos(-1.0);\n const float TAU = PI * 2.0;\n const float SQRTAU = sqrt(TAU);\n\n float gaussian(float z, float u, float o) {\n return (\n (1.0 / (o * SQRTAU)) *\n (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))\n );\n }\n\n vec3 gaussgrain() {\n vec2 ps = vec2(1.0) / resolution.xy;\n vec2 uv = gl_FragCoord.xy * ps;\n float t = time;\n float seed = dot(uv, vec2(12.9898, 78.233));\n float noise = fract(sin(seed) * 43758.5453123 + t);\n noise = gaussian(noise, 0.0, 0.5);\n return vec3(noise);\n }\n\n void main(void) {\n vec2 uv = vUv;\n vec4 originalColor = texture(tDiffuse, uv);\n vec3 grain = gaussgrain();\n vec3 col = originalColor.rgb + (grain * amount);\n gl_FragColor = vec4(clamp(col, 0.0, 1.0), alpha);\n }\n `,\n dithering: true,\n});\n", "import { Clock } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class TimeManager {\n private clock: Clock = new Clock();\n private roundMagnitude: number = 200000;\n private maxAverageFrames: number = 150;\n private deltaTimes: number[] = [];\n\n private targetAverageDeltaTime: number = 0;\n private lerpedAverageMagDelta: number = 0;\n private fpsUpdateTime: number = 0;\n private framesSinceLastFPSUpdate: number = 0;\n\n public time: number = 0;\n public deltaTime: number = 0;\n public rawDeltaTime: number = 0;\n public smoothDeltaTime: number = 0;\n public frame: number = 0;\n public fps: number = 0;\n public averageFPS: number = 0;\n\n update() {\n this.rawDeltaTime = this.clock.getDelta();\n this.frame++;\n this.time += this.rawDeltaTime;\n this.deltaTimes.push(this.rawDeltaTime);\n\n if (this.deltaTimes.length > this.maxAverageFrames) this.deltaTimes.shift();\n\n this.targetAverageDeltaTime =\n this.deltaTimes.reduce((prev, curr) => prev + curr, 0) / this.deltaTimes.length;\n\n this.lerpedAverageMagDelta += ease(\n this.targetAverageDeltaTime * this.roundMagnitude,\n this.lerpedAverageMagDelta,\n 0.12,\n );\n\n const revertMagnitude = this.lerpedAverageMagDelta / this.roundMagnitude;\n const smoothDT = Math.round(revertMagnitude * this.roundMagnitude) / this.roundMagnitude;\n\n this.smoothDeltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n this.deltaTime = this.smoothDeltaTime;\n\n this.framesSinceLastFPSUpdate++;\n if (this.framesSinceLastFPSUpdate >= 60) {\n this.fps =\n Math.round((this.framesSinceLastFPSUpdate / (this.time - this.fpsUpdateTime)) * 100) / 100;\n\n this.fpsUpdateTime = this.time;\n this.framesSinceLastFPSUpdate = 0;\n }\n }\n}\n", "import {\n MElement,\n MMLCollisionTrigger,\n getRelativePositionAndRotationRelativeToObject,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n DoubleSide,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Ray,\n Scene,\n Vector3,\n} from \"three\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n source: Group;\n meshBVH: MeshBVH;\n visualizer: MeshBVHVisualizer | null;\n};\n\nexport class CollisionsManager {\n private debug: boolean = false;\n private scene: Scene;\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n public collisionMeshState: Map<Group, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger;\n\n constructor(scene: Scene) {\n this.scene = scene;\n this.collisionTrigger = MMLCollisionTrigger.init();\n }\n\n public raycastFirstDistance(ray: Ray): number | null {\n let minimumDistance: number | null = null;\n for (const [, value] of this.collisionMeshState) {\n const hit = value.meshBVH.raycastFirst(ray, DoubleSide);\n if (hit) {\n if (minimumDistance === null || hit.distance < minimumDistance) {\n minimumDistance = hit.distance;\n }\n }\n }\n return minimumDistance;\n }\n\n private createCollisionMeshState(group: Group): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n mesh.localToWorld(new Vector3());\n mesh.updateMatrixWorld();\n const clonedGeometry = mesh.geometry.clone();\n clonedGeometry.applyMatrix4(mesh.matrixWorld);\n\n for (const key in clonedGeometry.attributes) {\n if (key !== \"position\") {\n clonedGeometry.deleteAttribute(key);\n }\n }\n if (clonedGeometry.index) {\n geometries.push(clonedGeometry.toNonIndexed());\n } else {\n geometries.push(clonedGeometry);\n }\n }\n });\n const newBufferGeometry = BufferGeometryUtils.mergeGeometries(geometries);\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n if (!this.debug) {\n return { source: group, visualizer: null, meshBVH };\n }\n\n const mergedMesh = new Mesh(\n newBufferGeometry,\n new MeshStandardMaterial({ color: 0xff0000, side: FrontSide, wireframe: true }),\n );\n mergedMesh.geometry.boundsTree = meshBVH;\n const visualizer = new MeshBVHVisualizer(mergedMesh, 3);\n visualizer.edgeMaterial.color = new Color(0x0000ff);\n visualizer.update();\n return { source: group, visualizer, meshBVH };\n }\n\n public addMeshesGroup(group: Group, mElement?: MElement): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const meshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.add(meshState.visualizer);\n }\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: Group): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n const newMeshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n if (newMeshState.visualizer) {\n this.scene.add(newMeshState.visualizer);\n }\n this.collisionMeshState.set(group, newMeshState);\n }\n }\n\n public removeMeshesGroup(group: Group): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n tempSegment: Line3,\n radius: number,\n boundingBox: Box3,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (box) => box.intersectsBox(boundingBox),\n intersectsTriangle: (tri) => {\n const triPoint = this.tempVector;\n const capsulePoint = this.tempVector2;\n const distance = tri.closestPointToSegment(tempSegment, triPoint, capsulePoint);\n if (distance < radius) {\n const depth = radius - distance;\n collisionPosition = new Vector3().copy(capsulePoint);\n const direction = capsulePoint.sub(triPoint).normalize();\n tempSegment.start.addScaledVector(direction, depth);\n tempSegment.end.addScaledVector(direction, depth);\n }\n },\n });\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number, boundingBox: Box3) {\n let collidedElements: Map<\n Object3D,\n {\n position: { x: number; y: number; z: number };\n }\n > | null = null;\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, boundingBox, meshState);\n if (collisionPosition) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: new Euler(),\n },\n meshState.source,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n this.collisionTrigger.setCurrentCollisions(collidedElements);\n }\n}\n"],
|
5
|
-
"mappings": "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",
|
6
|
-
"names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationClip", "Object3D", "AnimationState", "Object3D", "AnimationClip", "Color", "LinearFilter", "Mesh", "MeshBasicMaterial", "Color", "MeshBasicMaterial", "Mesh", "LinearFilter", "Raycaster", "Vector3", "Vector3", "Raycaster", "Color", "Vector3", "Vector3", "AnimationMixer", "Object3D", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Vector3", "Quaternion", "Vector3", "Group", "Group", "EffectComposer", "EffectPass", "BloomEffect", "SSAOEffect", "BlendFunction", "ToneMappingEffect", "Color", "LoadingManager", "Vector2", "WebGLRenderer", "BlendFunction", "Color", "BlendFunction", "Color", "ShaderMaterial", "Uniform", "ShaderMaterial", "Uniform", "Vector2", "WebGLRenderer", "EffectComposer", "BlendFunction", "BloomEffect", "SSAOEffect", "Color", "EffectPass", "ToneMappingEffect", "LoadingManager", "Color", "FrontSide", "Mesh", "MeshStandardMaterial", "Vector3", "Vector3", "Mesh", "MeshStandardMaterial", "FrontSide", "Color"]
|
3
|
+
"sources": ["../src/camera/CameraManager.ts", "../src/helpers/math-helpers.ts", "../src/tweakpane/tweakPaneActivity.ts", "../src/character/Character.ts", "../src/character/CharacterModel.ts", "../src/character/CharacterMaterial.ts", "../src/rendering/shaders/bayer-dither.ts", "../src/rendering/shaders/shader-helpers.ts", "../src/tweakpane/characterSettings.ts", "../src/character/CharacterState.ts", "../src/character/ModelLoader.ts", "../src/character/CharacterTooltip.ts", "../src/character/CanvasText.ts", "../src/character/LocalController.ts", "../src/character/CharacterManager.ts", "../src/character/RemoteController.ts", "../src/input/KeyInputManager.ts", "../src/mml/MMLCompositionScene.ts", "../src/rendering/composer.ts", "../src/sun/Sun.ts", "../src/tweakpane/sunSettings.ts", "../src/tweakpane/composerSettings.ts", "../src/tweakpane/envSettings.ts", "../src/tweakpane/TweakPane.ts", "../src/rendering/post-effects/bright-contrast-sat.ts", "../src/rendering/shaders/vertex-shader.ts", "../src/rendering/post-effects/gauss-grain.ts", "../src/time/TimeManager.ts", "../src/collisions/CollisionsManager.ts"],
|
4
|
+
"sourcesContent": ["import { PerspectiveCamera, Raycaster, Vector3 } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, remap, clamp } from \"../helpers/math-helpers\";\nimport { getTweakpaneActive } from \"../tweakpane/tweakPaneActivity\";\n\nexport class CameraManager {\n public readonly camera: PerspectiveCamera;\n\n public initialDistance: number = 3.3;\n\n private minDistance: number = 0.1;\n private maxDistance: number = 8;\n\n private initialFOV: number = 60;\n private fov: number = this.initialFOV;\n private minFOV: number = 50;\n private maxFOV: number = 70;\n private targetFOV: number = this.initialFOV;\n\n private minPolarAngle: number = Math.PI * 0.25;\n private maxPolarAngle: number = Math.PI * 0.95;\n\n private dampingFactor: number = 0.091;\n\n public targetDistance: number = this.initialDistance;\n private distance: number = this.initialDistance;\n\n private targetPhi: number | null = Math.PI / 2;\n private phi: number | null = Math.PI / 2;\n private targetTheta: number | null = -Math.PI / 2;\n private theta: number | null = -Math.PI / 2;\n private dragging: boolean = false;\n\n private target: Vector3 = new Vector3(0, 1.55, 0);\n\n private hadTarget: boolean = false;\n\n private rayCaster: Raycaster;\n\n constructor(private collisionsManager: CollisionsManager) {\n this.camera = new PerspectiveCamera(this.fov, window.innerWidth / window.innerHeight, 0.1, 400);\n this.camera.position.set(0, 1.4, -this.initialDistance);\n\n this.rayCaster = new Raycaster();\n\n document.addEventListener(\"mousedown\", this.onMouseDown.bind(this));\n document.addEventListener(\"mouseup\", this.onMouseUp.bind(this));\n document.addEventListener(\"mousemove\", this.onMouseMove.bind(this));\n document.addEventListener(\"wheel\", this.onMouseWheel.bind(this));\n window.addEventListener(\"resize\", this.onResize.bind(this));\n }\n\n private onResize(): void {\n const width = window.innerWidth;\n const height = window.innerHeight;\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n }\n\n private onMouseDown(_event: MouseEvent): void {\n this.dragging = true;\n }\n\n private onMouseUp(_event: MouseEvent): void {\n this.dragging = false;\n }\n\n private onMouseMove(event: MouseEvent): void {\n if (!this.dragging || getTweakpaneActive() === true) return;\n if (this.targetTheta === null || this.targetPhi === null) return;\n this.targetTheta += event.movementX * 0.01;\n this.targetPhi -= event.movementY * 0.01;\n this.targetPhi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.targetPhi));\n }\n\n private onMouseWheel(event: WheelEvent): void {\n const scrollAmount = event.deltaY * 0.001;\n this.targetDistance += scrollAmount;\n this.targetDistance = Math.max(\n this.minDistance,\n Math.min(this.maxDistance, this.targetDistance),\n );\n }\n\n public setTarget(target: Vector3): void {\n this.target.copy(target);\n if (!this.hadTarget) {\n this.hadTarget = true;\n this.reverseUpdateFromPositions();\n }\n }\n\n private reverseUpdateFromPositions(): void {\n if (this.phi === null || this.theta == null) return;\n const dx = this.camera.position.x - this.target.x;\n const dy = this.camera.position.y - this.target.y;\n const dz = this.camera.position.z - this.target.z;\n this.targetDistance = Math.sqrt(dx * dx + dy * dy + dz * dz);\n this.targetTheta = (this.theta + 2 * Math.PI) % (2 * Math.PI);\n this.targetPhi = Math.max(0, Math.min(Math.PI, this.phi));\n this.phi = this.targetPhi;\n this.theta = this.targetTheta;\n this.distance = this.targetDistance;\n }\n\n public adjustCameraPosition(): void {\n this.rayCaster.set(\n this.camera.position,\n this.target.clone().sub(this.camera.position).normalize(),\n );\n const minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n const cameraToPlayerDistance = this.camera.position.distanceTo(this.target);\n\n if (minimumDistance !== null && minimumDistance <= cameraToPlayerDistance) {\n this.targetDistance = cameraToPlayerDistance - minimumDistance;\n this.distance = this.targetDistance;\n }\n }\n\n public update(): void {\n if (this.target === null) return;\n if (\n this.phi !== null &&\n this.targetPhi !== null &&\n this.theta !== null &&\n this.targetTheta !== null\n ) {\n this.distance += (this.targetDistance - this.distance) * this.dampingFactor * 0.21;\n this.phi += (this.targetPhi - this.phi) * this.dampingFactor;\n this.theta += (this.targetTheta - this.theta) * this.dampingFactor;\n\n const x = this.target.x + this.distance * Math.sin(this.phi) * Math.cos(this.theta);\n const y = this.target.y + this.distance * Math.cos(this.phi);\n const z = this.target.z + this.distance * Math.sin(this.phi) * Math.sin(this.theta);\n\n this.targetFOV = remap(\n this.targetDistance,\n this.minDistance,\n this.maxDistance,\n this.minFOV,\n this.maxFOV,\n );\n\n this.fov += ease(this.targetFOV, this.fov, 0.07);\n this.camera.fov = this.fov;\n this.camera.updateProjectionMatrix();\n this.camera.updateMatrixWorld();\n\n this.camera.position.set(x, clamp(y, 0.1, Infinity), z);\n\n this.adjustCameraPosition();\n\n this.camera.lookAt(this.target);\n }\n }\n}\n", "import { Vector3 } from \"three\";\n\nexport const getSpawnPositionInsideCircle = (\n radius: number,\n positions: number,\n id: number,\n yPos: number = 0,\n): Vector3 => {\n if (id > 0) id += 3;\n const goldenAngle = Math.PI * (3 - Math.sqrt(5));\n const theta = id * goldenAngle;\n const scale = id / positions;\n const scaledRadius = scale * radius;\n const x = Math.cos(theta) * scaledRadius;\n const z = Math.sin(theta) * scaledRadius;\n return new Vector3(x, yPos, z);\n};\n\nexport const round = (n: number, digits: number): number => {\n return Number(n.toFixed(digits));\n};\n\nexport const ease = (target: number, n: number, factor: number): number => {\n return round((target - n) * factor, 5);\n};\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport const remap = (\n value: number,\n minValue: number,\n maxValue: number,\n minScaledValue: number,\n maxScaledValue: number,\n): number => {\n return (\n minScaledValue +\n ((maxScaledValue - minScaledValue) * (value - minValue)) / (maxValue - minValue)\n );\n};\n", "let isTweakpaneActive = false;\n\nexport function setTweakpaneActive(status: boolean) {\n isTweakpaneActive = status;\n}\n\nexport function getTweakpaneActive() {\n return isTweakpaneActive;\n}\n", "import { Color, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { CharacterTooltip } from \"./CharacterTooltip\";\nimport { LocalController } from \"./LocalController\";\n\nexport type CharacterDescription = {\n meshFileUrl: string;\n idleAnimationFileUrl: string;\n jogAnimationFileUrl: string;\n sprintAnimationFileUrl: string;\n airAnimationFileUrl: string;\n modelScale: number;\n};\n\nexport class Character {\n public controller: LocalController | null = null;\n\n public name: string | null = null;\n public model: CharacterModel | null = null;\n public color: Color = new Color();\n\n public position: Vector3 = new Vector3();\n\n public tooltip: CharacterTooltip | null = null;\n\n constructor(\n private readonly characterDescription: CharacterDescription,\n private readonly id: number,\n private readonly isLocal: boolean,\n private readonly modelLoadedCallback: () => void,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.load();\n }\n\n private async load(): Promise<void> {\n this.model = new CharacterModel(this.characterDescription);\n await this.model.init();\n if (this.tooltip === null) {\n this.tooltip = new CharacterTooltip(this.model.mesh!);\n }\n this.color = this.model.material.colorsCube216[this.id];\n if (this.isLocal) {\n this.controller = new LocalController(\n this.model,\n this.id,\n this.collisionsManager,\n this.keyInputManager,\n this.cameraManager,\n this.timeManager,\n );\n }\n this.modelLoadedCallback();\n }\n\n public update(time: number) {\n if (!this.model) return;\n if (this.tooltip) {\n this.tooltip.update(this.cameraManager.camera);\n }\n this.model.mesh!.getWorldPosition(this.position);\n if (typeof this.model.material.uniforms.time !== \"undefined\") {\n this.model.material.uniforms.time.value = time;\n this.model.material.uniforms.diffuseRandomColor.value = this.color;\n this.model.material.update();\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n LoopRepeat,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from \"three\";\n\nimport { CharacterDescription } from \"./Character\";\nimport { CharacterMaterial } from \"./CharacterMaterial\";\nimport { AnimationState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class CharacterModel {\n /* TODO: pick between below eager instantiation or ModelLoader.getInstance() lazy one */\n private modelLoader = MODEL_LOADER;\n\n public mesh: Object3D | null = null;\n public material: CharacterMaterial = new CharacterMaterial();\n\n public animations: Record<string, AnimationAction> = {};\n public animationMixer: AnimationMixer | null = null;\n public currentAnimation: AnimationState = AnimationState.idle;\n\n constructor(private readonly characterDescription: CharacterDescription) {}\n\n public async init(): Promise<void> {\n await this.loadMainMesh();\n await this.setAnimationFromFile(\n this.characterDescription.idleAnimationFileUrl,\n AnimationState.idle,\n );\n await this.setAnimationFromFile(\n this.characterDescription.jogAnimationFileUrl,\n AnimationState.walking,\n );\n await this.setAnimationFromFile(\n this.characterDescription.sprintAnimationFileUrl,\n AnimationState.running,\n );\n await this.setAnimationFromFile(\n this.characterDescription.airAnimationFileUrl,\n AnimationState.air,\n );\n this.applyMaterialToAllSkinnedMeshes(this.material);\n }\n\n public updateAnimation(targetAnimation: AnimationState, deltaTime: number) {\n if (this.currentAnimation !== targetAnimation) {\n this.transitionToAnimation(targetAnimation);\n }\n this.animationMixer?.update(deltaTime);\n }\n\n public hideMaterialByMeshName(meshName: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\" && child.name === meshName) {\n (child as Mesh).material = new MeshStandardMaterial({\n color: 0xff0000,\n transparent: true,\n opacity: 0,\n });\n }\n });\n }\n\n private setShadows(\n mesh: Object3D,\n castShadow: boolean = true,\n receiveShadow: boolean = true,\n ): void {\n mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n child.castShadow = castShadow;\n child.receiveShadow = receiveShadow;\n }\n });\n }\n\n private applyMaterialToAllSkinnedMeshes(material: any): void {\n if (!this.mesh) return;\n this.mesh.traverse((child: Object3D) => {\n if (child.type === \"SkinnedMesh\") {\n (child as Mesh).material = material;\n }\n });\n }\n\n private initAnimationMixer() {\n if (this.animationMixer !== null || this.mesh === null) return;\n this.animationMixer = new AnimationMixer(this.mesh);\n }\n\n private async loadMainMesh(): Promise<void> {\n const mainMeshUrl = this.characterDescription.meshFileUrl;\n const scale = this.characterDescription.modelScale;\n const extension = mainMeshUrl.split(\".\").pop();\n const name = mainMeshUrl.split(\"/\").pop()!.replace(`.${extension}`, \"\");\n const mainMesh = await this.modelLoader.load(mainMeshUrl, \"model\");\n if (typeof mainMesh !== \"undefined\") {\n this.mesh = new Object3D();\n const model = mainMesh as Object3D;\n model.position.set(0, -0.4, 0);\n this.mesh.add(model);\n this.mesh.name = name;\n this.mesh.scale.set(scale, scale, scale);\n this.setShadows(this.mesh);\n }\n }\n\n private async setAnimationFromFile(\n animationFileUrl: string,\n animationType: AnimationState,\n ): Promise<void> {\n return new Promise(async (resolve, reject) => {\n this.initAnimationMixer();\n const animation = await this.modelLoader.load(animationFileUrl, \"animation\");\n if (typeof animation !== \"undefined\" && animation instanceof AnimationClip) {\n this.animations[animationType] = this.animationMixer!.clipAction(animation);\n this.animations[animationType].stop();\n if (animationType === AnimationState.idle) {\n this.animations[animationType].play();\n }\n resolve();\n } else {\n reject(`failed to load ${animationType} from ${animationFileUrl}`);\n }\n });\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (!this.mesh || this.currentAnimation === null) return;\n\n const currentAction = this.animations[this.currentAnimation];\n const targetAction = this.animations[targetAnimation];\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n currentAction.fadeOut(transitionDuration);\n }\n\n if (!targetAction.isRunning()) targetAction.play();\n\n targetAction.setLoop(LoopRepeat, Infinity);\n targetAction.enabled = true;\n targetAction.fadeIn(transitionDuration);\n\n this.currentAnimation = targetAnimation;\n }\n}\n", "import { Color, MeshPhysicalMaterial, UniformsUtils } from \"three\";\n\nimport { bayerDither } from \"../rendering/shaders/bayer-dither\";\nimport {\n injectBefore,\n injectBeforeMain,\n injectInsideMain,\n} from \"../rendering/shaders/shader-helpers\";\nimport { characterValues } from \"../tweakpane/characterSettings\";\n\ntype TUniform<TValue = any> = { value: TValue };\n\nexport class CharacterMaterial extends MeshPhysicalMaterial {\n public uniforms: Record<string, TUniform> = {};\n public colorsCube216: Color[] = [];\n\n constructor() {\n super();\n this.color = new Color(0xffffff);\n this.transmission = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\n\n this.onBeforeCompile = (shader) => {\n this.uniforms = UniformsUtils.clone(shader.uniforms);\n this.uniforms.nearClip = { value: 0.01 };\n this.uniforms.farClip = { value: 1000.0 };\n this.uniforms.ditheringNear = { value: 0.25 };\n this.uniforms.ditheringRange = { value: 0.5 };\n this.uniforms.time = { value: 0.0 };\n this.uniforms.diffuseRandomColor = { value: new Color() };\n shader.uniforms = this.uniforms;\n\n shader.vertexShader = injectBeforeMain(shader.vertexShader, \"varying vec2 vUv;\");\n shader.vertexShader = injectInsideMain(shader.vertexShader, \"vUv = uv;\");\n\n shader.fragmentShader = injectBeforeMain(\n shader.fragmentShader,\n /* glsl */ `\n //#define showPattern\n varying vec2 vUv;\n uniform float nearClip;\n uniform float farClip;\n uniform float ditheringNear;\n uniform float ditheringRange;\n uniform float time;\n uniform vec3 diffuseRandomColor;\n ${bayerDither}\n\n #ifdef showPattern\n vec2 rand2(vec2 p) {\n return fract(vec2(sin(p.x * 591.32 + p.y * 154.077), cos(p.x * 391.32 + p.y * 49.077)));\n }\n float voronoi(in vec2 x) {\n vec2 p = floor(x);\n vec2 f = fract(x);\n float minDistance = 1.0;\n for(int j = -1; j <= 1; j ++)\n for(int i = -1; i <= 1; i ++) {\n vec2 b = vec2(i, j);\n vec2 rand = 0.5 + 0.5 * sin(time * 1.5 + 12.0 * rand2(p + b));\n vec2 r = vec2(b) - f + rand;\n minDistance = min(minDistance, length(r));\n }\n return minDistance;\n }\n #endif\n `,\n );\n\n shader.fragmentShader = injectBefore(\n shader.fragmentShader,\n \"#include <output_fragment>\",\n /* glsl */ `\n float distance = length(vWorldPosition - cameraPosition);\n float normalizedDistance = (distance - nearClip) / (farClip - nearClip);\n ivec2 p = ivec2(mod(gl_FragCoord.xy, 8.0));\n float d = 0.0;\n if (p.x <= 3 && p.y <= 3) {\n d = bayerDither(bayertl, p);\n } else if (p.x > 3 && p.y <= 3) {\n d = bayerDither(bayertr, p - ivec2(4, 0));\n } else if (p.x <= 3 && p.y > 3) {\n d = bayerDither(bayerbl, p - ivec2(0, 4));\n } else if (p.x > 3 && p.y > 3) {\n d = bayerDither(bayerbr, p - ivec2(4, 4));\n }\n if (distance <= ditheringNear + d * ditheringRange) discard;\n\n vec2 uv = vUv;\n float s = clamp(0.35 + 0.35 * sin(5.0 * -time + vUv.y * 600.0), 0.0, 1.0);\n float scanLines = pow(s, 1.33);\n\n outgoingLight *= diffuseRandomColor;\n\n #ifdef showPattern\n float val = pow(voronoi(uv * 8.0) * 1.2, 0.5);\n float thickness = 1.0 / 500.0;\n vec2 g = step(mod(uv, 0.015), vec2(thickness));\n float a = 1.0 - clamp(val * (g.x + g.y), 0.0, 1.0);\n vec3 grid = vec3(smoothstep(0.01, 0.0, a) * 1.15) * diffuseRandomColor;\n outgoingLight += grid;\n #endif\n\n outgoingLight += smoothstep(0.1, 0.0, scanLines) * 0.1;\n `,\n );\n };\n\n this.generateColorCube();\n }\n\n private generateColorCube() {\n const saturation = 0.4;\n const lightness = 0.7;\n const goldenRatioConjugate = 0.618033988749895;\n let hue = 0;\n\n for (let i = 0; i < 216; i++) {\n const color = new Color();\n color.setHSL(hue, saturation, lightness);\n this.colorsCube216.push(color);\n hue = (hue + goldenRatioConjugate) % 1;\n }\n }\n\n public update() {\n this.transmission = characterValues.material.transmission;\n this.metalness = characterValues.material.metalness;\n this.roughness = characterValues.material.roughness;\n this.ior = characterValues.material.ior;\n this.thickness = characterValues.material.thickness;\n this.specularColor = new Color().setRGB(\n characterValues.material.specularColor.r,\n characterValues.material.specularColor.g,\n characterValues.material.specularColor.b,\n );\n this.specularIntensity = characterValues.material.specularIntensity;\n this.emissive = new Color().setRGB(\n characterValues.material.emissive.r,\n characterValues.material.emissive.g,\n characterValues.material.emissive.b,\n );\n this.emissiveIntensity = characterValues.material.emissiveIntensity;\n this.envMapIntensity = characterValues.material.envMapIntensity;\n this.sheenColor = new Color().setRGB(\n characterValues.material.sheenColor.r,\n characterValues.material.sheenColor.g,\n characterValues.material.sheenColor.b,\n );\n this.sheen = characterValues.material.sheen;\n this.clearcoat = characterValues.material.clearcoat;\n this.clearcoatRoughness = characterValues.material.clearcoatRoughness;\n }\n}\n", "export const bayerDither: string = /* glsl */ `\nconst mat4 bayertl = mat4( \n 0.0 / 64.0, 32.0 / 64.0, 8.0 / 64.0, 40.0 / 64.0,\n 48.0 / 64.0, 16.0 / 64.0, 56.0 / 64.0, 24.0 / 64.0,\n 12.0 / 64.0, 44.0 / 64.0, 4.0 / 64.0, 36.0 / 64.0,\n 60.0 / 64.0, 28.0 / 64.0, 52.0 / 64.0, 20.0 / 64.0\n);\n\nconst mat4 bayertr = mat4( \n 2.0 / 64.0, 34.0 / 64.0, 10.0 / 64.0, 42.0 / 64.0,\n 50.0 / 64.0, 18.0 / 64.0, 58.0 / 64.0, 26.0 / 64.0,\n 14.0 / 64.0, 46.0 / 64.0, 6.0 / 64.0, 38.0 / 64.0,\n 62.0 / 64.0, 30.0 / 64.0, 54.0 / 64.0, 22.0 / 64.0\n);\n\nconst mat4 bayerbl = mat4( \n 3.0 / 64.0, 35.0 / 64.0, 11.0 / 64.0, 43.0 / 64.0,\n 51.0 / 64.0, 19.0 / 64.0, 59.0 / 64.0, 27.0 / 64.0,\n 15.0 / 64.0, 47.0 / 64.0, 7.0 / 64.0, 39.0 / 64.0,\n 63.0 / 64.0, 31.0 / 64.0, 55.0 / 64.0, 23.0 / 64.0\n);\n\nconst mat4 bayerbr = mat4( \n 1.0 / 64.0, 33.0 / 64.0, 9.0 / 64.0, 41.0 / 64.0,\n 49.0 / 64.0, 17.0 / 64.0, 57.0 / 64.0, 25.0 / 64.0,\n 13.0 / 64.0, 45.0 / 64.0, 5.0 / 64.0, 37.0 / 64.0,\n 61.0 / 64.0, 29.0 / 64.0, 53.0 / 64.0, 21.0 / 64.0\n);\n\nfloat bayerDither(mat4 m, ivec2 p) {\n if (p.y == 0) {\n if (p.x == 0) { return m[0][0]; }\n else if (p.x == 1) { return m[1][0]; }\n else if (p.x == 2) { return m[2][0]; }\n else { return m[3][0]; }\n } else if (p.y == 1) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][1]; }\n else if (p.x == 2) { return m[2][1]; }\n else { return m[3][1]; }\n } else if (p.y == 2) {\n if (p.x == 0) { return m[0][1]; }\n else if (p.x == 1) { return m[1][2]; }\n else if (p.x == 2) { return m[2][2]; }\n else { return m[3][2]; }\n } else {\n if (p.x == 0) { return m[0][3]; }\n else if (p.x == 1) { return m[1][3]; }\n else if (p.x == 2) { return m[2][3]; }\n else { return m[3][3]; }\n }\n}\n`;\n", "export function injectBeforeMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `\n\n${codeToInject}\n\nvoid main() {`,\n );\n}\n\nexport function injectInsideMain(shaderSource: string, codeToInject: string): string {\n return shaderSource.replace(\n \"void main() {\",\n `void main() {\n\n${codeToInject}\n\n `,\n );\n}\n\nexport function injectBefore(shaderSource: string, before: string, codeToInject: string): string {\n return shaderSource.replace(\n before,\n `\n${codeToInject}\n\n${before}\n `,\n );\n}\n\nexport function injectAfter(shaderSource: string, after: string, codeToInject: string): string {\n return shaderSource.replace(\n after,\n `\n${after}\n\n${codeToInject}\n\n `,\n );\n}\n", "export const characterValues = {\n material: {\n transmission: 1,\n metalness: 0.8,\n roughness: 0.12,\n ior: 1.5,\n thickness: 0.1,\n specularColor: { r: 1.0, g: 1.0, b: 1.0 },\n specularIntensity: 0.1,\n emissive: { r: 1.0, g: 1.0, b: 1.0 },\n emissiveIntensity: 0.1,\n envMapIntensity: 1.0,\n sheenColor: { r: 1.0, g: 1.0, b: 1.0 },\n sheen: 0.5,\n clearcoat: 0.0,\n clearcoatRoughness: 0.0,\n },\n};\n\nexport const characterOptions = {\n material: {\n transmission: { min: 0.01, max: 3, step: 0.01 },\n metalness: { min: 0, max: 1, step: 0.01 },\n roughness: { min: 0, max: 1, step: 0.01 },\n ior: { min: 0, max: 5, step: 0.01 },\n thickness: { min: 0, max: 1, step: 0.01 },\n specularIntensity: { min: 0, max: 1, step: 0.01 },\n emissiveIntensity: { min: 0, max: 1, step: 0.01 },\n envMapIntensity: { min: 0, max: 1, step: 0.01 },\n sheen: { min: 0, max: 1, step: 0.01 },\n clearcoat: { min: 0, max: 1, step: 0.01 },\n clearcoatRoughness: { min: 0, max: 1, step: 0.01 },\n },\n};\n", "export enum AnimationState {\n \"idle\" = 0,\n \"walking\" = 1,\n \"running\" = 2,\n \"jumpToAir\" = 3,\n \"air\" = 4,\n \"airToGround\" = 5,\n}\n\nexport type CharacterState = {\n id: number;\n position: {\n x: number;\n y: number;\n z: number;\n };\n rotation: {\n quaternionY: number;\n quaternionW: number;\n };\n state: AnimationState;\n};\n", "import { AnimationClip, LoadingManager, Object3D } from \"three\";\nimport { GLTF, GLTFLoader as ThreeGLTFLoader } from \"three/examples/jsm/loaders/GLTFLoader.js\";\n\nclass CachedGLTFLoader extends ThreeGLTFLoader {\n private blobCache: Map<string, string>;\n\n constructor(manager?: LoadingManager) {\n super(manager);\n this.blobCache = new Map();\n }\n\n setBlobUrl(originalUrl: string, blobUrl: string) {\n this.blobCache.set(originalUrl, blobUrl);\n }\n\n getBlobUrl(originalUrl: string): string | undefined {\n return this.blobCache.get(originalUrl);\n }\n\n load(\n url: string,\n onLoad: (gltf: GLTF) => void,\n onProgress?: ((event: ProgressEvent<EventTarget>) => void) | undefined,\n onError?: ((event: ErrorEvent) => void) | undefined,\n ): void {\n const blobUrl = this.getBlobUrl(url);\n if (blobUrl) {\n console.log(`Loading cached ${url.split(\"/\").pop()}`);\n super.load(blobUrl, onLoad, onProgress, onError);\n } else {\n super.load(url, onLoad, onProgress, onError);\n }\n }\n}\n\nclass LRUCache<K, V> {\n private maxSize: number;\n private cache: Map<K, V>;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n this.cache = new Map();\n }\n\n get(key: K): V | undefined {\n const item = this.cache.get(key);\n if (item) {\n this.cache.delete(key);\n this.cache.set(key, item);\n }\n return item;\n }\n\n set(key: K, value: V): void {\n if (this.cache.size >= this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey);\n }\n this.cache.set(key, value);\n }\n}\n\ninterface CachedModel {\n blob: Blob;\n originalExtension: string;\n}\n\nexport class ModelLoader {\n private static instance: ModelLoader | null = null;\n\n private readonly loadingManager: LoadingManager;\n private readonly gltfLoader: CachedGLTFLoader;\n private modelCache: LRUCache<string, CachedModel>;\n private ongoingLoads: Map<string, Promise<Object3D | AnimationClip | undefined>> = new Map();\n\n constructor(maxCacheSize: number = 100) {\n this.loadingManager = new LoadingManager();\n this.gltfLoader = new CachedGLTFLoader(this.loadingManager);\n this.modelCache = new LRUCache(maxCacheSize);\n }\n\n /* TODO: decide between below lazy initialization or eager on this file's bottom export */\n static getInstance(): ModelLoader {\n if (!ModelLoader.instance) {\n ModelLoader.instance = new ModelLoader();\n }\n return ModelLoader.instance;\n }\n\n async load(\n fileUrl: string,\n fileType: \"model\" | \"animation\",\n ): Promise<Object3D | AnimationClip | undefined> {\n const cachedModel = this.modelCache.get(fileUrl);\n\n if (cachedModel) {\n const blobURL = URL.createObjectURL(cachedModel.blob);\n this.gltfLoader.setBlobUrl(fileUrl, blobURL);\n return this.loadFromUrl(fileUrl, fileType, cachedModel.originalExtension);\n } else {\n console.log(`Loading ${fileUrl} from server`);\n const ongoingLoad = this.ongoingLoads.get(fileUrl);\n if (ongoingLoad) return ongoingLoad;\n\n const loadPromise = fetch(fileUrl)\n .then((response) => response.blob())\n .then((blob) => {\n const originalExtension = fileUrl.split(\".\").pop() || \"\";\n this.modelCache.set(fileUrl, { blob, originalExtension });\n const blobURL = URL.createObjectURL(blob);\n this.ongoingLoads.delete(fileUrl);\n return this.loadFromUrl(blobURL, fileType, originalExtension);\n });\n\n this.ongoingLoads.set(fileUrl, loadPromise);\n return loadPromise;\n }\n }\n\n private async loadFromUrl(\n url: string,\n fileType: \"model\" | \"animation\",\n extension: string,\n ): Promise<Object3D | AnimationClip | undefined> {\n if ([\"gltf\", \"glb\"].includes(extension)) {\n return new Promise((resolve, reject) => {\n this.gltfLoader.load(\n url,\n (object: GLTF) => {\n if (fileType === \"model\") {\n resolve(object.scene as Object3D);\n } else if (fileType === \"animation\") {\n resolve(object.animations[0] as AnimationClip);\n } else {\n const error = `Trying to load unknown ${fileType} type of element from file ${url}`;\n console.error(error);\n reject(error);\n }\n },\n undefined,\n (error) => {\n console.error(`Error loading GL(B|TF) from ${url}: ${error}`);\n reject(error);\n },\n );\n });\n } else {\n console.error(`Error: can't recognize ${url} extension: ${extension}`);\n }\n }\n}\n\n/* TODO: decide between below eager initialization or static getInstance() lazy one */\nconst MODEL_LOADER = ModelLoader.getInstance();\nexport default MODEL_LOADER;\n", "import {\n Camera,\n Color,\n FrontSide,\n LinearFilter,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n PlaneGeometry,\n} from \"three\";\n\nimport { THREECanvasTextTexture } from \"./CanvasText\";\n\nenum LabelAlignment {\n left = \"left\",\n center = \"center\",\n right = \"right\",\n}\n\nconst fontScale = 5;\nconst defaultLabelColor = new Color(0x000000);\nconst defaultFontColor = new Color(0xffffff);\nconst defaultLabelAlignment = LabelAlignment.center;\nconst defaultLabelFontSize = 9;\nconst defaultLabelPadding = 0;\nconst defaultLabelWidth = 0.25;\nconst defaultLabelHeight = 0.125;\nconst defaultLabelCastShadows = true;\n\nexport class CharacterTooltip {\n private geometry: PlaneGeometry;\n private material: MeshBasicMaterial;\n private mesh: Mesh<PlaneGeometry, MeshBasicMaterial>;\n\n private visibleOpacity: number = 0.85;\n private targetOpacity: number = 0;\n private fadingSpeed: number = 0.02;\n private secondsToFadeOut: number = 15;\n\n private props = {\n content: \"\",\n alignment: defaultLabelAlignment,\n width: defaultLabelWidth,\n height: defaultLabelHeight,\n fontSize: defaultLabelFontSize,\n padding: defaultLabelPadding,\n color: defaultLabelColor,\n fontColor: defaultFontColor,\n castShadows: defaultLabelCastShadows,\n };\n\n constructor(parentModel: Object3D) {\n this.setText = this.setText.bind(this);\n this.material = new MeshBasicMaterial({\n map: null,\n transparent: true,\n opacity: 0,\n });\n this.material.side = FrontSide;\n this.geometry = new PlaneGeometry(1, 1, 1, 1);\n this.mesh = new Mesh(this.geometry, this.material);\n this.mesh.position.set(0, 1.6, 0);\n this.mesh.visible = false;\n parentModel.add(this.mesh);\n }\n\n private redrawText(content: string) {\n if (!this.material) {\n return;\n }\n if (this.material.map) {\n this.material.map.dispose();\n }\n const { texture, width, height } = THREECanvasTextTexture(content, {\n bold: true,\n fontSize: this.props.fontSize * fontScale,\n paddingPx: this.props.padding,\n textColorRGB255A1: {\n r: this.props.fontColor.r * 255,\n g: this.props.fontColor.g * 255,\n b: this.props.fontColor.b * 255,\n a: 1.0,\n },\n backgroundColorRGB255A1: {\n r: this.props.color.r * 255,\n g: this.props.color.g * 255,\n b: this.props.color.b * 255,\n a: 1.0,\n },\n dimensions: {\n width: this.props.width * (100 * fontScale),\n height: this.props.height * (100 * fontScale),\n },\n alignment: this.props.alignment,\n });\n\n this.material.map = texture;\n this.material.map.magFilter = LinearFilter;\n this.material.map.minFilter = LinearFilter;\n this.material.needsUpdate = true;\n\n this.mesh.scale.x = width / (100 * fontScale);\n this.mesh.scale.y = height / (100 * fontScale);\n this.mesh.position.y = 1.6;\n }\n\n setText(text: string, temporary: boolean = false) {\n this.redrawText(text);\n this.mesh.visible = true;\n this.targetOpacity = this.visibleOpacity;\n if (temporary) {\n setTimeout(() => {\n this.hide();\n }, this.secondsToFadeOut * 1000);\n }\n }\n\n hide() {\n this.targetOpacity = 0;\n }\n\n update(camera: Camera) {\n this.mesh.lookAt(camera.position);\n const opacity = this.mesh.material.opacity;\n if (opacity < this.targetOpacity) {\n this.mesh.material.opacity = Math.min(\n this.mesh.material.opacity + this.fadingSpeed,\n this.targetOpacity,\n );\n } else if (opacity > this.targetOpacity) {\n this.mesh.material.opacity = Math.max(\n this.mesh.material.opacity - this.fadingSpeed,\n this.targetOpacity,\n );\n if (opacity >= 1 && this.mesh.material.transparent === true) {\n this.mesh.material.transparent = false;\n this.mesh.material.needsUpdate = true;\n } else if (opacity > 0 && opacity < 1 && this.mesh.material.transparent === false) {\n this.mesh.material.transparent = true;\n this.mesh.material.needsUpdate = true;\n }\n if (this.mesh.material.opacity <= 0) {\n this.mesh.visible = false;\n }\n }\n }\n}\n", "import * as THREE from \"three\";\n\ntype RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\ntype CanvasTextOptions = {\n fontSize: number;\n textColorRGB255A1: RGBA;\n backgroundColorRGB255A1?: RGBA;\n font?: string;\n bold?: boolean;\n paddingPx?: number;\n alignment?: string;\n dimensions?: {\n width: number;\n height: number;\n };\n};\n\nfunction getTextAlignOffset(textAlign: CanvasTextAlign, width: number) {\n switch (textAlign) {\n case \"center\":\n return width / 2;\n case \"right\":\n return width;\n default:\n return 0;\n }\n}\n\nfunction printAtWordWrap(\n context: CanvasRenderingContext2D,\n fullText: string,\n x: number,\n y: number,\n lineHeight: number,\n fitWidth: number,\n padding: number,\n alignment: string,\n) {\n const lines = fullText.split(\"\\n\");\n let currentLine = 0;\n for (const text of lines) {\n fitWidth = fitWidth || 0;\n\n if (fitWidth <= 0) {\n context.fillText(text, x, y + lineHeight * currentLine);\n currentLine++;\n continue;\n }\n let words = text.split(\" \");\n let lastWordIndex = 1;\n while (words.length > 0 && lastWordIndex <= words.length) {\n const str = words.slice(0, lastWordIndex).join(\" \");\n const textWidth = context.measureText(str).width;\n if (textWidth + padding * 2 > fitWidth) {\n if (lastWordIndex === 1) {\n lastWordIndex = 2;\n }\n context.fillText(\n words.slice(0, lastWordIndex - 1).join(\" \"),\n x + padding,\n y + lineHeight * currentLine + padding,\n );\n currentLine++;\n words = words.splice(lastWordIndex - 1);\n lastWordIndex = 1;\n } else {\n lastWordIndex++;\n }\n }\n if (lastWordIndex > 0 && words.length > 0) {\n const xOffset = alignment === \"center\" ? 0 : padding;\n context.fillText(words.join(\" \"), x + xOffset, y + lineHeight * currentLine + padding);\n currentLine++;\n }\n }\n}\n\nexport function CanvasText(message: string, options: CanvasTextOptions): HTMLCanvasElement {\n const fontsize = options.fontSize;\n const textColor = options.textColorRGB255A1;\n const backgroundColor = options.backgroundColorRGB255A1 || { r: 255, g: 255, b: 255, a: 1 };\n const padding = options.paddingPx || 0;\n const font = options.font || \"Arial\";\n const fontString = (options.bold ? \"bold \" : \"\") + fontsize + \"px \" + font;\n\n const canvas = document.createElement(\"canvas\");\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ct = canvas.getContext(\"2d\")!;\n\n // calculate text alignment offset\n const textAlign = (options.alignment as CanvasTextAlign) ?? \"left\";\n\n if (options.dimensions) {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first\n canvas.width = options.dimensions.width;\n canvas.height = options.dimensions.height;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n printAtWordWrap(\n ct,\n message,\n getTextAlignOffset(textAlign, canvas.width),\n fontsize,\n fontsize,\n canvas.width,\n padding,\n textAlign,\n );\n } else {\n // NOTE: setting the canvas dimensions resets the context properties, so\n // we always do it first. However, we also need to take into account the\n // font size to measure the text in the first place.\n ct.font = fontString;\n const metrics = ct.measureText(message);\n const textWidth = metrics.width;\n const textHeight = metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\n canvas.width = textWidth + padding * 2;\n canvas.height = textHeight + padding;\n ct.clearRect(0, 0, canvas.width, canvas.height);\n ct.font = fontString;\n ct.textAlign = textAlign;\n ct.fillStyle = `rgba(${backgroundColor.r}, ${backgroundColor.g}, ${backgroundColor.b}, ${backgroundColor.a})`;\n ct.lineWidth = 0;\n ct.fillRect(0, 0, canvas.width, canvas.height);\n ct.fillStyle = `rgba(${textColor.r}, ${textColor.g}, ${textColor.b}, ${textColor.a})`;\n ct.font = fontString;\n ct.fillText(message, padding + getTextAlignOffset(textAlign, textWidth), textHeight);\n }\n\n return canvas;\n}\n\nexport function THREECanvasTextTexture(\n text: string,\n options: CanvasTextOptions,\n): { texture: THREE.Texture; width: number; height: number } {\n const canvas = CanvasText(text, options);\n\n const texture = new THREE.Texture(canvas);\n texture.minFilter = THREE.LinearFilter;\n texture.magFilter = THREE.LinearFilter;\n texture.format = THREE.RGBAFormat;\n texture.needsUpdate = true;\n\n return { texture, width: canvas.width, height: canvas.height };\n}\n\nexport function THREECanvasTextMaterial(\n text: string,\n options: CanvasTextOptions,\n): { material: THREE.MeshBasicMaterial; width: number; height: number } {\n const { texture, width, height } = THREECanvasTextTexture(text, options);\n\n const material = new THREE.MeshBasicMaterial();\n material.map = texture;\n material.transparent = true;\n material.depthWrite = false;\n material.needsUpdate = true;\n\n return { material, width, height };\n}\n", "import { Box3, Line3, Matrix4, PerspectiveCamera, Quaternion, Raycaster, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { CharacterModel } from \"./CharacterModel\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\n\nexport class LocalController {\n private collisionDetectionSteps = 15;\n\n public capsuleInfo = {\n radius: 0.4,\n segment: new Line3(new Vector3(), new Vector3(0, 1.05, 0)),\n };\n\n private maxWalkSpeed = 6;\n private maxRunSpeed = 8.5;\n private gravity: number = -42;\n private jumpForce: number = 16;\n private coyoteTimeThreshold: number = 70;\n\n private coyoteTime: boolean = false;\n private canJump: boolean = true;\n private characterOnGround: boolean = false;\n private characterWasOnGround: boolean = false;\n private characterAirborneSince: number = 0;\n private currentHeight: number = 0;\n\n private characterVelocity: Vector3 = new Vector3();\n private vectorUp: Vector3 = new Vector3(0, 1, 0);\n private vectorDown: Vector3 = new Vector3(0, -1, 0);\n\n private rotationOffset: number = 0;\n private azimuthalAngle: number = 0;\n\n private tempBox: Box3 = new Box3();\n private tempMatrix: Matrix4 = new Matrix4();\n private tempSegment: Line3 = new Line3();\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n private rayCaster: Raycaster = new Raycaster();\n\n private forward: boolean;\n private backward: boolean;\n private left: boolean;\n private right: boolean;\n private run: boolean;\n private jump: boolean;\n private anyDirection: boolean;\n private conflictingDirections: boolean;\n\n private thirdPersonCamera: PerspectiveCamera | null = null;\n\n private speed: number = 0;\n private targetSpeed: number = 0;\n\n public networkState: CharacterState;\n\n constructor(\n private readonly model: CharacterModel,\n private readonly id: number,\n private readonly collisionsManager: CollisionsManager,\n private readonly keyInputManager: KeyInputManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n ) {\n this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle,\n };\n }\n\n public update(): void {\n if (!this.model?.mesh || !this.model?.animationMixer) return;\n if (!this.thirdPersonCamera) this.thirdPersonCamera = this.cameraManager.camera;\n\n const { forward, backward, left, right, run, jump, anyDirection, conflictingDirection } =\n this.keyInputManager;\n\n this.forward = forward;\n this.backward = backward;\n this.left = left;\n this.right = right;\n this.run = run;\n this.jump = jump;\n this.anyDirection = anyDirection;\n this.conflictingDirections = conflictingDirection;\n\n this.targetSpeed = this.run ? this.maxRunSpeed : this.maxWalkSpeed;\n this.speed += ease(this.targetSpeed, this.speed, 0.07);\n\n this.rayCaster.set(this.model.mesh.position, this.vectorDown);\n const minimumDistance = this.collisionsManager.raycastFirstDistance(this.rayCaster.ray);\n if (minimumDistance !== null) {\n this.currentHeight = minimumDistance;\n }\n\n if (anyDirection || !this.characterOnGround) {\n const targetAnimation = this.getTargetAnimation();\n this.model.updateAnimation(targetAnimation, this.timeManager.deltaTime);\n } else {\n this.model.updateAnimation(AnimationState.idle, this.timeManager.deltaTime);\n }\n\n if (this.anyDirection) this.updateRotation();\n\n for (let i = 0; i < this.collisionDetectionSteps; i++) {\n this.updatePosition(this.timeManager.deltaTime / this.collisionDetectionSteps, i);\n }\n\n if (this.model.mesh.position.y < 0) this.resetPosition();\n this.updateNetworkState();\n }\n\n private getTargetAnimation(): AnimationState {\n if (!this.model.mesh) return AnimationState.idle;\n\n if (this.conflictingDirections) return AnimationState.idle;\n const jumpHeight = this.characterVelocity.y > 0 ? 0.2 : 1.8;\n if (this.currentHeight > jumpHeight && !this.characterOnGround) {\n return AnimationState.air;\n }\n return this.run && this.anyDirection\n ? AnimationState.running\n : this.anyDirection\n ? AnimationState.walking\n : AnimationState.idle;\n }\n\n private updateRotationOffset(): void {\n if (this.conflictingDirections) return;\n if (this.forward) {\n this.rotationOffset = Math.PI;\n if (this.left) this.rotationOffset = Math.PI + Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI - Math.PI / 4;\n } else if (this.backward) {\n this.rotationOffset = Math.PI * 2;\n if (this.left) this.rotationOffset = -Math.PI * 2 - Math.PI / 4;\n if (this.right) this.rotationOffset = Math.PI * 2 + Math.PI / 4;\n } else if (this.left) {\n this.rotationOffset = Math.PI * -0.5;\n } else if (this.right) {\n this.rotationOffset = Math.PI * 0.5;\n }\n }\n\n private updateAzimuthalAngle(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n const camToModelDistance = this.thirdPersonCamera.position.distanceTo(this.model.mesh.position);\n const isCameraFirstPerson = camToModelDistance < 2;\n if (isCameraFirstPerson) {\n const cameraForward = new Vector3(0, 0, 1).applyQuaternion(this.thirdPersonCamera.quaternion);\n this.azimuthalAngle = Math.atan2(cameraForward.x, cameraForward.z);\n } else {\n this.azimuthalAngle = Math.atan2(\n this.thirdPersonCamera.position.x - this.model.mesh.position.x,\n this.thirdPersonCamera.position.z - this.model.mesh.position.z,\n );\n }\n }\n\n private computeAngularDifference(rotationQuaternion: Quaternion): number {\n if (!this.model?.mesh) return 0;\n return 2 * Math.acos(Math.abs(this.model.mesh.quaternion.dot(rotationQuaternion)));\n }\n\n private updateRotation(): void {\n if (!this.thirdPersonCamera || !this.model?.mesh) return;\n this.updateRotationOffset();\n this.updateAzimuthalAngle();\n const rotationQuaternion = new Quaternion();\n rotationQuaternion.setFromAxisAngle(this.vectorUp, this.azimuthalAngle + this.rotationOffset);\n const angularDifference = this.computeAngularDifference(rotationQuaternion);\n const desiredTime = 0.07;\n const angularSpeed = angularDifference / desiredTime;\n const frameRotation = angularSpeed * this.timeManager.deltaTime;\n this.model.mesh.quaternion.rotateTowards(rotationQuaternion, frameRotation);\n }\n\n private addScaledVectorToCharacter(deltaTime: number) {\n if (!this.model?.mesh) return;\n this.model.mesh.position.addScaledVector(this.tempVector, this.speed * deltaTime);\n }\n\n private updatePosition(deltaTime: number, _iter: number): void {\n if (!this.model?.mesh) return;\n\n if (this.characterOnGround) {\n if (!this.jump) this.canJump = true;\n\n if (this.jump && this.canJump) {\n this.characterVelocity.y += this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y = deltaTime * this.gravity;\n }\n } else if (this.jump && this.coyoteTime) {\n console.log(\"coyoteJump\");\n this.characterVelocity.y = this.jumpForce;\n this.canJump = false;\n } else {\n this.characterVelocity.y += deltaTime * this.gravity;\n this.canJump = false;\n }\n\n this.model.mesh.position.addScaledVector(this.characterVelocity, deltaTime);\n\n this.tempVector.set(0, 0, 0);\n\n if (this.forward) {\n const forward = new Vector3(0, 0, -1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(forward);\n }\n\n if (this.backward) {\n const backward = new Vector3(0, 0, 1).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(backward);\n }\n\n if (this.left) {\n const left = new Vector3(-1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(left);\n }\n\n if (this.right) {\n const right = new Vector3(1, 0, 0).applyAxisAngle(this.vectorUp, this.azimuthalAngle);\n this.tempVector.add(right);\n }\n\n if (this.tempVector.length() > 0) {\n this.tempVector.normalize();\n this.addScaledVectorToCharacter(deltaTime);\n }\n\n this.model.mesh.updateMatrixWorld();\n\n this.tempBox.makeEmpty();\n\n this.tempSegment.copy(this.capsuleInfo.segment!);\n this.tempSegment.start.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n this.tempSegment.end.applyMatrix4(this.model.mesh.matrixWorld).applyMatrix4(this.tempMatrix);\n\n this.tempBox.expandByPoint(this.tempSegment.start);\n this.tempBox.expandByPoint(this.tempSegment.end);\n\n this.tempBox.min.subScalar(this.capsuleInfo.radius!);\n this.tempBox.max.addScalar(this.capsuleInfo.radius!);\n\n this.collisionsManager.applyColliders(this.tempSegment, this.capsuleInfo.radius!, this.tempBox);\n\n const newPosition = this.tempVector;\n newPosition.copy(this.tempSegment.start);\n\n const deltaVector = this.tempVector2;\n deltaVector.subVectors(newPosition, this.model.mesh.position);\n\n const offset = Math.max(0.0, deltaVector.length() - 1e-5);\n deltaVector.normalize().multiplyScalar(offset);\n\n this.model.mesh.position.add(deltaVector);\n\n this.characterOnGround = deltaVector.y > Math.abs(deltaTime * this.characterVelocity.y * 0.25);\n\n if (this.characterWasOnGround && !this.characterOnGround) {\n this.characterAirborneSince = Date.now();\n }\n\n this.coyoteTime =\n this.characterVelocity.y < 0 &&\n this.characterOnGround === false &&\n Date.now() - this.characterAirborneSince < this.coyoteTimeThreshold;\n\n this.characterWasOnGround = this.characterOnGround;\n\n if (this.characterOnGround) {\n this.characterVelocity.set(0, 0, 0);\n } else {\n deltaVector.normalize();\n this.characterVelocity.addScaledVector(deltaVector, -deltaVector.dot(this.characterVelocity));\n }\n }\n\n private updateNetworkState(): void {\n if (!this.model?.mesh) {\n this.networkState = {\n id: this.id,\n position: new Vector3(),\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle as AnimationState,\n };\n } else {\n const characterQuaternion = this.model.mesh.getWorldQuaternion(new Quaternion());\n const positionUpdate = new Vector3(\n this.model.mesh.position.x,\n this.model.mesh.position.y,\n this.model.mesh.position.z,\n );\n this.networkState = {\n id: this.id,\n position: positionUpdate,\n rotation: { quaternionY: characterQuaternion.y, quaternionW: characterQuaternion.w },\n state: this.model.currentAnimation as AnimationState,\n };\n }\n }\n\n private resetPosition(): void {\n if (!this.model?.mesh) return;\n this.characterVelocity.y = 0;\n this.model.mesh.position.y = 3;\n this.characterOnGround = false;\n }\n}\n", "import { PositionAndRotation } from \"mml-web\";\nimport { Camera, Group, Object3D, PerspectiveCamera, Vector3 } from \"three\";\n\nimport { CameraManager } from \"../camera/CameraManager\";\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\nimport { ease, getSpawnPositionInsideCircle } from \"../helpers/math-helpers\";\nimport { KeyInputManager } from \"../input/KeyInputManager\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { Character, CharacterDescription } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport { RemoteController } from \"./RemoteController\";\n\nfunction encodeCharacterAndCamera(character: Object3D, camera: PerspectiveCamera): string {\n return [\n ...character.position.toArray(),\n ...character.quaternion.toArray(),\n ...camera.position.toArray(),\n ...camera.quaternion.toArray(),\n ].join(\",\");\n}\n\nfunction decodeCharacterAndCamera(hash: string, character: Object3D, camera: Camera) {\n const values = hash.split(\",\").map(Number);\n character.position.fromArray(values.slice(0, 3));\n character.quaternion.fromArray(values.slice(3, 7));\n camera.position.fromArray(values.slice(7, 10));\n camera.quaternion.fromArray(values.slice(10, 14));\n}\n\nexport class CharacterManager {\n /*\n TODO - re-enable updating location hash when there is a solution that waits for models to load (currently if the \n character was standing on a model and the page is reloaded the character falls into the model before it loads and \n can be trapped).\n */\n private updateLocationHash = false;\n\n public loadingCharacters: Map<number, Promise<Character>> = new Map();\n\n public remoteCharacters: Map<number, Character> = new Map();\n public remoteCharacterControllers: Map<number, RemoteController> = new Map();\n\n private characterDescription: CharacterDescription | null = null;\n public character: Character | null = null;\n\n private cameraOffsetTarget: number = 0;\n private cameraOffset: number = 0;\n\n public readonly group: Group;\n\n constructor(\n private readonly collisionsManager: CollisionsManager,\n private readonly cameraManager: CameraManager,\n private readonly timeManager: TimeManager,\n private readonly inputManager: KeyInputManager,\n private readonly clientStates: Map<number, CharacterState>,\n private readonly sendUpdate: (update: CharacterState) => void,\n ) {\n this.group = new Group();\n }\n\n /* TODO: \n 1) Separate this method into spawnLocalCharacter and spawnRemoteCharacter\n 2) Make this synchronous to avoid having loadingCharacters and instead manage\n the mesh loading async (would allow us to show a nameplate where a remote\n user is before the asset loads).\n */\n public spawnCharacter(\n characterDescription: CharacterDescription,\n id: number,\n isLocal: boolean = false,\n spawnPosition: Vector3 = new Vector3(),\n ) {\n this.characterDescription = characterDescription;\n const characterLoadingPromise = new Promise<Character>((resolve) => {\n const character = new Character(\n characterDescription,\n id,\n isLocal,\n () => {\n if (window.location.hash && window.location.hash.length > 1) {\n decodeCharacterAndCamera(\n window.location.hash.substring(1),\n character.model!.mesh!,\n this.cameraManager.camera,\n );\n } else {\n spawnPosition = getSpawnPositionInsideCircle(3, 30, id, 0.4);\n character.model!.mesh!.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model!.mesh!.updateMatrixWorld();\n this.sendUpdate({\n id: id,\n position: {\n x: spawnPosition.x,\n y: spawnPosition.y,\n z: spawnPosition.z,\n },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: AnimationState.idle,\n });\n }\n character.model!.hideMaterialByMeshName(\"SK_Mannequin_2\");\n if (!isLocal) {\n character.model?.mesh?.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n character.model?.mesh?.updateMatrixWorld();\n character.position.set(spawnPosition.x, spawnPosition.y, spawnPosition.z);\n }\n this.group.add(character.model!.mesh!);\n\n if (isLocal) {\n this.character = character;\n this.character.tooltip?.setText(`${id}`);\n } else {\n this.remoteCharacters.set(id, character);\n const remoteController = new RemoteController(character, id);\n remoteController.setAnimationFromFile(\n AnimationState.idle,\n characterDescription.idleAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.walking,\n characterDescription.jogAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.running,\n characterDescription.sprintAnimationFileUrl,\n );\n remoteController.setAnimationFromFile(\n AnimationState.air,\n characterDescription.airAnimationFileUrl,\n );\n remoteController.characterModel?.position.set(\n spawnPosition.x,\n spawnPosition.y,\n spawnPosition.z,\n );\n this.remoteCharacterControllers.set(id, remoteController);\n character.tooltip?.setText(`${id}`);\n }\n resolve(character);\n },\n this.collisionsManager,\n this.inputManager,\n this.cameraManager,\n this.timeManager,\n );\n });\n\n this.loadingCharacters.set(id, characterLoadingPromise);\n return characterLoadingPromise;\n }\n\n public getLocalCharacterPositionAndRotation(): PositionAndRotation {\n if (this.character && this.character.model && this.character.model.mesh) {\n return {\n position: this.character.model.mesh.position,\n rotation: this.character.model.mesh.rotation,\n };\n }\n return {\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n };\n }\n\n public clear() {\n for (const [id, character] of this.remoteCharacters) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n if (this.character) {\n this.group.remove(this.character.model!.mesh!);\n this.character = null;\n }\n this.loadingCharacters.clear();\n }\n\n public update() {\n if (this.character) {\n this.character.update(this.timeManager.time);\n\n if (this.character.model?.mesh) {\n this.cameraOffsetTarget = this.cameraManager.targetDistance <= 0.4 ? 0.6 : 0;\n this.cameraOffset += ease(this.cameraOffsetTarget, this.cameraOffset, 0.1);\n const targetOffset = new Vector3(0, 1.3, this.cameraOffset);\n targetOffset.applyQuaternion(this.character.model.mesh.quaternion);\n this.cameraManager.setTarget(this.character.position.add(targetOffset));\n }\n\n if (this.character.controller) {\n this.character.controller.update();\n if (this.timeManager.frame % 2 === 0) {\n this.sendUpdate(this.character.controller.networkState);\n }\n }\n\n for (const [id, update] of this.clientStates) {\n const { position } = update;\n if (!this.remoteCharacters.has(id) && !this.loadingCharacters.has(id)) {\n this.spawnCharacter(\n this.characterDescription!,\n id,\n false,\n new Vector3(position.x, position.y, position.z),\n ).then((_character) => {\n this.loadingCharacters.delete(id);\n });\n }\n\n const characterController = this.remoteCharacterControllers.get(id);\n if (characterController) {\n characterController.update(update, this.timeManager.time, this.timeManager.deltaTime);\n }\n }\n\n for (const [id, character] of this.remoteCharacters) {\n if (!this.clientStates.has(id)) {\n this.group.remove(character.model!.mesh!);\n this.remoteCharacters.delete(id);\n this.remoteCharacterControllers.delete(id);\n }\n }\n\n if (this.updateLocationHash && this.timeManager.frame % 60 === 0) {\n window.location.hash = encodeCharacterAndCamera(\n this.character.model!.mesh!,\n this.cameraManager.camera,\n );\n }\n }\n }\n}\n", "import {\n AnimationAction,\n AnimationClip,\n AnimationMixer,\n Object3D,\n Quaternion,\n Vector3,\n} from \"three\";\n\nimport { Character } from \"./Character\";\nimport { AnimationState, CharacterState } from \"./CharacterState\";\nimport MODEL_LOADER from \"./ModelLoader\";\n\nexport class RemoteController {\n private modelLoader = MODEL_LOADER;\n\n public characterModel: Object3D | null = null;\n\n private animationMixer: AnimationMixer = new AnimationMixer(new Object3D());\n private animations = new Map<AnimationState, AnimationAction>();\n public currentAnimation: AnimationState = AnimationState.idle;\n\n public networkState: CharacterState;\n\n constructor(public readonly character: Character, public readonly id: number) {\n this.characterModel = this.character.model!.mesh!;\n this.characterModel.updateMatrixWorld();\n this.animationMixer = new AnimationMixer(this.characterModel);\n this.networkState = {\n id: this.id,\n position: { x: 0, y: 0, z: 0 },\n rotation: { quaternionY: 0, quaternionW: 1 },\n state: this.currentAnimation as AnimationState,\n };\n }\n\n public update(clientUpdate: CharacterState, time: number, deltaTime: number): void {\n if (!this.character) return;\n this.character.update(time);\n this.updateFromNetwork(clientUpdate);\n this.animationMixer.update(deltaTime);\n }\n\n public async setAnimationFromFile(\n animationType: AnimationState,\n fileName: string,\n ): Promise<void> {\n const animation = await this.modelLoader.load(fileName, \"animation\");\n const animationAction = this.animationMixer.clipAction(animation as AnimationClip);\n this.animations.set(animationType, animationAction);\n if (animationType === AnimationState.idle) {\n animationAction.play();\n }\n }\n\n private transitionToAnimation(\n targetAnimation: AnimationState,\n transitionDuration: number = 0.15,\n ): void {\n if (this.currentAnimation === targetAnimation) return;\n\n const currentAction = this.animations.get(this.currentAnimation);\n const targetAction = this.animations.get(targetAnimation);\n\n if (!targetAction) return;\n\n if (currentAction) {\n currentAction.enabled = true;\n targetAction\n .reset()\n .setEffectiveTimeScale(1)\n .setEffectiveWeight(1)\n .fadeIn(transitionDuration)\n .play();\n currentAction.crossFadeTo(targetAction, transitionDuration, true);\n } else {\n targetAction.play();\n }\n\n this.currentAnimation = targetAnimation;\n }\n\n private updateFromNetwork(clientUpdate: CharacterState): void {\n if (!this.characterModel) return;\n const { position, rotation, state } = clientUpdate;\n this.characterModel.position.lerp(new Vector3(position.x, position.y, position.z), 0.15);\n const rotationQuaternion = new Quaternion(0, rotation.quaternionY, 0, rotation.quaternionW);\n this.characterModel.quaternion.slerp(rotationQuaternion, 0.6);\n if (state !== this.currentAnimation) {\n this.transitionToAnimation(state);\n }\n }\n}\n", "export class KeyInputManager {\n private keys = new Map<string, boolean>();\n\n constructor() {\n document.addEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.addEventListener(\"keyup\", this.onKeyUp.bind(this));\n window.addEventListener(\"blur\", this.handleUnfocus.bind(this));\n }\n\n private handleUnfocus(_event: FocusEvent): void {\n this.keys.clear();\n }\n\n private onKeyDown(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), true);\n }\n\n private onKeyUp(event: KeyboardEvent): void {\n this.keys.set(event.key.toLowerCase(), false);\n }\n\n public isKeyPressed(key: string): boolean {\n return this.keys.get(key) || false;\n }\n\n public isMovementKeyPressed(): boolean {\n return [\"w\", \"a\", \"s\", \"d\"].some((key) => this.isKeyPressed(key));\n }\n\n get forward(): boolean {\n return this.isKeyPressed(\"w\");\n }\n\n get backward(): boolean {\n return this.isKeyPressed(\"s\");\n }\n\n get left(): boolean {\n return this.isKeyPressed(\"a\");\n }\n\n get right(): boolean {\n return this.isKeyPressed(\"d\");\n }\n\n get run(): boolean {\n return this.isKeyPressed(\"shift\");\n }\n\n get jump(): boolean {\n return this.isKeyPressed(\" \");\n }\n\n get anyDirection(): boolean {\n return this.isMovementKeyPressed();\n }\n\n get conflictingDirection(): boolean {\n return (\n (this.isKeyPressed(\"w\") && this.isKeyPressed(\"s\")) ||\n (this.isKeyPressed(\"a\") && this.isKeyPressed(\"d\"))\n );\n }\n\n public dispose() {\n document.removeEventListener(\"keydown\", this.onKeyDown.bind(this));\n document.removeEventListener(\"keyup\", this.onKeyDown.bind(this));\n window.removeEventListener(\"blur\", this.handleUnfocus.bind(this));\n }\n}\n", "import {\n IMMLScene,\n Interaction,\n InteractionListener,\n InteractionManager,\n MMLClickTrigger,\n PromptManager,\n PromptProps,\n registerCustomElementsToWindow,\n setGlobalMScene,\n PositionAndRotation,\n MElement,\n} from \"mml-web\";\nimport { AudioListener, Group, Object3D, PerspectiveCamera, Scene, WebGLRenderer } from \"three\";\n\nimport { CollisionsManager } from \"../collisions/CollisionsManager\";\n\nexport class MMLCompositionScene {\n public group: Group;\n private debug: boolean = false;\n\n private readonly mmlScene: Partial<IMMLScene>;\n private readonly promptManager: PromptManager;\n private readonly interactionListener: InteractionListener;\n private readonly clickTrigger: MMLClickTrigger;\n\n constructor(\n private renderer: WebGLRenderer,\n private scene: Scene,\n private camera: PerspectiveCamera,\n private audioListener: AudioListener,\n private collisionsManager: CollisionsManager,\n private getUserPositionAndRotation: () => PositionAndRotation,\n documentAddresses: Array<string>,\n ) {\n this.group = new Group();\n this.promptManager = PromptManager.init(document.body);\n\n const { interactionListener } = InteractionManager.init(document.body, this.camera, this.scene);\n this.interactionListener = interactionListener;\n\n this.mmlScene = {\n getAudioListener: () => this.audioListener,\n getRenderer: () => this.renderer,\n getThreeScene: () => this.scene,\n getRootContainer: () => this.group,\n getCamera: () => this.camera,\n addCollider: (object: Object3D, mElement: MElement) => {\n this.collisionsManager.addMeshesGroup(object as Group, mElement);\n },\n updateCollider: (object: Object3D) => {\n this.collisionsManager.updateMeshesGroup(object as Group);\n },\n removeCollider: (object: Object3D) => {\n this.collisionsManager.removeMeshesGroup(object as Group);\n },\n getUserPositionAndRotation: this.getUserPositionAndRotation,\n addInteraction: (interaction: Interaction) => {\n this.interactionListener.addInteraction(interaction);\n },\n updateInteraction: (interaction: Interaction) => {\n this.interactionListener.updateInteraction(interaction);\n },\n removeInteraction: (interaction: Interaction) => {\n this.interactionListener.removeInteraction(interaction);\n },\n prompt: (promptProps: PromptProps, callback: (message: string | null) => void) => {\n this.promptManager.prompt(promptProps, callback);\n },\n };\n setGlobalMScene(this.mmlScene as IMMLScene);\n registerCustomElementsToWindow(window);\n this.clickTrigger = MMLClickTrigger.init(document, this.mmlScene as IMMLScene);\n if (this.debug) {\n console.log(this.clickTrigger);\n }\n for (const address of documentAddresses) {\n const frameElement = document.createElement(\"m-frame\");\n frameElement.setAttribute(\"src\", address);\n document.body.appendChild(frameElement);\n }\n }\n}\n", "import {\n EffectComposer,\n RenderPass,\n EffectPass,\n FXAAEffect,\n ShaderPass,\n BloomEffect,\n SSAOEffect,\n BlendFunction,\n TextureEffect,\n ToneMappingEffect,\n SMAAEffect,\n SMAAPreset,\n EdgeDetectionMode,\n PredicationMode,\n NormalPass,\n} from \"postprocessing\";\nimport {\n AmbientLight,\n Color,\n Fog,\n HalfFloatType,\n LinearSRGBColorSpace,\n LoadingManager,\n PMREMGenerator,\n PerspectiveCamera,\n Scene,\n ShadowMapType,\n ToneMapping,\n Vector2,\n WebGLRenderer,\n} from \"three\";\nimport { RGBELoader } from \"three/examples/jsm/loaders/RGBELoader.js\";\n\nimport { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\nimport { composerValues as vals } from \"../tweakpane/composerSettings\";\nimport { envValues } from \"../tweakpane/envSettings\";\nimport { TweakPane } from \"../tweakpane/TweakPane\";\n\nimport { BrightnessContrastSaturation } from \"./post-effects/bright-contrast-sat\";\nimport { GaussGrainEffect } from \"./post-effects/gauss-grain\";\n\nexport class Composer {\n private width: number = window.innerWidth;\n private height: number = window.innerHeight;\n\n public resolution: Vector2 = new Vector2(this.width, this.height);\n\n private isEnvHDRI: boolean = false;\n\n private readonly scene: Scene;\n private readonly camera: PerspectiveCamera;\n public readonly renderer: WebGLRenderer;\n\n private readonly composer: EffectComposer;\n private readonly renderPass: RenderPass;\n private readonly fxaaEffect: FXAAEffect;\n private readonly fxaaPass: EffectPass;\n private readonly bloomEffect: BloomEffect;\n private readonly bloomPass: EffectPass;\n private readonly toneMappingEffect: ToneMappingEffect;\n private readonly smaaEffect: SMAAEffect;\n\n private readonly normalPass: NormalPass;\n private readonly normalTextureEffect: TextureEffect;\n private readonly ssaoEffect: SSAOEffect;\n private readonly ssaoPass: EffectPass;\n private readonly toneMappingPass: EffectPass;\n private readonly smaaPass: EffectPass;\n\n private readonly bcs = BrightnessContrastSaturation;\n private readonly bcsPass: ShaderPass;\n\n private readonly gaussGrainEffect = GaussGrainEffect;\n private readonly gaussGrainPass: ShaderPass;\n\n private ambientLight: AmbientLight | null = null;\n\n public sun: Sun | null = null;\n public spawnSun: boolean;\n\n private tweakPane: TweakPane;\n\n constructor(scene: Scene, camera: PerspectiveCamera, spawnSun: boolean = false) {\n this.scene = scene;\n this.camera = camera;\n this.spawnSun = spawnSun;\n this.renderer = new WebGLRenderer({\n powerPreference: \"high-performance\",\n antialias: false,\n stencil: false,\n depth: false,\n });\n this.renderer.info.autoReset = false;\n this.renderer.setSize(this.width, this.height);\n this.renderer.shadowMap.enabled = true;\n this.renderer.shadowMap.type = vals.renderer.shadowMap as ShadowMapType;\n this.renderer.toneMapping = vals.renderer.toneMapping as ToneMapping;\n this.renderer.toneMappingExposure = vals.renderer.exposure;\n\n this.setAmbientLight();\n this.setFog();\n\n document.body.appendChild(this.renderer.domElement);\n\n this.composer = new EffectComposer(this.renderer, {\n frameBufferType: HalfFloatType,\n });\n\n this.tweakPane = new TweakPane(this.renderer, this.scene, this.composer);\n\n this.renderPass = new RenderPass(this.scene, this.camera);\n this.normalPass = new NormalPass(this.scene, this.camera);\n this.normalTextureEffect = new TextureEffect({\n blendFunction: BlendFunction.SKIP,\n texture: this.normalPass.texture,\n });\n\n this.fxaaEffect = new FXAAEffect();\n this.bloomEffect = new BloomEffect({\n intensity: vals.bloom,\n });\n this.ssaoEffect = new SSAOEffect(this.camera, this.normalPass.texture, {\n blendFunction: vals.ssao.blendFunction,\n distanceScaling: vals.ssao.distanceScaling,\n depthAwareUpsampling: vals.ssao.depthAwareUpsampling,\n samples: vals.ssao.samples,\n rings: vals.ssao.rings,\n luminanceInfluence: vals.ssao.luminanceInfluence,\n radius: vals.ssao.radius,\n intensity: vals.ssao.intensity,\n bias: vals.ssao.bias,\n fade: vals.ssao.fade,\n resolutionScale: vals.ssao.resolutionScale,\n color: new Color().setRGB(vals.ssao.color.r, vals.ssao.color.g, vals.ssao.color.b),\n worldDistanceThreshold: vals.ssao.worldDistanceThreshold,\n worldDistanceFalloff: vals.ssao.worldDistanceFalloff,\n worldProximityThreshold: vals.ssao.worldProximityThreshold,\n worldProximityFalloff: vals.ssao.worldProximityFalloff,\n });\n\n this.fxaaPass = new EffectPass(this.camera, this.fxaaEffect);\n this.bloomPass = new EffectPass(this.camera, this.bloomEffect);\n this.ssaoPass = new EffectPass(this.camera, this.ssaoEffect, this.normalTextureEffect);\n this.toneMappingEffect = new ToneMappingEffect({\n mode: vals.toneMapping.mode,\n resolution: vals.toneMapping.resolution,\n whitePoint: vals.toneMapping.whitePoint,\n middleGrey: vals.toneMapping.middleGrey,\n minLuminance: vals.toneMapping.minLuminance,\n averageLuminance: vals.toneMapping.averageLuminance,\n adaptationRate: vals.toneMapping.adaptationRate,\n });\n this.smaaEffect = new SMAAEffect({\n preset: SMAAPreset.ULTRA,\n edgeDetectionMode: EdgeDetectionMode.COLOR,\n predicationMode: PredicationMode.DEPTH,\n });\n\n this.toneMappingPass = new EffectPass(this.camera, this.toneMappingEffect);\n this.toneMappingPass.enabled =\n vals.renderer.toneMapping === 5 || vals.renderer.toneMapping === 0 ? true : false;\n\n this.bcsPass = new ShaderPass(this.bcs, \"tDiffuse\");\n this.bcs.uniforms.brightness.value = vals.brightness;\n this.bcs.uniforms.contrast.value = vals.contrast;\n this.bcs.uniforms.saturation.value = vals.saturation;\n\n this.gaussGrainPass = new ShaderPass(this.gaussGrainEffect, \"tDiffuse\");\n this.smaaPass = new EffectPass(this.camera, this.smaaEffect);\n\n this.composer.addPass(this.renderPass);\n this.composer.addPass(this.normalPass);\n this.composer.addPass(this.ssaoPass);\n this.composer.addPass(this.fxaaPass);\n this.composer.addPass(this.smaaPass);\n this.composer.addPass(this.bloomPass);\n this.composer.addPass(this.toneMappingPass);\n this.composer.addPass(this.bcsPass);\n this.composer.addPass(this.gaussGrainPass);\n\n if (this.spawnSun === true) {\n this.sun = new Sun();\n this.scene.add(this.sun);\n }\n\n this.tweakPane.setupRenderPane(\n this.ssaoEffect,\n this.toneMappingEffect,\n this.toneMappingPass,\n this.bcs,\n this.bloomEffect,\n this.gaussGrainEffect,\n this.spawnSun,\n this.sun,\n this.setHDRIFromFile.bind(this),\n this.setAmbientLight.bind(this),\n this.setFog.bind(this),\n );\n window.addEventListener(\"resize\", () => this.updateProjection());\n this.updateProjection();\n }\n\n private updateProjection(): void {\n this.width = window.innerWidth;\n this.height = innerHeight;\n this.resolution = new Vector2(this.width, this.height);\n this.composer.setSize(this.width, this.height);\n this.renderPass.setSize(this.width, this.height);\n this.normalPass.setSize(this.width, this.height);\n this.ssaoPass.setSize(this.width, this.height);\n this.fxaaPass.setSize(this.width, this.height);\n this.smaaPass.setSize(this.width, this.height);\n this.bloomPass.setSize(this.width, this.height);\n this.toneMappingPass.setSize(this.width, this.height);\n this.gaussGrainPass.setSize(this.width, this.height);\n this.renderer.setSize(this.width, this.height);\n }\n\n public isTweakPaneVisible(): boolean {\n return this.tweakPane.guiVisible;\n }\n\n public render(timeManager: TimeManager): void {\n this.renderer.info.reset();\n this.normalPass.texture.needsUpdate = true;\n this.gaussGrainEffect.uniforms.resolution.value = this.resolution;\n this.gaussGrainEffect.uniforms.time.value = timeManager.time;\n this.gaussGrainEffect.uniforms.alpha.value = 1.0;\n this.composer.render();\n\n if (this.tweakPane.guiVisible) {\n this.tweakPane.updateStats(timeManager);\n }\n }\n\n public useHDRI(url: string, fromFile: boolean = false): void {\n if ((this.isEnvHDRI && fromFile === false) || !this.renderer) return;\n const pmremGenerator = new PMREMGenerator(this.renderer);\n new RGBELoader(new LoadingManager()).load(\n url,\n (texture) => {\n const envMap = pmremGenerator!.fromEquirectangular(texture).texture;\n if (envMap) {\n envMap.colorSpace = LinearSRGBColorSpace;\n envMap.needsUpdate = true;\n this.scene.environment = envMap;\n this.scene.background = envMap;\n this.scene.backgroundIntensity = vals.renderer.bgIntensity;\n this.isEnvHDRI = true;\n texture.dispose();\n pmremGenerator!.dispose();\n }\n },\n () => {},\n (error: ErrorEvent) => {\n console.error(`Can't load ${url}: ${JSON.stringify(error)}`);\n },\n );\n }\n\n public setHDRIFromFile(): void {\n if (!this.renderer) return;\n const fileInput = document.createElement(\"input\");\n fileInput.type = \"file\";\n fileInput.accept = \".hdr\";\n fileInput.addEventListener(\"change\", () => {\n const file = fileInput.files?.[0];\n if (!file) {\n console.log(\"no file\");\n return;\n }\n const fileURL = URL.createObjectURL(file);\n if (fileURL) {\n this.useHDRI(fileURL, true);\n URL.revokeObjectURL(fileURL);\n document.body.removeChild(fileInput);\n }\n });\n document.body.appendChild(fileInput);\n fileInput.click();\n }\n\n public setFog(): void {\n const fogColor = new Color().setRGB(\n envValues.fog.fogColor.r,\n envValues.fog.fogColor.g,\n envValues.fog.fogColor.b,\n );\n this.scene.fog = new Fog(fogColor, envValues.fog.fogNear, envValues.fog.fogFar);\n }\n\n public setAmbientLight(): void {\n if (this.ambientLight) {\n this.scene.remove(this.ambientLight);\n this.ambientLight.dispose();\n }\n const ambientLightColor = new Color().setRGB(\n envValues.ambientLight.ambientLightColor.r,\n envValues.ambientLight.ambientLightColor.g,\n envValues.ambientLight.ambientLightColor.b,\n );\n this.ambientLight = new AmbientLight(\n ambientLightColor,\n envValues.ambientLight.ambientLightIntensity,\n );\n this.scene.add(this.ambientLight);\n }\n}\n", "import { CameraHelper, Color, DirectionalLight, Group, OrthographicCamera, Vector3 } from \"three\";\n\nimport { sunValues } from \"../tweakpane/sunSettings\";\n\nexport class Sun extends Group {\n private readonly debug: boolean = false;\n private readonly sunOffset: Vector3 = new Vector3(\n 39 * (Math.PI / 180),\n 50 * (Math.PI / 180),\n 100,\n );\n private readonly shadowResolution: number = 8192;\n private readonly shadowCamFrustum: number = 50;\n private readonly camHelper: CameraHelper | null = null;\n\n private readonly shadowCamera: OrthographicCamera;\n private readonly directionalLight: DirectionalLight;\n\n public target: Vector3 | null = null;\n\n constructor() {\n super();\n this.shadowCamera = new OrthographicCamera(\n -this.shadowCamFrustum,\n this.shadowCamFrustum,\n this.shadowCamFrustum,\n -this.shadowCamFrustum,\n 0.1,\n 200,\n );\n if (this.debug === true) {\n this.camHelper = new CameraHelper(this.shadowCamera);\n }\n this.directionalLight = new DirectionalLight(0xffffff, 0.5);\n this.directionalLight.shadow.normalBias = 0.05;\n this.directionalLight.shadow.radius = 1.5;\n this.directionalLight.shadow.camera = this.shadowCamera;\n this.directionalLight.shadow.mapSize.set(this.shadowResolution, this.shadowResolution);\n this.directionalLight.castShadow = true;\n\n this.updateCharacterPosition(new Vector3(0, 0, 0));\n\n this.add(this.directionalLight);\n if (this.debug === true && this.camHelper instanceof CameraHelper) {\n this.add(this.camHelper);\n }\n }\n\n public updateCharacterPosition(position: Vector3 | undefined) {\n if (!position) return;\n this.target = position;\n this.setSunPosition(this.sunOffset.x, this.sunOffset.y);\n }\n\n public setAzimuthalAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.x = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setPolarAngle(angle: number) {\n if (this.sunOffset) this.sunOffset.y = angle;\n if (this.target) this.updateCharacterPosition(this.target);\n }\n\n public setIntensity(intensity: number) {\n this.directionalLight.intensity = intensity;\n }\n\n public setColor() {\n this.directionalLight.color = new Color().setRGB(\n sunValues.sunColor.r,\n sunValues.sunColor.g,\n sunValues.sunColor.b,\n );\n }\n\n private setSunPosition(azimuthalAngle: number, polarAngle: number) {\n if (!this.target) return;\n const distance = this.sunOffset.z;\n const sphericalPosition = new Vector3(\n distance * Math.sin(polarAngle) * Math.cos(azimuthalAngle),\n distance * Math.cos(polarAngle),\n distance * Math.sin(polarAngle) * Math.sin(azimuthalAngle),\n );\n const newSunPosition = this.target.clone().add(sphericalPosition);\n this.directionalLight.position.set(newSunPosition.x, newSunPosition.y, newSunPosition.z);\n this.directionalLight.target.position.copy(this.target.clone());\n this.directionalLight.target.updateMatrixWorld();\n }\n}\n", "export const sunValues = {\n sunPosition: {\n sunAzimuthalAngle: 39,\n sunPolarAngle: 50,\n },\n sunIntensity: 0.5,\n sunColor: { r: 1.0, g: 1.0, b: 1.0 },\n};\n\nexport const sunOptions = {\n sunPosition: {\n sunAzimuthalAngle: { min: 0, max: 360, step: 1 },\n sunPolarAngle: { min: -90, max: 90, step: 1 },\n },\n sunIntensity: { min: 0, max: 1, step: 0.05 },\n};\n", "import { BlendFunction, ToneMappingMode } from \"postprocessing\";\n\nexport const composerValues = {\n renderer: {\n shadowMap: 2,\n toneMapping: 5,\n exposure: 1,\n bgIntensity: 0.5,\n bgBlurriness: 0.0,\n },\n ssao: {\n blendFunction: BlendFunction.MULTIPLY,\n distanceScaling: true,\n depthAwareUpsampling: true,\n samples: 17,\n rings: 7,\n luminanceInfluence: 0.7,\n radius: 0.03,\n intensity: 2.5,\n bias: 0.05,\n fade: 0.03,\n resolutionScale: 0.75,\n color: { r: 0, g: 0, b: 0 },\n worldDistanceThreshold: 30,\n worldDistanceFalloff: 7,\n worldProximityThreshold: 0.5,\n worldProximityFalloff: 0.3,\n },\n toneMapping: {\n mode: 2 as ToneMappingMode,\n resolution: 512,\n whitePoint: 32.0,\n middleGrey: 21.0,\n minLuminance: 0.01,\n averageLuminance: 0.01,\n adaptationRate: 2.0,\n },\n brightness: -0.03,\n contrast: 1.21,\n saturation: 0.91,\n grain: 0.061,\n bloom: 0.25,\n};\n\nexport const composerOptions = {\n renderer: {\n shadowMap: { min: 0, max: 2, step: 1 },\n toneMapping: { min: 0, max: 5, step: 1 },\n exposure: { min: 0, max: 3, step: 0.01 },\n bgIntensity: { min: 0, max: 1.3, step: 0.01 },\n bgBlurriness: { min: 0, max: 0.1, step: 0.001 },\n },\n ssao: {\n samples: { min: 1, max: 50, step: 1 },\n rings: { min: 1, max: 50, step: 1 },\n luminanceInfluence: { min: 0, max: 1, step: 0.01 },\n radius: { min: 0, max: 0.1, step: 0.001 },\n intensity: { min: 0, max: 5, step: 0.1 },\n bias: { min: 0, max: 0.1, step: 0.001 },\n fade: { min: 0, max: 0.1, step: 0.001 },\n resolutionScale: { min: 0.25, max: 2, step: 0.25 },\n worldDistanceThreshold: { min: 0, max: 200, step: 1 },\n worldDistanceFalloff: { min: 0, max: 200, step: 1 },\n worldProximityThreshold: { min: 0, max: 2, step: 0.01 },\n worldProximityFalloff: { min: 0, max: 2, step: 0.01 },\n },\n toneMapping: {\n mode: { min: 0, max: 4, step: 1 },\n resolution: { min: 64, max: 512, step: 64 },\n whitePoint: { min: 0, max: 32, step: 0.01 },\n middleGrey: { min: 0, max: 32, step: 0.01 },\n minLuminance: { min: 0, max: 32, step: 0.001 },\n averageLuminance: { min: 0.001, max: 0.2, step: 0.001 },\n adaptationRate: { min: 0.1, max: 2.0, step: 0.1 },\n },\n brightness: {\n amount: { min: -1.0, max: 1.0, step: 0.01 },\n },\n contrast: {\n amount: { min: 0.0, max: 2.0, step: 0.01 },\n },\n saturation: {\n amount: { min: 0.0, max: 2.0, step: 0.01 },\n },\n grain: {\n amount: { min: 0, max: 0.2, step: 0.002 },\n },\n bloom: {\n amount: { min: 0, max: 2, step: 0.05 },\n },\n};\n\nexport const shadowMapTypes: Record<number, string> = {\n 0: \"BasicShadowMap\",\n 1: \"PCFShadowMap\",\n 2: \"PCFSoftShadowMap\",\n};\n\nexport const rendererToneMappingTypes: Record<number, string> = {\n 0: \"NoToneMapping\",\n 1: \"LinearToneMapping\",\n 2: \"ReinhardToneMapping\",\n 3: \"CineonToneMapping\",\n 4: \"ACESFilmicToneMapping\",\n 5: \"CustomToneMapping\",\n};\n\nexport const customToneMappingTypes: Record<number, string> = {\n 0: \"REINHARD\",\n 1: \"REINHARD2\",\n 2: \"REINHARD2_ADAPTIVE\",\n 3: \"OPTIMIZED_CINEON\",\n 4: \"ACES_FILMIC\",\n};\n\nexport const rendererBlades = {\n shadowMapType: shadowMapTypes[composerValues.renderer.shadowMap],\n toneMappingType: rendererToneMappingTypes[composerValues.renderer.toneMapping],\n};\n\nexport const setShadowMapType = (value: number): void => {\n rendererBlades.shadowMapType = shadowMapTypes[value];\n};\n\nexport const setToneMappingType = (value: number): void => {\n rendererBlades.toneMappingType = rendererToneMappingTypes[value];\n};\n\nexport const customToneMappingBlade = {\n customToneMappingType: customToneMappingTypes[composerValues.toneMapping.mode],\n};\n\nexport const setCustomToneMappingType = (value: number): void => {\n customToneMappingBlade.customToneMappingType = customToneMappingTypes[value];\n};\n\nexport const ssaoMaterialParams = [\n \"fade\",\n \"bias\",\n \"minRadiusScale\",\n \"worldDistanceThreshold\",\n \"worldDistanceFalloff\",\n \"worldProximityThreshold\",\n \"worldProximityFalloff\",\n];\n\nexport const statsData = {\n triangles: \"0\",\n geometries: \"0\",\n textures: \"0\",\n shaders: \"0\",\n postPasses: \"0\",\n drawCalls: \"0\",\n rawDeltaTime: \"0\",\n deltaTime: \"0\",\n FPS: \"0\",\n};\n", "export const envValues = {\n ambientLight: {\n ambientLightIntensity: 0.0,\n ambientLightColor: { r: 1, g: 1, b: 1 },\n },\n fog: {\n fogNear: 30,\n fogFar: 210,\n fogColor: { r: 0.42, g: 0.48, b: 0.59 },\n },\n};\n\nexport const envOptions = {\n ambientLight: {\n ambientLightIntensity: { min: 0, max: 1, step: 0.01 },\n },\n fog: {\n fogNear: { min: 0, max: 80, step: 1 },\n fogFar: { min: 81, max: 300, step: 1 },\n },\n};\n", "import {\n BlendFunction,\n BloomEffect,\n EffectComposer,\n EffectPass,\n SSAOEffect,\n ToneMappingEffect,\n} from \"postprocessing\";\nimport { Color, Scene, WebGLRenderer } from \"three\";\nimport { ButtonApi, FolderApi, Pane, TpChangeEvent } from \"tweakpane\";\n\nimport { GaussGrainEffect } from \"../rendering/post-effects/gauss-grain\";\nimport { Sun } from \"../sun/Sun\";\nimport { TimeManager } from \"../time/TimeManager\";\n\nimport { BrightnessContrastSaturation } from \"./../rendering/post-effects/bright-contrast-sat\";\nimport { characterOptions, characterValues } from \"./characterSettings\";\nimport {\n ssaoMaterialParams,\n statsData,\n composerOptions,\n composerValues,\n rendererBlades,\n setShadowMapType,\n setToneMappingType,\n customToneMappingBlade,\n setCustomToneMappingType,\n} from \"./composerSettings\";\nimport { envOptions, envValues } from \"./envSettings\";\nimport { sunOptions, sunValues } from \"./sunSettings\";\nimport { setTweakpaneActive } from \"./tweakPaneActivity\";\n\nexport class TweakPane {\n private renderer: WebGLRenderer;\n private scene: Scene;\n private composer: EffectComposer;\n\n private guiStyle = `\n:root {\n --tp-base-background-color: hsla(0, 0%, 10%, 0.8);\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\n --tp-button-background-color: hsla(0, 0%, 80%, 1);\n --tp-button-background-color-active: hsla(0, 0%, 100%, 1);\n --tp-button-background-color-focus: hsla(0, 0%, 95%, 1);\n --tp-button-background-color-hover: hsla(0, 0%, 85%, 1);\n --tp-button-foreground-color: hsla(0, 0%, 0%, 0.8);\n --tp-container-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-container-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-container-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-container-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-container-foreground-color: hsla(0, 0%, 100%, 0.5);\n --tp-groove-foreground-color: hsla(0, 0%, 0%, 0.2);\n --tp-input-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-input-background-color-active: hsla(0, 0%, 0%, 0.6);\n --tp-input-background-color-focus: hsla(0, 0%, 0%, 0.5);\n --tp-input-background-color-hover: hsla(0, 0%, 0%, 0.4);\n --tp-input-foreground-color: hsla(0, 0%, 100%, 0.5);\n --tp-label-foreground-color: hsla(0, 0%, 100%, 0.5);\n --tp-monitor-background-color: hsla(0, 0%, 0%, 0.3);\n --tp-monitor-foreground-color: hsla(0, 0%, 100%, 0.3);\n}\n\n.tp-brkv {\n -webkit-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n\n.tp-dfwv {\n width: 333px !important;\n display: none;\n}\n\n.tp-lblv_l {\n font-size: 10px;\n padding-left: 0px !important;\n padding-right: 0px !important;\n}\n`;\n\n private gui: Pane = new Pane();\n\n private render: FolderApi;\n private stats: FolderApi;\n private renderOptions: FolderApi;\n private ssao: FolderApi;\n private toneMapping: FolderApi;\n private post: FolderApi;\n\n private export: FolderApi;\n\n private characterMaterial: FolderApi;\n\n private environment: FolderApi;\n\n private sun: FolderApi;\n private sunButton: ButtonApi;\n private ambient: FolderApi;\n\n private saveVisibilityInLocalStorage: boolean = true;\n public guiVisible: boolean = false;\n\n constructor(renderer: WebGLRenderer, scene: Scene, composer: EffectComposer) {\n if (this.saveVisibilityInLocalStorage) {\n const localStorageGuiVisible = localStorage.getItem(\"guiVisible\");\n if (localStorageGuiVisible !== null) {\n if (localStorageGuiVisible === \"true\") {\n this.guiVisible = true;\n } else if (localStorageGuiVisible === \"false\") {\n this.guiVisible = false;\n }\n }\n }\n\n this.renderer = renderer;\n this.scene = scene;\n this.composer = composer;\n\n const styleElement = document.createElement(\"style\");\n styleElement.type = \"text/css\";\n styleElement.appendChild(document.createTextNode(this.guiStyle));\n document.head.appendChild(styleElement);\n\n this.render = this.gui.addFolder({ title: \"rendering\", expanded: true });\n\n this.stats = this.render.addFolder({ title: \"stats\", expanded: true });\n this.renderOptions = this.render.addFolder({ title: \"renderOptions\", expanded: false });\n this.toneMapping = this.render.addFolder({ title: \"customToneMapping\", expanded: false });\n this.ssao = this.render.addFolder({ title: \"ambientOcclusion\", expanded: false });\n this.post = this.render.addFolder({ title: \"post\", expanded: false });\n\n this.toneMapping.hidden = composerValues.renderer.toneMapping === 5 ? false : true;\n\n // Character\n {\n this.characterMaterial = this.gui.addFolder({ title: \"characterMaterial\", expanded: false });\n this.characterMaterial.addInput(\n characterValues.material,\n \"transmission\",\n characterOptions.material.transmission,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"metalness\",\n characterOptions.material.metalness,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"roughness\",\n characterOptions.material.roughness,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"ior\",\n characterOptions.material.ior,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"thickness\",\n characterOptions.material.thickness,\n );\n this.characterMaterial.addInput(characterValues.material, \"specularColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"specularIntensity\",\n characterOptions.material.specularIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"emissive\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"emissiveIntensity\",\n characterOptions.material.emissiveIntensity,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"envMapIntensity\",\n characterOptions.material.envMapIntensity,\n );\n this.characterMaterial.addInput(characterValues.material, \"sheenColor\", {\n color: { type: \"float\" },\n });\n this.characterMaterial.addInput(\n characterValues.material,\n \"sheen\",\n characterOptions.material.sheen,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoat\",\n characterOptions.material.clearcoat,\n );\n this.characterMaterial.addInput(\n characterValues.material,\n \"clearcoatRoughness\",\n characterOptions.material.clearcoatRoughness,\n );\n\n this.characterMaterial.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n if (e.presetKey === \"specularColor\") {\n characterValues.material.specularColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"emissive\") {\n characterValues.material.emissive = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n if (e.presetKey === \"sheenColor\") {\n characterValues.material.sheenColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n return;\n }\n });\n }\n\n this.environment = this.gui.addFolder({ title: \"environment\", expanded: false });\n this.sun = this.environment.addFolder({ title: \"sun\", expanded: true });\n this.ambient = this.environment.addFolder({ title: \"ambient\", expanded: true });\n\n this.export = this.gui.addFolder({ title: \"import/export\", expanded: false });\n\n window.addEventListener(\"keydown\", this.processKey.bind(this));\n\n this.setupGUIListeners.bind(this)();\n this.setupRenderPane = this.setupRenderPane.bind(this);\n }\n\n private processKey(e: KeyboardEvent): void {\n if (e.key === \"p\") this.toggleGUI();\n }\n\n private setupGUIListeners(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"unset\" : \"none\";\n this.gui.element.addEventListener(\"mousedown\", () => setTweakpaneActive(true));\n this.gui.element.addEventListener(\"mouseup\", () => setTweakpaneActive(false));\n this.gui.element.addEventListener(\"mouseleave\", () => setTweakpaneActive(false));\n }\n\n public setupRenderPane(\n ssaoEffect: SSAOEffect,\n toneMappingEffect: ToneMappingEffect,\n toneMappingPass: EffectPass,\n brightnessContrastSaturation: typeof BrightnessContrastSaturation,\n bloomEffect: BloomEffect,\n gaussGrainEffect: typeof GaussGrainEffect,\n hasLighting: boolean,\n sun: Sun | null,\n setHDR: () => void,\n setAmbientLight: () => void,\n setFog: () => void,\n ): void {\n // Stats\n {\n this.stats.addMonitor(statsData, \"triangles\");\n this.stats.addMonitor(statsData, \"geometries\");\n this.stats.addMonitor(statsData, \"textures\");\n this.stats.addMonitor(statsData, \"shaders\");\n this.stats.addMonitor(statsData, \"postPasses\");\n this.stats.addMonitor(statsData, \"drawCalls\");\n this.stats.addMonitor(statsData, \"rawDeltaTime\");\n this.stats.addMonitor(statsData, \"deltaTime\");\n this.stats.addMonitor(statsData, \"FPS\");\n }\n\n // RenderOptions\n {\n this.renderOptions.addInput(\n composerValues.renderer,\n \"shadowMap\",\n composerOptions.renderer.shadowMap,\n );\n this.renderOptions.addMonitor(rendererBlades, \"shadowMapType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"toneMapping\",\n composerOptions.renderer.toneMapping,\n );\n\n this.renderOptions.addMonitor(rendererBlades, \"toneMappingType\");\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"exposure\",\n composerOptions.renderer.exposure,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgIntensity\",\n composerOptions.renderer.bgIntensity,\n );\n\n this.renderOptions.addInput(\n composerValues.renderer,\n \"bgBlurriness\",\n composerOptions.renderer.bgBlurriness,\n );\n\n this.renderOptions.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.target as any;\n switch (target.label) {\n case \"shadowMap\":\n this.renderer.shadowMap.type = e.value;\n setShadowMapType(e.value);\n break;\n case \"toneMapping\":\n this.renderer.toneMapping = e.value;\n this.toneMapping.hidden = e.value !== 5;\n toneMappingPass.enabled = e.value === 5 ? true : false;\n setToneMappingType(e.value);\n break;\n case \"exposure\":\n this.renderer.toneMappingExposure = e.value;\n break;\n case \"bgIntensity\":\n this.scene.backgroundIntensity = e.value;\n break;\n case \"bgBlurriness\":\n this.scene.backgroundBlurriness = e.value;\n break;\n default:\n break;\n }\n });\n }\n\n // SSAO\n {\n this.ssao.addInput({ showEffectOnly: false }, \"showEffectOnly\");\n this.ssao.addInput(composerValues.ssao, \"samples\", composerOptions.ssao.samples);\n this.ssao.addInput(composerValues.ssao, \"rings\", composerOptions.ssao.rings);\n this.ssao.addInput(\n composerValues.ssao,\n \"luminanceInfluence\",\n composerOptions.ssao.luminanceInfluence,\n );\n this.ssao.addInput(composerValues.ssao, \"radius\", composerOptions.ssao.radius);\n this.ssao.addInput(composerValues.ssao, \"intensity\", composerOptions.ssao.intensity);\n this.ssao.addInput(composerValues.ssao, \"bias\", composerOptions.ssao.bias);\n this.ssao.addInput(composerValues.ssao, \"fade\", composerOptions.ssao.fade);\n this.ssao.addInput(\n composerValues.ssao,\n \"resolutionScale\",\n composerOptions.ssao.resolutionScale,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceThreshold\",\n composerOptions.ssao.worldDistanceThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldDistanceFalloff\",\n composerOptions.ssao.worldDistanceFalloff,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityThreshold\",\n composerOptions.ssao.worldProximityThreshold,\n );\n this.ssao.addInput(\n composerValues.ssao,\n \"worldProximityFalloff\",\n composerOptions.ssao.worldProximityFalloff,\n );\n this.ssao.addInput(composerValues.ssao, \"color\", {\n color: { alpha: false, type: \"float\" },\n });\n this.ssao.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"showEffectOnly\") {\n ssaoEffect.blendMode.blendFunction =\n e.value === true ? BlendFunction.NORMAL : BlendFunction.MULTIPLY;\n return;\n }\n if (preset === \"resolutionScale\") {\n ssaoEffect.resolution.scale = e.value;\n return;\n }\n if (ssaoMaterialParams.includes(e.presetKey!)) {\n (ssaoEffect.ssaoMaterial as any)[preset] = e.value;\n return;\n }\n if (e.presetKey === \"color\") {\n ssaoEffect.color = new Color().setRGB(e.value.r, e.value.g, e.value.b);\n return;\n }\n (ssaoEffect as any)[preset] = e.value;\n });\n }\n\n // ToneMapping\n {\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"mode\",\n composerOptions.toneMapping.mode,\n );\n this.toneMapping.addMonitor(customToneMappingBlade, \"customToneMappingType\");\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"whitePoint\",\n composerOptions.toneMapping.whitePoint,\n );\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"middleGrey\",\n composerOptions.toneMapping.middleGrey,\n );\n const minLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"minLuminance\",\n composerOptions.toneMapping.minLuminance,\n );\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n const averageLuminance = this.toneMapping.addInput(\n composerValues.toneMapping,\n \"averageLuminance\",\n composerOptions.toneMapping.averageLuminance,\n );\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n this.toneMapping.addInput(\n composerValues.toneMapping,\n \"adaptationRate\",\n composerOptions.toneMapping.adaptationRate,\n );\n this.toneMapping.on(\"change\", (e: TpChangeEvent<any>) => {\n if (!e.presetKey) {\n return;\n }\n const preset = e.presetKey;\n if (preset === \"mode\") {\n minLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n averageLuminance.hidden = composerValues.toneMapping.mode === 2 ? true : false;\n setCustomToneMappingType(e.value);\n }\n (toneMappingEffect as any)[preset] = e.value;\n return;\n });\n }\n\n // Post\n {\n this.post.addInput(composerValues, \"brightness\", composerOptions.brightness.amount);\n this.post.addInput(composerValues, \"contrast\", composerOptions.contrast.amount);\n this.post.addInput(composerValues, \"saturation\", composerOptions.saturation.amount);\n\n this.post.addInput(composerValues, \"bloom\", composerOptions.bloom.amount);\n this.post.addInput(composerValues, \"grain\", composerOptions.grain.amount);\n\n this.post.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n switch (target) {\n case \"brightness\":\n brightnessContrastSaturation.uniforms.brightness.value = e.value;\n break;\n case \"contrast\":\n brightnessContrastSaturation.uniforms.contrast.value = e.value;\n break;\n case \"saturation\":\n brightnessContrastSaturation.uniforms.saturation.value = e.value;\n break;\n case \"bloom\":\n bloomEffect.intensity = e.value;\n break;\n case \"grain\":\n gaussGrainEffect.uniforms.amount.value = e.value;\n break;\n default:\n break;\n }\n });\n }\n\n // Environment\n {\n this.environment.hidden = hasLighting === false || sun === null;\n this.sun.addInput(\n sunValues.sunPosition,\n \"sunAzimuthalAngle\",\n sunOptions.sunPosition.sunAzimuthalAngle,\n );\n this.sun.addInput(\n sunValues.sunPosition,\n \"sunPolarAngle\",\n sunOptions.sunPosition.sunPolarAngle,\n );\n this.sun.addInput(sunValues, \"sunIntensity\", sunOptions.sunIntensity);\n this.sun.addInput(sunValues, \"sunColor\", {\n color: { type: \"float\" },\n });\n this.sunButton = this.sun.addButton({ title: \"Set HDRI\" });\n this.sunButton.on(\"click\", () => {\n setHDR();\n });\n\n this.sun.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n switch (target) {\n case \"sunAzimuthalAngle\":\n sun?.setAzimuthalAngle(e.value * (Math.PI / 180));\n break;\n case \"sunPolarAngle\":\n sun?.setPolarAngle(e.value * (Math.PI / 180));\n break;\n case \"sunIntensity\":\n sun?.setIntensity(e.value);\n break;\n case \"sunColor\":\n sunValues.sunColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n sun?.setColor();\n break;\n default:\n break;\n }\n });\n\n this.ambient.addInput(\n envValues.ambientLight,\n \"ambientLightIntensity\",\n envOptions.ambientLight.ambientLightIntensity,\n );\n this.ambient.addInput(envValues.ambientLight, \"ambientLightColor\", {\n color: { type: \"float\" },\n });\n this.ambient.addInput(envValues.fog, \"fogNear\", envOptions.fog.fogNear);\n this.ambient.addInput(envValues.fog, \"fogFar\", envOptions.fog.fogFar);\n this.ambient.addInput(envValues.fog, \"fogColor\", {\n color: { type: \"float\" },\n });\n\n this.ambient.on(\"change\", (e: TpChangeEvent<any>) => {\n const target = e.presetKey;\n switch (target) {\n case \"ambientLightIntensity\":\n envValues.ambientLight.ambientLightIntensity = e.value;\n setAmbientLight();\n break;\n case \"ambientLightColor\":\n envValues.ambientLight.ambientLightColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n setAmbientLight();\n break;\n case \"fogNear\":\n envValues.fog.fogNear = e.value;\n setFog();\n break;\n case \"fogFar\":\n envValues.fog.fogFar = e.value;\n setFog();\n break;\n case \"fogColor\":\n envValues.fog.fogColor = {\n r: e.value.r,\n g: e.value.g,\n b: e.value.b,\n };\n setFog();\n break;\n default:\n break;\n }\n });\n }\n\n const exportButton = this.export.addButton({ title: \"export\" });\n exportButton.on(\"click\", () => {\n this.downloadSettingsAsJSON(this.gui.exportPreset());\n });\n const importButton = this.export.addButton({ title: \"import\" });\n importButton.on(\"click\", () => {\n this.importSettingsFromJSON((settings) => {\n this.gui.importPreset(settings);\n });\n });\n }\n\n private formatDateForFilename(): string {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, \"0\"); // Months are 0-11\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}`;\n }\n\n private downloadSettingsAsJSON(settings: any) {\n const jsonString = JSON.stringify(settings, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.download = `settings ${this.formatDateForFilename()}.json`;\n a.href = url;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n private importSettingsFromJSON(callback: (settings: any) => void) {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json\";\n input.addEventListener(\"change\", (event) => {\n const file = (event.target as HTMLInputElement).files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (loadEvent) => {\n try {\n const settings = JSON.parse(loadEvent.target?.result as string);\n callback(settings);\n } catch (err) {\n console.error(\"Error parsing JSON:\", err);\n }\n };\n reader.readAsText(file);\n }\n });\n input.click();\n }\n\n public updateStats(timeManager: TimeManager): void {\n const { geometries, textures } = this.renderer.info.memory;\n const { triangles, calls } = this.renderer.info.render;\n statsData.triangles = triangles.toString();\n statsData.geometries = geometries.toString();\n statsData.textures = textures.toString();\n statsData.shaders = this.renderer.info.programs!.length.toString();\n statsData.postPasses = this.composer.passes.length.toString();\n statsData.drawCalls = calls.toString();\n statsData.rawDeltaTime = (Math.round(timeManager.rawDeltaTime * 100000) / 100000).toString();\n statsData.deltaTime = (Math.round(timeManager.deltaTime * 100000) / 100000).toString();\n statsData.FPS = timeManager.fps.toString();\n }\n\n private toggleGUI(): void {\n const gui = this.gui as any;\n const paneElement: HTMLElement = gui.containerElem_;\n paneElement.style.display = this.guiVisible ? \"none\" : \"unset\";\n this.guiVisible = !this.guiVisible;\n if (this.saveVisibilityInLocalStorage) {\n localStorage.setItem(\"guiVisible\", this.guiVisible === true ? \"true\" : \"false\");\n }\n }\n}\n", "import { ShaderMaterial, Uniform } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const BrightnessContrastSaturation = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n brightness: new Uniform(0.0),\n contrast: new Uniform(1.0),\n saturation: new Uniform(1.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform float brightness;\n uniform float contrast;\n uniform float saturation;\n\n mat4 brightnessMatrix(float brightness) {\n return mat4(\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n brightness, brightness, brightness, 1\n );\n }\n\n mat4 contrastMatrix(float contrast) {\n float t = (1.0 - contrast) / 2.0;\n\n return mat4(\n contrast, 0, 0, 0,\n 0, contrast, 0, 0,\n 0, 0, contrast, 0,\n t, t, t, 1\n );\n }\n\n mat4 saturationMatrix(float saturation) {\n vec3 luminance = vec3(0.3086, 0.6094, 0.0820);\n float oneMinusSat = 1.0 - saturation;\n vec3 red = vec3(luminance.x * oneMinusSat);\n red += vec3(saturation, 0, 0);\n vec3 green = vec3(luminance.y * oneMinusSat);\n green += vec3(0, saturation, 0);\n vec3 blue = vec3(luminance.z * oneMinusSat);\n blue += vec3(0, 0, saturation);\n return mat4(\n red, 0,\n green, 0,\n blue, 0,\n 0, 0, 0, 1\n );\n }\n\n void main(void) {\n vec4 color = texture(tDiffuse, vUv);\n gl_FragColor = (\n brightnessMatrix(brightness) *\n contrastMatrix(contrast) *\n saturationMatrix(saturation) *\n color\n );\n }\n `,\n dithering: true,\n});\n", "export const vertexShader = /* glsl */ `\n precision highp float;\n\n out vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n", "import { ShaderMaterial, Uniform, Vector2 } from \"three\";\n\nimport { vertexShader } from \"../shaders/vertex-shader\";\n\nexport const GaussGrainEffect = new ShaderMaterial({\n uniforms: {\n tDiffuse: new Uniform(null),\n resolution: new Uniform(new Vector2()),\n time: new Uniform(0.0),\n amount: new Uniform(0.0),\n alpha: new Uniform(0.0),\n },\n vertexShader: vertexShader,\n fragmentShader: /* glsl */ `\n precision highp float;\n in vec2 vUv;\n\n uniform sampler2D tDiffuse;\n uniform vec2 resolution;\n uniform float time;\n uniform float amount;\n uniform float alpha;\n\n const float PI = acos(-1.0);\n const float TAU = PI * 2.0;\n const float SQRTAU = sqrt(TAU);\n\n float gaussian(float z, float u, float o) {\n return (\n (1.0 / (o * SQRTAU)) *\n (exp(-(((z - u) * (z - u)) / (2.0 * (o * o)))))\n );\n }\n\n vec3 gaussgrain() {\n vec2 ps = vec2(1.0) / resolution.xy;\n vec2 uv = gl_FragCoord.xy * ps;\n float t = time;\n float seed = dot(uv, vec2(12.9898, 78.233));\n float noise = fract(sin(seed) * 43758.5453123 + t);\n noise = gaussian(noise, 0.0, 0.5);\n return vec3(noise);\n }\n\n void main(void) {\n vec2 uv = vUv;\n vec4 originalColor = texture(tDiffuse, uv);\n vec3 grain = gaussgrain();\n vec3 col = originalColor.rgb + (grain * amount);\n gl_FragColor = vec4(clamp(col, 0.0, 1.0), alpha);\n }\n `,\n dithering: true,\n});\n", "import { Clock } from \"three\";\n\nimport { ease } from \"../helpers/math-helpers\";\n\nexport class TimeManager {\n private clock: Clock = new Clock();\n private roundMagnitude: number = 200000;\n private maxAverageFrames: number = 150;\n private deltaTimes: number[] = [];\n\n private targetAverageDeltaTime: number = 0;\n private lerpedAverageMagDelta: number = 0;\n private fpsUpdateTime: number = 0;\n private framesSinceLastFPSUpdate: number = 0;\n\n public time: number = 0;\n public deltaTime: number = 0;\n public rawDeltaTime: number = 0;\n public smoothDeltaTime: number = 0;\n public frame: number = 0;\n public fps: number = 0;\n public averageFPS: number = 0;\n\n update() {\n this.rawDeltaTime = this.clock.getDelta();\n this.frame++;\n this.time += this.rawDeltaTime;\n this.deltaTimes.push(this.rawDeltaTime);\n\n if (this.deltaTimes.length > this.maxAverageFrames) this.deltaTimes.shift();\n\n this.targetAverageDeltaTime =\n this.deltaTimes.reduce((prev, curr) => prev + curr, 0) / this.deltaTimes.length;\n\n this.lerpedAverageMagDelta += ease(\n this.targetAverageDeltaTime * this.roundMagnitude,\n this.lerpedAverageMagDelta,\n 0.12,\n );\n\n const revertMagnitude = this.lerpedAverageMagDelta / this.roundMagnitude;\n const smoothDT = Math.round(revertMagnitude * this.roundMagnitude) / this.roundMagnitude;\n\n this.smoothDeltaTime = smoothDT > this.rawDeltaTime * 1.75 ? this.rawDeltaTime : smoothDT;\n this.deltaTime = this.smoothDeltaTime;\n\n this.framesSinceLastFPSUpdate++;\n if (this.framesSinceLastFPSUpdate >= 60) {\n this.fps =\n Math.round((this.framesSinceLastFPSUpdate / (this.time - this.fpsUpdateTime)) * 100) / 100;\n\n this.fpsUpdateTime = this.time;\n this.framesSinceLastFPSUpdate = 0;\n }\n }\n}\n", "import {\n MElement,\n MMLCollisionTrigger,\n getRelativePositionAndRotationRelativeToObject,\n} from \"mml-web\";\nimport {\n Box3,\n BufferGeometry,\n Color,\n DoubleSide,\n Euler,\n FrontSide,\n Group,\n Line3,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Ray,\n Scene,\n Vector3,\n} from \"three\";\nimport * as BufferGeometryUtils from \"three/examples/jsm/utils/BufferGeometryUtils.js\";\nimport { MeshBVH, MeshBVHVisualizer } from \"three-mesh-bvh\";\n\ntype CollisionMeshState = {\n source: Group;\n meshBVH: MeshBVH;\n visualizer: MeshBVHVisualizer | null;\n};\n\nexport class CollisionsManager {\n private debug: boolean = false;\n private scene: Scene;\n private tempVector: Vector3 = new Vector3();\n private tempVector2: Vector3 = new Vector3();\n\n public collisionMeshState: Map<Group, CollisionMeshState> = new Map();\n private collisionTrigger: MMLCollisionTrigger;\n\n constructor(scene: Scene) {\n this.scene = scene;\n this.collisionTrigger = MMLCollisionTrigger.init();\n }\n\n public raycastFirstDistance(ray: Ray): number | null {\n let minimumDistance: number | null = null;\n for (const [, value] of this.collisionMeshState) {\n const hit = value.meshBVH.raycastFirst(ray, DoubleSide);\n if (hit) {\n if (minimumDistance === null || hit.distance < minimumDistance) {\n minimumDistance = hit.distance;\n }\n }\n }\n return minimumDistance;\n }\n\n private createCollisionMeshState(group: Group): CollisionMeshState {\n const geometries: Array<BufferGeometry> = [];\n group.traverse((child: Object3D) => {\n if (child.type === \"Mesh\") {\n const mesh = child as Mesh;\n mesh.localToWorld(new Vector3());\n mesh.updateMatrixWorld();\n const clonedGeometry = mesh.geometry.clone();\n clonedGeometry.applyMatrix4(mesh.matrixWorld);\n\n for (const key in clonedGeometry.attributes) {\n if (key !== \"position\") {\n clonedGeometry.deleteAttribute(key);\n }\n }\n if (clonedGeometry.index) {\n geometries.push(clonedGeometry.toNonIndexed());\n } else {\n geometries.push(clonedGeometry);\n }\n }\n });\n const newBufferGeometry = BufferGeometryUtils.mergeGeometries(geometries);\n const meshBVH = new MeshBVH(newBufferGeometry);\n\n if (!this.debug) {\n return { source: group, visualizer: null, meshBVH };\n }\n\n const mergedMesh = new Mesh(\n newBufferGeometry,\n new MeshStandardMaterial({ color: 0xff0000, side: FrontSide, wireframe: true }),\n );\n mergedMesh.geometry.boundsTree = meshBVH;\n const visualizer = new MeshBVHVisualizer(mergedMesh, 3);\n visualizer.edgeMaterial.color = new Color(0x0000ff);\n visualizer.update();\n return { source: group, visualizer, meshBVH };\n }\n\n public addMeshesGroup(group: Group, mElement?: MElement): void {\n if (mElement) {\n this.collisionTrigger.addCollider(group, mElement);\n }\n const meshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.add(meshState.visualizer);\n }\n this.collisionMeshState.set(group, meshState);\n }\n\n public updateMeshesGroup(group: Group): void {\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n const newMeshState = this.createCollisionMeshState(group);\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n if (newMeshState.visualizer) {\n this.scene.add(newMeshState.visualizer);\n }\n this.collisionMeshState.set(group, newMeshState);\n }\n }\n\n public removeMeshesGroup(group: Group): void {\n this.collisionTrigger.removeCollider(group);\n const meshState = this.collisionMeshState.get(group);\n if (meshState) {\n if (meshState.visualizer) {\n this.scene.remove(meshState.visualizer);\n }\n this.collisionMeshState.delete(group);\n }\n }\n\n private applyCollider(\n tempSegment: Line3,\n radius: number,\n boundingBox: Box3,\n meshState: CollisionMeshState,\n ): Vector3 | null {\n let collisionPosition: Vector3 | null = null;\n meshState.meshBVH.shapecast({\n intersectsBounds: (box) => box.intersectsBox(boundingBox),\n intersectsTriangle: (tri) => {\n const triPoint = this.tempVector;\n const capsulePoint = this.tempVector2;\n const distance = tri.closestPointToSegment(tempSegment, triPoint, capsulePoint);\n if (distance < radius) {\n const depth = radius - distance;\n collisionPosition = new Vector3().copy(capsulePoint);\n const direction = capsulePoint.sub(triPoint).normalize();\n tempSegment.start.addScaledVector(direction, depth);\n tempSegment.end.addScaledVector(direction, depth);\n }\n },\n });\n return collisionPosition;\n }\n\n public applyColliders(tempSegment: Line3, radius: number, boundingBox: Box3) {\n let collidedElements: Map<\n Object3D,\n {\n position: { x: number; y: number; z: number };\n }\n > | null = null;\n for (const meshState of this.collisionMeshState.values()) {\n const collisionPosition = this.applyCollider(tempSegment, radius, boundingBox, meshState);\n if (collisionPosition) {\n if (collidedElements === null) {\n collidedElements = new Map();\n }\n const relativePosition = getRelativePositionAndRotationRelativeToObject(\n {\n position: collisionPosition,\n rotation: new Euler(),\n },\n meshState.source,\n );\n collidedElements.set(meshState.source, {\n position: relativePosition.position,\n });\n }\n }\n\n this.collisionTrigger.setCurrentCollisions(collidedElements);\n }\n}\n"],
|
5
|
+
"mappings": ";;;;;;;;AAAA,SAAS,mBAAmB,WAAW,WAAAA,gBAAe;;;ACAtD,SAAS,eAAe;AAEjB,IAAM,+BAA+B,CAC1C,QACA,WACA,IACA,OAAe,MACH;AACZ,MAAI,KAAK;AAAG,UAAM;AAClB,QAAM,cAAc,KAAK,MAAM,IAAI,KAAK,KAAK,CAAC;AAC9C,QAAM,QAAQ,KAAK;AACnB,QAAM,QAAQ,KAAK;AACnB,QAAM,eAAe,QAAQ;AAC7B,QAAM,IAAI,KAAK,IAAI,KAAK,IAAI;AAC5B,QAAM,IAAI,KAAK,IAAI,KAAK,IAAI;AAC5B,SAAO,IAAI,QAAQ,GAAG,MAAM,CAAC;AAC/B;AAEO,IAAM,QAAQ,CAAC,GAAW,WAA2B;AAC1D,SAAO,OAAO,EAAE,QAAQ,MAAM,CAAC;AACjC;AAEO,IAAM,OAAO,CAAC,QAAgB,GAAW,WAA2B;AACzE,SAAO,OAAO,SAAS,KAAK,QAAQ,CAAC;AACvC;AAEO,SAAS,MAAM,OAAe,KAAa,KAAqB;AACrE,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;AAEO,IAAM,QAAQ,CACnB,OACA,UACA,UACA,gBACA,mBACW;AACX,SACE,kBACE,iBAAiB,mBAAmB,QAAQ,aAAc,WAAW;AAE3E;;;ACzCA,IAAI,oBAAoB;AAEjB,SAAS,mBAAmB,QAAiB;AAClD,sBAAoB;AACtB;AAEO,SAAS,qBAAqB;AACnC,SAAO;AACT;;;AFFO,IAAM,gBAAN,MAAoB;AAAA,EAkCzB,YAAoB,mBAAsC;AAAtC;AAjCpB,wBAAgB;AAEhB,wBAAO,mBAA0B;AAEjC,wBAAQ,eAAsB;AAC9B,wBAAQ,eAAsB;AAE9B,wBAAQ,cAAqB;AAC7B,wBAAQ,OAAc,KAAK;AAC3B,wBAAQ,UAAiB;AACzB,wBAAQ,UAAiB;AACzB,wBAAQ,aAAoB,KAAK;AAEjC,wBAAQ,iBAAwB,KAAK,KAAK;AAC1C,wBAAQ,iBAAwB,KAAK,KAAK;AAE1C,wBAAQ,iBAAwB;AAEhC,wBAAO,kBAAyB,KAAK;AACrC,wBAAQ,YAAmB,KAAK;AAEhC,wBAAQ,aAA2B,KAAK,KAAK;AAC7C,wBAAQ,OAAqB,KAAK,KAAK;AACvC,wBAAQ,eAA6B,CAAC,KAAK,KAAK;AAChD,wBAAQ,SAAuB,CAAC,KAAK,KAAK;AAC1C,wBAAQ,YAAoB;AAE5B,wBAAQ,UAAkB,IAAIC,SAAQ,GAAG,MAAM,CAAC;AAEhD,wBAAQ,aAAqB;AAE7B,wBAAQ;AAGN,SAAK,SAAS,IAAI,kBAAkB,KAAK,KAAK,OAAO,aAAa,OAAO,aAAa,KAAK,GAAG;AAC9F,SAAK,OAAO,SAAS,IAAI,GAAG,KAAK,CAAC,KAAK,eAAe;AAEtD,SAAK,YAAY,IAAI,UAAU;AAE/B,aAAS,iBAAiB,aAAa,KAAK,YAAY,KAAK,IAAI,CAAC;AAClE,aAAS,iBAAiB,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC;AAC9D,aAAS,iBAAiB,aAAa,KAAK,YAAY,KAAK,IAAI,CAAC;AAClE,aAAS,iBAAiB,SAAS,KAAK,aAAa,KAAK,IAAI,CAAC;AAC/D,WAAO,iBAAiB,UAAU,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,EAC5D;AAAA,EAEQ,WAAiB;AACvB,UAAM,QAAQ,OAAO;AACrB,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,OAAO,uBAAuB;AAAA,EACrC;AAAA,EAEQ,YAAY,QAA0B;AAC5C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,UAAU,QAA0B;AAC1C,SAAK,WAAW;AAAA,EAClB;AAAA,EAEQ,YAAY,OAAyB;AAC3C,QAAI,CAAC,KAAK,YAAY,mBAAmB,MAAM;AAAM;AACrD,QAAI,KAAK,gBAAgB,QAAQ,KAAK,cAAc;AAAM;AAC1D,SAAK,eAAe,MAAM,YAAY;AACtC,SAAK,aAAa,MAAM,YAAY;AACpC,SAAK,YAAY,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,KAAK,eAAe,KAAK,SAAS,CAAC;AAAA,EAC5F;AAAA,EAEQ,aAAa,OAAyB;AAC5C,UAAM,eAAe,MAAM,SAAS;AACpC,SAAK,kBAAkB;AACvB,SAAK,iBAAiB,KAAK;AAAA,MACzB,KAAK;AAAA,MACL,KAAK,IAAI,KAAK,aAAa,KAAK,cAAc;AAAA,IAChD;AAAA,EACF;AAAA,EAEO,UAAU,QAAuB;AACtC,SAAK,OAAO,KAAK,MAAM;AACvB,QAAI,CAAC,KAAK,WAAW;AACnB,WAAK,YAAY;AACjB,WAAK,2BAA2B;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,6BAAmC;AACzC,QAAI,KAAK,QAAQ,QAAQ,KAAK,SAAS;AAAM;AAC7C,UAAM,KAAK,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO;AAChD,UAAM,KAAK,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO;AAChD,UAAM,KAAK,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO;AAChD,SAAK,iBAAiB,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAC3D,SAAK,eAAe,KAAK,QAAQ,IAAI,KAAK,OAAO,IAAI,KAAK;AAC1D,SAAK,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,CAAC;AACxD,SAAK,MAAM,KAAK;AAChB,SAAK,QAAQ,KAAK;AAClB,SAAK,WAAW,KAAK;AAAA,EACvB;AAAA,EAEO,uBAA6B;AAClC,SAAK,UAAU;AAAA,MACb,KAAK,OAAO;AAAA,MACZ,KAAK,OAAO,MAAM,EAAE,IAAI,KAAK,OAAO,QAAQ,EAAE,UAAU;AAAA,IAC1D;AACA,UAAM,kBAAkB,KAAK,kBAAkB,qBAAqB,KAAK,UAAU,GAAG;AACtF,UAAM,yBAAyB,KAAK,OAAO,SAAS,WAAW,KAAK,MAAM;AAE1E,QAAI,oBAAoB,QAAQ,mBAAmB,wBAAwB;AACzE,WAAK,iBAAiB,yBAAyB;AAC/C,WAAK,WAAW,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEO,SAAe;AACpB,QAAI,KAAK,WAAW;AAAM;AAC1B,QACE,KAAK,QAAQ,QACb,KAAK,cAAc,QACnB,KAAK,UAAU,QACf,KAAK,gBAAgB,MACrB;AACA,WAAK,aAAa,KAAK,iBAAiB,KAAK,YAAY,KAAK,gBAAgB;AAC9E,WAAK,QAAQ,KAAK,YAAY,KAAK,OAAO,KAAK;AAC/C,WAAK,UAAU,KAAK,cAAc,KAAK,SAAS,KAAK;AAErD,YAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK;AAClF,YAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,GAAG;AAC3D,YAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,GAAG,IAAI,KAAK,IAAI,KAAK,KAAK;AAElF,WAAK,YAAY;AAAA,QACf,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAEA,WAAK,OAAO,KAAK,KAAK,WAAW,KAAK,KAAK,IAAI;AAC/C,WAAK,OAAO,MAAM,KAAK;AACvB,WAAK,OAAO,uBAAuB;AACnC,WAAK,OAAO,kBAAkB;AAE9B,WAAK,OAAO,SAAS,IAAI,GAAG,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC;AAEtD,WAAK,qBAAqB;AAE1B,WAAK,OAAO,OAAO,KAAK,MAAM;AAAA,IAChC;AAAA,EACF;AACF;;;AG5JA,SAAS,SAAAC,QAAO,WAAAC,gBAAe;;;ACA/B;AAAA,EAEE,iBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA,YAAAC;AAAA,OACK;;;ACRP,SAAS,OAAO,sBAAsB,qBAAqB;;;ACApD,IAAM;AAAA;AAAA,EAAiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAvC,SAAS,iBAAiB,cAAsB,cAA8B;AACnF,SAAO,aAAa;AAAA,IAClB;AAAA,IACA;AAAA;AAAA,EAEF;AAAA;AAAA;AAAA,EAGA;AACF;AAEO,SAAS,iBAAiB,cAAsB,cAA8B;AACnF,SAAO,aAAa;AAAA,IAClB;AAAA,IACA;AAAA;AAAA,EAEF;AAAA;AAAA;AAAA,EAGA;AACF;AAEO,SAAS,aAAa,cAAsB,QAAgB,cAA8B;AAC/F,SAAO,aAAa;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AACF;;;AC/BO,IAAM,kBAAkB;AAAA,EAC7B,UAAU;AAAA,IACR,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,KAAK;AAAA,IACL,WAAW;AAAA,IACX,eAAe,EAAE,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI;AAAA,IACxC,mBAAmB;AAAA,IACnB,UAAU,EAAE,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI;AAAA,IACnC,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,YAAY,EAAE,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI;AAAA,IACrC,OAAO;AAAA,IACP,WAAW;AAAA,IACX,oBAAoB;AAAA,EACtB;AACF;AAEO,IAAM,mBAAmB;AAAA,EAC9B,UAAU;AAAA,IACR,cAAc,EAAE,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK;AAAA,IAC9C,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACxC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACxC,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IAClC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACxC,mBAAmB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IAChD,mBAAmB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IAChD,iBAAiB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IAC9C,OAAO,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACpC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACxC,oBAAoB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,EACnD;AACF;;;AHrBO,IAAM,oBAAN,cAAgC,qBAAqB;AAAA,EAI1D,cAAc;AACZ,UAAM;AAJR,wBAAO,YAAqC,CAAC;AAC7C,wBAAO,iBAAyB,CAAC;AAI/B,SAAK,QAAQ,IAAI,MAAM,QAAQ;AAC/B,SAAK,eAAe,gBAAgB,SAAS;AAC7C,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,MAAM,gBAAgB,SAAS;AACpC,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,gBAAgB,IAAI,MAAM,EAAE;AAAA,MAC/B,gBAAgB,SAAS,cAAc;AAAA,MACvC,gBAAgB,SAAS,cAAc;AAAA,MACvC,gBAAgB,SAAS,cAAc;AAAA,IACzC;AACA,SAAK,oBAAoB,gBAAgB,SAAS;AAClD,SAAK,WAAW,IAAI,MAAM,EAAE;AAAA,MAC1B,gBAAgB,SAAS,SAAS;AAAA,MAClC,gBAAgB,SAAS,SAAS;AAAA,MAClC,gBAAgB,SAAS,SAAS;AAAA,IACpC;AACA,SAAK,oBAAoB,gBAAgB,SAAS;AAClD,SAAK,kBAAkB,gBAAgB,SAAS;AAChD,SAAK,aAAa,IAAI,MAAM,EAAE;AAAA,MAC5B,gBAAgB,SAAS,WAAW;AAAA,MACpC,gBAAgB,SAAS,WAAW;AAAA,MACpC,gBAAgB,SAAS,WAAW;AAAA,IACtC;AACA,SAAK,QAAQ,gBAAgB,SAAS;AACtC,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,qBAAqB,gBAAgB,SAAS;AAEnD,SAAK,kBAAkB,CAAC,WAAW;AACjC,WAAK,WAAW,cAAc,MAAM,OAAO,QAAQ;AACnD,WAAK,SAAS,WAAW,EAAE,OAAO,KAAK;AACvC,WAAK,SAAS,UAAU,EAAE,OAAO,IAAO;AACxC,WAAK,SAAS,gBAAgB,EAAE,OAAO,KAAK;AAC5C,WAAK,SAAS,iBAAiB,EAAE,OAAO,IAAI;AAC5C,WAAK,SAAS,OAAO,EAAE,OAAO,EAAI;AAClC,WAAK,SAAS,qBAAqB,EAAE,OAAO,IAAI,MAAM,EAAE;AACxD,aAAO,WAAW,KAAK;AAEvB,aAAO,eAAe,iBAAiB,OAAO,cAAc,mBAAmB;AAC/E,aAAO,eAAe,iBAAiB,OAAO,cAAc,WAAW;AAEvE,aAAO,iBAAiB;AAAA,QACtB,OAAO;AAAA;AAAA,QACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YASP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBN;AAEA,aAAO,iBAAiB;AAAA,QACtB,OAAO;AAAA,QACP;AAAA;AAAA,QACW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiCb;AAAA,IACF;AAEA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAAoB;AAC1B,UAAM,aAAa;AACnB,UAAM,YAAY;AAClB,UAAM,uBAAuB;AAC7B,QAAI,MAAM;AAEV,aAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,YAAM,QAAQ,IAAI,MAAM;AACxB,YAAM,OAAO,KAAK,YAAY,SAAS;AACvC,WAAK,cAAc,KAAK,KAAK;AAC7B,aAAO,MAAM,wBAAwB;AAAA,IACvC;AAAA,EACF;AAAA,EAEO,SAAS;AACd,SAAK,eAAe,gBAAgB,SAAS;AAC7C,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,MAAM,gBAAgB,SAAS;AACpC,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,gBAAgB,IAAI,MAAM,EAAE;AAAA,MAC/B,gBAAgB,SAAS,cAAc;AAAA,MACvC,gBAAgB,SAAS,cAAc;AAAA,MACvC,gBAAgB,SAAS,cAAc;AAAA,IACzC;AACA,SAAK,oBAAoB,gBAAgB,SAAS;AAClD,SAAK,WAAW,IAAI,MAAM,EAAE;AAAA,MAC1B,gBAAgB,SAAS,SAAS;AAAA,MAClC,gBAAgB,SAAS,SAAS;AAAA,MAClC,gBAAgB,SAAS,SAAS;AAAA,IACpC;AACA,SAAK,oBAAoB,gBAAgB,SAAS;AAClD,SAAK,kBAAkB,gBAAgB,SAAS;AAChD,SAAK,aAAa,IAAI,MAAM,EAAE;AAAA,MAC5B,gBAAgB,SAAS,WAAW;AAAA,MACpC,gBAAgB,SAAS,WAAW;AAAA,MACpC,gBAAgB,SAAS,WAAW;AAAA,IACtC;AACA,SAAK,QAAQ,gBAAgB,SAAS;AACtC,SAAK,YAAY,gBAAgB,SAAS;AAC1C,SAAK,qBAAqB,gBAAgB,SAAS;AAAA,EACrD;AACF;;;AIjLO,IAAK,iBAAL,kBAAKC,oBAAL;AACL,EAAAA,gCAAA,UAAS,KAAT;AACA,EAAAA,gCAAA,aAAY,KAAZ;AACA,EAAAA,gCAAA,aAAY,KAAZ;AACA,EAAAA,gCAAA,eAAc,KAAd;AACA,EAAAA,gCAAA,SAAQ,KAAR;AACA,EAAAA,gCAAA,iBAAgB,KAAhB;AANU,SAAAA;AAAA,GAAA;;;ACAZ,SAAwB,sBAAgC;AACxD,SAAe,cAAc,uBAAuB;AAEpD,IAAM,mBAAN,cAA+B,gBAAgB;AAAA,EAG7C,YAAY,SAA0B;AACpC,UAAM,OAAO;AAHf,wBAAQ;AAIN,SAAK,YAAY,oBAAI,IAAI;AAAA,EAC3B;AAAA,EAEA,WAAW,aAAqB,SAAiB;AAC/C,SAAK,UAAU,IAAI,aAAa,OAAO;AAAA,EACzC;AAAA,EAEA,WAAW,aAAyC;AAClD,WAAO,KAAK,UAAU,IAAI,WAAW;AAAA,EACvC;AAAA,EAEA,KACE,KACA,QACA,YACA,SACM;AACN,UAAM,UAAU,KAAK,WAAW,GAAG;AACnC,QAAI,SAAS;AACX,cAAQ,IAAI,kBAAkB,IAAI,MAAM,GAAG,EAAE,IAAI,GAAG;AACpD,YAAM,KAAK,SAAS,QAAQ,YAAY,OAAO;AAAA,IACjD,OAAO;AACL,YAAM,KAAK,KAAK,QAAQ,YAAY,OAAO;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,IAAM,WAAN,MAAqB;AAAA,EAInB,YAAY,UAAkB,KAAK;AAHnC,wBAAQ;AACR,wBAAQ;AAGN,SAAK,UAAU;AACf,SAAK,QAAQ,oBAAI,IAAI;AAAA,EACvB;AAAA,EAEA,IAAI,KAAuB;AACzB,UAAM,OAAO,KAAK,MAAM,IAAI,GAAG;AAC/B,QAAI,MAAM;AACR,WAAK,MAAM,OAAO,GAAG;AACrB,WAAK,MAAM,IAAI,KAAK,IAAI;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,KAAQ,OAAgB;AAC1B,QAAI,KAAK,MAAM,QAAQ,KAAK,SAAS;AACnC,YAAM,YAAY,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC3C,WAAK,MAAM,OAAO,SAAS;AAAA,IAC7B;AACA,SAAK,MAAM,IAAI,KAAK,KAAK;AAAA,EAC3B;AACF;AAOO,IAAM,eAAN,MAAkB;AAAA,EAQvB,YAAY,eAAuB,KAAK;AALxC,wBAAiB;AACjB,wBAAiB;AACjB,wBAAQ;AACR,wBAAQ,gBAA2E,oBAAI,IAAI;AAGzF,SAAK,iBAAiB,IAAI,eAAe;AACzC,SAAK,aAAa,IAAI,iBAAiB,KAAK,cAAc;AAC1D,SAAK,aAAa,IAAI,SAAS,YAAY;AAAA,EAC7C;AAAA;AAAA,EAGA,OAAO,cAA2B;AAChC,QAAI,CAAC,aAAY,UAAU;AACzB,mBAAY,WAAW,IAAI,aAAY;AAAA,IACzC;AACA,WAAO,aAAY;AAAA,EACrB;AAAA,EAEA,MAAM,KACJ,SACA,UAC+C;AAC/C,UAAM,cAAc,KAAK,WAAW,IAAI,OAAO;AAE/C,QAAI,aAAa;AACf,YAAM,UAAU,IAAI,gBAAgB,YAAY,IAAI;AACpD,WAAK,WAAW,WAAW,SAAS,OAAO;AAC3C,aAAO,KAAK,YAAY,SAAS,UAAU,YAAY,iBAAiB;AAAA,IAC1E,OAAO;AACL,cAAQ,IAAI,WAAW,qBAAqB;AAC5C,YAAM,cAAc,KAAK,aAAa,IAAI,OAAO;AACjD,UAAI;AAAa,eAAO;AAExB,YAAM,cAAc,MAAM,OAAO,EAC9B,KAAK,CAAC,aAAa,SAAS,KAAK,CAAC,EAClC,KAAK,CAAC,SAAS;AACd,cAAM,oBAAoB,QAAQ,MAAM,GAAG,EAAE,IAAI,KAAK;AACtD,aAAK,WAAW,IAAI,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,cAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,aAAK,aAAa,OAAO,OAAO;AAChC,eAAO,KAAK,YAAY,SAAS,UAAU,iBAAiB;AAAA,MAC9D,CAAC;AAEH,WAAK,aAAa,IAAI,SAAS,WAAW;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,YACZ,KACA,UACA,WAC+C;AAC/C,QAAI,CAAC,QAAQ,KAAK,EAAE,SAAS,SAAS,GAAG;AACvC,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,aAAK,WAAW;AAAA,UACd;AAAA,UACA,CAAC,WAAiB;AAChB,gBAAI,aAAa,SAAS;AACxB,sBAAQ,OAAO,KAAiB;AAAA,YAClC,WAAW,aAAa,aAAa;AACnC,sBAAQ,OAAO,WAAW,CAAC,CAAkB;AAAA,YAC/C,OAAO;AACL,oBAAM,QAAQ,0BAA0B,sCAAsC;AAC9E,sBAAQ,MAAM,KAAK;AACnB,qBAAO,KAAK;AAAA,YACd;AAAA,UACF;AAAA,UACA;AAAA,UACA,CAAC,UAAU;AACT,oBAAQ,MAAM,+BAA+B,QAAQ,OAAO;AAC5D,mBAAO,KAAK;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,OAAO;AACL,cAAQ,MAAM,0BAA0B,kBAAkB,WAAW;AAAA,IACvE;AAAA,EACF;AACF;AAnFO,IAAM,cAAN;AACL,cADW,aACI,YAA+B;AAqFhD,IAAM,eAAe,YAAY,YAAY;AAC7C,IAAO,sBAAQ;;;AN3IR,IAAM,iBAAN,MAAqB;AAAA,EAW1B,YAA6B,sBAA4C;AAA5C;AAT7B;AAAA,wBAAQ,eAAc;AAEtB,wBAAO,QAAwB;AAC/B,wBAAO,YAA8B,IAAI,kBAAkB;AAE3D,wBAAO,cAA8C,CAAC;AACtD,wBAAO,kBAAwC;AAC/C,wBAAO;AAAA,EAEmE;AAAA,EAE1E,MAAa,OAAsB;AACjC,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK;AAAA,MACT,KAAK,qBAAqB;AAAA;AAAA,IAE5B;AACA,UAAM,KAAK;AAAA,MACT,KAAK,qBAAqB;AAAA;AAAA,IAE5B;AACA,UAAM,KAAK;AAAA,MACT,KAAK,qBAAqB;AAAA;AAAA,IAE5B;AACA,UAAM,KAAK;AAAA,MACT,KAAK,qBAAqB;AAAA;AAAA,IAE5B;AACA,SAAK,gCAAgC,KAAK,QAAQ;AAAA,EACpD;AAAA,EAEO,gBAAgB,iBAAiC,WAAmB;AACzE,QAAI,KAAK,qBAAqB,iBAAiB;AAC7C,WAAK,sBAAsB,eAAe;AAAA,IAC5C;AACA,SAAK,gBAAgB,OAAO,SAAS;AAAA,EACvC;AAAA,EAEO,uBAAuB,UAAqB;AACjD,QAAI,CAAC,KAAK;AAAM;AAChB,SAAK,KAAK,SAAS,CAAC,UAAoB;AACtC,UAAI,MAAM,SAAS,iBAAiB,MAAM,SAAS,UAAU;AAC3D,QAAC,MAAe,WAAW,IAAI,qBAAqB;AAAA,UAClD,OAAO;AAAA,UACP,aAAa;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,WACN,MACA,aAAsB,MACtB,gBAAyB,MACnB;AACN,SAAK,SAAS,CAAC,UAAoB;AACjC,UAAI,MAAM,SAAS,eAAe;AAChC,cAAM,aAAa;AACnB,cAAM,gBAAgB;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,gCAAgC,UAAqB;AAC3D,QAAI,CAAC,KAAK;AAAM;AAChB,SAAK,KAAK,SAAS,CAAC,UAAoB;AACtC,UAAI,MAAM,SAAS,eAAe;AAChC,QAAC,MAAe,WAAW;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,qBAAqB;AAC3B,QAAI,KAAK,mBAAmB,QAAQ,KAAK,SAAS;AAAM;AACxD,SAAK,iBAAiB,IAAI,eAAe,KAAK,IAAI;AAAA,EACpD;AAAA,EAEA,MAAc,eAA8B;AAC1C,UAAM,cAAc,KAAK,qBAAqB;AAC9C,UAAM,QAAQ,KAAK,qBAAqB;AACxC,UAAM,YAAY,YAAY,MAAM,GAAG,EAAE,IAAI;AAC7C,UAAM,OAAO,YAAY,MAAM,GAAG,EAAE,IAAI,EAAG,QAAQ,IAAI,aAAa,EAAE;AACtE,UAAM,WAAW,MAAM,KAAK,YAAY,KAAK,aAAa,OAAO;AACjE,QAAI,OAAO,aAAa,aAAa;AACnC,WAAK,OAAO,IAAIC,UAAS;AACzB,YAAM,QAAQ;AACd,YAAM,SAAS,IAAI,GAAG,MAAM,CAAC;AAC7B,WAAK,KAAK,IAAI,KAAK;AACnB,WAAK,KAAK,OAAO;AACjB,WAAK,KAAK,MAAM,IAAI,OAAO,OAAO,KAAK;AACvC,WAAK,WAAW,KAAK,IAAI;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,qBACZ,kBACA,eACe;AACf,WAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC5C,WAAK,mBAAmB;AACxB,YAAM,YAAY,MAAM,KAAK,YAAY,KAAK,kBAAkB,WAAW;AAC3E,UAAI,OAAO,cAAc,eAAe,qBAAqBC,gBAAe;AAC1E,aAAK,WAAW,aAAa,IAAI,KAAK,eAAgB,WAAW,SAAS;AAC1E,aAAK,WAAW,aAAa,EAAE,KAAK;AACpC,YAAI,gCAAuC;AACzC,eAAK,WAAW,aAAa,EAAE,KAAK;AAAA,QACtC;AACA,gBAAQ;AAAA,MACV,OAAO;AACL,eAAO,kBAAkB,sBAAsB,kBAAkB;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,sBACN,iBACA,qBAA6B,MACvB;AACN,QAAI,CAAC,KAAK,QAAQ,KAAK,qBAAqB;AAAM;AAElD,UAAM,gBAAgB,KAAK,WAAW,KAAK,gBAAgB;AAC3D,UAAM,eAAe,KAAK,WAAW,eAAe;AAEpD,QAAI,CAAC;AAAc;AAEnB,QAAI,eAAe;AACjB,oBAAc,UAAU;AACxB,oBAAc,QAAQ,kBAAkB;AAAA,IAC1C;AAEA,QAAI,CAAC,aAAa,UAAU;AAAG,mBAAa,KAAK;AAEjD,iBAAa,QAAQ,YAAY,QAAQ;AACzC,iBAAa,UAAU;AACvB,iBAAa,OAAO,kBAAkB;AAEtC,SAAK,mBAAmB;AAAA,EAC1B;AACF;;;AO7JA;AAAA,EAEE,SAAAC;AAAA,EACA;AAAA,EACA,gBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,qBAAAC;AAAA,EAEA;AAAA,OACK;;;ACTP,YAAY,WAAW;AAuBvB,SAAS,mBAAmB,WAA4B,OAAe;AACrE,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,gBACP,SACA,UACA,GACA,GACA,YACA,UACA,SACA,WACA;AACA,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,MAAI,cAAc;AAClB,aAAW,QAAQ,OAAO;AACxB,eAAW,YAAY;AAEvB,QAAI,YAAY,GAAG;AACjB,cAAQ,SAAS,MAAM,GAAG,IAAI,aAAa,WAAW;AACtD;AACA;AAAA,IACF;AACA,QAAI,QAAQ,KAAK,MAAM,GAAG;AAC1B,QAAI,gBAAgB;AACpB,WAAO,MAAM,SAAS,KAAK,iBAAiB,MAAM,QAAQ;AACxD,YAAM,MAAM,MAAM,MAAM,GAAG,aAAa,EAAE,KAAK,GAAG;AAClD,YAAM,YAAY,QAAQ,YAAY,GAAG,EAAE;AAC3C,UAAI,YAAY,UAAU,IAAI,UAAU;AACtC,YAAI,kBAAkB,GAAG;AACvB,0BAAgB;AAAA,QAClB;AACA,gBAAQ;AAAA,UACN,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,KAAK,GAAG;AAAA,UAC1C,IAAI;AAAA,UACJ,IAAI,aAAa,cAAc;AAAA,QACjC;AACA;AACA,gBAAQ,MAAM,OAAO,gBAAgB,CAAC;AACtC,wBAAgB;AAAA,MAClB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,gBAAgB,KAAK,MAAM,SAAS,GAAG;AACzC,YAAM,UAAU,cAAc,WAAW,IAAI;AAC7C,cAAQ,SAAS,MAAM,KAAK,GAAG,GAAG,IAAI,SAAS,IAAI,aAAa,cAAc,OAAO;AACrF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,WAAW,SAAiB,SAA+C;AACzF,QAAM,WAAW,QAAQ;AACzB,QAAM,YAAY,QAAQ;AAC1B,QAAM,kBAAkB,QAAQ,2BAA2B,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,EAAE;AAC1F,QAAM,UAAU,QAAQ,aAAa;AACrC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,cAAc,QAAQ,OAAO,UAAU,MAAM,WAAW,QAAQ;AAEtE,QAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,QAAM,KAAK,OAAO,WAAW,IAAI;AAGjC,QAAM,YAAa,QAAQ,aAAiC;AAE5D,MAAI,QAAQ,YAAY;AAGtB,WAAO,QAAQ,QAAQ,WAAW;AAClC,WAAO,SAAS,QAAQ,WAAW;AACnC,OAAG,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC9C,OAAG,OAAO;AACV,OAAG,YAAY;AACf,OAAG,YAAY,QAAQ,gBAAgB,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,gBAAgB;AACzG,OAAG,YAAY;AACf,OAAG,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC7C,OAAG,YAAY,QAAQ,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU;AACjF,OAAG,OAAO;AACV;AAAA,MACE;AAAA,MACA;AAAA,MACA,mBAAmB,WAAW,OAAO,KAAK;AAAA,MAC1C;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AAIL,OAAG,OAAO;AACV,UAAM,UAAU,GAAG,YAAY,OAAO;AACtC,UAAM,YAAY,QAAQ;AAC1B,UAAM,aAAa,QAAQ,wBAAwB,QAAQ;AAC3D,WAAO,QAAQ,YAAY,UAAU;AACrC,WAAO,SAAS,aAAa;AAC7B,OAAG,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC9C,OAAG,OAAO;AACV,OAAG,YAAY;AACf,OAAG,YAAY,QAAQ,gBAAgB,MAAM,gBAAgB,MAAM,gBAAgB,MAAM,gBAAgB;AACzG,OAAG,YAAY;AACf,OAAG,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC7C,OAAG,YAAY,QAAQ,UAAU,MAAM,UAAU,MAAM,UAAU,MAAM,UAAU;AACjF,OAAG,OAAO;AACV,OAAG,SAAS,SAAS,UAAU,mBAAmB,WAAW,SAAS,GAAG,UAAU;AAAA,EACrF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,MACA,SAC2D;AAC3D,QAAM,SAAS,WAAW,MAAM,OAAO;AAEvC,QAAM,UAAU,IAAU,cAAQ,MAAM;AACxC,UAAQ,YAAkB;AAC1B,UAAQ,YAAkB;AAC1B,UAAQ,SAAe;AACvB,UAAQ,cAAc;AAEtB,SAAO,EAAE,SAAS,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO;AAC/D;;;AD3IA,IAAM,YAAY;AAClB,IAAM,oBAAoB,IAAIC,OAAM,CAAQ;AAC5C,IAAM,mBAAmB,IAAIA,OAAM,QAAQ;AAC3C,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAC7B,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAC3B,IAAM,0BAA0B;AAEzB,IAAM,mBAAN,MAAuB;AAAA,EAsB5B,YAAY,aAAuB;AArBnC,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAER,wBAAQ,kBAAyB;AACjC,wBAAQ,iBAAwB;AAChC,wBAAQ,eAAsB;AAC9B,wBAAQ,oBAA2B;AAEnC,wBAAQ,SAAQ;AAAA,MACd,SAAS;AAAA,MACT,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,aAAa;AAAA,IACf;AAGE,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,WAAW,IAAIC,mBAAkB;AAAA,MACpC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,SAAK,SAAS,OAAO;AACrB,SAAK,WAAW,IAAI,cAAc,GAAG,GAAG,GAAG,CAAC;AAC5C,SAAK,OAAO,IAAIC,MAAK,KAAK,UAAU,KAAK,QAAQ;AACjD,SAAK,KAAK,SAAS,IAAI,GAAG,KAAK,CAAC;AAChC,SAAK,KAAK,UAAU;AACpB,gBAAY,IAAI,KAAK,IAAI;AAAA,EAC3B;AAAA,EAEQ,WAAW,SAAiB;AAClC,QAAI,CAAC,KAAK,UAAU;AAClB;AAAA,IACF;AACA,QAAI,KAAK,SAAS,KAAK;AACrB,WAAK,SAAS,IAAI,QAAQ;AAAA,IAC5B;AACA,UAAM,EAAE,SAAS,OAAO,OAAO,IAAI,uBAAuB,SAAS;AAAA,MACjE,MAAM;AAAA,MACN,UAAU,KAAK,MAAM,WAAW;AAAA,MAChC,WAAW,KAAK,MAAM;AAAA,MACtB,mBAAmB;AAAA,QACjB,GAAG,KAAK,MAAM,UAAU,IAAI;AAAA,QAC5B,GAAG,KAAK,MAAM,UAAU,IAAI;AAAA,QAC5B,GAAG,KAAK,MAAM,UAAU,IAAI;AAAA,QAC5B,GAAG;AAAA,MACL;AAAA,MACA,yBAAyB;AAAA,QACvB,GAAG,KAAK,MAAM,MAAM,IAAI;AAAA,QACxB,GAAG,KAAK,MAAM,MAAM,IAAI;AAAA,QACxB,GAAG,KAAK,MAAM,MAAM,IAAI;AAAA,QACxB,GAAG;AAAA,MACL;AAAA,MACA,YAAY;AAAA,QACV,OAAO,KAAK,MAAM,SAAS,MAAM;AAAA,QACjC,QAAQ,KAAK,MAAM,UAAU,MAAM;AAAA,MACrC;AAAA,MACA,WAAW,KAAK,MAAM;AAAA,IACxB,CAAC;AAED,SAAK,SAAS,MAAM;AACpB,SAAK,SAAS,IAAI,YAAYC;AAC9B,SAAK,SAAS,IAAI,YAAYA;AAC9B,SAAK,SAAS,cAAc;AAE5B,SAAK,KAAK,MAAM,IAAI,SAAS,MAAM;AACnC,SAAK,KAAK,MAAM,IAAI,UAAU,MAAM;AACpC,SAAK,KAAK,SAAS,IAAI;AAAA,EACzB;AAAA,EAEA,QAAQ,MAAc,YAAqB,OAAO;AAChD,SAAK,WAAW,IAAI;AACpB,SAAK,KAAK,UAAU;AACpB,SAAK,gBAAgB,KAAK;AAC1B,QAAI,WAAW;AACb,iBAAW,MAAM;AACf,aAAK,KAAK;AAAA,MACZ,GAAG,KAAK,mBAAmB,GAAI;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,OAAO;AACL,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,OAAO,QAAgB;AACrB,SAAK,KAAK,OAAO,OAAO,QAAQ;AAChC,UAAM,UAAU,KAAK,KAAK,SAAS;AACnC,QAAI,UAAU,KAAK,eAAe;AAChC,WAAK,KAAK,SAAS,UAAU,KAAK;AAAA,QAChC,KAAK,KAAK,SAAS,UAAU,KAAK;AAAA,QAClC,KAAK;AAAA,MACP;AAAA,IACF,WAAW,UAAU,KAAK,eAAe;AACvC,WAAK,KAAK,SAAS,UAAU,KAAK;AAAA,QAChC,KAAK,KAAK,SAAS,UAAU,KAAK;AAAA,QAClC,KAAK;AAAA,MACP;AACA,UAAI,WAAW,KAAK,KAAK,KAAK,SAAS,gBAAgB,MAAM;AAC3D,aAAK,KAAK,SAAS,cAAc;AACjC,aAAK,KAAK,SAAS,cAAc;AAAA,MACnC,WAAW,UAAU,KAAK,UAAU,KAAK,KAAK,KAAK,SAAS,gBAAgB,OAAO;AACjF,aAAK,KAAK,SAAS,cAAc;AACjC,aAAK,KAAK,SAAS,cAAc;AAAA,MACnC;AACA,UAAI,KAAK,KAAK,SAAS,WAAW,GAAG;AACnC,aAAK,KAAK,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;AElJA,SAAS,MAAM,OAAO,SAA4B,YAAY,aAAAC,YAAW,WAAAC,gBAAe;AAWjF,IAAM,kBAAN,MAAsB;AAAA,EAmD3B,YACmB,OACA,IACA,mBACA,iBACA,eACA,aACjB;AANiB;AACA;AACA;AACA;AACA;AACA;AAxDnB,wBAAQ,2BAA0B;AAElC,wBAAO,eAAc;AAAA,MACnB,QAAQ;AAAA,MACR,SAAS,IAAI,MAAM,IAAIC,SAAQ,GAAG,IAAIA,SAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,IAC3D;AAEA,wBAAQ,gBAAe;AACvB,wBAAQ,eAAc;AACtB,wBAAQ,WAAkB;AAC1B,wBAAQ,aAAoB;AAC5B,wBAAQ,uBAA8B;AAEtC,wBAAQ,cAAsB;AAC9B,wBAAQ,WAAmB;AAC3B,wBAAQ,qBAA6B;AACrC,wBAAQ,wBAAgC;AACxC,wBAAQ,0BAAiC;AACzC,wBAAQ,iBAAwB;AAEhC,wBAAQ,qBAA6B,IAAIA,SAAQ;AACjD,wBAAQ,YAAoB,IAAIA,SAAQ,GAAG,GAAG,CAAC;AAC/C,wBAAQ,cAAsB,IAAIA,SAAQ,GAAG,IAAI,CAAC;AAElD,wBAAQ,kBAAyB;AACjC,wBAAQ,kBAAyB;AAEjC,wBAAQ,WAAgB,IAAI,KAAK;AACjC,wBAAQ,cAAsB,IAAI,QAAQ;AAC1C,wBAAQ,eAAqB,IAAI,MAAM;AACvC,wBAAQ,cAAsB,IAAIA,SAAQ;AAC1C,wBAAQ,eAAuB,IAAIA,SAAQ;AAC3C,wBAAQ,aAAuB,IAAIC,WAAU;AAE7C,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAER,wBAAQ,qBAA8C;AAEtD,wBAAQ,SAAgB;AACxB,wBAAQ,eAAsB;AAE9B,wBAAO;AAUL,SAAK,eAAe;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC7B,UAAU,EAAE,aAAa,GAAG,aAAa,EAAE;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEO,SAAe;AACpB,QAAI,CAAC,KAAK,OAAO,QAAQ,CAAC,KAAK,OAAO;AAAgB;AACtD,QAAI,CAAC,KAAK;AAAmB,WAAK,oBAAoB,KAAK,cAAc;AAEzE,UAAM,EAAE,SAAS,UAAU,MAAM,OAAO,KAAK,MAAM,cAAc,qBAAqB,IACpF,KAAK;AAEP,SAAK,UAAU;AACf,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,SAAK,MAAM;AACX,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,SAAK,wBAAwB;AAE7B,SAAK,cAAc,KAAK,MAAM,KAAK,cAAc,KAAK;AACtD,SAAK,SAAS,KAAK,KAAK,aAAa,KAAK,OAAO,IAAI;AAErD,SAAK,UAAU,IAAI,KAAK,MAAM,KAAK,UAAU,KAAK,UAAU;AAC5D,UAAM,kBAAkB,KAAK,kBAAkB,qBAAqB,KAAK,UAAU,GAAG;AACtF,QAAI,oBAAoB,MAAM;AAC5B,WAAK,gBAAgB;AAAA,IACvB;AAEA,QAAI,gBAAgB,CAAC,KAAK,mBAAmB;AAC3C,YAAM,kBAAkB,KAAK,mBAAmB;AAChD,WAAK,MAAM,gBAAgB,iBAAiB,KAAK,YAAY,SAAS;AAAA,IACxE,OAAO;AACL,WAAK,MAAM,8BAAqC,KAAK,YAAY,SAAS;AAAA,IAC5E;AAEA,QAAI,KAAK;AAAc,WAAK,eAAe;AAE3C,aAAS,IAAI,GAAG,IAAI,KAAK,yBAAyB,KAAK;AACrD,WAAK,eAAe,KAAK,YAAY,YAAY,KAAK,yBAAyB,CAAC;AAAA,IAClF;AAEA,QAAI,KAAK,MAAM,KAAK,SAAS,IAAI;AAAG,WAAK,cAAc;AACvD,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAAqC;AAC3C,QAAI,CAAC,KAAK,MAAM;AAAM;AAEtB,QAAI,KAAK;AAAuB;AAChC,UAAM,aAAa,KAAK,kBAAkB,IAAI,IAAI,MAAM;AACxD,QAAI,KAAK,gBAAgB,cAAc,CAAC,KAAK,mBAAmB;AAC9D;AAAA,IACF;AACA,WAAO,KAAK,OAAO,KAAK,iCAEpB,KAAK;AAAA,EAGX;AAAA,EAEQ,uBAA6B;AACnC,QAAI,KAAK;AAAuB;AAChC,QAAI,KAAK,SAAS;AAChB,WAAK,iBAAiB,KAAK;AAC3B,UAAI,KAAK;AAAM,aAAK,iBAAiB,KAAK,KAAK,KAAK,KAAK;AACzD,UAAI,KAAK;AAAO,aAAK,iBAAiB,KAAK,KAAK,KAAK,KAAK;AAAA,IAC5D,WAAW,KAAK,UAAU;AACxB,WAAK,iBAAiB,KAAK,KAAK;AAChC,UAAI,KAAK;AAAM,aAAK,iBAAiB,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK;AAC9D,UAAI,KAAK;AAAO,aAAK,iBAAiB,KAAK,KAAK,IAAI,KAAK,KAAK;AAAA,IAChE,WAAW,KAAK,MAAM;AACpB,WAAK,iBAAiB,KAAK,KAAK;AAAA,IAClC,WAAW,KAAK,OAAO;AACrB,WAAK,iBAAiB,KAAK,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,uBAA6B;AACnC,QAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,OAAO;AAAM;AAClD,UAAM,qBAAqB,KAAK,kBAAkB,SAAS,WAAW,KAAK,MAAM,KAAK,QAAQ;AAC9F,UAAM,sBAAsB,qBAAqB;AACjD,QAAI,qBAAqB;AACvB,YAAM,gBAAgB,IAAID,SAAQ,GAAG,GAAG,CAAC,EAAE,gBAAgB,KAAK,kBAAkB,UAAU;AAC5F,WAAK,iBAAiB,KAAK,MAAM,cAAc,GAAG,cAAc,CAAC;AAAA,IACnE,OAAO;AACL,WAAK,iBAAiB,KAAK;AAAA,QACzB,KAAK,kBAAkB,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS;AAAA,QAC7D,KAAK,kBAAkB,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,yBAAyB,oBAAwC;AACvE,QAAI,CAAC,KAAK,OAAO;AAAM,aAAO;AAC9B,WAAO,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,WAAW,IAAI,kBAAkB,CAAC,CAAC;AAAA,EACnF;AAAA,EAEQ,iBAAuB;AAC7B,QAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,OAAO;AAAM;AAClD,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,UAAM,qBAAqB,IAAI,WAAW;AAC1C,uBAAmB,iBAAiB,KAAK,UAAU,KAAK,iBAAiB,KAAK,cAAc;AAC5F,UAAM,oBAAoB,KAAK,yBAAyB,kBAAkB;AAC1E,UAAM,cAAc;AACpB,UAAM,eAAe,oBAAoB;AACzC,UAAM,gBAAgB,eAAe,KAAK,YAAY;AACtD,SAAK,MAAM,KAAK,WAAW,cAAc,oBAAoB,aAAa;AAAA,EAC5E;AAAA,EAEQ,2BAA2B,WAAmB;AACpD,QAAI,CAAC,KAAK,OAAO;AAAM;AACvB,SAAK,MAAM,KAAK,SAAS,gBAAgB,KAAK,YAAY,KAAK,QAAQ,SAAS;AAAA,EAClF;AAAA,EAEQ,eAAe,WAAmB,OAAqB;AAC7D,QAAI,CAAC,KAAK,OAAO;AAAM;AAEvB,QAAI,KAAK,mBAAmB;AAC1B,UAAI,CAAC,KAAK;AAAM,aAAK,UAAU;AAE/B,UAAI,KAAK,QAAQ,KAAK,SAAS;AAC7B,aAAK,kBAAkB,KAAK,KAAK;AACjC,aAAK,UAAU;AAAA,MACjB,OAAO;AACL,aAAK,kBAAkB,IAAI,YAAY,KAAK;AAAA,MAC9C;AAAA,IACF,WAAW,KAAK,QAAQ,KAAK,YAAY;AACvC,cAAQ,IAAI,YAAY;AACxB,WAAK,kBAAkB,IAAI,KAAK;AAChC,WAAK,UAAU;AAAA,IACjB,OAAO;AACL,WAAK,kBAAkB,KAAK,YAAY,KAAK;AAC7C,WAAK,UAAU;AAAA,IACjB;AAEA,SAAK,MAAM,KAAK,SAAS,gBAAgB,KAAK,mBAAmB,SAAS;AAE1E,SAAK,WAAW,IAAI,GAAG,GAAG,CAAC;AAE3B,QAAI,KAAK,SAAS;AAChB,YAAM,UAAU,IAAIA,SAAQ,GAAG,GAAG,EAAE,EAAE,eAAe,KAAK,UAAU,KAAK,cAAc;AACvF,WAAK,WAAW,IAAI,OAAO;AAAA,IAC7B;AAEA,QAAI,KAAK,UAAU;AACjB,YAAM,WAAW,IAAIA,SAAQ,GAAG,GAAG,CAAC,EAAE,eAAe,KAAK,UAAU,KAAK,cAAc;AACvF,WAAK,WAAW,IAAI,QAAQ;AAAA,IAC9B;AAEA,QAAI,KAAK,MAAM;AACb,YAAM,OAAO,IAAIA,SAAQ,IAAI,GAAG,CAAC,EAAE,eAAe,KAAK,UAAU,KAAK,cAAc;AACpF,WAAK,WAAW,IAAI,IAAI;AAAA,IAC1B;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,IAAIA,SAAQ,GAAG,GAAG,CAAC,EAAE,eAAe,KAAK,UAAU,KAAK,cAAc;AACpF,WAAK,WAAW,IAAI,KAAK;AAAA,IAC3B;AAEA,QAAI,KAAK,WAAW,OAAO,IAAI,GAAG;AAChC,WAAK,WAAW,UAAU;AAC1B,WAAK,2BAA2B,SAAS;AAAA,IAC3C;AAEA,SAAK,MAAM,KAAK,kBAAkB;AAElC,SAAK,QAAQ,UAAU;AAEvB,SAAK,YAAY,KAAK,KAAK,YAAY,OAAQ;AAC/C,SAAK,YAAY,MAAM,aAAa,KAAK,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,UAAU;AAC7F,SAAK,YAAY,IAAI,aAAa,KAAK,MAAM,KAAK,WAAW,EAAE,aAAa,KAAK,UAAU;AAE3F,SAAK,QAAQ,cAAc,KAAK,YAAY,KAAK;AACjD,SAAK,QAAQ,cAAc,KAAK,YAAY,GAAG;AAE/C,SAAK,QAAQ,IAAI,UAAU,KAAK,YAAY,MAAO;AACnD,SAAK,QAAQ,IAAI,UAAU,KAAK,YAAY,MAAO;AAEnD,SAAK,kBAAkB,eAAe,KAAK,aAAa,KAAK,YAAY,QAAS,KAAK,OAAO;AAE9F,UAAM,cAAc,KAAK;AACzB,gBAAY,KAAK,KAAK,YAAY,KAAK;AAEvC,UAAM,cAAc,KAAK;AACzB,gBAAY,WAAW,aAAa,KAAK,MAAM,KAAK,QAAQ;AAE5D,UAAM,SAAS,KAAK,IAAI,GAAK,YAAY,OAAO,IAAI,IAAI;AACxD,gBAAY,UAAU,EAAE,eAAe,MAAM;AAE7C,SAAK,MAAM,KAAK,SAAS,IAAI,WAAW;AAExC,SAAK,oBAAoB,YAAY,IAAI,KAAK,IAAI,YAAY,KAAK,kBAAkB,IAAI,IAAI;AAE7F,QAAI,KAAK,wBAAwB,CAAC,KAAK,mBAAmB;AACxD,WAAK,yBAAyB,KAAK,IAAI;AAAA,IACzC;AAEA,SAAK,aACH,KAAK,kBAAkB,IAAI,KAC3B,KAAK,sBAAsB,SAC3B,KAAK,IAAI,IAAI,KAAK,yBAAyB,KAAK;AAElD,SAAK,uBAAuB,KAAK;AAEjC,QAAI,KAAK,mBAAmB;AAC1B,WAAK,kBAAkB,IAAI,GAAG,GAAG,CAAC;AAAA,IACpC,OAAO;AACL,kBAAY,UAAU;AACtB,WAAK,kBAAkB,gBAAgB,aAAa,CAAC,YAAY,IAAI,KAAK,iBAAiB,CAAC;AAAA,IAC9F;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,QAAI,CAAC,KAAK,OAAO,MAAM;AACrB,WAAK,eAAe;AAAA,QAClB,IAAI,KAAK;AAAA,QACT,UAAU,IAAIA,SAAQ;AAAA,QACtB,UAAU,EAAE,aAAa,GAAG,aAAa,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,sBAAsB,KAAK,MAAM,KAAK,mBAAmB,IAAI,WAAW,CAAC;AAC/E,YAAM,iBAAiB,IAAIA;AAAA,QACzB,KAAK,MAAM,KAAK,SAAS;AAAA,QACzB,KAAK,MAAM,KAAK,SAAS;AAAA,QACzB,KAAK,MAAM,KAAK,SAAS;AAAA,MAC3B;AACA,WAAK,eAAe;AAAA,QAClB,IAAI,KAAK;AAAA,QACT,UAAU;AAAA,QACV,UAAU,EAAE,aAAa,oBAAoB,GAAG,aAAa,oBAAoB,EAAE;AAAA,QACnF,OAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,CAAC,KAAK,OAAO;AAAM;AACvB,SAAK,kBAAkB,IAAI;AAC3B,SAAK,MAAM,KAAK,SAAS,IAAI;AAC7B,SAAK,oBAAoB;AAAA,EAC3B;AACF;;;AV1SO,IAAM,YAAN,MAAgB;AAAA,EAWrB,YACmB,sBACA,IACA,SACA,qBACA,mBACA,iBACA,eACA,aACjB;AARiB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAlBnB,wBAAO,cAAqC;AAE5C,wBAAO,QAAsB;AAC7B,wBAAO,SAA+B;AACtC,wBAAO,SAAe,IAAIE,OAAM;AAEhC,wBAAO,YAAoB,IAAIC,SAAQ;AAEvC,wBAAO,WAAmC;AAYxC,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,MAAc,OAAsB;AAClC,SAAK,QAAQ,IAAI,eAAe,KAAK,oBAAoB;AACzD,UAAM,KAAK,MAAM,KAAK;AACtB,QAAI,KAAK,YAAY,MAAM;AACzB,WAAK,UAAU,IAAI,iBAAiB,KAAK,MAAM,IAAK;AAAA,IACtD;AACA,SAAK,QAAQ,KAAK,MAAM,SAAS,cAAc,KAAK,EAAE;AACtD,QAAI,KAAK,SAAS;AAChB,WAAK,aAAa,IAAI;AAAA,QACpB,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEO,OAAO,MAAc;AAC1B,QAAI,CAAC,KAAK;AAAO;AACjB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,OAAO,KAAK,cAAc,MAAM;AAAA,IAC/C;AACA,SAAK,MAAM,KAAM,iBAAiB,KAAK,QAAQ;AAC/C,QAAI,OAAO,KAAK,MAAM,SAAS,SAAS,SAAS,aAAa;AAC5D,WAAK,MAAM,SAAS,SAAS,KAAK,QAAQ;AAC1C,WAAK,MAAM,SAAS,SAAS,mBAAmB,QAAQ,KAAK;AAC7D,WAAK,MAAM,SAAS,OAAO;AAAA,IAC7B;AAAA,EACF;AACF;;;AW3EA,SAAiB,OAAoC,WAAAC,gBAAe;;;ACDpE;AAAA,EAGE,kBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,OACK;AAMA,IAAM,mBAAN,MAAuB;AAAA,EAW5B,YAA4B,WAAsC,IAAY;AAAlD;AAAsC;AAVlE,wBAAQ,eAAc;AAEtB,wBAAO,kBAAkC;AAEzC,wBAAQ,kBAAiC,IAAIC,gBAAe,IAAIC,UAAS,CAAC;AAC1E,wBAAQ,cAAa,oBAAI,IAAqC;AAC9D,wBAAO;AAEP,wBAAO;AAGL,SAAK,iBAAiB,KAAK,UAAU,MAAO;AAC5C,SAAK,eAAe,kBAAkB;AACtC,SAAK,iBAAiB,IAAID,gBAAe,KAAK,cAAc;AAC5D,SAAK,eAAe;AAAA,MAClB,IAAI,KAAK;AAAA,MACT,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC7B,UAAU,EAAE,aAAa,GAAG,aAAa,EAAE;AAAA,MAC3C,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEO,OAAO,cAA8B,MAAc,WAAyB;AACjF,QAAI,CAAC,KAAK;AAAW;AACrB,SAAK,UAAU,OAAO,IAAI;AAC1B,SAAK,kBAAkB,YAAY;AACnC,SAAK,eAAe,OAAO,SAAS;AAAA,EACtC;AAAA,EAEA,MAAa,qBACX,eACA,UACe;AACf,UAAM,YAAY,MAAM,KAAK,YAAY,KAAK,UAAU,WAAW;AACnE,UAAM,kBAAkB,KAAK,eAAe,WAAW,SAA0B;AACjF,SAAK,WAAW,IAAI,eAAe,eAAe;AAClD,QAAI,gCAAuC;AACzC,sBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,sBACN,iBACA,qBAA6B,MACvB;AACN,QAAI,KAAK,qBAAqB;AAAiB;AAE/C,UAAM,gBAAgB,KAAK,WAAW,IAAI,KAAK,gBAAgB;AAC/D,UAAM,eAAe,KAAK,WAAW,IAAI,eAAe;AAExD,QAAI,CAAC;AAAc;AAEnB,QAAI,eAAe;AACjB,oBAAc,UAAU;AACxB,mBACG,MAAM,EACN,sBAAsB,CAAC,EACvB,mBAAmB,CAAC,EACpB,OAAO,kBAAkB,EACzB,KAAK;AACR,oBAAc,YAAY,cAAc,oBAAoB,IAAI;AAAA,IAClE,OAAO;AACL,mBAAa,KAAK;AAAA,IACpB;AAEA,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,cAAoC;AAC5D,QAAI,CAAC,KAAK;AAAgB;AAC1B,UAAM,EAAE,UAAU,UAAU,MAAM,IAAI;AACtC,SAAK,eAAe,SAAS,KAAK,IAAIE,SAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI;AACvF,UAAM,qBAAqB,IAAIC,YAAW,GAAG,SAAS,aAAa,GAAG,SAAS,WAAW;AAC1F,SAAK,eAAe,WAAW,MAAM,oBAAoB,GAAG;AAC5D,QAAI,UAAU,KAAK,kBAAkB;AACnC,WAAK,sBAAsB,KAAK;AAAA,IAClC;AAAA,EACF;AACF;;;AD/EA,SAAS,yBAAyB,WAAqB,QAAmC;AACxF,SAAO;AAAA,IACL,GAAG,UAAU,SAAS,QAAQ;AAAA,IAC9B,GAAG,UAAU,WAAW,QAAQ;AAAA,IAChC,GAAG,OAAO,SAAS,QAAQ;AAAA,IAC3B,GAAG,OAAO,WAAW,QAAQ;AAAA,EAC/B,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,yBAAyB,MAAc,WAAqB,QAAgB;AACnF,QAAM,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM;AACzC,YAAU,SAAS,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC;AAC/C,YAAU,WAAW,UAAU,OAAO,MAAM,GAAG,CAAC,CAAC;AACjD,SAAO,SAAS,UAAU,OAAO,MAAM,GAAG,EAAE,CAAC;AAC7C,SAAO,WAAW,UAAU,OAAO,MAAM,IAAI,EAAE,CAAC;AAClD;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAqB5B,YACmB,mBACA,eACA,aACA,cACA,cACA,YACjB;AANiB;AACA;AACA;AACA;AACA;AACA;AArBnB;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAQ,sBAAqB;AAE7B,wBAAO,qBAAqD,oBAAI,IAAI;AAEpE,wBAAO,oBAA2C,oBAAI,IAAI;AAC1D,wBAAO,8BAA4D,oBAAI,IAAI;AAE3E,wBAAQ,wBAAoD;AAC5D,wBAAO,aAA8B;AAErC,wBAAQ,sBAA6B;AACrC,wBAAQ,gBAAuB;AAE/B,wBAAgB;AAUd,SAAK,QAAQ,IAAI,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,eACL,sBACA,IACA,UAAmB,OACnB,gBAAyB,IAAIC,SAAQ,GACrC;AACA,SAAK,uBAAuB;AAC5B,UAAM,0BAA0B,IAAI,QAAmB,CAAC,YAAY;AAClE,YAAM,YAAY,IAAI;AAAA,QACpB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AACJ,cAAI,OAAO,SAAS,QAAQ,OAAO,SAAS,KAAK,SAAS,GAAG;AAC3D;AAAA,cACE,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,cAChC,UAAU,MAAO;AAAA,cACjB,KAAK,cAAc;AAAA,YACrB;AAAA,UACF,OAAO;AACL,4BAAgB,6BAA6B,GAAG,IAAI,IAAI,GAAG;AAC3D,sBAAU,MAAO,KAAM,SAAS,IAAI,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACrF,sBAAU,MAAO,KAAM,kBAAkB;AACzC,iBAAK,WAAW;AAAA,cACd;AAAA,cACA,UAAU;AAAA,gBACR,GAAG,cAAc;AAAA,gBACjB,GAAG,cAAc;AAAA,gBACjB,GAAG,cAAc;AAAA,cACnB;AAAA,cACA,UAAU,EAAE,aAAa,GAAG,aAAa,EAAE;AAAA,cAC3C;AAAA,YACF,CAAC;AAAA,UACH;AACA,oBAAU,MAAO,uBAAuB,gBAAgB;AACxD,cAAI,CAAC,SAAS;AACZ,sBAAU,OAAO,MAAM,SAAS,IAAI,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AACrF,sBAAU,OAAO,MAAM,kBAAkB;AACzC,sBAAU,SAAS,IAAI,cAAc,GAAG,cAAc,GAAG,cAAc,CAAC;AAAA,UAC1E;AACA,eAAK,MAAM,IAAI,UAAU,MAAO,IAAK;AAErC,cAAI,SAAS;AACX,iBAAK,YAAY;AACjB,iBAAK,UAAU,SAAS,QAAQ,GAAG,IAAI;AAAA,UACzC,OAAO;AACL,iBAAK,iBAAiB,IAAI,IAAI,SAAS;AACvC,kBAAM,mBAAmB,IAAI,iBAAiB,WAAW,EAAE;AAC3D,6BAAiB;AAAA;AAAA,cAEf,qBAAqB;AAAA,YACvB;AACA,6BAAiB;AAAA;AAAA,cAEf,qBAAqB;AAAA,YACvB;AACA,6BAAiB;AAAA;AAAA,cAEf,qBAAqB;AAAA,YACvB;AACA,6BAAiB;AAAA;AAAA,cAEf,qBAAqB;AAAA,YACvB;AACA,6BAAiB,gBAAgB,SAAS;AAAA,cACxC,cAAc;AAAA,cACd,cAAc;AAAA,cACd,cAAc;AAAA,YAChB;AACA,iBAAK,2BAA2B,IAAI,IAAI,gBAAgB;AACxD,sBAAU,SAAS,QAAQ,GAAG,IAAI;AAAA,UACpC;AACA,kBAAQ,SAAS;AAAA,QACnB;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,IACF,CAAC;AAED,SAAK,kBAAkB,IAAI,IAAI,uBAAuB;AACtD,WAAO;AAAA,EACT;AAAA,EAEO,uCAA4D;AACjE,QAAI,KAAK,aAAa,KAAK,UAAU,SAAS,KAAK,UAAU,MAAM,MAAM;AACvE,aAAO;AAAA,QACL,UAAU,KAAK,UAAU,MAAM,KAAK;AAAA,QACpC,UAAU,KAAK,UAAU,MAAM,KAAK;AAAA,MACtC;AAAA,IACF;AACA,WAAO;AAAA,MACL,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,MAC7B,UAAU,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IAC/B;AAAA,EACF;AAAA,EAEO,QAAQ;AACb,eAAW,CAAC,IAAI,SAAS,KAAK,KAAK,kBAAkB;AACnD,WAAK,MAAM,OAAO,UAAU,MAAO,IAAK;AACxC,WAAK,iBAAiB,OAAO,EAAE;AAC/B,WAAK,2BAA2B,OAAO,EAAE;AAAA,IAC3C;AACA,QAAI,KAAK,WAAW;AAClB,WAAK,MAAM,OAAO,KAAK,UAAU,MAAO,IAAK;AAC7C,WAAK,YAAY;AAAA,IACnB;AACA,SAAK,kBAAkB,MAAM;AAAA,EAC/B;AAAA,EAEO,SAAS;AACd,QAAI,KAAK,WAAW;AAClB,WAAK,UAAU,OAAO,KAAK,YAAY,IAAI;AAE3C,UAAI,KAAK,UAAU,OAAO,MAAM;AAC9B,aAAK,qBAAqB,KAAK,cAAc,kBAAkB,MAAM,MAAM;AAC3E,aAAK,gBAAgB,KAAK,KAAK,oBAAoB,KAAK,cAAc,GAAG;AACzE,cAAM,eAAe,IAAIA,SAAQ,GAAG,KAAK,KAAK,YAAY;AAC1D,qBAAa,gBAAgB,KAAK,UAAU,MAAM,KAAK,UAAU;AACjE,aAAK,cAAc,UAAU,KAAK,UAAU,SAAS,IAAI,YAAY,CAAC;AAAA,MACxE;AAEA,UAAI,KAAK,UAAU,YAAY;AAC7B,aAAK,UAAU,WAAW,OAAO;AACjC,YAAI,KAAK,YAAY,QAAQ,MAAM,GAAG;AACpC,eAAK,WAAW,KAAK,UAAU,WAAW,YAAY;AAAA,QACxD;AAAA,MACF;AAEA,iBAAW,CAAC,IAAI,MAAM,KAAK,KAAK,cAAc;AAC5C,cAAM,EAAE,SAAS,IAAI;AACrB,YAAI,CAAC,KAAK,iBAAiB,IAAI,EAAE,KAAK,CAAC,KAAK,kBAAkB,IAAI,EAAE,GAAG;AACrE,eAAK;AAAA,YACH,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,IAAIA,SAAQ,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAAA,UAChD,EAAE,KAAK,CAAC,eAAe;AACrB,iBAAK,kBAAkB,OAAO,EAAE;AAAA,UAClC,CAAC;AAAA,QACH;AAEA,cAAM,sBAAsB,KAAK,2BAA2B,IAAI,EAAE;AAClE,YAAI,qBAAqB;AACvB,8BAAoB,OAAO,QAAQ,KAAK,YAAY,MAAM,KAAK,YAAY,SAAS;AAAA,QACtF;AAAA,MACF;AAEA,iBAAW,CAAC,IAAI,SAAS,KAAK,KAAK,kBAAkB;AACnD,YAAI,CAAC,KAAK,aAAa,IAAI,EAAE,GAAG;AAC9B,eAAK,MAAM,OAAO,UAAU,MAAO,IAAK;AACxC,eAAK,iBAAiB,OAAO,EAAE;AAC/B,eAAK,2BAA2B,OAAO,EAAE;AAAA,QAC3C;AAAA,MACF;AAEA,UAAI,KAAK,sBAAsB,KAAK,YAAY,QAAQ,OAAO,GAAG;AAChE,eAAO,SAAS,OAAO;AAAA,UACrB,KAAK,UAAU,MAAO;AAAA,UACtB,KAAK,cAAc;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AEzOO,IAAM,kBAAN,MAAsB;AAAA,EAG3B,cAAc;AAFd,wBAAQ,QAAO,oBAAI,IAAqB;AAGtC,aAAS,iBAAiB,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC;AAC9D,aAAS,iBAAiB,SAAS,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC1D,WAAO,iBAAiB,QAAQ,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,EAC/D;AAAA,EAEQ,cAAc,QAA0B;AAC9C,SAAK,KAAK,MAAM;AAAA,EAClB;AAAA,EAEQ,UAAU,OAA4B;AAC5C,SAAK,KAAK,IAAI,MAAM,IAAI,YAAY,GAAG,IAAI;AAAA,EAC7C;AAAA,EAEQ,QAAQ,OAA4B;AAC1C,SAAK,KAAK,IAAI,MAAM,IAAI,YAAY,GAAG,KAAK;AAAA,EAC9C;AAAA,EAEO,aAAa,KAAsB;AACxC,WAAO,KAAK,KAAK,IAAI,GAAG,KAAK;AAAA,EAC/B;AAAA,EAEO,uBAAgC;AACrC,WAAO,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,KAAK,CAAC,QAAQ,KAAK,aAAa,GAAG,CAAC;AAAA,EAClE;AAAA,EAEA,IAAI,UAAmB;AACrB,WAAO,KAAK,aAAa,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,WAAoB;AACtB,WAAO,KAAK,aAAa,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,OAAgB;AAClB,WAAO,KAAK,aAAa,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,QAAiB;AACnB,WAAO,KAAK,aAAa,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,MAAe;AACjB,WAAO,KAAK,aAAa,OAAO;AAAA,EAClC;AAAA,EAEA,IAAI,OAAgB;AAClB,WAAO,KAAK,aAAa,GAAG;AAAA,EAC9B;AAAA,EAEA,IAAI,eAAwB;AAC1B,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAAA,EAEA,IAAI,uBAAgC;AAClC,WACG,KAAK,aAAa,GAAG,KAAK,KAAK,aAAa,GAAG,KAC/C,KAAK,aAAa,GAAG,KAAK,KAAK,aAAa,GAAG;AAAA,EAEpD;AAAA,EAEO,UAAU;AACf,aAAS,oBAAoB,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC;AACjE,aAAS,oBAAoB,SAAS,KAAK,UAAU,KAAK,IAAI,CAAC;AAC/D,WAAO,oBAAoB,QAAQ,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,EAClE;AACF;;;ACrEA;AAAA,EAIE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,OAGK;AACP,SAAwB,SAAAC,cAAgE;AAIjF,IAAM,sBAAN,MAA0B;AAAA,EAS/B,YACU,UACA,OACA,QACA,eACA,mBACA,4BACR,mBACA;AAPQ;AACA;AACA;AACA;AACA;AACA;AAdV,wBAAO;AACP,wBAAQ,SAAiB;AAEzB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AAWf,SAAK,QAAQ,IAAIC,OAAM;AACvB,SAAK,gBAAgB,cAAc,KAAK,SAAS,IAAI;AAErD,UAAM,EAAE,oBAAoB,IAAI,mBAAmB,KAAK,SAAS,MAAM,KAAK,QAAQ,KAAK,KAAK;AAC9F,SAAK,sBAAsB;AAE3B,SAAK,WAAW;AAAA,MACd,kBAAkB,MAAM,KAAK;AAAA,MAC7B,aAAa,MAAM,KAAK;AAAA,MACxB,eAAe,MAAM,KAAK;AAAA,MAC1B,kBAAkB,MAAM,KAAK;AAAA,MAC7B,WAAW,MAAM,KAAK;AAAA,MACtB,aAAa,CAAC,QAAkB,aAAuB;AACrD,aAAK,kBAAkB,eAAe,QAAiB,QAAQ;AAAA,MACjE;AAAA,MACA,gBAAgB,CAAC,WAAqB;AACpC,aAAK,kBAAkB,kBAAkB,MAAe;AAAA,MAC1D;AAAA,MACA,gBAAgB,CAAC,WAAqB;AACpC,aAAK,kBAAkB,kBAAkB,MAAe;AAAA,MAC1D;AAAA,MACA,4BAA4B,KAAK;AAAA,MACjC,gBAAgB,CAAC,gBAA6B;AAC5C,aAAK,oBAAoB,eAAe,WAAW;AAAA,MACrD;AAAA,MACA,mBAAmB,CAAC,gBAA6B;AAC/C,aAAK,oBAAoB,kBAAkB,WAAW;AAAA,MACxD;AAAA,MACA,mBAAmB,CAAC,gBAA6B;AAC/C,aAAK,oBAAoB,kBAAkB,WAAW;AAAA,MACxD;AAAA,MACA,QAAQ,CAAC,aAA0B,aAA+C;AAChF,aAAK,cAAc,OAAO,aAAa,QAAQ;AAAA,MACjD;AAAA,IACF;AACA,oBAAgB,KAAK,QAAqB;AAC1C,mCAA+B,MAAM;AACrC,SAAK,eAAe,gBAAgB,KAAK,UAAU,KAAK,QAAqB;AAC7E,QAAI,KAAK,OAAO;AACd,cAAQ,IAAI,KAAK,YAAY;AAAA,IAC/B;AACA,eAAW,WAAW,mBAAmB;AACvC,YAAM,eAAe,SAAS,cAAc,SAAS;AACrD,mBAAa,aAAa,OAAO,OAAO;AACxC,eAAS,KAAK,YAAY,YAAY;AAAA,IACxC;AAAA,EACF;AACF;;;AClFA;AAAA,EACE,kBAAAC;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA;AAAA,EACA,qBAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA,SAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EAKA,WAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,kBAAkB;;;AChC3B,SAAS,cAAc,SAAAC,QAAO,kBAAkB,SAAAC,QAAO,oBAAoB,WAAAC,gBAAe;;;ACAnF,IAAM,YAAY;AAAA,EACvB,aAAa;AAAA,IACX,mBAAmB;AAAA,IACnB,eAAe;AAAA,EACjB;AAAA,EACA,cAAc;AAAA,EACd,UAAU,EAAE,GAAG,GAAK,GAAG,GAAK,GAAG,EAAI;AACrC;AAEO,IAAM,aAAa;AAAA,EACxB,aAAa;AAAA,IACX,mBAAmB,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IAC/C,eAAe,EAAE,KAAK,KAAK,KAAK,IAAI,MAAM,EAAE;AAAA,EAC9C;AAAA,EACA,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAC7C;;;ADXO,IAAM,MAAN,cAAkBC,OAAM;AAAA,EAgB7B,cAAc;AACZ,UAAM;AAhBR,wBAAiB,SAAiB;AAClC,wBAAiB,aAAqB,IAAIC;AAAA,MACxC,MAAM,KAAK,KAAK;AAAA,MAChB,MAAM,KAAK,KAAK;AAAA,MAChB;AAAA,IACF;AACA,wBAAiB,oBAA2B;AAC5C,wBAAiB,oBAA2B;AAC5C,wBAAiB,aAAiC;AAElD,wBAAiB;AACjB,wBAAiB;AAEjB,wBAAO,UAAyB;AAI9B,SAAK,eAAe,IAAI;AAAA,MACtB,CAAC,KAAK;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,CAAC,KAAK;AAAA,MACN;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,UAAU,MAAM;AACvB,WAAK,YAAY,IAAI,aAAa,KAAK,YAAY;AAAA,IACrD;AACA,SAAK,mBAAmB,IAAI,iBAAiB,UAAU,GAAG;AAC1D,SAAK,iBAAiB,OAAO,aAAa;AAC1C,SAAK,iBAAiB,OAAO,SAAS;AACtC,SAAK,iBAAiB,OAAO,SAAS,KAAK;AAC3C,SAAK,iBAAiB,OAAO,QAAQ,IAAI,KAAK,kBAAkB,KAAK,gBAAgB;AACrF,SAAK,iBAAiB,aAAa;AAEnC,SAAK,wBAAwB,IAAIA,SAAQ,GAAG,GAAG,CAAC,CAAC;AAEjD,SAAK,IAAI,KAAK,gBAAgB;AAC9B,QAAI,KAAK,UAAU,QAAQ,KAAK,qBAAqB,cAAc;AACjE,WAAK,IAAI,KAAK,SAAS;AAAA,IACzB;AAAA,EACF;AAAA,EAEO,wBAAwB,UAA+B;AAC5D,QAAI,CAAC;AAAU;AACf,SAAK,SAAS;AACd,SAAK,eAAe,KAAK,UAAU,GAAG,KAAK,UAAU,CAAC;AAAA,EACxD;AAAA,EAEO,kBAAkB,OAAe;AACtC,QAAI,KAAK;AAAW,WAAK,UAAU,IAAI;AACvC,QAAI,KAAK;AAAQ,WAAK,wBAAwB,KAAK,MAAM;AAAA,EAC3D;AAAA,EAEO,cAAc,OAAe;AAClC,QAAI,KAAK;AAAW,WAAK,UAAU,IAAI;AACvC,QAAI,KAAK;AAAQ,WAAK,wBAAwB,KAAK,MAAM;AAAA,EAC3D;AAAA,EAEO,aAAa,WAAmB;AACrC,SAAK,iBAAiB,YAAY;AAAA,EACpC;AAAA,EAEO,WAAW;AAChB,SAAK,iBAAiB,QAAQ,IAAIC,OAAM,EAAE;AAAA,MACxC,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,eAAe,gBAAwB,YAAoB;AACjE,QAAI,CAAC,KAAK;AAAQ;AAClB,UAAM,WAAW,KAAK,UAAU;AAChC,UAAM,oBAAoB,IAAID;AAAA,MAC5B,WAAW,KAAK,IAAI,UAAU,IAAI,KAAK,IAAI,cAAc;AAAA,MACzD,WAAW,KAAK,IAAI,UAAU;AAAA,MAC9B,WAAW,KAAK,IAAI,UAAU,IAAI,KAAK,IAAI,cAAc;AAAA,IAC3D;AACA,UAAM,iBAAiB,KAAK,OAAO,MAAM,EAAE,IAAI,iBAAiB;AAChE,SAAK,iBAAiB,SAAS,IAAI,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;AACvF,SAAK,iBAAiB,OAAO,SAAS,KAAK,KAAK,OAAO,MAAM,CAAC;AAC9D,SAAK,iBAAiB,OAAO,kBAAkB;AAAA,EACjD;AACF;;;AEzFA,SAAS,qBAAsC;AAExC,IAAM,iBAAiB;AAAA,EAC5B,UAAU;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AAAA,EACA,MAAM;AAAA,IACJ,eAAe,cAAc;AAAA,IAC7B,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,SAAS;AAAA,IACT,OAAO;AAAA,IACP,oBAAoB;AAAA,IACpB,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,iBAAiB;AAAA,IACjB,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,IAC1B,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,yBAAyB;AAAA,IACzB,uBAAuB;AAAA,EACzB;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,OAAO;AACT;AAEO,IAAM,kBAAkB;AAAA,EAC7B,UAAU;AAAA,IACR,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,EAAE;AAAA,IACrC,aAAa,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,EAAE;AAAA,IACvC,UAAU,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACvC,aAAa,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAK;AAAA,IAC5C,cAAc,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAM;AAAA,EAChD;AAAA,EACA,MAAM;AAAA,IACJ,SAAS,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,IACpC,OAAO,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,IAClC,oBAAoB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACjD,QAAQ,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAM;AAAA,IACxC,WAAW,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,IAAI;AAAA,IACvC,MAAM,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAM;AAAA,IACtC,MAAM,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAM;AAAA,IACtC,iBAAiB,EAAE,KAAK,MAAM,KAAK,GAAG,MAAM,KAAK;AAAA,IACjD,wBAAwB,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IACpD,sBAAsB,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,EAAE;AAAA,IAClD,yBAAyB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,IACtD,uBAAuB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,EACtD;AAAA,EACA,aAAa;AAAA,IACX,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,EAAE;AAAA,IAChC,YAAY,EAAE,KAAK,IAAI,KAAK,KAAK,MAAM,GAAG;AAAA,IAC1C,YAAY,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,KAAK;AAAA,IAC1C,YAAY,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,KAAK;AAAA,IAC1C,cAAc,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,KAAM;AAAA,IAC7C,kBAAkB,EAAE,KAAK,MAAO,KAAK,KAAK,MAAM,KAAM;AAAA,IACtD,gBAAgB,EAAE,KAAK,KAAK,KAAK,GAAK,MAAM,IAAI;AAAA,EAClD;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,EAAE,KAAK,IAAM,KAAK,GAAK,MAAM,KAAK;AAAA,EAC5C;AAAA,EACA,UAAU;AAAA,IACR,QAAQ,EAAE,KAAK,GAAK,KAAK,GAAK,MAAM,KAAK;AAAA,EAC3C;AAAA,EACA,YAAY;AAAA,IACV,QAAQ,EAAE,KAAK,GAAK,KAAK,GAAK,MAAM,KAAK;AAAA,EAC3C;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,EAAE,KAAK,GAAG,KAAK,KAAK,MAAM,KAAM;AAAA,EAC1C;AAAA,EACA,OAAO;AAAA,IACL,QAAQ,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,EACvC;AACF;AAEO,IAAM,iBAAyC;AAAA,EACpD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,2BAAmD;AAAA,EAC9D,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,yBAAiD;AAAA,EAC5D,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAEO,IAAM,iBAAiB;AAAA,EAC5B,eAAe,eAAe,eAAe,SAAS,SAAS;AAAA,EAC/D,iBAAiB,yBAAyB,eAAe,SAAS,WAAW;AAC/E;AAEO,IAAM,mBAAmB,CAAC,UAAwB;AACvD,iBAAe,gBAAgB,eAAe,KAAK;AACrD;AAEO,IAAM,qBAAqB,CAAC,UAAwB;AACzD,iBAAe,kBAAkB,yBAAyB,KAAK;AACjE;AAEO,IAAM,yBAAyB;AAAA,EACpC,uBAAuB,uBAAuB,eAAe,YAAY,IAAI;AAC/E;AAEO,IAAM,2BAA2B,CAAC,UAAwB;AAC/D,yBAAuB,wBAAwB,uBAAuB,KAAK;AAC7E;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,YAAY;AAAA,EACvB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,KAAK;AACP;;;AC5JO,IAAM,YAAY;AAAA,EACvB,cAAc;AAAA,IACZ,uBAAuB;AAAA,IACvB,mBAAmB,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE;AAAA,EACxC;AAAA,EACA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU,EAAE,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK;AAAA,EACxC;AACF;AAEO,IAAM,aAAa;AAAA,EACxB,cAAc;AAAA,IACZ,uBAAuB,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK;AAAA,EACtD;AAAA,EACA,KAAK;AAAA,IACH,SAAS,EAAE,KAAK,GAAG,KAAK,IAAI,MAAM,EAAE;AAAA,IACpC,QAAQ,EAAE,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;AAAA,EACvC;AACF;;;ACpBA;AAAA,EACE,iBAAAE;AAAA,OAMK;AACP,SAAS,SAAAC,cAAmC;AAC5C,SAA+B,YAA2B;AAuBnD,IAAM,YAAN,MAAgB;AAAA,EAsErB,YAAY,UAAyB,OAAc,UAA0B;AArE7E,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAER,wBAAQ,YAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2CnB,wBAAQ,OAAY,IAAI,KAAK;AAE7B,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAER,wBAAQ;AAER,wBAAQ;AAER,wBAAQ;AAER,wBAAQ;AACR,wBAAQ;AACR,wBAAQ;AAER,wBAAQ,gCAAwC;AAChD,wBAAO,cAAsB;AAG3B,QAAI,KAAK,8BAA8B;AACrC,YAAM,yBAAyB,aAAa,QAAQ,YAAY;AAChE,UAAI,2BAA2B,MAAM;AACnC,YAAI,2BAA2B,QAAQ;AACrC,eAAK,aAAa;AAAA,QACpB,WAAW,2BAA2B,SAAS;AAC7C,eAAK,aAAa;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAEA,SAAK,WAAW;AAChB,SAAK,QAAQ;AACb,SAAK,WAAW;AAEhB,UAAM,eAAe,SAAS,cAAc,OAAO;AACnD,iBAAa,OAAO;AACpB,iBAAa,YAAY,SAAS,eAAe,KAAK,QAAQ,CAAC;AAC/D,aAAS,KAAK,YAAY,YAAY;AAEtC,SAAK,SAAS,KAAK,IAAI,UAAU,EAAE,OAAO,aAAa,UAAU,KAAK,CAAC;AAEvE,SAAK,QAAQ,KAAK,OAAO,UAAU,EAAE,OAAO,SAAS,UAAU,KAAK,CAAC;AACrE,SAAK,gBAAgB,KAAK,OAAO,UAAU,EAAE,OAAO,iBAAiB,UAAU,MAAM,CAAC;AACtF,SAAK,cAAc,KAAK,OAAO,UAAU,EAAE,OAAO,qBAAqB,UAAU,MAAM,CAAC;AACxF,SAAK,OAAO,KAAK,OAAO,UAAU,EAAE,OAAO,oBAAoB,UAAU,MAAM,CAAC;AAChF,SAAK,OAAO,KAAK,OAAO,UAAU,EAAE,OAAO,QAAQ,UAAU,MAAM,CAAC;AAEpE,SAAK,YAAY,SAAS,eAAe,SAAS,gBAAgB,IAAI,QAAQ;AAG9E;AACE,WAAK,oBAAoB,KAAK,IAAI,UAAU,EAAE,OAAO,qBAAqB,UAAU,MAAM,CAAC;AAC3F,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB,SAAS,gBAAgB,UAAU,iBAAiB;AAAA,QACzE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AACD,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB,SAAS,gBAAgB,UAAU,YAAY;AAAA,QACpE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AACD,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB,SAAS,gBAAgB,UAAU,cAAc;AAAA,QACtE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AACD,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AACA,WAAK,kBAAkB;AAAA,QACrB,gBAAgB;AAAA,QAChB;AAAA,QACA,iBAAiB,SAAS;AAAA,MAC5B;AAEA,WAAK,kBAAkB,GAAG,UAAU,CAAC,MAA0B;AAC7D,YAAI,CAAC,EAAE,WAAW;AAChB;AAAA,QACF;AACA,YAAI,EAAE,cAAc,iBAAiB;AACnC,0BAAgB,SAAS,gBAAgB;AAAA,YACvC,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,UACb;AACA;AAAA,QACF;AACA,YAAI,EAAE,cAAc,YAAY;AAC9B,0BAAgB,SAAS,WAAW;AAAA,YAClC,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,UACb;AACA;AAAA,QACF;AACA,YAAI,EAAE,cAAc,cAAc;AAChC,0BAAgB,SAAS,aAAa;AAAA,YACpC,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,YACX,GAAG,EAAE,MAAM;AAAA,UACb;AACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,cAAc,KAAK,IAAI,UAAU,EAAE,OAAO,eAAe,UAAU,MAAM,CAAC;AAC/E,SAAK,MAAM,KAAK,YAAY,UAAU,EAAE,OAAO,OAAO,UAAU,KAAK,CAAC;AACtE,SAAK,UAAU,KAAK,YAAY,UAAU,EAAE,OAAO,WAAW,UAAU,KAAK,CAAC;AAE9E,SAAK,SAAS,KAAK,IAAI,UAAU,EAAE,OAAO,iBAAiB,UAAU,MAAM,CAAC;AAE5E,WAAO,iBAAiB,WAAW,KAAK,WAAW,KAAK,IAAI,CAAC;AAE7D,SAAK,kBAAkB,KAAK,IAAI,EAAE;AAClC,SAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AAAA,EACvD;AAAA,EAEQ,WAAW,GAAwB;AACzC,QAAI,EAAE,QAAQ;AAAK,WAAK,UAAU;AAAA,EACpC;AAAA,EAEQ,oBAA0B;AAChC,UAAM,MAAM,KAAK;AACjB,UAAM,cAA2B,IAAI;AACrC,gBAAY,MAAM,UAAU,KAAK,aAAa,UAAU;AACxD,SAAK,IAAI,QAAQ,iBAAiB,aAAa,MAAM,mBAAmB,IAAI,CAAC;AAC7E,SAAK,IAAI,QAAQ,iBAAiB,WAAW,MAAM,mBAAmB,KAAK,CAAC;AAC5E,SAAK,IAAI,QAAQ,iBAAiB,cAAc,MAAM,mBAAmB,KAAK,CAAC;AAAA,EACjF;AAAA,EAEO,gBACL,YACA,mBACA,iBACA,8BACA,aACA,kBACA,aACA,KACA,QACA,iBACA,QACM;AAEN;AACE,WAAK,MAAM,WAAW,WAAW,WAAW;AAC5C,WAAK,MAAM,WAAW,WAAW,YAAY;AAC7C,WAAK,MAAM,WAAW,WAAW,UAAU;AAC3C,WAAK,MAAM,WAAW,WAAW,SAAS;AAC1C,WAAK,MAAM,WAAW,WAAW,YAAY;AAC7C,WAAK,MAAM,WAAW,WAAW,WAAW;AAC5C,WAAK,MAAM,WAAW,WAAW,cAAc;AAC/C,WAAK,MAAM,WAAW,WAAW,WAAW;AAC5C,WAAK,MAAM,WAAW,WAAW,KAAK;AAAA,IACxC;AAGA;AACE,WAAK,cAAc;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,SAAS;AAAA,MAC3B;AACA,WAAK,cAAc,WAAW,gBAAgB,eAAe;AAE7D,WAAK,cAAc;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,SAAS;AAAA,MAC3B;AAEA,WAAK,cAAc,WAAW,gBAAgB,iBAAiB;AAE/D,WAAK,cAAc;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,SAAS;AAAA,MAC3B;AAEA,WAAK,cAAc;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,SAAS;AAAA,MAC3B;AAEA,WAAK,cAAc;AAAA,QACjB,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,SAAS;AAAA,MAC3B;AAEA,WAAK,cAAc,GAAG,UAAU,CAAC,MAA0B;AACzD,cAAM,SAAS,EAAE;AACjB,gBAAQ,OAAO,OAAO;AAAA,UACpB,KAAK;AACH,iBAAK,SAAS,UAAU,OAAO,EAAE;AACjC,6BAAiB,EAAE,KAAK;AACxB;AAAA,UACF,KAAK;AACH,iBAAK,SAAS,cAAc,EAAE;AAC9B,iBAAK,YAAY,SAAS,EAAE,UAAU;AACtC,4BAAgB,UAAU,EAAE,UAAU,IAAI,OAAO;AACjD,+BAAmB,EAAE,KAAK;AAC1B;AAAA,UACF,KAAK;AACH,iBAAK,SAAS,sBAAsB,EAAE;AACtC;AAAA,UACF,KAAK;AACH,iBAAK,MAAM,sBAAsB,EAAE;AACnC;AAAA,UACF,KAAK;AACH,iBAAK,MAAM,uBAAuB,EAAE;AACpC;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAGA;AACE,WAAK,KAAK,SAAS,EAAE,gBAAgB,MAAM,GAAG,gBAAgB;AAC9D,WAAK,KAAK,SAAS,eAAe,MAAM,WAAW,gBAAgB,KAAK,OAAO;AAC/E,WAAK,KAAK,SAAS,eAAe,MAAM,SAAS,gBAAgB,KAAK,KAAK;AAC3E,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK,SAAS,eAAe,MAAM,UAAU,gBAAgB,KAAK,MAAM;AAC7E,WAAK,KAAK,SAAS,eAAe,MAAM,aAAa,gBAAgB,KAAK,SAAS;AACnF,WAAK,KAAK,SAAS,eAAe,MAAM,QAAQ,gBAAgB,KAAK,IAAI;AACzE,WAAK,KAAK,SAAS,eAAe,MAAM,QAAQ,gBAAgB,KAAK,IAAI;AACzE,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK;AAAA,QACR,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,KAAK;AAAA,MACvB;AACA,WAAK,KAAK,SAAS,eAAe,MAAM,SAAS;AAAA,QAC/C,OAAO,EAAE,OAAO,OAAO,MAAM,QAAQ;AAAA,MACvC,CAAC;AACD,WAAK,KAAK,GAAG,UAAU,CAAC,MAA0B;AAChD,YAAI,CAAC,EAAE,WAAW;AAChB;AAAA,QACF;AACA,cAAM,SAAS,EAAE;AACjB,YAAI,WAAW,kBAAkB;AAC/B,qBAAW,UAAU,gBACnB,EAAE,UAAU,OAAOC,eAAc,SAASA,eAAc;AAC1D;AAAA,QACF;AACA,YAAI,WAAW,mBAAmB;AAChC,qBAAW,WAAW,QAAQ,EAAE;AAChC;AAAA,QACF;AACA,YAAI,mBAAmB,SAAS,EAAE,SAAU,GAAG;AAC7C,UAAC,WAAW,aAAqB,MAAM,IAAI,EAAE;AAC7C;AAAA,QACF;AACA,YAAI,EAAE,cAAc,SAAS;AAC3B,qBAAW,QAAQ,IAAIC,OAAM,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,CAAC;AACrE;AAAA,QACF;AACA,QAAC,WAAmB,MAAM,IAAI,EAAE;AAAA,MAClC,CAAC;AAAA,IACH;AAGA;AACE,WAAK,YAAY;AAAA,QACf,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,WAAK,YAAY,WAAW,wBAAwB,uBAAuB;AAC3E,WAAK,YAAY;AAAA,QACf,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,WAAK,YAAY;AAAA,QACf,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,YAAM,eAAe,KAAK,YAAY;AAAA,QACpC,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,mBAAa,SAAS,eAAe,YAAY,SAAS,IAAI,OAAO;AACrE,YAAM,mBAAmB,KAAK,YAAY;AAAA,QACxC,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,uBAAiB,SAAS,eAAe,YAAY,SAAS,IAAI,OAAO;AACzE,WAAK,YAAY;AAAA,QACf,eAAe;AAAA,QACf;AAAA,QACA,gBAAgB,YAAY;AAAA,MAC9B;AACA,WAAK,YAAY,GAAG,UAAU,CAAC,MAA0B;AACvD,YAAI,CAAC,EAAE,WAAW;AAChB;AAAA,QACF;AACA,cAAM,SAAS,EAAE;AACjB,YAAI,WAAW,QAAQ;AACrB,uBAAa,SAAS,eAAe,YAAY,SAAS,IAAI,OAAO;AACrE,2BAAiB,SAAS,eAAe,YAAY,SAAS,IAAI,OAAO;AACzE,mCAAyB,EAAE,KAAK;AAAA,QAClC;AACA,QAAC,kBAA0B,MAAM,IAAI,EAAE;AACvC;AAAA,MACF,CAAC;AAAA,IACH;AAGA;AACE,WAAK,KAAK,SAAS,gBAAgB,cAAc,gBAAgB,WAAW,MAAM;AAClF,WAAK,KAAK,SAAS,gBAAgB,YAAY,gBAAgB,SAAS,MAAM;AAC9E,WAAK,KAAK,SAAS,gBAAgB,cAAc,gBAAgB,WAAW,MAAM;AAElF,WAAK,KAAK,SAAS,gBAAgB,SAAS,gBAAgB,MAAM,MAAM;AACxE,WAAK,KAAK,SAAS,gBAAgB,SAAS,gBAAgB,MAAM,MAAM;AAExE,WAAK,KAAK,GAAG,UAAU,CAAC,MAA0B;AAChD,cAAM,SAAS,EAAE;AACjB,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,yCAA6B,SAAS,WAAW,QAAQ,EAAE;AAC3D;AAAA,UACF,KAAK;AACH,yCAA6B,SAAS,SAAS,QAAQ,EAAE;AACzD;AAAA,UACF,KAAK;AACH,yCAA6B,SAAS,WAAW,QAAQ,EAAE;AAC3D;AAAA,UACF,KAAK;AACH,wBAAY,YAAY,EAAE;AAC1B;AAAA,UACF,KAAK;AACH,6BAAiB,SAAS,OAAO,QAAQ,EAAE;AAC3C;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAGA;AACE,WAAK,YAAY,SAAS,gBAAgB,SAAS,QAAQ;AAC3D,WAAK,IAAI;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA,WAAW,YAAY;AAAA,MACzB;AACA,WAAK,IAAI;AAAA,QACP,UAAU;AAAA,QACV;AAAA,QACA,WAAW,YAAY;AAAA,MACzB;AACA,WAAK,IAAI,SAAS,WAAW,gBAAgB,WAAW,YAAY;AACpE,WAAK,IAAI,SAAS,WAAW,YAAY;AAAA,QACvC,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AACD,WAAK,YAAY,KAAK,IAAI,UAAU,EAAE,OAAO,WAAW,CAAC;AACzD,WAAK,UAAU,GAAG,SAAS,MAAM;AAC/B,eAAO;AAAA,MACT,CAAC;AAED,WAAK,IAAI,GAAG,UAAU,CAAC,MAA0B;AAC/C,cAAM,SAAS,EAAE;AACjB,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,iBAAK,kBAAkB,EAAE,SAAS,KAAK,KAAK,IAAI;AAChD;AAAA,UACF,KAAK;AACH,iBAAK,cAAc,EAAE,SAAS,KAAK,KAAK,IAAI;AAC5C;AAAA,UACF,KAAK;AACH,iBAAK,aAAa,EAAE,KAAK;AACzB;AAAA,UACF,KAAK;AACH,sBAAU,WAAW;AAAA,cACnB,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,YACb;AACA,iBAAK,SAAS;AACd;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF,CAAC;AAED,WAAK,QAAQ;AAAA,QACX,UAAU;AAAA,QACV;AAAA,QACA,WAAW,aAAa;AAAA,MAC1B;AACA,WAAK,QAAQ,SAAS,UAAU,cAAc,qBAAqB;AAAA,QACjE,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AACD,WAAK,QAAQ,SAAS,UAAU,KAAK,WAAW,WAAW,IAAI,OAAO;AACtE,WAAK,QAAQ,SAAS,UAAU,KAAK,UAAU,WAAW,IAAI,MAAM;AACpE,WAAK,QAAQ,SAAS,UAAU,KAAK,YAAY;AAAA,QAC/C,OAAO,EAAE,MAAM,QAAQ;AAAA,MACzB,CAAC;AAED,WAAK,QAAQ,GAAG,UAAU,CAAC,MAA0B;AACnD,cAAM,SAAS,EAAE;AACjB,gBAAQ,QAAQ;AAAA,UACd,KAAK;AACH,sBAAU,aAAa,wBAAwB,EAAE;AACjD,4BAAgB;AAChB;AAAA,UACF,KAAK;AACH,sBAAU,aAAa,oBAAoB;AAAA,cACzC,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,YACb;AACA,4BAAgB;AAChB;AAAA,UACF,KAAK;AACH,sBAAU,IAAI,UAAU,EAAE;AAC1B,mBAAO;AACP;AAAA,UACF,KAAK;AACH,sBAAU,IAAI,SAAS,EAAE;AACzB,mBAAO;AACP;AAAA,UACF,KAAK;AACH,sBAAU,IAAI,WAAW;AAAA,cACvB,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,cACX,GAAG,EAAE,MAAM;AAAA,YACb;AACA,mBAAO;AACP;AAAA,UACF;AACE;AAAA,QACJ;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,KAAK,OAAO,UAAU,EAAE,OAAO,SAAS,CAAC;AAC9D,iBAAa,GAAG,SAAS,MAAM;AAC7B,WAAK,uBAAuB,KAAK,IAAI,aAAa,CAAC;AAAA,IACrD,CAAC;AACD,UAAM,eAAe,KAAK,OAAO,UAAU,EAAE,OAAO,SAAS,CAAC;AAC9D,iBAAa,GAAG,SAAS,MAAM;AAC7B,WAAK,uBAAuB,CAAC,aAAa;AACxC,aAAK,IAAI,aAAa,QAAQ;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEQ,wBAAgC;AACtC,UAAM,OAAO,oBAAI,KAAK;AACtB,UAAM,OAAO,KAAK,YAAY;AAC9B,UAAM,QAAQ,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,UAAM,MAAM,OAAO,KAAK,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,UAAM,QAAQ,OAAO,KAAK,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG;AACrD,UAAM,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,UAAM,UAAU,OAAO,KAAK,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG;AACzD,WAAO,GAAG,QAAQ,SAAS,OAAO,SAAS,WAAW;AAAA,EACxD;AAAA,EAEQ,uBAAuB,UAAe;AAC5C,UAAM,aAAa,KAAK,UAAU,UAAU,MAAM,CAAC;AACnD,UAAM,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAChE,UAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,WAAW,YAAY,KAAK,sBAAsB;AACpD,MAAE,OAAO;AACT,MAAE,MAAM;AACR,QAAI,gBAAgB,GAAG;AAAA,EACzB;AAAA,EAEQ,uBAAuB,UAAmC;AAChE,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,OAAO;AACb,UAAM,SAAS;AACf,UAAM,iBAAiB,UAAU,CAAC,UAAU;AAC1C,YAAM,OAAQ,MAAM,OAA4B,QAAQ,CAAC;AACzD,UAAI,MAAM;AACR,cAAM,SAAS,IAAI,WAAW;AAC9B,eAAO,SAAS,CAAC,cAAc;AAC7B,cAAI;AACF,kBAAM,WAAW,KAAK,MAAM,UAAU,QAAQ,MAAgB;AAC9D,qBAAS,QAAQ;AAAA,UACnB,SAAS,KAAP;AACA,oBAAQ,MAAM,uBAAuB,GAAG;AAAA,UAC1C;AAAA,QACF;AACA,eAAO,WAAW,IAAI;AAAA,MACxB;AAAA,IACF,CAAC;AACD,UAAM,MAAM;AAAA,EACd;AAAA,EAEO,YAAY,aAAgC;AACjD,UAAM,EAAE,YAAY,SAAS,IAAI,KAAK,SAAS,KAAK;AACpD,UAAM,EAAE,WAAW,MAAM,IAAI,KAAK,SAAS,KAAK;AAChD,cAAU,YAAY,UAAU,SAAS;AACzC,cAAU,aAAa,WAAW,SAAS;AAC3C,cAAU,WAAW,SAAS,SAAS;AACvC,cAAU,UAAU,KAAK,SAAS,KAAK,SAAU,OAAO,SAAS;AACjE,cAAU,aAAa,KAAK,SAAS,OAAO,OAAO,SAAS;AAC5D,cAAU,YAAY,MAAM,SAAS;AACrC,cAAU,gBAAgB,KAAK,MAAM,YAAY,eAAe,GAAM,IAAI,KAAQ,SAAS;AAC3F,cAAU,aAAa,KAAK,MAAM,YAAY,YAAY,GAAM,IAAI,KAAQ,SAAS;AACrF,cAAU,MAAM,YAAY,IAAI,SAAS;AAAA,EAC3C;AAAA,EAEQ,YAAkB;AACxB,UAAM,MAAM,KAAK;AACjB,UAAM,cAA2B,IAAI;AACrC,gBAAY,MAAM,UAAU,KAAK,aAAa,SAAS;AACvD,SAAK,aAAa,CAAC,KAAK;AACxB,QAAI,KAAK,8BAA8B;AACrC,mBAAa,QAAQ,cAAc,KAAK,eAAe,OAAO,SAAS,OAAO;AAAA,IAChF;AAAA,EACF;AACF;;;AClqBA,SAAS,gBAAgB,eAAe;;;ACAjC,IAAM;AAAA;AAAA,EAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ADIhC,IAAM,+BAA+B,IAAI,eAAe;AAAA,EAC7D,UAAU;AAAA,IACR,UAAU,IAAI,QAAQ,IAAI;AAAA,IAC1B,YAAY,IAAI,QAAQ,CAAG;AAAA,IAC3B,UAAU,IAAI,QAAQ,CAAG;AAAA,IACzB,YAAY,IAAI,QAAQ,CAAG;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwD3B,WAAW;AACb,CAAC;;;AErED,SAAS,kBAAAC,iBAAgB,WAAAC,UAAS,eAAe;AAI1C,IAAM,mBAAmB,IAAIC,gBAAe;AAAA,EACjD,UAAU;AAAA,IACR,UAAU,IAAIC,SAAQ,IAAI;AAAA,IAC1B,YAAY,IAAIA,SAAQ,IAAI,QAAQ,CAAC;AAAA,IACrC,MAAM,IAAIA,SAAQ,CAAG;AAAA,IACrB,QAAQ,IAAIA,SAAQ,CAAG;AAAA,IACvB,OAAO,IAAIA,SAAQ,CAAG;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuC3B,WAAW;AACb,CAAC;;;ARVM,IAAM,WAAN,MAAe;AAAA,EAyCpB,YAAY,OAAc,QAA2B,WAAoB,OAAO;AAxChF,wBAAQ,SAAgB,OAAO;AAC/B,wBAAQ,UAAiB,OAAO;AAEhC,wBAAO,cAAsB,IAAIC,SAAQ,KAAK,OAAO,KAAK,MAAM;AAEhE,wBAAQ,aAAqB;AAE7B,wBAAiB;AACjB,wBAAiB;AACjB,wBAAgB;AAEhB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AAEjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AACjB,wBAAiB;AAEjB,wBAAiB,OAAM;AACvB,wBAAiB;AAEjB,wBAAiB,oBAAmB;AACpC,wBAAiB;AAEjB,wBAAQ,gBAAoC;AAE5C,wBAAO,OAAkB;AACzB,wBAAO;AAEP,wBAAQ;AAGN,SAAK,QAAQ;AACb,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,WAAW,IAAIC,eAAc;AAAA,MAChC,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,SAAS;AAAA,MACT,OAAO;AAAA,IACT,CAAC;AACD,SAAK,SAAS,KAAK,YAAY;AAC/B,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC7C,SAAK,SAAS,UAAU,UAAU;AAClC,SAAK,SAAS,UAAU,OAAO,eAAK,SAAS;AAC7C,SAAK,SAAS,cAAc,eAAK,SAAS;AAC1C,SAAK,SAAS,sBAAsB,eAAK,SAAS;AAElD,SAAK,gBAAgB;AACrB,SAAK,OAAO;AAEZ,aAAS,KAAK,YAAY,KAAK,SAAS,UAAU;AAElD,SAAK,WAAW,IAAIC,gBAAe,KAAK,UAAU;AAAA,MAChD,iBAAiB;AAAA,IACnB,CAAC;AAED,SAAK,YAAY,IAAI,UAAU,KAAK,UAAU,KAAK,OAAO,KAAK,QAAQ;AAEvE,SAAK,aAAa,IAAI,WAAW,KAAK,OAAO,KAAK,MAAM;AACxD,SAAK,aAAa,IAAI,WAAW,KAAK,OAAO,KAAK,MAAM;AACxD,SAAK,sBAAsB,IAAI,cAAc;AAAA,MAC3C,eAAeC,eAAc;AAAA,MAC7B,SAAS,KAAK,WAAW;AAAA,IAC3B,CAAC;AAED,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,cAAc,IAAIC,aAAY;AAAA,MACjC,WAAW,eAAK;AAAA,IAClB,CAAC;AACD,SAAK,aAAa,IAAIC,YAAW,KAAK,QAAQ,KAAK,WAAW,SAAS;AAAA,MACrE,eAAe,eAAK,KAAK;AAAA,MACzB,iBAAiB,eAAK,KAAK;AAAA,MAC3B,sBAAsB,eAAK,KAAK;AAAA,MAChC,SAAS,eAAK,KAAK;AAAA,MACnB,OAAO,eAAK,KAAK;AAAA,MACjB,oBAAoB,eAAK,KAAK;AAAA,MAC9B,QAAQ,eAAK,KAAK;AAAA,MAClB,WAAW,eAAK,KAAK;AAAA,MACrB,MAAM,eAAK,KAAK;AAAA,MAChB,MAAM,eAAK,KAAK;AAAA,MAChB,iBAAiB,eAAK,KAAK;AAAA,MAC3B,OAAO,IAAIC,OAAM,EAAE,OAAO,eAAK,KAAK,MAAM,GAAG,eAAK,KAAK,MAAM,GAAG,eAAK,KAAK,MAAM,CAAC;AAAA,MACjF,wBAAwB,eAAK,KAAK;AAAA,MAClC,sBAAsB,eAAK,KAAK;AAAA,MAChC,yBAAyB,eAAK,KAAK;AAAA,MACnC,uBAAuB,eAAK,KAAK;AAAA,IACnC,CAAC;AAED,SAAK,WAAW,IAAIC,YAAW,KAAK,QAAQ,KAAK,UAAU;AAC3D,SAAK,YAAY,IAAIA,YAAW,KAAK,QAAQ,KAAK,WAAW;AAC7D,SAAK,WAAW,IAAIA,YAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,mBAAmB;AACrF,SAAK,oBAAoB,IAAIC,mBAAkB;AAAA,MAC7C,MAAM,eAAK,YAAY;AAAA,MACvB,YAAY,eAAK,YAAY;AAAA,MAC7B,YAAY,eAAK,YAAY;AAAA,MAC7B,YAAY,eAAK,YAAY;AAAA,MAC7B,cAAc,eAAK,YAAY;AAAA,MAC/B,kBAAkB,eAAK,YAAY;AAAA,MACnC,gBAAgB,eAAK,YAAY;AAAA,IACnC,CAAC;AACD,SAAK,aAAa,IAAI,WAAW;AAAA,MAC/B,QAAQ,WAAW;AAAA,MACnB,mBAAmB,kBAAkB;AAAA,MACrC,iBAAiB,gBAAgB;AAAA,IACnC,CAAC;AAED,SAAK,kBAAkB,IAAID,YAAW,KAAK,QAAQ,KAAK,iBAAiB;AACzE,SAAK,gBAAgB,UACnB,eAAK,SAAS,gBAAgB,KAAK,eAAK,SAAS,gBAAgB,IAAI,OAAO;AAE9E,SAAK,UAAU,IAAI,WAAW,KAAK,KAAK,UAAU;AAClD,SAAK,IAAI,SAAS,WAAW,QAAQ,eAAK;AAC1C,SAAK,IAAI,SAAS,SAAS,QAAQ,eAAK;AACxC,SAAK,IAAI,SAAS,WAAW,QAAQ,eAAK;AAE1C,SAAK,iBAAiB,IAAI,WAAW,KAAK,kBAAkB,UAAU;AACtE,SAAK,WAAW,IAAIA,YAAW,KAAK,QAAQ,KAAK,UAAU;AAE3D,SAAK,SAAS,QAAQ,KAAK,UAAU;AACrC,SAAK,SAAS,QAAQ,KAAK,UAAU;AACrC,SAAK,SAAS,QAAQ,KAAK,QAAQ;AACnC,SAAK,SAAS,QAAQ,KAAK,QAAQ;AACnC,SAAK,SAAS,QAAQ,KAAK,QAAQ;AACnC,SAAK,SAAS,QAAQ,KAAK,SAAS;AACpC,SAAK,SAAS,QAAQ,KAAK,eAAe;AAC1C,SAAK,SAAS,QAAQ,KAAK,OAAO;AAClC,SAAK,SAAS,QAAQ,KAAK,cAAc;AAEzC,QAAI,KAAK,aAAa,MAAM;AAC1B,WAAK,MAAM,IAAI,IAAI;AACnB,WAAK,MAAM,IAAI,KAAK,GAAG;AAAA,IACzB;AAEA,SAAK,UAAU;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,gBAAgB,KAAK,IAAI;AAAA,MAC9B,KAAK,gBAAgB,KAAK,IAAI;AAAA,MAC9B,KAAK,OAAO,KAAK,IAAI;AAAA,IACvB;AACA,WAAO,iBAAiB,UAAU,MAAM,KAAK,iBAAiB,CAAC;AAC/D,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAyB;AAC/B,SAAK,QAAQ,OAAO;AACpB,SAAK,SAAS;AACd,SAAK,aAAa,IAAIP,SAAQ,KAAK,OAAO,KAAK,MAAM;AACrD,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC7C,SAAK,WAAW,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC/C,SAAK,WAAW,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC/C,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC7C,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC7C,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC7C,SAAK,UAAU,QAAQ,KAAK,OAAO,KAAK,MAAM;AAC9C,SAAK,gBAAgB,QAAQ,KAAK,OAAO,KAAK,MAAM;AACpD,SAAK,eAAe,QAAQ,KAAK,OAAO,KAAK,MAAM;AACnD,SAAK,SAAS,QAAQ,KAAK,OAAO,KAAK,MAAM;AAAA,EAC/C;AAAA,EAEO,qBAA8B;AACnC,WAAO,KAAK,UAAU;AAAA,EACxB;AAAA,EAEO,OAAO,aAAgC;AAC5C,SAAK,SAAS,KAAK,MAAM;AACzB,SAAK,WAAW,QAAQ,cAAc;AACtC,SAAK,iBAAiB,SAAS,WAAW,QAAQ,KAAK;AACvD,SAAK,iBAAiB,SAAS,KAAK,QAAQ,YAAY;AACxD,SAAK,iBAAiB,SAAS,MAAM,QAAQ;AAC7C,SAAK,SAAS,OAAO;AAErB,QAAI,KAAK,UAAU,YAAY;AAC7B,WAAK,UAAU,YAAY,WAAW;AAAA,IACxC;AAAA,EACF;AAAA,EAEO,QAAQ,KAAa,WAAoB,OAAa;AAC3D,QAAK,KAAK,aAAa,aAAa,SAAU,CAAC,KAAK;AAAU;AAC9D,UAAM,iBAAiB,IAAI,eAAe,KAAK,QAAQ;AACvD,QAAI,WAAW,IAAIS,gBAAe,CAAC,EAAE;AAAA,MACnC;AAAA,MACA,CAAC,YAAY;AACX,cAAM,SAAS,eAAgB,oBAAoB,OAAO,EAAE;AAC5D,YAAI,QAAQ;AACV,iBAAO,aAAa;AACpB,iBAAO,cAAc;AACrB,eAAK,MAAM,cAAc;AACzB,eAAK,MAAM,aAAa;AACxB,eAAK,MAAM,sBAAsB,eAAK,SAAS;AAC/C,eAAK,YAAY;AACjB,kBAAQ,QAAQ;AAChB,yBAAgB,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,MACA,MAAM;AAAA,MAAC;AAAA,MACP,CAAC,UAAsB;AACrB,gBAAQ,MAAM,cAAc,QAAQ,KAAK,UAAU,KAAK,GAAG;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEO,kBAAwB;AAC7B,QAAI,CAAC,KAAK;AAAU;AACpB,UAAM,YAAY,SAAS,cAAc,OAAO;AAChD,cAAU,OAAO;AACjB,cAAU,SAAS;AACnB,cAAU,iBAAiB,UAAU,MAAM;AACzC,YAAM,OAAO,UAAU,QAAQ,CAAC;AAChC,UAAI,CAAC,MAAM;AACT,gBAAQ,IAAI,SAAS;AACrB;AAAA,MACF;AACA,YAAM,UAAU,IAAI,gBAAgB,IAAI;AACxC,UAAI,SAAS;AACX,aAAK,QAAQ,SAAS,IAAI;AAC1B,YAAI,gBAAgB,OAAO;AAC3B,iBAAS,KAAK,YAAY,SAAS;AAAA,MACrC;AAAA,IACF,CAAC;AACD,aAAS,KAAK,YAAY,SAAS;AACnC,cAAU,MAAM;AAAA,EAClB;AAAA,EAEO,SAAe;AACpB,UAAM,WAAW,IAAIH,OAAM,EAAE;AAAA,MAC3B,UAAU,IAAI,SAAS;AAAA,MACvB,UAAU,IAAI,SAAS;AAAA,MACvB,UAAU,IAAI,SAAS;AAAA,IACzB;AACA,SAAK,MAAM,MAAM,IAAI,IAAI,UAAU,UAAU,IAAI,SAAS,UAAU,IAAI,MAAM;AAAA,EAChF;AAAA,EAEO,kBAAwB;AAC7B,QAAI,KAAK,cAAc;AACrB,WAAK,MAAM,OAAO,KAAK,YAAY;AACnC,WAAK,aAAa,QAAQ;AAAA,IAC5B;AACA,UAAM,oBAAoB,IAAIA,OAAM,EAAE;AAAA,MACpC,UAAU,aAAa,kBAAkB;AAAA,MACzC,UAAU,aAAa,kBAAkB;AAAA,MACzC,UAAU,aAAa,kBAAkB;AAAA,IAC3C;AACA,SAAK,eAAe,IAAI;AAAA,MACtB;AAAA,MACA,UAAU,aAAa;AAAA,IACzB;AACA,SAAK,MAAM,IAAI,KAAK,YAAY;AAAA,EAClC;AACF;;;ASrTA,SAAS,aAAa;AAIf,IAAM,cAAN,MAAkB;AAAA,EAAlB;AACL,wBAAQ,SAAe,IAAI,MAAM;AACjC,wBAAQ,kBAAyB;AACjC,wBAAQ,oBAA2B;AACnC,wBAAQ,cAAuB,CAAC;AAEhC,wBAAQ,0BAAiC;AACzC,wBAAQ,yBAAgC;AACxC,wBAAQ,iBAAwB;AAChC,wBAAQ,4BAAmC;AAE3C,wBAAO,QAAe;AACtB,wBAAO,aAAoB;AAC3B,wBAAO,gBAAuB;AAC9B,wBAAO,mBAA0B;AACjC,wBAAO,SAAgB;AACvB,wBAAO,OAAc;AACrB,wBAAO,cAAqB;AAAA;AAAA,EAE5B,SAAS;AACP,SAAK,eAAe,KAAK,MAAM,SAAS;AACxC,SAAK;AACL,SAAK,QAAQ,KAAK;AAClB,SAAK,WAAW,KAAK,KAAK,YAAY;AAEtC,QAAI,KAAK,WAAW,SAAS,KAAK;AAAkB,WAAK,WAAW,MAAM;AAE1E,SAAK,yBACH,KAAK,WAAW,OAAO,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC,IAAI,KAAK,WAAW;AAE3E,SAAK,yBAAyB;AAAA,MAC5B,KAAK,yBAAyB,KAAK;AAAA,MACnC,KAAK;AAAA,MACL;AAAA,IACF;AAEA,UAAM,kBAAkB,KAAK,wBAAwB,KAAK;AAC1D,UAAM,WAAW,KAAK,MAAM,kBAAkB,KAAK,cAAc,IAAI,KAAK;AAE1E,SAAK,kBAAkB,WAAW,KAAK,eAAe,OAAO,KAAK,eAAe;AACjF,SAAK,YAAY,KAAK;AAEtB,SAAK;AACL,QAAI,KAAK,4BAA4B,IAAI;AACvC,WAAK,MACH,KAAK,MAAO,KAAK,4BAA4B,KAAK,OAAO,KAAK,iBAAkB,GAAG,IAAI;AAEzF,WAAK,gBAAgB,KAAK;AAC1B,WAAK,2BAA2B;AAAA,IAClC;AAAA,EACF;AACF;;;ACvDA;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAGE,SAAAI;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EAGA,QAAAC;AAAA,EACA,wBAAAC;AAAA,EAIA,WAAAC;AAAA,OACK;AACP,YAAY,yBAAyB;AACrC,SAAS,SAAS,yBAAyB;AAQpC,IAAM,oBAAN,MAAwB;AAAA,EAS7B,YAAY,OAAc;AAR1B,wBAAQ,SAAiB;AACzB,wBAAQ;AACR,wBAAQ,cAAsB,IAAIC,SAAQ;AAC1C,wBAAQ,eAAuB,IAAIA,SAAQ;AAE3C,wBAAO,sBAAqD,oBAAI,IAAI;AACpE,wBAAQ;AAGN,SAAK,QAAQ;AACb,SAAK,mBAAmB,oBAAoB,KAAK;AAAA,EACnD;AAAA,EAEO,qBAAqB,KAAyB;AACnD,QAAI,kBAAiC;AACrC,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,oBAAoB;AAC/C,YAAM,MAAM,MAAM,QAAQ,aAAa,KAAK,UAAU;AACtD,UAAI,KAAK;AACP,YAAI,oBAAoB,QAAQ,IAAI,WAAW,iBAAiB;AAC9D,4BAAkB,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,yBAAyB,OAAkC;AACjE,UAAM,aAAoC,CAAC;AAC3C,UAAM,SAAS,CAAC,UAAoB;AAClC,UAAI,MAAM,SAAS,QAAQ;AACzB,cAAM,OAAO;AACb,aAAK,aAAa,IAAIA,SAAQ,CAAC;AAC/B,aAAK,kBAAkB;AACvB,cAAM,iBAAiB,KAAK,SAAS,MAAM;AAC3C,uBAAe,aAAa,KAAK,WAAW;AAE5C,mBAAW,OAAO,eAAe,YAAY;AAC3C,cAAI,QAAQ,YAAY;AACtB,2BAAe,gBAAgB,GAAG;AAAA,UACpC;AAAA,QACF;AACA,YAAI,eAAe,OAAO;AACxB,qBAAW,KAAK,eAAe,aAAa,CAAC;AAAA,QAC/C,OAAO;AACL,qBAAW,KAAK,cAAc;AAAA,QAChC;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,oBAAwC,oCAAgB,UAAU;AACxE,UAAM,UAAU,IAAI,QAAQ,iBAAiB;AAE7C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,EAAE,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAAA,IACpD;AAEA,UAAM,aAAa,IAAIC;AAAA,MACrB;AAAA,MACA,IAAIC,sBAAqB,EAAE,OAAO,UAAU,MAAMC,YAAW,WAAW,KAAK,CAAC;AAAA,IAChF;AACA,eAAW,SAAS,aAAa;AACjC,UAAM,aAAa,IAAI,kBAAkB,YAAY,CAAC;AACtD,eAAW,aAAa,QAAQ,IAAIC,OAAM,GAAQ;AAClD,eAAW,OAAO;AAClB,WAAO,EAAE,QAAQ,OAAO,YAAY,QAAQ;AAAA,EAC9C;AAAA,EAEO,eAAe,OAAc,UAA2B;AAC7D,QAAI,UAAU;AACZ,WAAK,iBAAiB,YAAY,OAAO,QAAQ;AAAA,IACnD;AACA,UAAM,YAAY,KAAK,yBAAyB,KAAK;AACrD,QAAI,UAAU,YAAY;AACxB,WAAK,MAAM,IAAI,UAAU,UAAU;AAAA,IACrC;AACA,SAAK,mBAAmB,IAAI,OAAO,SAAS;AAAA,EAC9C;AAAA,EAEO,kBAAkB,OAAoB;AAC3C,UAAM,YAAY,KAAK,mBAAmB,IAAI,KAAK;AACnD,QAAI,WAAW;AACb,YAAM,eAAe,KAAK,yBAAyB,KAAK;AACxD,UAAI,UAAU,YAAY;AACxB,aAAK,MAAM,OAAO,UAAU,UAAU;AAAA,MACxC;AACA,UAAI,aAAa,YAAY;AAC3B,aAAK,MAAM,IAAI,aAAa,UAAU;AAAA,MACxC;AACA,WAAK,mBAAmB,IAAI,OAAO,YAAY;AAAA,IACjD;AAAA,EACF;AAAA,EAEO,kBAAkB,OAAoB;AAC3C,SAAK,iBAAiB,eAAe,KAAK;AAC1C,UAAM,YAAY,KAAK,mBAAmB,IAAI,KAAK;AACnD,QAAI,WAAW;AACb,UAAI,UAAU,YAAY;AACxB,aAAK,MAAM,OAAO,UAAU,UAAU;AAAA,MACxC;AACA,WAAK,mBAAmB,OAAO,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,cACN,aACA,QACA,aACA,WACgB;AAChB,QAAI,oBAAoC;AACxC,cAAU,QAAQ,UAAU;AAAA,MAC1B,kBAAkB,CAAC,QAAQ,IAAI,cAAc,WAAW;AAAA,MACxD,oBAAoB,CAAC,QAAQ;AAC3B,cAAM,WAAW,KAAK;AACtB,cAAM,eAAe,KAAK;AAC1B,cAAM,WAAW,IAAI,sBAAsB,aAAa,UAAU,YAAY;AAC9E,YAAI,WAAW,QAAQ;AACrB,gBAAM,QAAQ,SAAS;AACvB,8BAAoB,IAAIJ,SAAQ,EAAE,KAAK,YAAY;AACnD,gBAAM,YAAY,aAAa,IAAI,QAAQ,EAAE,UAAU;AACvD,sBAAY,MAAM,gBAAgB,WAAW,KAAK;AAClD,sBAAY,IAAI,gBAAgB,WAAW,KAAK;AAAA,QAClD;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,aAAoB,QAAgB,aAAmB;AAC3E,QAAI,mBAKO;AACX,eAAW,aAAa,KAAK,mBAAmB,OAAO,GAAG;AACxD,YAAM,oBAAoB,KAAK,cAAc,aAAa,QAAQ,aAAa,SAAS;AACxF,UAAI,mBAAmB;AACrB,YAAI,qBAAqB,MAAM;AAC7B,6BAAmB,oBAAI,IAAI;AAAA,QAC7B;AACA,cAAM,mBAAmB;AAAA,UACvB;AAAA,YACE,UAAU;AAAA,YACV,UAAU,IAAI,MAAM;AAAA,UACtB;AAAA,UACA,UAAU;AAAA,QACZ;AACA,yBAAiB,IAAI,UAAU,QAAQ;AAAA,UACrC,UAAU,iBAAiB;AAAA,QAC7B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,iBAAiB,qBAAqB,gBAAgB;AAAA,EAC7D;AACF;",
|
6
|
+
"names": ["Vector3", "Vector3", "Color", "Vector3", "AnimationClip", "Object3D", "AnimationState", "Object3D", "AnimationClip", "Color", "LinearFilter", "Mesh", "MeshBasicMaterial", "Color", "MeshBasicMaterial", "Mesh", "LinearFilter", "Raycaster", "Vector3", "Vector3", "Raycaster", "Color", "Vector3", "Vector3", "AnimationMixer", "Object3D", "Quaternion", "Vector3", "AnimationMixer", "Object3D", "Vector3", "Quaternion", "Vector3", "Group", "Group", "EffectComposer", "EffectPass", "BloomEffect", "SSAOEffect", "BlendFunction", "ToneMappingEffect", "Color", "LoadingManager", "Vector2", "WebGLRenderer", "Color", "Group", "Vector3", "Group", "Vector3", "Color", "BlendFunction", "Color", "BlendFunction", "Color", "ShaderMaterial", "Uniform", "ShaderMaterial", "Uniform", "Vector2", "WebGLRenderer", "EffectComposer", "BlendFunction", "BloomEffect", "SSAOEffect", "Color", "EffectPass", "ToneMappingEffect", "LoadingManager", "Color", "FrontSide", "Mesh", "MeshStandardMaterial", "Vector3", "Vector3", "Mesh", "MeshStandardMaterial", "FrontSide", "Color"]
|
7
7
|
}
|