├── .gitignore ├── .npmignore ├── Justfile ├── LICENSE ├── README.md ├── demo └── index.ts ├── index.html ├── package.json ├── public └── terrain.glb ├── src ├── index.ts ├── materials.ts ├── shaders.ts ├── shaders │ └── tileBreakingNeyret.frag └── vite-env.d.ts ├── tsconfig.json ├── vite.config.demo.js ├── vite.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | demo/dist 13 | dist-ssr 14 | *.local 15 | 16 | # Editor directories and files 17 | .vscode/* 18 | !.vscode/extensions.json 19 | .idea 20 | .DS_Store 21 | *.suo 22 | *.ntvs* 23 | *.njsproj 24 | *.sln 25 | *.sw? 26 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .vscode 2 | build-demo 3 | demo 4 | node_modules 5 | public 6 | src 7 | .gitignore 8 | index.html 9 | Justfile 10 | README.md 11 | tsconfig.json 12 | vite.config.js 13 | yarn-error.log 14 | yarn.lock 15 | dist/*.glb 16 | dist/*.gltf 17 | -------------------------------------------------------------------------------- /Justfile: -------------------------------------------------------------------------------- 1 | run: 2 | yarn dev 3 | 4 | build: 5 | yarn build 6 | 7 | publish: 8 | yarn publish 9 | 10 | build-demo: 11 | yarn build:demo 12 | 13 | publish-demo: 14 | phost update three-hex-tiling patch demo/dist 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023-2024 Casey Primozic and others 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `three-hex-tiling` 2 | [![npm version](https://img.shields.io/npm/v/three-hex-tiling.svg?style=flat-square)](https://www.npmjs.com/package/three-hex-tiling) 3 | [![twitter](https://flat.badgen.net/badge/twitter/@ameobea10/?icon&label)](https://twitter.com/ameobea10) 4 | 5 | Extends built-in Three.JS materials to support infinite, non-repeating, seamless texture tiling. 6 | 7 | ![Screenshot showing comparison between a repeating seamless rock texture with and without three-hex-tiling. The image is divided in half horizontally by a gray bar. The left side is labeled "baseline" and shows a gray rock-like texture that clearly repeats, resulting in an artifical grid-like pattern. The right side has the same rock texture but without any visible tiling and is labeled three-hex-tiling.](https://i.ameo.link/bpu.jpg) 8 | 9 | Live interactive demo: 10 | 11 | ## Installation 12 | 13 | `npm install three-hex-tiling` 14 | 15 | Then, to enable it, just add this to your project as early as possible: 16 | 17 | ```ts 18 | import 'three-hex-tiling'; 19 | ``` 20 | 21 | This import will patch Three.JS's shaders and materials to support the hex tiling algorithm and it will extend the types for the patched materials with parameters to control it. 22 | 23 | ### Three.JS Version Support 24 | 25 | This library has been tested with Three.JS versions `0.151` through `0.173`. Although it may work with other versions, support is not guaranteed. 26 | 27 | ## Usage 28 | 29 | After adding the `three-hex-tiling` import at the top of your project, a new `hexTiling` parameter is added to the parameters of supported materials. If your project uses TypeScript, these should be included in the types you see when creating those materials. 30 | 31 | By setting the `hexTiling` property when creating a material, hex tiling will be enabled for that material. It is disabled by default. 32 | 33 | ```ts 34 | const mat = new THREE.MeshStandardMaterial({ 35 | map: myTexture, 36 | normalMap: myTextureNormalMap, 37 | roughnessMap: myTextureRoughnessMap, 38 | hexTiling: { 39 | // default values shown 40 | patchScale: 2, 41 | useContrastCorrectedBlending: true, 42 | lookupSkipThreshold: 0.01, 43 | textureSampleCoefficientExponent: 8, 44 | } 45 | }); 46 | ``` 47 | 48 | Hex tiling cannot be enabled or disabled after a material is created, but the values of individual parameters can be changed dynamically: 49 | 50 | ```ts 51 | mat.hexTiling.patchScale = newPatchScale; 52 | ``` 53 | 54 | ### Texture Scaling 55 | 56 | When enabling hex tiling for a material, you may find that your textures need a scale adjustment to look optimal. This can be done using built-in Three.JS texture scaling support: 57 | 58 | ```ts 59 | myTexture.scale.set(1.5, 1.5); 60 | myTextureNormalMap.scale.set(1.5, 1.5); 61 | myTextureRoughnessMap.scale.set(1.5, 1.5); 62 | 63 | myTexture.needsUpdate = true; 64 | myTextureNormalMap.needsUpdate = true; 65 | myTextureRoughnessMap.needsUpdate = true; 66 | ``` 67 | 68 | ### Supported Textures 69 | 70 | Textures used with `three-hex-tiling` must be seamless - meaning that there are no sharp cutoffs when the texture is tiled. There's a good chance your textures are seamless already and if they aren't, it will be obvious. 71 | 72 | ### Supported Materials 73 | 74 | The following materials are currently supported for use with `three-hex-tiling`: 75 | 76 | * `MeshStandardMaterial` 77 | * `MeshPhysicalMaterial` 78 | 79 | You can still use all of the other materials that Three.JS provides, but they will not have support for hex tiling. 80 | 81 | ### Supported Maps 82 | 83 | In addition to the base texture/color of a material provided in the `map` property, `three-hex-tiling` supports with the following maps: 84 | 85 | * `normalMap` 86 | * `roughnessMap` 87 | * `metalnessMap` 88 | 89 | ## Config Options 90 | 91 | `three-hex-tiling` accepts the following configuration properties in the `hexTiling` object: 92 | 93 | ### `patchScale: number` 94 | 95 | - **Description**: Scale factor for the hexagonal tiles used to break up the texture. This parameter is crucial in controlling the hex tiling's appearance and requires adjustment for each texture. 96 | - **Default**: `2` 97 | - **Range**: `[0, Infinity]`, typically between 0.1 and 8. Optimal values depend on the texture and desired effect. 98 | - **Behavior**: Larger values create smaller hexagonal tiles, resulting in more texture breakup. 99 | 100 | | ![Screenshot of a black and red lava-like texture with three-hex-tiling applied with a patch scale of 1](https://i.ameo.link/bp2.jpg) | ![Screenshot of a black and red lava-like texture with three-hex-tiling applied with a patch scale of 2](https://i.ameo.link/bp3.jpg) | ![Screenshot of a black and red lava-like texture with three-hex-tiling applied with a patch scale of 6](https://i.ameo.link/bp5.jpg) | 101 | |----------------------------------|----------------------------------|----------------------------------| 102 | | Patch Scale: 1 | Patch Scale: 2 | Patch Scale: 6 | 103 | 104 | ### `useContrastCorrectedBlending: boolean` 105 | 106 | - **Description**: Determines if contrast-corrected blending is used for texture samples. This method often enhances blending quality but might result in overly bright or dark patches in high-contrast textures. 107 | - **Default**: `true` 108 | - **Reference**: [ShaderToy Demo](https://www.shadertoy.com/view/4dcSDr) 109 | 110 | | ![Screenshot of a rocky/mineral-like texture with three-hex-tiling applied and contrast-corrected blending enabled](https://i.ameo.link/bp8.jpg) | ![Screenshot of a rocky/mineral-like texture with three-hex-tiling applied and contrast-corrected blending disabled](https://i.ameo.link/bp9.jpg) | 111 | |--------------------------------------|---------------------------------------| 112 | | Contrast-Corrected Blending: Enabled | Contrast-Corrected Blending: Disabled | 113 | 114 | ### `lookupSkipThreshold: number` 115 | 116 | - **Description**: The minimum magnitude below which texture lookups are skipped, mainly for optimization purposes. 117 | - **Default**: `0.01` 118 | - **Range**: `[0, 1]` (but you'll probably always want to keep it <0.1) 119 | - **Advice**: Usually doesn't require modification. 120 | - **Details**: The shader mixes up to three texture samples per fragment. Texture lookups with a final coefficient less than this threshold are skipped to reduce GPU memory bandwidth usage. 121 | 122 | ### `textureSampleCoefficientExponent: number` 123 | 124 | - **Description**: The exponent for texture sample coefficients before comparison with `lookupSkipThreshold`. Adjusting this value affects shader efficiency and the visibility of hexagonal tile borders. 125 | - **Default**: `8` 126 | - **Range**: `(0, 64]` 127 | - **Advice**: The default value is suitable for most textures. Modification is usually unnecessary. 128 | - **Details**: Coefficients raised to this exponent modify the steepness of the threshold for skipping texture lookups. Higher exponents increase efficiency by reducing texture lookups, potentially making the shader more efficient. 129 | 130 | | ![Screenshot of a gray rock-like texture with three-hex-tiling applied with a texture sample coefficient exponent of 1](https://i.ameo.link/bpi.jpg) | ![Screenshot of a gray rock-like texture with three-hex-tiling applied with a texture sample coefficient exponent of 2](https://i.ameo.link/bph.jpg) | ![Screenshot of a gray rock-like texture with three-hex-tiling applied with a texture sample coefficient exponent of 8](https://i.ameo.link/bpg.jpg) | 131 | |----------------------------------|----------------------------------|----------------------------------| 132 | | Texture Sample Coefficient Exponent: 1 | Texture Sample Coefficient Exponent: 2 | Texture Sample Coefficient Exponent: 8 | 133 | 134 | ## Performance 135 | 136 | The hex tiling shader used by this library needs to make up to 3 texture fetches per map per fragment in order to function. 137 | 138 | Usually, this is fine and doesn't result in any noticeable performance hit. But in some situations, hex tiling can create a significant amount of texture bandwidth usage on the GPU and impact performance on weaker devices. 139 | 140 | ### Optimizing Performance 141 | 142 | There are some ways to tune `three-hex-tiling` to lessen its performance impact: 143 | 144 | * Increase `textureSampleCoefficientExponent` and/or `lookupSkipThreshold` 145 | * This directly reduces the average number of texture samples made per fragment, but it can make the borders between hex tiles more obvious. 146 | * Use a [depth pre-pass](https://cprimozic.net/blog/threejs-depth-pre-pass-optimization/) to your scene to reduce the number of calls to the fragment shader. 147 | * For some scenes, especially those with high overdraw, this can be a big win 148 | * Reduce the number of maps used by your material 149 | * Reduce the size of textures used or use [compressed textures](https://threejs.org/docs/#api/en/textures/CompressedTexture) 150 | 151 | ## Implementation Details 152 | 153 | The hex tiling shader itself is adapted from [a Shadertoy](https://www.shadertoy.com/view/MdyfDV) by [Fabrice Neyret](http://evasion.imag.fr/Membres/Fabrice.Neyret/). 154 | 155 | `three-hex-tiling` works by modifying Three.JS's shaders directly, patching in the hex tiling algorithm and conditionally enabling it for materials that opt in. Materials that do not explicitly set `hexTiling` will work normally. 156 | 157 | In addition to patching the shaders, it also installs a custom [`onBeforeCompile`](https://threejs.org/docs/#api/en/materials/Material.onBeforeCompile) callback on materials. If you make use of `onBeforeCompile` in your own code, there's a good chance that `three-hex-tiling` will interfere with it and cause problems. 158 | -------------------------------------------------------------------------------- /demo/index.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"; 3 | import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; 4 | import GUI from "lil-gui"; 5 | 6 | // Install the hex tiling shader patch 7 | import "../src/index"; 8 | 9 | // You would use this in your own code like this: 10 | // import 'three-hex-tiling'; 11 | 12 | import { type HexTilingParams } from "../src/index"; 13 | 14 | console.log("three.js version:", THREE.REVISION); 15 | 16 | const canvas = document.createElement("canvas"); 17 | canvas.width = window.innerWidth; 18 | canvas.height = window.innerHeight; 19 | canvas.style.backgroundColor = "black"; 20 | document.body.appendChild(canvas); 21 | 22 | interface TexturesDef { 23 | textureURL: string; 24 | textureNormalURL: string; 25 | textureRoughnessURL?: string; 26 | nonTilingTextureScale: number; 27 | tilingTextureScale: number; 28 | } 29 | 30 | const Materials: { [key: string]: TexturesDef } = { 31 | ore: { 32 | textureURL: "https://i.ameo.link/bd3.jpg", 33 | textureNormalURL: "https://i.ameo.link/bd6.jpg", 34 | nonTilingTextureScale: 16, 35 | tilingTextureScale: 40, 36 | }, 37 | blackStone: { 38 | textureURL: "https://i.ameo.link/bdd.jpg", 39 | textureNormalURL: "https://i.ameo.link/bdf.jpg", 40 | textureRoughnessURL: "https://i.ameo.link/bdg.jpg", 41 | nonTilingTextureScale: 12, 42 | tilingTextureScale: 22, 43 | }, 44 | grayStone: { 45 | textureURL: "https://i.ameo.link/bfj.jpg", 46 | textureNormalURL: "https://i.ameo.link/bfk.jpg", 47 | textureRoughnessURL: "https://i.ameo.link/bfl.jpg", 48 | nonTilingTextureScale: 22, 49 | tilingTextureScale: 42, 50 | }, 51 | cartoonLava: { 52 | textureURL: "https://i.ameo.link/bl9.jpg", 53 | textureNormalURL: "https://i.ameo.link/bla.jpg", 54 | textureRoughnessURL: "https://i.ameo.link/blb.jpg", 55 | nonTilingTextureScale: 12 * 2, 56 | tilingTextureScale: 24 * 2, 57 | }, 58 | }; 59 | 60 | interface Textures { 61 | texture: THREE.Texture; 62 | textureNormal: THREE.Texture; 63 | textureRoughness: THREE.Texture | undefined; 64 | } 65 | 66 | interface TexturesCacheEntry { 67 | enabled: Textures; 68 | disabled: Textures; 69 | } 70 | 71 | const texturesCache: Map> = new Map(); 72 | 73 | const loadTextures = (key: string) => { 74 | const cached = texturesCache.get(key); 75 | if (cached) { 76 | return cached; 77 | } 78 | 79 | const defPromise = new Promise(async (resolve) => { 80 | const { 81 | tilingTextureScale, 82 | nonTilingTextureScale, 83 | textureNormalURL, 84 | textureURL, 85 | textureRoughnessURL, 86 | } = Materials[key]; 87 | 88 | const [texture, textureNormal, textureRoughness] = await Promise.all([ 89 | textureLoader.loadAsync(textureURL), 90 | textureLoader.loadAsync(textureNormalURL), 91 | textureRoughnessURL 92 | ? textureLoader.loadAsync(textureRoughnessURL) 93 | : undefined, 94 | ]); 95 | texture.wrapS = THREE.RepeatWrapping; 96 | texture.wrapT = THREE.RepeatWrapping; 97 | texture.repeat.set(tilingTextureScale, tilingTextureScale); 98 | texture.magFilter = THREE.NearestFilter; 99 | texture.anisotropy = 16; 100 | // I find that this helps to make things look a bit sharper when using 101 | // the hex tile-breaking shader, but it's not necessary 102 | texture.minFilter = THREE.NearestMipMapLinearFilter; 103 | 104 | textureNormal.wrapS = THREE.RepeatWrapping; 105 | textureNormal.wrapT = THREE.RepeatWrapping; 106 | textureNormal.repeat.set(tilingTextureScale, tilingTextureScale); 107 | 108 | if (textureRoughness) { 109 | textureRoughness.wrapS = THREE.RepeatWrapping; 110 | textureRoughness.wrapT = THREE.RepeatWrapping; 111 | textureRoughness.repeat.set(tilingTextureScale, tilingTextureScale); 112 | textureRoughness.magFilter = THREE.NearestFilter; 113 | } 114 | 115 | const enabledTextures = { 116 | texture, 117 | textureNormal, 118 | textureRoughness, 119 | }; 120 | const disabledTextures = { 121 | texture: texture.clone(), 122 | textureNormal: textureNormal.clone(), 123 | textureRoughness: textureRoughness ? textureRoughness.clone() : undefined, 124 | }; 125 | 126 | disabledTextures.texture.repeat.set( 127 | nonTilingTextureScale, 128 | nonTilingTextureScale 129 | ); 130 | disabledTextures.textureNormal.repeat.set( 131 | nonTilingTextureScale, 132 | nonTilingTextureScale 133 | ); 134 | if (disabledTextures.textureRoughness) { 135 | disabledTextures.textureRoughness.repeat.set( 136 | nonTilingTextureScale, 137 | nonTilingTextureScale 138 | ); 139 | } 140 | 141 | resolve({ enabled: enabledTextures, disabled: disabledTextures }); 142 | }); 143 | 144 | texturesCache.set(key, defPromise); 145 | return defPromise; 146 | }; 147 | 148 | const textureLoader = new THREE.TextureLoader(); 149 | const gltfLoader = new GLTFLoader(); 150 | const gltfPromise = gltfLoader.loadAsync("/terrain.glb"); 151 | 152 | const uiParams = { 153 | enabled: true, 154 | }; 155 | const textureParams = { 156 | normalScale: 1.7, 157 | texture: "grayStone", 158 | }; 159 | 160 | const [textures, gltf] = await Promise.all([ 161 | loadTextures(textureParams.texture), 162 | gltfPromise, 163 | ]); 164 | 165 | const scene = new THREE.Scene(); 166 | const camera = new THREE.PerspectiveCamera( 167 | 75, 168 | canvas.width / canvas.height, 169 | 0.1, 170 | 1000 171 | ); 172 | camera.position.set(20, 20, 20); 173 | 174 | const renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); 175 | renderer.setSize(canvas.width, canvas.height); 176 | 177 | const hexTilingParams: HexTilingParams = { 178 | patchScale: 2, 179 | useContrastCorrectedBlending: true, 180 | lookupSkipThreshold: 0.01, 181 | textureSampleCoefficientExponent: 8, 182 | }; 183 | const noHexTilingMat = new THREE.MeshPhysicalMaterial({ 184 | name: "no-hex-tiling", 185 | color: 0xf0e3f6, 186 | normalScale: new THREE.Vector2( 187 | textureParams.normalScale, 188 | textureParams.normalScale 189 | ), 190 | map: textures.disabled.texture, 191 | normalMap: textures.disabled.textureNormal, 192 | roughnessMap: textures.disabled.textureRoughness, 193 | metalness: 0, 194 | roughness: 1, 195 | }); 196 | const hexTilingMat = new THREE.MeshPhysicalMaterial({ 197 | name: "hex-tiling", 198 | color: 0xf0e3f6, 199 | normalScale: new THREE.Vector2( 200 | textureParams.normalScale, 201 | textureParams.normalScale 202 | ), 203 | map: textures.enabled.texture, 204 | normalMap: textures.enabled.textureNormal, 205 | roughnessMap: textures.enabled.textureRoughness, 206 | metalness: 0, 207 | roughness: 1, 208 | hexTiling: hexTilingParams, 209 | }); 210 | 211 | // load the terrain 212 | const terrain = gltf.scene.getObjectByName("Landscape002") as THREE.Mesh; 213 | terrain.material = hexTilingMat; 214 | scene.add(terrain); 215 | 216 | const gui = new GUI({ 217 | width: window.innerWidth > 500 ? 400 : window.innerWidth - 12, 218 | title: "`three-hex-tiling` Demo Controls", 219 | }); 220 | gui.$title.innerHTML = 221 | 'three-hex-tiling Demo Controls'; 222 | const link = document.querySelector(".title a")! as HTMLAnchorElement; 223 | // prevent link click from propagating to the title which causes the gui to close 224 | link.addEventListener("click", (e) => e.stopPropagation()); 225 | 226 | gui.add(uiParams, "enabled").onChange((value) => { 227 | if (value) { 228 | terrain.material = hexTilingMat; 229 | } else { 230 | terrain.material = noHexTilingMat; 231 | } 232 | }); 233 | 234 | const hexFolder = gui.addFolder("Hex Tiling Params"); 235 | 236 | hexFolder.add(hexTilingParams, "patchScale").min(0.02).max(6); 237 | hexFolder.add(hexTilingParams, "useContrastCorrectedBlending"); 238 | hexFolder.add(hexTilingParams, "lookupSkipThreshold").min(0).max(0.5); 239 | hexFolder 240 | .add(hexTilingParams, "textureSampleCoefficientExponent") 241 | .min(0.5) 242 | .max(32); 243 | 244 | const textureFolder = gui.addFolder("Texture Params"); 245 | textureFolder 246 | .add(textureParams, "texture", Object.keys(Materials)) 247 | .onChange(async (value) => { 248 | const textures = await loadTextures(value); 249 | 250 | hexTilingMat.map = textures.enabled.texture; 251 | hexTilingMat.normalMap = textures.enabled.textureNormal; 252 | hexTilingMat.roughnessMap = textures.enabled.textureRoughness ?? null; 253 | 254 | noHexTilingMat.map = textures.disabled.texture; 255 | noHexTilingMat.normalMap = textures.disabled.textureNormal; 256 | noHexTilingMat.roughnessMap = textures.disabled.textureRoughness ?? null; 257 | 258 | hexTilingMat.needsUpdate = true; 259 | noHexTilingMat.needsUpdate = true; 260 | }); 261 | textureFolder 262 | .add(textureParams, "normalScale") 263 | .min(0) 264 | .max(5) 265 | .step(0.1) 266 | .onChange((value) => { 267 | hexTilingMat.normalScale.set(value, value); 268 | noHexTilingMat.normalScale.set(value, value); 269 | }); 270 | 271 | const light = new THREE.DirectionalLight(0xf5efd5, 1.2 * Math.PI); 272 | light.position.set(40, 24, 40); 273 | scene.add(light); 274 | 275 | // Add a white sphere at the location of the light to indicate its position 276 | const lightSphere = new THREE.Mesh( 277 | new THREE.SphereGeometry(0.5, 32, 32), 278 | new THREE.MeshBasicMaterial({ color: 0xffffff }) 279 | ); 280 | lightSphere.castShadow = false; 281 | lightSphere.receiveShadow = false; 282 | lightSphere.position.copy(light.position); 283 | scene.add(lightSphere); 284 | 285 | const ambientLight = new THREE.AmbientLight(0x404040, 2 * Math.PI); // soft white light 286 | scene.add(ambientLight); 287 | 288 | const controls = new OrbitControls(camera, renderer.domElement); 289 | controls.enableDamping = true; 290 | 291 | // configure shadows 292 | renderer.shadowMap.enabled = true; 293 | 294 | // Set up some tone mapping to make colors look nicer 295 | renderer.shadowMap.type = THREE.PCFSoftShadowMap; 296 | // renderer.toneMapping = THREE.CineonToneMapping; 297 | renderer.toneMapping = THREE.ACESFilmicToneMapping; 298 | renderer.toneMappingExposure = 1.25; 299 | renderer.outputColorSpace = THREE.LinearSRGBColorSpace; 300 | 301 | const animate = () => { 302 | renderer.render(scene, camera); 303 | controls.update(); 304 | requestAnimationFrame(animate); 305 | }; 306 | 307 | window.addEventListener("resize", () => { 308 | canvas.width = window.innerWidth; 309 | canvas.height = window.innerHeight; 310 | camera.aspect = canvas.width / canvas.height; 311 | camera.updateProjectionMatrix(); 312 | renderer.setSize(canvas.width, canvas.height); 313 | }); 314 | 315 | animate(); 316 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | three-hex-tiling 7 | 13 | 14 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "three-hex-tiling", 3 | "license": "MIT", 4 | "version": "0.1.5", 5 | "type": "module", 6 | "files": [ 7 | "dist" 8 | ], 9 | "main": "./dist/index.cjs", 10 | "module": "./dist/index.js", 11 | "types": "./dist/index.d.ts", 12 | "exports": { 13 | ".": { 14 | "import": "./dist/index.js", 15 | "require": "./dist/index.umd.cjs" 16 | } 17 | }, 18 | "scripts": { 19 | "dev": "vite", 20 | "build": "tsc && vite build", 21 | "build:demo": "vite build --config vite.config.demo.js", 22 | "preview": "vite preview" 23 | }, 24 | "devDependencies": { 25 | "@types/three": "^0.173.0", 26 | "lil-gui": "^0.19.2", 27 | "three": "^0.173.0", 28 | "typescript": "^5.5.4", 29 | "vite": "^5.4.2", 30 | "vite-plugin-dts": "^4.0.3", 31 | "vite-plugin-glsl": "^1.3.0" 32 | }, 33 | "peerDependencies": { 34 | "three": ">=0.151" 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /public/terrain.glb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ameobea/three-hex-tiling/b27c1107495eb5c85d5ceab4ea3cb6d03fe2e1bb/public/terrain.glb -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | import { 4 | patchMeshPhysicalMaterial, 5 | patchMeshStandardMaterial, 6 | } from "./materials"; 7 | 8 | export interface HexTilingParams { 9 | /** 10 | * Scale factor for the hexagonal tiles used to break up the texture. This is the most important 11 | * parameter for controlling the look of the hex tiling and likely needs to be adjusted for each 12 | * texture. 13 | * 14 | * Should be greater than zero and usually somewhere between 0.1 and 16, but the optimal 15 | * value depends on the texture and the desired effect. 16 | * 17 | * Larger values create smaller hexagonal tiles and break up the texture more. 18 | * 19 | * **Default**: 2 20 | */ 21 | patchScale: number; 22 | /** 23 | * If set to true, contrast-corrected blending will be used to blend between the texture samples. This 24 | * greatly improves the quality of the blending for most textures, but can sometimes create very bright 25 | * or very dark patches if the texture has a lot of contrast. 26 | * 27 | * See https://www.shadertoy.com/view/4dcSDr for a demo of the effect. 28 | * 29 | * **Default**: `true` 30 | */ 31 | useContrastCorrectedBlending: boolean; 32 | /** 33 | * The magnitude under which texture lookups will be skipped. 34 | * 35 | * You probably don't need to change this. 36 | * 37 | * **Default**: 0.01 38 | * 39 | * ### Details 40 | * 41 | * The hex tiling shader mixes between up to three texture samples per fragment. As an optimization, 42 | * if the magnitude of one particular mix is below this threshold, the texture lookup will be skipped to 43 | * reduce GPU memory bandwidth usage. 44 | * 45 | * If the final coefficient of a texture sample is less than `lookupSkipThreshold`, the texture lookup will 46 | * be skipped. 47 | */ 48 | lookupSkipThreshold: number; 49 | /** 50 | * The exponent to which texture sample coefficients are raised before comparing to `lookupSkipThreshold`. 51 | * 52 | * Higher values make the shader more efficient but can make the borders between hexagonal tiles more visible. 53 | * 54 | * Lower values make the shader less efficient and can cause detail to get washed out and make the texture 55 | * look blurry and homogenized. 56 | * 57 | * The default value works pretty well for most textures; you likely don't need to change this. 58 | * 59 | * **Default**: 8 60 | * 61 | * ### Details 62 | * 63 | * The hex tiling shader mixes between up to three texture samples per fragment. By raising the coefficients 64 | * to a power, it's possible to make the threshold for skipping a texture lookup more or less steep. Exponents 65 | * greater than 1 make the threshold steeper, exponents less than 1 make the threshold less steep. 66 | * 67 | * Higher exponents, when combined with `lookupSkipThreshold`, can be used to make the hex tiling shader 68 | * more efficient by skipping some texture lookups and reducing GPU memory bandwidth usage. 69 | */ 70 | textureSampleCoefficientExponent: number; 71 | } 72 | 73 | declare module "three" { 74 | export interface MeshStandardMaterial { 75 | /** 76 | * Parameters for controlling the hex tiling from `three-hex-tiling`. 77 | * 78 | * If this parameter is not set, hex tiling will not be applied. 79 | * 80 | * This parameter cannot be changed after the material is created. 81 | */ 82 | hexTiling?: Partial; 83 | } 84 | 85 | export interface MeshStandardMaterialParameters { 86 | /** 87 | * Parameters for controlling the hex tiling from `three-hex-tiling`. 88 | * 89 | * If this parameter is not set, hex tiling will not be applied. 90 | * 91 | * This parameter cannot be changed after the material is created. 92 | */ 93 | hexTiling?: Partial; 94 | } 95 | } 96 | 97 | patchMeshPhysicalMaterial(); 98 | patchMeshStandardMaterial(); 99 | -------------------------------------------------------------------------------- /src/materials.ts: -------------------------------------------------------------------------------- 1 | import { 2 | ShaderLib, 3 | MeshStandardMaterial, 4 | type WebGLRenderer, 5 | MeshPhysicalMaterial, 6 | type ShaderLibShader, 7 | } from "three"; 8 | import { 9 | buildFragment, 10 | buildUniforms, 11 | THREE_HEX_TILING_DEFINE, 12 | } from "./shaders"; 13 | import type { HexTilingParams } from "."; 14 | 15 | const DefaultHexTilingParams: HexTilingParams = Object.freeze({ 16 | patchScale: 2, 17 | useContrastCorrectedBlending: true, 18 | lookupSkipThreshold: 0.01, 19 | textureSampleCoefficientExponent: 8, 20 | }); 21 | 22 | const genRandomStringID = () => 23 | Math.random().toString(36).substring(2, 15) + 24 | Math.random().toString(36).substring(2, 15); 25 | 26 | const buildOnBeforeCompile = < 27 | T extends { 28 | hexTiling: Partial; 29 | defines: { [key: string]: string }; 30 | } 31 | >( 32 | shaderMap: Map 33 | ) => 34 | function (this: T, shader: ShaderLibShader, _renderer: WebGLRenderer) { 35 | const hexTilingID = genRandomStringID(); 36 | (this as any).hexTilingID = hexTilingID; 37 | shaderMap.set(hexTilingID, shader); 38 | 39 | if (this.hexTiling && this.hexTiling !== EMPTY_HEX_TILING_PARAMS) { 40 | this.defines[THREE_HEX_TILING_DEFINE] = ""; 41 | } 42 | }; 43 | 44 | const buildCustomProgramCacheKey = < 45 | T extends { hexTiling: Partial } 46 | >() => 47 | function (this: T): string { 48 | return this.hexTiling && this.hexTiling !== EMPTY_HEX_TILING_PARAMS 49 | ? "1" 50 | : "0"; 51 | }; 52 | 53 | const buildOnBeforeRender = }>( 54 | shaderMap: Map 55 | ) => 56 | function onBeforeRender(this: T) { 57 | const shaderRef = shaderMap.get((this as any).hexTilingID); 58 | if (!shaderRef) { 59 | return; 60 | } 61 | 62 | const params = this.hexTiling ?? DefaultHexTilingParams; 63 | 64 | shaderRef.uniforms.hexTilingPatchScale.value = 65 | params.patchScale ?? DefaultHexTilingParams.patchScale; 66 | shaderRef.uniforms.hexTilingUseContrastCorrectedBlending.value = 67 | params.useContrastCorrectedBlending ?? 68 | DefaultHexTilingParams.useContrastCorrectedBlending; 69 | shaderRef.uniforms.hexTilingLookupSkipThreshold.value = 70 | params.lookupSkipThreshold ?? DefaultHexTilingParams.lookupSkipThreshold; 71 | shaderRef.uniforms.hexTilingTextureSampleCoefficientExponent.value = 72 | params.textureSampleCoefficientExponent ?? 73 | DefaultHexTilingParams.textureSampleCoefficientExponent; 74 | }; 75 | 76 | const EMPTY_HEX_TILING_PARAMS = Object.freeze({}); 77 | 78 | const patchMaterial = ( 79 | MaterialToPatch: typeof MeshStandardMaterial | typeof MeshPhysicalMaterial 80 | ) => { 81 | const shaderMap = new Map(); 82 | 83 | MaterialToPatch.prototype.onBeforeCompile = buildOnBeforeCompile(shaderMap); 84 | MaterialToPatch.prototype.customProgramCacheKey = 85 | buildCustomProgramCacheKey(); 86 | 87 | // internal ID used to match the shader to the material so that the custom uniforms can be updated 88 | // from the material 89 | (MaterialToPatch.prototype as any).hexTilingID = "NOT_SET"; 90 | MaterialToPatch.prototype.hexTiling = EMPTY_HEX_TILING_PARAMS; 91 | 92 | (MaterialToPatch.prototype as any).onBeforeRender = 93 | buildOnBeforeRender(shaderMap); 94 | }; 95 | 96 | export const patchMeshStandardMaterial = () => { 97 | const baseFragmentShader = ShaderLib.standard.fragmentShader; 98 | const fragmentShader = buildFragment(baseFragmentShader); 99 | ShaderLib.standard.fragmentShader = fragmentShader; 100 | 101 | Object.assign(ShaderLib.standard.uniforms, buildUniforms()); 102 | 103 | patchMaterial(MeshStandardMaterial); 104 | }; 105 | 106 | export const patchMeshPhysicalMaterial = () => { 107 | const baseFragmentShader = ShaderLib.physical.fragmentShader; 108 | const fragmentShader = buildFragment(baseFragmentShader); 109 | ShaderLib.physical.fragmentShader = fragmentShader; 110 | 111 | Object.assign(ShaderLib.physical.uniforms, buildUniforms()); 112 | 113 | patchMaterial(MeshPhysicalMaterial); 114 | }; 115 | -------------------------------------------------------------------------------- /src/shaders.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import tileBreakingNeyretFragment from "./shaders/tileBreakingNeyret.frag"; 3 | 4 | export const THREE_HEX_TILING_DEFINE = "USE_THREE_HEX_TILING"; 5 | 6 | const buildConditionalReplacer = ( 7 | haystack: string, 8 | regex: RegExp, 9 | replacement: string 10 | ): string => { 11 | const match = haystack.match(regex); 12 | if (!match) { 13 | return haystack; 14 | } 15 | 16 | const updatedMatch = ` 17 | #ifdef ${THREE_HEX_TILING_DEFINE} 18 | ${replacement} 19 | #else 20 | ${match[0]} 21 | #endif 22 | `; 23 | 24 | return haystack.replace(regex, updatedMatch); 25 | }; 26 | 27 | let DidPatchShaderChunks = false; 28 | 29 | const patchShaderChunks = () => { 30 | THREE.ShaderChunk.map_fragment = buildConditionalReplacer( 31 | THREE.ShaderChunk.map_fragment, 32 | /texture2D\(\s*map\s*,\s*vMapUv\s*\)/g, 33 | "textureNoTileNeyret(map, vMapUv)" 34 | ); 35 | 36 | THREE.ShaderChunk.normal_fragment_maps = buildConditionalReplacer( 37 | THREE.ShaderChunk.normal_fragment_maps, 38 | /texture2D\(\s*normalMap\s*,\s*vNormalMapUv\s*\)/g, 39 | "textureNoTileNeyret(normalMap, vNormalMapUv)" 40 | ); 41 | 42 | THREE.ShaderChunk.roughnessmap_fragment = buildConditionalReplacer( 43 | THREE.ShaderChunk.roughnessmap_fragment, 44 | /texture2D\(\s*roughnessMap\s*,\s*vRoughnessMapUv\s*\)/g, 45 | "textureNoTileNeyret(roughnessMap, vRoughnessMapUv)" 46 | ); 47 | 48 | THREE.ShaderChunk.metalnessmap_fragment = buildConditionalReplacer( 49 | THREE.ShaderChunk.metalnessmap_fragment, 50 | /texture2D\(\s*metalnessMap\s*,\s*vMetalnessMapUv\s*\)/g, 51 | "textureNoTileNeyret(metalnessMap, vMetalnessMapUv)" 52 | ); 53 | 54 | (THREE.ShaderChunk as any).tilebreaking_pars_fragment = 55 | tileBreakingNeyretFragment; 56 | }; 57 | 58 | export const buildFragment = (baseFragmentShader: string) => { 59 | if (!DidPatchShaderChunks) { 60 | DidPatchShaderChunks = true; 61 | patchShaderChunks(); 62 | } 63 | 64 | let fragment = baseFragmentShader; 65 | fragment = fragment.replace( 66 | "void main() {", 67 | ` 68 | #include 69 | 70 | void main() { 71 | ` 72 | ); 73 | 74 | return fragment; 75 | }; 76 | 77 | export const buildUniforms = () => ({ 78 | hexTilingUseContrastCorrectedBlending: { value: true }, 79 | hexTilingPatchScale: { value: 6 }, 80 | hexTilingLookupSkipThreshold: { value: 0.01 }, 81 | hexTilingTextureSampleCoefficientExponent: { value: 8 }, 82 | }); 83 | -------------------------------------------------------------------------------- /src/shaders/tileBreakingNeyret.frag: -------------------------------------------------------------------------------- 1 | /** 2 | * Adapted from https://www.shadertoy.com/view/MdyfDV 3 | */ 4 | 5 | #define rnd22(p) fract(sin((p) * mat2(127.1, 311.7, 269.5, 183.3)) * 43758.5453) 6 | // TODO: Figure out if this is correct for three.js 7 | #define srgb2rgb(V) pow(max(V, 0.), vec4(2.2)) // RGB <-> sRGB conversions 8 | #define rgb2srgb(V) pow(max(V, 0.), vec4(1. / 2.2)) 9 | 10 | // (textureGrad handles MIPmap through patch borders) 11 | #define C(I) (srgb2rgb(textureGrad(samp, U / hexTilingPatchScale - rnd22(I), Gx, Gy)) - meanColor * float(hexTilingUseContrastCorrectedBlending)) 12 | 13 | uniform bool hexTilingUseContrastCorrectedBlending; // https://www.shadertoy.com/view/4dcSDr 14 | uniform float hexTilingPatchScale; 15 | uniform float hexTilingLookupSkipThreshold; 16 | uniform float hexTilingTextureSampleCoefficientExponent; 17 | 18 | vec4 textureNoTileNeyret(sampler2D samp, vec2 uv) { 19 | mat2 M0 = mat2(1, 0, .5, sqrt(3.) / 2.); 20 | mat2 M = inverse(M0); 21 | vec2 U = uv * hexTilingPatchScale / 8. * exp2(4. * 0.2 + 1.); 22 | vec2 V = M * U; 23 | vec2 I = floor(V); 24 | vec2 Gx = dFdx(U / hexTilingPatchScale), Gy = dFdy(U / hexTilingPatchScale); 25 | 26 | vec4 meanColor = hexTilingUseContrastCorrectedBlending ? srgb2rgb(texture(samp, U, 99.)) : vec4(0.); 27 | 28 | vec3 F = vec3(fract(V), 0), W; 29 | F.z = 1. - F.x - F.y; 30 | vec4 fragColor = vec4(0.); 31 | 32 | if (F.z > 0.) { 33 | W = vec3(F.z, F.y, F.x); 34 | W = pow(W, vec3(hexTilingTextureSampleCoefficientExponent)); 35 | W = W / dot(W, vec3(1.)); 36 | 37 | if (W.x > hexTilingLookupSkipThreshold) { 38 | fragColor += C(I) * W.x; 39 | } 40 | if (W.y > hexTilingLookupSkipThreshold) { 41 | fragColor += C(I + vec2(0, 1)) * W.y; 42 | } 43 | if (W.z > hexTilingLookupSkipThreshold) { 44 | fragColor += C(I + vec2(1, 0)) * W.z; 45 | } 46 | } else { 47 | W = vec3(-F.z, 1. - F.y, 1. - F.x); 48 | W = pow(W, vec3(hexTilingTextureSampleCoefficientExponent)); 49 | W = W / dot(W, vec3(1.)); 50 | 51 | if (W.x > hexTilingLookupSkipThreshold) { 52 | fragColor += C(I + 1.) * W.x; 53 | } 54 | if (W.y > hexTilingLookupSkipThreshold) { 55 | fragColor += C(I + vec2(1, 0)) * W.y; 56 | } 57 | if (W.z > hexTilingLookupSkipThreshold) { 58 | fragColor += C(I + vec2(0, 1)) * W.z; 59 | } 60 | } 61 | 62 | fragColor = hexTilingUseContrastCorrectedBlending ? meanColor + fragColor / length(W) : fragColor; 63 | 64 | fragColor = clamp(rgb2srgb(fragColor), 0., 1.); 65 | 66 | return fragColor; 67 | } 68 | -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | 16 | /* Linting */ 17 | "strict": true, 18 | "noUnusedLocals": true, 19 | "noUnusedParameters": true, 20 | "noFallthroughCasesInSwitch": true 21 | }, 22 | "include": ["src"] 23 | } 24 | -------------------------------------------------------------------------------- /vite.config.demo.js: -------------------------------------------------------------------------------- 1 | import { resolve } from "path"; 2 | import { defineConfig } from "vite"; 3 | import glsl from "vite-plugin-glsl"; 4 | 5 | export default defineConfig({ 6 | plugins: [glsl({ compress: false })], 7 | build: { 8 | target: "chrome91", 9 | rollupOptions: { 10 | input: { 11 | main: resolve(__dirname, "index.html"), 12 | }, 13 | }, 14 | outDir: "demo/dist", 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { resolve } from "path"; 2 | import { defineConfig } from "vite"; 3 | import glsl from "vite-plugin-glsl"; 4 | import dts from "vite-plugin-dts"; 5 | 6 | export default defineConfig({ 7 | plugins: [glsl({ compress: false }), dts({ include: "src/index.ts" })], 8 | build: { 9 | copyPublicDir: false, 10 | lib: { 11 | entry: resolve(__dirname, "src/index.ts"), 12 | name: "three-hex-tiling", 13 | fileName: "index", 14 | }, 15 | rollupOptions: { 16 | // make sure to externalize deps that shouldn't be bundled into the library 17 | external: ["three"], 18 | output: { 19 | // Provide global variables to use in the UMD build for externalized deps 20 | globals: { 21 | three: "THREE", 22 | }, 23 | }, 24 | }, 25 | }, 26 | }); 27 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/helper-string-parser@^7.24.8": 6 | version "7.24.8" 7 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" 8 | integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== 9 | 10 | "@babel/helper-validator-identifier@^7.24.7": 11 | version "7.24.7" 12 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" 13 | integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== 14 | 15 | "@babel/parser@^7.24.7": 16 | version "7.25.6" 17 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.6.tgz#85660c5ef388cbbf6e3d2a694ee97a38f18afe2f" 18 | integrity sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q== 19 | dependencies: 20 | "@babel/types" "^7.25.6" 21 | 22 | "@babel/types@^7.25.6": 23 | version "7.25.6" 24 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.6.tgz#893942ddb858f32ae7a004ec9d3a76b3463ef8e6" 25 | integrity sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw== 26 | dependencies: 27 | "@babel/helper-string-parser" "^7.24.8" 28 | "@babel/helper-validator-identifier" "^7.24.7" 29 | to-fast-properties "^2.0.0" 30 | 31 | "@esbuild/aix-ppc64@0.21.5": 32 | version "0.21.5" 33 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 34 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 35 | 36 | "@esbuild/android-arm64@0.21.5": 37 | version "0.21.5" 38 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 39 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 40 | 41 | "@esbuild/android-arm@0.21.5": 42 | version "0.21.5" 43 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 44 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 45 | 46 | "@esbuild/android-x64@0.21.5": 47 | version "0.21.5" 48 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 49 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 50 | 51 | "@esbuild/darwin-arm64@0.21.5": 52 | version "0.21.5" 53 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 54 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 55 | 56 | "@esbuild/darwin-x64@0.21.5": 57 | version "0.21.5" 58 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 59 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 60 | 61 | "@esbuild/freebsd-arm64@0.21.5": 62 | version "0.21.5" 63 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 64 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 65 | 66 | "@esbuild/freebsd-x64@0.21.5": 67 | version "0.21.5" 68 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 69 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 70 | 71 | "@esbuild/linux-arm64@0.21.5": 72 | version "0.21.5" 73 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 74 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 75 | 76 | "@esbuild/linux-arm@0.21.5": 77 | version "0.21.5" 78 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 79 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 80 | 81 | "@esbuild/linux-ia32@0.21.5": 82 | version "0.21.5" 83 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 84 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 85 | 86 | "@esbuild/linux-loong64@0.21.5": 87 | version "0.21.5" 88 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 89 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 90 | 91 | "@esbuild/linux-mips64el@0.21.5": 92 | version "0.21.5" 93 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 94 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 95 | 96 | "@esbuild/linux-ppc64@0.21.5": 97 | version "0.21.5" 98 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 99 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 100 | 101 | "@esbuild/linux-riscv64@0.21.5": 102 | version "0.21.5" 103 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 104 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 105 | 106 | "@esbuild/linux-s390x@0.21.5": 107 | version "0.21.5" 108 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 109 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 110 | 111 | "@esbuild/linux-x64@0.21.5": 112 | version "0.21.5" 113 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 114 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 115 | 116 | "@esbuild/netbsd-x64@0.21.5": 117 | version "0.21.5" 118 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 119 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 120 | 121 | "@esbuild/openbsd-x64@0.21.5": 122 | version "0.21.5" 123 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 124 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 125 | 126 | "@esbuild/sunos-x64@0.21.5": 127 | version "0.21.5" 128 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 129 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 130 | 131 | "@esbuild/win32-arm64@0.21.5": 132 | version "0.21.5" 133 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 134 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 135 | 136 | "@esbuild/win32-ia32@0.21.5": 137 | version "0.21.5" 138 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 139 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 140 | 141 | "@esbuild/win32-x64@0.21.5": 142 | version "0.21.5" 143 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 144 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 145 | 146 | "@jridgewell/sourcemap-codec@^1.5.0": 147 | version "1.5.0" 148 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 149 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 150 | 151 | "@microsoft/api-extractor-model@7.29.4": 152 | version "7.29.4" 153 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.29.4.tgz#098f94f304db98f3cea8618fd1107946e212eaf5" 154 | integrity sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw== 155 | dependencies: 156 | "@microsoft/tsdoc" "~0.15.0" 157 | "@microsoft/tsdoc-config" "~0.17.0" 158 | "@rushstack/node-core-library" "5.5.1" 159 | 160 | "@microsoft/api-extractor@7.47.4": 161 | version "7.47.4" 162 | resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.47.4.tgz#1a66dc9d6f316fe86eef336e7f8004ab9222499b" 163 | integrity sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg== 164 | dependencies: 165 | "@microsoft/api-extractor-model" "7.29.4" 166 | "@microsoft/tsdoc" "~0.15.0" 167 | "@microsoft/tsdoc-config" "~0.17.0" 168 | "@rushstack/node-core-library" "5.5.1" 169 | "@rushstack/rig-package" "0.5.3" 170 | "@rushstack/terminal" "0.13.3" 171 | "@rushstack/ts-command-line" "4.22.3" 172 | lodash "~4.17.15" 173 | minimatch "~3.0.3" 174 | resolve "~1.22.1" 175 | semver "~7.5.4" 176 | source-map "~0.6.1" 177 | typescript "5.4.2" 178 | 179 | "@microsoft/tsdoc-config@~0.17.0": 180 | version "0.17.0" 181 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz#82605152b3c1d3f5cd4a11697bc298437484d55d" 182 | integrity sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg== 183 | dependencies: 184 | "@microsoft/tsdoc" "0.15.0" 185 | ajv "~8.12.0" 186 | jju "~1.4.0" 187 | resolve "~1.22.2" 188 | 189 | "@microsoft/tsdoc@0.15.0", "@microsoft/tsdoc@~0.15.0": 190 | version "0.15.0" 191 | resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz#f29a55df17cb6e87cfbabce33ff6a14a9f85076d" 192 | integrity sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA== 193 | 194 | "@rollup/pluginutils@^5.1.0": 195 | version "5.1.0" 196 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.0.tgz#7e53eddc8c7f483a4ad0b94afb1f7f5fd3c771e0" 197 | integrity sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g== 198 | dependencies: 199 | "@types/estree" "^1.0.0" 200 | estree-walker "^2.0.2" 201 | picomatch "^2.3.1" 202 | 203 | "@rollup/rollup-android-arm-eabi@4.21.2": 204 | version "4.21.2" 205 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.2.tgz#0412834dc423d1ff7be4cb1fc13a86a0cd262c11" 206 | integrity sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg== 207 | 208 | "@rollup/rollup-android-arm64@4.21.2": 209 | version "4.21.2" 210 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.2.tgz#baf1a014b13654f3b9e835388df9caf8c35389cb" 211 | integrity sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA== 212 | 213 | "@rollup/rollup-darwin-arm64@4.21.2": 214 | version "4.21.2" 215 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.2.tgz#0a2c364e775acdf1172fe3327662eec7c46e55b1" 216 | integrity sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q== 217 | 218 | "@rollup/rollup-darwin-x64@4.21.2": 219 | version "4.21.2" 220 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.2.tgz#a972db75890dfab8df0da228c28993220a468c42" 221 | integrity sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w== 222 | 223 | "@rollup/rollup-linux-arm-gnueabihf@4.21.2": 224 | version "4.21.2" 225 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.2.tgz#1609d0630ef61109dd19a278353e5176d92e30a1" 226 | integrity sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w== 227 | 228 | "@rollup/rollup-linux-arm-musleabihf@4.21.2": 229 | version "4.21.2" 230 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.2.tgz#3c1dca5f160aa2e79e4b20ff6395eab21804f266" 231 | integrity sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w== 232 | 233 | "@rollup/rollup-linux-arm64-gnu@4.21.2": 234 | version "4.21.2" 235 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.2.tgz#c2fe376e8b04eafb52a286668a8df7c761470ac7" 236 | integrity sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw== 237 | 238 | "@rollup/rollup-linux-arm64-musl@4.21.2": 239 | version "4.21.2" 240 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.2.tgz#e62a4235f01e0f66dbba587c087ca6db8008ec80" 241 | integrity sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w== 242 | 243 | "@rollup/rollup-linux-powerpc64le-gnu@4.21.2": 244 | version "4.21.2" 245 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.2.tgz#24b3457e75ee9ae5b1c198bd39eea53222a74e54" 246 | integrity sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ== 247 | 248 | "@rollup/rollup-linux-riscv64-gnu@4.21.2": 249 | version "4.21.2" 250 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.2.tgz#38edfba9620fe2ca8116c97e02bd9f2d606bde09" 251 | integrity sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg== 252 | 253 | "@rollup/rollup-linux-s390x-gnu@4.21.2": 254 | version "4.21.2" 255 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.2.tgz#a3bfb8bc5f1e802f8c76cff4a4be2e9f9ac36a18" 256 | integrity sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ== 257 | 258 | "@rollup/rollup-linux-x64-gnu@4.21.2": 259 | version "4.21.2" 260 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.2.tgz#0dadf34be9199fcdda44b5985a086326344f30ad" 261 | integrity sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw== 262 | 263 | "@rollup/rollup-linux-x64-musl@4.21.2": 264 | version "4.21.2" 265 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.2.tgz#7b7deddce240400eb87f2406a445061b4fed99a8" 266 | integrity sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg== 267 | 268 | "@rollup/rollup-win32-arm64-msvc@4.21.2": 269 | version "4.21.2" 270 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.2.tgz#a0ca0c5149c2cfb26fab32e6ba3f16996fbdb504" 271 | integrity sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ== 272 | 273 | "@rollup/rollup-win32-ia32-msvc@4.21.2": 274 | version "4.21.2" 275 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.2.tgz#aae2886beec3024203dbb5569db3a137bc385f8e" 276 | integrity sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw== 277 | 278 | "@rollup/rollup-win32-x64-msvc@4.21.2": 279 | version "4.21.2" 280 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.2.tgz#e4291e3c1bc637083f87936c333cdbcad22af63b" 281 | integrity sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA== 282 | 283 | "@rushstack/node-core-library@5.5.1": 284 | version "5.5.1" 285 | resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.5.1.tgz#890db37eafaab582c79eb6bf421447b82b3a964b" 286 | integrity sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g== 287 | dependencies: 288 | ajv "~8.13.0" 289 | ajv-draft-04 "~1.0.0" 290 | ajv-formats "~3.0.1" 291 | fs-extra "~7.0.1" 292 | import-lazy "~4.0.0" 293 | jju "~1.4.0" 294 | resolve "~1.22.1" 295 | semver "~7.5.4" 296 | 297 | "@rushstack/rig-package@0.5.3": 298 | version "0.5.3" 299 | resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.5.3.tgz#ea4d8a3458540b1295500149c04e645f23134e5d" 300 | integrity sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow== 301 | dependencies: 302 | resolve "~1.22.1" 303 | strip-json-comments "~3.1.1" 304 | 305 | "@rushstack/terminal@0.13.3": 306 | version "0.13.3" 307 | resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.13.3.tgz#9a05b8cf759f14161a49d3ccb09d556e4161caca" 308 | integrity sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ== 309 | dependencies: 310 | "@rushstack/node-core-library" "5.5.1" 311 | supports-color "~8.1.1" 312 | 313 | "@rushstack/ts-command-line@4.22.3": 314 | version "4.22.3" 315 | resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.22.3.tgz#dcc75bd25b21031b32b2758ee3f2f4973b112572" 316 | integrity sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA== 317 | dependencies: 318 | "@rushstack/terminal" "0.13.3" 319 | "@types/argparse" "1.0.38" 320 | argparse "~1.0.9" 321 | string-argv "~0.3.1" 322 | 323 | "@tweenjs/tween.js@~23.1.3": 324 | version "23.1.3" 325 | resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz#eff0245735c04a928bb19c026b58c2a56460539d" 326 | integrity sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA== 327 | 328 | "@types/argparse@1.0.38": 329 | version "1.0.38" 330 | resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" 331 | integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== 332 | 333 | "@types/estree@1.0.5": 334 | version "1.0.5" 335 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 336 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 337 | 338 | "@types/estree@^1.0.0": 339 | version "1.0.1" 340 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" 341 | integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== 342 | 343 | "@types/stats.js@*": 344 | version "0.17.0" 345 | resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.0.tgz#0ed81d48e03b590c24da85540c1d952077a9fe20" 346 | integrity sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w== 347 | 348 | "@types/three@^0.173.0": 349 | version "0.173.0" 350 | resolved "https://registry.yarnpkg.com/@types/three/-/three-0.173.0.tgz#527a9d13b963cf98bf2789b9a771fca0c98554a3" 351 | integrity sha512-KtNjfI/CRB6JVKIVeZM1R3GYDX2wkoV2itNcQu2j4d7qkhjGOuB+s2oF6jl9mztycDLGMtrAnJQYxInC8Bb20A== 352 | dependencies: 353 | "@tweenjs/tween.js" "~23.1.3" 354 | "@types/stats.js" "*" 355 | "@types/webxr" "*" 356 | "@webgpu/types" "*" 357 | fflate "~0.8.2" 358 | meshoptimizer "~0.18.1" 359 | 360 | "@types/webxr@*": 361 | version "0.5.2" 362 | resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f" 363 | integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== 364 | 365 | "@volar/language-core@2.4.1", "@volar/language-core@~2.4.0-alpha.18": 366 | version "2.4.1" 367 | resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.1.tgz#267984b2b06908b78f1c016392fc75b75516595b" 368 | integrity sha512-9AKhC7Qn2mQYxj7Dz3bVxeOk7gGJladhWixUYKef/o0o7Bm4an+A3XvmcTHVqZ8stE6lBVH++g050tBtJ4TZPQ== 369 | dependencies: 370 | "@volar/source-map" "2.4.1" 371 | 372 | "@volar/source-map@2.4.1": 373 | version "2.4.1" 374 | resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.1.tgz#6a6d02b9dac66a5dd99378dcdae63107a0b45fce" 375 | integrity sha512-Xq6ep3OZg9xUqN90jEgB9ztX5SsTz1yiV8wiQbcYNjWkek+Ie3dc8l7AVt3EhDm9mSIR58oWczHkzM2H6HIsmQ== 376 | 377 | "@volar/typescript@^2.3.4", "@volar/typescript@~2.4.0-alpha.18": 378 | version "2.4.1" 379 | resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.1.tgz#6285f29b36c58769ccc14153f329d11e89ee13bc" 380 | integrity sha512-UoRzC0PXcwajFQTu8XxKSYNsWNBtVja6Y9gC8eLv7kYm+UEKJCcZ8g7dialsOYA0HKs3Vpg57MeCsawFLC6m9Q== 381 | dependencies: 382 | "@volar/language-core" "2.4.1" 383 | path-browserify "^1.0.1" 384 | vscode-uri "^3.0.8" 385 | 386 | "@vue/compiler-core@3.4.38": 387 | version "3.4.38" 388 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.38.tgz#326dfe3c92fa2b0f1dc9b39a948a231980253496" 389 | integrity sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A== 390 | dependencies: 391 | "@babel/parser" "^7.24.7" 392 | "@vue/shared" "3.4.38" 393 | entities "^4.5.0" 394 | estree-walker "^2.0.2" 395 | source-map-js "^1.2.0" 396 | 397 | "@vue/compiler-dom@^3.4.0": 398 | version "3.4.38" 399 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.38.tgz#90348fac1130e0bbd408b650635cb626b3b9df06" 400 | integrity sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ== 401 | dependencies: 402 | "@vue/compiler-core" "3.4.38" 403 | "@vue/shared" "3.4.38" 404 | 405 | "@vue/compiler-vue2@^2.7.16": 406 | version "2.7.16" 407 | resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249" 408 | integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A== 409 | dependencies: 410 | de-indent "^1.0.2" 411 | he "^1.2.0" 412 | 413 | "@vue/language-core@2.0.29": 414 | version "2.0.29" 415 | resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.0.29.tgz#19462d786cd7a1c21dbe575b46970a57094e0357" 416 | integrity sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ== 417 | dependencies: 418 | "@volar/language-core" "~2.4.0-alpha.18" 419 | "@vue/compiler-dom" "^3.4.0" 420 | "@vue/compiler-vue2" "^2.7.16" 421 | "@vue/shared" "^3.4.0" 422 | computeds "^0.0.1" 423 | minimatch "^9.0.3" 424 | muggle-string "^0.4.1" 425 | path-browserify "^1.0.1" 426 | 427 | "@vue/shared@3.4.38", "@vue/shared@^3.4.0": 428 | version "3.4.38" 429 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.38.tgz#552a6770098bfd556fa3e2c686c9d3b4f4cd94c2" 430 | integrity sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw== 431 | 432 | "@webgpu/types@*": 433 | version "0.1.44" 434 | resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.44.tgz#1b264c0bfcb298df59d0943dad8ef02b4ff98d14" 435 | integrity sha512-JDpYJN5E/asw84LTYhKyvPpxGnD+bAKPtpW9Ilurf7cZpxaTbxkQcGwOd7jgB9BPBrTYQ+32ufo4HiuomTjHNQ== 436 | 437 | acorn@^8.11.3: 438 | version "8.12.1" 439 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.1.tgz#71616bdccbe25e27a54439e0046e89ca76df2248" 440 | integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== 441 | 442 | ajv-draft-04@~1.0.0: 443 | version "1.0.0" 444 | resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8" 445 | integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw== 446 | 447 | ajv-formats@~3.0.1: 448 | version "3.0.1" 449 | resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" 450 | integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== 451 | dependencies: 452 | ajv "^8.0.0" 453 | 454 | ajv@^8.0.0: 455 | version "8.17.1" 456 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" 457 | integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== 458 | dependencies: 459 | fast-deep-equal "^3.1.3" 460 | fast-uri "^3.0.1" 461 | json-schema-traverse "^1.0.0" 462 | require-from-string "^2.0.2" 463 | 464 | ajv@~8.12.0: 465 | version "8.12.0" 466 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" 467 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 468 | dependencies: 469 | fast-deep-equal "^3.1.1" 470 | json-schema-traverse "^1.0.0" 471 | require-from-string "^2.0.2" 472 | uri-js "^4.2.2" 473 | 474 | ajv@~8.13.0: 475 | version "8.13.0" 476 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" 477 | integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== 478 | dependencies: 479 | fast-deep-equal "^3.1.3" 480 | json-schema-traverse "^1.0.0" 481 | require-from-string "^2.0.2" 482 | uri-js "^4.4.1" 483 | 484 | argparse@~1.0.9: 485 | version "1.0.10" 486 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 487 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 488 | dependencies: 489 | sprintf-js "~1.0.2" 490 | 491 | balanced-match@^1.0.0: 492 | version "1.0.2" 493 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 494 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 495 | 496 | brace-expansion@^1.1.7: 497 | version "1.1.11" 498 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 499 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 500 | dependencies: 501 | balanced-match "^1.0.0" 502 | concat-map "0.0.1" 503 | 504 | brace-expansion@^2.0.1: 505 | version "2.0.1" 506 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 507 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 508 | dependencies: 509 | balanced-match "^1.0.0" 510 | 511 | compare-versions@^6.1.1: 512 | version "6.1.1" 513 | resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9" 514 | integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg== 515 | 516 | computeds@^0.0.1: 517 | version "0.0.1" 518 | resolved "https://registry.yarnpkg.com/computeds/-/computeds-0.0.1.tgz#215b08a4ba3e08a11ff6eee5d6d8d7166a97ce2e" 519 | integrity sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q== 520 | 521 | concat-map@0.0.1: 522 | version "0.0.1" 523 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 524 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 525 | 526 | confbox@^0.1.7: 527 | version "0.1.7" 528 | resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" 529 | integrity sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== 530 | 531 | de-indent@^1.0.2: 532 | version "1.0.2" 533 | resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" 534 | integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== 535 | 536 | debug@^4.3.6: 537 | version "4.3.6" 538 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" 539 | integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== 540 | dependencies: 541 | ms "2.1.2" 542 | 543 | entities@^4.5.0: 544 | version "4.5.0" 545 | resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" 546 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 547 | 548 | esbuild@^0.21.3: 549 | version "0.21.5" 550 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 551 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 552 | optionalDependencies: 553 | "@esbuild/aix-ppc64" "0.21.5" 554 | "@esbuild/android-arm" "0.21.5" 555 | "@esbuild/android-arm64" "0.21.5" 556 | "@esbuild/android-x64" "0.21.5" 557 | "@esbuild/darwin-arm64" "0.21.5" 558 | "@esbuild/darwin-x64" "0.21.5" 559 | "@esbuild/freebsd-arm64" "0.21.5" 560 | "@esbuild/freebsd-x64" "0.21.5" 561 | "@esbuild/linux-arm" "0.21.5" 562 | "@esbuild/linux-arm64" "0.21.5" 563 | "@esbuild/linux-ia32" "0.21.5" 564 | "@esbuild/linux-loong64" "0.21.5" 565 | "@esbuild/linux-mips64el" "0.21.5" 566 | "@esbuild/linux-ppc64" "0.21.5" 567 | "@esbuild/linux-riscv64" "0.21.5" 568 | "@esbuild/linux-s390x" "0.21.5" 569 | "@esbuild/linux-x64" "0.21.5" 570 | "@esbuild/netbsd-x64" "0.21.5" 571 | "@esbuild/openbsd-x64" "0.21.5" 572 | "@esbuild/sunos-x64" "0.21.5" 573 | "@esbuild/win32-arm64" "0.21.5" 574 | "@esbuild/win32-ia32" "0.21.5" 575 | "@esbuild/win32-x64" "0.21.5" 576 | 577 | estree-walker@^2.0.2: 578 | version "2.0.2" 579 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 580 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 581 | 582 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 583 | version "3.1.3" 584 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 585 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 586 | 587 | fast-uri@^3.0.1: 588 | version "3.0.1" 589 | resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" 590 | integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== 591 | 592 | fflate@~0.8.2: 593 | version "0.8.2" 594 | resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" 595 | integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== 596 | 597 | fs-extra@~7.0.1: 598 | version "7.0.1" 599 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" 600 | integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== 601 | dependencies: 602 | graceful-fs "^4.1.2" 603 | jsonfile "^4.0.0" 604 | universalify "^0.1.0" 605 | 606 | fsevents@~2.3.2: 607 | version "2.3.2" 608 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 609 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 610 | 611 | fsevents@~2.3.3: 612 | version "2.3.3" 613 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 614 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 615 | 616 | function-bind@^1.1.2: 617 | version "1.1.2" 618 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 619 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 620 | 621 | graceful-fs@^4.1.2, graceful-fs@^4.1.6: 622 | version "4.2.11" 623 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 624 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 625 | 626 | has-flag@^4.0.0: 627 | version "4.0.0" 628 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 629 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 630 | 631 | hasown@^2.0.0: 632 | version "2.0.0" 633 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" 634 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== 635 | dependencies: 636 | function-bind "^1.1.2" 637 | 638 | he@^1.2.0: 639 | version "1.2.0" 640 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 641 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 642 | 643 | import-lazy@~4.0.0: 644 | version "4.0.0" 645 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" 646 | integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== 647 | 648 | is-core-module@^2.13.0: 649 | version "2.13.1" 650 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" 651 | integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== 652 | dependencies: 653 | hasown "^2.0.0" 654 | 655 | jju@~1.4.0: 656 | version "1.4.0" 657 | resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" 658 | integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== 659 | 660 | json-schema-traverse@^1.0.0: 661 | version "1.0.0" 662 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" 663 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 664 | 665 | jsonfile@^4.0.0: 666 | version "4.0.0" 667 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 668 | integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== 669 | optionalDependencies: 670 | graceful-fs "^4.1.6" 671 | 672 | kolorist@^1.8.0: 673 | version "1.8.0" 674 | resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c" 675 | integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== 676 | 677 | lil-gui@^0.19.2: 678 | version "0.19.2" 679 | resolved "https://registry.yarnpkg.com/lil-gui/-/lil-gui-0.19.2.tgz#774bf46f1f43ec5fec00884af46b8060786f97fc" 680 | integrity sha512-nU8j4ND702ouGfQZoaTN4dfXxacvGOAVK0DtmZBVcUYUAeYQXLQAjAN50igMHiba3T5jZyKEjXZU+Ntm1Qs6ZQ== 681 | 682 | local-pkg@^0.5.0: 683 | version "0.5.0" 684 | resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" 685 | integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== 686 | dependencies: 687 | mlly "^1.4.2" 688 | pkg-types "^1.0.3" 689 | 690 | lodash@~4.17.15: 691 | version "4.17.21" 692 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 693 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 694 | 695 | lru-cache@^6.0.0: 696 | version "6.0.0" 697 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 698 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 699 | dependencies: 700 | yallist "^4.0.0" 701 | 702 | magic-string@^0.30.11: 703 | version "0.30.11" 704 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.11.tgz#301a6f93b3e8c2cb13ac1a7a673492c0dfd12954" 705 | integrity sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A== 706 | dependencies: 707 | "@jridgewell/sourcemap-codec" "^1.5.0" 708 | 709 | meshoptimizer@~0.18.1: 710 | version "0.18.1" 711 | resolved "https://registry.yarnpkg.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz#cdb90907f30a7b5b1190facd3b7ee6b7087797d8" 712 | integrity sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw== 713 | 714 | minimatch@^9.0.3: 715 | version "9.0.3" 716 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 717 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 718 | dependencies: 719 | brace-expansion "^2.0.1" 720 | 721 | minimatch@~3.0.3: 722 | version "3.0.8" 723 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1" 724 | integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== 725 | dependencies: 726 | brace-expansion "^1.1.7" 727 | 728 | mlly@^1.4.2, mlly@^1.7.1: 729 | version "1.7.1" 730 | resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.7.1.tgz#e0336429bb0731b6a8e887b438cbdae522c8f32f" 731 | integrity sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== 732 | dependencies: 733 | acorn "^8.11.3" 734 | pathe "^1.1.2" 735 | pkg-types "^1.1.1" 736 | ufo "^1.5.3" 737 | 738 | ms@2.1.2: 739 | version "2.1.2" 740 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 741 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 742 | 743 | muggle-string@^0.4.1: 744 | version "0.4.1" 745 | resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" 746 | integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ== 747 | 748 | nanoid@^3.3.7: 749 | version "3.3.7" 750 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 751 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 752 | 753 | path-browserify@^1.0.1: 754 | version "1.0.1" 755 | resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" 756 | integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== 757 | 758 | path-parse@^1.0.7: 759 | version "1.0.7" 760 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 761 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 762 | 763 | pathe@^1.1.2: 764 | version "1.1.2" 765 | resolved "https://registry.yarnpkg.com/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" 766 | integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== 767 | 768 | picocolors@^1.0.1: 769 | version "1.0.1" 770 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" 771 | integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== 772 | 773 | picomatch@^2.3.1: 774 | version "2.3.1" 775 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 776 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 777 | 778 | pkg-types@^1.0.3, pkg-types@^1.1.1: 779 | version "1.2.0" 780 | resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.2.0.tgz#d0268e894e93acff11a6279de147e83354ebd42d" 781 | integrity sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA== 782 | dependencies: 783 | confbox "^0.1.7" 784 | mlly "^1.7.1" 785 | pathe "^1.1.2" 786 | 787 | postcss@^8.4.41: 788 | version "8.4.41" 789 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.41.tgz#d6104d3ba272d882fe18fc07d15dc2da62fa2681" 790 | integrity sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ== 791 | dependencies: 792 | nanoid "^3.3.7" 793 | picocolors "^1.0.1" 794 | source-map-js "^1.2.0" 795 | 796 | punycode@^2.1.0: 797 | version "2.3.1" 798 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 799 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 800 | 801 | require-from-string@^2.0.2: 802 | version "2.0.2" 803 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" 804 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 805 | 806 | resolve@~1.22.1, resolve@~1.22.2: 807 | version "1.22.8" 808 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" 809 | integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== 810 | dependencies: 811 | is-core-module "^2.13.0" 812 | path-parse "^1.0.7" 813 | supports-preserve-symlinks-flag "^1.0.0" 814 | 815 | rollup@^4.20.0: 816 | version "4.21.2" 817 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.21.2.tgz#f41f277a448d6264e923dd1ea179f0a926aaf9b7" 818 | integrity sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw== 819 | dependencies: 820 | "@types/estree" "1.0.5" 821 | optionalDependencies: 822 | "@rollup/rollup-android-arm-eabi" "4.21.2" 823 | "@rollup/rollup-android-arm64" "4.21.2" 824 | "@rollup/rollup-darwin-arm64" "4.21.2" 825 | "@rollup/rollup-darwin-x64" "4.21.2" 826 | "@rollup/rollup-linux-arm-gnueabihf" "4.21.2" 827 | "@rollup/rollup-linux-arm-musleabihf" "4.21.2" 828 | "@rollup/rollup-linux-arm64-gnu" "4.21.2" 829 | "@rollup/rollup-linux-arm64-musl" "4.21.2" 830 | "@rollup/rollup-linux-powerpc64le-gnu" "4.21.2" 831 | "@rollup/rollup-linux-riscv64-gnu" "4.21.2" 832 | "@rollup/rollup-linux-s390x-gnu" "4.21.2" 833 | "@rollup/rollup-linux-x64-gnu" "4.21.2" 834 | "@rollup/rollup-linux-x64-musl" "4.21.2" 835 | "@rollup/rollup-win32-arm64-msvc" "4.21.2" 836 | "@rollup/rollup-win32-ia32-msvc" "4.21.2" 837 | "@rollup/rollup-win32-x64-msvc" "4.21.2" 838 | fsevents "~2.3.2" 839 | 840 | semver@^7.5.4, semver@~7.5.4: 841 | version "7.5.4" 842 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" 843 | integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== 844 | dependencies: 845 | lru-cache "^6.0.0" 846 | 847 | source-map-js@^1.2.0: 848 | version "1.2.0" 849 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" 850 | integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== 851 | 852 | source-map@~0.6.1: 853 | version "0.6.1" 854 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 855 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 856 | 857 | sprintf-js@~1.0.2: 858 | version "1.0.3" 859 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 860 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 861 | 862 | string-argv@~0.3.1: 863 | version "0.3.2" 864 | resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" 865 | integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== 866 | 867 | strip-json-comments@~3.1.1: 868 | version "3.1.1" 869 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 870 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 871 | 872 | supports-color@~8.1.1: 873 | version "8.1.1" 874 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 875 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 876 | dependencies: 877 | has-flag "^4.0.0" 878 | 879 | supports-preserve-symlinks-flag@^1.0.0: 880 | version "1.0.0" 881 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 882 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 883 | 884 | three@^0.173.0: 885 | version "0.173.0" 886 | resolved "https://registry.yarnpkg.com/three/-/three-0.173.0.tgz#e82989961cd2db05768540458c81b29f565be921" 887 | integrity sha512-AUwVmViIEUgBwxJJ7stnF0NkPpZxx1aZ6WiAbQ/Qq61h6I9UR4grXtZDmO8mnlaNORhHnIBlXJ1uBxILEKuVyw== 888 | 889 | to-fast-properties@^2.0.0: 890 | version "2.0.0" 891 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 892 | integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== 893 | 894 | typescript@5.4.2: 895 | version "5.4.2" 896 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" 897 | integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== 898 | 899 | typescript@^5.5.4: 900 | version "5.5.4" 901 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" 902 | integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== 903 | 904 | ufo@^1.5.3: 905 | version "1.5.4" 906 | resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.5.4.tgz#16d6949674ca0c9e0fbbae1fa20a71d7b1ded754" 907 | integrity sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ== 908 | 909 | universalify@^0.1.0: 910 | version "0.1.2" 911 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" 912 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 913 | 914 | uri-js@^4.2.2, uri-js@^4.4.1: 915 | version "4.4.1" 916 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 917 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 918 | dependencies: 919 | punycode "^2.1.0" 920 | 921 | vite-plugin-dts@^4.0.3: 922 | version "4.0.3" 923 | resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.0.3.tgz#0f452be5ea81a50fa27ade4e0f3a0d750873affc" 924 | integrity sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ== 925 | dependencies: 926 | "@microsoft/api-extractor" "7.47.4" 927 | "@rollup/pluginutils" "^5.1.0" 928 | "@volar/typescript" "^2.3.4" 929 | "@vue/language-core" "2.0.29" 930 | compare-versions "^6.1.1" 931 | debug "^4.3.6" 932 | kolorist "^1.8.0" 933 | local-pkg "^0.5.0" 934 | magic-string "^0.30.11" 935 | vue-tsc "2.0.29" 936 | 937 | vite-plugin-glsl@^1.3.0: 938 | version "1.3.0" 939 | resolved "https://registry.yarnpkg.com/vite-plugin-glsl/-/vite-plugin-glsl-1.3.0.tgz#6138dc373afbd3891481b529779f76b3625c37ac" 940 | integrity sha512-SzEoLet9Bp5VSozjrhUiSc3xX1+u7rCTjXAsq4qWM3u8UjilI76A9ucX/T+CRGQCe25j50GSY+9mKSGUVPET1w== 941 | dependencies: 942 | "@rollup/pluginutils" "^5.1.0" 943 | 944 | vite@^5.4.2: 945 | version "5.4.2" 946 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.2.tgz#8acb6ec4bfab823cdfc1cb2d6c53ed311bc4e47e" 947 | integrity sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA== 948 | dependencies: 949 | esbuild "^0.21.3" 950 | postcss "^8.4.41" 951 | rollup "^4.20.0" 952 | optionalDependencies: 953 | fsevents "~2.3.3" 954 | 955 | vscode-uri@^3.0.8: 956 | version "3.0.8" 957 | resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.8.tgz#1770938d3e72588659a172d0fd4642780083ff9f" 958 | integrity sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw== 959 | 960 | vue-tsc@2.0.29: 961 | version "2.0.29" 962 | resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-2.0.29.tgz#bf7e9605af9fadec7fd6037d242217f5c6ad2c3b" 963 | integrity sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q== 964 | dependencies: 965 | "@volar/typescript" "~2.4.0-alpha.18" 966 | "@vue/language-core" "2.0.29" 967 | semver "^7.5.4" 968 | 969 | yallist@^4.0.0: 970 | version "4.0.0" 971 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 972 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 973 | --------------------------------------------------------------------------------