diff --git a/build/three.cjs b/build/three.cjs index c333bef3549a80..06803e0f328e58 100644 --- a/build/three.cjs +++ b/build/three.cjs @@ -1755,6 +1755,26 @@ const Compatibility = { * @property {string} EITHER - Flat interpolation using either vertex. */ +/** + * Finds the minimum value in an array. + * + * @private + * @param {Array} array - The array to search for the minimum value. + * @return {number} The minimum value in the array, or Infinity if the array is empty. + */ + +/** + * Checks if an array contains values that require Uint32 representation. + * + * This function determines whether the array contains any values >= 65535, + * which would require a Uint32Array rather than a Uint16Array for proper storage. + * The function iterates from the end of the array, assuming larger values are + * typically located at the end. + * + * @private + * @param {Array} array - The array to check. + * @return {boolean} True if the array contains values >= 65535, false otherwise. + */ function arrayNeedsUint32( array ) { // assumes larger values usually on last @@ -1769,6 +1789,14 @@ function arrayNeedsUint32( array ) { } +/** + * Map of typed array constructor names to their constructors. + * This mapping enables dynamic creation of typed arrays based on string type names. + * + * @private + * @constant + * @type {Object} + */ const TYPED_ARRAYS = { Int8Array: Int8Array, Uint8Array: Uint8Array, @@ -1781,6 +1809,14 @@ const TYPED_ARRAYS = { Float64Array: Float64Array }; +/** + * Creates a typed array of the specified type from the given buffer. + * + * @private + * @param {string} type - The name of the typed array type (e.g., 'Float32Array', 'Uint16Array'). + * @param {ArrayBuffer} buffer - The buffer to create the typed array from. + * @return {TypedArray} A new typed array of the specified type. + */ function getTypedArray( type, buffer ) { return new TYPED_ARRAYS[ type ]( buffer ); @@ -1799,12 +1835,31 @@ function isTypedArray( array ) { } +/** + * Creates an XHTML element with the specified tag name. + * + * This function uses the XHTML namespace to create DOM elements, + * ensuring proper element creation in XML-based contexts. + * + * @private + * @param {string} name - The tag name of the element to create (e.g., 'canvas', 'div'). + * @return {HTMLElement} The created XHTML element. + */ function createElementNS( name ) { return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); } +/** + * Creates a canvas element configured for block display. + * + * This is a convenience function that creates a canvas element with + * display style set to 'block', which is commonly used in three.js + * rendering contexts to avoid inline element spacing issues. + * + * @return {HTMLCanvasElement} A canvas element with display set to 'block'. + */ function createCanvasElement() { const canvas = createElementNS( 'canvas' ); @@ -1813,22 +1868,59 @@ function createCanvasElement() { } +/** + * Internal cache for tracking warning messages to prevent duplicate warnings. + * + * @private + * @type {Object} + */ const _cache = {}; +/** + * Custom console function handler for intercepting log, warn, and error calls. + * + * @private + * @type {Function|null} + */ let _setConsoleFunction = null; +/** + * Sets a custom function to handle console output. + * + * This allows external code to intercept and handle console.log, console.warn, + * and console.error calls made by three.js, which is useful for custom logging, + * testing, or debugging workflows. + * + * @param {Function} fn - The function to handle console output. Should accept + * (type, message, ...params) where type is 'log', 'warn', or 'error'. + */ function setConsoleFunction( fn ) { _setConsoleFunction = fn; } +/** + * Gets the currently set custom console function. + * + * @return {Function|null} The custom console function, or null if not set. + */ function getConsoleFunction() { return _setConsoleFunction; } +/** + * Logs an informational message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.log. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function log( ...params ) { const message = 'THREE.' + params.shift(); @@ -1845,6 +1937,16 @@ function log( ...params ) { } +/** + * Logs a warning message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.warn. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function warn( ...params ) { const message = 'THREE.' + params.shift(); @@ -1861,6 +1963,16 @@ function warn( ...params ) { } +/** + * Logs an error message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.error. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function error( ...params ) { const message = 'THREE.' + params.shift(); @@ -1877,6 +1989,15 @@ function error( ...params ) { } +/** + * Logs a warning message only once, preventing duplicate warnings. + * + * This function maintains an internal cache of warning messages and will only + * output each unique warning message once. Useful for warnings that may be + * triggered repeatedly but should only be shown to the user once. + * + * @param {...any} params - The warning message components. + */ function warnOnce( ...params ) { const message = params.join( ' ' ); @@ -1889,6 +2010,20 @@ function warnOnce( ...params ) { } +/** + * Asynchronously probes for WebGL sync object completion. + * + * This function creates a promise that resolves when the WebGL sync object + * signals completion or rejects if the sync operation fails. It uses polling + * at the specified interval to check the sync status without blocking the + * main thread. This is useful for GPU-CPU synchronization in WebGL contexts. + * + * @private + * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL rendering context. + * @param {WebGLSync} sync - The WebGL sync object to wait for. + * @param {number} interval - The polling interval in milliseconds. + * @return {Promise} A promise that resolves when the sync completes or rejects if it fails. + */ function probeAsync( gl, sync, interval ) { return new Promise( function ( resolve, reject ) { @@ -28083,12 +28218,10 @@ class BatchedMesh extends Mesh { nextVertexStart += geometryInfo.reservedVertexCount; geometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart; - // step the next geometry points to the shifted position - this._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0; - this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; - } + this._nextIndexStart = nextIndexStart; + this._nextVertexStart = nextVertexStart; this._visibilityChanged = true; return this; @@ -37468,8 +37601,10 @@ class TorusGeometry extends BufferGeometry { * @param {number} [radialSegments=12] - The number of radial segments. * @param {number} [tubularSegments=48] - The number of tubular segments. * @param {number} [arc=Math.PI*2] - Central angle in radians. + * @param {number} [thetaStart=0] - Start of the tubular sweep in radians. + * @param {number} [thetaLength=Math.PI*2] - Length of the tubular sweep in radians. */ - constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) { + constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI * 2 ) { super(); @@ -37487,7 +37622,9 @@ class TorusGeometry extends BufferGeometry { tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, - arc: arc + arc: arc, + thetaStart: thetaStart, + thetaLength: thetaLength, }; radialSegments = Math.floor( radialSegments ); @@ -37510,10 +37647,11 @@ class TorusGeometry extends BufferGeometry { for ( let j = 0; j <= radialSegments; j ++ ) { + const v = thetaStart + ( j / radialSegments ) * thetaLength; + for ( let i = 0; i <= tubularSegments; i ++ ) { const u = i / tubularSegments * arc; - const v = j / radialSegments * Math.PI * 2; // vertex @@ -59633,7 +59771,7 @@ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUG var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; -var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; @@ -68050,7 +68188,7 @@ function WebGLRenderStates( extensions ) { const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; -const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; const _cubeDirections = [ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), diff --git a/build/three.core.js b/build/three.core.js index e471e669e4d97e..17e2c72e88bc30 100644 --- a/build/three.core.js +++ b/build/three.core.js @@ -1753,6 +1753,26 @@ const Compatibility = { * @property {string} EITHER - Flat interpolation using either vertex. */ +/** + * Finds the minimum value in an array. + * + * @private + * @param {Array} array - The array to search for the minimum value. + * @return {number} The minimum value in the array, or Infinity if the array is empty. + */ + +/** + * Checks if an array contains values that require Uint32 representation. + * + * This function determines whether the array contains any values >= 65535, + * which would require a Uint32Array rather than a Uint16Array for proper storage. + * The function iterates from the end of the array, assuming larger values are + * typically located at the end. + * + * @private + * @param {Array} array - The array to check. + * @return {boolean} True if the array contains values >= 65535, false otherwise. + */ function arrayNeedsUint32( array ) { // assumes larger values usually on last @@ -1767,6 +1787,14 @@ function arrayNeedsUint32( array ) { } +/** + * Map of typed array constructor names to their constructors. + * This mapping enables dynamic creation of typed arrays based on string type names. + * + * @private + * @constant + * @type {Object} + */ const TYPED_ARRAYS = { Int8Array: Int8Array, Uint8Array: Uint8Array, @@ -1779,6 +1807,14 @@ const TYPED_ARRAYS = { Float64Array: Float64Array }; +/** + * Creates a typed array of the specified type from the given buffer. + * + * @private + * @param {string} type - The name of the typed array type (e.g., 'Float32Array', 'Uint16Array'). + * @param {ArrayBuffer} buffer - The buffer to create the typed array from. + * @return {TypedArray} A new typed array of the specified type. + */ function getTypedArray( type, buffer ) { return new TYPED_ARRAYS[ type ]( buffer ); @@ -1797,12 +1833,31 @@ function isTypedArray( array ) { } +/** + * Creates an XHTML element with the specified tag name. + * + * This function uses the XHTML namespace to create DOM elements, + * ensuring proper element creation in XML-based contexts. + * + * @private + * @param {string} name - The tag name of the element to create (e.g., 'canvas', 'div'). + * @return {HTMLElement} The created XHTML element. + */ function createElementNS( name ) { return document.createElementNS( 'http://www.w3.org/1999/xhtml', name ); } +/** + * Creates a canvas element configured for block display. + * + * This is a convenience function that creates a canvas element with + * display style set to 'block', which is commonly used in three.js + * rendering contexts to avoid inline element spacing issues. + * + * @return {HTMLCanvasElement} A canvas element with display set to 'block'. + */ function createCanvasElement() { const canvas = createElementNS( 'canvas' ); @@ -1811,22 +1866,59 @@ function createCanvasElement() { } +/** + * Internal cache for tracking warning messages to prevent duplicate warnings. + * + * @private + * @type {Object} + */ const _cache = {}; +/** + * Custom console function handler for intercepting log, warn, and error calls. + * + * @private + * @type {Function|null} + */ let _setConsoleFunction = null; +/** + * Sets a custom function to handle console output. + * + * This allows external code to intercept and handle console.log, console.warn, + * and console.error calls made by three.js, which is useful for custom logging, + * testing, or debugging workflows. + * + * @param {Function} fn - The function to handle console output. Should accept + * (type, message, ...params) where type is 'log', 'warn', or 'error'. + */ function setConsoleFunction( fn ) { _setConsoleFunction = fn; } +/** + * Gets the currently set custom console function. + * + * @return {Function|null} The custom console function, or null if not set. + */ function getConsoleFunction() { return _setConsoleFunction; } +/** + * Logs an informational message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.log. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function log( ...params ) { const message = 'THREE.' + params.shift(); @@ -1843,6 +1935,16 @@ function log( ...params ) { } +/** + * Logs a warning message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.warn. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function warn( ...params ) { const message = 'THREE.' + params.shift(); @@ -1859,6 +1961,16 @@ function warn( ...params ) { } +/** + * Logs an error message with the 'THREE.' prefix. + * + * If a custom console function is set via setConsoleFunction(), it will be used + * instead of the native console.error. The first parameter is treated as the + * method name and is automatically prefixed with 'THREE.'. + * + * @param {...any} params - The message components. The first param is used as + * the method name and prefixed with 'THREE.'. + */ function error( ...params ) { const message = 'THREE.' + params.shift(); @@ -1875,6 +1987,15 @@ function error( ...params ) { } +/** + * Logs a warning message only once, preventing duplicate warnings. + * + * This function maintains an internal cache of warning messages and will only + * output each unique warning message once. Useful for warnings that may be + * triggered repeatedly but should only be shown to the user once. + * + * @param {...any} params - The warning message components. + */ function warnOnce( ...params ) { const message = params.join( ' ' ); @@ -1887,6 +2008,20 @@ function warnOnce( ...params ) { } +/** + * Asynchronously probes for WebGL sync object completion. + * + * This function creates a promise that resolves when the WebGL sync object + * signals completion or rejects if the sync operation fails. It uses polling + * at the specified interval to check the sync status without blocking the + * main thread. This is useful for GPU-CPU synchronization in WebGL contexts. + * + * @private + * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL rendering context. + * @param {WebGLSync} sync - The WebGL sync object to wait for. + * @param {number} interval - The polling interval in milliseconds. + * @return {Promise} A promise that resolves when the sync completes or rejects if it fails. + */ function probeAsync( gl, sync, interval ) { return new Promise( function ( resolve, reject ) { @@ -28081,12 +28216,10 @@ class BatchedMesh extends Mesh { nextVertexStart += geometryInfo.reservedVertexCount; geometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart; - // step the next geometry points to the shifted position - this._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0; - this._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount; - } + this._nextIndexStart = nextIndexStart; + this._nextVertexStart = nextVertexStart; this._visibilityChanged = true; return this; @@ -37466,8 +37599,10 @@ class TorusGeometry extends BufferGeometry { * @param {number} [radialSegments=12] - The number of radial segments. * @param {number} [tubularSegments=48] - The number of tubular segments. * @param {number} [arc=Math.PI*2] - Central angle in radians. + * @param {number} [thetaStart=0] - Start of the tubular sweep in radians. + * @param {number} [thetaLength=Math.PI*2] - Length of the tubular sweep in radians. */ - constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) { + constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI * 2 ) { super(); @@ -37485,7 +37620,9 @@ class TorusGeometry extends BufferGeometry { tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, - arc: arc + arc: arc, + thetaStart: thetaStart, + thetaLength: thetaLength, }; radialSegments = Math.floor( radialSegments ); @@ -37508,10 +37645,11 @@ class TorusGeometry extends BufferGeometry { for ( let j = 0; j <= radialSegments; j ++ ) { + const v = thetaStart + ( j / radialSegments ) * thetaLength; + for ( let i = 0; i <= tubularSegments; i ++ ) { const u = i / tubularSegments * arc; - const v = j / radialSegments * Math.PI * 2; // vertex diff --git a/build/three.core.min.js b/build/three.core.min.js index 8ed4acbcd9a619..5da4f9958b2159 100644 --- a/build/three.core.min.js +++ b/build/three.core.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -const t="183dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,F=211,E=212,L=213,j=214,D=0,U=1,W=2,q=3,J=4,X=5,Y=6,Z=7,H=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Ft=1020,Et=35902,Lt=35899,jt=1021,Dt=1022,Ut=1023,Wt=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Zt=1031,Ht=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Fe=2301,Ee=2302,Le=2400,je=2401,De=2402,Ue=2500,We=2501,qe=0,Je=1,Xe=2,Ye=3200,Ze=3201,He=3202,Ge=3203,$e=0,Qe=1,Ke="",ti="srgb",ei="srgb-linear",ii="linear",si="srgb",ri="",ni="rg",ai="ga",oi=0,hi=7680,li=7681,ci=7682,ui=7683,di=34055,pi=34056,mi=5386,yi=512,gi=513,fi=514,xi=515,bi=516,vi=517,wi=518,Mi=519,Si=512,_i=513,Ai=514,Ti=515,zi=516,Ci=517,Ii=518,Bi=519,ki=35044,Oi=35048,Pi=35040,Ri=35045,Ni=35049,Vi=35041,Fi=35046,Ei=35050,Li=35042,ji="100",Di="300 es",Ui=2e3,Wi=2001,qi={COMPUTE:"compute",RENDER:"render"},Ji={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Xi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Yi={TEXTURE_COMPARE:"depthTextureCompare"};function Zi(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Hi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Hi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(...t){const e="THREE."+t.shift();es?es("warn",e,...t):console.warn(e,...t)}function as(...t){const e="THREE."+t.shift();es?es("error",e,...t):console.error(e,...t)}function os(...t){const e=t.join(" ");e in ts||(ts[e]=!0,ns(...t))}function hs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}class ls{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+cs[t>>16&255]+cs[t>>24&255]+"-"+cs[255&e]+cs[e>>8&255]+"-"+cs[e>>16&15|64]+cs[e>>24&255]+"-"+cs[63&i|128]+cs[i>>8&255]+"-"+cs[i>>16&255]+cs[i>>24&255]+cs[255&s]+cs[s>>8&255]+cs[s>>16&255]+cs[s>>24&255]).toLowerCase()}function ys(t,e,i){return Math.max(e,Math.min(i,t))}function gs(t,e){return(t%e+e)%e}function fs(t,e,i){return(1-i)*t+i*e}function xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function bs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const vs={DEG2RAD:ds,RAD2DEG:ps,generateUUID:ms,clamp:ys,euclideanModulo:gs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:fs,damp:function(t,e,i,s){return fs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(gs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(us=t);let e=us+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ds},radToDeg:function(t){return t*ps},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:ns("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:bs,denormalize:xs};class ws{constructor(t=0,e=0){ws.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ms{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:ns("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ys(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ss{constructor(t=0,e=0,i=0){Ss.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(As.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(As.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this.z=ys(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this.z=ys(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return _s.copy(this).projectOnVector(t),this.sub(_s)}reflect(t){return this.sub(_s.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _s=new Ss,As=new Ms;class Ts{constructor(t,e,i,s,r,n,a,o,h){Ts.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(zs.makeScale(t,e)),this}rotate(t){return this.premultiply(zs.makeRotation(-t)),this}translate(t,e){return this.premultiply(zs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const zs=new Ts,Cs=(new Ts).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Is=(new Ts).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Bs(){const t={enabled:!0,workingColorSpace:ei,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===si&&(t.r=Os(t.r),t.g=Os(t.g),t.b=Os(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===si&&(t.r=Ps(t.r),t.g=Ps(t.g),t.b=Ps(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?ii:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return os("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return os("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ei]:{primaries:e,whitePoint:s,transfer:ii,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ti},outputColorSpaceConfig:{drawingBufferColorSpace:ti}},[ti]:{primaries:e,whitePoint:s,transfer:si,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ti}}}),t}const ks=Bs();function Os(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ps(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Rs;class Ns{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Rs&&(Rs=Qi("canvas")),Rs.width=t.width,Rs.height=t.height;const e=Rs.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Rs}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(js).x}get height(){return this.source.getSize(js).y}get depth(){return this.source.getSize(js).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){ns(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:ns(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}Ds.DEFAULT_IMAGE=null,Ds.DEFAULT_MAPPING=ht,Ds.DEFAULT_ANISOTROPY=1;class Us{constructor(t=0,e=0,i=0,s=1){Us.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,$s),$s.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(nr),ar.subVectors(this.max,nr),Ks.subVectors(t.a,nr),tr.subVectors(t.b,nr),er.subVectors(t.c,nr),ir.subVectors(tr,Ks),sr.subVectors(er,tr),rr.subVectors(Ks,er);let e=[0,-ir.z,ir.y,0,-sr.z,sr.y,0,-rr.z,rr.y,ir.z,0,-ir.x,sr.z,0,-sr.x,rr.z,0,-rr.x,-ir.y,ir.x,0,-sr.y,sr.x,0,-rr.y,rr.x,0];return!!lr(e,Ks,tr,er,ar)&&(e=[1,0,0,0,1,0,0,0,1],!!lr(e,Ks,tr,er,ar)&&(or.crossVectors(ir,sr),e=[or.x,or.y,or.z],lr(e,Ks,tr,er,ar)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,$s).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize($s).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Gs[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Gs[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Gs[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Gs[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Gs[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Gs[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Gs[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Gs[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Gs)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Gs=[new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss],$s=new Ss,Qs=new Hs,Ks=new Ss,tr=new Ss,er=new Ss,ir=new Ss,sr=new Ss,rr=new Ss,nr=new Ss,ar=new Ss,or=new Ss,hr=new Ss;function lr(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){hr.fromArray(t,n);const a=r.x*Math.abs(hr.x)+r.y*Math.abs(hr.y)+r.z*Math.abs(hr.z),o=e.dot(hr),h=i.dot(hr),l=s.dot(hr);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const cr=new Hs,ur=new Ss,dr=new Ss;class pr{constructor(t=new Ss,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):cr.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ur.subVectors(t,this.center);const e=ur.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(ur,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(dr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ur.copy(t.center).add(dr)),this.expandByPoint(ur.copy(t.center).sub(dr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}const mr=new Ss,yr=new Ss,gr=new Ss,fr=new Ss,xr=new Ss,br=new Ss,vr=new Ss;class wr{constructor(t=new Ss,e=new Ss(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,mr)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=mr.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(mr.copy(this.origin).addScaledVector(this.direction,e),mr.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){yr.copy(t).add(e).multiplyScalar(.5),gr.copy(e).sub(t).normalize(),fr.copy(this.origin).sub(yr);const r=.5*t.distanceTo(e),n=-this.direction.dot(gr),a=fr.dot(this.direction),o=-fr.dot(gr),h=fr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(yr).addScaledVector(gr,u),d}intersectSphere(t,e){mr.subVectors(t.center,this.origin);const i=mr.dot(this.direction),s=mr.dot(mr)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,mr)}intersectTriangle(t,e,i,s,r){xr.subVectors(e,t),br.subVectors(i,t),vr.crossVectors(xr,br);let n,a=this.direction.dot(vr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fr.subVectors(this.origin,t);const o=n*this.direction.dot(br.crossVectors(fr,br));if(o<0)return null;const h=n*this.direction.dot(xr.cross(fr));if(h<0)return null;if(o+h>a)return null;const l=-n*fr.dot(vr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Mr{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){Mr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Mr).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),i.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this)}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,i=t.elements,s=1/Sr.setFromMatrixColumn(t,0).length(),r=1/Sr.setFromMatrixColumn(t,1).length(),n=1/Sr.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ar,t,Tr)}lookAt(t,e,i){const s=this.elements;return Ir.subVectors(t,e),0===Ir.lengthSq()&&(Ir.z=1),Ir.normalize(),zr.crossVectors(i,Ir),0===zr.lengthSq()&&(1===Math.abs(i.z)?Ir.x+=1e-4:Ir.z+=1e-4,Ir.normalize(),zr.crossVectors(i,Ir)),zr.normalize(),Cr.crossVectors(Ir,zr),s[0]=zr.x,s[4]=Cr.x,s[8]=Ir.x,s[1]=zr.y,s[5]=Cr.y,s[9]=Ir.y,s[2]=zr.z,s[6]=Cr.z,s[10]=Ir.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],O=s[14],P=s[3],R=s[7],N=s[11],V=s[15];return r[0]=n*w+a*A+o*I+h*P,r[4]=n*M+a*T+o*B+h*R,r[8]=n*S+a*z+o*k+h*N,r[12]=n*_+a*C+o*O+h*V,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*T+u*B+d*R,r[9]=l*S+c*z+u*k+d*N,r[13]=l*_+c*C+u*O+d*V,r[2]=p*w+m*A+y*I+g*P,r[6]=p*M+m*T+y*B+g*R,r[10]=p*S+m*z+y*k+g*N,r[14]=p*_+m*C+y*O+g*V,r[3]=f*w+x*A+b*I+v*P,r[7]=f*M+x*T+b*B+v*R,r[11]=f*S+x*z+b*k+v*N,r[15]=f*_+x*C+b*O+v*V,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],g=t[15],f=o*d-h*u,x=a*d-h*c,b=a*u-o*c,v=n*d-h*l,w=n*u-o*l,M=n*c-a*l;return e*(m*f-y*x+g*b)-i*(p*f-y*v+g*w)+s*(p*x-m*v+g*M)-r*(p*b-m*w+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=e*a-i*n,x=e*o-s*n,b=e*h-r*n,v=i*o-s*a,w=i*h-r*a,M=s*h-r*o,S=l*m-c*p,_=l*y-u*p,A=l*g-d*p,T=c*y-u*m,z=c*g-d*m,C=u*g-d*y,I=f*C-x*z+b*T+v*A-w*_+M*S;if(0===I)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const B=1/I;return t[0]=(a*C-o*z+h*T)*B,t[1]=(s*z-i*C-r*T)*B,t[2]=(m*M-y*w+g*v)*B,t[3]=(u*w-c*M-d*v)*B,t[4]=(o*A-n*C-h*_)*B,t[5]=(e*C-s*A+r*_)*B,t[6]=(y*b-p*M-g*x)*B,t[7]=(l*M-u*b+d*x)*B,t[8]=(n*z-a*A+h*S)*B,t[9]=(i*A-e*z-r*S)*B,t[10]=(p*w-m*b+g*f)*B,t[11]=(c*b-l*w-d*f)*B,t[12]=(a*_-n*T-o*S)*B,t[13]=(e*T-i*_+s*S)*B,t[14]=(m*x-p*v-y*f)*B,t[15]=(l*v-c*x+u*f)*B,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;t.x=s[12],t.y=s[13],t.z=s[14];const r=this.determinant();if(0===r)return i.set(1,1,1),e.identity(),this;let n=Sr.set(s[0],s[1],s[2]).length();const a=Sr.set(s[4],s[5],s[6]).length(),o=Sr.set(s[8],s[9],s[10]).length();r<0&&(n=-n),_r.copy(this);const h=1/n,l=1/a,c=1/o;return _r.elements[0]*=h,_r.elements[1]*=h,_r.elements[2]*=h,_r.elements[4]*=l,_r.elements[5]*=l,_r.elements[6]*=l,_r.elements[8]*=c,_r.elements[9]*=c,_r.elements[10]*=c,e.setFromRotationMatrix(_r),i.x=n,i.y=a,i.z=o,this}makePerspective(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(i-s),u=(e+t)/(e-t),d=(i+s)/(i-s);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(a===Ui)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(i-s),u=-(e+t)/(e-t),d=-(i+s)/(i-s);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(a===Ui)p=-2/(n-r),m=-(n+r)/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Sr=new Ss,_r=new Mr,Ar=new Ss(0,0,0),Tr=new Ss(1,1,1),zr=new Ss,Cr=new Ss,Ir=new Ss,Br=new Mr,kr=new Ms;class Or{constructor(t=0,e=0,i=0,s=Or.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(ys(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-ys(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(ys(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ys(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(ys(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ys(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:ns("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Br.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Br,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return kr.setFromEuler(this),this.setFromQuaternion(kr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Or.DEFAULT_ORDER="XYZ";class Pr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),null!==t.pivot&&(this.pivot=t.pivot.clone()),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Gr.subVectors(s,e),$r.subVectors(i,e),Qr.subVectors(t,e);const n=Gr.dot(Gr),a=Gr.dot($r),o=Gr.dot(Qr),h=$r.dot($r),l=$r.dot(Qr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Kr)&&(Kr.x>=0&&Kr.y>=0&&Kr.x+Kr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Kr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Kr.x),o.addScaledVector(n,Kr.y),o.addScaledVector(a,Kr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return on.setScalar(0),hn.setScalar(0),ln.setScalar(0),on.fromBufferAttribute(t,e),hn.fromBufferAttribute(t,i),ln.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(on,r.x),n.addScaledVector(hn,r.y),n.addScaledVector(ln,r.z),n}static isFrontFacing(t,e,i,s){return Gr.subVectors(i,e),$r.subVectors(t,e),Gr.cross($r).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Gr.subVectors(this.c,this.b),$r.subVectors(this.a,this.b),.5*Gr.cross($r).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return cn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return cn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return cn.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return cn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return cn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;tn.subVectors(s,i),en.subVectors(r,i),rn.subVectors(t,i);const o=tn.dot(rn),h=en.dot(rn);if(o<=0&&h<=0)return e.copy(i);nn.subVectors(t,s);const l=tn.dot(nn),c=en.dot(nn);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(tn,n);an.subVectors(t,r);const d=tn.dot(an),p=en.dot(an);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(en,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return sn.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(sn,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(tn,n).addScaledVector(en,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const un={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},dn={h:0,s:0,l:0},pn={h:0,s:0,l:0};function mn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class yn{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ti){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ks.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=ks.workingColorSpace){return this.r=t,this.g=e,this.b=i,ks.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=ks.workingColorSpace){if(t=gs(t,1),e=ys(e,0,1),i=ys(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=mn(r,s,t+1/3),this.g=mn(r,s,t),this.b=mn(r,s,t-1/3)}return ks.colorSpaceToWorking(this,s),this}setStyle(t,e=ti){function i(e){void 0!==e&&parseFloat(e)<1&&ns("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:ns("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);ns("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ti){const i=un[t.toLowerCase()];return void 0!==i?this.setHex(i,e):ns("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Os(t.r),this.g=Os(t.g),this.b=Os(t.b),this}copyLinearToSRGB(t){return this.r=Ps(t.r),this.g=Ps(t.g),this.b=Ps(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ti){return ks.workingToColorSpace(gn.copy(this),t),65536*Math.round(ys(255*gn.r,0,255))+256*Math.round(ys(255*gn.g,0,255))+Math.round(ys(255*gn.b,0,255))}getHexString(t=ti){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ks.workingColorSpace){ks.workingToColorSpace(gn.copy(this),e);const i=gn.r,s=gn.g,r=gn.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){ns(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:ns(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==hi&&(i.stencilFail=this.stencilFail),this.stencilZFail!==hi&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==hi&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class bn extends xn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const vn=wn();function wn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function Mn(t){Math.abs(t)>65504&&ns("DataUtils.toHalfFloat(): Value out of range."),t=ys(t,-65504,65504),vn.floatView[0]=t;const e=vn.uint32View[0],i=e>>23&511;return vn.baseTable[i]+((8388607&e)>>vn.shiftTable[i])}function Sn(t){const e=t>>10;return vn.uint32View[0]=vn.mantissaTable[vn.offsetTable[e]+(1023&t)]+vn.exponentTable[e],vn.floatView[0]}class _n{static toHalfFloat(t){return Mn(t)}static fromHalfFloat(t){return Sn(t)}}const An=new Ss,Tn=new ws;let zn=0;class Cn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:zn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=ki,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&ns("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return as("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ss(-1/0,-1/0,-1/0),new Ss(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Xn.copy(r).invert(),Yn.copy(t.ray).applyMatrix4(Xn),null!==i.boundingBox&&!1===Yn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,Yn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:ia.clone(),object:t}}(t,e,i,s,Gn,$n,Qn,ea);if(c){const t=new Ss;cn.getBarycoord(ea,Gn,$n,Qn,t),r&&(c.uv=cn.getInterpolatedAttribute(r,o,h,l,t,new ws)),n&&(c.uv1=cn.getInterpolatedAttribute(n,o,h,l,t,new ws)),a&&(c.normal=cn.getInterpolatedAttribute(a,o,h,l,t,new Ss),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ss,materialIndex:0};cn.getNormal(Gn,$n,Qn,e.normal),c.face=e,c.barycoord=t}return c}class na extends Jn{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ss;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class ua extends Hr{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Mr,this.projectionMatrix=new Mr,this.projectionMatrixInverse=new Mr,this.coordinateSystem=Ui,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const da=new Ss,pa=new ws,ma=new ws;class ya extends ua{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*ps*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ds*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*ps*Math.atan(Math.tan(.5*ds*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){da.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(da.x,da.y).multiplyScalar(-t/da.z),da.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(da.x,da.y).multiplyScalar(-t/da.z)}getViewSize(t,e){return this.getViewBounds(t,pa,ma),e.subVectors(ma,pa)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ds*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ga=-90;class fa extends Hr{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new ya(ga,1,t,e);s.layers=this.layers,this.add(s);const r=new ya(ga,1,t,e);r.layers=this.layers,this.add(r);const n=new ya(ga,1,t,e);n.layers=this.layers,this.add(n);const a=new ya(ga,1,t,e);a.layers=this.layers,this.add(a);const o=new ya(ga,1,t,e);o.layers=this.layers,this.add(o);const h=new ya(ga,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Wi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class xa extends Ds{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class ba extends qs{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new xa(s),this._setTextureOptions(e),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new na(5,5,5),r=new ca({name:"CubemapFromEquirect",uniforms:aa(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new sa(s,r),a=e.minFilter;e.minFilter===At&&(e.minFilter=Mt);return new fa(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class va extends Hr{constructor(){super(),this.isGroup=!0,this.type="Group"}}const wa={type:"move"};class Ma{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new va,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new va,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ss,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ss),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new va,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ss,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ss),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(wa)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new va;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class Sa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new yn(t),this.density=e}clone(){return new Sa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class _a{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new yn(t),this.near=e,this.far=i}clone(){return new _a(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Aa extends Hr{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Or,this.environmentIntensity=1,this.environmentRotation=new Or,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Ta{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=ki,this.updateRanges=[],this.version=0,this.uuid=ms()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ka.clone(),uv:cn.getInterpolation(ka,Fa,Ea,La,ja,Da,Ua,new ws),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function qa(t,e,i,s,r,n){Ra.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(Na.x=n*Ra.x-r*Ra.y,Na.y=r*Ra.x+n*Ra.y):Na.copy(Ra),t.copy(e),t.x+=Na.x,t.y+=Na.y,t.applyMatrix4(Va)}const Ja=new Ss,Xa=new Ss;class Ya extends Hr{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ja.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ja);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ja.setFromMatrixPosition(t.matrixWorld),Xa.setFromMatrixPosition(this.matrixWorld);const i=Ja.distanceTo(Xa)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||wo.getNormalMatrix(t),s=this.coplanarPoint(bo).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const So=new pr,_o=new ws(.5,.5),Ao=new Ss;class To{constructor(t=new Mo,e=new Mo,i=new Mo,s=new Mo,r=new Mo,n=new Mo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==Wi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),So.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),So.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(So)}intersectsSprite(t){So.center.set(0,0,0);const e=_o.distanceTo(t.center);return So.radius=.7071067811865476+e,So.applyMatrix4(t.matrixWorld),this.intersectsSphere(So)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ao.y=s.normal.y>0?t.max.y:t.min.y,Ao.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Ao)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const zo=new Mr,Co=new To;class Io{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Ro=new Mr,No=new yn(1,1,1),Vo=new To,Fo=new Io,Eo=new Hs,Lo=new pr,jo=new Ss,Do=new Ss,Uo=new Ss,Wo=new Po,qo=new sa,Jo=[];function Xo(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(Bo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Ro.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(No.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(Bo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Xo(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Hs,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new pr;this.getBoundingBoxAt(t,Eo),Eo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Jn,this._initializeGeometry(s));const r=this.geometry;s.index&&Yo(s.index.array,r.index.array);for(const t in s.attributes)Yo(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;qo.material=this.material,qo.geometry.index=n.index,qo.geometry.attributes=n.attributes,null===qo.geometry.boundingBox&&(qo.geometry.boundingBox=new Hs),null===qo.geometry.boundingSphere&&(qo.geometry.boundingSphere=new pr);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data,m=i.isArrayCamera?Fo:Vo;u&&!i.isArrayCamera&&(Ro.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),Vo.setFromProjectionMatrix(Ro,i.coordinateSystem,i.reversedDepth));let y=0;if(this.sortObjects){Ro.copy(this.matrixWorld).invert(),jo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Ro),Do.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Ro);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;eh.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(eh);return he.far?void 0:{distance:h,point:ih.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const nh=new Ss,ah=new Ss;class oh extends sh{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class gh extends Ds{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class fh extends gh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class xh extends Ds{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class bh extends Ds{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class vh extends bh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class wh extends bh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Mh extends Ds{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Sh extends Ds{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Wt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new Fs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class _h extends Sh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class Ah extends Ds{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class Th extends Jn{constructor(t=1,e=1,i=4,s=8,r=1){super(),this.type="CapsuleGeometry",this.parameters={radius:t,height:e,capSegments:i,radialSegments:s,heightSegments:r},e=Math.max(0,e),i=Math.max(1,Math.floor(i)),s=Math.max(3,Math.floor(s)),r=Math.max(1,Math.floor(r));const n=[],a=[],o=[],h=[],l=e/2,c=Math.PI/2*t,u=e,d=2*c+u,p=2*i+r,m=s+1,y=new Ss,g=new Ss;for(let f=0;f<=p;f++){let x=0,b=0,v=0,w=0;if(f<=i){const e=f/i,s=e*Math.PI/2;b=-l-t*Math.cos(s),v=t*Math.sin(s),w=-t*Math.cos(s),x=e*c}else if(f<=i+r){const s=(f-i)/r;b=s*e-l,v=t,w=0,x=c+s*u}else{const e=(f-i-r)/i,s=e*Math.PI/2;b=l+t*Math.sin(s),v=t*Math.cos(s),w=t*Math.sin(s),x=c+u+e*c}const M=Math.max(0,Math.min(1,x/d));let S=0;0===f?S=.5/s:f===p&&(S=-.5/s);for(let t=0;t<=s;t++){const e=t/s,i=e*Math.PI*2,r=Math.sin(i),n=Math.cos(i);g.x=-v*n,g.y=b,g.z=v*r,a.push(g.x,g.y,g.z),y.set(-v*n,w,v*r),y.normalize(),o.push(y.x,y.y,y.z),h.push(e+S,M)}if(f>0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new Fn(c,3)),this.setAttribute("normal",new Fn(u,3)),this.setAttribute("uv",new Fn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends Jn{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new Fn(r,3)),this.setAttribute("normal",new Fn(r.slice(),3)),this.setAttribute("uv",new Fn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.detail)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Oh=new Ss,Ph=new Ss,Rh=new Ss,Nh=new cn;class Vh extends Jn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ds*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new ws:new Ss);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ss,s=[],r=[],n=[],a=new Ss,o=new Mr;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ss)}r[0]=new Ss,n[0]=new Ss;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ys(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(ys(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Eh extends Fh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new ws){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(Dh.subVectors(s[0],s[1]).add(s[0]),a=Dh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Xh(a,o.x,h.x,l.x,c.x),Xh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class nl extends rl{constructor(t){super(t),this.uuid=ms(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return ll(n,a,i,o,h,l,0),a}function ol(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=Il(r/s|0,t[r],t[r+1],n);return n&&Sl(n,n.next)&&(Bl(n),n=n.next),n}function hl(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!Sl(s,s.next)&&0!==Ml(s.prev,s,s.next))s=s.next;else{if(Bl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function ll(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=fl(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?ul(t,s,r,n):cl(t))e.push(h.i,t.i,l.i),Bl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?ll(t=dl(hl(t),e),e,i,s,r,n,2):2===a&&pl(t,e,i,s,r,n):ll(hl(t),e,i,s,r,n,1);break}}}function cl(t){const e=t.prev,i=t,s=t.next;if(Ml(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&vl(r,o,n,h,a,l,m.x,m.y)&&Ml(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function ul(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Ml(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=fl(p,m,e,i,s),x=fl(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function dl(t,e){let i=t;do{const s=i.prev,r=i.next.next;!Sl(s,r)&&_l(s,i,i.next,r)&&zl(s,r)&&zl(r,s)&&(e.push(s.i,i.i,r.i),Bl(i),Bl(i.next),i=t=r),i=i.next}while(i!==t);return hl(i)}function pl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&wl(a,t)){let o=Cl(a,t);return a=hl(a,a.next),o=hl(o,o.next),ll(a,e,i,s,r,n,0),void ll(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function ml(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function yl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(Sl(t,i))return i;do{if(Sl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&bl(rn.x||i.x===n.x&&gl(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=Cl(i,t);return hl(s,s.next),hl(i,i.next)}function gl(t,e){return Ml(t.prev,t,e.prev)<0&&Ml(e.next,t,t.next)<0}function fl(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function vl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&bl(t,e,i,s,r,n,a,o)}function wl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&_l(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(zl(t,e)&&zl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Ml(t.prev,t,e.prev)||Ml(t,e.prev,e))||Sl(t,e)&&Ml(t.prev,t,t.next)>0&&Ml(e.prev,e,e.next)>0)}function Ml(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Sl(t,e){return t.x===e.x&&t.y===e.y}function _l(t,e,i,s){const r=Tl(Ml(t,e,i)),n=Tl(Ml(t,e,s)),a=Tl(Ml(i,s,t)),o=Tl(Ml(i,s,e));return r!==n&&a!==o||(!(0!==r||!Al(t,i,e))||(!(0!==n||!Al(t,s,e))||(!(0!==a||!Al(i,t,s))||!(0!==o||!Al(i,e,s)))))}function Al(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Tl(t){return t>0?1:t<0?-1:0}function zl(t,e){return Ml(t.prev,t,t.next)<0?Ml(t,e,t.next)>=0&&Ml(t,t.prev,e)>=0:Ml(t,e,t.prev)<0||Ml(t,t.next,e)<0}function Cl(t,e){const i=kl(t.i,t.x,t.y),s=kl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function Il(t,e,i,s){const r=kl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function Bl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function kl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ol{static triangulate(t,e,i=2){return al(t,e,i)}}class Pl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Nl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new ws(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new ws(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class ic extends xn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new yn(16777215),this.specular=new yn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class sc extends xn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new yn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class rc extends xn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class nc extends xn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ac extends xn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class oc extends xn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class hc extends xn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new yn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class lc extends Ho{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function cc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function uc(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function dc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function pc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class mc{static convertArray(t,e){return cc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return uc(t)}static sortedArray(t,e,i){return dc(t,e,i)}static flattenJSON(t,e,i,s){pc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Ms).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(as("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(as("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){as("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){as("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){as("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Ee,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}bc.prototype.ValueTypeName="",bc.prototype.TimeBufferType=Float32Array,bc.prototype.ValueBufferType=Float32Array,bc.prototype.DefaultInterpolation=Fe;class vc extends bc{constructor(t,e,i){super(t,e,i)}}vc.prototype.ValueTypeName="bool",vc.prototype.ValueBufferType=Array,vc.prototype.DefaultInterpolation=Ve,vc.prototype.InterpolantFactoryMethodLinear=void 0,vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}wc.prototype.ValueTypeName="color";class Mc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="number";class Sc extends yc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Ms.slerpFlat(r,0,n,h-a,n,h,o);return r}}class _c extends bc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new Sc(this.times,this.values,this.getValueSize(),t)}}_c.prototype.ValueTypeName="quaternion",_c.prototype.InterpolantFactoryMethodSmooth=void 0;class Ac extends bc{constructor(t,e,i){super(t,e,i)}}Ac.prototype.ValueTypeName="string",Ac.prototype.ValueBufferType=Array,Ac.prototype.DefaultInterpolation=Ve,Ac.prototype.InterpolantFactoryMethodLinear=void 0,Ac.prototype.InterpolantFactoryMethodSmooth=void 0;class Tc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Tc.prototype.ValueTypeName="vector";class zc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=ms(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Cc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(bc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(ns("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return as("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];pc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Pc[t])return void Pc[t].push({onLoad:e,onProgress:i,onError:s});Pc[t]=[],Pc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&ns("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Pc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new Rc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ic.add(`file:${t}`,e);const i=Pc[t];delete Pc[t];for(let t=0,s=i.length;t{const i=Pc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Pc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Vc extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new yn).setHex(r.value);break;case"v2":s.uniforms[e].value=(new ws).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ss).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Us).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Mr).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new ws).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new ws).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return au.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ql,SpriteMaterial:Ia,RawShaderMaterial:Kl,ShaderMaterial:ca,PointsMaterial:lh,MeshPhysicalMaterial:ec,MeshStandardMaterial:tc,MeshPhongMaterial:ic,MeshToonMaterial:sc,MeshNormalMaterial:rc,MeshLambertMaterial:nc,MeshDepthMaterial:ac,MeshDistanceMaterial:oc,MeshBasicMaterial:bn,MeshMatcapMaterial:hc,LineDashedMaterial:lc,LineBasicMaterial:Ho,Material:xn}[t]}}class ou{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class hu extends Jn{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class lu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new Ta(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new hu:new Jn,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Cn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Ca(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?lo:Cn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new Bc(e);r=new Lc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Lc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Hs).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new pr).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new pr).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Hs).fromJSON(t.boundingBox));break;case"LOD":n=new Ya;break;case"Line":n=new sh(h(t.geometry),l(t.material));break;case"LineLoop":n=new hh(h(t.geometry),l(t.material));break;case"LineSegments":n=new oh(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new mh(h(t.geometry),l(t.material));break;case"Sprite":n=new Wa(l(t.material));break;case"Group":n=new va;break;case"Bone":n=new ro;break;default:n=new Hr}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ss).fromArray(t.pivot)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==mu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(mu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ic.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),mu.set(o,e),Ic.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ic.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let gu;class fu{static getContext(){return void 0===gu&&(gu=new(window.AudioContext||window.webkitAudioContext)),gu}static setContext(t){gu=t}}class xu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);function a(e){s?s(e):as(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);fu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const bu=new Mr,vu=new Mr,wu=new Mr;class Mu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ya,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ya,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,wu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ds*e.fov*.5)/e.zoom;let n,a;vu.elements[12]=-i,bu.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(wu),n=-r*e.aspect-s,a=r*e.aspect-s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(wu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(vu),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(bu)}}class Su extends ya{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class _u{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=performance.now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}const Au=new Ss,Tu=new Ms,zu=new Ss,Cu=new Ss,Iu=new Ss;class Bu extends Hr{constructor(){super(),this.type="AudioListener",this.context=fu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new _u}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Au,Tu,zu),Cu.set(0,0,-1).applyQuaternion(Tu),Iu.set(0,1,0).applyQuaternion(Tu),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Au.x,t),e.positionY.linearRampToValueAtTime(Au.y,t),e.positionZ.linearRampToValueAtTime(Au.z,t),e.forwardX.linearRampToValueAtTime(Cu.x,t),e.forwardY.linearRampToValueAtTime(Cu.y,t),e.forwardZ.linearRampToValueAtTime(Cu.z,t),e.upX.linearRampToValueAtTime(Iu.x,t),e.upY.linearRampToValueAtTime(Iu.y,t),e.upZ.linearRampToValueAtTime(Iu.z,t)}else e.setPosition(Au.x,Au.y,Au.z),e.setOrientation(Cu.x,Cu.y,Cu.z,Iu.x,Iu.y,Iu.z)}}class ku extends Hr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void ns("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void ns("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;ns("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;ns("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Ms.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Ms.multiplyQuaternionsFlat(t,n,t,e,t,i),Ms.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Lu="\\[\\]\\.:\\/",ju=new RegExp("["+Lu+"]","g"),Du="[^"+Lu+"]",Uu="[^"+Lu.replace("\\.","")+"]",Wu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Du)+/(WCOD+)?/.source.replace("WCOD",Uu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Du)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Du)+"$"),qu=["material","materials","bones","map"];class Ju{constructor(t,e,i){this.path=e,this.parsedPath=i||Ju.parseTrackName(e),this.node=Ju.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ju.Composite(t,e,i):new Ju(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(ju,"")}static parseTrackName(t){const e=Wu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ju(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Yu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Le,endingEnd:Le};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===We)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=je,s.endingEnd=je):(s.endingStart=t?this.zeroSlopeAtStart?je:Le:De,s.endingEnd=e?this.zeroSlopeAtEnd?je:Le:De)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Zu=new Float32Array(1);class Hu extends ls{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Eu(Ju.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,ud).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const pd=new Ss,md=new Ss,yd=new Ss,gd=new Ss,fd=new Ss,xd=new Ss,bd=new Ss;class vd{constructor(t=new Ss,e=new Ss){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){pd.subVectors(t,this.start),md.subVectors(this.end,this.start);const i=md.dot(md);let s=md.dot(pd)/i;return e&&(s=ys(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=xd,i=bd){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;yd.subVectors(h,a),gd.subVectors(l,o),fd.subVectors(a,o);const c=yd.dot(yd),u=gd.dot(gd),d=gd.dot(fd);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=ys(n,0,1);else{const t=yd.dot(fd);if(u<=s)n=0,r=ys(-t/c,0,1);else{const e=yd.dot(gd),i=c*u-e*e;r=0!==i?ys((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=ys(-t/c,0,1)):n>1&&(n=1,r=ys((e-t)/c,0,1))}}return e.copy(a).add(yd.multiplyScalar(r)),i.copy(o).add(gd.multiplyScalar(n)),e.sub(i),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const wd=new Ss;class Md extends Hr{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Jn,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Yd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Yd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class $d extends oh{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Jn;i.setAttribute("position",new Fn(e,3)),i.setAttribute("color",new Fn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Ho({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new yn,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Qd{constructor(){this.type="ShapePath",this.color=new yn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new rl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Pl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new nl,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return tp(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?ns("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,We as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,Bi as AlwaysCompare,U as AlwaysDepth,Mi as AlwaysStencilFunc,iu as AmbientLight,Yu as AnimationAction,zc as AnimationClip,Vc as AnimationLoader,Hu as AnimationMixer,Xu as AnimationObjectGroup,mc as AnimationUtils,Lh as ArcCurve,Su as ArrayCamera,Gd as ArrowHelper,at as AttachedBindMode,ku as Audio,Fu as AudioAnalyser,fu as AudioContext,Bu as AudioListener,xu as AudioLoader,$d as AxesHelper,d as BackSide,Ye as BasicDepthPacking,o as BasicShadowMap,Zo as BatchedMesh,ro as Bone,vc as BooleanKeyframeTrack,dd as Box2,Hs as Box3,Jd as Box3Helper,na as BoxGeometry,qd as BoxHelper,Cn as BufferAttribute,Jn as BufferGeometry,lu as BufferGeometryLoader,Ct as ByteType,Ic as Cache,ua as Camera,Dd as CameraHelper,Mh as CanvasTexture,Th as CapsuleGeometry,Jh as CatmullRomCurve3,et as CineonToneMapping,zh as CircleGeometry,yt as ClampToEdgeWrapping,_u as Clock,yn as Color,wc as ColorKeyframeTrack,ks as ColorManagement,Yi as Compatibility,vh as CompressedArrayTexture,wh as CompressedCubeTexture,bh as CompressedTexture,Fc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,Kd as Controls,fa as CubeCamera,_h as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,xa as CubeTexture,jc as CubeTextureLoader,pt as CubeUVReflectionMapping,Hh as CubicBezierCurve,Gh as CubicBezierCurve3,gc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,Fh as Curve,sl as CurvePath,b as CustomBlending,st as CustomToneMapping,Ch as CylinderGeometry,ld as Cylindrical,Ys as Data3DTexture,Js as DataArrayTexture,no as DataTexture,Dc as DataTextureLoader,_n as DataUtils,ui as DecrementStencilOp,pi as DecrementWrapStencilOp,kc as DefaultLoadingManager,Wt as DepthFormat,qt as DepthStencilFormat,Sh as DepthTexture,ot as DetachedBindMode,eu as DirectionalLight,Ed as DirectionalLightHelper,xc as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Ei as DynamicCopyUsage,Oi as DynamicDrawUsage,Ni as DynamicReadUsage,Vh as EdgesGeometry,Eh as EllipseCurve,Ai as EqualCompare,J as EqualDepth,fi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,Or as Euler,ls as EventDispatcher,Ah as ExternalTexture,Vl as ExtrudeGeometry,Nc as FileLoader,Vn as Float16BufferAttribute,Fn as Float32BufferAttribute,Pt as FloatType,_a as Fog,Sa as FogExp2,xh as FramebufferTexture,u as FrontSide,To as Frustum,Io as FrustumArray,ed as GLBufferAttribute,ji as GLSL1,Di as GLSL3,zi as GreaterCompare,Y as GreaterDepth,Ii as GreaterEqualCompare,X as GreaterEqualDepth,wi as GreaterEqualStencilFunc,bi as GreaterStencilFunc,Pd as GridHelper,va as Group,Rt as HalfFloatType,qc as HemisphereLight,Od as HemisphereLightHelper,El as IcosahedronGeometry,yu as ImageBitmapLoader,Lc as ImageLoader,Ns as ImageUtils,ci as IncrementStencilOp,di as IncrementWrapStencilOp,lo as InstancedBufferAttribute,hu as InstancedBufferGeometry,td as InstancedInterleavedBuffer,xo as InstancedMesh,On as Int16BufferAttribute,Rn as Int32BufferAttribute,In as Int8BufferAttribute,kt as IntType,Ta as InterleavedBuffer,Ca as InterleavedBufferAttribute,yc as Interpolant,Ve as InterpolateDiscrete,Fe as InterpolateLinear,Ee as InterpolateSmooth,Xi as InterpolationSamplingMode,Ji as InterpolationSamplingType,mi as InvertStencilOp,hi as KeepStencilOp,bc as KeyframeTrack,Ya as LOD,Ll as LatheGeometry,Pr as Layers,_i as LessCompare,W as LessDepth,Ti as LessEqualCompare,q as LessEqualDepth,xi as LessEqualStencilFunc,gi as LessStencilFunc,Wc as Light,nu as LightProbe,sh as Line,vd as Line3,Ho as LineBasicMaterial,$h as LineCurve,Qh as LineCurve3,lc as LineDashedMaterial,hh as LineLoop,oh as LineSegments,Mt as LinearFilter,fc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ei as LinearSRGBColorSpace,K as LinearToneMapping,ii as LinearTransfer,Oc as Loader,ou as LoaderUtils,Bc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,xn as Material,v as MaterialBlending,au as MaterialLoader,vs as MathUtils,cd as Matrix2,Ts as Matrix3,Mr as Matrix4,A as MaxEquation,sa as Mesh,bn as MeshBasicMaterial,ac as MeshDepthMaterial,oc as MeshDistanceMaterial,nc as MeshLambertMaterial,hc as MeshMatcapMaterial,rc as MeshNormalMaterial,ic as MeshPhongMaterial,ec as MeshPhysicalMaterial,tc as MeshStandardMaterial,sc as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,H as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,Si as NeverCompare,D as NeverDepth,yi as NeverStencilFunc,m as NoBlending,Ke as NoColorSpace,ri as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,ai as NormalGAPacking,ni as NormalRGPacking,Ci as NotEqualCompare,Z as NotEqualDepth,vi as NotEqualStencilFunc,Mc as NumberKeyframeTrack,Hr as Object3D,cu as ObjectLoader,Qe as ObjectSpaceNormalMap,jl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,E as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,Kc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,rl as Path,ya as PerspectiveCamera,Mo as Plane,Dl as PlaneGeometry,Xd as PlaneHelper,Qc as PointLight,Cd as PointLightHelper,mh as Points,lh as PointsMaterial,Rd as PolarGridHelper,Bh as PolyhedronGeometry,Vu as PositionalAudio,Ju as PropertyBinding,Eu as PropertyMixer,Kh as QuadraticBezierCurve,tl as QuadraticBezierCurve3,Ms as Quaternion,_c as QuaternionKeyframeTrack,Sc as QuaternionLinearInterpolant,he as R11_EAC_Format,ps as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Ut as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,He as RGBDepthPacking,Dt as RGBFormat,Ht as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Ge as RGDepthPacking,Yt as RGFormat,Zt as RGIntegerFormat,Kl as RawShaderMaterial,wr as Ray,sd as Raycaster,su as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Ws as RenderTarget,Gu as RenderTarget3D,mt as RepeatWrapping,li as ReplaceStencilOp,S as ReverseSubtractEquation,Ul as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ti as SRGBColorSpace,si as SRGBTransfer,Aa as Scene,ca as ShaderMaterial,Ql as ShadowMaterial,nl as Shape,Wl as ShapeGeometry,Qd as ShapePath,Pl as ShapeUtils,It as ShortType,ho as Skeleton,Td as SkeletonHelper,so as SkinnedMesh,Fs as Source,pr as Sphere,ql as SphereGeometry,hd as Spherical,ru as SphericalHarmonics3,el as SplineCurve,Gc as SpotLight,Md as SpotLightHelper,Wa as Sprite,Ia as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,ki as StaticDrawUsage,Ri as StaticReadUsage,Mu as StereoCamera,Li as StreamCopyUsage,Pi as StreamDrawUsage,Vi as StreamReadUsage,Ac as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,$e as TangentSpaceNormalMap,Jl as TetrahedronGeometry,Ds as Texture,Uc as TextureLoader,ep as TextureUtils,ad as Timer,qi as TimestampQuery,Xl as TorusGeometry,Yl as TorusKnotGeometry,cn as Triangle,Xe as TriangleFanDrawMode,Je as TriangleStripDrawMode,qe as TrianglesDrawMode,Zl as TubeGeometry,ht as UVMapping,Pn as Uint16BufferAttribute,Nn as Uint32BufferAttribute,Bn as Uint8BufferAttribute,kn as Uint8ClampedBufferAttribute,$u as Uniform,Ku as UniformsGroup,la as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Ft as UnsignedInt248Type,Et as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,ws as Vector2,Ss as Vector3,Us as Vector4,Tc as VectorKeyframeTrack,fh as VideoFrameTexture,gh as VideoTexture,Zs as WebGL3DRenderTarget,Xs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,ba as WebGLCubeRenderTarget,qs as WebGLRenderTarget,Wi as WebGPUCoordinateSystem,Ma as WebXRController,Hl as WireframeGeometry,De as WrapAroundEnding,Le as ZeroCurvatureEnding,T as ZeroFactor,je as ZeroSlopeEnding,oi as ZeroStencilOp,Zi as arrayNeedsUint32,aa as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,as as error,tp as getByteLength,ss as getConsoleFunction,ha as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,oa as mergeUniforms,hs as probeAsync,is as setConsoleFunction,ns as warn,os as warnOnce}; +const t="183dev",e={LEFT:0,MIDDLE:1,RIGHT:2,ROTATE:0,DOLLY:1,PAN:2},i={ROTATE:0,PAN:1,DOLLY_PAN:2,DOLLY_ROTATE:3},s=0,r=1,n=2,a=3,o=0,h=1,l=2,c=3,u=0,d=1,p=2,m=0,y=1,g=2,f=3,x=4,b=5,v=6,w=100,M=101,S=102,_=103,A=104,T=200,z=201,C=202,I=203,B=204,k=205,O=206,P=207,R=208,N=209,V=210,F=211,E=212,L=213,j=214,D=0,U=1,W=2,q=3,J=4,X=5,Y=6,Z=7,H=0,G=1,$=2,Q=0,K=1,tt=2,et=3,it=4,st=5,rt=6,nt=7,at="attached",ot="detached",ht=300,lt=301,ct=302,ut=303,dt=304,pt=306,mt=1e3,yt=1001,gt=1002,ft=1003,xt=1004,bt=1004,vt=1005,wt=1005,Mt=1006,St=1007,_t=1007,At=1008,Tt=1008,zt=1009,Ct=1010,It=1011,Bt=1012,kt=1013,Ot=1014,Pt=1015,Rt=1016,Nt=1017,Vt=1018,Ft=1020,Et=35902,Lt=35899,jt=1021,Dt=1022,Ut=1023,Wt=1026,qt=1027,Jt=1028,Xt=1029,Yt=1030,Zt=1031,Ht=1032,Gt=1033,$t=33776,Qt=33777,Kt=33778,te=33779,ee=35840,ie=35841,se=35842,re=35843,ne=36196,ae=37492,oe=37496,he=37488,le=37489,ce=37490,ue=37491,de=37808,pe=37809,me=37810,ye=37811,ge=37812,fe=37813,xe=37814,be=37815,ve=37816,we=37817,Me=37818,Se=37819,_e=37820,Ae=37821,Te=36492,ze=36494,Ce=36495,Ie=36283,Be=36284,ke=36285,Oe=36286,Pe=2200,Re=2201,Ne=2202,Ve=2300,Fe=2301,Ee=2302,Le=2400,je=2401,De=2402,Ue=2500,We=2501,qe=0,Je=1,Xe=2,Ye=3200,Ze=3201,He=3202,Ge=3203,$e=0,Qe=1,Ke="",ti="srgb",ei="srgb-linear",ii="linear",si="srgb",ri="",ni="rg",ai="ga",oi=0,hi=7680,li=7681,ci=7682,ui=7683,di=34055,pi=34056,mi=5386,yi=512,gi=513,fi=514,xi=515,bi=516,vi=517,wi=518,Mi=519,Si=512,_i=513,Ai=514,Ti=515,zi=516,Ci=517,Ii=518,Bi=519,ki=35044,Oi=35048,Pi=35040,Ri=35045,Ni=35049,Vi=35041,Fi=35046,Ei=35050,Li=35042,ji="100",Di="300 es",Ui=2e3,Wi=2001,qi={COMPUTE:"compute",RENDER:"render"},Ji={PERSPECTIVE:"perspective",LINEAR:"linear",FLAT:"flat"},Xi={NORMAL:"normal",CENTROID:"centroid",SAMPLE:"sample",FIRST:"first",EITHER:"either"},Yi={TEXTURE_COMPARE:"depthTextureCompare"};function Zi(t){for(let e=t.length-1;e>=0;--e)if(t[e]>=65535)return!0;return!1}const Hi={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:Uint8ClampedArray,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array};function Gi(t,e){return new Hi[t](e)}function $i(t){return ArrayBuffer.isView(t)&&!(t instanceof DataView)}function Qi(t){return document.createElementNS("http://www.w3.org/1999/xhtml",t)}function Ki(){const t=Qi("canvas");return t.style.display="block",t}const ts={};let es=null;function is(t){es=t}function ss(){return es}function rs(...t){const e="THREE."+t.shift();es?es("log",e,...t):console.log(e,...t)}function ns(...t){const e="THREE."+t.shift();es?es("warn",e,...t):console.warn(e,...t)}function as(...t){const e="THREE."+t.shift();es?es("error",e,...t):console.error(e,...t)}function os(...t){const e=t.join(" ");e in ts||(ts[e]=!0,ns(...t))}function hs(t,e,i){return new Promise(function(s,r){setTimeout(function n(){switch(t.clientWaitSync(e,t.SYNC_FLUSH_COMMANDS_BIT,0)){case t.WAIT_FAILED:r();break;case t.TIMEOUT_EXPIRED:setTimeout(n,i);break;default:s()}},i)})}class ls{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[t]&&(i[t]=[]),-1===i[t].indexOf(e)&&i[t].push(e)}hasEventListener(t,e){const i=this._listeners;return void 0!==i&&(void 0!==i[t]&&-1!==i[t].indexOf(e))}removeEventListener(t,e){const i=this._listeners;if(void 0===i)return;const s=i[t];if(void 0!==s){const t=s.indexOf(e);-1!==t&&s.splice(t,1)}}dispatchEvent(t){const e=this._listeners;if(void 0===e)return;const i=e[t.type];if(void 0!==i){t.target=this;const e=i.slice(0);for(let i=0,s=e.length;i>8&255]+cs[t>>16&255]+cs[t>>24&255]+"-"+cs[255&e]+cs[e>>8&255]+"-"+cs[e>>16&15|64]+cs[e>>24&255]+"-"+cs[63&i|128]+cs[i>>8&255]+"-"+cs[i>>16&255]+cs[i>>24&255]+cs[255&s]+cs[s>>8&255]+cs[s>>16&255]+cs[s>>24&255]).toLowerCase()}function ys(t,e,i){return Math.max(e,Math.min(i,t))}function gs(t,e){return(t%e+e)%e}function fs(t,e,i){return(1-i)*t+i*e}function xs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return t/4294967295;case Uint16Array:return t/65535;case Uint8Array:return t/255;case Int32Array:return Math.max(t/2147483647,-1);case Int16Array:return Math.max(t/32767,-1);case Int8Array:return Math.max(t/127,-1);default:throw new Error("Invalid component type.")}}function bs(t,e){switch(e.constructor){case Float32Array:return t;case Uint32Array:return Math.round(4294967295*t);case Uint16Array:return Math.round(65535*t);case Uint8Array:return Math.round(255*t);case Int32Array:return Math.round(2147483647*t);case Int16Array:return Math.round(32767*t);case Int8Array:return Math.round(127*t);default:throw new Error("Invalid component type.")}}const vs={DEG2RAD:ds,RAD2DEG:ps,generateUUID:ms,clamp:ys,euclideanModulo:gs,mapLinear:function(t,e,i,s,r){return s+(t-e)*(r-s)/(i-e)},inverseLerp:function(t,e,i){return t!==e?(i-t)/(e-t):0},lerp:fs,damp:function(t,e,i,s){return fs(t,e,1-Math.exp(-i*s))},pingpong:function(t,e=1){return e-Math.abs(gs(t,2*e)-e)},smoothstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*(3-2*t)},smootherstep:function(t,e,i){return t<=e?0:t>=i?1:(t=(t-e)/(i-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){void 0!==t&&(us=t);let e=us+=1831565813;return e=Math.imul(e^e>>>15,1|e),e^=e+Math.imul(e^e>>>7,61|e),((e^e>>>14)>>>0)/4294967296},degToRad:function(t){return t*ds},radToDeg:function(t){return t*ps},isPowerOfTwo:function(t){return!(t&t-1)&&0!==t},ceilPowerOfTwo:function(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))},floorPowerOfTwo:function(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))},setQuaternionFromProperEuler:function(t,e,i,s,r){const n=Math.cos,a=Math.sin,o=n(i/2),h=a(i/2),l=n((e+s)/2),c=a((e+s)/2),u=n((e-s)/2),d=a((e-s)/2),p=n((s-e)/2),m=a((s-e)/2);switch(r){case"XYX":t.set(o*c,h*u,h*d,o*l);break;case"YZY":t.set(h*d,o*c,h*u,o*l);break;case"ZXZ":t.set(h*u,h*d,o*c,o*l);break;case"XZX":t.set(o*c,h*m,h*p,o*l);break;case"YXY":t.set(h*p,o*c,h*m,o*l);break;case"ZYZ":t.set(h*m,h*p,o*c,o*l);break;default:ns("MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}},normalize:bs,denormalize:xs};class ws{constructor(t=0,e=0){ws.prototype.isVector2=!0,this.x=t,this.y=e}get width(){return this.x}set width(t){this.x=t}get height(){return this.y}set height(t){this.y=t}set(t,e){return this.x=t,this.y=e,this}setScalar(t){return this.x=t,this.y=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y)}copy(t){return this.x=t.x,this.y=t.y,this}add(t){return this.x+=t.x,this.y+=t.y,this}addScalar(t){return this.x+=t,this.y+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this}subScalar(t){return this.x-=t,this.y-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}multiply(t){return this.x*=t.x,this.y*=t.y,this}multiplyScalar(t){return this.x*=t,this.y*=t,this}divide(t){return this.x/=t.x,this.y/=t.y,this}divideScalar(t){return this.multiplyScalar(1/t)}applyMatrix3(t){const e=this.x,i=this.y,s=t.elements;return this.x=s[0]*e+s[3]*i+s[6],this.y=s[1]*e+s[4]*i+s[7],this}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y;return e*e+i*i}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this}equals(t){return t.x===this.x&&t.y===this.y}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this}rotateAround(t,e){const i=Math.cos(e),s=Math.sin(e),r=this.x-t.x,n=this.y-t.y;return this.x=r*i-n*s+t.x,this.y=r*s+n*i+t.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}class Ms{constructor(t=0,e=0,i=0,s=1){this.isQuaternion=!0,this._x=t,this._y=e,this._z=i,this._w=s}static slerpFlat(t,e,i,s,r,n,a){let o=i[s+0],h=i[s+1],l=i[s+2],c=i[s+3],u=r[n+0],d=r[n+1],p=r[n+2],m=r[n+3];if(c!==m||o!==u||h!==d||l!==p){let t=o*u+h*d+l*p+c*m;t<0&&(u=-u,d=-d,p=-p,m=-m,t=-t);let e=1-a;if(t<.9995){const i=Math.acos(t),s=Math.sin(i);e=Math.sin(e*i)/s,o=o*e+u*(a=Math.sin(a*i)/s),h=h*e+d*a,l=l*e+p*a,c=c*e+m*a}else{o=o*e+u*a,h=h*e+d*a,l=l*e+p*a,c=c*e+m*a;const t=1/Math.sqrt(o*o+h*h+l*l+c*c);o*=t,h*=t,l*=t,c*=t}}t[e]=o,t[e+1]=h,t[e+2]=l,t[e+3]=c}static multiplyQuaternionsFlat(t,e,i,s,r,n){const a=i[s],o=i[s+1],h=i[s+2],l=i[s+3],c=r[n],u=r[n+1],d=r[n+2],p=r[n+3];return t[e]=a*p+l*c+o*d-h*u,t[e+1]=o*p+l*u+h*c-a*d,t[e+2]=h*p+l*d+a*u-o*c,t[e+3]=l*p-a*c-o*u-h*d,t}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get w(){return this._w}set w(t){this._w=t,this._onChangeCallback()}set(t,e,i,s){return this._x=t,this._y=e,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(t){return this._x=t.x,this._y=t.y,this._z=t.z,this._w=t.w,this._onChangeCallback(),this}setFromEuler(t,e=!0){const i=t._x,s=t._y,r=t._z,n=t._order,a=Math.cos,o=Math.sin,h=a(i/2),l=a(s/2),c=a(r/2),u=o(i/2),d=o(s/2),p=o(r/2);switch(n){case"XYZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"YXZ":this._x=u*l*c+h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"ZXY":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c-u*d*p;break;case"ZYX":this._x=u*l*c-h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c+u*d*p;break;case"YZX":this._x=u*l*c+h*d*p,this._y=h*d*c+u*l*p,this._z=h*l*p-u*d*c,this._w=h*l*c-u*d*p;break;case"XZY":this._x=u*l*c-h*d*p,this._y=h*d*c-u*l*p,this._z=h*l*p+u*d*c,this._w=h*l*c+u*d*p;break;default:ns("Quaternion: .setFromEuler() encountered an unknown order: "+n)}return!0===e&&this._onChangeCallback(),this}setFromAxisAngle(t,e){const i=e/2,s=Math.sin(i);return this._x=t.x*s,this._y=t.y*s,this._z=t.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(t){const e=t.elements,i=e[0],s=e[4],r=e[8],n=e[1],a=e[5],o=e[9],h=e[2],l=e[6],c=e[10],u=i+a+c;if(u>0){const t=.5/Math.sqrt(u+1);this._w=.25/t,this._x=(l-o)*t,this._y=(r-h)*t,this._z=(n-s)*t}else if(i>a&&i>c){const t=2*Math.sqrt(1+i-a-c);this._w=(l-o)/t,this._x=.25*t,this._y=(s+n)/t,this._z=(r+h)/t}else if(a>c){const t=2*Math.sqrt(1+a-i-c);this._w=(r-h)/t,this._x=(s+n)/t,this._y=.25*t,this._z=(o+l)/t}else{const t=2*Math.sqrt(1+c-i-a);this._w=(n-s)/t,this._x=(r+h)/t,this._y=(o+l)/t,this._z=.25*t}return this._onChangeCallback(),this}setFromUnitVectors(t,e){let i=t.dot(e)+1;return i<1e-8?(i=0,Math.abs(t.x)>Math.abs(t.z)?(this._x=-t.y,this._y=t.x,this._z=0,this._w=i):(this._x=0,this._y=-t.z,this._z=t.y,this._w=i)):(this._x=t.y*e.z-t.z*e.y,this._y=t.z*e.x-t.x*e.z,this._z=t.x*e.y-t.y*e.x,this._w=i),this.normalize()}angleTo(t){return 2*Math.acos(Math.abs(ys(this.dot(t),-1,1)))}rotateTowards(t,e){const i=this.angleTo(t);if(0===i)return this;const s=Math.min(1,e/i);return this.slerp(t,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(t){return this._x*t._x+this._y*t._y+this._z*t._z+this._w*t._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let t=this.length();return 0===t?(this._x=0,this._y=0,this._z=0,this._w=1):(t=1/t,this._x=this._x*t,this._y=this._y*t,this._z=this._z*t,this._w=this._w*t),this._onChangeCallback(),this}multiply(t){return this.multiplyQuaternions(this,t)}premultiply(t){return this.multiplyQuaternions(t,this)}multiplyQuaternions(t,e){const i=t._x,s=t._y,r=t._z,n=t._w,a=e._x,o=e._y,h=e._z,l=e._w;return this._x=i*l+n*a+s*h-r*o,this._y=s*l+n*o+r*a-i*h,this._z=r*l+n*h+i*o-s*a,this._w=n*l-i*a-s*o-r*h,this._onChangeCallback(),this}slerp(t,e){let i=t._x,s=t._y,r=t._z,n=t._w,a=this.dot(t);a<0&&(i=-i,s=-s,r=-r,n=-n,a=-a);let o=1-e;if(a<.9995){const t=Math.acos(a),h=Math.sin(t);o=Math.sin(o*t)/h,e=Math.sin(e*t)/h,this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this._onChangeCallback()}else this._x=this._x*o+i*e,this._y=this._y*o+s*e,this._z=this._z*o+r*e,this._w=this._w*o+n*e,this.normalize();return this}slerpQuaternions(t,e,i){return this.copy(t).slerp(e,i)}random(){const t=2*Math.PI*Math.random(),e=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),r=Math.sqrt(i);return this.set(s*Math.sin(t),s*Math.cos(t),r*Math.sin(e),r*Math.cos(e))}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._w===this._w}fromArray(t,e=0){return this._x=t[e],this._y=t[e+1],this._z=t[e+2],this._w=t[e+3],this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._w,t}fromBufferAttribute(t,e){return this._x=t.getX(e),this._y=t.getY(e),this._z=t.getZ(e),this._w=t.getW(e),this._onChangeCallback(),this}toJSON(){return this.toArray()}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class Ss{constructor(t=0,e=0,i=0){Ss.prototype.isVector3=!0,this.x=t,this.y=e,this.z=i}set(t,e,i){return void 0===i&&(i=this.z),this.x=t,this.y=e,this.z=i,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this}multiplyVectors(t,e){return this.x=t.x*e.x,this.y=t.y*e.y,this.z=t.z*e.z,this}applyEuler(t){return this.applyQuaternion(As.setFromEuler(t))}applyAxisAngle(t,e){return this.applyQuaternion(As.setFromAxisAngle(t,e))}applyMatrix3(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[3]*i+r[6]*s,this.y=r[1]*e+r[4]*i+r[7]*s,this.z=r[2]*e+r[5]*i+r[8]*s,this}applyNormalMatrix(t){return this.applyMatrix3(t).normalize()}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=t.elements,n=1/(r[3]*e+r[7]*i+r[11]*s+r[15]);return this.x=(r[0]*e+r[4]*i+r[8]*s+r[12])*n,this.y=(r[1]*e+r[5]*i+r[9]*s+r[13])*n,this.z=(r[2]*e+r[6]*i+r[10]*s+r[14])*n,this}applyQuaternion(t){const e=this.x,i=this.y,s=this.z,r=t.x,n=t.y,a=t.z,o=t.w,h=2*(n*s-a*i),l=2*(a*e-r*s),c=2*(r*i-n*e);return this.x=e+o*h+n*c-a*l,this.y=i+o*l+a*h-r*c,this.z=s+o*c+r*l-n*h,this}project(t){return this.applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix)}unproject(t){return this.applyMatrix4(t.projectionMatrixInverse).applyMatrix4(t.matrixWorld)}transformDirection(t){const e=this.x,i=this.y,s=this.z,r=t.elements;return this.x=r[0]*e+r[4]*i+r[8]*s,this.y=r[1]*e+r[5]*i+r[9]*s,this.z=r[2]*e+r[6]*i+r[10]*s,this.normalize()}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this}divideScalar(t){return this.multiplyScalar(1/t)}min(t){return this.x=Math.min(this.x,t.x),this.y=Math.min(this.y,t.y),this.z=Math.min(this.z,t.z),this}max(t){return this.x=Math.max(this.x,t.x),this.y=Math.max(this.y,t.y),this.z=Math.max(this.z,t.z),this}clamp(t,e){return this.x=ys(this.x,t.x,e.x),this.y=ys(this.y,t.y,e.y),this.z=ys(this.z,t.z,e.z),this}clampScalar(t,e){return this.x=ys(this.x,t,e),this.y=ys(this.y,t,e),this.z=ys(this.z,t,e),this}clampLength(t,e){const i=this.length();return this.divideScalar(i||1).multiplyScalar(ys(i,t,e))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(t){return this.x*t.x+this.y*t.y+this.z*t.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(t){return this.normalize().multiplyScalar(t)}lerp(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this.z+=(t.z-this.z)*e,this}lerpVectors(t,e,i){return this.x=t.x+(e.x-t.x)*i,this.y=t.y+(e.y-t.y)*i,this.z=t.z+(e.z-t.z)*i,this}cross(t){return this.crossVectors(this,t)}crossVectors(t,e){const i=t.x,s=t.y,r=t.z,n=e.x,a=e.y,o=e.z;return this.x=s*o-r*a,this.y=r*n-i*o,this.z=i*a-s*n,this}projectOnVector(t){const e=t.lengthSq();if(0===e)return this.set(0,0,0);const i=t.dot(this)/e;return this.copy(t).multiplyScalar(i)}projectOnPlane(t){return _s.copy(this).projectOnVector(t),this.sub(_s)}reflect(t){return this.sub(_s.copy(t).multiplyScalar(2*this.dot(t)))}angleTo(t){const e=Math.sqrt(this.lengthSq()*t.lengthSq());if(0===e)return Math.PI/2;const i=this.dot(t)/e;return Math.acos(ys(i,-1,1))}distanceTo(t){return Math.sqrt(this.distanceToSquared(t))}distanceToSquared(t){const e=this.x-t.x,i=this.y-t.y,s=this.z-t.z;return e*e+i*i+s*s}manhattanDistanceTo(t){return Math.abs(this.x-t.x)+Math.abs(this.y-t.y)+Math.abs(this.z-t.z)}setFromSpherical(t){return this.setFromSphericalCoords(t.radius,t.phi,t.theta)}setFromSphericalCoords(t,e,i){const s=Math.sin(e)*t;return this.x=s*Math.sin(i),this.y=Math.cos(e)*t,this.z=s*Math.cos(i),this}setFromCylindrical(t){return this.setFromCylindricalCoords(t.radius,t.theta,t.y)}setFromCylindricalCoords(t,e,i){return this.x=t*Math.sin(e),this.y=i,this.z=t*Math.cos(e),this}setFromMatrixPosition(t){const e=t.elements;return this.x=e[12],this.y=e[13],this.z=e[14],this}setFromMatrixScale(t){const e=this.setFromMatrixColumn(t,0).length(),i=this.setFromMatrixColumn(t,1).length(),s=this.setFromMatrixColumn(t,2).length();return this.x=e,this.y=i,this.z=s,this}setFromMatrixColumn(t,e){return this.fromArray(t.elements,4*e)}setFromMatrix3Column(t,e){return this.fromArray(t.elements,3*e)}setFromEuler(t){return this.x=t._x,this.y=t._y,this.z=t._z,this}setFromColor(t){return this.x=t.r,this.y=t.g,this.z=t.b,this}equals(t){return t.x===this.x&&t.y===this.y&&t.z===this.z}fromArray(t,e=0){return this.x=t[e],this.y=t[e+1],this.z=t[e+2],this}toArray(t=[],e=0){return t[e]=this.x,t[e+1]=this.y,t[e+2]=this.z,t}fromBufferAttribute(t,e){return this.x=t.getX(e),this.y=t.getY(e),this.z=t.getZ(e),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const t=Math.random()*Math.PI*2,e=2*Math.random()-1,i=Math.sqrt(1-e*e);return this.x=i*Math.cos(t),this.y=e,this.z=i*Math.sin(t),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const _s=new Ss,As=new Ms;class Ts{constructor(t,e,i,s,r,n,a,o,h){Ts.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h)}set(t,e,i,s,r,n,a,o,h){const l=this.elements;return l[0]=t,l[1]=s,l[2]=a,l[3]=e,l[4]=r,l[5]=o,l[6]=i,l[7]=n,l[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}extractBasis(t,e,i){return t.setFromMatrix3Column(this,0),e.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(t){const e=t.elements;return this.set(e[0],e[4],e[8],e[1],e[5],e[9],e[2],e[6],e[10]),this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[3],o=i[6],h=i[1],l=i[4],c=i[7],u=i[2],d=i[5],p=i[8],m=s[0],y=s[3],g=s[6],f=s[1],x=s[4],b=s[7],v=s[2],w=s[5],M=s[8];return r[0]=n*m+a*f+o*v,r[3]=n*y+a*x+o*w,r[6]=n*g+a*b+o*M,r[1]=h*m+l*f+c*v,r[4]=h*y+l*x+c*w,r[7]=h*g+l*b+c*M,r[2]=u*m+d*f+p*v,r[5]=u*y+d*x+p*w,r[8]=u*g+d*b+p*M,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[3]*=t,e[6]*=t,e[1]*=t,e[4]*=t,e[7]*=t,e[2]*=t,e[5]*=t,e[8]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8];return e*n*l-e*a*h-i*r*l+i*a*o+s*r*h-s*n*o}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=l*n-a*h,u=a*o-l*r,d=h*r-n*o,p=e*c+i*u+s*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return t[0]=c*m,t[1]=(s*h-l*i)*m,t[2]=(a*i-s*n)*m,t[3]=u*m,t[4]=(l*e-s*o)*m,t[5]=(s*r-a*e)*m,t[6]=d*m,t[7]=(i*o-h*e)*m,t[8]=(n*e-i*r)*m,this}transpose(){let t;const e=this.elements;return t=e[1],e[1]=e[3],e[3]=t,t=e[2],e[2]=e[6],e[6]=t,t=e[5],e[5]=e[7],e[7]=t,this}getNormalMatrix(t){return this.setFromMatrix4(t).invert().transpose()}transposeIntoArray(t){const e=this.elements;return t[0]=e[0],t[1]=e[3],t[2]=e[6],t[3]=e[1],t[4]=e[4],t[5]=e[7],t[6]=e[2],t[7]=e[5],t[8]=e[8],this}setUvTransform(t,e,i,s,r,n,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*n+h*a)+n+t,-s*h,s*o,-s*(-h*n+o*a)+a+e,0,0,1),this}scale(t,e){return this.premultiply(zs.makeScale(t,e)),this}rotate(t){return this.premultiply(zs.makeRotation(-t)),this}translate(t,e){return this.premultiply(zs.makeTranslation(t,e)),this}makeTranslation(t,e){return t.isVector2?this.set(1,0,t.x,0,1,t.y,0,0,1):this.set(1,0,t,0,1,e,0,0,1),this}makeRotation(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,i,e,0,0,0,1),this}makeScale(t,e){return this.set(t,0,0,0,e,0,0,0,1),this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<9;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<9;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t}clone(){return(new this.constructor).fromArray(this.elements)}}const zs=new Ts,Cs=(new Ts).set(.4123908,.3575843,.1804808,.212639,.7151687,.0721923,.0193308,.1191948,.9505322),Is=(new Ts).set(3.2409699,-1.5373832,-.4986108,-.9692436,1.8759675,.0415551,.0556301,-.203977,1.0569715);function Bs(){const t={enabled:!0,workingColorSpace:ei,spaces:{},convert:function(t,e,i){return!1!==this.enabled&&e!==i&&e&&i?(this.spaces[e].transfer===si&&(t.r=Os(t.r),t.g=Os(t.g),t.b=Os(t.b)),this.spaces[e].primaries!==this.spaces[i].primaries&&(t.applyMatrix3(this.spaces[e].toXYZ),t.applyMatrix3(this.spaces[i].fromXYZ)),this.spaces[i].transfer===si&&(t.r=Ps(t.r),t.g=Ps(t.g),t.b=Ps(t.b)),t):t},workingToColorSpace:function(t,e){return this.convert(t,this.workingColorSpace,e)},colorSpaceToWorking:function(t,e){return this.convert(t,e,this.workingColorSpace)},getPrimaries:function(t){return this.spaces[t].primaries},getTransfer:function(t){return""===t?ii:this.spaces[t].transfer},getToneMappingMode:function(t){return this.spaces[t].outputColorSpaceConfig.toneMappingMode||"standard"},getLuminanceCoefficients:function(t,e=this.workingColorSpace){return t.fromArray(this.spaces[e].luminanceCoefficients)},define:function(t){Object.assign(this.spaces,t)},_getMatrix:function(t,e,i){return t.copy(this.spaces[e].toXYZ).multiply(this.spaces[i].fromXYZ)},_getDrawingBufferColorSpace:function(t){return this.spaces[t].outputColorSpaceConfig.drawingBufferColorSpace},_getUnpackColorSpace:function(t=this.workingColorSpace){return this.spaces[t].workingColorSpaceConfig.unpackColorSpace},fromWorkingColorSpace:function(e,i){return os("ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace()."),t.workingToColorSpace(e,i)},toWorkingColorSpace:function(e,i){return os("ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking()."),t.colorSpaceToWorking(e,i)}},e=[.64,.33,.3,.6,.15,.06],i=[.2126,.7152,.0722],s=[.3127,.329];return t.define({[ei]:{primaries:e,whitePoint:s,transfer:ii,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,workingColorSpaceConfig:{unpackColorSpace:ti},outputColorSpaceConfig:{drawingBufferColorSpace:ti}},[ti]:{primaries:e,whitePoint:s,transfer:si,toXYZ:Cs,fromXYZ:Is,luminanceCoefficients:i,outputColorSpaceConfig:{drawingBufferColorSpace:ti}}}),t}const ks=Bs();function Os(t){return t<.04045?.0773993808*t:Math.pow(.9478672986*t+.0521327014,2.4)}function Ps(t){return t<.0031308?12.92*t:1.055*Math.pow(t,.41666)-.055}let Rs;class Ns{static getDataURL(t,e="image/png"){if(/^data:/i.test(t.src))return t.src;if("undefined"==typeof HTMLCanvasElement)return t.src;let i;if(t instanceof HTMLCanvasElement)i=t;else{void 0===Rs&&(Rs=Qi("canvas")),Rs.width=t.width,Rs.height=t.height;const e=Rs.getContext("2d");t instanceof ImageData?e.putImageData(t,0,0):e.drawImage(t,0,0,t.width,t.height),i=Rs}return i.toDataURL(e)}static sRGBToLinear(t){if("undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&t instanceof ImageBitmap){const e=Qi("canvas");e.width=t.width,e.height=t.height;const i=e.getContext("2d");i.drawImage(t,0,0,t.width,t.height);const s=i.getImageData(0,0,t.width,t.height),r=s.data;for(let t=0;t1),this.pmremVersion=0}get width(){return this.source.getSize(js).x}get height(){return this.source.getSize(js).y}get depth(){return this.source.getSize(js).z}get image(){return this.source.data}set image(t=null){this.source.data=t}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}clone(){return(new this.constructor).copy(this)}copy(t){return this.name=t.name,this.source=t.source,this.mipmaps=t.mipmaps.slice(0),this.mapping=t.mapping,this.channel=t.channel,this.wrapS=t.wrapS,this.wrapT=t.wrapT,this.magFilter=t.magFilter,this.minFilter=t.minFilter,this.anisotropy=t.anisotropy,this.format=t.format,this.internalFormat=t.internalFormat,this.type=t.type,this.offset.copy(t.offset),this.repeat.copy(t.repeat),this.center.copy(t.center),this.rotation=t.rotation,this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrix.copy(t.matrix),this.generateMipmaps=t.generateMipmaps,this.premultiplyAlpha=t.premultiplyAlpha,this.flipY=t.flipY,this.unpackAlignment=t.unpackAlignment,this.colorSpace=t.colorSpace,this.renderTarget=t.renderTarget,this.isRenderTargetTexture=t.isRenderTargetTexture,this.isArrayTexture=t.isArrayTexture,this.userData=JSON.parse(JSON.stringify(t.userData)),this.needsUpdate=!0,this}setValues(t){for(const e in t){const i=t[e];if(void 0===i){ns(`Texture.setValues(): parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&i&&s.isVector2&&i.isVector2||s&&i&&s.isVector3&&i.isVector3||s&&i&&s.isMatrix3&&i.isMatrix3?s.copy(i):this[e]=i:ns(`Texture.setValues(): property '${e}' does not exist.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;if(!e&&void 0!==t.textures[this.uuid])return t.textures[this.uuid];const i={metadata:{version:4.7,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,image:this.source.toJSON(t).uuid,mapping:this.mapping,channel:this.channel,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,internalFormat:this.internalFormat,type:this.type,colorSpace:this.colorSpace,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,generateMipmaps:this.generateMipmaps,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};return Object.keys(this.userData).length>0&&(i.userData=this.userData),e||(t.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(t){if(this.mapping!==ht)return t;if(t.applyMatrix3(this.matrix),t.x<0||t.x>1)switch(this.wrapS){case mt:t.x=t.x-Math.floor(t.x);break;case yt:t.x=t.x<0?0:1;break;case gt:1===Math.abs(Math.floor(t.x)%2)?t.x=Math.ceil(t.x)-t.x:t.x=t.x-Math.floor(t.x)}if(t.y<0||t.y>1)switch(this.wrapT){case mt:t.y=t.y-Math.floor(t.y);break;case yt:t.y=t.y<0?0:1;break;case gt:1===Math.abs(Math.floor(t.y)%2)?t.y=Math.ceil(t.y)-t.y:t.y=t.y-Math.floor(t.y)}return this.flipY&&(t.y=1-t.y),t}set needsUpdate(t){!0===t&&(this.version++,this.source.needsUpdate=!0)}set needsPMREMUpdate(t){!0===t&&this.pmremVersion++}}Ds.DEFAULT_IMAGE=null,Ds.DEFAULT_MAPPING=ht,Ds.DEFAULT_ANISOTROPY=1;class Us{constructor(t=0,e=0,i=0,s=1){Us.prototype.isVector4=!0,this.x=t,this.y=e,this.z=i,this.w=s}get width(){return this.z}set width(t){this.z=t}get height(){return this.w}set height(t){this.w=t}set(t,e,i,s){return this.x=t,this.y=e,this.z=i,this.w=s,this}setScalar(t){return this.x=t,this.y=t,this.z=t,this.w=t,this}setX(t){return this.x=t,this}setY(t){return this.y=t,this}setZ(t){return this.z=t,this}setW(t){return this.w=t,this}setComponent(t,e){switch(t){case 0:this.x=e;break;case 1:this.y=e;break;case 2:this.z=e;break;case 3:this.w=e;break;default:throw new Error("index is out of range: "+t)}return this}getComponent(t){switch(t){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+t)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(t){return this.x=t.x,this.y=t.y,this.z=t.z,this.w=void 0!==t.w?t.w:1,this}add(t){return this.x+=t.x,this.y+=t.y,this.z+=t.z,this.w+=t.w,this}addScalar(t){return this.x+=t,this.y+=t,this.z+=t,this.w+=t,this}addVectors(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this.z=t.z+e.z,this.w=t.w+e.w,this}addScaledVector(t,e){return this.x+=t.x*e,this.y+=t.y*e,this.z+=t.z*e,this.w+=t.w*e,this}sub(t){return this.x-=t.x,this.y-=t.y,this.z-=t.z,this.w-=t.w,this}subScalar(t){return this.x-=t,this.y-=t,this.z-=t,this.w-=t,this}subVectors(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this.z=t.z-e.z,this.w=t.w-e.w,this}multiply(t){return this.x*=t.x,this.y*=t.y,this.z*=t.z,this.w*=t.w,this}multiplyScalar(t){return this.x*=t,this.y*=t,this.z*=t,this.w*=t,this}applyMatrix4(t){const e=this.x,i=this.y,s=this.z,r=this.w,n=t.elements;return this.x=n[0]*e+n[4]*i+n[8]*s+n[12]*r,this.y=n[1]*e+n[5]*i+n[9]*s+n[13]*r,this.z=n[2]*e+n[6]*i+n[10]*s+n[14]*r,this.w=n[3]*e+n[7]*i+n[11]*s+n[15]*r,this}divide(t){return this.x/=t.x,this.y/=t.y,this.z/=t.z,this.w/=t.w,this}divideScalar(t){return this.multiplyScalar(1/t)}setAxisAngleFromQuaternion(t){this.w=2*Math.acos(t.w);const e=Math.sqrt(1-t.w*t.w);return e<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=t.x/e,this.y=t.y/e,this.z=t.z/e),this}setAxisAngleFromRotationMatrix(t){let e,i,s,r;const n=.01,a=.1,o=t.elements,h=o[0],l=o[4],c=o[8],u=o[1],d=o[5],p=o[9],m=o[2],y=o[6],g=o[10];if(Math.abs(l-u)o&&t>f?tf?o1);this.dispose()}this.viewport.set(0,0,t,e),this.scissor.set(0,0,t,e)}clone(){return(new this.constructor).copy(this)}copy(t){this.width=t.width,this.height=t.height,this.depth=t.depth,this.scissor.copy(t.scissor),this.scissorTest=t.scissorTest,this.viewport.copy(t.viewport),this.textures.length=0;for(let e=0,i=t.textures.length;e=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y&&t.z>=this.min.z&&t.z<=this.max.z}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y&&this.min.z<=t.min.z&&t.max.z<=this.max.z}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y),(t.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y&&t.max.z>=this.min.z&&t.min.z<=this.max.z}intersectsSphere(t){return this.clampPoint(t.center,$s),$s.distanceToSquared(t.center)<=t.radius*t.radius}intersectsPlane(t){let e,i;return t.normal.x>0?(e=t.normal.x*this.min.x,i=t.normal.x*this.max.x):(e=t.normal.x*this.max.x,i=t.normal.x*this.min.x),t.normal.y>0?(e+=t.normal.y*this.min.y,i+=t.normal.y*this.max.y):(e+=t.normal.y*this.max.y,i+=t.normal.y*this.min.y),t.normal.z>0?(e+=t.normal.z*this.min.z,i+=t.normal.z*this.max.z):(e+=t.normal.z*this.max.z,i+=t.normal.z*this.min.z),e<=-t.constant&&i>=-t.constant}intersectsTriangle(t){if(this.isEmpty())return!1;this.getCenter(nr),ar.subVectors(this.max,nr),Ks.subVectors(t.a,nr),tr.subVectors(t.b,nr),er.subVectors(t.c,nr),ir.subVectors(tr,Ks),sr.subVectors(er,tr),rr.subVectors(Ks,er);let e=[0,-ir.z,ir.y,0,-sr.z,sr.y,0,-rr.z,rr.y,ir.z,0,-ir.x,sr.z,0,-sr.x,rr.z,0,-rr.x,-ir.y,ir.x,0,-sr.y,sr.x,0,-rr.y,rr.x,0];return!!lr(e,Ks,tr,er,ar)&&(e=[1,0,0,0,1,0,0,0,1],!!lr(e,Ks,tr,er,ar)&&(or.crossVectors(ir,sr),e=[or.x,or.y,or.z],lr(e,Ks,tr,er,ar)))}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,$s).distanceTo(t)}getBoundingSphere(t){return this.isEmpty()?t.makeEmpty():(this.getCenter(t.center),t.radius=.5*this.getSize($s).length()),t}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}applyMatrix4(t){return this.isEmpty()||(Gs[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(t),Gs[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(t),Gs[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(t),Gs[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(t),Gs[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(t),Gs[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(t),Gs[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(t),Gs[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(t),this.setFromPoints(Gs)),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}toJSON(){return{min:this.min.toArray(),max:this.max.toArray()}}fromJSON(t){return this.min.fromArray(t.min),this.max.fromArray(t.max),this}}const Gs=[new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss,new Ss],$s=new Ss,Qs=new Hs,Ks=new Ss,tr=new Ss,er=new Ss,ir=new Ss,sr=new Ss,rr=new Ss,nr=new Ss,ar=new Ss,or=new Ss,hr=new Ss;function lr(t,e,i,s,r){for(let n=0,a=t.length-3;n<=a;n+=3){hr.fromArray(t,n);const a=r.x*Math.abs(hr.x)+r.y*Math.abs(hr.y)+r.z*Math.abs(hr.z),o=e.dot(hr),h=i.dot(hr),l=s.dot(hr);if(Math.max(-Math.max(o,h,l),Math.min(o,h,l))>a)return!1}return!0}const cr=new Hs,ur=new Ss,dr=new Ss;class pr{constructor(t=new Ss,e=-1){this.isSphere=!0,this.center=t,this.radius=e}set(t,e){return this.center.copy(t),this.radius=e,this}setFromPoints(t,e){const i=this.center;void 0!==e?i.copy(e):cr.setFromPoints(t).getCenter(i);let s=0;for(let e=0,r=t.length;ethis.radius*this.radius&&(e.sub(this.center).normalize(),e.multiplyScalar(this.radius).add(this.center)),e}getBoundingBox(t){return this.isEmpty()?(t.makeEmpty(),t):(t.set(this.center,this.center),t.expandByScalar(this.radius),t)}applyMatrix4(t){return this.center.applyMatrix4(t),this.radius=this.radius*t.getMaxScaleOnAxis(),this}translate(t){return this.center.add(t),this}expandByPoint(t){if(this.isEmpty())return this.center.copy(t),this.radius=0,this;ur.subVectors(t,this.center);const e=ur.lengthSq();if(e>this.radius*this.radius){const t=Math.sqrt(e),i=.5*(t-this.radius);this.center.addScaledVector(ur,i/t),this.radius+=i}return this}union(t){return t.isEmpty()?this:this.isEmpty()?(this.copy(t),this):(!0===this.center.equals(t.center)?this.radius=Math.max(this.radius,t.radius):(dr.subVectors(t.center,this.center).setLength(t.radius),this.expandByPoint(ur.copy(t.center).add(dr)),this.expandByPoint(ur.copy(t.center).sub(dr))),this)}equals(t){return t.center.equals(this.center)&&t.radius===this.radius}clone(){return(new this.constructor).copy(this)}toJSON(){return{radius:this.radius,center:this.center.toArray()}}fromJSON(t){return this.radius=t.radius,this.center.fromArray(t.center),this}}const mr=new Ss,yr=new Ss,gr=new Ss,fr=new Ss,xr=new Ss,br=new Ss,vr=new Ss;class wr{constructor(t=new Ss,e=new Ss(0,0,-1)){this.origin=t,this.direction=e}set(t,e){return this.origin.copy(t),this.direction.copy(e),this}copy(t){return this.origin.copy(t.origin),this.direction.copy(t.direction),this}at(t,e){return e.copy(this.origin).addScaledVector(this.direction,t)}lookAt(t){return this.direction.copy(t).sub(this.origin).normalize(),this}recast(t){return this.origin.copy(this.at(t,mr)),this}closestPointToPoint(t,e){e.subVectors(t,this.origin);const i=e.dot(this.direction);return i<0?e.copy(this.origin):e.copy(this.origin).addScaledVector(this.direction,i)}distanceToPoint(t){return Math.sqrt(this.distanceSqToPoint(t))}distanceSqToPoint(t){const e=mr.subVectors(t,this.origin).dot(this.direction);return e<0?this.origin.distanceToSquared(t):(mr.copy(this.origin).addScaledVector(this.direction,e),mr.distanceToSquared(t))}distanceSqToSegment(t,e,i,s){yr.copy(t).add(e).multiplyScalar(.5),gr.copy(e).sub(t).normalize(),fr.copy(this.origin).sub(yr);const r=.5*t.distanceTo(e),n=-this.direction.dot(gr),a=fr.dot(this.direction),o=-fr.dot(gr),h=fr.lengthSq(),l=Math.abs(1-n*n);let c,u,d,p;if(l>0)if(c=n*o-a,u=n*a-o,p=r*l,c>=0)if(u>=-p)if(u<=p){const t=1/l;c*=t,u*=t,d=c*(c+n*u+2*a)+u*(n*c+u+2*o)+h}else u=r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u=-r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;else u<=-p?(c=Math.max(0,-(-n*r+a)),u=c>0?-r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h):u<=p?(c=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(c=Math.max(0,-(n*r+a)),u=c>0?r:Math.min(Math.max(-r,-o),r),d=-c*c+u*(u+2*o)+h);else u=n>0?-r:r,c=Math.max(0,-(n*u+a)),d=-c*c+u*(u+2*o)+h;return i&&i.copy(this.origin).addScaledVector(this.direction,c),s&&s.copy(yr).addScaledVector(gr,u),d}intersectSphere(t,e){mr.subVectors(t.center,this.origin);const i=mr.dot(this.direction),s=mr.dot(mr)-i*i,r=t.radius*t.radius;if(s>r)return null;const n=Math.sqrt(r-s),a=i-n,o=i+n;return o<0?null:a<0?this.at(o,e):this.at(a,e)}intersectsSphere(t){return!(t.radius<0)&&this.distanceSqToPoint(t.center)<=t.radius*t.radius}distanceToPlane(t){const e=t.normal.dot(this.direction);if(0===e)return 0===t.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(t.normal)+t.constant)/e;return i>=0?i:null}intersectPlane(t,e){const i=this.distanceToPlane(t);return null===i?null:this.at(i,e)}intersectsPlane(t){const e=t.distanceToPoint(this.origin);if(0===e)return!0;return t.normal.dot(this.direction)*e<0}intersectBox(t,e){let i,s,r,n,a,o;const h=1/this.direction.x,l=1/this.direction.y,c=1/this.direction.z,u=this.origin;return h>=0?(i=(t.min.x-u.x)*h,s=(t.max.x-u.x)*h):(i=(t.max.x-u.x)*h,s=(t.min.x-u.x)*h),l>=0?(r=(t.min.y-u.y)*l,n=(t.max.y-u.y)*l):(r=(t.max.y-u.y)*l,n=(t.min.y-u.y)*l),i>n||r>s?null:((r>i||isNaN(i))&&(i=r),(n=0?(a=(t.min.z-u.z)*c,o=(t.max.z-u.z)*c):(a=(t.max.z-u.z)*c,o=(t.min.z-u.z)*c),i>o||a>s?null:((a>i||i!=i)&&(i=a),(o=0?i:s,e)))}intersectsBox(t){return null!==this.intersectBox(t,mr)}intersectTriangle(t,e,i,s,r){xr.subVectors(e,t),br.subVectors(i,t),vr.crossVectors(xr,br);let n,a=this.direction.dot(vr);if(a>0){if(s)return null;n=1}else{if(!(a<0))return null;n=-1,a=-a}fr.subVectors(this.origin,t);const o=n*this.direction.dot(br.crossVectors(fr,br));if(o<0)return null;const h=n*this.direction.dot(xr.cross(fr));if(h<0)return null;if(o+h>a)return null;const l=-n*fr.dot(vr);return l<0?null:this.at(l/a,r)}applyMatrix4(t){return this.origin.applyMatrix4(t),this.direction.transformDirection(t),this}equals(t){return t.origin.equals(this.origin)&&t.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Mr{constructor(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){Mr.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],void 0!==t&&this.set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y)}set(t,e,i,s,r,n,a,o,h,l,c,u,d,p,m,y){const g=this.elements;return g[0]=t,g[4]=e,g[8]=i,g[12]=s,g[1]=r,g[5]=n,g[9]=a,g[13]=o,g[2]=h,g[6]=l,g[10]=c,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=y,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Mr).fromArray(this.elements)}copy(t){const e=this.elements,i=t.elements;return e[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}copyPosition(t){const e=this.elements,i=t.elements;return e[12]=i[12],e[13]=i[13],e[14]=i[14],this}setFromMatrix3(t){const e=t.elements;return this.set(e[0],e[3],e[6],0,e[1],e[4],e[7],0,e[2],e[5],e[8],0,0,0,0,1),this}extractBasis(t,e,i){return 0===this.determinant()?(t.set(1,0,0),e.set(0,1,0),i.set(0,0,1),this):(t.setFromMatrixColumn(this,0),e.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this)}makeBasis(t,e,i){return this.set(t.x,e.x,i.x,0,t.y,e.y,i.y,0,t.z,e.z,i.z,0,0,0,0,1),this}extractRotation(t){if(0===t.determinant())return this.identity();const e=this.elements,i=t.elements,s=1/Sr.setFromMatrixColumn(t,0).length(),r=1/Sr.setFromMatrixColumn(t,1).length(),n=1/Sr.setFromMatrixColumn(t,2).length();return e[0]=i[0]*s,e[1]=i[1]*s,e[2]=i[2]*s,e[3]=0,e[4]=i[4]*r,e[5]=i[5]*r,e[6]=i[6]*r,e[7]=0,e[8]=i[8]*n,e[9]=i[9]*n,e[10]=i[10]*n,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromEuler(t){const e=this.elements,i=t.x,s=t.y,r=t.z,n=Math.cos(i),a=Math.sin(i),o=Math.cos(s),h=Math.sin(s),l=Math.cos(r),c=Math.sin(r);if("XYZ"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=-o*c,e[8]=h,e[1]=i+s*h,e[5]=t-r*h,e[9]=-a*o,e[2]=r-t*h,e[6]=s+i*h,e[10]=n*o}else if("YXZ"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t+r*a,e[4]=s*a-i,e[8]=n*h,e[1]=n*c,e[5]=n*l,e[9]=-a,e[2]=i*a-s,e[6]=r+t*a,e[10]=n*o}else if("ZXY"===t.order){const t=o*l,i=o*c,s=h*l,r=h*c;e[0]=t-r*a,e[4]=-n*c,e[8]=s+i*a,e[1]=i+s*a,e[5]=n*l,e[9]=r-t*a,e[2]=-n*h,e[6]=a,e[10]=n*o}else if("ZYX"===t.order){const t=n*l,i=n*c,s=a*l,r=a*c;e[0]=o*l,e[4]=s*h-i,e[8]=t*h+r,e[1]=o*c,e[5]=r*h+t,e[9]=i*h-s,e[2]=-h,e[6]=a*o,e[10]=n*o}else if("YZX"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=r-t*c,e[8]=s*c+i,e[1]=c,e[5]=n*l,e[9]=-a*l,e[2]=-h*l,e[6]=i*c+s,e[10]=t-r*c}else if("XZY"===t.order){const t=n*o,i=n*h,s=a*o,r=a*h;e[0]=o*l,e[4]=-c,e[8]=h*l,e[1]=t*c+r,e[5]=n*l,e[9]=i*c-s,e[2]=s*c-i,e[6]=a*l,e[10]=r*c+t}return e[3]=0,e[7]=0,e[11]=0,e[12]=0,e[13]=0,e[14]=0,e[15]=1,this}makeRotationFromQuaternion(t){return this.compose(Ar,t,Tr)}lookAt(t,e,i){const s=this.elements;return Ir.subVectors(t,e),0===Ir.lengthSq()&&(Ir.z=1),Ir.normalize(),zr.crossVectors(i,Ir),0===zr.lengthSq()&&(1===Math.abs(i.z)?Ir.x+=1e-4:Ir.z+=1e-4,Ir.normalize(),zr.crossVectors(i,Ir)),zr.normalize(),Cr.crossVectors(Ir,zr),s[0]=zr.x,s[4]=Cr.x,s[8]=Ir.x,s[1]=zr.y,s[5]=Cr.y,s[9]=Ir.y,s[2]=zr.z,s[6]=Cr.z,s[10]=Ir.z,this}multiply(t){return this.multiplyMatrices(this,t)}premultiply(t){return this.multiplyMatrices(t,this)}multiplyMatrices(t,e){const i=t.elements,s=e.elements,r=this.elements,n=i[0],a=i[4],o=i[8],h=i[12],l=i[1],c=i[5],u=i[9],d=i[13],p=i[2],m=i[6],y=i[10],g=i[14],f=i[3],x=i[7],b=i[11],v=i[15],w=s[0],M=s[4],S=s[8],_=s[12],A=s[1],T=s[5],z=s[9],C=s[13],I=s[2],B=s[6],k=s[10],O=s[14],P=s[3],R=s[7],N=s[11],V=s[15];return r[0]=n*w+a*A+o*I+h*P,r[4]=n*M+a*T+o*B+h*R,r[8]=n*S+a*z+o*k+h*N,r[12]=n*_+a*C+o*O+h*V,r[1]=l*w+c*A+u*I+d*P,r[5]=l*M+c*T+u*B+d*R,r[9]=l*S+c*z+u*k+d*N,r[13]=l*_+c*C+u*O+d*V,r[2]=p*w+m*A+y*I+g*P,r[6]=p*M+m*T+y*B+g*R,r[10]=p*S+m*z+y*k+g*N,r[14]=p*_+m*C+y*O+g*V,r[3]=f*w+x*A+b*I+v*P,r[7]=f*M+x*T+b*B+v*R,r[11]=f*S+x*z+b*k+v*N,r[15]=f*_+x*C+b*O+v*V,this}multiplyScalar(t){const e=this.elements;return e[0]*=t,e[4]*=t,e[8]*=t,e[12]*=t,e[1]*=t,e[5]*=t,e[9]*=t,e[13]*=t,e[2]*=t,e[6]*=t,e[10]*=t,e[14]*=t,e[3]*=t,e[7]*=t,e[11]*=t,e[15]*=t,this}determinant(){const t=this.elements,e=t[0],i=t[4],s=t[8],r=t[12],n=t[1],a=t[5],o=t[9],h=t[13],l=t[2],c=t[6],u=t[10],d=t[14],p=t[3],m=t[7],y=t[11],g=t[15],f=o*d-h*u,x=a*d-h*c,b=a*u-o*c,v=n*d-h*l,w=n*u-o*l,M=n*c-a*l;return e*(m*f-y*x+g*b)-i*(p*f-y*v+g*w)+s*(p*x-m*v+g*M)-r*(p*b-m*w+y*M)}transpose(){const t=this.elements;let e;return e=t[1],t[1]=t[4],t[4]=e,e=t[2],t[2]=t[8],t[8]=e,e=t[6],t[6]=t[9],t[9]=e,e=t[3],t[3]=t[12],t[12]=e,e=t[7],t[7]=t[13],t[13]=e,e=t[11],t[11]=t[14],t[14]=e,this}setPosition(t,e,i){const s=this.elements;return t.isVector3?(s[12]=t.x,s[13]=t.y,s[14]=t.z):(s[12]=t,s[13]=e,s[14]=i),this}invert(){const t=this.elements,e=t[0],i=t[1],s=t[2],r=t[3],n=t[4],a=t[5],o=t[6],h=t[7],l=t[8],c=t[9],u=t[10],d=t[11],p=t[12],m=t[13],y=t[14],g=t[15],f=e*a-i*n,x=e*o-s*n,b=e*h-r*n,v=i*o-s*a,w=i*h-r*a,M=s*h-r*o,S=l*m-c*p,_=l*y-u*p,A=l*g-d*p,T=c*y-u*m,z=c*g-d*m,C=u*g-d*y,I=f*C-x*z+b*T+v*A-w*_+M*S;if(0===I)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const B=1/I;return t[0]=(a*C-o*z+h*T)*B,t[1]=(s*z-i*C-r*T)*B,t[2]=(m*M-y*w+g*v)*B,t[3]=(u*w-c*M-d*v)*B,t[4]=(o*A-n*C-h*_)*B,t[5]=(e*C-s*A+r*_)*B,t[6]=(y*b-p*M-g*x)*B,t[7]=(l*M-u*b+d*x)*B,t[8]=(n*z-a*A+h*S)*B,t[9]=(i*A-e*z-r*S)*B,t[10]=(p*w-m*b+g*f)*B,t[11]=(c*b-l*w-d*f)*B,t[12]=(a*_-n*T-o*S)*B,t[13]=(e*T-i*_+s*S)*B,t[14]=(m*x-p*v-y*f)*B,t[15]=(l*v-c*x+u*f)*B,this}scale(t){const e=this.elements,i=t.x,s=t.y,r=t.z;return e[0]*=i,e[4]*=s,e[8]*=r,e[1]*=i,e[5]*=s,e[9]*=r,e[2]*=i,e[6]*=s,e[10]*=r,e[3]*=i,e[7]*=s,e[11]*=r,this}getMaxScaleOnAxis(){const t=this.elements,e=t[0]*t[0]+t[1]*t[1]+t[2]*t[2],i=t[4]*t[4]+t[5]*t[5]+t[6]*t[6],s=t[8]*t[8]+t[9]*t[9]+t[10]*t[10];return Math.sqrt(Math.max(e,i,s))}makeTranslation(t,e,i){return t.isVector3?this.set(1,0,0,t.x,0,1,0,t.y,0,0,1,t.z,0,0,0,1):this.set(1,0,0,t,0,1,0,e,0,0,1,i,0,0,0,1),this}makeRotationX(t){const e=Math.cos(t),i=Math.sin(t);return this.set(1,0,0,0,0,e,-i,0,0,i,e,0,0,0,0,1),this}makeRotationY(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,0,i,0,0,1,0,0,-i,0,e,0,0,0,0,1),this}makeRotationZ(t){const e=Math.cos(t),i=Math.sin(t);return this.set(e,-i,0,0,i,e,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(t,e){const i=Math.cos(e),s=Math.sin(e),r=1-i,n=t.x,a=t.y,o=t.z,h=r*n,l=r*a;return this.set(h*n+i,h*a-s*o,h*o+s*a,0,h*a+s*o,l*a+i,l*o-s*n,0,h*o-s*a,l*o+s*n,r*o*o+i,0,0,0,0,1),this}makeScale(t,e,i){return this.set(t,0,0,0,0,e,0,0,0,0,i,0,0,0,0,1),this}makeShear(t,e,i,s,r,n){return this.set(1,i,r,0,t,1,n,0,e,s,1,0,0,0,0,1),this}compose(t,e,i){const s=this.elements,r=e._x,n=e._y,a=e._z,o=e._w,h=r+r,l=n+n,c=a+a,u=r*h,d=r*l,p=r*c,m=n*l,y=n*c,g=a*c,f=o*h,x=o*l,b=o*c,v=i.x,w=i.y,M=i.z;return s[0]=(1-(m+g))*v,s[1]=(d+b)*v,s[2]=(p-x)*v,s[3]=0,s[4]=(d-b)*w,s[5]=(1-(u+g))*w,s[6]=(y+f)*w,s[7]=0,s[8]=(p+x)*M,s[9]=(y-f)*M,s[10]=(1-(u+m))*M,s[11]=0,s[12]=t.x,s[13]=t.y,s[14]=t.z,s[15]=1,this}decompose(t,e,i){const s=this.elements;t.x=s[12],t.y=s[13],t.z=s[14];const r=this.determinant();if(0===r)return i.set(1,1,1),e.identity(),this;let n=Sr.set(s[0],s[1],s[2]).length();const a=Sr.set(s[4],s[5],s[6]).length(),o=Sr.set(s[8],s[9],s[10]).length();r<0&&(n=-n),_r.copy(this);const h=1/n,l=1/a,c=1/o;return _r.elements[0]*=h,_r.elements[1]*=h,_r.elements[2]*=h,_r.elements[4]*=l,_r.elements[5]*=l,_r.elements[6]*=l,_r.elements[8]*=c,_r.elements[9]*=c,_r.elements[10]*=c,e.setFromRotationMatrix(_r),i.x=n,i.y=a,i.z=o,this}makePerspective(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2*r/(e-t),c=2*r/(i-s),u=(e+t)/(e-t),d=(i+s)/(i-s);let p,m;if(o)p=r/(n-r),m=n*r/(n-r);else if(a===Ui)p=-(n+r)/(n-r),m=-2*n*r/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makePerspective(): Invalid coordinate system: "+a);p=-n/(n-r),m=-n*r/(n-r)}return h[0]=l,h[4]=0,h[8]=u,h[12]=0,h[1]=0,h[5]=c,h[9]=d,h[13]=0,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=-1,h[15]=0,this}makeOrthographic(t,e,i,s,r,n,a=2e3,o=!1){const h=this.elements,l=2/(e-t),c=2/(i-s),u=-(e+t)/(e-t),d=-(i+s)/(i-s);let p,m;if(o)p=1/(n-r),m=n/(n-r);else if(a===Ui)p=-2/(n-r),m=-(n+r)/(n-r);else{if(a!==Wi)throw new Error("THREE.Matrix4.makeOrthographic(): Invalid coordinate system: "+a);p=-1/(n-r),m=-r/(n-r)}return h[0]=l,h[4]=0,h[8]=0,h[12]=u,h[1]=0,h[5]=c,h[9]=0,h[13]=d,h[2]=0,h[6]=0,h[10]=p,h[14]=m,h[3]=0,h[7]=0,h[11]=0,h[15]=1,this}equals(t){const e=this.elements,i=t.elements;for(let t=0;t<16;t++)if(e[t]!==i[t])return!1;return!0}fromArray(t,e=0){for(let i=0;i<16;i++)this.elements[i]=t[i+e];return this}toArray(t=[],e=0){const i=this.elements;return t[e]=i[0],t[e+1]=i[1],t[e+2]=i[2],t[e+3]=i[3],t[e+4]=i[4],t[e+5]=i[5],t[e+6]=i[6],t[e+7]=i[7],t[e+8]=i[8],t[e+9]=i[9],t[e+10]=i[10],t[e+11]=i[11],t[e+12]=i[12],t[e+13]=i[13],t[e+14]=i[14],t[e+15]=i[15],t}}const Sr=new Ss,_r=new Mr,Ar=new Ss(0,0,0),Tr=new Ss(1,1,1),zr=new Ss,Cr=new Ss,Ir=new Ss,Br=new Mr,kr=new Ms;class Or{constructor(t=0,e=0,i=0,s=Or.DEFAULT_ORDER){this.isEuler=!0,this._x=t,this._y=e,this._z=i,this._order=s}get x(){return this._x}set x(t){this._x=t,this._onChangeCallback()}get y(){return this._y}set y(t){this._y=t,this._onChangeCallback()}get z(){return this._z}set z(t){this._z=t,this._onChangeCallback()}get order(){return this._order}set order(t){this._order=t,this._onChangeCallback()}set(t,e,i,s=this._order){return this._x=t,this._y=e,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(t){return this._x=t._x,this._y=t._y,this._z=t._z,this._order=t._order,this._onChangeCallback(),this}setFromRotationMatrix(t,e=this._order,i=!0){const s=t.elements,r=s[0],n=s[4],a=s[8],o=s[1],h=s[5],l=s[9],c=s[2],u=s[6],d=s[10];switch(e){case"XYZ":this._y=Math.asin(ys(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-l,d),this._z=Math.atan2(-n,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-ys(l,-1,1)),Math.abs(l)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-c,r),this._z=0);break;case"ZXY":this._x=Math.asin(ys(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-c,d),this._z=Math.atan2(-n,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-ys(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-n,h));break;case"YZX":this._z=Math.asin(ys(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-l,h),this._y=Math.atan2(-c,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-ys(n,-1,1)),Math.abs(n)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-l,d),this._y=0);break;default:ns("Euler: .setFromRotationMatrix() encountered an unknown order: "+e)}return this._order=e,!0===i&&this._onChangeCallback(),this}setFromQuaternion(t,e,i){return Br.makeRotationFromQuaternion(t),this.setFromRotationMatrix(Br,e,i)}setFromVector3(t,e=this._order){return this.set(t.x,t.y,t.z,e)}reorder(t){return kr.setFromEuler(this),this.setFromQuaternion(kr,t)}equals(t){return t._x===this._x&&t._y===this._y&&t._z===this._z&&t._order===this._order}fromArray(t){return this._x=t[0],this._y=t[1],this._z=t[2],void 0!==t[3]&&(this._order=t[3]),this._onChangeCallback(),this}toArray(t=[],e=0){return t[e]=this._x,t[e+1]=this._y,t[e+2]=this._z,t[e+3]=this._order,t}_onChange(t){return this._onChangeCallback=t,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Or.DEFAULT_ORDER="XYZ";class Pr{constructor(){this.mask=1}set(t){this.mask=1<>>0}enable(t){this.mask|=1<1){for(let t=0;t1){for(let t=0;t0&&(s.userData=this.userData),s.layers=this.layers.mask,s.matrix=this.matrix.toArray(),s.up=this.up.toArray(),null!==this.pivot&&(s.pivot=this.pivot.toArray()),!1===this.matrixAutoUpdate&&(s.matrixAutoUpdate=!1),this.isInstancedMesh&&(s.type="InstancedMesh",s.count=this.count,s.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(s.instanceColor=this.instanceColor.toJSON())),this.isBatchedMesh&&(s.type="BatchedMesh",s.perObjectFrustumCulled=this.perObjectFrustumCulled,s.sortObjects=this.sortObjects,s.drawRanges=this._drawRanges,s.reservedRanges=this._reservedRanges,s.geometryInfo=this._geometryInfo.map(t=>({...t,boundingBox:t.boundingBox?t.boundingBox.toJSON():void 0,boundingSphere:t.boundingSphere?t.boundingSphere.toJSON():void 0})),s.instanceInfo=this._instanceInfo.map(t=>({...t})),s.availableInstanceIds=this._availableInstanceIds.slice(),s.availableGeometryIds=this._availableGeometryIds.slice(),s.nextIndexStart=this._nextIndexStart,s.nextVertexStart=this._nextVertexStart,s.geometryCount=this._geometryCount,s.maxInstanceCount=this._maxInstanceCount,s.maxVertexCount=this._maxVertexCount,s.maxIndexCount=this._maxIndexCount,s.geometryInitialized=this._geometryInitialized,s.matricesTexture=this._matricesTexture.toJSON(t),s.indirectTexture=this._indirectTexture.toJSON(t),null!==this._colorsTexture&&(s.colorsTexture=this._colorsTexture.toJSON(t)),null!==this.boundingSphere&&(s.boundingSphere=this.boundingSphere.toJSON()),null!==this.boundingBox&&(s.boundingBox=this.boundingBox.toJSON())),this.isScene)this.background&&(this.background.isColor?s.background=this.background.toJSON():this.background.isTexture&&(s.background=this.background.toJSON(t).uuid)),this.environment&&this.environment.isTexture&&!0!==this.environment.isRenderTargetTexture&&(s.environment=this.environment.toJSON(t).uuid);else if(this.isMesh||this.isLine||this.isPoints){s.geometry=r(t.geometries,this.geometry);const e=this.geometry.parameters;if(void 0!==e&&void 0!==e.shapes){const i=e.shapes;if(Array.isArray(i))for(let e=0,s=i.length;e0){s.children=[];for(let e=0;e0){s.animations=[];for(let e=0;e0&&(i.geometries=e),s.length>0&&(i.materials=s),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),l.length>0&&(i.animations=l),c.length>0&&(i.nodes=c)}return i.object=s,i;function n(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}}clone(t){return(new this.constructor).copy(this,t)}copy(t,e=!0){if(this.name=t.name,this.up.copy(t.up),this.position.copy(t.position),this.rotation.order=t.rotation.order,this.quaternion.copy(t.quaternion),this.scale.copy(t.scale),null!==t.pivot&&(this.pivot=t.pivot.clone()),this.matrix.copy(t.matrix),this.matrixWorld.copy(t.matrixWorld),this.matrixAutoUpdate=t.matrixAutoUpdate,this.matrixWorldAutoUpdate=t.matrixWorldAutoUpdate,this.matrixWorldNeedsUpdate=t.matrixWorldNeedsUpdate,this.layers.mask=t.layers.mask,this.visible=t.visible,this.castShadow=t.castShadow,this.receiveShadow=t.receiveShadow,this.frustumCulled=t.frustumCulled,this.renderOrder=t.renderOrder,this.static=t.static,this.animations=t.animations.slice(),this.userData=JSON.parse(JSON.stringify(t.userData)),!0===e)for(let e=0;e0?s.multiplyScalar(1/Math.sqrt(r)):s.set(0,0,0)}static getBarycoord(t,e,i,s,r){Gr.subVectors(s,e),$r.subVectors(i,e),Qr.subVectors(t,e);const n=Gr.dot(Gr),a=Gr.dot($r),o=Gr.dot(Qr),h=$r.dot($r),l=$r.dot(Qr),c=n*h-a*a;if(0===c)return r.set(0,0,0),null;const u=1/c,d=(h*o-a*l)*u,p=(n*l-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(t,e,i,s){return null!==this.getBarycoord(t,e,i,s,Kr)&&(Kr.x>=0&&Kr.y>=0&&Kr.x+Kr.y<=1)}static getInterpolation(t,e,i,s,r,n,a,o){return null===this.getBarycoord(t,e,i,s,Kr)?(o.x=0,o.y=0,"z"in o&&(o.z=0),"w"in o&&(o.w=0),null):(o.setScalar(0),o.addScaledVector(r,Kr.x),o.addScaledVector(n,Kr.y),o.addScaledVector(a,Kr.z),o)}static getInterpolatedAttribute(t,e,i,s,r,n){return on.setScalar(0),hn.setScalar(0),ln.setScalar(0),on.fromBufferAttribute(t,e),hn.fromBufferAttribute(t,i),ln.fromBufferAttribute(t,s),n.setScalar(0),n.addScaledVector(on,r.x),n.addScaledVector(hn,r.y),n.addScaledVector(ln,r.z),n}static isFrontFacing(t,e,i,s){return Gr.subVectors(i,e),$r.subVectors(t,e),Gr.cross($r).dot(s)<0}set(t,e,i){return this.a.copy(t),this.b.copy(e),this.c.copy(i),this}setFromPointsAndIndices(t,e,i,s){return this.a.copy(t[e]),this.b.copy(t[i]),this.c.copy(t[s]),this}setFromAttributeAndIndices(t,e,i,s){return this.a.fromBufferAttribute(t,e),this.b.fromBufferAttribute(t,i),this.c.fromBufferAttribute(t,s),this}clone(){return(new this.constructor).copy(this)}copy(t){return this.a.copy(t.a),this.b.copy(t.b),this.c.copy(t.c),this}getArea(){return Gr.subVectors(this.c,this.b),$r.subVectors(this.a,this.b),.5*Gr.cross($r).length()}getMidpoint(t){return t.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(t){return cn.getNormal(this.a,this.b,this.c,t)}getPlane(t){return t.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(t,e){return cn.getBarycoord(t,this.a,this.b,this.c,e)}getInterpolation(t,e,i,s,r){return cn.getInterpolation(t,this.a,this.b,this.c,e,i,s,r)}containsPoint(t){return cn.containsPoint(t,this.a,this.b,this.c)}isFrontFacing(t){return cn.isFrontFacing(this.a,this.b,this.c,t)}intersectsBox(t){return t.intersectsTriangle(this)}closestPointToPoint(t,e){const i=this.a,s=this.b,r=this.c;let n,a;tn.subVectors(s,i),en.subVectors(r,i),rn.subVectors(t,i);const o=tn.dot(rn),h=en.dot(rn);if(o<=0&&h<=0)return e.copy(i);nn.subVectors(t,s);const l=tn.dot(nn),c=en.dot(nn);if(l>=0&&c<=l)return e.copy(s);const u=o*c-l*h;if(u<=0&&o>=0&&l<=0)return n=o/(o-l),e.copy(i).addScaledVector(tn,n);an.subVectors(t,r);const d=tn.dot(an),p=en.dot(an);if(p>=0&&d<=p)return e.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),e.copy(i).addScaledVector(en,a);const y=l*p-d*c;if(y<=0&&c-l>=0&&d-p>=0)return sn.subVectors(r,s),a=(c-l)/(c-l+(d-p)),e.copy(s).addScaledVector(sn,a);const g=1/(y+m+u);return n=m*g,a=u*g,e.copy(i).addScaledVector(tn,n).addScaledVector(en,a)}equals(t){return t.a.equals(this.a)&&t.b.equals(this.b)&&t.c.equals(this.c)}}const un={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},dn={h:0,s:0,l:0},pn={h:0,s:0,l:0};function mn(t,e,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?t+6*(e-t)*i:i<.5?e:i<2/3?t+6*(e-t)*(2/3-i):t}class yn{constructor(t,e,i){return this.isColor=!0,this.r=1,this.g=1,this.b=1,this.set(t,e,i)}set(t,e,i){if(void 0===e&&void 0===i){const e=t;e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e)}else this.setRGB(t,e,i);return this}setScalar(t){return this.r=t,this.g=t,this.b=t,this}setHex(t,e=ti){return t=Math.floor(t),this.r=(t>>16&255)/255,this.g=(t>>8&255)/255,this.b=(255&t)/255,ks.colorSpaceToWorking(this,e),this}setRGB(t,e,i,s=ks.workingColorSpace){return this.r=t,this.g=e,this.b=i,ks.colorSpaceToWorking(this,s),this}setHSL(t,e,i,s=ks.workingColorSpace){if(t=gs(t,1),e=ys(e,0,1),i=ys(i,0,1),0===e)this.r=this.g=this.b=i;else{const s=i<=.5?i*(1+e):i+e-i*e,r=2*i-s;this.r=mn(r,s,t+1/3),this.g=mn(r,s,t),this.b=mn(r,s,t-1/3)}return ks.colorSpaceToWorking(this,s),this}setStyle(t,e=ti){function i(e){void 0!==e&&parseFloat(e)<1&&ns("Color: Alpha component of "+t+" will be ignored.")}let s;if(s=/^(\w+)\(([^\)]*)\)/.exec(t)){let r;const n=s[1],a=s[2];switch(n){case"rgb":case"rgba":if(r=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(255,parseInt(r[1],10))/255,Math.min(255,parseInt(r[2],10))/255,Math.min(255,parseInt(r[3],10))/255,e);if(r=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setRGB(Math.min(100,parseInt(r[1],10))/100,Math.min(100,parseInt(r[2],10))/100,Math.min(100,parseInt(r[3],10))/100,e);break;case"hsl":case"hsla":if(r=/^\s*(\d*\.?\d+)\s*,\s*(\d*\.?\d+)\%\s*,\s*(\d*\.?\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(a))return i(r[4]),this.setHSL(parseFloat(r[1])/360,parseFloat(r[2])/100,parseFloat(r[3])/100,e);break;default:ns("Color: Unknown color model "+t)}}else if(s=/^\#([A-Fa-f\d]+)$/.exec(t)){const i=s[1],r=i.length;if(3===r)return this.setRGB(parseInt(i.charAt(0),16)/15,parseInt(i.charAt(1),16)/15,parseInt(i.charAt(2),16)/15,e);if(6===r)return this.setHex(parseInt(i,16),e);ns("Color: Invalid hex color "+t)}else if(t&&t.length>0)return this.setColorName(t,e);return this}setColorName(t,e=ti){const i=un[t.toLowerCase()];return void 0!==i?this.setHex(i,e):ns("Color: Unknown color "+t),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(t){return this.r=t.r,this.g=t.g,this.b=t.b,this}copySRGBToLinear(t){return this.r=Os(t.r),this.g=Os(t.g),this.b=Os(t.b),this}copyLinearToSRGB(t){return this.r=Ps(t.r),this.g=Ps(t.g),this.b=Ps(t.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(t=ti){return ks.workingToColorSpace(gn.copy(this),t),65536*Math.round(ys(255*gn.r,0,255))+256*Math.round(ys(255*gn.g,0,255))+Math.round(ys(255*gn.b,0,255))}getHexString(t=ti){return("000000"+this.getHex(t).toString(16)).slice(-6)}getHSL(t,e=ks.workingColorSpace){ks.workingToColorSpace(gn.copy(this),e);const i=gn.r,s=gn.g,r=gn.b,n=Math.max(i,s,r),a=Math.min(i,s,r);let o,h;const l=(a+n)/2;if(a===n)o=0,h=0;else{const t=n-a;switch(h=l<=.5?t/(n+a):t/(2-n-a),n){case i:o=(s-r)/t+(s0!=t>0&&this.version++,this._alphaTest=t}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(t){if(void 0!==t)for(const e in t){const i=t[e];if(void 0===i){ns(`Material: parameter '${e}' has value of undefined.`);continue}const s=this[e];void 0!==s?s&&s.isColor?s.set(i):s&&s.isVector3&&i&&i.isVector3?s.copy(i):this[e]=i:ns(`Material: '${e}' is not a property of THREE.${this.type}.`)}}toJSON(t){const e=void 0===t||"string"==typeof t;e&&(t={textures:{},images:{}});const i={metadata:{version:4.7,type:"Material",generator:"Material.toJSON"}};function s(t){const e=[];for(const i in t){const s=t[i];delete s.metadata,e.push(s)}return e}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),void 0!==this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(t).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(t).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(t).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.sheenColorMap&&this.sheenColorMap.isTexture&&(i.sheenColorMap=this.sheenColorMap.toJSON(t).uuid),this.sheenRoughnessMap&&this.sheenRoughnessMap.isTexture&&(i.sheenRoughnessMap=this.sheenRoughnessMap.toJSON(t).uuid),void 0!==this.dispersion&&(i.dispersion=this.dispersion),void 0!==this.iridescence&&(i.iridescence=this.iridescence),void 0!==this.iridescenceIOR&&(i.iridescenceIOR=this.iridescenceIOR),void 0!==this.iridescenceThicknessRange&&(i.iridescenceThicknessRange=this.iridescenceThicknessRange),this.iridescenceMap&&this.iridescenceMap.isTexture&&(i.iridescenceMap=this.iridescenceMap.toJSON(t).uuid),this.iridescenceThicknessMap&&this.iridescenceThicknessMap.isTexture&&(i.iridescenceThicknessMap=this.iridescenceThicknessMap.toJSON(t).uuid),void 0!==this.anisotropy&&(i.anisotropy=this.anisotropy),void 0!==this.anisotropyRotation&&(i.anisotropyRotation=this.anisotropyRotation),this.anisotropyMap&&this.anisotropyMap.isTexture&&(i.anisotropyMap=this.anisotropyMap.toJSON(t).uuid),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(t).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(t).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(t).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(t).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(t).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(t).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(t).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(t).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(t).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(t).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(t).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(t).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(t).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(t).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(t).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapRotation&&(i.envMapRotation=this.envMapRotation.toArray()),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(t).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(t).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(t).uuid),void 0!==this.attenuationDistance&&this.attenuationDistance!==1/0&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),!0===this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),!0===this.transparent&&(i.transparent=!0),204!==this.blendSrc&&(i.blendSrc=this.blendSrc),205!==this.blendDst&&(i.blendDst=this.blendDst),100!==this.blendEquation&&(i.blendEquation=this.blendEquation),null!==this.blendSrcAlpha&&(i.blendSrcAlpha=this.blendSrcAlpha),null!==this.blendDstAlpha&&(i.blendDstAlpha=this.blendDstAlpha),null!==this.blendEquationAlpha&&(i.blendEquationAlpha=this.blendEquationAlpha),this.blendColor&&this.blendColor.isColor&&(i.blendColor=this.blendColor.getHex()),0!==this.blendAlpha&&(i.blendAlpha=this.blendAlpha),3!==this.depthFunc&&(i.depthFunc=this.depthFunc),!1===this.depthTest&&(i.depthTest=this.depthTest),!1===this.depthWrite&&(i.depthWrite=this.depthWrite),!1===this.colorWrite&&(i.colorWrite=this.colorWrite),255!==this.stencilWriteMask&&(i.stencilWriteMask=this.stencilWriteMask),519!==this.stencilFunc&&(i.stencilFunc=this.stencilFunc),0!==this.stencilRef&&(i.stencilRef=this.stencilRef),255!==this.stencilFuncMask&&(i.stencilFuncMask=this.stencilFuncMask),this.stencilFail!==hi&&(i.stencilFail=this.stencilFail),this.stencilZFail!==hi&&(i.stencilZFail=this.stencilZFail),this.stencilZPass!==hi&&(i.stencilZPass=this.stencilZPass),!0===this.stencilWrite&&(i.stencilWrite=this.stencilWrite),void 0!==this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),void 0!==this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaHash&&(i.alphaHash=!0),!0===this.alphaToCoverage&&(i.alphaToCoverage=!0),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=!0),!0===this.forceSinglePass&&(i.forceSinglePass=!0),!1===this.allowOverride&&(i.allowOverride=!1),!0===this.wireframe&&(i.wireframe=!0),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=!0),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),!1===this.fog&&(i.fog=!1),Object.keys(this.userData).length>0&&(i.userData=this.userData),e){const e=s(t.textures),r=s(t.images);e.length>0&&(i.textures=e),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(t){this.name=t.name,this.blending=t.blending,this.side=t.side,this.vertexColors=t.vertexColors,this.opacity=t.opacity,this.transparent=t.transparent,this.blendSrc=t.blendSrc,this.blendDst=t.blendDst,this.blendEquation=t.blendEquation,this.blendSrcAlpha=t.blendSrcAlpha,this.blendDstAlpha=t.blendDstAlpha,this.blendEquationAlpha=t.blendEquationAlpha,this.blendColor.copy(t.blendColor),this.blendAlpha=t.blendAlpha,this.depthFunc=t.depthFunc,this.depthTest=t.depthTest,this.depthWrite=t.depthWrite,this.stencilWriteMask=t.stencilWriteMask,this.stencilFunc=t.stencilFunc,this.stencilRef=t.stencilRef,this.stencilFuncMask=t.stencilFuncMask,this.stencilFail=t.stencilFail,this.stencilZFail=t.stencilZFail,this.stencilZPass=t.stencilZPass,this.stencilWrite=t.stencilWrite;const e=t.clippingPlanes;let i=null;if(null!==e){const t=e.length;i=new Array(t);for(let s=0;s!==t;++s)i[s]=e[s].clone()}return this.clippingPlanes=i,this.clipIntersection=t.clipIntersection,this.clipShadows=t.clipShadows,this.shadowSide=t.shadowSide,this.colorWrite=t.colorWrite,this.precision=t.precision,this.polygonOffset=t.polygonOffset,this.polygonOffsetFactor=t.polygonOffsetFactor,this.polygonOffsetUnits=t.polygonOffsetUnits,this.dithering=t.dithering,this.alphaTest=t.alphaTest,this.alphaHash=t.alphaHash,this.alphaToCoverage=t.alphaToCoverage,this.premultipliedAlpha=t.premultipliedAlpha,this.forceSinglePass=t.forceSinglePass,this.allowOverride=t.allowOverride,this.visible=t.visible,this.toneMapped=t.toneMapped,this.userData=JSON.parse(JSON.stringify(t.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(t){!0===t&&this.version++}}class bn extends xn{constructor(t){super(),this.isMeshBasicMaterial=!0,this.type="MeshBasicMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}const vn=wn();function wn(){const t=new ArrayBuffer(4),e=new Float32Array(t),i=new Uint32Array(t),s=new Uint32Array(512),r=new Uint32Array(512);for(let t=0;t<256;++t){const e=t-127;e<-27?(s[t]=0,s[256|t]=32768,r[t]=24,r[256|t]=24):e<-14?(s[t]=1024>>-e-14,s[256|t]=1024>>-e-14|32768,r[t]=-e-1,r[256|t]=-e-1):e<=15?(s[t]=e+15<<10,s[256|t]=e+15<<10|32768,r[t]=13,r[256|t]=13):e<128?(s[t]=31744,s[256|t]=64512,r[t]=24,r[256|t]=24):(s[t]=31744,s[256|t]=64512,r[t]=13,r[256|t]=13)}const n=new Uint32Array(2048),a=new Uint32Array(64),o=new Uint32Array(64);for(let t=1;t<1024;++t){let e=t<<13,i=0;for(;!(8388608&e);)e<<=1,i-=8388608;e&=-8388609,i+=947912704,n[t]=e|i}for(let t=1024;t<2048;++t)n[t]=939524096+(t-1024<<13);for(let t=1;t<31;++t)a[t]=t<<23;a[31]=1199570944,a[32]=2147483648;for(let t=33;t<63;++t)a[t]=2147483648+(t-32<<23);a[63]=3347054592;for(let t=1;t<64;++t)32!==t&&(o[t]=1024);return{floatView:e,uint32View:i,baseTable:s,shiftTable:r,mantissaTable:n,exponentTable:a,offsetTable:o}}function Mn(t){Math.abs(t)>65504&&ns("DataUtils.toHalfFloat(): Value out of range."),t=ys(t,-65504,65504),vn.floatView[0]=t;const e=vn.uint32View[0],i=e>>23&511;return vn.baseTable[i]+((8388607&e)>>vn.shiftTable[i])}function Sn(t){const e=t>>10;return vn.uint32View[0]=vn.mantissaTable[vn.offsetTable[e]+(1023&t)]+vn.exponentTable[e],vn.floatView[0]}class _n{static toHalfFloat(t){return Mn(t)}static fromHalfFloat(t){return Sn(t)}}const An=new Ss,Tn=new ws;let zn=0;class Cn{constructor(t,e,i=!1){if(Array.isArray(t))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.isBufferAttribute=!0,Object.defineProperty(this,"id",{value:zn++}),this.name="",this.array=t,this.itemSize=e,this.count=void 0!==t?t.length/e:0,this.normalized=i,this.usage=ki,this.updateRanges=[],this.gpuType=Pt,this.version=0}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.name=t.name,this.array=new t.array.constructor(t.array),this.itemSize=t.itemSize,this.count=t.count,this.normalized=t.normalized,this.usage=t.usage,this.gpuType=t.gpuType,this}copyAt(t,e,i){t*=this.itemSize,i*=e.itemSize;for(let s=0,r=this.itemSize;se.count&&ns("BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry."),e.needsUpdate=!0}return this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.attributes.position,e=this.morphAttributes.position;if(t&&t.isGLBufferAttribute)return as("BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.",this),void this.boundingBox.set(new Ss(-1/0,-1/0,-1/0),new Ss(1/0,1/0,1/0));if(void 0!==t){if(this.boundingBox.setFromBufferAttribute(t),e)for(let t=0,i=e.length;t0&&(t.userData=this.userData),void 0!==this.parameters){const e=this.parameters;for(const i in e)void 0!==e[i]&&(t[i]=e[i]);return t}t.data={attributes:{}};const e=this.index;null!==e&&(t.data.index={type:e.array.constructor.name,array:Array.prototype.slice.call(e.array)});const i=this.attributes;for(const e in i){const s=i[e];t.data.attributes[e]=s.toJSON(t.data)}const s={};let r=!1;for(const e in this.morphAttributes){const i=this.morphAttributes[e],n=[];for(let e=0,s=i.length;e0&&(s[e]=n,r=!0)}r&&(t.data.morphAttributes=s,t.data.morphTargetsRelative=this.morphTargetsRelative);const n=this.groups;n.length>0&&(t.data.groups=JSON.parse(JSON.stringify(n)));const a=this.boundingSphere;return null!==a&&(t.data.boundingSphere=a.toJSON()),t}clone(){return(new this.constructor).copy(this)}copy(t){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const e={};this.name=t.name;const i=t.index;null!==i&&this.setIndex(i.clone());const s=t.attributes;for(const t in s){const i=s[t];this.setAttribute(t,i.clone(e))}const r=t.morphAttributes;for(const t in r){const i=[],s=r[t];for(let t=0,r=s.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;t(t.far-t.near)**2)return}Xn.copy(r).invert(),Yn.copy(t.ray).applyMatrix4(Xn),null!==i.boundingBox&&!1===Yn.intersectsBox(i.boundingBox)||this._computeIntersections(t,e,Yn)}}_computeIntersections(t,e,i){let s;const r=this.geometry,n=this.material,a=r.index,o=r.attributes.position,h=r.attributes.uv,l=r.attributes.uv1,c=r.attributes.normal,u=r.groups,d=r.drawRange;if(null!==a)if(Array.isArray(n))for(let r=0,o=u.length;ri.far?null:{distance:l,point:ia.clone(),object:t}}(t,e,i,s,Gn,$n,Qn,ea);if(c){const t=new Ss;cn.getBarycoord(ea,Gn,$n,Qn,t),r&&(c.uv=cn.getInterpolatedAttribute(r,o,h,l,t,new ws)),n&&(c.uv1=cn.getInterpolatedAttribute(n,o,h,l,t,new ws)),a&&(c.normal=cn.getInterpolatedAttribute(a,o,h,l,t,new Ss),c.normal.dot(s.direction)>0&&c.normal.multiplyScalar(-1));const e={a:o,b:h,c:l,normal:new Ss,materialIndex:0};cn.getNormal(Gn,$n,Qn,e.normal),c.face=e,c.barycoord=t}return c}class na extends Jn{constructor(t=1,e=1,i=1,s=1,r=1,n=1){super(),this.type="BoxGeometry",this.parameters={width:t,height:e,depth:i,widthSegments:s,heightSegments:r,depthSegments:n};const a=this;s=Math.floor(s),r=Math.floor(r),n=Math.floor(n);const o=[],h=[],l=[],c=[];let u=0,d=0;function p(t,e,i,s,r,n,p,m,y,g,f){const x=n/y,b=p/g,v=n/2,w=p/2,M=m/2,S=y+1,_=g+1;let A=0,T=0;const z=new Ss;for(let n=0;n<_;n++){const a=n*b-w;for(let o=0;o0?1:-1,l.push(z.x,z.y,z.z),c.push(o/y),c.push(1-n/g),A+=1}}for(let t=0;t0&&(e.defines=this.defines),e.vertexShader=this.vertexShader,e.fragmentShader=this.fragmentShader,e.lights=this.lights,e.clipping=this.clipping;const i={};for(const t in this.extensions)!0===this.extensions[t]&&(i[t]=!0);return Object.keys(i).length>0&&(e.extensions=i),e}}class ua extends Hr{constructor(){super(),this.isCamera=!0,this.type="Camera",this.matrixWorldInverse=new Mr,this.projectionMatrix=new Mr,this.projectionMatrixInverse=new Mr,this.coordinateSystem=Ui,this._reversedDepth=!1}get reversedDepth(){return this._reversedDepth}copy(t,e){return super.copy(t,e),this.matrixWorldInverse.copy(t.matrixWorldInverse),this.projectionMatrix.copy(t.projectionMatrix),this.projectionMatrixInverse.copy(t.projectionMatrixInverse),this.coordinateSystem=t.coordinateSystem,this}getWorldDirection(t){return super.getWorldDirection(t).negate()}updateMatrixWorld(t){super.updateMatrixWorld(t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(t,e){super.updateWorldMatrix(t,e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}const da=new Ss,pa=new ws,ma=new ws;class ya extends ua{constructor(t=50,e=1,i=.1,s=2e3){super(),this.isPerspectiveCamera=!0,this.type="PerspectiveCamera",this.fov=t,this.zoom=1,this.near=i,this.far=s,this.focus=10,this.aspect=e,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(t,e){return super.copy(t,e),this.fov=t.fov,this.zoom=t.zoom,this.near=t.near,this.far=t.far,this.focus=t.focus,this.aspect=t.aspect,this.view=null===t.view?null:Object.assign({},t.view),this.filmGauge=t.filmGauge,this.filmOffset=t.filmOffset,this}setFocalLength(t){const e=.5*this.getFilmHeight()/t;this.fov=2*ps*Math.atan(e),this.updateProjectionMatrix()}getFocalLength(){const t=Math.tan(.5*ds*this.fov);return.5*this.getFilmHeight()/t}getEffectiveFOV(){return 2*ps*Math.atan(Math.tan(.5*ds*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}getViewBounds(t,e,i){da.set(-1,-1,.5).applyMatrix4(this.projectionMatrixInverse),e.set(da.x,da.y).multiplyScalar(-t/da.z),da.set(1,1,.5).applyMatrix4(this.projectionMatrixInverse),i.set(da.x,da.y).multiplyScalar(-t/da.z)}getViewSize(t,e){return this.getViewBounds(t,pa,ma),e.subVectors(ma,pa)}setViewOffset(t,e,i,s,r,n){this.aspect=t/e,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=t,this.view.fullHeight=e,this.view.offsetX=i,this.view.offsetY=s,this.view.width=r,this.view.height=n,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const t=this.near;let e=t*Math.tan(.5*ds*this.fov)/this.zoom,i=2*e,s=this.aspect*i,r=-.5*s;const n=this.view;if(null!==this.view&&this.view.enabled){const t=n.fullWidth,a=n.fullHeight;r+=n.offsetX*s/t,e-=n.offsetY*i/a,s*=n.width/t,i*=n.height/a}const a=this.filmOffset;0!==a&&(r+=t*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+s,e,e-i,t,this.far,this.coordinateSystem,this.reversedDepth),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(t){const e=super.toJSON(t);return e.object.fov=this.fov,e.object.zoom=this.zoom,e.object.near=this.near,e.object.far=this.far,e.object.focus=this.focus,e.object.aspect=this.aspect,null!==this.view&&(e.object.view=Object.assign({},this.view)),e.object.filmGauge=this.filmGauge,e.object.filmOffset=this.filmOffset,e}}const ga=-90;class fa extends Hr{constructor(t,e,i){super(),this.type="CubeCamera",this.renderTarget=i,this.coordinateSystem=null,this.activeMipmapLevel=0;const s=new ya(ga,1,t,e);s.layers=this.layers,this.add(s);const r=new ya(ga,1,t,e);r.layers=this.layers,this.add(r);const n=new ya(ga,1,t,e);n.layers=this.layers,this.add(n);const a=new ya(ga,1,t,e);a.layers=this.layers,this.add(a);const o=new ya(ga,1,t,e);o.layers=this.layers,this.add(o);const h=new ya(ga,1,t,e);h.layers=this.layers,this.add(h)}updateCoordinateSystem(){const t=this.coordinateSystem,e=this.children.concat(),[i,s,r,n,a,o]=e;for(const t of e)this.remove(t);if(t===Ui)i.up.set(0,1,0),i.lookAt(1,0,0),s.up.set(0,1,0),s.lookAt(-1,0,0),r.up.set(0,0,-1),r.lookAt(0,1,0),n.up.set(0,0,1),n.lookAt(0,-1,0),a.up.set(0,1,0),a.lookAt(0,0,1),o.up.set(0,1,0),o.lookAt(0,0,-1);else{if(t!==Wi)throw new Error("THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: "+t);i.up.set(0,-1,0),i.lookAt(-1,0,0),s.up.set(0,-1,0),s.lookAt(1,0,0),r.up.set(0,0,1),r.lookAt(0,1,0),n.up.set(0,0,-1),n.lookAt(0,-1,0),a.up.set(0,-1,0),a.lookAt(0,0,1),o.up.set(0,-1,0),o.lookAt(0,0,-1)}for(const t of e)this.add(t),t.updateMatrixWorld()}update(t,e){null===this.parent&&this.updateMatrixWorld();const{renderTarget:i,activeMipmapLevel:s}=this;this.coordinateSystem!==t.coordinateSystem&&(this.coordinateSystem=t.coordinateSystem,this.updateCoordinateSystem());const[r,n,a,o,h,l]=this.children,c=t.getRenderTarget(),u=t.getActiveCubeFace(),d=t.getActiveMipmapLevel(),p=t.xr.enabled;t.xr.enabled=!1;const m=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,t.setRenderTarget(i,0,s),t.render(e,r),t.setRenderTarget(i,1,s),t.render(e,n),t.setRenderTarget(i,2,s),t.render(e,a),t.setRenderTarget(i,3,s),t.render(e,o),t.setRenderTarget(i,4,s),t.render(e,h),i.texture.generateMipmaps=m,t.setRenderTarget(i,5,s),t.render(e,l),t.setRenderTarget(c,u,d),t.xr.enabled=p,i.texture.needsPMREMUpdate=!0}}class xa extends Ds{constructor(t=[],e=301,i,s,r,n,a,o,h,l){super(t,e,i,s,r,n,a,o,h,l),this.isCubeTexture=!0,this.flipY=!1}get images(){return this.image}set images(t){this.image=t}}class ba extends qs{constructor(t=1,e={}){super(t,t,e),this.isWebGLCubeRenderTarget=!0;const i={width:t,height:t,depth:1},s=[i,i,i,i,i,i];this.texture=new xa(s),this._setTextureOptions(e),this.texture.isRenderTargetTexture=!0}fromEquirectangularTexture(t,e){this.texture.type=e.type,this.texture.colorSpace=e.colorSpace,this.texture.generateMipmaps=e.generateMipmaps,this.texture.minFilter=e.minFilter,this.texture.magFilter=e.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include \n\t\t\t\t\t#include \n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include \n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},s=new na(5,5,5),r=new ca({name:"CubemapFromEquirect",uniforms:aa(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=e;const n=new sa(s,r),a=e.minFilter;e.minFilter===At&&(e.minFilter=Mt);return new fa(1,10,this).update(t,n),e.minFilter=a,n.geometry.dispose(),n.material.dispose(),this}clear(t,e=!0,i=!0,s=!0){const r=t.getRenderTarget();for(let r=0;r<6;r++)t.setRenderTarget(this,r),t.clear(e,i,s);t.setRenderTarget(r)}}class va extends Hr{constructor(){super(),this.isGroup=!0,this.type="Group"}}const wa={type:"move"};class Ma{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new va,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new va,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ss,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ss),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new va,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ss,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ss),this._grip}dispatchEvent(t){return null!==this._targetRay&&this._targetRay.dispatchEvent(t),null!==this._grip&&this._grip.dispatchEvent(t),null!==this._hand&&this._hand.dispatchEvent(t),this}connect(t){if(t&&t.hand){const e=this._hand;if(e)for(const i of t.hand.values())this._getHandJoint(e,i)}return this.dispatchEvent({type:"connected",data:t}),this}disconnect(t){return this.dispatchEvent({type:"disconnected",data:t}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(t,e,i){let s=null,r=null,n=null;const a=this._targetRay,o=this._grip,h=this._hand;if(t&&"visible-blurred"!==e.session.visibilityState){if(h&&t.hand){n=!0;for(const s of t.hand.values()){const t=e.getJointPose(s,i),r=this._getHandJoint(h,s);null!==t&&(r.matrix.fromArray(t.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.matrixWorldNeedsUpdate=!0,r.jointRadius=t.radius),r.visible=null!==t}const s=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=s.position.distanceTo(r.position),o=.02,l=.005;h.inputState.pinching&&a>o+l?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:t.handedness,target:this})):!h.inputState.pinching&&a<=o-l&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:t.handedness,target:this}))}else null!==o&&t.gripSpace&&(r=e.getPose(t.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),o.matrixWorldNeedsUpdate=!0,r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));null!==a&&(s=e.getPose(t.targetRaySpace,i),null===s&&null!==r&&(s=r),null!==s&&(a.matrix.fromArray(s.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),a.matrixWorldNeedsUpdate=!0,s.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(s.linearVelocity)):a.hasLinearVelocity=!1,s.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(s.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(wa)))}return null!==a&&(a.visible=null!==s),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==n),this}_getHandJoint(t,e){if(void 0===t.joints[e.jointName]){const i=new va;i.matrixAutoUpdate=!1,i.visible=!1,t.joints[e.jointName]=i,t.add(i)}return t.joints[e.jointName]}}class Sa{constructor(t,e=25e-5){this.isFogExp2=!0,this.name="",this.color=new yn(t),this.density=e}clone(){return new Sa(this.color,this.density)}toJSON(){return{type:"FogExp2",name:this.name,color:this.color.getHex(),density:this.density}}}class _a{constructor(t,e=1,i=1e3){this.isFog=!0,this.name="",this.color=new yn(t),this.near=e,this.far=i}clone(){return new _a(this.color,this.near,this.far)}toJSON(){return{type:"Fog",name:this.name,color:this.color.getHex(),near:this.near,far:this.far}}}class Aa extends Hr{constructor(){super(),this.isScene=!0,this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.backgroundBlurriness=0,this.backgroundIntensity=1,this.backgroundRotation=new Or,this.environmentIntensity=1,this.environmentRotation=new Or,this.overrideMaterial=null,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(t,e){return super.copy(t,e),null!==t.background&&(this.background=t.background.clone()),null!==t.environment&&(this.environment=t.environment.clone()),null!==t.fog&&(this.fog=t.fog.clone()),this.backgroundBlurriness=t.backgroundBlurriness,this.backgroundIntensity=t.backgroundIntensity,this.backgroundRotation.copy(t.backgroundRotation),this.environmentIntensity=t.environmentIntensity,this.environmentRotation.copy(t.environmentRotation),null!==t.overrideMaterial&&(this.overrideMaterial=t.overrideMaterial.clone()),this.matrixAutoUpdate=t.matrixAutoUpdate,this}toJSON(t){const e=super.toJSON(t);return null!==this.fog&&(e.object.fog=this.fog.toJSON()),this.backgroundBlurriness>0&&(e.object.backgroundBlurriness=this.backgroundBlurriness),1!==this.backgroundIntensity&&(e.object.backgroundIntensity=this.backgroundIntensity),e.object.backgroundRotation=this.backgroundRotation.toArray(),1!==this.environmentIntensity&&(e.object.environmentIntensity=this.environmentIntensity),e.object.environmentRotation=this.environmentRotation.toArray(),e}}class Ta{constructor(t,e){this.isInterleavedBuffer=!0,this.array=t,this.stride=e,this.count=void 0!==t?t.length/e:0,this.usage=ki,this.updateRanges=[],this.version=0,this.uuid=ms()}onUploadCallback(){}set needsUpdate(t){!0===t&&this.version++}setUsage(t){return this.usage=t,this}addUpdateRange(t,e){this.updateRanges.push({start:t,count:e})}clearUpdateRanges(){this.updateRanges.length=0}copy(t){return this.array=new t.array.constructor(t.array),this.count=t.count,this.stride=t.stride,this.usage=t.usage,this}copyAt(t,e,i){t*=this.stride,i*=e.stride;for(let s=0,r=this.stride;st.far||e.push({distance:o,point:ka.clone(),uv:cn.getInterpolation(ka,Fa,Ea,La,ja,Da,Ua,new ws),face:null,object:this})}copy(t,e){return super.copy(t,e),void 0!==t.center&&this.center.copy(t.center),this.material=t.material,this}}function qa(t,e,i,s,r,n){Ra.subVectors(t,i).addScalar(.5).multiply(s),void 0!==r?(Na.x=n*Ra.x-r*Ra.y,Na.y=r*Ra.x+n*Ra.y):Na.copy(Ra),t.copy(e),t.x+=Na.x,t.y+=Na.y,t.applyMatrix4(Va)}const Ja=new Ss,Xa=new Ss;class Ya extends Hr{constructor(){super(),this.isLOD=!0,this._currentLevel=0,this.type="LOD",Object.defineProperties(this,{levels:{enumerable:!0,value:[]}}),this.autoUpdate=!0}copy(t){super.copy(t,!1);const e=t.levels;for(let t=0,i=e.length;t0){let i,s;for(i=1,s=e.length;i0){Ja.setFromMatrixPosition(this.matrixWorld);const i=t.ray.origin.distanceTo(Ja);this.getObjectForDistance(i).raycast(t,e)}}update(t){const e=this.levels;if(e.length>1){Ja.setFromMatrixPosition(t.matrixWorld),Xa.setFromMatrixPosition(this.matrixWorld);const i=Ja.distanceTo(Xa)/t.zoom;let s,r;for(e[0].object.visible=!0,s=1,r=e.length;s=t))break;e[s-1].object.visible=!1,e[s].object.visible=!0}for(this._currentLevel=s-1;s1?null:e.copy(t.start).addScaledVector(i,r)}intersectsLine(t){const e=this.distanceToPoint(t.start),i=this.distanceToPoint(t.end);return e<0&&i>0||i<0&&e>0}intersectsBox(t){return t.intersectsPlane(this)}intersectsSphere(t){return t.intersectsPlane(this)}coplanarPoint(t){return t.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(t,e){const i=e||wo.getNormalMatrix(t),s=this.coplanarPoint(bo).applyMatrix4(t),r=this.normal.applyMatrix3(i).normalize();return this.constant=-s.dot(r),this}translate(t){return this.constant-=t.dot(this.normal),this}equals(t){return t.normal.equals(this.normal)&&t.constant===this.constant}clone(){return(new this.constructor).copy(this)}}const So=new pr,_o=new ws(.5,.5),Ao=new Ss;class To{constructor(t=new Mo,e=new Mo,i=new Mo,s=new Mo,r=new Mo,n=new Mo){this.planes=[t,e,i,s,r,n]}set(t,e,i,s,r,n){const a=this.planes;return a[0].copy(t),a[1].copy(e),a[2].copy(i),a[3].copy(s),a[4].copy(r),a[5].copy(n),this}copy(t){const e=this.planes;for(let i=0;i<6;i++)e[i].copy(t.planes[i]);return this}setFromProjectionMatrix(t,e=2e3,i=!1){const s=this.planes,r=t.elements,n=r[0],a=r[1],o=r[2],h=r[3],l=r[4],c=r[5],u=r[6],d=r[7],p=r[8],m=r[9],y=r[10],g=r[11],f=r[12],x=r[13],b=r[14],v=r[15];if(s[0].setComponents(h-n,d-l,g-p,v-f).normalize(),s[1].setComponents(h+n,d+l,g+p,v+f).normalize(),s[2].setComponents(h+a,d+c,g+m,v+x).normalize(),s[3].setComponents(h-a,d-c,g-m,v-x).normalize(),i)s[4].setComponents(o,u,y,b).normalize(),s[5].setComponents(h-o,d-u,g-y,v-b).normalize();else if(s[4].setComponents(h-o,d-u,g-y,v-b).normalize(),e===Ui)s[5].setComponents(h+o,d+u,g+y,v+b).normalize();else{if(e!==Wi)throw new Error("THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: "+e);s[5].setComponents(o,u,y,b).normalize()}return this}intersectsObject(t){if(void 0!==t.boundingSphere)null===t.boundingSphere&&t.computeBoundingSphere(),So.copy(t.boundingSphere).applyMatrix4(t.matrixWorld);else{const e=t.geometry;null===e.boundingSphere&&e.computeBoundingSphere(),So.copy(e.boundingSphere).applyMatrix4(t.matrixWorld)}return this.intersectsSphere(So)}intersectsSprite(t){So.center.set(0,0,0);const e=_o.distanceTo(t.center);return So.radius=.7071067811865476+e,So.applyMatrix4(t.matrixWorld),this.intersectsSphere(So)}intersectsSphere(t){const e=this.planes,i=t.center,s=-t.radius;for(let t=0;t<6;t++){if(e[t].distanceToPoint(i)0?t.max.x:t.min.x,Ao.y=s.normal.y>0?t.max.y:t.min.y,Ao.z=s.normal.z>0?t.max.z:t.min.z,s.distanceToPoint(Ao)<0)return!1}return!0}containsPoint(t){const e=this.planes;for(let i=0;i<6;i++)if(e[i].distanceToPoint(t)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}const zo=new Mr,Co=new To;class Io{constructor(){this.coordinateSystem=Ui}intersectsObject(t,e){if(!e.isArrayCamera||0===e.cameras.length)return!1;for(let i=0;i=r.length&&r.push({start:-1,count:-1,z:-1,index:-1});const a=r[this.index];n.push(a),this.index++,a.start=t,a.count=e,a.z=i,a.index=s}reset(){this.list.length=0,this.index=0}}const Ro=new Mr,No=new yn(1,1,1),Vo=new To,Fo=new Io,Eo=new Hs,Lo=new pr,jo=new Ss,Do=new Ss,Uo=new Ss,Wo=new Po,qo=new sa,Jo=[];function Xo(t,e,i=0){const s=e.itemSize;if(t.isInterleavedBufferAttribute||t.array.constructor!==e.array.constructor){const r=t.count;for(let n=0;n65535?new Uint32Array(s):new Uint16Array(s);e.setIndex(new Cn(t,1))}this._geometryInitialized=!0}}_validateGeometry(t){const e=this.geometry;if(Boolean(t.getIndex())!==Boolean(e.getIndex()))throw new Error('THREE.BatchedMesh: All geometries must consistently have "index".');for(const i in e.attributes){if(!t.hasAttribute(i))throw new Error(`THREE.BatchedMesh: Added geometry missing "${i}". All geometries must have consistent attributes.`);const s=t.getAttribute(i),r=e.getAttribute(i);if(s.itemSize!==r.itemSize||s.normalized!==r.normalized)throw new Error("THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.")}}validateInstanceId(t){const e=this._instanceInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid instanceId ${t}. Instance is either out of range or has been deleted.`)}validateGeometryId(t){const e=this._geometryInfo;if(t<0||t>=e.length||!1===e[t].active)throw new Error(`THREE.BatchedMesh: Invalid geometryId ${t}. Geometry is either out of range or has been deleted.`)}setCustomSort(t){return this.customSort=t,this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new Hs);const t=this.boundingBox,e=this._instanceInfo;t.makeEmpty();for(let i=0,s=e.length;i=this.maxInstanceCount&&0===this._availableInstanceIds.length)throw new Error("THREE.BatchedMesh: Maximum item count reached.");const e={visible:!0,active:!0,geometryIndex:t};let i=null;this._availableInstanceIds.length>0?(this._availableInstanceIds.sort(Bo),i=this._availableInstanceIds.shift(),this._instanceInfo[i]=e):(i=this._instanceInfo.length,this._instanceInfo.push(e));const s=this._matricesTexture;Ro.identity().toArray(s.image.data,16*i),s.needsUpdate=!0;const r=this._colorsTexture;return r&&(No.toArray(r.image.data,4*i),r.needsUpdate=!0),this._visibilityChanged=!0,i}addGeometry(t,e=-1,i=-1){this._initializeGeometry(t),this._validateGeometry(t);const s={vertexStart:-1,vertexCount:-1,reservedVertexCount:-1,indexStart:-1,indexCount:-1,reservedIndexCount:-1,start:-1,count:-1,boundingBox:null,boundingSphere:null,active:!0},r=this._geometryInfo;s.vertexStart=this._nextVertexStart,s.reservedVertexCount=-1===e?t.getAttribute("position").count:e;const n=t.getIndex();if(null!==n&&(s.indexStart=this._nextIndexStart,s.reservedIndexCount=-1===i?n.count:i),-1!==s.indexStart&&s.indexStart+s.reservedIndexCount>this._maxIndexCount||s.vertexStart+s.reservedVertexCount>this._maxVertexCount)throw new Error("THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.");let a;return this._availableGeometryIds.length>0?(this._availableGeometryIds.sort(Bo),a=this._availableGeometryIds.shift(),r[a]=s):(a=this._geometryCount,this._geometryCount++,r.push(s)),this.setGeometryAt(a,t),this._nextIndexStart=s.indexStart+s.reservedIndexCount,this._nextVertexStart=s.vertexStart+s.reservedVertexCount,a}setGeometryAt(t,e){if(t>=this._geometryCount)throw new Error("THREE.BatchedMesh: Maximum geometry count reached.");this._validateGeometry(e);const i=this.geometry,s=null!==i.getIndex(),r=i.getIndex(),n=e.getIndex(),a=this._geometryInfo[t];if(s&&n.count>a.reservedIndexCount||e.attributes.position.count>a.reservedVertexCount)throw new Error("THREE.BatchedMesh: Reserved space not large enough for provided geometry.");const o=a.vertexStart,h=a.reservedVertexCount;a.vertexCount=e.getAttribute("position").count;for(const t in i.attributes){const s=e.getAttribute(t),r=i.getAttribute(t);Xo(s,r,o);const n=s.itemSize;for(let t=s.count,e=h;t=e.length||!1===e[t].active)return this;const i=this._instanceInfo;for(let e=0,s=i.length;ee).sort((t,e)=>i[t].vertexStart-i[e].vertexStart),r=this.geometry;for(let n=0,a=i.length;n=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingBox){const t=new Hs,e=i.index,r=i.attributes.position;for(let i=s.start,n=s.start+s.count;i=this._geometryCount)return null;const i=this.geometry,s=this._geometryInfo[t];if(null===s.boundingSphere){const e=new pr;this.getBoundingBoxAt(t,Eo),Eo.getCenter(e.center);const r=i.index,n=i.attributes.position;let a=0;for(let t=s.start,i=s.start+s.count;tt.active);if(Math.max(...i.map(t=>t.vertexStart+t.reservedVertexCount))>t)throw new Error(`BatchedMesh: Geometry vertex values are being used outside the range ${e}. Cannot shrink further.`);if(this.geometry.index){if(Math.max(...i.map(t=>t.indexStart+t.reservedIndexCount))>e)throw new Error(`BatchedMesh: Geometry index values are being used outside the range ${e}. Cannot shrink further.`)}const s=this.geometry;s.dispose(),this._maxVertexCount=t,this._maxIndexCount=e,this._geometryInitialized&&(this._geometryInitialized=!1,this.geometry=new Jn,this._initializeGeometry(s));const r=this.geometry;s.index&&Yo(s.index.array,r.index.array);for(const t in s.attributes)Yo(s.attributes[t].array,r.attributes[t].array)}raycast(t,e){const i=this._instanceInfo,s=this._geometryInfo,r=this.matrixWorld,n=this.geometry;qo.material=this.material,qo.geometry.index=n.index,qo.geometry.attributes=n.attributes,null===qo.geometry.boundingBox&&(qo.geometry.boundingBox=new Hs),null===qo.geometry.boundingSphere&&(qo.geometry.boundingSphere=new pr);for(let n=0,a=i.length;n({...t,boundingBox:null!==t.boundingBox?t.boundingBox.clone():null,boundingSphere:null!==t.boundingSphere?t.boundingSphere.clone():null})),this._instanceInfo=t._instanceInfo.map(t=>({...t})),this._availableInstanceIds=t._availableInstanceIds.slice(),this._availableGeometryIds=t._availableGeometryIds.slice(),this._nextIndexStart=t._nextIndexStart,this._nextVertexStart=t._nextVertexStart,this._geometryCount=t._geometryCount,this._maxInstanceCount=t._maxInstanceCount,this._maxVertexCount=t._maxVertexCount,this._maxIndexCount=t._maxIndexCount,this._geometryInitialized=t._geometryInitialized,this._multiDrawCounts=t._multiDrawCounts.slice(),this._multiDrawStarts=t._multiDrawStarts.slice(),this._indirectTexture=t._indirectTexture.clone(),this._indirectTexture.image.data=this._indirectTexture.image.data.slice(),this._matricesTexture=t._matricesTexture.clone(),this._matricesTexture.image.data=this._matricesTexture.image.data.slice(),null!==this._colorsTexture&&(this._colorsTexture=t._colorsTexture.clone(),this._colorsTexture.image.data=this._colorsTexture.image.data.slice()),this}dispose(){this.geometry.dispose(),this._matricesTexture.dispose(),this._matricesTexture=null,this._indirectTexture.dispose(),this._indirectTexture=null,null!==this._colorsTexture&&(this._colorsTexture.dispose(),this._colorsTexture=null)}onBeforeRender(t,e,i,s,r){if(!this._visibilityChanged&&!this.perObjectFrustumCulled&&!this.sortObjects)return;const n=s.getIndex(),a=null===n?1:n.array.BYTES_PER_ELEMENT,o=this._instanceInfo,h=this._multiDrawStarts,l=this._multiDrawCounts,c=this._geometryInfo,u=this.perObjectFrustumCulled,d=this._indirectTexture,p=d.image.data,m=i.isArrayCamera?Fo:Vo;u&&!i.isArrayCamera&&(Ro.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse).multiply(this.matrixWorld),Vo.setFromProjectionMatrix(Ro,i.coordinateSystem,i.reversedDepth));let y=0;if(this.sortObjects){Ro.copy(this.matrixWorld).invert(),jo.setFromMatrixPosition(i.matrixWorld).applyMatrix4(Ro),Do.set(0,0,-1).transformDirection(i.matrixWorld).transformDirection(Ro);for(let t=0,e=o.length;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;ts)return;eh.applyMatrix4(t.matrixWorld);const h=e.ray.origin.distanceTo(eh);return he.far?void 0:{distance:h,point:ih.clone().applyMatrix4(t.matrixWorld),index:a,face:null,faceIndex:null,barycoord:null,object:t}}const nh=new Ss,ah=new Ss;class oh extends sh{constructor(t,e){super(t,e),this.isLineSegments=!0,this.type="LineSegments"}computeLineDistances(){const t=this.geometry;if(null===t.index){const e=t.attributes.position,i=[];for(let t=0,s=e.count;t0){const i=t[e[0]];if(void 0!==i){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,e=i.length;tr.far)return;n.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:e,face:null,faceIndex:null,barycoord:null,object:a})}}class gh extends Ds{constructor(t,e,i,s,r=1006,n=1006,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isVideoTexture=!0,this.generateMipmaps=!1,this._requestVideoFrameCallbackId=0;const l=this;"requestVideoFrameCallback"in t&&(this._requestVideoFrameCallbackId=t.requestVideoFrameCallback(function e(){l.needsUpdate=!0,l._requestVideoFrameCallbackId=t.requestVideoFrameCallback(e)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const t=this.image;!1==="requestVideoFrameCallback"in t&&t.readyState>=t.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}dispose(){0!==this._requestVideoFrameCallbackId&&(this.source.data.cancelVideoFrameCallback(this._requestVideoFrameCallbackId),this._requestVideoFrameCallbackId=0),super.dispose()}}class fh extends gh{constructor(t,e,i,s,r,n,a,o){super({},t,e,i,s,r,n,a,o),this.isVideoFrameTexture=!0}update(){}clone(){return(new this.constructor).copy(this)}setFrame(t){this.image=t,this.needsUpdate=!0}}class xh extends Ds{constructor(t,e){super({width:t,height:e}),this.isFramebufferTexture=!0,this.magFilter=ft,this.minFilter=ft,this.generateMipmaps=!1,this.needsUpdate=!0}}class bh extends Ds{constructor(t,e,i,s,r,n,a,o,h,l,c,u){super(null,n,a,o,h,l,s,r,c,u),this.isCompressedTexture=!0,this.image={width:e,height:i},this.mipmaps=t,this.flipY=!1,this.generateMipmaps=!1}}class vh extends bh{constructor(t,e,i,s,r,n){super(t,e,i,r,n),this.isCompressedArrayTexture=!0,this.image.depth=s,this.wrapR=yt,this.layerUpdates=new Set}addLayerUpdate(t){this.layerUpdates.add(t)}clearLayerUpdates(){this.layerUpdates.clear()}}class wh extends bh{constructor(t,e,i){super(void 0,t[0].width,t[0].height,e,i,lt),this.isCompressedCubeTexture=!0,this.isCubeTexture=!0,this.image=t}}class Mh extends Ds{constructor(t,e,i,s,r,n,a,o,h){super(t,e,i,s,r,n,a,o,h),this.isCanvasTexture=!0,this.needsUpdate=!0}}class Sh extends Ds{constructor(t,e,i=1014,s,r,n,a=1003,o=1003,h,l=1026,c=1){if(l!==Wt&&1027!==l)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");super({width:t,height:e,depth:c},s,r,n,a,o,l,i,h),this.isDepthTexture=!0,this.flipY=!1,this.generateMipmaps=!1,this.compareFunction=null}copy(t){return super.copy(t),this.source=new Fs(Object.assign({},t.image)),this.compareFunction=t.compareFunction,this}toJSON(t){const e=super.toJSON(t);return null!==this.compareFunction&&(e.compareFunction=this.compareFunction),e}}class _h extends Sh{constructor(t,e=1014,i=301,s,r,n=1003,a=1003,o,h=1026){const l={width:t,height:t,depth:1},c=[l,l,l,l,l,l];super(t,t,e,i,s,r,n,a,o,h),this.image=c,this.isCubeDepthTexture=!0,this.isCubeTexture=!0}get images(){return this.image}set images(t){this.image=t}}class Ah extends Ds{constructor(t=null){super(),this.sourceTexture=t,this.isExternalTexture=!0}copy(t){return super.copy(t),this.sourceTexture=t.sourceTexture,this}}class Th extends Jn{constructor(t=1,e=1,i=4,s=8,r=1){super(),this.type="CapsuleGeometry",this.parameters={radius:t,height:e,capSegments:i,radialSegments:s,heightSegments:r},e=Math.max(0,e),i=Math.max(1,Math.floor(i)),s=Math.max(3,Math.floor(s)),r=Math.max(1,Math.floor(r));const n=[],a=[],o=[],h=[],l=e/2,c=Math.PI/2*t,u=e,d=2*c+u,p=2*i+r,m=s+1,y=new Ss,g=new Ss;for(let f=0;f<=p;f++){let x=0,b=0,v=0,w=0;if(f<=i){const e=f/i,s=e*Math.PI/2;b=-l-t*Math.cos(s),v=t*Math.sin(s),w=-t*Math.cos(s),x=e*c}else if(f<=i+r){const s=(f-i)/r;b=s*e-l,v=t,w=0,x=c+s*u}else{const e=(f-i-r)/i,s=e*Math.PI/2;b=l+t*Math.sin(s),v=t*Math.cos(s),w=t*Math.sin(s),x=c+u+e*c}const M=Math.max(0,Math.min(1,x/d));let S=0;0===f?S=.5/s:f===p&&(S=-.5/s);for(let t=0;t<=s;t++){const e=t/s,i=e*Math.PI*2,r=Math.sin(i),n=Math.cos(i);g.x=-v*n,g.y=b,g.z=v*r,a.push(g.x,g.y,g.z),y.set(-v*n,w,v*r),y.normalize(),o.push(y.x,y.y,y.z),h.push(e+S,M)}if(f>0){const t=(f-1)*m;for(let e=0;e0||0!==s)&&(l.push(n,a,h),x+=3),(e>0||s!==r-1)&&(l.push(a,o,h),x+=3)}h.addGroup(g,x,0),g+=x}(),!1===n&&(t>0&&f(!0),e>0&&f(!1)),this.setIndex(l),this.setAttribute("position",new Fn(c,3)),this.setAttribute("normal",new Fn(u,3)),this.setAttribute("uv",new Fn(d,2))}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Ch(t.radiusTop,t.radiusBottom,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Ih extends Ch{constructor(t=1,e=1,i=32,s=1,r=!1,n=0,a=2*Math.PI){super(0,t,e,i,s,r,n,a),this.type="ConeGeometry",this.parameters={radius:t,height:e,radialSegments:i,heightSegments:s,openEnded:r,thetaStart:n,thetaLength:a}}static fromJSON(t){return new Ih(t.radius,t.height,t.radialSegments,t.heightSegments,t.openEnded,t.thetaStart,t.thetaLength)}}class Bh extends Jn{constructor(t=[],e=[],i=1,s=0){super(),this.type="PolyhedronGeometry",this.parameters={vertices:t,indices:e,radius:i,detail:s};const r=[],n=[];function a(t,e,i,s){const r=s+1,n=[];for(let s=0;s<=r;s++){n[s]=[];const a=t.clone().lerp(i,s/r),o=e.clone().lerp(i,s/r),h=r-s;for(let t=0;t<=h;t++)n[s][t]=0===t&&s===r?a:a.clone().lerp(o,t/h)}for(let t=0;t.9&&a<.1&&(e<.2&&(n[t+0]+=1),i<.2&&(n[t+2]+=1),s<.2&&(n[t+4]+=1))}}()}(),this.setAttribute("position",new Fn(r,3)),this.setAttribute("normal",new Fn(r.slice(),3)),this.setAttribute("uv",new Fn(n,2)),0===s?this.computeVertexNormals():this.normalizeNormals()}copy(t){return super.copy(t),this.parameters=Object.assign({},t.parameters),this}static fromJSON(t){return new Bh(t.vertices,t.indices,t.radius,t.detail)}}class kh extends Bh{constructor(t=1,e=0){const i=(1+Math.sqrt(5))/2,s=1/i;super([-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-s,-i,0,-s,i,0,s,-i,0,s,i,-s,-i,0,-s,i,0,s,-i,0,s,i,0,-i,0,-s,i,0,-s,-i,0,s,i,0,s],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],t,e),this.type="DodecahedronGeometry",this.parameters={radius:t,detail:e}}static fromJSON(t){return new kh(t.radius,t.detail)}}const Oh=new Ss,Ph=new Ss,Rh=new Ss,Nh=new cn;class Vh extends Jn{constructor(t=null,e=1){if(super(),this.type="EdgesGeometry",this.parameters={geometry:t,thresholdAngle:e},null!==t){const i=4,s=Math.pow(10,i),r=Math.cos(ds*e),n=t.getIndex(),a=t.getAttribute("position"),o=n?n.count:a.count,h=[0,0,0],l=["a","b","c"],c=new Array(3),u={},d=[];for(let t=0;t0)){h=s;break}h=s-1}if(s=h,i[s]===n)return s/(r-1);const l=i[s];return(s+(n-l)/(i[s+1]-l))/(r-1)}getTangent(t,e){const i=1e-4;let s=t-i,r=t+i;s<0&&(s=0),r>1&&(r=1);const n=this.getPoint(s),a=this.getPoint(r),o=e||(n.isVector2?new ws:new Ss);return o.copy(a).sub(n).normalize(),o}getTangentAt(t,e){const i=this.getUtoTmapping(t);return this.getTangent(i,e)}computeFrenetFrames(t,e=!1){const i=new Ss,s=[],r=[],n=[],a=new Ss,o=new Mr;for(let e=0;e<=t;e++){const i=e/t;s[e]=this.getTangentAt(i,new Ss)}r[0]=new Ss,n[0]=new Ss;let h=Number.MAX_VALUE;const l=Math.abs(s[0].x),c=Math.abs(s[0].y),u=Math.abs(s[0].z);l<=h&&(h=l,i.set(1,0,0)),c<=h&&(h=c,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(s[0],i).normalize(),r[0].crossVectors(s[0],a),n[0].crossVectors(s[0],r[0]);for(let e=1;e<=t;e++){if(r[e]=r[e-1].clone(),n[e]=n[e-1].clone(),a.crossVectors(s[e-1],s[e]),a.length()>Number.EPSILON){a.normalize();const t=Math.acos(ys(s[e-1].dot(s[e]),-1,1));r[e].applyMatrix4(o.makeRotationAxis(a,t))}n[e].crossVectors(s[e],r[e])}if(!0===e){let e=Math.acos(ys(r[0].dot(r[t]),-1,1));e/=t,s[0].dot(a.crossVectors(r[0],r[t]))>0&&(e=-e);for(let i=1;i<=t;i++)r[i].applyMatrix4(o.makeRotationAxis(s[i],e*i)),n[i].crossVectors(s[i],r[i])}return{tangents:s,normals:r,binormals:n}}clone(){return(new this.constructor).copy(this)}copy(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}toJSON(){const t={metadata:{version:4.7,type:"Curve",generator:"Curve.toJSON"}};return t.arcLengthDivisions=this.arcLengthDivisions,t.type=this.type,t}fromJSON(t){return this.arcLengthDivisions=t.arcLengthDivisions,this}}class Eh extends Fh{constructor(t=0,e=0,i=1,s=1,r=0,n=2*Math.PI,a=!1,o=0){super(),this.isEllipseCurve=!0,this.type="EllipseCurve",this.aX=t,this.aY=e,this.xRadius=i,this.yRadius=s,this.aStartAngle=r,this.aEndAngle=n,this.aClockwise=a,this.aRotation=o}getPoint(t,e=new ws){const i=e,s=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const n=Math.abs(r)s;)r-=s;r0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===l&&h===r-1&&(h=r-2,l=1),this.closed||h>0?a=s[(h-1)%r]:(Dh.subVectors(s[0],s[1]).add(s[0]),a=Dh);const c=s[h%r],u=s[(h+1)%r];if(this.closed||h+2s.length-2?s.length-1:n+1],c=s[n>s.length-3?s.length-1:n+2];return i.set(Xh(a,o.x,h.x,l.x,c.x),Xh(a,o.y,h.y,l.y,c.y)),i}copy(t){super.copy(t),this.points=[];for(let e=0,i=t.points.length;e=i){const t=s[r]-i,n=this.curves[r],a=n.getLength(),o=0===a?0:1-t/a;return n.getPointAt(o,e)}r++}return null}getLength(){const t=this.getCurveLengths();return t[t.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const t=[];let e=0;for(let i=0,s=this.curves.length;i1&&!e[e.length-1].equals(e[0])&&e.push(e[0]),e}copy(t){super.copy(t),this.curves=[];for(let e=0,i=t.curves.length;e0){const t=h.getPoint(0);t.equals(this.currentPoint)||this.lineTo(t.x,t.y)}this.curves.push(h);const l=h.getPoint(1);return this.currentPoint.copy(l),this}copy(t){return super.copy(t),this.currentPoint.copy(t.currentPoint),this}toJSON(){const t=super.toJSON();return t.currentPoint=this.currentPoint.toArray(),t}fromJSON(t){return super.fromJSON(t),this.currentPoint.fromArray(t.currentPoint),this}}class nl extends rl{constructor(t){super(t),this.uuid=ms(),this.type="Shape",this.holes=[]}getPointsHoles(t){const e=[];for(let i=0,s=this.holes.length;i80*i){o=t[0],h=t[1];let e=o,s=h;for(let n=i;ne&&(e=i),r>s&&(s=r)}l=Math.max(e-o,s-h),l=0!==l?32767/l:0}return ll(n,a,i,o,h,l,0),a}function ol(t,e,i,s,r){let n;if(r===function(t,e,i,s){let r=0;for(let n=e,a=i-s;n0)for(let r=e;r=e;r-=s)n=Il(r/s|0,t[r],t[r+1],n);return n&&Sl(n,n.next)&&(Bl(n),n=n.next),n}function hl(t,e){if(!t)return t;e||(e=t);let i,s=t;do{if(i=!1,s.steiner||!Sl(s,s.next)&&0!==Ml(s.prev,s,s.next))s=s.next;else{if(Bl(s),s=e=s.prev,s===s.next)break;i=!0}}while(i||s!==e);return e}function ll(t,e,i,s,r,n,a){if(!t)return;!a&&n&&function(t,e,i,s){let r=t;do{0===r.z&&(r.z=fl(r.x,r.y,e,i,s)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==t);r.prevZ.nextZ=null,r.prevZ=null,function(t){let e,i=1;do{let s,r=t;t=null;let n=null;for(e=0;r;){e++;let a=r,o=0;for(let t=0;t0||h>0&&a;)0!==o&&(0===h||!a||r.z<=a.z)?(s=r,r=r.nextZ,o--):(s=a,a=a.nextZ,h--),n?n.nextZ=s:t=s,s.prevZ=n,n=s;r=a}n.nextZ=null,i*=2}while(e>1)}(r)}(t,s,r,n);let o=t;for(;t.prev!==t.next;){const h=t.prev,l=t.next;if(n?ul(t,s,r,n):cl(t))e.push(h.i,t.i,l.i),Bl(t),t=l.next,o=l.next;else if((t=l)===o){a?1===a?ll(t=dl(hl(t),e),e,i,s,r,n,2):2===a&&pl(t,e,i,s,r,n):ll(hl(t),e,i,s,r,n,1);break}}}function cl(t){const e=t.prev,i=t,s=t.next;if(Ml(e,i,s)>=0)return!1;const r=e.x,n=i.x,a=s.x,o=e.y,h=i.y,l=s.y,c=Math.min(r,n,a),u=Math.min(o,h,l),d=Math.max(r,n,a),p=Math.max(o,h,l);let m=s.next;for(;m!==e;){if(m.x>=c&&m.x<=d&&m.y>=u&&m.y<=p&&vl(r,o,n,h,a,l,m.x,m.y)&&Ml(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function ul(t,e,i,s){const r=t.prev,n=t,a=t.next;if(Ml(r,n,a)>=0)return!1;const o=r.x,h=n.x,l=a.x,c=r.y,u=n.y,d=a.y,p=Math.min(o,h,l),m=Math.min(c,u,d),y=Math.max(o,h,l),g=Math.max(c,u,d),f=fl(p,m,e,i,s),x=fl(y,g,e,i,s);let b=t.prevZ,v=t.nextZ;for(;b&&b.z>=f&&v&&v.z<=x;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;if(b=b.prevZ,v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}for(;b&&b.z>=f;){if(b.x>=p&&b.x<=y&&b.y>=m&&b.y<=g&&b!==r&&b!==a&&vl(o,c,h,u,l,d,b.x,b.y)&&Ml(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;v&&v.z<=x;){if(v.x>=p&&v.x<=y&&v.y>=m&&v.y<=g&&v!==r&&v!==a&&vl(o,c,h,u,l,d,v.x,v.y)&&Ml(v.prev,v,v.next)>=0)return!1;v=v.nextZ}return!0}function dl(t,e){let i=t;do{const s=i.prev,r=i.next.next;!Sl(s,r)&&_l(s,i,i.next,r)&&zl(s,r)&&zl(r,s)&&(e.push(s.i,i.i,r.i),Bl(i),Bl(i.next),i=t=r),i=i.next}while(i!==t);return hl(i)}function pl(t,e,i,s,r,n){let a=t;do{let t=a.next.next;for(;t!==a.prev;){if(a.i!==t.i&&wl(a,t)){let o=Cl(a,t);return a=hl(a,a.next),o=hl(o,o.next),ll(a,e,i,s,r,n,0),void ll(o,e,i,s,r,n,0)}t=t.next}a=a.next}while(a!==t)}function ml(t,e){let i=t.x-e.x;if(0===i&&(i=t.y-e.y,0===i)){i=(t.next.y-t.y)/(t.next.x-t.x)-(e.next.y-e.y)/(e.next.x-e.x)}return i}function yl(t,e){const i=function(t,e){let i=e;const s=t.x,r=t.y;let n,a=-1/0;if(Sl(t,i))return i;do{if(Sl(t,i.next))return i.next;if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const t=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(t<=s&&t>a&&(a=t,n=i.x=i.x&&i.x>=h&&s!==i.x&&bl(rn.x||i.x===n.x&&gl(n,i)))&&(n=i,c=e)}i=i.next}while(i!==o);return n}(t,e);if(!i)return e;const s=Cl(i,t);return hl(s,s.next),hl(i,i.next)}function gl(t,e){return Ml(t.prev,t,e.prev)<0&&Ml(e.next,t,t.next)<0}function fl(t,e,i,s,r){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=(t-i)*r|0)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=(e-s)*r|0)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function xl(t){let e=t,i=t;do{(e.x=(t-a)*(n-o)&&(t-a)*(s-o)>=(i-a)*(e-o)&&(i-a)*(n-o)>=(r-a)*(s-o)}function vl(t,e,i,s,r,n,a,o){return!(t===a&&e===o)&&bl(t,e,i,s,r,n,a,o)}function wl(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){let i=t;do{if(i.i!==t.i&&i.next.i!==t.i&&i.i!==e.i&&i.next.i!==e.i&&_l(i,i.next,t,e))return!0;i=i.next}while(i!==t);return!1}(t,e)&&(zl(t,e)&&zl(e,t)&&function(t,e){let i=t,s=!1;const r=(t.x+e.x)/2,n=(t.y+e.y)/2;do{i.y>n!=i.next.y>n&&i.next.y!==i.y&&r<(i.next.x-i.x)*(n-i.y)/(i.next.y-i.y)+i.x&&(s=!s),i=i.next}while(i!==t);return s}(t,e)&&(Ml(t.prev,t,e.prev)||Ml(t,e.prev,e))||Sl(t,e)&&Ml(t.prev,t,t.next)>0&&Ml(e.prev,e,e.next)>0)}function Ml(t,e,i){return(e.y-t.y)*(i.x-e.x)-(e.x-t.x)*(i.y-e.y)}function Sl(t,e){return t.x===e.x&&t.y===e.y}function _l(t,e,i,s){const r=Tl(Ml(t,e,i)),n=Tl(Ml(t,e,s)),a=Tl(Ml(i,s,t)),o=Tl(Ml(i,s,e));return r!==n&&a!==o||(!(0!==r||!Al(t,i,e))||(!(0!==n||!Al(t,s,e))||(!(0!==a||!Al(i,t,s))||!(0!==o||!Al(i,e,s)))))}function Al(t,e,i){return e.x<=Math.max(t.x,i.x)&&e.x>=Math.min(t.x,i.x)&&e.y<=Math.max(t.y,i.y)&&e.y>=Math.min(t.y,i.y)}function Tl(t){return t>0?1:t<0?-1:0}function zl(t,e){return Ml(t.prev,t,t.next)<0?Ml(t,e,t.next)>=0&&Ml(t,t.prev,e)>=0:Ml(t,e,t.prev)<0||Ml(t,t.next,e)<0}function Cl(t,e){const i=kl(t.i,t.x,t.y),s=kl(e.i,e.x,e.y),r=t.next,n=e.prev;return t.next=e,e.prev=t,i.next=r,r.prev=i,s.next=i,i.prev=s,n.next=s,s.prev=n,s}function Il(t,e,i,s){const r=kl(t,e,i);return s?(r.next=s.next,r.prev=s,s.next.prev=r,s.next=r):(r.prev=r,r.next=r),r}function Bl(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function kl(t,e,i){return{i:t,x:e,y:i,prev:null,next:null,z:0,prevZ:null,nextZ:null,steiner:!1}}class Ol{static triangulate(t,e,i=2){return al(t,e,i)}}class Pl{static area(t){const e=t.length;let i=0;for(let s=e-1,r=0;r2&&t[e-1].equals(t[0])&&t.pop()}function Nl(t,e){for(let i=0;iNumber.EPSILON){const u=Math.sqrt(c),d=Math.sqrt(h*h+l*l),p=e.x-o/u,m=e.y+a/u,y=((i.x-l/d-p)*l-(i.y+h/d-m)*h)/(a*l-o*h);s=p+a*y-t.x,r=m+o*y-t.y;const g=s*s+r*r;if(g<=2)return new ws(s,r);n=Math.sqrt(g/2)}else{let t=!1;a>Number.EPSILON?h>Number.EPSILON&&(t=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(t=!0):Math.sign(o)===Math.sign(l)&&(t=!0),t?(s=-o,r=a,n=Math.sqrt(c)):(s=a,r=o,n=Math.sqrt(c/2))}return new ws(s/n,r/n)}const k=[];for(let t=0,e=z.length,i=e-1,s=t+1;t=0;t--){const e=t/p,i=c*Math.cos(e*Math.PI/2),s=u*Math.sin(e*Math.PI/2)+d;for(let t=0,e=z.length;t=0;){const s=i;let r=i-1;r<0&&(r=t.length-1);for(let t=0,i=o+2*p;t0)&&d.push(e,r,h),(t!==i-1||o0!=t>0&&this.version++,this._anisotropy=t}get clearcoat(){return this._clearcoat}set clearcoat(t){this._clearcoat>0!=t>0&&this.version++,this._clearcoat=t}get iridescence(){return this._iridescence}set iridescence(t){this._iridescence>0!=t>0&&this.version++,this._iridescence=t}get dispersion(){return this._dispersion}set dispersion(t){this._dispersion>0!=t>0&&this.version++,this._dispersion=t}get sheen(){return this._sheen}set sheen(t){this._sheen>0!=t>0&&this.version++,this._sheen=t}get transmission(){return this._transmission}set transmission(t){this._transmission>0!=t>0&&this.version++,this._transmission=t}copy(t){return super.copy(t),this.defines={STANDARD:"",PHYSICAL:""},this.anisotropy=t.anisotropy,this.anisotropyRotation=t.anisotropyRotation,this.anisotropyMap=t.anisotropyMap,this.clearcoat=t.clearcoat,this.clearcoatMap=t.clearcoatMap,this.clearcoatRoughness=t.clearcoatRoughness,this.clearcoatRoughnessMap=t.clearcoatRoughnessMap,this.clearcoatNormalMap=t.clearcoatNormalMap,this.clearcoatNormalScale.copy(t.clearcoatNormalScale),this.dispersion=t.dispersion,this.ior=t.ior,this.iridescence=t.iridescence,this.iridescenceMap=t.iridescenceMap,this.iridescenceIOR=t.iridescenceIOR,this.iridescenceThicknessRange=[...t.iridescenceThicknessRange],this.iridescenceThicknessMap=t.iridescenceThicknessMap,this.sheen=t.sheen,this.sheenColor.copy(t.sheenColor),this.sheenColorMap=t.sheenColorMap,this.sheenRoughness=t.sheenRoughness,this.sheenRoughnessMap=t.sheenRoughnessMap,this.transmission=t.transmission,this.transmissionMap=t.transmissionMap,this.thickness=t.thickness,this.thicknessMap=t.thicknessMap,this.attenuationDistance=t.attenuationDistance,this.attenuationColor.copy(t.attenuationColor),this.specularIntensity=t.specularIntensity,this.specularIntensityMap=t.specularIntensityMap,this.specularColor.copy(t.specularColor),this.specularColorMap=t.specularColorMap,this}}class ic extends xn{constructor(t){super(),this.isMeshPhongMaterial=!0,this.type="MeshPhongMaterial",this.color=new yn(16777215),this.specular=new yn(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.specular.copy(t.specular),this.shininess=t.shininess,this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class sc extends xn{constructor(t){super(),this.isMeshToonMaterial=!0,this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new yn(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.gradientMap=t.gradientMap,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.fog=t.fog,this}}class rc extends xn{constructor(t){super(),this.isMeshNormalMaterial=!0,this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.setValues(t)}copy(t){return super.copy(t),this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this}}class nc extends xn{constructor(t){super(),this.isMeshLambertMaterial=!0,this.type="MeshLambertMaterial",this.color=new yn(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new yn(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.envMapRotation=new Or,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.color.copy(t.color),this.map=t.map,this.lightMap=t.lightMap,this.lightMapIntensity=t.lightMapIntensity,this.aoMap=t.aoMap,this.aoMapIntensity=t.aoMapIntensity,this.emissive.copy(t.emissive),this.emissiveMap=t.emissiveMap,this.emissiveIntensity=t.emissiveIntensity,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.specularMap=t.specularMap,this.alphaMap=t.alphaMap,this.envMap=t.envMap,this.envMapRotation.copy(t.envMapRotation),this.combine=t.combine,this.reflectivity=t.reflectivity,this.refractionRatio=t.refractionRatio,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.wireframeLinecap=t.wireframeLinecap,this.wireframeLinejoin=t.wireframeLinejoin,this.flatShading=t.flatShading,this.fog=t.fog,this}}class ac extends xn{constructor(t){super(),this.isMeshDepthMaterial=!0,this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.setValues(t)}copy(t){return super.copy(t),this.depthPacking=t.depthPacking,this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this}}class oc extends xn{constructor(t){super(),this.isMeshDistanceMaterial=!0,this.type="MeshDistanceMaterial",this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.setValues(t)}copy(t){return super.copy(t),this.map=t.map,this.alphaMap=t.alphaMap,this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this}}class hc extends xn{constructor(t){super(),this.isMeshMatcapMaterial=!0,this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new yn(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new ws(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.flatShading=!1,this.fog=!0,this.setValues(t)}copy(t){return super.copy(t),this.defines={MATCAP:""},this.color.copy(t.color),this.matcap=t.matcap,this.map=t.map,this.bumpMap=t.bumpMap,this.bumpScale=t.bumpScale,this.normalMap=t.normalMap,this.normalMapType=t.normalMapType,this.normalScale.copy(t.normalScale),this.displacementMap=t.displacementMap,this.displacementScale=t.displacementScale,this.displacementBias=t.displacementBias,this.alphaMap=t.alphaMap,this.wireframe=t.wireframe,this.wireframeLinewidth=t.wireframeLinewidth,this.flatShading=t.flatShading,this.fog=t.fog,this}}class lc extends Ho{constructor(t){super(),this.isLineDashedMaterial=!0,this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(t)}copy(t){return super.copy(t),this.scale=t.scale,this.dashSize=t.dashSize,this.gapSize=t.gapSize,this}}function cc(t,e){return t&&t.constructor!==e?"number"==typeof e.BYTES_PER_ELEMENT?new e(t):Array.prototype.slice.call(t):t}function uc(t){const e=t.length,i=new Array(e);for(let t=0;t!==e;++t)i[t]=t;return i.sort(function(e,i){return t[e]-t[i]}),i}function dc(t,e,i){const s=t.length,r=new t.constructor(s);for(let n=0,a=0;a!==s;++n){const s=i[n]*e;for(let i=0;i!==e;++i)r[a++]=t[s+i]}return r}function pc(t,e,i,s){let r=1,n=t[0];for(;void 0!==n&&void 0===n[s];)n=t[r++];if(void 0===n)return;let a=n[s];if(void 0!==a)if(Array.isArray(a))do{a=n[s],void 0!==a&&(e.push(n.time),i.push(...a)),n=t[r++]}while(void 0!==n);else if(void 0!==a.toArray)do{a=n[s],void 0!==a&&(e.push(n.time),a.toArray(i,i.length)),n=t[r++]}while(void 0!==n);else do{a=n[s],void 0!==a&&(e.push(n.time),i.push(a)),n=t[r++]}while(void 0!==n)}class mc{static convertArray(t,e){return cc(t,e)}static isTypedArray(t){return $i(t)}static getKeyframeOrder(t){return uc(t)}static sortedArray(t,e,i){return dc(t,e,i)}static flattenJSON(t,e,i,s){pc(t,e,i,s)}static subclip(t,e,i,s,r=30){return function(t,e,i,s,r=30){const n=t.clone();n.name=e;const a=[];for(let t=0;t=s)){h.push(e.times[t]);for(let i=0;in.tracks[t].times[0]&&(o=n.tracks[t].times[0]);for(let t=0;t=s.times[u]){const t=u*h+o,e=t+h-o;d=s.values.slice(t,e)}else{const t=s.createInterpolant(),e=o,i=h-o;t.evaluate(n),d=t.resultBuffer.slice(e,i)}"quaternion"===r&&(new Ms).fromArray(d).normalize().conjugate().toArray(d);const p=a.times.length;for(let t=0;t=r)){const a=e[1];t=r)break e}n=i,i=0;break i}break t}for(;i>>1;te;)--n;if(++n,0!==r||n!==s){r>=n&&(n=Math.max(n,1),r=n-1);const t=this.getValueSize();this.times=i.slice(r,n),this.values=this.values.slice(r*t,n*t)}return this}validate(){let t=!0;const e=this.getValueSize();e-Math.floor(e)!==0&&(as("KeyframeTrack: Invalid value size in track.",this),t=!1);const i=this.times,s=this.values,r=i.length;0===r&&(as("KeyframeTrack: Track is empty.",this),t=!1);let n=null;for(let e=0;e!==r;e++){const s=i[e];if("number"==typeof s&&isNaN(s)){as("KeyframeTrack: Time is not a valid number.",this,e,s),t=!1;break}if(null!==n&&n>s){as("KeyframeTrack: Out of order keys.",this,e,s,n),t=!1;break}n=s}if(void 0!==s&&$i(s))for(let e=0,i=s.length;e!==i;++e){const i=s[e];if(isNaN(i)){as("KeyframeTrack: Value is not a valid number.",this,e,i),t=!1;break}}return t}optimize(){const t=this.times.slice(),e=this.values.slice(),i=this.getValueSize(),s=this.getInterpolation()===Ee,r=t.length-1;let n=1;for(let a=1;a0){t[n]=t[r];for(let t=r*i,s=n*i,a=0;a!==i;++a)e[s+a]=e[t+a];++n}return n!==t.length?(this.times=t.slice(0,n),this.values=e.slice(0,n*i)):(this.times=t,this.values=e),this}clone(){const t=this.times.slice(),e=this.values.slice(),i=new(0,this.constructor)(this.name,t,e);return i.createInterpolant=this.createInterpolant,i}}bc.prototype.ValueTypeName="",bc.prototype.TimeBufferType=Float32Array,bc.prototype.ValueBufferType=Float32Array,bc.prototype.DefaultInterpolation=Fe;class vc extends bc{constructor(t,e,i){super(t,e,i)}}vc.prototype.ValueTypeName="bool",vc.prototype.ValueBufferType=Array,vc.prototype.DefaultInterpolation=Ve,vc.prototype.InterpolantFactoryMethodLinear=void 0,vc.prototype.InterpolantFactoryMethodSmooth=void 0;class wc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}wc.prototype.ValueTypeName="color";class Mc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Mc.prototype.ValueTypeName="number";class Sc extends yc{constructor(t,e,i,s){super(t,e,i,s)}interpolate_(t,e,i,s){const r=this.resultBuffer,n=this.sampleValues,a=this.valueSize,o=(i-e)/(s-e);let h=t*a;for(let t=h+a;h!==t;h+=4)Ms.slerpFlat(r,0,n,h-a,n,h,o);return r}}class _c extends bc{constructor(t,e,i,s){super(t,e,i,s)}InterpolantFactoryMethodLinear(t){return new Sc(this.times,this.values,this.getValueSize(),t)}}_c.prototype.ValueTypeName="quaternion",_c.prototype.InterpolantFactoryMethodSmooth=void 0;class Ac extends bc{constructor(t,e,i){super(t,e,i)}}Ac.prototype.ValueTypeName="string",Ac.prototype.ValueBufferType=Array,Ac.prototype.DefaultInterpolation=Ve,Ac.prototype.InterpolantFactoryMethodLinear=void 0,Ac.prototype.InterpolantFactoryMethodSmooth=void 0;class Tc extends bc{constructor(t,e,i,s){super(t,e,i,s)}}Tc.prototype.ValueTypeName="vector";class zc{constructor(t="",e=-1,i=[],s=2500){this.name=t,this.tracks=i,this.duration=e,this.blendMode=s,this.uuid=ms(),this.userData={},this.duration<0&&this.resetDuration()}static parse(t){const e=[],i=t.tracks,s=1/(t.fps||1);for(let t=0,r=i.length;t!==r;++t)e.push(Cc(i[t]).scale(s));const r=new this(t.name,t.duration,e,t.blendMode);return r.uuid=t.uuid,r.userData=JSON.parse(t.userData||"{}"),r}static toJSON(t){const e=[],i=t.tracks,s={name:t.name,duration:t.duration,tracks:e,uuid:t.uuid,blendMode:t.blendMode,userData:JSON.stringify(t.userData)};for(let t=0,s=i.length;t!==s;++t)e.push(bc.toJSON(i[t]));return s}static CreateFromMorphTargetSequence(t,e,i,s){const r=e.length,n=[];for(let t=0;t1){const t=n[1];let e=s[t];e||(s[t]=e=[]),e.push(i)}}const n=[];for(const t in s)n.push(this.CreateFromMorphTargetSequence(t,s[t],e,i));return n}static parseAnimation(t,e){if(ns("AnimationClip: parseAnimation() is deprecated and will be removed with r185"),!t)return as("AnimationClip: No animation in JSONLoader data."),null;const i=function(t,e,i,s,r){if(0!==i.length){const n=[],a=[];pc(i,n,a,s),0!==n.length&&r.push(new t(e,n,a))}},s=[],r=t.name||"default",n=t.fps||30,a=t.blendMode;let o=t.length||-1;const h=t.hierarchy||[];for(let t=0;t{e&&e(r),this.manager.itemEnd(t)},0),r;if(void 0!==Pc[t])return void Pc[t].push({onLoad:e,onProgress:i,onError:s});Pc[t]=[],Pc[t].push({onLoad:e,onProgress:i,onError:s});const n=new Request(t,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin",signal:"function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal}),a=this.mimeType,o=this.responseType;fetch(n).then(e=>{if(200===e.status||0===e.status){if(0===e.status&&ns("FileLoader: HTTP Status 0 received."),"undefined"==typeof ReadableStream||void 0===e.body||void 0===e.body.getReader)return e;const i=Pc[t],s=e.body.getReader(),r=e.headers.get("X-File-Size")||e.headers.get("Content-Length"),n=r?parseInt(r):0,a=0!==n;let o=0;const h=new ReadableStream({start(t){!function e(){s.read().then(({done:s,value:r})=>{if(s)t.close();else{o+=r.byteLength;const s=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:n});for(let t=0,e=i.length;t{t.error(e)})}()}});return new Response(h)}throw new Rc(`fetch for "${e.url}" responded with ${e.status}: ${e.statusText}`,e)}).then(t=>{switch(o){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then(t=>(new DOMParser).parseFromString(t,a));case"json":return t.json();default:if(""===a)return t.text();{const e=/charset="?([^;"\s]*)"?/i.exec(a),i=e&&e[1]?e[1].toLowerCase():void 0,s=new TextDecoder(i);return t.arrayBuffer().then(t=>s.decode(t))}}}).then(e=>{Ic.add(`file:${t}`,e);const i=Pc[t];delete Pc[t];for(let t=0,s=i.length;t{const i=Pc[t];if(void 0===i)throw this.manager.itemError(t),e;delete Pc[t];for(let t=0,s=i.length;t{this.manager.itemEnd(t)}),this.manager.itemStart(t)}setResponseType(t){return this.responseType=t,this}setMimeType(t){return this.mimeType=t,this}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}class Vc extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e=[];for(let i=0;i0:s.vertexColors=t.vertexColors),void 0!==t.uniforms)for(const e in t.uniforms){const r=t.uniforms[e];switch(s.uniforms[e]={},r.type){case"t":s.uniforms[e].value=i(r.value);break;case"c":s.uniforms[e].value=(new yn).setHex(r.value);break;case"v2":s.uniforms[e].value=(new ws).fromArray(r.value);break;case"v3":s.uniforms[e].value=(new Ss).fromArray(r.value);break;case"v4":s.uniforms[e].value=(new Us).fromArray(r.value);break;case"m3":s.uniforms[e].value=(new Ts).fromArray(r.value);break;case"m4":s.uniforms[e].value=(new Mr).fromArray(r.value);break;default:s.uniforms[e].value=r.value}}if(void 0!==t.defines&&(s.defines=t.defines),void 0!==t.vertexShader&&(s.vertexShader=t.vertexShader),void 0!==t.fragmentShader&&(s.fragmentShader=t.fragmentShader),void 0!==t.glslVersion&&(s.glslVersion=t.glslVersion),void 0!==t.extensions)for(const e in t.extensions)s.extensions[e]=t.extensions[e];if(void 0!==t.lights&&(s.lights=t.lights),void 0!==t.clipping&&(s.clipping=t.clipping),void 0!==t.size&&(s.size=t.size),void 0!==t.sizeAttenuation&&(s.sizeAttenuation=t.sizeAttenuation),void 0!==t.map&&(s.map=i(t.map)),void 0!==t.matcap&&(s.matcap=i(t.matcap)),void 0!==t.alphaMap&&(s.alphaMap=i(t.alphaMap)),void 0!==t.bumpMap&&(s.bumpMap=i(t.bumpMap)),void 0!==t.bumpScale&&(s.bumpScale=t.bumpScale),void 0!==t.normalMap&&(s.normalMap=i(t.normalMap)),void 0!==t.normalMapType&&(s.normalMapType=t.normalMapType),void 0!==t.normalScale){let e=t.normalScale;!1===Array.isArray(e)&&(e=[e,e]),s.normalScale=(new ws).fromArray(e)}return void 0!==t.displacementMap&&(s.displacementMap=i(t.displacementMap)),void 0!==t.displacementScale&&(s.displacementScale=t.displacementScale),void 0!==t.displacementBias&&(s.displacementBias=t.displacementBias),void 0!==t.roughnessMap&&(s.roughnessMap=i(t.roughnessMap)),void 0!==t.metalnessMap&&(s.metalnessMap=i(t.metalnessMap)),void 0!==t.emissiveMap&&(s.emissiveMap=i(t.emissiveMap)),void 0!==t.emissiveIntensity&&(s.emissiveIntensity=t.emissiveIntensity),void 0!==t.specularMap&&(s.specularMap=i(t.specularMap)),void 0!==t.specularIntensityMap&&(s.specularIntensityMap=i(t.specularIntensityMap)),void 0!==t.specularColorMap&&(s.specularColorMap=i(t.specularColorMap)),void 0!==t.envMap&&(s.envMap=i(t.envMap)),void 0!==t.envMapRotation&&s.envMapRotation.fromArray(t.envMapRotation),void 0!==t.envMapIntensity&&(s.envMapIntensity=t.envMapIntensity),void 0!==t.reflectivity&&(s.reflectivity=t.reflectivity),void 0!==t.refractionRatio&&(s.refractionRatio=t.refractionRatio),void 0!==t.lightMap&&(s.lightMap=i(t.lightMap)),void 0!==t.lightMapIntensity&&(s.lightMapIntensity=t.lightMapIntensity),void 0!==t.aoMap&&(s.aoMap=i(t.aoMap)),void 0!==t.aoMapIntensity&&(s.aoMapIntensity=t.aoMapIntensity),void 0!==t.gradientMap&&(s.gradientMap=i(t.gradientMap)),void 0!==t.clearcoatMap&&(s.clearcoatMap=i(t.clearcoatMap)),void 0!==t.clearcoatRoughnessMap&&(s.clearcoatRoughnessMap=i(t.clearcoatRoughnessMap)),void 0!==t.clearcoatNormalMap&&(s.clearcoatNormalMap=i(t.clearcoatNormalMap)),void 0!==t.clearcoatNormalScale&&(s.clearcoatNormalScale=(new ws).fromArray(t.clearcoatNormalScale)),void 0!==t.iridescenceMap&&(s.iridescenceMap=i(t.iridescenceMap)),void 0!==t.iridescenceThicknessMap&&(s.iridescenceThicknessMap=i(t.iridescenceThicknessMap)),void 0!==t.transmissionMap&&(s.transmissionMap=i(t.transmissionMap)),void 0!==t.thicknessMap&&(s.thicknessMap=i(t.thicknessMap)),void 0!==t.anisotropyMap&&(s.anisotropyMap=i(t.anisotropyMap)),void 0!==t.sheenColorMap&&(s.sheenColorMap=i(t.sheenColorMap)),void 0!==t.sheenRoughnessMap&&(s.sheenRoughnessMap=i(t.sheenRoughnessMap)),s}setTextures(t){return this.textures=t,this}createMaterialFromType(t){return au.createMaterialFromType(t)}static createMaterialFromType(t){return new{ShadowMaterial:Ql,SpriteMaterial:Ia,RawShaderMaterial:Kl,ShaderMaterial:ca,PointsMaterial:lh,MeshPhysicalMaterial:ec,MeshStandardMaterial:tc,MeshPhongMaterial:ic,MeshToonMaterial:sc,MeshNormalMaterial:rc,MeshLambertMaterial:nc,MeshDepthMaterial:ac,MeshDistanceMaterial:oc,MeshBasicMaterial:bn,MeshMatcapMaterial:hc,LineDashedMaterial:lc,LineBasicMaterial:Ho,Material:xn}[t]}}class ou{static extractUrlBase(t){const e=t.lastIndexOf("/");return-1===e?"./":t.slice(0,e+1)}static resolveURL(t,e){return"string"!=typeof t||""===t?"":(/^https?:\/\//i.test(e)&&/^\//.test(t)&&(e=e.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(t)||/^data:.*,.*$/i.test(t)||/^blob:.*$/i.test(t)?t:e+t)}}class hu extends Jn{constructor(){super(),this.isInstancedBufferGeometry=!0,this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(t){return super.copy(t),this.instanceCount=t.instanceCount,this}toJSON(){const t=super.toJSON();return t.instanceCount=this.instanceCount,t.isInstancedBufferGeometry=!0,t}}class lu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(r.manager);n.setPath(r.path),n.setRequestHeader(r.requestHeader),n.setWithCredentials(r.withCredentials),n.load(t,function(i){try{e(r.parse(JSON.parse(i)))}catch(e){s?s(e):as(e),r.manager.itemError(t)}},i,s)}parse(t){const e={},i={};function s(t,s){if(void 0!==e[s])return e[s];const r=t.interleavedBuffers[s],n=function(t,e){if(void 0!==i[e])return i[e];const s=t.arrayBuffers,r=s[e],n=new Uint32Array(r).buffer;return i[e]=n,n}(t,r.buffer),a=Gi(r.type,n),o=new Ta(a,r.stride);return o.uuid=r.uuid,e[s]=o,o}const r=t.isInstancedBufferGeometry?new hu:new Jn,n=t.data.index;if(void 0!==n){const t=Gi(n.type,n.array);r.setIndex(new Cn(t,1))}const a=t.data.attributes;for(const e in a){const i=a[e];let n;if(i.isInterleavedBufferAttribute){const e=s(t.data,i.data);n=new Ca(e,i.itemSize,i.offset,i.normalized)}else{const t=Gi(i.type,i.array);n=new(i.isInstancedBufferAttribute?lo:Cn)(t,i.itemSize,i.normalized)}void 0!==i.name&&(n.name=i.name),void 0!==i.usage&&n.setUsage(i.usage),r.setAttribute(e,n)}const o=t.data.morphAttributes;if(o)for(const e in o){const i=o[e],n=[];for(let e=0,r=i.length;e0){const i=new Bc(e);r=new Lc(i),r.setCrossOrigin(this.crossOrigin);for(let e=0,i=t.length;e0){s=new Lc(this.manager),s.setCrossOrigin(this.crossOrigin);for(let e=0,s=t.length;e{let e=null,i=null;return void 0!==t.boundingBox&&(e=(new Hs).fromJSON(t.boundingBox)),void 0!==t.boundingSphere&&(i=(new pr).fromJSON(t.boundingSphere)),{...t,boundingBox:e,boundingSphere:i}}),n._instanceInfo=t.instanceInfo,n._availableInstanceIds=t._availableInstanceIds,n._availableGeometryIds=t._availableGeometryIds,n._nextIndexStart=t.nextIndexStart,n._nextVertexStart=t.nextVertexStart,n._geometryCount=t.geometryCount,n._maxInstanceCount=t.maxInstanceCount,n._maxVertexCount=t.maxVertexCount,n._maxIndexCount=t.maxIndexCount,n._geometryInitialized=t.geometryInitialized,n._matricesTexture=c(t.matricesTexture.uuid),n._indirectTexture=c(t.indirectTexture.uuid),void 0!==t.colorsTexture&&(n._colorsTexture=c(t.colorsTexture.uuid)),void 0!==t.boundingSphere&&(n.boundingSphere=(new pr).fromJSON(t.boundingSphere)),void 0!==t.boundingBox&&(n.boundingBox=(new Hs).fromJSON(t.boundingBox));break;case"LOD":n=new Ya;break;case"Line":n=new sh(h(t.geometry),l(t.material));break;case"LineLoop":n=new hh(h(t.geometry),l(t.material));break;case"LineSegments":n=new oh(h(t.geometry),l(t.material));break;case"PointCloud":case"Points":n=new mh(h(t.geometry),l(t.material));break;case"Sprite":n=new Wa(l(t.material));break;case"Group":n=new va;break;case"Bone":n=new ro;break;default:n=new Hr}if(n.uuid=t.uuid,void 0!==t.name&&(n.name=t.name),void 0!==t.matrix?(n.matrix.fromArray(t.matrix),void 0!==t.matrixAutoUpdate&&(n.matrixAutoUpdate=t.matrixAutoUpdate),n.matrixAutoUpdate&&n.matrix.decompose(n.position,n.quaternion,n.scale)):(void 0!==t.position&&n.position.fromArray(t.position),void 0!==t.rotation&&n.rotation.fromArray(t.rotation),void 0!==t.quaternion&&n.quaternion.fromArray(t.quaternion),void 0!==t.scale&&n.scale.fromArray(t.scale)),void 0!==t.up&&n.up.fromArray(t.up),void 0!==t.pivot&&(n.pivot=(new Ss).fromArray(t.pivot)),void 0!==t.castShadow&&(n.castShadow=t.castShadow),void 0!==t.receiveShadow&&(n.receiveShadow=t.receiveShadow),t.shadow&&(void 0!==t.shadow.intensity&&(n.shadow.intensity=t.shadow.intensity),void 0!==t.shadow.bias&&(n.shadow.bias=t.shadow.bias),void 0!==t.shadow.normalBias&&(n.shadow.normalBias=t.shadow.normalBias),void 0!==t.shadow.radius&&(n.shadow.radius=t.shadow.radius),void 0!==t.shadow.mapSize&&n.shadow.mapSize.fromArray(t.shadow.mapSize),void 0!==t.shadow.camera&&(n.shadow.camera=this.parseObject(t.shadow.camera))),void 0!==t.visible&&(n.visible=t.visible),void 0!==t.frustumCulled&&(n.frustumCulled=t.frustumCulled),void 0!==t.renderOrder&&(n.renderOrder=t.renderOrder),void 0!==t.static&&(n.static=t.static),void 0!==t.userData&&(n.userData=t.userData),void 0!==t.layers&&(n.layers.mask=t.layers),void 0!==t.children){const a=t.children;for(let t=0;t{if(!0!==mu.has(n))return e&&e(i),r.manager.itemEnd(t),i;s&&s(mu.get(n)),r.manager.itemError(t),r.manager.itemEnd(t)}):(setTimeout(function(){e&&e(n),r.manager.itemEnd(t)},0),n);const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,a.signal="function"==typeof AbortSignal.any?AbortSignal.any([this._abortController.signal,this.manager.abortController.signal]):this._abortController.signal;const o=fetch(t,a).then(function(t){return t.blob()}).then(function(t){return createImageBitmap(t,Object.assign(r.options,{colorSpaceConversion:"none"}))}).then(function(i){return Ic.add(`image-bitmap:${t}`,i),e&&e(i),r.manager.itemEnd(t),i}).catch(function(e){s&&s(e),mu.set(o,e),Ic.remove(`image-bitmap:${t}`),r.manager.itemError(t),r.manager.itemEnd(t)});Ic.add(`image-bitmap:${t}`,o),r.manager.itemStart(t)}abort(){return this._abortController.abort(),this._abortController=new AbortController,this}}let gu;class fu{static getContext(){return void 0===gu&&(gu=new(window.AudioContext||window.webkitAudioContext)),gu}static setContext(t){gu=t}}class xu extends Oc{constructor(t){super(t)}load(t,e,i,s){const r=this,n=new Nc(this.manager);function a(e){s?s(e):as(e),r.manager.itemError(t)}n.setResponseType("arraybuffer"),n.setPath(this.path),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(t){try{const i=t.slice(0);fu.getContext().decodeAudioData(i,function(t){e(t)}).catch(a)}catch(t){a(t)}},i,s)}}const bu=new Mr,vu=new Mr,wu=new Mr;class Mu{constructor(){this.type="StereoCamera",this.aspect=1,this.eyeSep=.064,this.cameraL=new ya,this.cameraL.layers.enable(1),this.cameraL.matrixAutoUpdate=!1,this.cameraR=new ya,this.cameraR.layers.enable(2),this.cameraR.matrixAutoUpdate=!1,this._cache={focus:null,fov:null,aspect:null,near:null,far:null,zoom:null,eyeSep:null}}update(t){const e=this._cache;if(e.focus!==t.focus||e.fov!==t.fov||e.aspect!==t.aspect*this.aspect||e.near!==t.near||e.far!==t.far||e.zoom!==t.zoom||e.eyeSep!==this.eyeSep){e.focus=t.focus,e.fov=t.fov,e.aspect=t.aspect*this.aspect,e.near=t.near,e.far=t.far,e.zoom=t.zoom,e.eyeSep=this.eyeSep,wu.copy(t.projectionMatrix);const i=e.eyeSep/2,s=i*e.near/e.focus,r=e.near*Math.tan(ds*e.fov*.5)/e.zoom;let n,a;vu.elements[12]=-i,bu.elements[12]=i,n=-r*e.aspect+s,a=r*e.aspect+s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraL.projectionMatrix.copy(wu),n=-r*e.aspect-s,a=r*e.aspect-s,wu.elements[0]=2*e.near/(a-n),wu.elements[8]=(a+n)/(a-n),this.cameraR.projectionMatrix.copy(wu)}this.cameraL.matrixWorld.copy(t.matrixWorld).multiply(vu),this.cameraR.matrixWorld.copy(t.matrixWorld).multiply(bu)}}class Su extends ya{constructor(t=[]){super(),this.isArrayCamera=!0,this.isMultiViewCamera=!1,this.cameras=t}}class _u{constructor(t=!0){this.autoStart=t,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=performance.now(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let t=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const e=performance.now();t=(e-this.oldTime)/1e3,this.oldTime=e,this.elapsedTime+=t}return t}}const Au=new Ss,Tu=new Ms,zu=new Ss,Cu=new Ss,Iu=new Ss;class Bu extends Hr{constructor(){super(),this.type="AudioListener",this.context=fu.getContext(),this.gain=this.context.createGain(),this.gain.connect(this.context.destination),this.filter=null,this.timeDelta=0,this._clock=new _u}getInput(){return this.gain}removeFilter(){return null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null),this}getFilter(){return this.filter}setFilter(t){return null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):this.gain.disconnect(this.context.destination),this.filter=t,this.gain.connect(this.filter),this.filter.connect(this.context.destination),this}getMasterVolume(){return this.gain.gain.value}setMasterVolume(t){return this.gain.gain.setTargetAtTime(t,this.context.currentTime,.01),this}updateMatrixWorld(t){super.updateMatrixWorld(t);const e=this.context.listener;if(this.timeDelta=this._clock.getDelta(),this.matrixWorld.decompose(Au,Tu,zu),Cu.set(0,0,-1).applyQuaternion(Tu),Iu.set(0,1,0).applyQuaternion(Tu),e.positionX){const t=this.context.currentTime+this.timeDelta;e.positionX.linearRampToValueAtTime(Au.x,t),e.positionY.linearRampToValueAtTime(Au.y,t),e.positionZ.linearRampToValueAtTime(Au.z,t),e.forwardX.linearRampToValueAtTime(Cu.x,t),e.forwardY.linearRampToValueAtTime(Cu.y,t),e.forwardZ.linearRampToValueAtTime(Cu.z,t),e.upX.linearRampToValueAtTime(Iu.x,t),e.upY.linearRampToValueAtTime(Iu.y,t),e.upZ.linearRampToValueAtTime(Iu.z,t)}else e.setPosition(Au.x,Au.y,Au.z),e.setOrientation(Cu.x,Cu.y,Cu.z,Iu.x,Iu.y,Iu.z)}}class ku extends Hr{constructor(t){super(),this.type="Audio",this.listener=t,this.context=t.context,this.gain=this.context.createGain(),this.gain.connect(t.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(t){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=t,this.connect(),this}setMediaElementSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(t),this.connect(),this}setMediaStreamSource(t){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(t),this.connect(),this}setBuffer(t){return this.buffer=t,this.sourceType="buffer",this.autoplay&&this.play(),this}play(t=0){if(!0===this.isPlaying)return void ns("Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void ns("Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+t;const e=this.context.createBufferSource();return e.buffer=this.buffer,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd,e.onended=this.onEnded.bind(this),e.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=e,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;ns("Audio: this Audio has no playback control.")}stop(t=0){if(!1!==this.hasPlaybackControl)return this._progress=0,null!==this.source&&(this.source.stop(this.context.currentTime+t),this.source.onended=null),this.isPlaying=!1,this;ns("Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let t=1,e=this.filters.length;t0){this.source.disconnect(this.filters[0]);for(let t=1,e=this.filters.length;t0&&this._mixBufferRegionAdditive(i,s,this._addIndex*e,1,e);for(let t=e,r=e+e;t!==r;++t)if(i[t]!==i[t+e]){a.setValue(i,s);break}}saveOriginalState(){const t=this.binding,e=this.buffer,i=this.valueSize,s=i*this._origIndex;t.getValue(e,s);for(let t=i,r=s;t!==r;++t)e[t]=e[s+t%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const t=3*this.valueSize;this.binding.setValue(this.buffer,t)}_setAdditiveIdentityNumeric(){const t=this._addIndex*this.valueSize,e=t+this.valueSize;for(let i=t;i=.5)for(let s=0;s!==r;++s)t[e+s]=t[i+s]}_slerp(t,e,i,s){Ms.slerpFlat(t,e,t,e,t,i,s)}_slerpAdditive(t,e,i,s,r){const n=this._workIndex*r;Ms.multiplyQuaternionsFlat(t,n,t,e,t,i),Ms.slerpFlat(t,e,t,e,t,n,s)}_lerp(t,e,i,s,r){const n=1-s;for(let a=0;a!==r;++a){const r=e+a;t[r]=t[r]*n+t[i+a]*s}}_lerpAdditive(t,e,i,s,r){for(let n=0;n!==r;++n){const r=e+n;t[r]=t[r]+t[i+n]*s}}}const Lu="\\[\\]\\.:\\/",ju=new RegExp("["+Lu+"]","g"),Du="[^"+Lu+"]",Uu="[^"+Lu.replace("\\.","")+"]",Wu=new RegExp("^"+/((?:WC+[\/:])*)/.source.replace("WC",Du)+/(WCOD+)?/.source.replace("WCOD",Uu)+/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Du)+/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Du)+"$"),qu=["material","materials","bones","map"];class Ju{constructor(t,e,i){this.path=e,this.parsedPath=i||Ju.parseTrackName(e),this.node=Ju.findNode(t,this.parsedPath.nodeName),this.rootNode=t,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(t,e,i){return t&&t.isAnimationObjectGroup?new Ju.Composite(t,e,i):new Ju(t,e,i)}static sanitizeNodeName(t){return t.replace(/\s/g,"_").replace(ju,"")}static parseTrackName(t){const e=Wu.exec(t);if(null===e)throw new Error("PropertyBinding: Cannot parse trackName: "+t);const i={nodeName:e[2],objectName:e[3],objectIndex:e[4],propertyName:e[5],propertyIndex:e[6]},s=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==s&&-1!==s){const t=i.nodeName.substring(s+1);-1!==qu.indexOf(t)&&(i.nodeName=i.nodeName.substring(0,s),i.objectName=t)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+t);return i}static findNode(t,e){if(void 0===e||""===e||"."===e||-1===e||e===t.name||e===t.uuid)return t;if(t.skeleton){const i=t.skeleton.getBoneByName(e);if(void 0!==i)return i}if(t.children){const i=function(t){for(let s=0;s=r){const n=r++,l=t[n];e[l.uuid]=h,t[h]=l,e[o]=n,t[n]=a;for(let t=0,e=s;t!==e;++t){const e=i[t],s=e[n],r=e[h];e[h]=s,e[n]=r}}}this.nCachedObjects_=r}uncache(){const t=this._objects,e=this._indicesByUUID,i=this._bindings,s=i.length;let r=this.nCachedObjects_,n=t.length;for(let a=0,o=arguments.length;a!==o;++a){const o=arguments[a].uuid,h=e[o];if(void 0!==h)if(delete e[o],h0&&(e[a.uuid]=h),t[h]=a,t.pop();for(let t=0,e=s;t!==e;++t){const e=i[t];e[h]=e[r],e.pop()}}}this.nCachedObjects_=r}subscribe_(t,e){const i=this._bindingsIndicesByPath;let s=i[t];const r=this._bindings;if(void 0!==s)return r[s];const n=this._paths,a=this._parsedPaths,o=this._objects,h=o.length,l=this.nCachedObjects_,c=new Array(h);s=r.length,i[t]=s,n.push(t),a.push(e),r.push(c);for(let i=l,s=o.length;i!==s;++i){const s=o[i];c[i]=new Ju(s,t,e)}return c}unsubscribe_(t){const e=this._bindingsIndicesByPath,i=e[t];if(void 0!==i){const s=this._paths,r=this._parsedPaths,n=this._bindings,a=n.length-1,o=n[a];e[t[a]]=i,n[i]=o,n.pop(),r[i]=r[a],r.pop(),s[i]=s[a],s.pop()}}}class Yu{constructor(t,e,i=null,s=e.blendMode){this._mixer=t,this._clip=e,this._localRoot=i,this.blendMode=s;const r=e.tracks,n=r.length,a=new Array(n),o={endingStart:Le,endingEnd:Le};for(let t=0;t!==n;++t){const e=r[t].createInterpolant(null);a[t]=e,e.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(n),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(t){return this._startTime=t,this}setLoop(t,e){return this.loop=t,this.repetitions=e,this}setEffectiveWeight(t){return this.weight=t,this._effectiveWeight=this.enabled?t:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(t){return this._scheduleFading(t,0,1)}fadeOut(t){return this._scheduleFading(t,1,0)}crossFadeFrom(t,e,i=!1){if(t.fadeOut(e),this.fadeIn(e),!0===i){const i=this._clip.duration,s=t._clip.duration,r=s/i,n=i/s;t.warp(1,r,e),this.warp(n,1,e)}return this}crossFadeTo(t,e,i=!1){return t.crossFadeFrom(this,e,i)}stopFading(){const t=this._weightInterpolant;return null!==t&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}setEffectiveTimeScale(t){return this.timeScale=t,this._effectiveTimeScale=this.paused?0:t,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(t){return this.timeScale=this._clip.duration/t,this.stopWarping()}syncWith(t){return this.time=t.time,this.timeScale=t.timeScale,this.stopWarping()}halt(t){return this.warp(this._effectiveTimeScale,0,t)}warp(t,e,i){const s=this._mixer,r=s.time,n=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=s._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=t/n,h[1]=e/n,this}stopWarping(){const t=this._timeScaleInterpolant;return null!==t&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(t)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(t,e,i,s){if(!this.enabled)return void this._updateWeight(t);const r=this._startTime;if(null!==r){const s=(t-r)*i;s<0||0===i?e=0:(this._startTime=null,e=i*s)}e*=this._updateTimeScale(t);const n=this._updateTime(e),a=this._updateWeight(t);if(a>0){const t=this._interpolants,e=this._propertyBindings;if(this.blendMode===We)for(let i=0,s=t.length;i!==s;++i)t[i].evaluate(n),e[i].accumulateAdditive(a);else for(let i=0,r=t.length;i!==r;++i)t[i].evaluate(n),e[i].accumulate(s,a)}}_updateWeight(t){let e=0;if(this.enabled){e=this.weight;const i=this._weightInterpolant;if(null!==i){const s=i.evaluate(t)[0];e*=s,t>i.parameterPositions[1]&&(this.stopFading(),0===s&&(this.enabled=!1))}}return this._effectiveWeight=e,e}_updateTimeScale(t){let e=0;if(!this.paused){e=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){e*=i.evaluate(t)[0],t>i.parameterPositions[1]&&(this.stopWarping(),0===e?this.paused=!0:this.timeScale=e)}}return this._effectiveTimeScale=e,e}_updateTime(t){const e=this._clip.duration,i=this.loop;let s=this.time+t,r=this._loopCount;const n=2202===i;if(0===t)return-1===r||!n||1&~r?s:e-s;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));t:{if(s>=e)s=e;else{if(!(s<0)){this.time=s;break t}s=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t<0?-1:1})}}else{if(-1===r&&(t>=0?(r=0,this._setEndings(!0,0===this.repetitions,n)):this._setEndings(0===this.repetitions,!0,n)),s>=e||s<0){const i=Math.floor(s/e);s-=e*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,s=t>0?e:0,this.time=s,this._mixer.dispatchEvent({type:"finished",action:this,direction:t>0?1:-1});else{if(1===a){const e=t<0;this._setEndings(e,!e,n)}else this._setEndings(!1,!1,n);this._loopCount=r,this.time=s,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=s;if(n&&!(1&~r))return e-s}return s}_setEndings(t,e,i){const s=this._interpolantSettings;i?(s.endingStart=je,s.endingEnd=je):(s.endingStart=t?this.zeroSlopeAtStart?je:Le:De,s.endingEnd=e?this.zeroSlopeAtEnd?je:Le:De)}_scheduleFading(t,e,i){const s=this._mixer,r=s.time;let n=this._weightInterpolant;null===n&&(n=s._lendControlInterpolant(),this._weightInterpolant=n);const a=n.parameterPositions,o=n.sampleValues;return a[0]=r,o[0]=e,a[1]=r+t,o[1]=i,this}}const Zu=new Float32Array(1);class Hu extends ls{constructor(t){super(),this._root=t,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}_bindAction(t,e){const i=t._localRoot||this._root,s=t._clip.tracks,r=s.length,n=t._propertyBindings,a=t._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let l=h[o];void 0===l&&(l={},h[o]=l);for(let t=0;t!==r;++t){const r=s[t],h=r.name;let c=l[h];if(void 0!==c)++c.referenceCount,n[t]=c;else{if(c=n[t],void 0!==c){null===c._cacheIndex&&(++c.referenceCount,this._addInactiveBinding(c,o,h));continue}const s=e&&e._propertyBindings[t].binding.parsedPath;c=new Eu(Ju.create(i,h,s),r.ValueTypeName,r.getValueSize()),++c.referenceCount,this._addInactiveBinding(c,o,h),n[t]=c}a[t].resultBuffer=c.buffer}}_activateAction(t){if(!this._isActiveAction(t)){if(null===t._cacheIndex){const e=(t._localRoot||this._root).uuid,i=t._clip.uuid,s=this._actionsByClip[i];this._bindAction(t,s&&s.knownActions[0]),this._addInactiveAction(t,i,e)}const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(t)}}_deactivateAction(t){if(this._isActiveAction(t)){const e=t._propertyBindings;for(let t=0,i=e.length;t!==i;++t){const i=e[t];0===--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(t)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const t=this;this.stats={actions:{get total(){return t._actions.length},get inUse(){return t._nActiveActions}},bindings:{get total(){return t._bindings.length},get inUse(){return t._nActiveBindings}},controlInterpolants:{get total(){return t._controlInterpolants.length},get inUse(){return t._nActiveControlInterpolants}}}}_isActiveAction(t){const e=t._cacheIndex;return null!==e&&e=0;--e)t[e].stop();return this}update(t){t*=this.timeScale;const e=this._actions,i=this._nActiveActions,s=this.time+=t,r=Math.sign(t),n=this._accuIndex^=1;for(let a=0;a!==i;++a){e[a]._update(s,t,r,n)}const a=this._bindings,o=this._nActiveBindings;for(let t=0;t!==o;++t)a[t].apply(n);return this}setTime(t){this.time=0;for(let t=0;t=this.min.x&&t.x<=this.max.x&&t.y>=this.min.y&&t.y<=this.max.y}containsBox(t){return this.min.x<=t.min.x&&t.max.x<=this.max.x&&this.min.y<=t.min.y&&t.max.y<=this.max.y}getParameter(t,e){return e.set((t.x-this.min.x)/(this.max.x-this.min.x),(t.y-this.min.y)/(this.max.y-this.min.y))}intersectsBox(t){return t.max.x>=this.min.x&&t.min.x<=this.max.x&&t.max.y>=this.min.y&&t.min.y<=this.max.y}clampPoint(t,e){return e.copy(t).clamp(this.min,this.max)}distanceToPoint(t){return this.clampPoint(t,ud).distanceTo(t)}intersect(t){return this.min.max(t.min),this.max.min(t.max),this.isEmpty()&&this.makeEmpty(),this}union(t){return this.min.min(t.min),this.max.max(t.max),this}translate(t){return this.min.add(t),this.max.add(t),this}equals(t){return t.min.equals(this.min)&&t.max.equals(this.max)}}const pd=new Ss,md=new Ss,yd=new Ss,gd=new Ss,fd=new Ss,xd=new Ss,bd=new Ss;class vd{constructor(t=new Ss,e=new Ss){this.start=t,this.end=e}set(t,e){return this.start.copy(t),this.end.copy(e),this}copy(t){return this.start.copy(t.start),this.end.copy(t.end),this}getCenter(t){return t.addVectors(this.start,this.end).multiplyScalar(.5)}delta(t){return t.subVectors(this.end,this.start)}distanceSq(){return this.start.distanceToSquared(this.end)}distance(){return this.start.distanceTo(this.end)}at(t,e){return this.delta(e).multiplyScalar(t).add(this.start)}closestPointToPointParameter(t,e){pd.subVectors(t,this.start),md.subVectors(this.end,this.start);const i=md.dot(md);let s=md.dot(pd)/i;return e&&(s=ys(s,0,1)),s}closestPointToPoint(t,e,i){const s=this.closestPointToPointParameter(t,e);return this.delta(i).multiplyScalar(s).add(this.start)}distanceSqToLine3(t,e=xd,i=bd){const s=1e-8*1e-8;let r,n;const a=this.start,o=t.start,h=this.end,l=t.end;yd.subVectors(h,a),gd.subVectors(l,o),fd.subVectors(a,o);const c=yd.dot(yd),u=gd.dot(gd),d=gd.dot(fd);if(c<=s&&u<=s)return e.copy(a),i.copy(o),e.sub(i),e.dot(e);if(c<=s)r=0,n=d/u,n=ys(n,0,1);else{const t=yd.dot(fd);if(u<=s)n=0,r=ys(-t/c,0,1);else{const e=yd.dot(gd),i=c*u-e*e;r=0!==i?ys((e*d-t*u)/i,0,1):0,n=(e*r+d)/u,n<0?(n=0,r=ys(-t/c,0,1)):n>1&&(n=1,r=ys((e-t)/c,0,1))}}return e.copy(a).add(yd.multiplyScalar(r)),i.copy(o).add(gd.multiplyScalar(n)),e.sub(i),e.dot(e)}applyMatrix4(t){return this.start.applyMatrix4(t),this.end.applyMatrix4(t),this}equals(t){return t.start.equals(this.start)&&t.end.equals(this.end)}clone(){return(new this.constructor).copy(this)}}const wd=new Ss;class Md extends Hr{constructor(t,e){super(),this.light=t,this.matrixAutoUpdate=!1,this.color=e,this.type="SpotLightHelper";const i=new Jn,s=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(let t=0,e=1,i=32;t1)for(let i=0;i.99999)this.quaternion.set(0,0,0,1);else if(t.y<-.99999)this.quaternion.set(1,0,0,0);else{Yd.set(t.z,0,-t.x).normalize();const e=Math.acos(t.y);this.quaternion.setFromAxisAngle(Yd,e)}}setLength(t,e=.2*t,i=.2*e){this.line.scale.set(1,Math.max(1e-4,t-e),1),this.line.updateMatrix(),this.cone.scale.set(i,e,i),this.cone.position.y=t,this.cone.updateMatrix()}setColor(t){this.line.material.color.set(t),this.cone.material.color.set(t)}copy(t){return super.copy(t,!1),this.line.copy(t.line),this.cone.copy(t.cone),this}dispose(){this.line.geometry.dispose(),this.line.material.dispose(),this.cone.geometry.dispose(),this.cone.material.dispose()}}class $d extends oh{constructor(t=1){const e=[0,0,0,t,0,0,0,0,0,0,t,0,0,0,0,0,0,t],i=new Jn;i.setAttribute("position",new Fn(e,3)),i.setAttribute("color",new Fn([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));super(i,new Ho({vertexColors:!0,toneMapped:!1})),this.type="AxesHelper"}setColors(t,e,i){const s=new yn,r=this.geometry.attributes.color.array;return s.set(t),s.toArray(r,0),s.toArray(r,3),s.set(e),s.toArray(r,6),s.toArray(r,9),s.set(i),s.toArray(r,12),s.toArray(r,15),this.geometry.attributes.color.needsUpdate=!0,this}dispose(){this.geometry.dispose(),this.material.dispose()}}class Qd{constructor(){this.type="ShapePath",this.color=new yn,this.subPaths=[],this.currentPath=null}moveTo(t,e){return this.currentPath=new rl,this.subPaths.push(this.currentPath),this.currentPath.moveTo(t,e),this}lineTo(t,e){return this.currentPath.lineTo(t,e),this}quadraticCurveTo(t,e,i,s){return this.currentPath.quadraticCurveTo(t,e,i,s),this}bezierCurveTo(t,e,i,s,r,n){return this.currentPath.bezierCurveTo(t,e,i,s,r,n),this}splineThru(t){return this.currentPath.splineThru(t),this}toShapes(t){function e(t,e){const i=e.length;let s=!1;for(let r=i-1,n=0;nNumber.EPSILON){if(h<0&&(i=e[n],o=-o,a=e[r],h=-h),t.ya.y)continue;if(t.y===i.y){if(t.x===i.x)return!0}else{const e=h*(t.x-i.x)-o*(t.y-i.y);if(0===e)return!0;if(e<0)continue;s=!s}}else{if(t.y!==i.y)continue;if(a.x<=t.x&&t.x<=i.x||i.x<=t.x&&t.x<=a.x)return!0}}return s}const i=Pl.isClockWise,s=this.subPaths;if(0===s.length)return[];let r,n,a;const o=[];if(1===s.length)return n=s[0],a=new nl,a.curves=n.curves,o.push(a),o;let h=!i(s[0].getPoints());h=t?!h:h;const l=[],c=[];let u,d,p=[],m=0;c[m]=void 0,p[m]=[];for(let e=0,a=s.length;e1){let t=!1,i=0;for(let t=0,e=c.length;t0&&!1===t&&(p=l)}for(let t=0,e=c.length;te?(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2):(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0),t}(t,e)}static cover(t,e){return function(t,e){const i=t.image&&t.image.width?t.image.width/t.image.height:1;return i>e?(t.repeat.x=e/i,t.repeat.y=1,t.offset.x=(1-t.repeat.x)/2,t.offset.y=0):(t.repeat.x=1,t.repeat.y=i/e,t.offset.x=0,t.offset.y=(1-t.repeat.y)/2),t}(t,e)}static fill(t){return function(t){return t.repeat.x=1,t.repeat.y=1,t.offset.x=0,t.offset.y=0,t}(t)}static getByteLength(t,e,i,s){return tp(t,e,i,s)}}"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:t}})),"undefined"!=typeof window&&(window.__THREE__?ns("WARNING: Multiple instances of Three.js being imported."):window.__THREE__=t);export{it as ACESFilmicToneMapping,w as AddEquation,$ as AddOperation,We as AdditiveAnimationBlendMode,g as AdditiveBlending,rt as AgXToneMapping,jt as AlphaFormat,Bi as AlwaysCompare,U as AlwaysDepth,Mi as AlwaysStencilFunc,iu as AmbientLight,Yu as AnimationAction,zc as AnimationClip,Vc as AnimationLoader,Hu as AnimationMixer,Xu as AnimationObjectGroup,mc as AnimationUtils,Lh as ArcCurve,Su as ArrayCamera,Gd as ArrowHelper,at as AttachedBindMode,ku as Audio,Fu as AudioAnalyser,fu as AudioContext,Bu as AudioListener,xu as AudioLoader,$d as AxesHelper,d as BackSide,Ye as BasicDepthPacking,o as BasicShadowMap,Zo as BatchedMesh,ro as Bone,vc as BooleanKeyframeTrack,dd as Box2,Hs as Box3,Jd as Box3Helper,na as BoxGeometry,qd as BoxHelper,Cn as BufferAttribute,Jn as BufferGeometry,lu as BufferGeometryLoader,Ct as ByteType,Ic as Cache,ua as Camera,Dd as CameraHelper,Mh as CanvasTexture,Th as CapsuleGeometry,Jh as CatmullRomCurve3,et as CineonToneMapping,zh as CircleGeometry,yt as ClampToEdgeWrapping,_u as Clock,yn as Color,wc as ColorKeyframeTrack,ks as ColorManagement,Yi as Compatibility,vh as CompressedArrayTexture,wh as CompressedCubeTexture,bh as CompressedTexture,Fc as CompressedTextureLoader,Ih as ConeGeometry,L as ConstantAlphaFactor,F as ConstantColorFactor,Kd as Controls,fa as CubeCamera,_h as CubeDepthTexture,lt as CubeReflectionMapping,ct as CubeRefractionMapping,xa as CubeTexture,jc as CubeTextureLoader,pt as CubeUVReflectionMapping,Hh as CubicBezierCurve,Gh as CubicBezierCurve3,gc as CubicInterpolant,r as CullFaceBack,n as CullFaceFront,a as CullFaceFrontBack,s as CullFaceNone,Fh as Curve,sl as CurvePath,b as CustomBlending,st as CustomToneMapping,Ch as CylinderGeometry,ld as Cylindrical,Ys as Data3DTexture,Js as DataArrayTexture,no as DataTexture,Dc as DataTextureLoader,_n as DataUtils,ui as DecrementStencilOp,pi as DecrementWrapStencilOp,kc as DefaultLoadingManager,Wt as DepthFormat,qt as DepthStencilFormat,Sh as DepthTexture,ot as DetachedBindMode,eu as DirectionalLight,Ed as DirectionalLightHelper,xc as DiscreteInterpolant,kh as DodecahedronGeometry,p as DoubleSide,O as DstAlphaFactor,R as DstColorFactor,Ei as DynamicCopyUsage,Oi as DynamicDrawUsage,Ni as DynamicReadUsage,Vh as EdgesGeometry,Eh as EllipseCurve,Ai as EqualCompare,J as EqualDepth,fi as EqualStencilFunc,ut as EquirectangularReflectionMapping,dt as EquirectangularRefractionMapping,Or as Euler,ls as EventDispatcher,Ah as ExternalTexture,Vl as ExtrudeGeometry,Nc as FileLoader,Vn as Float16BufferAttribute,Fn as Float32BufferAttribute,Pt as FloatType,_a as Fog,Sa as FogExp2,xh as FramebufferTexture,u as FrontSide,To as Frustum,Io as FrustumArray,ed as GLBufferAttribute,ji as GLSL1,Di as GLSL3,zi as GreaterCompare,Y as GreaterDepth,Ii as GreaterEqualCompare,X as GreaterEqualDepth,wi as GreaterEqualStencilFunc,bi as GreaterStencilFunc,Pd as GridHelper,va as Group,Rt as HalfFloatType,qc as HemisphereLight,Od as HemisphereLightHelper,El as IcosahedronGeometry,yu as ImageBitmapLoader,Lc as ImageLoader,Ns as ImageUtils,ci as IncrementStencilOp,di as IncrementWrapStencilOp,lo as InstancedBufferAttribute,hu as InstancedBufferGeometry,td as InstancedInterleavedBuffer,xo as InstancedMesh,On as Int16BufferAttribute,Rn as Int32BufferAttribute,In as Int8BufferAttribute,kt as IntType,Ta as InterleavedBuffer,Ca as InterleavedBufferAttribute,yc as Interpolant,Ve as InterpolateDiscrete,Fe as InterpolateLinear,Ee as InterpolateSmooth,Xi as InterpolationSamplingMode,Ji as InterpolationSamplingType,mi as InvertStencilOp,hi as KeepStencilOp,bc as KeyframeTrack,Ya as LOD,Ll as LatheGeometry,Pr as Layers,_i as LessCompare,W as LessDepth,Ti as LessEqualCompare,q as LessEqualDepth,xi as LessEqualStencilFunc,gi as LessStencilFunc,Wc as Light,nu as LightProbe,sh as Line,vd as Line3,Ho as LineBasicMaterial,$h as LineCurve,Qh as LineCurve3,lc as LineDashedMaterial,hh as LineLoop,oh as LineSegments,Mt as LinearFilter,fc as LinearInterpolant,Tt as LinearMipMapLinearFilter,_t as LinearMipMapNearestFilter,At as LinearMipmapLinearFilter,St as LinearMipmapNearestFilter,ei as LinearSRGBColorSpace,K as LinearToneMapping,ii as LinearTransfer,Oc as Loader,ou as LoaderUtils,Bc as LoadingManager,Pe as LoopOnce,Ne as LoopPingPong,Re as LoopRepeat,e as MOUSE,xn as Material,v as MaterialBlending,au as MaterialLoader,vs as MathUtils,cd as Matrix2,Ts as Matrix3,Mr as Matrix4,A as MaxEquation,sa as Mesh,bn as MeshBasicMaterial,ac as MeshDepthMaterial,oc as MeshDistanceMaterial,nc as MeshLambertMaterial,hc as MeshMatcapMaterial,rc as MeshNormalMaterial,ic as MeshPhongMaterial,ec as MeshPhysicalMaterial,tc as MeshStandardMaterial,sc as MeshToonMaterial,_ as MinEquation,gt as MirroredRepeatWrapping,G as MixOperation,x as MultiplyBlending,H as MultiplyOperation,ft as NearestFilter,wt as NearestMipMapLinearFilter,bt as NearestMipMapNearestFilter,vt as NearestMipmapLinearFilter,xt as NearestMipmapNearestFilter,nt as NeutralToneMapping,Si as NeverCompare,D as NeverDepth,yi as NeverStencilFunc,m as NoBlending,Ke as NoColorSpace,ri as NoNormalPacking,Q as NoToneMapping,Ue as NormalAnimationBlendMode,y as NormalBlending,ai as NormalGAPacking,ni as NormalRGPacking,Ci as NotEqualCompare,Z as NotEqualDepth,vi as NotEqualStencilFunc,Mc as NumberKeyframeTrack,Hr as Object3D,cu as ObjectLoader,Qe as ObjectSpaceNormalMap,jl as OctahedronGeometry,z as OneFactor,j as OneMinusConstantAlphaFactor,E as OneMinusConstantColorFactor,P as OneMinusDstAlphaFactor,N as OneMinusDstColorFactor,k as OneMinusSrcAlphaFactor,I as OneMinusSrcColorFactor,Kc as OrthographicCamera,h as PCFShadowMap,l as PCFSoftShadowMap,rl as Path,ya as PerspectiveCamera,Mo as Plane,Dl as PlaneGeometry,Xd as PlaneHelper,Qc as PointLight,Cd as PointLightHelper,mh as Points,lh as PointsMaterial,Rd as PolarGridHelper,Bh as PolyhedronGeometry,Vu as PositionalAudio,Ju as PropertyBinding,Eu as PropertyMixer,Kh as QuadraticBezierCurve,tl as QuadraticBezierCurve3,Ms as Quaternion,_c as QuaternionKeyframeTrack,Sc as QuaternionLinearInterpolant,he as R11_EAC_Format,ps as RAD2DEG,ke as RED_GREEN_RGTC2_Format,Ie as RED_RGTC1_Format,t as REVISION,ce as RG11_EAC_Format,Ze as RGBADepthPacking,Ut as RGBAFormat,Gt as RGBAIntegerFormat,Se as RGBA_ASTC_10x10_Format,ve as RGBA_ASTC_10x5_Format,we as RGBA_ASTC_10x6_Format,Me as RGBA_ASTC_10x8_Format,_e as RGBA_ASTC_12x10_Format,Ae as RGBA_ASTC_12x12_Format,de as RGBA_ASTC_4x4_Format,pe as RGBA_ASTC_5x4_Format,me as RGBA_ASTC_5x5_Format,ye as RGBA_ASTC_6x5_Format,ge as RGBA_ASTC_6x6_Format,fe as RGBA_ASTC_8x5_Format,xe as RGBA_ASTC_8x6_Format,be as RGBA_ASTC_8x8_Format,Te as RGBA_BPTC_Format,oe as RGBA_ETC2_EAC_Format,re as RGBA_PVRTC_2BPPV1_Format,se as RGBA_PVRTC_4BPPV1_Format,Qt as RGBA_S3TC_DXT1_Format,Kt as RGBA_S3TC_DXT3_Format,te as RGBA_S3TC_DXT5_Format,He as RGBDepthPacking,Dt as RGBFormat,Ht as RGBIntegerFormat,ze as RGB_BPTC_SIGNED_Format,Ce as RGB_BPTC_UNSIGNED_Format,ne as RGB_ETC1_Format,ae as RGB_ETC2_Format,ie as RGB_PVRTC_2BPPV1_Format,ee as RGB_PVRTC_4BPPV1_Format,$t as RGB_S3TC_DXT1_Format,Ge as RGDepthPacking,Yt as RGFormat,Zt as RGIntegerFormat,Kl as RawShaderMaterial,wr as Ray,sd as Raycaster,su as RectAreaLight,Jt as RedFormat,Xt as RedIntegerFormat,tt as ReinhardToneMapping,Ws as RenderTarget,Gu as RenderTarget3D,mt as RepeatWrapping,li as ReplaceStencilOp,S as ReverseSubtractEquation,Ul as RingGeometry,le as SIGNED_R11_EAC_Format,Oe as SIGNED_RED_GREEN_RGTC2_Format,Be as SIGNED_RED_RGTC1_Format,ue as SIGNED_RG11_EAC_Format,ti as SRGBColorSpace,si as SRGBTransfer,Aa as Scene,ca as ShaderMaterial,Ql as ShadowMaterial,nl as Shape,Wl as ShapeGeometry,Qd as ShapePath,Pl as ShapeUtils,It as ShortType,ho as Skeleton,Td as SkeletonHelper,so as SkinnedMesh,Fs as Source,pr as Sphere,ql as SphereGeometry,hd as Spherical,ru as SphericalHarmonics3,el as SplineCurve,Gc as SpotLight,Md as SpotLightHelper,Wa as Sprite,Ia as SpriteMaterial,B as SrcAlphaFactor,V as SrcAlphaSaturateFactor,C as SrcColorFactor,Fi as StaticCopyUsage,ki as StaticDrawUsage,Ri as StaticReadUsage,Mu as StereoCamera,Li as StreamCopyUsage,Pi as StreamDrawUsage,Vi as StreamReadUsage,Ac as StringKeyframeTrack,M as SubtractEquation,f as SubtractiveBlending,i as TOUCH,$e as TangentSpaceNormalMap,Jl as TetrahedronGeometry,Ds as Texture,Uc as TextureLoader,ep as TextureUtils,ad as Timer,qi as TimestampQuery,Xl as TorusGeometry,Yl as TorusKnotGeometry,cn as Triangle,Xe as TriangleFanDrawMode,Je as TriangleStripDrawMode,qe as TrianglesDrawMode,Zl as TubeGeometry,ht as UVMapping,Pn as Uint16BufferAttribute,Nn as Uint32BufferAttribute,Bn as Uint8BufferAttribute,kn as Uint8ClampedBufferAttribute,$u as Uniform,Ku as UniformsGroup,la as UniformsUtils,zt as UnsignedByteType,Lt as UnsignedInt101111Type,Ft as UnsignedInt248Type,Et as UnsignedInt5999Type,Ot as UnsignedIntType,Nt as UnsignedShort4444Type,Vt as UnsignedShort5551Type,Bt as UnsignedShortType,c as VSMShadowMap,ws as Vector2,Ss as Vector3,Us as Vector4,Tc as VectorKeyframeTrack,fh as VideoFrameTexture,gh as VideoTexture,Zs as WebGL3DRenderTarget,Xs as WebGLArrayRenderTarget,Ui as WebGLCoordinateSystem,ba as WebGLCubeRenderTarget,qs as WebGLRenderTarget,Wi as WebGPUCoordinateSystem,Ma as WebXRController,Hl as WireframeGeometry,De as WrapAroundEnding,Le as ZeroCurvatureEnding,T as ZeroFactor,je as ZeroSlopeEnding,oi as ZeroStencilOp,Zi as arrayNeedsUint32,aa as cloneUniforms,Ki as createCanvasElement,Qi as createElementNS,as as error,tp as getByteLength,ss as getConsoleFunction,ha as getUnlitUniformColorSpace,$i as isTypedArray,rs as log,oa as mergeUniforms,hs as probeAsync,is as setConsoleFunction,ns as warn,os as warnOnce}; diff --git a/build/three.module.js b/build/three.module.js index 7b44c34e0d7799..85042d19347bbf 100644 --- a/build/three.module.js +++ b/build/three.module.js @@ -471,7 +471,7 @@ var roughnessmap_fragment = "float roughnessFactor = roughness;\n#ifdef USE_ROUG var roughnessmap_pars_fragment = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; -var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; +var shadowmap_pars_fragment = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif"; var shadowmap_pars_vertex = "#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif"; @@ -8888,7 +8888,7 @@ function WebGLRenderStates( extensions ) { const vertex = "void main() {\n\tgl_Position = vec4( position, 1.0 );\n}"; -const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; +const fragment = "uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"; const _cubeDirections = [ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), diff --git a/build/three.module.min.js b/build/three.module.min.js index 8e2fb27bda811d..a02f4b5793239b 100644 --- a/build/three.module.min.js +++ b/build/three.module.min.js @@ -3,4 +3,4 @@ * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT */ -import{Matrix3 as e,Vector2 as t,Color as n,mergeUniforms as i,Vector3 as r,CubeUVReflectionMapping as a,Mesh as o,BoxGeometry as s,ShaderMaterial as l,BackSide as c,cloneUniforms as d,Euler as u,Matrix4 as f,ColorManagement as p,SRGBTransfer as m,PlaneGeometry as h,FrontSide as _,getUnlitUniformColorSpace as g,IntType as v,warn as E,HalfFloatType as S,UnsignedByteType as T,FloatType as M,RGBAFormat as x,Plane as A,EquirectangularReflectionMapping as R,EquirectangularRefractionMapping as b,WebGLCubeRenderTarget as C,CubeReflectionMapping as P,CubeRefractionMapping as L,BufferGeometry as U,OrthographicCamera as D,PerspectiveCamera as w,NoToneMapping as I,MeshBasicMaterial as N,error as y,NoBlending as O,WebGLRenderTarget as F,BufferAttribute as B,LinearSRGBColorSpace as G,LinearFilter as H,warnOnce as V,Uint32BufferAttribute as W,Uint16BufferAttribute as z,arrayNeedsUint32 as k,Vector4 as X,DataArrayTexture as Y,Float32BufferAttribute as K,RawShaderMaterial as j,CustomToneMapping as q,NeutralToneMapping as Z,AgXToneMapping as $,ACESFilmicToneMapping as Q,CineonToneMapping as J,ReinhardToneMapping as ee,LinearToneMapping as te,CubeTexture as ne,Data3DTexture as ie,GreaterEqualCompare as re,LessEqualCompare as ae,DepthTexture as oe,Texture as se,GLSL3 as le,VSMShadowMap as ce,PCFShadowMap as de,AddOperation as ue,MixOperation as fe,MultiplyOperation as pe,LinearTransfer as me,UniformsUtils as he,DoubleSide as _e,NormalBlending as ge,TangentSpaceNormalMap as ve,ObjectSpaceNormalMap as Ee,Layers as Se,RGFormat as Te,Frustum as Me,MeshDepthMaterial as xe,MeshDistanceMaterial as Ae,PCFSoftShadowMap as Re,DepthFormat as be,NearestFilter as Ce,CubeDepthTexture as Pe,UnsignedIntType as Le,LessEqualDepth as Ue,ReverseSubtractEquation as De,SubtractEquation as we,AddEquation as Ie,OneMinusConstantAlphaFactor as Ne,ConstantAlphaFactor as ye,OneMinusConstantColorFactor as Oe,ConstantColorFactor as Fe,OneMinusDstAlphaFactor as Be,OneMinusDstColorFactor as Ge,OneMinusSrcAlphaFactor as He,OneMinusSrcColorFactor as Ve,DstAlphaFactor as We,DstColorFactor as ze,SrcAlphaSaturateFactor as ke,SrcAlphaFactor as Xe,SrcColorFactor as Ye,OneFactor as Ke,ZeroFactor as je,NotEqualDepth as qe,GreaterDepth as Ze,GreaterEqualDepth as $e,EqualDepth as Qe,LessDepth as Je,AlwaysDepth as et,NeverDepth as tt,CullFaceNone as nt,CullFaceBack as it,CullFaceFront as rt,CustomBlending as at,MultiplyBlending as ot,SubtractiveBlending as st,AdditiveBlending as lt,MinEquation as ct,MaxEquation as dt,MirroredRepeatWrapping as ut,ClampToEdgeWrapping as ft,RepeatWrapping as pt,LinearMipmapLinearFilter as mt,LinearMipmapNearestFilter as ht,NearestMipmapLinearFilter as _t,NearestMipmapNearestFilter as gt,NotEqualCompare as vt,GreaterCompare as Et,EqualCompare as St,LessCompare as Tt,AlwaysCompare as Mt,NeverCompare as xt,NoColorSpace as At,DepthStencilFormat as Rt,getByteLength as bt,UnsignedInt248Type as Ct,UnsignedShortType as Pt,createElementNS as Lt,UnsignedShort4444Type as Ut,UnsignedShort5551Type as Dt,UnsignedInt5999Type as wt,UnsignedInt101111Type as It,ByteType as Nt,ShortType as yt,AlphaFormat as Ot,RGBFormat as Ft,RedFormat as Bt,RedIntegerFormat as Gt,RGIntegerFormat as Ht,RGBAIntegerFormat as Vt,RGB_S3TC_DXT1_Format as Wt,RGBA_S3TC_DXT1_Format as zt,RGBA_S3TC_DXT3_Format as kt,RGBA_S3TC_DXT5_Format as Xt,RGB_PVRTC_4BPPV1_Format as Yt,RGB_PVRTC_2BPPV1_Format as Kt,RGBA_PVRTC_4BPPV1_Format as jt,RGBA_PVRTC_2BPPV1_Format as qt,RGB_ETC1_Format as Zt,RGB_ETC2_Format as $t,RGBA_ETC2_EAC_Format as Qt,R11_EAC_Format as Jt,SIGNED_R11_EAC_Format as en,RG11_EAC_Format as tn,SIGNED_RG11_EAC_Format as nn,RGBA_ASTC_4x4_Format as rn,RGBA_ASTC_5x4_Format as an,RGBA_ASTC_5x5_Format as on,RGBA_ASTC_6x5_Format as sn,RGBA_ASTC_6x6_Format as ln,RGBA_ASTC_8x5_Format as cn,RGBA_ASTC_8x6_Format as dn,RGBA_ASTC_8x8_Format as un,RGBA_ASTC_10x5_Format as fn,RGBA_ASTC_10x6_Format as pn,RGBA_ASTC_10x8_Format as mn,RGBA_ASTC_10x10_Format as hn,RGBA_ASTC_12x10_Format as _n,RGBA_ASTC_12x12_Format as gn,RGBA_BPTC_Format as vn,RGB_BPTC_SIGNED_Format as En,RGB_BPTC_UNSIGNED_Format as Sn,RED_RGTC1_Format as Tn,SIGNED_RED_RGTC1_Format as Mn,RED_GREEN_RGTC2_Format as xn,SIGNED_RED_GREEN_RGTC2_Format as An,ExternalTexture as Rn,EventDispatcher as bn,ArrayCamera as Cn,WebXRController as Pn,RAD2DEG as Ln,DataTexture as Un,createCanvasElement as Dn,SRGBColorSpace as wn,REVISION as In,log as Nn,WebGLCoordinateSystem as yn,probeAsync as On}from"./three.core.min.js";export{AdditiveAnimationBlendMode,AlwaysStencilFunc,AmbientLight,AnimationAction,AnimationClip,AnimationLoader,AnimationMixer,AnimationObjectGroup,AnimationUtils,ArcCurve,ArrowHelper,AttachedBindMode,Audio,AudioAnalyser,AudioContext,AudioListener,AudioLoader,AxesHelper,BasicDepthPacking,BasicShadowMap,BatchedMesh,Bone,BooleanKeyframeTrack,Box2,Box3,Box3Helper,BoxHelper,BufferGeometryLoader,Cache,Camera,CameraHelper,CanvasTexture,CapsuleGeometry,CatmullRomCurve3,CircleGeometry,Clock,ColorKeyframeTrack,Compatibility,CompressedArrayTexture,CompressedCubeTexture,CompressedTexture,CompressedTextureLoader,ConeGeometry,Controls,CubeCamera,CubeTextureLoader,CubicBezierCurve,CubicBezierCurve3,CubicInterpolant,CullFaceFrontBack,Curve,CurvePath,CylinderGeometry,Cylindrical,DataTextureLoader,DataUtils,DecrementStencilOp,DecrementWrapStencilOp,DefaultLoadingManager,DetachedBindMode,DirectionalLight,DirectionalLightHelper,DiscreteInterpolant,DodecahedronGeometry,DynamicCopyUsage,DynamicDrawUsage,DynamicReadUsage,EdgesGeometry,EllipseCurve,EqualStencilFunc,ExtrudeGeometry,FileLoader,Float16BufferAttribute,Fog,FogExp2,FramebufferTexture,FrustumArray,GLBufferAttribute,GLSL1,GreaterEqualStencilFunc,GreaterStencilFunc,GridHelper,Group,HemisphereLight,HemisphereLightHelper,IcosahedronGeometry,ImageBitmapLoader,ImageLoader,ImageUtils,IncrementStencilOp,IncrementWrapStencilOp,InstancedBufferAttribute,InstancedBufferGeometry,InstancedInterleavedBuffer,InstancedMesh,Int16BufferAttribute,Int32BufferAttribute,Int8BufferAttribute,InterleavedBuffer,InterleavedBufferAttribute,Interpolant,InterpolateDiscrete,InterpolateLinear,InterpolateSmooth,InterpolationSamplingMode,InterpolationSamplingType,InvertStencilOp,KeepStencilOp,KeyframeTrack,LOD,LatheGeometry,LessEqualStencilFunc,LessStencilFunc,Light,LightProbe,Line,Line3,LineBasicMaterial,LineCurve,LineCurve3,LineDashedMaterial,LineLoop,LineSegments,LinearInterpolant,LinearMipMapLinearFilter,LinearMipMapNearestFilter,Loader,LoaderUtils,LoadingManager,LoopOnce,LoopPingPong,LoopRepeat,MOUSE,Material,MaterialBlending,MaterialLoader,MathUtils,Matrix2,MeshLambertMaterial,MeshMatcapMaterial,MeshNormalMaterial,MeshPhongMaterial,MeshPhysicalMaterial,MeshStandardMaterial,MeshToonMaterial,NearestMipMapLinearFilter,NearestMipMapNearestFilter,NeverStencilFunc,NoNormalPacking,NormalAnimationBlendMode,NormalGAPacking,NormalRGPacking,NotEqualStencilFunc,NumberKeyframeTrack,Object3D,ObjectLoader,OctahedronGeometry,Path,PlaneHelper,PointLight,PointLightHelper,Points,PointsMaterial,PolarGridHelper,PolyhedronGeometry,PositionalAudio,PropertyBinding,PropertyMixer,QuadraticBezierCurve,QuadraticBezierCurve3,Quaternion,QuaternionKeyframeTrack,QuaternionLinearInterpolant,RGBADepthPacking,RGBDepthPacking,RGBIntegerFormat,RGDepthPacking,Ray,Raycaster,RectAreaLight,RenderTarget,RenderTarget3D,ReplaceStencilOp,RingGeometry,Scene,ShadowMaterial,Shape,ShapeGeometry,ShapePath,ShapeUtils,Skeleton,SkeletonHelper,SkinnedMesh,Source,Sphere,SphereGeometry,Spherical,SphericalHarmonics3,SplineCurve,SpotLight,SpotLightHelper,Sprite,SpriteMaterial,StaticCopyUsage,StaticDrawUsage,StaticReadUsage,StereoCamera,StreamCopyUsage,StreamDrawUsage,StreamReadUsage,StringKeyframeTrack,TOUCH,TetrahedronGeometry,TextureLoader,TextureUtils,Timer,TimestampQuery,TorusGeometry,TorusKnotGeometry,Triangle,TriangleFanDrawMode,TriangleStripDrawMode,TrianglesDrawMode,TubeGeometry,UVMapping,Uint8BufferAttribute,Uint8ClampedBufferAttribute,Uniform,UniformsGroup,VectorKeyframeTrack,VideoFrameTexture,VideoTexture,WebGL3DRenderTarget,WebGLArrayRenderTarget,WebGPUCoordinateSystem,WireframeGeometry,WrapAroundEnding,ZeroCurvatureEnding,ZeroSlopeEnding,ZeroStencilOp,getConsoleFunction,setConsoleFunction}from"./three.core.min.js";function Fn(){let e=null,t=!1,n=null,i=null;function r(t,a){n(t,a),i=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==n&&(i=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(i),t=!1},setAnimationLoop:function(e){n=e},setContext:function(t){e=t}}}function Bn(e){const t=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),t.get(e)},remove:function(n){n.isInterleavedBufferAttribute&&(n=n.data);const i=t.get(n);i&&(e.deleteBuffer(i.buffer),t.delete(n))},update:function(n,i){if(n.isInterleavedBufferAttribute&&(n=n.data),n.isGLBufferAttribute){const e=t.get(n);return void((!e||e.versione.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn v;\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColorBlended;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat hard_shadow = step( mean, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\t#endif\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tshadow = step( depth, shadowCoord.z );\n\t\t\t\t#else\n\t\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t\t#endif\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tshadow = step( depth, dp );\n\t\t\t#else\n\t\t\t\tshadow = step( dp, depth );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distance_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distance_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n \t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Hn={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},zn=new u,kn=new f;function Xn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,A=0,R=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?i:t).get(n)}return n}function C(t,n){t.getRGB(Wn,g(e)),r.buffers.color.setClear(Wn.r,Wn.g,Wn.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const i=b(t);null===i?C(E,M):i&&i.isColor&&(C(i,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?r.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&r.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=b(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),zn.copy(n.backgroundRotation),zn.x*=-1,zn.y*=-1,zn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(zn.y*=-1,zn.z*=-1),T.material.uniforms.envMap.value=i,T.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(kn.makeRotationFromEuler(zn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&A===i.version&&R===e.toneMapping||(T.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):i&&i.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=i,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),S.material.uniforms.uvTransform.value.copy(i.matrix),x===i&&A===i.version&&R===e.toneMapping||(S.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function Yn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=P:t===b&&(e.mapping=L),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping;if(a===R||a===b){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new C(a.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const $n=[.125,.215,.35,.446,.526,.582],Qn=20,Jn=new D,ei=new n;let ti=null,ni=0,ii=0,ri=!1;const ai=new r;class oi{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ai}=r;ti=this._renderer.getRenderTarget(),ni=this._renderer.getActiveCubeFace(),ii=this._renderer.getActiveMipmapLevel(),ri=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=di(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ci(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=$n[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const T=new U;T.setAttribute("position",new B(v,h)),T.setAttribute("uv",new B(E,_)),T.setAttribute("faceIndex",new B(S,g)),i.push(new o(T,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Qn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Qn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:O,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ui(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:O,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new U,e);this._renderer.compile(t,Jn)}_sceneToCubeUV(e,t,n,i,r){const a=new w(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(ei),u.toneMapping=I,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new N({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(ei),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;li(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===P||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=di()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ci());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;li(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Jn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,li(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Jn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,li(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Jn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&y("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Qn;m>Qn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Jn)}}function si(e,t,n){const i=new F(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function li(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ci(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:O,depthTest:!1,depthWrite:!1})}function di(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:O,depthTest:!1,depthWrite:!1})}function ui(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function fi(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=a===R||a===b,s=a===P||a===L;if(o||s){let a=t.get(r);const l=void 0!==a?a.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new oi(e)),a=o?n.fromEquirectangular(r,a):n.fromCubemap(r,a),a.texture.pmremVersion=r.pmremVersion,t.set(r,a),a.texture;if(void 0!==a)return a.texture;{const l=r.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;in.maxTextureSize&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new D(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],T=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=bi[r];if(void 0===a&&(a=new Float32Array(r),bi[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function wi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function br(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let Cr=0;const Pr=new e;function Lr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Ur(e,t){const n=function(e){p._getMatrix(Pr,p.workingColorSpace,e);const t=`mat3( ${Pr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}const Dr={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function wr(e,t){const n=Dr[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ir=new r;function Nr(){p.getLuminanceCoefficients(Ir);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ir.x.toFixed(4)}, ${Ir.y.toFixed(4)}, ${Ir.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function yr(e){return""!==e}function Or(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Fr(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Br=/^[ \t]*#include +<([\w\d./]+)>/gm;function Gr(e){return e.replace(Br,Vr)}const Hr=new Map;function Vr(e,t){let n=Gn[t];if(void 0===n){const e=Hr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Gr(n)}const Wr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function zr(e){return e.replace(Wr,kr)}function kr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(yr).join("\n"),g.length>0&&(g+="\n")):(_=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(yr).join("\n"),g=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==I?"#define TONE_MAPPING":"",n.toneMapping!==I?Gn.tonemapping_pars_fragment:"",n.toneMapping!==I?wr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Ur("linearToOutputTexel",n.outputColorSpace),Nr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(yr).join("\n")),o=Gr(o),o=Or(o,n),o=Fr(o,n),s=Gr(s),s=Or(s,n),s=Fr(s,n),o=zr(o),s=zr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g);const S=v+_+o,T=v+g+s,M=br(r,r.VERTEX_SHADER,S),x=br(r,r.FRAGMENT_SHADER,T);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(M)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,M,x);else{const e=Lr(r,M,"vertex"),n=Lr(r,x,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(M),r.deleteShader(x),R=new Rr(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,ie=o.transmission>0,re=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,fe=!!o.specularMap,pe=!!o.specularColorMap,me=!!o.specularIntensityMap,he=ie&&!!o.transmissionMap,Se=ie&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Ae=!!o.alphaHash,Re=!!o.extensions;let be=I;o.toneMapped&&(null!==O&&!0!==O.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:w,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:H,batchingColor:H&&null!==T._colorsTexture,instancing:B,instancingColor:B&&null!==T.instanceColor,instancingMorph:B&&null!==T.morphTexture,outputColorSpace:null===O?e.outputColorSpace:!0===O.isXRRenderTarget?O.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:z,envMapMode:z&&R.mapping,envMapCubeUVHeight:b,aoMap:k,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===Ee,normalMapTangentSpace:K&&o.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===ge&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Ae,combine:o.combine,mapUv:V&&S(o.map.channel),aoMapUv:k&&S(o.aoMap.channel),lightMapUv:X&&S(o.lightMap.channel),bumpMapUv:Y&&S(o.bumpMap.channel),normalMapUv:K&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:q&&S(o.emissiveMap.channel),metalnessMapUv:Z&&S(o.metalnessMap.channel),roughnessMapUv:$&&S(o.roughnessMap.channel),anisotropyMapUv:re&&S(o.anisotropyMap.channel),clearcoatMapUv:ae&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&S(o.sheenRoughnessMap.channel),specularMapUv:fe&&S(o.specularMap.channel),specularColorMapUv:pe&&S(o.specularColorMap.channel),specularIntensityMapUv:me&&S(o.specularIntensityMap.channel),transmissionMapUv:he&&S(o.transmissionMap.channel),thicknessMapUv:Se&&S(o.thicknessMap.channel),alphaMapUv:Me&&S(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:_,reversedDepthBuffer:F,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===_e,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Re&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===o.extensions.multiDraw||H)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.instancing&&l.enable(0);t.instancingColor&&l.enable(1);t.instancingMorph&&l.enable(2);t.matcap&&l.enable(3);t.envMap&&l.enable(4);t.normalMapObjectSpace&&l.enable(5);t.normalMapTangentSpace&&l.enable(6);t.clearcoat&&l.enable(7);t.iridescence&&l.enable(8);t.alphaTest&&l.enable(9);t.vertexColors&&l.enable(10);t.vertexAlphas&&l.enable(11);t.vertexUv1s&&l.enable(12);t.vertexUv2s&&l.enable(13);t.vertexUv3s&&l.enable(14);t.vertexTangents&&l.enable(15);t.anisotropy&&l.enable(16);t.alphaHash&&l.enable(17);t.batching&&l.enable(18);t.dispersion&&l.enable(19);t.batchingColor&&l.enable(20);t.gradientMap&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reversedDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=h.get(n);return void 0!==i?++i.usedTimes:(i=new Zr(e,n,t,o),f.push(i),h.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=f.indexOf(e);f[t]=f[f.length-1],f.pop(),h.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){d.remove(e)},programs:f,dispose:function(){d.dispose()}}}function ta(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function ia(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function ra(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||na),i.length>1&&i.sort(t||ia),r.length>1&&r.sort(t||ia)}}}function aa(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ra,e.set(t,[r])):n>=i.length?(r=new ra,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function oa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let sa=0;function la(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ca(e){const n=new oa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(la);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=sa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new da(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const fa=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],pa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],ma=new f,ha=new r,_a=new r;function ga(e,n,i){let r=new Me;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const T=new U;T.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new F(a.x,a.y,{format:Te,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",D)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===ce)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y)),null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new F(a.x,a.y,{format:Te,type:S,minFilter:H,magFilter:H,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else{l.isPointLight?(c.map=new C(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new F(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be;const t=e.state.buffers.depth.getReversed();this.type===de?(c.map.depthTexture.compareFunction=t?re:ae,c.map.depthTexture.minFilter=H,c.map.depthTexture.magFilter=H):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce)}c.camera.updateProjectionMatrix()}const h=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,F={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==H?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void z(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const N={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},O={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},F={[xt]:e.NEVER,[Mt]:e.ALWAYS,[Tt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==H&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,N[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,N[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,N[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,O[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,O[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,F[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function z(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,T=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);B(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)T=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,n=M.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=bt(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,T,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,T,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=J(M[0]);i.texStorage2D(e.TEXTURE_2D,D,T,t.width,t.height)}for(let t=0,n=M.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer)if(a)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),X(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),X(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function Q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==G&&n!==At&&(p.getTransfer(n)===m?i===x&&r===T||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):y("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=w;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),w+=1,e},this.resetTextureUnits=function(){w=0},this.setTexture2D=I,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?z(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),T=o.convert(n.type),M=b(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(B(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,h[t].width,h[t].height,0,g,T,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===$(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===$(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class xa extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let P=null;const L=new w;L.viewport=new X;const U=new w;U.viewport=new X;const D=[L,U],I=new Cn;let N=null,y=null;function O(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",O),a.removeEventListener("selectstart",O),a.removeEventListener("selectend",O),a.removeEventListener("squeeze",O),a.removeEventListener("squeezestart",O),a.removeEventListener("squeezeend",O),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){M=e.getRenderTarget(),a.addEventListener("select",O),a.addEventListener("selectstart",O),a.addEventListener("selectend",O),a.addEventListener("squeeze",O),a.addEventListener("squeezestart",O),a.addEventListener("squeezeend",O),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new F(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new F(m.framebufferWidth,m.framebufferHeight,{format:x,type:T,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),k.setContext(a),k.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=U.near=L.near=t,I.far=U.far=L.far=n,N===I.near&&y===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),N=I.near,y=I.far),I.layers.mask=6|e.layers.mask,L.layers.mask=-5&I.layers.mask,U.layers.mask=-3&I.layers.mask;const i=e.parent,r=I.cameras;W(I,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,Aa.copy(o),Aa.x*=-1,Aa.y*=-1,Aa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(Aa.y*=-1,Aa.z*=-1),e.envMapRotation.value.setFromMatrix4(Ra.makeRotationFromEuler(Aa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function Ca(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=I;i.toneMapped&&(null!==z&&!0!==z.isXRRenderTarget||(m=N.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=Se.get(i),v=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===k;Ne.setState(i,e,t)}let E=!1;i.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||r.isBatchedMesh&&!1===g.batching?E=!0:r.isBatchedMesh||!0!==g.batching?r.isBatchedMesh&&!0===g.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===g.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===g.instancing?E=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?E=!0:r.isSkinnedMesh||!0!==g.skinning?r.isInstancedMesh&&!0===g.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===g.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===g.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===g.instancingMorph&&null!==r.morphTexture||g.envMap!==l||!0===i.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ne.numPlanes&&g.numIntersection===Ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=i.version);let T=g.currentProgram;!0===E&&(T=st(i,t,r));let M=!1,x=!1,A=!1;const R=T.getUniforms(),b=g.uniforms;ve.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==k&&(k=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ze,"projectionMatrix",e.projectionMatrix),R.setValue(ze,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ze,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ze,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ze,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ze,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ze,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ze,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ze,r,"bindMatrix"),R.setOptional(ze,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ze,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ze,r,"batchingTexture"),R.setValue(ze,"batchingTexture",r._matricesTexture,xe),R.setOptional(ze,r,"batchingIdTexture"),R.setValue(ze,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ze,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ze,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Fe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ze,"receiveShadow",r.receiveShadow));i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);void 0!==b.dfgLUT&&(b.dfgLUT.value=(null===La&&(La=new Un(Pa,16,16,Te,S),La.name="DFG_LUT",La.minFilter=H,La.magFilter=H,La.wrapS=ft,La.wrapT=ft,La.generateMipmaps=!1,La.needsUpdate=!0),La));x&&(R.setValue(ze,"toneMappingExposure",N.toneMappingExposure),g.needsLights&&(U=A,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===i.fog&&De.refreshFogUniforms(b,a),De.refreshMaterialUniforms(b,i,ee,J,L.state.transmissionRenderTarget[e.id]),Rr.upload(ze,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ze,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ze,"center",r.center);if(R.setValue(ze,"modelViewMatrix",r.modelViewMatrix),R.setValue(ze,"normalMatrix",r.normalMatrix),R.setValue(ze,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new Fn;function nt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Pe.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Pe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new F(1,1,{generateMipmaps:!0,type:e?S:T,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*N.transmissionResolutionScale,a.w*N.transmissionResolutionScale);const s=N.getRenderTarget(),l=N.getActiveCubeFace(),d=N.getActiveMipmapLevel();N.setRenderTarget(r),N.getClearColor(Z),$=N.getClearAlpha(),$<1&&N.setClearColor(16777215,.5),N.clear(),pe&&Oe.render(n);const u=N.toneMapping;N.toneMapping=I;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ne.setGlobalState(N.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),pe&&Oe.render(e),it(P,e,t)}null!==z&&0===W&&(xe.updateMultisampleRenderTarget(z),xe.updateRenderTargetMipmap(z)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),k=-1,Y=null,D.pop(),D.length>0?(L=D[D.length-1],!0===se&&Ne.setGlobalState(N.clippingPlanes,L.state.camera)):L=null,U.pop(),P=U.length>0?U[U.length-1]:null},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return z},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ze.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){z=e,B=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(ze.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(k=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=dt);if(ve.bindFramebuffer(ze.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ze.framebufferTexture2D(ze.FRAMEBUFFER,ze.COLOR_ATTACHMENT0,ze.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&ze.readBuffer(ze.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(l))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(c))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&ze.readPixels(t,n,i,r,He.convert(l),He.convert(c),a)}finally{const e=null!==z?Se.get(z).__webglFramebuffer:null;ve.bindFramebuffer(ze.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(ze.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&ze.readBuffer(ze.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ze.createBuffer();ze.bindBuffer(ze.PIXEL_PACK_BUFFER,u),ze.bufferData(ze.PIXEL_PACK_BUFFER,a.byteLength,ze.STREAM_READ),ze.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==z?Se.get(z).__webglFramebuffer:null;ve.bindFramebuffer(ze.FRAMEBUFFER,f);const p=ze.fenceSync(ze.SYNC_GPU_COMMANDS_COMPLETE,0);return ze.flush(),await On(ze,p,4),ze.bindBuffer(ze.PIXEL_PACK_BUFFER,u),ze.getBufferSubData(ze.PIXEL_PACK_BUFFER,0,a),ze.deleteBuffer(u),ze.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;xe.setTexture2D(e,0),ze.copyTexSubImage2D(ze.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ze.createFramebuffer(),pt=ze.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ze.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ze.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ze.TEXTURE_2D),ze.pixelStorei(ze.UNPACK_FLIP_Y_WEBGL,t.flipY),ze.pixelStorei(ze.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ze.pixelStorei(ze.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ze.getParameter(ze.UNPACK_ROW_LENGTH),S=ze.getParameter(ze.UNPACK_IMAGE_HEIGHT),T=ze.getParameter(ze.UNPACK_SKIP_PIXELS),M=ze.getParameter(ze.UNPACK_SKIP_ROWS),x=ze.getParameter(ze.UNPACK_SKIP_IMAGES);ze.pixelStorei(ze.UNPACK_ROW_LENGTH,h.width),ze.pixelStorei(ze.UNPACK_IMAGE_HEIGHT,h.height),ze.pixelStorei(ze.UNPACK_SKIP_PIXELS,c),ze.pixelStorei(ze.UNPACK_SKIP_ROWS,d),ze.pixelStorei(ze.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(ze.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ze.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;ne.start-t.start);let t=0;for(let e=1;e 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif\n#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nvec3 pow2( const in vec3 x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n} // validated",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\n\t\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\n\t\tuv.x *= CUBEUV_TEXEL_WIDTH;\n\t\tuv.y *= CUBEUV_TEXEL_HEIGHT;\n\t\t#ifdef texture2DGradEXT\n\t\t\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\n\t\t#else\n\t\t\treturn texture2D( envMap, uv ).rgb;\n\t\t#endif\n\t}\n\t#define cubeUV_r0 1.0\n\t#define cubeUV_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\n\t#define cubeUV_m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= cubeUV_r1 ) {\n\t\t\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\n\t\t} else if ( roughness >= cubeUV_r4 ) {\n\t\t\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\n\t\t} else if ( roughness >= cubeUV_r5 ) {\n\t\t\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\n\t\t} else if ( roughness >= cubeUV_r6 ) {\n\t\t\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 reflectVec = reflect( - viewDir, normal );\n\t\t\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn vec3( texture2D( gradientMap, coord ).r );\n\t#else\n\t\tvec2 fw = fwidth( coord ) * 0.5;\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\n\t#endif\n}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",lights_lambert_pars_fragment:"varying vec3 vViewPosition;\nstruct LambertMaterial {\n\tvec3 diffuseColor;\n\tfloat specularStrength;\n};\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Lambert\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Lambert",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.metalness = metalnessFactor;\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\tmaterial.ior = ior;\n\t#ifdef USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = vec3( 0.04 );\n\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_DISPERSION\n\tmaterial.dispersion = dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tmaterial.iridescence = iridescence;\n\tmaterial.iridescenceIOR = iridescenceIOR;\n\t#ifdef USE_IRIDESCENCEMAP\n\t\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\n\t#else\n\t\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\n\t#endif\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"uniform sampler2D dfgLUT;\nstruct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tvec3 diffuseContribution;\n\tvec3 specularColor;\n\tvec3 specularColorBlended;\n\tfloat roughness;\n\tfloat metalness;\n\tfloat specularF90;\n\tfloat dispersion;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_IRIDESCENCE\n\t\tfloat iridescence;\n\t\tfloat iridescenceIOR;\n\t\tfloat iridescenceThickness;\n\t\tvec3 iridescenceFresnel;\n\t\tvec3 iridescenceF0;\n\t\tvec3 iridescenceFresnelDielectric;\n\t\tvec3 iridescenceFresnelMetallic;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n\t#ifdef IOR\n\t\tfloat ior;\n\t#endif\n\t#ifdef USE_TRANSMISSION\n\t\tfloat transmission;\n\t\tfloat transmissionAlpha;\n\t\tfloat thickness;\n\t\tfloat attenuationDistance;\n\t\tvec3 attenuationColor;\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\n float x2 = x * x;\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn v;\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\n\t\tfloat alpha = pow2( roughness );\n\t\tvec3 halfDir = normalize( lightDir + viewDir );\n\t\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\t\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\t\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\t\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\t\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t\treturn F * ( V * D );\n\t}\n#endif\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColorBlended;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.roughness;\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat r2 = roughness * roughness;\n\tfloat rInv = 1.0 / ( roughness + 0.1 );\n\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\n\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\n\tfloat DG = exp( a * dotNV + b );\n\treturn saturate( DG );\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\n#ifdef USE_IRIDESCENCE\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#else\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n#endif\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\n\t#ifdef USE_IRIDESCENCE\n\t\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\n\t#else\n\t\tvec3 Fr = specularColor;\n\t#endif\n\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\n\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\n\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\n\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\n\tfloat Ess_V = dfgV.x + dfgV.y;\n\tfloat Ess_L = dfgL.x + dfgL.y;\n\tfloat Ems_V = 1.0 - Ess_V;\n\tfloat Ems_L = 1.0 - Ess_L;\n\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\n\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\n\tfloat compensationFactor = Ems_V * Ems_L;\n\tvec3 multiScatter = Fms * compensationFactor;\n\treturn singleScatter + multiScatter;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n \n \t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n \n \t\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n \t\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\n \n \t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\n \n \t\tirradiance *= sheenEnergyComp;\n \n \t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tdiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectDiffuse += diffuse;\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\n \t#endif\n\tvec3 singleScatteringDielectric = vec3( 0.0 );\n\tvec3 multiScatteringDielectric = vec3( 0.0 );\n\tvec3 singleScatteringMetallic = vec3( 0.0 );\n\tvec3 multiScatteringMetallic = vec3( 0.0 );\n\t#ifdef USE_IRIDESCENCE\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\n\t#endif\n\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\n\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\n\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\n\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tvec3 indirectSpecular = radiance * singleScattering;\n\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\n\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\n\t#ifdef USE_SHEEN\n\t\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\n\t\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\n\t\tindirectSpecular *= sheenEnergyComp;\n\t\tindirectDiffuse *= sheenEnergyComp;\n\t#endif\n\treflectedLight.indirectSpecular += indirectSpecular;\n\treflectedLight.indirectDiffuse += indirectDiffuse;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\n\t\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tdiffuseColor *= texture2D( map, uv );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\n\tvColor *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t#if defined( USE_COLOR_ALPHA )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\n\t\t#elif defined( USE_COLOR )\n\t\t\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\n\t\t#endif\n\t}\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = dFdx( vViewPosition );\n\tvec3 fdy = dFdy( vViewPosition );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( const in vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn depth * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#else\n\t\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\t\t\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\t#endif\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat interleavedGradientNoise( vec2 position ) {\n\t\t\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\n\t\t}\n\t\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\n\t\t\tconst float goldenAngle = 2.399963229728653;\n\t\t\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\n\t\t\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\n\t\t\treturn vec2( cos( theta ), sin( theta ) ) * r;\n\t\t}\n\t#endif\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\t\tfloat radius = shadowRadius * texelSize.x;\n\t\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tfloat dp = 1.0 - shadowCoord.z;\n\t\t\t\t#else\n\t\t\t\t\tfloat dp = shadowCoord.z;\n\t\t\t\t#endif\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, dp ) ) +\n\t\t\t\t\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, dp ) )\n\t\t\t\t) * 0.2;\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\n\t\t\t\tfloat mean = distribution.x;\n\t\t\t\tfloat variance = distribution.y * distribution.y;\n\t\t\t\tfloat hard_shadow = step( shadowCoord.z, mean );\n\t\t\t\tif ( hard_shadow == 1.0 ) {\n\t\t\t\t\tshadow = 1.0;\n\t\t\t\t} else {\n\t\t\t\t\tvariance = max( variance, 0.0000001 );\n\t\t\t\t\tfloat d = shadowCoord.z - mean;\n\t\t\t\t\tfloat p_max = variance / ( variance + d * d );\n\t\t\t\t\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\n\t\t\t\t\tshadow = max( hard_shadow, p_max );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#else\n\t\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\t\tfloat shadow = 1.0;\n\t\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\t\tshadowCoord.z += shadowBias;\n\t\t\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n\t\t\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n\t\t\tif ( frustumTest ) {\n\t\t\t\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\n\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\tdepth = 1.0 - depth;\n\t\t\t\t#endif\n\t\t\t\tshadow = step( shadowCoord.z, depth );\n\t\t\t}\n\t\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t\t}\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#if defined( SHADOWMAP_TYPE_PCF )\n\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tfloat dp = ( shadowCameraNear * ( shadowCameraFar - viewSpaceZ ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp -= shadowBias;\n\t\t\t#else\n\t\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\t\tdp += shadowBias;\n\t\t\t#endif\n\t\t\tfloat texelSize = shadowRadius / shadowMapSize.x;\n\t\t\tvec3 absDir = abs( bd3D );\n\t\t\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\n\t\t\ttangent = normalize( cross( bd3D, tangent ) );\n\t\t\tvec3 bitangent = cross( bd3D, tangent );\n\t\t\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * PI2;\n\t\t\tvec2 sample0 = vogelDiskSample( 0, 5, phi );\n\t\t\tvec2 sample1 = vogelDiskSample( 1, 5, phi );\n\t\t\tvec2 sample2 = vogelDiskSample( 2, 5, phi );\n\t\t\tvec2 sample3 = vogelDiskSample( 3, 5, phi );\n\t\t\tvec2 sample4 = vogelDiskSample( 4, 5, phi );\n\t\t\tshadow = (\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample0.x + bitangent * sample0.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample1.x + bitangent * sample1.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample2.x + bitangent * sample2.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample3.x + bitangent * sample3.y ) * texelSize, dp ) ) +\n\t\t\t\ttexture( shadowMap, vec4( bd3D + ( tangent * sample4.x + bitangent * sample4.y ) * texelSize, dp ) )\n\t\t\t) * 0.2;\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#elif defined( SHADOWMAP_TYPE_BASIC )\n\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 absVec = abs( lightToPosition );\n\t\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\n\t\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\n\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tfloat depth = textureCube( shadowMap, bd3D ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tshadow = step( dp, depth );\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n\t#endif\n\t#endif\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowIntensity;\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\n\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\tvec4 shadowWorldPosition;\n#endif\n#if defined( USE_SHADOWMAP )\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if NUM_SPOT_LIGHT_COORDS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition;\n\t\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\n\t\t#endif\n\t\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3( 1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108, 1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605, 1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tmaterial.transmission = transmission;\n\tmaterial.transmissionAlpha = 1.0;\n\tmaterial.thickness = thickness;\n\tmaterial.attenuationDistance = attenuationDistance;\n\tmaterial.attenuationColor = attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\n\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\n\t\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\n\t\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\n\t\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nuniform float backgroundIntensity;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",backgroundCube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",backgroundCube_frag:"#ifdef ENVMAP_TYPE_CUBE\n\tuniform samplerCube envMap;\n#elif defined( ENVMAP_TYPE_CUBE_UV )\n\tuniform sampler2D envMap;\n#endif\nuniform float flipEnvMap;\nuniform float backgroundBlurriness;\nuniform float backgroundIntensity;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\n\t#else\n\t\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t#endif\n\ttexColor.rgb *= backgroundIntensity;\n\tgl_FragColor = texColor;\n\t#include \n\t#include \n}",cube_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldDirection;\nvoid main() {\n\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\n\tgl_FragColor = texColor;\n\tgl_FragColor.a *= opacity;\n\t#include \n\t#include \n}",depth_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\n\t#else\n\t\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\n\t#endif\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distance_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}",distance_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\t#include \n\t#include \n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshlambert_frag:"#define LAMBERT\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t#else\n\t\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\n#endif\n#ifdef USE_IRIDESCENCE\n\tuniform float iridescence;\n\tuniform float iridescenceIOR;\n\tuniform float iridescenceThicknessMinimum;\n\tuniform float iridescenceThicknessMaximum;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include \n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_SHEEN\n \n\t\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\n \n \t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",points_vert:"uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_vert:"#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n\t#include \n\t#include \n\t#include \n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 mvPosition = modelViewMatrix[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\t#include \n\t#include \n\t#include \n\t#include \n}"},Hn={common:{diffuse:{value:new n(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new e}},envmap:{envMap:{value:null},envMapRotation:{value:new e},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},dfgLUT:{value:null}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new e}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new e}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new e},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new e},normalScale:{value:new t(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new e},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new e}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new e}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new e}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new n(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new n(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0},uvTransform:{value:new e}},sprite:{diffuse:{value:new n(16777215)},opacity:{value:1},center:{value:new t(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new e},alphaMap:{value:null},alphaMapTransform:{value:new e},alphaTest:{value:0}}},Vn={basic:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.fog]),vertexShader:Gn.meshbasic_vert,fragmentShader:Gn.meshbasic_frag},lambert:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshlambert_vert,fragmentShader:Gn.meshlambert_frag},phong:{uniforms:i([Hn.common,Hn.specularmap,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},specular:{value:new n(1118481)},shininess:{value:30}}]),vertexShader:Gn.meshphong_vert,fragmentShader:Gn.meshphong_frag},standard:{uniforms:i([Hn.common,Hn.envmap,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.roughnessmap,Hn.metalnessmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag},toon:{uniforms:i([Hn.common,Hn.aomap,Hn.lightmap,Hn.emissivemap,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.gradientmap,Hn.fog,Hn.lights,{emissive:{value:new n(0)}}]),vertexShader:Gn.meshtoon_vert,fragmentShader:Gn.meshtoon_frag},matcap:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,Hn.fog,{matcap:{value:null}}]),vertexShader:Gn.meshmatcap_vert,fragmentShader:Gn.meshmatcap_frag},points:{uniforms:i([Hn.points,Hn.fog]),vertexShader:Gn.points_vert,fragmentShader:Gn.points_frag},dashed:{uniforms:i([Hn.common,Hn.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Gn.linedashed_vert,fragmentShader:Gn.linedashed_frag},depth:{uniforms:i([Hn.common,Hn.displacementmap]),vertexShader:Gn.depth_vert,fragmentShader:Gn.depth_frag},normal:{uniforms:i([Hn.common,Hn.bumpmap,Hn.normalmap,Hn.displacementmap,{opacity:{value:1}}]),vertexShader:Gn.meshnormal_vert,fragmentShader:Gn.meshnormal_frag},sprite:{uniforms:i([Hn.sprite,Hn.fog]),vertexShader:Gn.sprite_vert,fragmentShader:Gn.sprite_frag},background:{uniforms:{uvTransform:{value:new e},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Gn.background_vert,fragmentShader:Gn.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new e}},vertexShader:Gn.backgroundCube_vert,fragmentShader:Gn.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Gn.cube_vert,fragmentShader:Gn.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Gn.equirect_vert,fragmentShader:Gn.equirect_frag},distance:{uniforms:i([Hn.common,Hn.displacementmap,{referencePosition:{value:new r},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Gn.distance_vert,fragmentShader:Gn.distance_frag},shadow:{uniforms:i([Hn.lights,Hn.fog,{color:{value:new n(0)},opacity:{value:1}}]),vertexShader:Gn.shadow_vert,fragmentShader:Gn.shadow_frag}};Vn.physical={uniforms:i([Vn.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new e},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new e},clearcoatNormalScale:{value:new t(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new e},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new e},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new e},sheen:{value:0},sheenColor:{value:new n(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new e},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new e},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new e},transmissionSamplerSize:{value:new t},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new e},attenuationDistance:{value:0},attenuationColor:{value:new n(0)},specularColor:{value:new n(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new e},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new e},anisotropyVector:{value:new t},anisotropyMap:{value:null},anisotropyMapTransform:{value:new e}}]),vertexShader:Gn.meshphysical_vert,fragmentShader:Gn.meshphysical_frag};const Wn={r:0,b:0,g:0},kn=new u,zn=new f;function Xn(e,t,i,r,u,f,v){const E=new n(0);let S,T,M=!0===f?0:1,x=null,A=0,R=null;function b(e){let n=!0===e.isScene?e.background:null;if(n&&n.isTexture){n=(e.backgroundBlurriness>0?i:t).get(n)}return n}function C(t,n){t.getRGB(Wn,g(e)),r.buffers.color.setClear(Wn.r,Wn.g,Wn.b,n,v)}return{getClearColor:function(){return E},setClearColor:function(e,t=1){E.set(e),M=t,C(E,M)},getClearAlpha:function(){return M},setClearAlpha:function(e){M=e,C(E,M)},render:function(t){let n=!1;const i=b(t);null===i?C(E,M):i&&i.isColor&&(C(i,1),n=!0);const a=e.xr.getEnvironmentBlendMode();"additive"===a?r.buffers.color.setClear(0,0,0,1,v):"alpha-blend"===a&&r.buffers.color.setClear(0,0,0,0,v),(e.autoClear||n)&&(r.buffers.depth.setTest(!0),r.buffers.depth.setMask(!0),r.buffers.color.setMask(!0),e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil))},addToRenderList:function(t,n){const i=b(n);i&&(i.isCubeTexture||i.mapping===a)?(void 0===T&&(T=new o(new s(1,1,1),new l({name:"BackgroundCubeMaterial",uniforms:d(Vn.backgroundCube.uniforms),vertexShader:Vn.backgroundCube.vertexShader,fragmentShader:Vn.backgroundCube.fragmentShader,side:c,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),T.geometry.deleteAttribute("normal"),T.geometry.deleteAttribute("uv"),T.onBeforeRender=function(e,t,n){this.matrixWorld.copyPosition(n.matrixWorld)},Object.defineProperty(T.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),u.update(T)),kn.copy(n.backgroundRotation),kn.x*=-1,kn.y*=-1,kn.z*=-1,i.isCubeTexture&&!1===i.isRenderTargetTexture&&(kn.y*=-1,kn.z*=-1),T.material.uniforms.envMap.value=i,T.material.uniforms.flipEnvMap.value=i.isCubeTexture&&!1===i.isRenderTargetTexture?-1:1,T.material.uniforms.backgroundBlurriness.value=n.backgroundBlurriness,T.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,T.material.uniforms.backgroundRotation.value.setFromMatrix4(zn.makeRotationFromEuler(kn)),T.material.toneMapped=p.getTransfer(i.colorSpace)!==m,x===i&&A===i.version&&R===e.toneMapping||(T.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),T.layers.enableAll(),t.unshift(T,T.geometry,T.material,0,0,null)):i&&i.isTexture&&(void 0===S&&(S=new o(new h(2,2),new l({name:"BackgroundMaterial",uniforms:d(Vn.background.uniforms),vertexShader:Vn.background.vertexShader,fragmentShader:Vn.background.fragmentShader,side:_,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),S.geometry.deleteAttribute("normal"),Object.defineProperty(S.material,"map",{get:function(){return this.uniforms.t2D.value}}),u.update(S)),S.material.uniforms.t2D.value=i,S.material.uniforms.backgroundIntensity.value=n.backgroundIntensity,S.material.toneMapped=p.getTransfer(i.colorSpace)!==m,!0===i.matrixAutoUpdate&&i.updateMatrix(),S.material.uniforms.uvTransform.value.copy(i.matrix),x===i&&A===i.version&&R===e.toneMapping||(S.material.needsUpdate=!0,x=i,A=i.version,R=e.toneMapping),S.layers.enableAll(),t.unshift(S,S.geometry,S.material,0,0,null))},dispose:function(){void 0!==T&&(T.geometry.dispose(),T.material.dispose(),T=void 0),void 0!==S&&(S.geometry.dispose(),S.material.dispose(),S=void 0)}}}function Yn(e,t){const n=e.getParameter(e.MAX_VERTEX_ATTRIBS),i={},r=c(null);let a=r,o=!1;function s(t){return e.bindVertexArray(t)}function l(t){return e.deleteVertexArray(t)}function c(e){const t=[],i=[],r=[];for(let e=0;e=0){const n=r[t];let i=o[t];if(void 0===i&&("instanceMatrix"===t&&e.instanceMatrix&&(i=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(i=e.instanceColor)),void 0===n)return!0;if(n.attribute!==i)return!0;if(i&&n.data!==i.data)return!0;s++}}return a.attributesNum!==s||a.index!==i}(n,h,l,_),g&&function(e,t,n,i){const r={},o=t.attributes;let s=0;const l=n.getAttributes();for(const t in l){if(l[t].location>=0){let n=o[t];void 0===n&&("instanceMatrix"===t&&e.instanceMatrix&&(n=e.instanceMatrix),"instanceColor"===t&&e.instanceColor&&(n=e.instanceColor));const i={};i.attribute=n,n&&n.data&&(i.data=n.data),r[t]=i,s++}}a.attributes=r,a.attributesNum=s,a.index=i}(n,h,l,_),null!==_&&t.update(_,e.ELEMENT_ARRAY_BUFFER),(g||o)&&(o=!1,function(n,i,r,a){d();const o=a.attributes,s=r.getAttributes(),l=i.defaultAttributeValues;for(const i in s){const r=s[i];if(r.location>=0){let s=o[i];if(void 0===s&&("instanceMatrix"===i&&n.instanceMatrix&&(s=n.instanceMatrix),"instanceColor"===i&&n.instanceColor&&(s=n.instanceColor)),void 0!==s){const i=s.normalized,o=s.itemSize,l=t.get(s);if(void 0===l)continue;const c=l.buffer,d=l.type,p=l.bytesPerElement,h=d===e.INT||d===e.UNSIGNED_INT||s.gpuType===v;if(s.isInterleavedBufferAttribute){const t=s.data,l=t.stride,_=s.offset;if(t.isInstancedInterleavedBuffer){for(let e=0;e0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.HIGH_FLOAT).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(e.VERTEX_SHADER,e.MEDIUM_FLOAT).precision>0&&e.getShaderPrecisionFormat(e.FRAGMENT_SHADER,e.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let o=void 0!==n.precision?n.precision:"highp";const s=a(o);s!==o&&(E("WebGLRenderer:",o,"not supported, using",s,"instead."),o=s);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==r)return r;if(!0===t.has("EXT_texture_filter_anisotropic")){const n=t.get("EXT_texture_filter_anisotropic");r=e.getParameter(n.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else r=0;return r},getMaxPrecision:a,textureFormatReadable:function(t){return t===x||i.convert(t)===e.getParameter(e.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(n){const r=n===S&&(t.has("EXT_color_buffer_half_float")||t.has("EXT_color_buffer_float"));return!(n!==T&&i.convert(n)!==e.getParameter(e.IMPLEMENTATION_COLOR_READ_TYPE)&&n!==M&&!r)},precision:o,logarithmicDepthBuffer:!0===n.logarithmicDepthBuffer,reversedDepthBuffer:!0===n.reversedDepthBuffer&&t.has("EXT_clip_control"),maxTextures:e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS),maxVertexTextures:e.getParameter(e.MAX_VERTEX_TEXTURE_IMAGE_UNITS),maxTextureSize:e.getParameter(e.MAX_TEXTURE_SIZE),maxCubemapSize:e.getParameter(e.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:e.getParameter(e.MAX_VERTEX_ATTRIBS),maxVertexUniforms:e.getParameter(e.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:e.getParameter(e.MAX_VARYING_VECTORS),maxFragmentUniforms:e.getParameter(e.MAX_FRAGMENT_UNIFORM_VECTORS),maxSamples:e.getParameter(e.MAX_SAMPLES),samples:e.getParameter(e.SAMPLES)}}function qn(t){const n=this;let i=null,r=0,a=!1,o=!1;const s=new A,l=new e,c={value:null,needsUpdate:!1};function d(e,t,i,r){const a=null!==e?e.length:0;let o=null;if(0!==a){if(o=c.value,!0!==r||null===o){const n=i+4*a,r=t.matrixWorldInverse;l.getNormalMatrix(r),(null===o||o.length0);n.numPlanes=r,n.numIntersection=0}();else{const e=o?0:r,t=4*e;let n=m.clippingState||null;c.value=n,n=d(u,s,t,l);for(let e=0;e!==t;++e)n[e]=i[e];m.clippingState=n,this.numIntersection=f?this.numPlanes:0,this.numPlanes+=e}}}function Zn(e){let t=new WeakMap;function n(e,t){return t===R?e.mapping=P:t===b&&(e.mapping=L),e}function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping;if(a===R||a===b){if(t.has(r)){return n(t.get(r).texture,r.mapping)}{const a=r.image;if(a&&a.height>0){const o=new C(a.height);return o.fromEquirectangularTexture(e,r),t.set(r,o),r.addEventListener("dispose",i),n(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}const $n=[.125,.215,.35,.446,.526,.582],Qn=20,Jn=new D,ei=new n;let ti=null,ni=0,ii=0,ri=!1;const ai=new r;class oi{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._backgroundBox=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._blurMaterial=null,this._ggxMaterial=null}fromScene(e,t=0,n=.1,i=100,r={}){const{size:a=256,position:o=ai}=r;ti=this._renderer.getRenderTarget(),ni=this._renderer.getActiveCubeFace(),ii=this._renderer.getActiveMipmapLevel(),ri=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(a);const s=this._allocateTargets();return s.depthBuffer=!0,this._sceneToCubeUV(e,n,i,s,o),t>0&&this._blur(s,0,0,t),this._applyPMREM(s),this._cleanup(s),s}fromEquirectangular(e,t=null){return this._fromTexture(e,t)}fromCubemap(e,t=null){return this._fromTexture(e,t)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=di(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=ci(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?l=$n[s-e+4-1]:0===s&&(l=0),n.push(l);const c=1/(a-2),d=-c,u=1+c,f=[d,d,u,d,u,u,d,d,u,u,d,u],p=6,m=6,h=3,_=2,g=1,v=new Float32Array(h*m*p),E=new Float32Array(_*m*p),S=new Float32Array(g*m*p);for(let e=0;e2?0:-1,i=[t,n,0,t+2/3,n,0,t+2/3,n+1,0,t,n,0,t+2/3,n+1,0,t,n+1,0];v.set(i,h*m*e),E.set(f,_*m*e);const r=[e,e,e,e,e,e];S.set(r,g*m*e)}const T=new U;T.setAttribute("position",new B(v,h)),T.setAttribute("uv",new B(E,_)),T.setAttribute("faceIndex",new B(S,g)),i.push(new o(T,null)),r>4&&r--}return{lodMeshes:i,sizeLods:t,sigmas:n}}(i)),this._blurMaterial=function(e,t,n){const i=new Float32Array(Qn),a=new r(0,1,0),o=new l({name:"SphericalGaussianBlur",defines:{n:Qn,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:i},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:a}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1});return o}(i,e,t),this._ggxMaterial=function(e,t,n){const i=new l({name:"PMREMGGXConvolution",defines:{GGX_SAMPLES:256,CUBEUV_TEXEL_WIDTH:1/t,CUBEUV_TEXEL_HEIGHT:1/n,CUBEUV_MAX_MIP:`${e}.0`},uniforms:{envMap:{value:null},roughness:{value:0},mipInt:{value:0}},vertexShader:ui(),fragmentShader:'\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// "Sampling the GGX Distribution of Visible Normals"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tvec3 T1 = vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(V, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + V.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * V;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t',blending:F,depthTest:!1,depthWrite:!1});return i}(i,e,t)}return i}_compileMaterial(e){const t=new o(new U,e);this._renderer.compile(t,Jn)}_sceneToCubeUV(e,t,n,i,r){const a=new w(90,1,t,n),l=[1,-1,1,1,1,1],d=[1,1,1,-1,-1,-1],u=this._renderer,f=u.autoClear,p=u.toneMapping;u.getClearColor(ei),u.toneMapping=I,u.autoClear=!1;u.state.buffers.depth.getReversed()&&(u.setRenderTarget(i),u.clearDepth(),u.setRenderTarget(null)),null===this._backgroundBox&&(this._backgroundBox=new o(new s,new N({name:"PMREM.Background",side:c,depthWrite:!1,depthTest:!1})));const m=this._backgroundBox,h=m.material;let _=!1;const g=e.background;g?g.isColor&&(h.color.copy(g),e.background=null,_=!0):(h.color.copy(ei),_=!0);for(let t=0;t<6;t++){const n=t%3;0===n?(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x+d[t],r.y,r.z)):1===n?(a.up.set(0,0,l[t]),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y+d[t],r.z)):(a.up.set(0,l[t],0),a.position.set(r.x,r.y,r.z),a.lookAt(r.x,r.y,r.z+d[t]));const o=this._cubeSize;li(i,n*o,t>2?o:0,o,o),u.setRenderTarget(i),_&&u.render(m,a),u.render(e,a)}u.toneMapping=p,u.autoClear=f,e.background=g}_textureToCubeUV(e,t){const n=this._renderer,i=e.mapping===P||e.mapping===L;i?(null===this._cubemapMaterial&&(this._cubemapMaterial=di()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===e.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=ci());const r=i?this._cubemapMaterial:this._equirectMaterial,a=this._lodMeshes[0];a.material=r;r.uniforms.envMap.value=e;const o=this._cubeSize;li(t,0,0,3*o,2*o),n.setRenderTarget(t),n.render(a,Jn)}_applyPMREM(e){const t=this._renderer,n=t.autoClear;t.autoClear=!1;const i=this._lodMeshes.length;for(let t=1;tu-4?n-u+4:0),m=4*(this._cubeSize-f);s.envMap.value=e.texture,s.roughness.value=d,s.mipInt.value=u-t,li(r,p,m,3*f,2*f),i.setRenderTarget(r),i.render(o,Jn),s.envMap.value=r.texture,s.roughness.value=0,s.mipInt.value=u-n,li(e,p,m,3*f,2*f),i.setRenderTarget(e),i.render(o,Jn)}_blur(e,t,n,i,r){const a=this._pingPongRenderTarget;this._halfBlur(e,a,t,n,i,"latitudinal",r),this._halfBlur(a,e,n,n,i,"longitudinal",r)}_halfBlur(e,t,n,i,r,a,o){const s=this._renderer,l=this._blurMaterial;"latitudinal"!==a&&"longitudinal"!==a&&y("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[i];c.material=l;const d=l.uniforms,u=this._sizeLods[n]-1,f=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/f,m=isFinite(r)?1+Math.floor(3*p):Qn;m>Qn&&E(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const h=[];let _=0;for(let e=0;eg-4?i-g+4:0),4*(this._cubeSize-v),3*v,2*v),s.setRenderTarget(t),s.render(c,Jn)}}function si(e,t,n){const i=new O(e,t,n);return i.texture.mapping=a,i.texture.name="PMREM.cubeUv",i.scissorTest=!0,i}function li(e,t,n,i,r){e.viewport.set(t,n,i,r),e.scissor.set(t,n,i,r)}function ci(){return new l({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1})}function di(){return new l({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:ui(),fragmentShader:"\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t",blending:F,depthTest:!1,depthWrite:!1})}function ui(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function fi(e){let t=new WeakMap,n=null;function i(e){const n=e.target;n.removeEventListener("dispose",i);const r=t.get(n);void 0!==r&&(t.delete(n),r.dispose())}return{get:function(r){if(r&&r.isTexture){const a=r.mapping,o=a===R||a===b,s=a===P||a===L;if(o||s){let a=t.get(r);const l=void 0!==a?a.texture.pmremVersion:0;if(r.isRenderTargetTexture&&r.pmremVersion!==l)return null===n&&(n=new oi(e)),a=o?n.fromEquirectangular(r,a):n.fromCubemap(r,a),a.texture.pmremVersion=r.pmremVersion,t.set(r,a),a.texture;if(void 0!==a)return a.texture;{const l=r.image;return o&&l&&l.height>0||s&&l&&function(e){let t=0;const n=6;for(let i=0;in.maxTextureSize&&(T=Math.ceil(S/n.maxTextureSize),S=n.maxTextureSize);const x=new Float32Array(S*T*4*u),A=new Y(x,S,T,u);A.type=M,A.needsUpdate=!0;const R=4*E;for(let C=0;C\n\t\t\t#include \n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}",depthTest:!1,depthWrite:!1}),d=new o(l,c),u=new D(-1,1,1,-1,0,1);let f,h=null,_=null,g=!1,v=null,E=[],T=!1;this.setSize=function(e,t){a.setSize(e,t),s.setSize(e,t);for(let n=0;n0&&!0===E[0].isRenderPass;const t=a.width,n=a.height;for(let e=0;e0)return e;const r=t*n;let a=bi[r];if(void 0===a&&(a=new Float32Array(r),bi[r]=a),0!==t){i.toArray(a,0);for(let i=1,r=0;i!==t;++i)r+=n,e[i].toArray(a,r)}return a}function wi(e,t){if(e.length!==t.length)return!1;for(let n=0,i=e.length;n0&&(this.seq=i.concat(r))}setValue(e,t,n,i){const r=this.map[t];void 0!==r&&r.setValue(e,n,i)}setOptional(e,t,n){const i=t[n];void 0!==i&&this.setValue(e,n,i)}static upload(e,t,n,i){for(let r=0,a=t.length;r!==a;++r){const a=t[r],o=n[a.id];!1!==o.needsUpdate&&a.setValue(e,o.value,i)}}static seqWithValue(e,t){const n=[];for(let i=0,r=e.length;i!==r;++i){const r=e[i];r.id in t&&n.push(r)}return n}}function br(e,t,n){const i=e.createShader(t);return e.shaderSource(i,n),e.compileShader(i),i}let Cr=0;const Pr=new e;function Lr(e,t,n){const i=e.getShaderParameter(t,e.COMPILE_STATUS),r=(e.getShaderInfoLog(t)||"").trim();if(i&&""===r)return"";const a=/ERROR: 0:(\d+)/.exec(r);if(a){const i=parseInt(a[1]);return n.toUpperCase()+"\n\n"+r+"\n\n"+function(e,t){const n=e.split("\n"),i=[],r=Math.max(t-6,0),a=Math.min(t+6,n.length);for(let e=r;e":" "} ${r}: ${n[e]}`)}return i.join("\n")}(e.getShaderSource(t),i)}return r}function Ur(e,t){const n=function(e){p._getMatrix(Pr,p.workingColorSpace,e);const t=`mat3( ${Pr.elements.map(e=>e.toFixed(4))} )`;switch(p.getTransfer(e)){case me:return[t,"LinearTransferOETF"];case m:return[t,"sRGBTransferOETF"];default:return E("WebGLProgram: Unsupported color space: ",e),[t,"LinearTransferOETF"]}}(t);return[`vec4 ${e}( vec4 value ) {`,`\treturn ${n[1]}( vec4( value.rgb * ${n[0]}, value.a ) );`,"}"].join("\n")}const Dr={[te]:"Linear",[ee]:"Reinhard",[J]:"Cineon",[Q]:"ACESFilmic",[$]:"AgX",[Z]:"Neutral",[q]:"Custom"};function wr(e,t){const n=Dr[t];return void 0===n?(E("WebGLProgram: Unsupported toneMapping:",t),"vec3 "+e+"( vec3 color ) { return LinearToneMapping( color ); }"):"vec3 "+e+"( vec3 color ) { return "+n+"ToneMapping( color ); }"}const Ir=new r;function Nr(){p.getLuminanceCoefficients(Ir);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${Ir.x.toFixed(4)}, ${Ir.y.toFixed(4)}, ${Ir.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function yr(e){return""!==e}function Fr(e,t){const n=t.numSpotLightShadows+t.numSpotLightMaps-t.numSpotLightShadowsWithMaps;return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,t.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,n).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,t.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Or(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Br=/^[ \t]*#include +<([\w\d./]+)>/gm;function Gr(e){return e.replace(Br,Vr)}const Hr=new Map;function Vr(e,t){let n=Gn[t];if(void 0===n){const e=Hr.get(t);if(void 0===e)throw new Error("Can not resolve #include <"+t+">");n=Gn[e],E('WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',t,e)}return Gr(n)}const Wr=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function kr(e){return e.replace(Wr,zr)}function zr(e,t,n,i){let r="";for(let e=parseInt(t);e0&&(_+="\n"),g=["#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m].filter(yr).join("\n"),g.length>0&&(g+="\n")):(_=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",n.batching?"#define USE_BATCHING":"",n.batchingColor?"#define USE_BATCHING_COLOR":"",n.instancing?"#define USE_INSTANCING":"",n.instancingColor?"#define USE_INSTANCING_COLOR":"",n.instancingMorph?"#define USE_INSTANCING_MORPH":"",n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.map?"#define USE_MAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+d:"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.displacementMap?"#define USE_DISPLACEMENTMAP":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.mapUv?"#define MAP_UV "+n.mapUv:"",n.alphaMapUv?"#define ALPHAMAP_UV "+n.alphaMapUv:"",n.lightMapUv?"#define LIGHTMAP_UV "+n.lightMapUv:"",n.aoMapUv?"#define AOMAP_UV "+n.aoMapUv:"",n.emissiveMapUv?"#define EMISSIVEMAP_UV "+n.emissiveMapUv:"",n.bumpMapUv?"#define BUMPMAP_UV "+n.bumpMapUv:"",n.normalMapUv?"#define NORMALMAP_UV "+n.normalMapUv:"",n.displacementMapUv?"#define DISPLACEMENTMAP_UV "+n.displacementMapUv:"",n.metalnessMapUv?"#define METALNESSMAP_UV "+n.metalnessMapUv:"",n.roughnessMapUv?"#define ROUGHNESSMAP_UV "+n.roughnessMapUv:"",n.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+n.anisotropyMapUv:"",n.clearcoatMapUv?"#define CLEARCOATMAP_UV "+n.clearcoatMapUv:"",n.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+n.clearcoatNormalMapUv:"",n.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+n.clearcoatRoughnessMapUv:"",n.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+n.iridescenceMapUv:"",n.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+n.iridescenceThicknessMapUv:"",n.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+n.sheenColorMapUv:"",n.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+n.sheenRoughnessMapUv:"",n.specularMapUv?"#define SPECULARMAP_UV "+n.specularMapUv:"",n.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+n.specularColorMapUv:"",n.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+n.specularIntensityMapUv:"",n.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+n.transmissionMapUv:"",n.thicknessMapUv?"#define THICKNESSMAP_UV "+n.thicknessMapUv:"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.flatShading?"#define FLAT_SHADED":"",n.skinning?"#define USE_SKINNING":"",n.morphTargets?"#define USE_MORPHTARGETS":"",n.morphNormals&&!1===n.flatShading?"#define USE_MORPHNORMALS":"",n.morphColors?"#define USE_MORPHCOLORS":"",n.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+n.morphTextureStride:"",n.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+n.morphTargetsCount:"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.sizeAttenuation?"#define USE_SIZEATTENUATION":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(yr).join("\n"),g=[Xr(n),"#define SHADER_TYPE "+n.shaderType,"#define SHADER_NAME "+n.shaderName,m,n.useFog&&n.fog?"#define USE_FOG":"",n.useFog&&n.fogExp2?"#define FOG_EXP2":"",n.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",n.map?"#define USE_MAP":"",n.matcap?"#define USE_MATCAP":"",n.envMap?"#define USE_ENVMAP":"",n.envMap?"#define "+c:"",n.envMap?"#define "+d:"",n.envMap?"#define "+u:"",f?"#define CUBEUV_TEXEL_WIDTH "+f.texelWidth:"",f?"#define CUBEUV_TEXEL_HEIGHT "+f.texelHeight:"",f?"#define CUBEUV_MAX_MIP "+f.maxMip+".0":"",n.lightMap?"#define USE_LIGHTMAP":"",n.aoMap?"#define USE_AOMAP":"",n.bumpMap?"#define USE_BUMPMAP":"",n.normalMap?"#define USE_NORMALMAP":"",n.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",n.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",n.emissiveMap?"#define USE_EMISSIVEMAP":"",n.anisotropy?"#define USE_ANISOTROPY":"",n.anisotropyMap?"#define USE_ANISOTROPYMAP":"",n.clearcoat?"#define USE_CLEARCOAT":"",n.clearcoatMap?"#define USE_CLEARCOATMAP":"",n.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",n.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",n.dispersion?"#define USE_DISPERSION":"",n.iridescence?"#define USE_IRIDESCENCE":"",n.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",n.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",n.specularMap?"#define USE_SPECULARMAP":"",n.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",n.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",n.roughnessMap?"#define USE_ROUGHNESSMAP":"",n.metalnessMap?"#define USE_METALNESSMAP":"",n.alphaMap?"#define USE_ALPHAMAP":"",n.alphaTest?"#define USE_ALPHATEST":"",n.alphaHash?"#define USE_ALPHAHASH":"",n.sheen?"#define USE_SHEEN":"",n.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",n.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",n.transmission?"#define USE_TRANSMISSION":"",n.transmissionMap?"#define USE_TRANSMISSIONMAP":"",n.thicknessMap?"#define USE_THICKNESSMAP":"",n.vertexTangents&&!1===n.flatShading?"#define USE_TANGENT":"",n.vertexColors||n.instancingColor||n.batchingColor?"#define USE_COLOR":"",n.vertexAlphas?"#define USE_COLOR_ALPHA":"",n.vertexUv1s?"#define USE_UV1":"",n.vertexUv2s?"#define USE_UV2":"",n.vertexUv3s?"#define USE_UV3":"",n.pointsUvs?"#define USE_POINTS_UV":"",n.gradientMap?"#define USE_GRADIENTMAP":"",n.flatShading?"#define FLAT_SHADED":"",n.doubleSided?"#define DOUBLE_SIDED":"",n.flipSided?"#define FLIP_SIDED":"",n.shadowMapEnabled?"#define USE_SHADOWMAP":"",n.shadowMapEnabled?"#define "+l:"",n.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",n.numLightProbes>0?"#define USE_LIGHT_PROBES":"",n.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",n.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",n.logarithmicDepthBuffer?"#define USE_LOGARITHMIC_DEPTH_BUFFER":"",n.reversedDepthBuffer?"#define USE_REVERSED_DEPTH_BUFFER":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",n.toneMapping!==I?"#define TONE_MAPPING":"",n.toneMapping!==I?Gn.tonemapping_pars_fragment:"",n.toneMapping!==I?wr("toneMapping",n.toneMapping):"",n.dithering?"#define DITHERING":"",n.opaque?"#define OPAQUE":"",Gn.colorspace_pars_fragment,Ur("linearToOutputTexel",n.outputColorSpace),Nr(),n.useDepthPacking?"#define DEPTH_PACKING "+n.depthPacking:"","\n"].filter(yr).join("\n")),o=Gr(o),o=Fr(o,n),o=Or(o,n),s=Gr(s),s=Fr(s,n),s=Or(s,n),o=kr(o),s=kr(s),!0!==n.isRawShaderMaterial&&(v="#version 300 es\n",_=[p,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+_,g=["#define varying in",n.glslVersion===le?"":"layout(location = 0) out highp vec4 pc_fragColor;",n.glslVersion===le?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+g);const S=v+_+o,T=v+g+s,M=br(r,r.VERTEX_SHADER,S),x=br(r,r.FRAGMENT_SHADER,T);function A(t){if(e.debug.checkShaderErrors){const n=r.getProgramInfoLog(h)||"",i=r.getShaderInfoLog(M)||"",a=r.getShaderInfoLog(x)||"",o=n.trim(),s=i.trim(),l=a.trim();let c=!0,d=!0;if(!1===r.getProgramParameter(h,r.LINK_STATUS))if(c=!1,"function"==typeof e.debug.onShaderError)e.debug.onShaderError(r,h,M,x);else{const e=Lr(r,M,"vertex"),n=Lr(r,x,"fragment");y("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(h,r.VALIDATE_STATUS)+"\n\nMaterial Name: "+t.name+"\nMaterial Type: "+t.type+"\n\nProgram Info Log: "+o+"\n"+e+"\n"+n)}else""!==o?E("WebGLProgram: Program Info Log:",o):""!==s&&""!==l||(d=!1);d&&(t.diagnostics={runnable:c,programLog:o,vertexShader:{log:s,prefix:_},fragmentShader:{log:l,prefix:g}})}r.deleteShader(M),r.deleteShader(x),R=new Rr(r,h),b=function(e,t){const n={},i=e.getProgramParameter(t,e.ACTIVE_ATTRIBUTES);for(let r=0;r0,J=o.clearcoat>0,ee=o.dispersion>0,te=o.iridescence>0,ne=o.sheen>0,ie=o.transmission>0,re=Q&&!!o.anisotropyMap,ae=J&&!!o.clearcoatMap,oe=J&&!!o.clearcoatNormalMap,se=J&&!!o.clearcoatRoughnessMap,le=te&&!!o.iridescenceMap,ce=te&&!!o.iridescenceThicknessMap,de=ne&&!!o.sheenColorMap,ue=ne&&!!o.sheenRoughnessMap,fe=!!o.specularMap,pe=!!o.specularColorMap,me=!!o.specularIntensityMap,he=ie&&!!o.transmissionMap,Se=ie&&!!o.thicknessMap,Te=!!o.gradientMap,Me=!!o.alphaMap,xe=o.alphaTest>0,Ae=!!o.alphaHash,Re=!!o.extensions;let be=I;o.toneMapped&&(null!==F&&!0!==F.isXRRenderTarget||(be=e.toneMapping));const Ce={shaderID:C,shaderType:o.type,shaderName:o.name,vertexShader:U,fragmentShader:D,defines:o.defines,customVertexShaderID:w,customFragmentShaderID:N,isRawShaderMaterial:!0===o.isRawShaderMaterial,glslVersion:o.glslVersion,precision:g,batching:H,batchingColor:H&&null!==T._colorsTexture,instancing:B,instancingColor:B&&null!==T.instanceColor,instancingMorph:B&&null!==T.morphTexture,outputColorSpace:null===F?e.outputColorSpace:!0===F.isXRRenderTarget?F.texture.colorSpace:G,alphaToCoverage:!!o.alphaToCoverage,map:V,matcap:W,envMap:k,envMapMode:k&&R.mapping,envMapCubeUVHeight:b,aoMap:z,lightMap:X,bumpMap:Y,normalMap:K,displacementMap:j,emissiveMap:q,normalMapObjectSpace:K&&o.normalMapType===Ee,normalMapTangentSpace:K&&o.normalMapType===ve,metalnessMap:Z,roughnessMap:$,anisotropy:Q,anisotropyMap:re,clearcoat:J,clearcoatMap:ae,clearcoatNormalMap:oe,clearcoatRoughnessMap:se,dispersion:ee,iridescence:te,iridescenceMap:le,iridescenceThicknessMap:ce,sheen:ne,sheenColorMap:de,sheenRoughnessMap:ue,specularMap:fe,specularColorMap:pe,specularIntensityMap:me,transmission:ie,transmissionMap:he,thicknessMap:Se,gradientMap:Te,opaque:!1===o.transparent&&o.blending===ge&&!1===o.alphaToCoverage,alphaMap:Me,alphaTest:xe,alphaHash:Ae,combine:o.combine,mapUv:V&&S(o.map.channel),aoMapUv:z&&S(o.aoMap.channel),lightMapUv:X&&S(o.lightMap.channel),bumpMapUv:Y&&S(o.bumpMap.channel),normalMapUv:K&&S(o.normalMap.channel),displacementMapUv:j&&S(o.displacementMap.channel),emissiveMapUv:q&&S(o.emissiveMap.channel),metalnessMapUv:Z&&S(o.metalnessMap.channel),roughnessMapUv:$&&S(o.roughnessMap.channel),anisotropyMapUv:re&&S(o.anisotropyMap.channel),clearcoatMapUv:ae&&S(o.clearcoatMap.channel),clearcoatNormalMapUv:oe&&S(o.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:se&&S(o.clearcoatRoughnessMap.channel),iridescenceMapUv:le&&S(o.iridescenceMap.channel),iridescenceThicknessMapUv:ce&&S(o.iridescenceThicknessMap.channel),sheenColorMapUv:de&&S(o.sheenColorMap.channel),sheenRoughnessMapUv:ue&&S(o.sheenRoughnessMap.channel),specularMapUv:fe&&S(o.specularMap.channel),specularColorMapUv:pe&&S(o.specularColorMap.channel),specularIntensityMapUv:me&&S(o.specularIntensityMap.channel),transmissionMapUv:he&&S(o.transmissionMap.channel),thicknessMapUv:Se&&S(o.thicknessMap.channel),alphaMapUv:Me&&S(o.alphaMap.channel),vertexTangents:!!x.attributes.tangent&&(K||Q),vertexColors:o.vertexColors,vertexAlphas:!0===o.vertexColors&&!!x.attributes.color&&4===x.attributes.color.itemSize,pointsUvs:!0===T.isPoints&&!!x.attributes.uv&&(V||Me),fog:!!M,useFog:!0===o.fog,fogExp2:!!M&&M.isFogExp2,flatShading:!0===o.flatShading&&!1===o.wireframe,sizeAttenuation:!0===o.sizeAttenuation,logarithmicDepthBuffer:_,reversedDepthBuffer:O,skinning:!0===T.isSkinnedMesh,morphTargets:void 0!==x.morphAttributes.position,morphNormals:void 0!==x.morphAttributes.normal,morphColors:void 0!==x.morphAttributes.color,morphTargetsCount:L,morphTextureStride:y,numDirLights:l.directional.length,numPointLights:l.point.length,numSpotLights:l.spot.length,numSpotLightMaps:l.spotLightMap.length,numRectAreaLights:l.rectArea.length,numHemiLights:l.hemi.length,numDirLightShadows:l.directionalShadowMap.length,numPointLightShadows:l.pointShadowMap.length,numSpotLightShadows:l.spotShadowMap.length,numSpotLightShadowsWithMaps:l.numSpotLightShadowsWithMaps,numLightProbes:l.numLightProbes,numClippingPlanes:s.numPlanes,numClipIntersection:s.numIntersection,dithering:o.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:be,decodeVideoTexture:V&&!0===o.map.isVideoTexture&&p.getTransfer(o.map.colorSpace)===m,decodeVideoTextureEmissive:q&&!0===o.emissiveMap.isVideoTexture&&p.getTransfer(o.emissiveMap.colorSpace)===m,premultipliedAlpha:o.premultipliedAlpha,doubleSided:o.side===_e,flipSided:o.side===c,useDepthPacking:o.depthPacking>=0,depthPacking:o.depthPacking||0,index0AttributeName:o.index0AttributeName,extensionClipCullDistance:Re&&!0===o.extensions.clipCullDistance&&i.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Re&&!0===o.extensions.multiDraw||H)&&i.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:i.has("KHR_parallel_shader_compile"),customProgramCacheKey:o.customProgramCacheKey()};return Ce.vertexUv1s=u.has(1),Ce.vertexUv2s=u.has(2),Ce.vertexUv3s=u.has(3),u.clear(),Ce},getProgramCacheKey:function(t){const n=[];if(t.shaderID?n.push(t.shaderID):(n.push(t.customVertexShaderID),n.push(t.customFragmentShaderID)),void 0!==t.defines)for(const e in t.defines)n.push(e),n.push(t.defines[e]);return!1===t.isRawShaderMaterial&&(!function(e,t){e.push(t.precision),e.push(t.outputColorSpace),e.push(t.envMapMode),e.push(t.envMapCubeUVHeight),e.push(t.mapUv),e.push(t.alphaMapUv),e.push(t.lightMapUv),e.push(t.aoMapUv),e.push(t.bumpMapUv),e.push(t.normalMapUv),e.push(t.displacementMapUv),e.push(t.emissiveMapUv),e.push(t.metalnessMapUv),e.push(t.roughnessMapUv),e.push(t.anisotropyMapUv),e.push(t.clearcoatMapUv),e.push(t.clearcoatNormalMapUv),e.push(t.clearcoatRoughnessMapUv),e.push(t.iridescenceMapUv),e.push(t.iridescenceThicknessMapUv),e.push(t.sheenColorMapUv),e.push(t.sheenRoughnessMapUv),e.push(t.specularMapUv),e.push(t.specularColorMapUv),e.push(t.specularIntensityMapUv),e.push(t.transmissionMapUv),e.push(t.thicknessMapUv),e.push(t.combine),e.push(t.fogExp2),e.push(t.sizeAttenuation),e.push(t.morphTargetsCount),e.push(t.morphAttributeCount),e.push(t.numDirLights),e.push(t.numPointLights),e.push(t.numSpotLights),e.push(t.numSpotLightMaps),e.push(t.numHemiLights),e.push(t.numRectAreaLights),e.push(t.numDirLightShadows),e.push(t.numPointLightShadows),e.push(t.numSpotLightShadows),e.push(t.numSpotLightShadowsWithMaps),e.push(t.numLightProbes),e.push(t.shadowMapType),e.push(t.toneMapping),e.push(t.numClippingPlanes),e.push(t.numClipIntersection),e.push(t.depthPacking)}(n,t),function(e,t){l.disableAll(),t.instancing&&l.enable(0);t.instancingColor&&l.enable(1);t.instancingMorph&&l.enable(2);t.matcap&&l.enable(3);t.envMap&&l.enable(4);t.normalMapObjectSpace&&l.enable(5);t.normalMapTangentSpace&&l.enable(6);t.clearcoat&&l.enable(7);t.iridescence&&l.enable(8);t.alphaTest&&l.enable(9);t.vertexColors&&l.enable(10);t.vertexAlphas&&l.enable(11);t.vertexUv1s&&l.enable(12);t.vertexUv2s&&l.enable(13);t.vertexUv3s&&l.enable(14);t.vertexTangents&&l.enable(15);t.anisotropy&&l.enable(16);t.alphaHash&&l.enable(17);t.batching&&l.enable(18);t.dispersion&&l.enable(19);t.batchingColor&&l.enable(20);t.gradientMap&&l.enable(21);e.push(l.mask),l.disableAll(),t.fog&&l.enable(0);t.useFog&&l.enable(1);t.flatShading&&l.enable(2);t.logarithmicDepthBuffer&&l.enable(3);t.reversedDepthBuffer&&l.enable(4);t.skinning&&l.enable(5);t.morphTargets&&l.enable(6);t.morphNormals&&l.enable(7);t.morphColors&&l.enable(8);t.premultipliedAlpha&&l.enable(9);t.shadowMapEnabled&&l.enable(10);t.doubleSided&&l.enable(11);t.flipSided&&l.enable(12);t.useDepthPacking&&l.enable(13);t.dithering&&l.enable(14);t.transmission&&l.enable(15);t.sheen&&l.enable(16);t.opaque&&l.enable(17);t.pointsUvs&&l.enable(18);t.decodeVideoTexture&&l.enable(19);t.decodeVideoTextureEmissive&&l.enable(20);t.alphaToCoverage&&l.enable(21);e.push(l.mask)}(n,t),n.push(e.outputColorSpace)),n.push(t.customProgramCacheKey),n.join()},getUniforms:function(e){const t=v[e.type];let n;if(t){const e=Vn[t];n=he.clone(e.uniforms)}else n=e.uniforms;return n},acquireProgram:function(t,n){let i=h.get(n);return void 0!==i?++i.usedTimes:(i=new Zr(e,n,t,o),f.push(i),h.set(n,i)),i},releaseProgram:function(e){if(0===--e.usedTimes){const t=f.indexOf(e);f[t]=f[f.length-1],f.pop(),h.delete(e.cacheKey),e.destroy()}},releaseShaderCache:function(e){d.remove(e)},programs:f,dispose:function(){d.dispose()}}}function ta(){let e=new WeakMap;return{has:function(t){return e.has(t)},get:function(t){let n=e.get(t);return void 0===n&&(n={},e.set(t,n)),n},remove:function(t){e.delete(t)},update:function(t,n,i){e.get(t)[n]=i},dispose:function(){e=new WeakMap}}}function na(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.material.id!==t.material.id?e.material.id-t.material.id:e.materialVariant!==t.materialVariant?e.materialVariant-t.materialVariant:e.z!==t.z?e.z-t.z:e.id-t.id}function ia(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function ra(){const e=[];let t=0;const n=[],i=[],r=[];function a(e){let t=0;return e.isInstancedMesh&&(t+=2),e.isSkinnedMesh&&(t+=1),t}function o(n,i,r,o,s,l){let c=e[t];return void 0===c?(c={id:n.id,object:n,geometry:i,material:r,materialVariant:a(n),groupOrder:o,renderOrder:n.renderOrder,z:s,group:l},e[t]=c):(c.id=n.id,c.object=n,c.geometry=i,c.material=r,c.materialVariant=a(n),c.groupOrder=o,c.renderOrder=n.renderOrder,c.z=s,c.group=l),t++,c}return{opaque:n,transmissive:i,transparent:r,init:function(){t=0,n.length=0,i.length=0,r.length=0},push:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.push(d):!0===a.transparent?r.push(d):n.push(d)},unshift:function(e,t,a,s,l,c){const d=o(e,t,a,s,l,c);a.transmission>0?i.unshift(d):!0===a.transparent?r.unshift(d):n.unshift(d)},finish:function(){for(let n=t,i=e.length;n1&&n.sort(e||na),i.length>1&&i.sort(t||ia),r.length>1&&r.sort(t||ia)}}}function aa(){let e=new WeakMap;return{get:function(t,n){const i=e.get(t);let r;return void 0===i?(r=new ra,e.set(t,[r])):n>=i.length?(r=new ra,i.push(r)):r=i[n],r},dispose:function(){e=new WeakMap}}}function oa(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new r,color:new n};break;case"SpotLight":i={position:new r,direction:new r,color:new n,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new r,color:new n,distance:0,decay:0};break;case"HemisphereLight":i={direction:new r,skyColor:new n,groundColor:new n};break;case"RectAreaLight":i={color:new n,position:new r,halfWidth:new r,halfHeight:new r}}return e[t.id]=i,i}}}let sa=0;function la(e,t){return(t.castShadow?2:0)-(e.castShadow?2:0)+(t.map?1:0)-(e.map?1:0)}function ca(e){const n=new oa,i=function(){const e={};return{get:function(n){if(void 0!==e[n.id])return e[n.id];let i;switch(n.type){case"DirectionalLight":case"SpotLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t};break;case"PointLight":i={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new t,shadowCameraNear:1,shadowCameraFar:1e3}}return e[n.id]=i,i}}}(),a={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let e=0;e<9;e++)a.probe.push(new r);const o=new r,s=new f,l=new f;return{setup:function(t){let r=0,o=0,s=0;for(let e=0;e<9;e++)a.probe[e].set(0,0,0);let l=0,c=0,d=0,u=0,f=0,p=0,m=0,h=0,_=0,g=0,v=0;t.sort(la);for(let e=0,E=t.length;e0&&(!0===e.has("OES_texture_float_linear")?(a.rectAreaLTC1=Hn.LTC_FLOAT_1,a.rectAreaLTC2=Hn.LTC_FLOAT_2):(a.rectAreaLTC1=Hn.LTC_HALF_1,a.rectAreaLTC2=Hn.LTC_HALF_2)),a.ambient[0]=r,a.ambient[1]=o,a.ambient[2]=s;const E=a.hash;E.directionalLength===l&&E.pointLength===c&&E.spotLength===d&&E.rectAreaLength===u&&E.hemiLength===f&&E.numDirectionalShadows===p&&E.numPointShadows===m&&E.numSpotShadows===h&&E.numSpotMaps===_&&E.numLightProbes===v||(a.directional.length=l,a.spot.length=d,a.rectArea.length=u,a.point.length=c,a.hemi.length=f,a.directionalShadow.length=p,a.directionalShadowMap.length=p,a.pointShadow.length=m,a.pointShadowMap.length=m,a.spotShadow.length=h,a.spotShadowMap.length=h,a.directionalShadowMatrix.length=p,a.pointShadowMatrix.length=m,a.spotLightMatrix.length=h+_-g,a.spotLightMap.length=_,a.numSpotLightShadowsWithMaps=g,a.numLightProbes=v,E.directionalLength=l,E.pointLength=c,E.spotLength=d,E.rectAreaLength=u,E.hemiLength=f,E.numDirectionalShadows=p,E.numPointShadows=m,E.numSpotShadows=h,E.numSpotMaps=_,E.numLightProbes=v,a.version=sa++)},setupView:function(e,t){let n=0,i=0,r=0,c=0,d=0;const u=t.matrixWorldInverse;for(let t=0,f=e.length;t=r.length?(a=new da(e),r.push(a)):a=r[i],a},dispose:function(){t=new WeakMap}}}const fa=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],pa=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],ma=new f,ha=new r,_a=new r;function ga(e,n,i){let r=new Me;const a=new t,s=new t,d=new X,u=new xe,f=new Ae,p={},m=i.maxTextureSize,h={[_]:c,[c]:_,[_e]:_e},g=new l({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new t},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\tdepth = 1.0 - depth;\n\t\t\t#endif\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\n\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\n}"}),v=g.clone();v.defines.HORIZONTAL_PASS=1;const T=new U;T.setAttribute("position",new B(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const x=new o(T,g),A=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=de;let R=this.type;function b(t,i){const r=n.update(x);g.defines.VSM_SAMPLES!==t.blurSamples&&(g.defines.VSM_SAMPLES=t.blurSamples,v.defines.VSM_SAMPLES=t.blurSamples,g.needsUpdate=!0,v.needsUpdate=!0),null===t.mapPass&&(t.mapPass=new O(a.x,a.y,{format:Te,type:S})),g.uniforms.shadow_pass.value=t.map.depthTexture,g.uniforms.resolution.value=t.mapSize,g.uniforms.radius.value=t.radius,e.setRenderTarget(t.mapPass),e.clear(),e.renderBufferDirect(i,null,r,g,x,null),v.uniforms.shadow_pass.value=t.mapPass.texture,v.uniforms.resolution.value=t.mapSize,v.uniforms.radius.value=t.radius,e.setRenderTarget(t.map),e.clear(),e.renderBufferDirect(i,null,r,v,x,null)}function P(t,n,i,r){let a=null;const o=!0===i.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(void 0!==o)a=o;else if(a=!0===i.isPointLight?f:u,e.localClippingEnabled&&!0===n.clipShadows&&Array.isArray(n.clippingPlanes)&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0||n.map&&n.alphaTest>0||!0===n.alphaToCoverage){const e=a.uuid,t=n.uuid;let i=p[e];void 0===i&&(i={},p[e]=i);let r=i[t];void 0===r&&(r=a.clone(),i[t]=r,n.addEventListener("dispose",D)),a=r}if(a.visible=n.visible,a.wireframe=n.wireframe,a.side=r===ce?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:h[n.side],a.alphaMap=n.alphaMap,a.alphaTest=!0===n.alphaToCoverage?.5:n.alphaTest,a.map=n.map,a.clipShadows=n.clipShadows,a.clippingPlanes=n.clippingPlanes,a.clipIntersection=n.clipIntersection,a.displacementMap=n.displacementMap,a.displacementScale=n.displacementScale,a.displacementBias=n.displacementBias,a.wireframeLinewidth=n.wireframeLinewidth,a.linewidth=n.linewidth,!0===i.isPointLight&&!0===a.isMeshDistanceMaterial){e.properties.get(a).light=i}return a}function L(t,i,a,o,s){if(!1===t.visible)return;if(t.layers.test(i.layers)&&(t.isMesh||t.isLine||t.isPoints)&&(t.castShadow||t.receiveShadow&&s===ce)&&(!t.frustumCulled||r.intersectsObject(t))){t.modelViewMatrix.multiplyMatrices(a.matrixWorldInverse,t.matrixWorld);const r=n.update(t),l=t.material;if(Array.isArray(l)){const n=r.groups;for(let c=0,d=n.length;ce.needsUpdate=!0):e.material.needsUpdate=!0)});for(let o=0,l=t.length;om||a.y>m)&&(a.x>m&&(s.x=Math.floor(m/p.x),a.x=s.x*p.x,c.mapSize.x=s.x),a.y>m&&(s.y=Math.floor(m/p.y),a.y=s.y*p.y,c.mapSize.y=s.y)),null===c.map||!0===f){if(null!==c.map&&(null!==c.map.depthTexture&&(c.map.depthTexture.dispose(),c.map.depthTexture=null),c.map.dispose()),this.type===ce){if(l.isPointLight){E("WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.");continue}c.map=new O(a.x,a.y,{format:Te,type:S,minFilter:H,magFilter:H,generateMipmaps:!1}),c.map.texture.name=l.name+".shadowMap",c.map.depthTexture=new oe(a.x,a.y,M),c.map.depthTexture.name=l.name+".shadowMapDepth",c.map.depthTexture.format=be,c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce}else{l.isPointLight?(c.map=new C(a.x),c.map.depthTexture=new Pe(a.x,Le)):(c.map=new O(a.x,a.y),c.map.depthTexture=new oe(a.x,a.y,Le)),c.map.depthTexture.name=l.name+".shadowMap",c.map.depthTexture.format=be;const t=e.state.buffers.depth.getReversed();this.type===de?(c.map.depthTexture.compareFunction=t?re:ae,c.map.depthTexture.minFilter=H,c.map.depthTexture.magFilter=H):(c.map.depthTexture.compareFunction=null,c.map.depthTexture.minFilter=Ce,c.map.depthTexture.magFilter=Ce)}c.camera.updateProjectionMatrix()}const h=c.map.isWebGLCubeRenderTarget?6:1;for(let t=0;t=1):-1!==I.indexOf("OpenGL ES")&&(w=parseFloat(/^OpenGL ES (\d)/.exec(I)[1]),D=w>=2);let N=null,O={};const B=e.getParameter(e.SCISSOR_BOX),G=e.getParameter(e.VIEWPORT),H=(new X).fromArray(B),V=(new X).fromArray(G);function W(t,n,i,r){const a=new Uint8Array(4),o=e.createTexture();e.bindTexture(t,o),e.texParameteri(t,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(t,e.TEXTURE_MAG_FILTER,e.NEAREST);for(let o=0;on||r.height>n)&&(i=n/Math.max(r.width,r.height)),i<1){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof VideoFrame&&e instanceof VideoFrame){const n=Math.floor(i*r.width),a=Math.floor(i*r.height);void 0===f&&(f=g(n,a));const o=t?g(n,a):f;o.width=n,o.height=a;return o.getContext("2d").drawImage(e,0,0,n,a),E("WebGLRenderer: Texture has been resized from ("+r.width+"x"+r.height+") to ("+n+"x"+a+")."),o}return"data"in e&&E("WebGLRenderer: Image in DataTexture is too big ("+r.width+"x"+r.height+")."),e}return e}function S(e){return e.generateMipmaps}function A(t){e.generateMipmap(t)}function R(t){return t.isWebGLCubeRenderTarget?e.TEXTURE_CUBE_MAP:t.isWebGL3DRenderTarget?e.TEXTURE_3D:t.isWebGLArrayRenderTarget||t.isCompressedArrayTexture?e.TEXTURE_2D_ARRAY:e.TEXTURE_2D}function b(t,i,r,a,o=!1){if(null!==t){if(void 0!==e[t])return e[t];E("WebGLRenderer: Attempt to use non-existing WebGL internal format '"+t+"'")}let s=i;if(i===e.RED&&(r===e.FLOAT&&(s=e.R32F),r===e.HALF_FLOAT&&(s=e.R16F),r===e.UNSIGNED_BYTE&&(s=e.R8)),i===e.RED_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.R8UI),r===e.UNSIGNED_SHORT&&(s=e.R16UI),r===e.UNSIGNED_INT&&(s=e.R32UI),r===e.BYTE&&(s=e.R8I),r===e.SHORT&&(s=e.R16I),r===e.INT&&(s=e.R32I)),i===e.RG&&(r===e.FLOAT&&(s=e.RG32F),r===e.HALF_FLOAT&&(s=e.RG16F),r===e.UNSIGNED_BYTE&&(s=e.RG8)),i===e.RG_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RG8UI),r===e.UNSIGNED_SHORT&&(s=e.RG16UI),r===e.UNSIGNED_INT&&(s=e.RG32UI),r===e.BYTE&&(s=e.RG8I),r===e.SHORT&&(s=e.RG16I),r===e.INT&&(s=e.RG32I)),i===e.RGB_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGB8UI),r===e.UNSIGNED_SHORT&&(s=e.RGB16UI),r===e.UNSIGNED_INT&&(s=e.RGB32UI),r===e.BYTE&&(s=e.RGB8I),r===e.SHORT&&(s=e.RGB16I),r===e.INT&&(s=e.RGB32I)),i===e.RGBA_INTEGER&&(r===e.UNSIGNED_BYTE&&(s=e.RGBA8UI),r===e.UNSIGNED_SHORT&&(s=e.RGBA16UI),r===e.UNSIGNED_INT&&(s=e.RGBA32UI),r===e.BYTE&&(s=e.RGBA8I),r===e.SHORT&&(s=e.RGBA16I),r===e.INT&&(s=e.RGBA32I)),i===e.RGB&&(r===e.UNSIGNED_INT_5_9_9_9_REV&&(s=e.RGB9_E5),r===e.UNSIGNED_INT_10F_11F_11F_REV&&(s=e.R11F_G11F_B10F)),i===e.RGBA){const t=o?me:p.getTransfer(a);r===e.FLOAT&&(s=e.RGBA32F),r===e.HALF_FLOAT&&(s=e.RGBA16F),r===e.UNSIGNED_BYTE&&(s=t===m?e.SRGB8_ALPHA8:e.RGBA8),r===e.UNSIGNED_SHORT_4_4_4_4&&(s=e.RGBA4),r===e.UNSIGNED_SHORT_5_5_5_1&&(s=e.RGB5_A1)}return s!==e.R16F&&s!==e.R32F&&s!==e.RG16F&&s!==e.RG32F&&s!==e.RGBA16F&&s!==e.RGBA32F||n.get("EXT_color_buffer_float"),s}function C(t,n){let i;return t?null===n||n===Le||n===Ct?i=e.DEPTH24_STENCIL8:n===M?i=e.DEPTH32F_STENCIL8:n===Pt&&(i=e.DEPTH24_STENCIL8,E("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===n||n===Le||n===Ct?i=e.DEPTH_COMPONENT24:n===M?i=e.DEPTH_COMPONENT32F:n===Pt&&(i=e.DEPTH_COMPONENT16),i}function P(e,t){return!0===S(e)||e.isFramebufferTexture&&e.minFilter!==Ce&&e.minFilter!==H?Math.log2(Math.max(t.width,t.height))+1:void 0!==e.mipmaps&&e.mipmaps.length>0?e.mipmaps.length:e.isCompressedTexture&&Array.isArray(e.image)?t.mipmaps.length:1}function L(e){const t=e.target;t.removeEventListener("dispose",L),function(e){const t=r.get(e);if(void 0===t.__webglInit)return;const n=e.source,i=h.get(n);if(i){const r=i[t.__cacheKey];r.usedTimes--,0===r.usedTimes&&D(e),0===Object.keys(i).length&&h.delete(n)}r.remove(e)}(t),t.isVideoTexture&&u.delete(t)}function U(t){const n=t.target;n.removeEventListener("dispose",U),function(t){const n=r.get(t);t.depthTexture&&(t.depthTexture.dispose(),r.remove(t.depthTexture));if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++){if(Array.isArray(n.__webglFramebuffer[t]))for(let i=0;i0&&a.__version!==t.version){const e=t.image;if(null===e)E("WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==e.complete)return void k(a,t,n);E("WebGLRenderer: Texture marked for update but image is incomplete")}}else t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null);i.bindTexture(e.TEXTURE_2D,a.__webglTexture,e.TEXTURE0+n)}const N={[pt]:e.REPEAT,[ft]:e.CLAMP_TO_EDGE,[ut]:e.MIRRORED_REPEAT},F={[Ce]:e.NEAREST,[gt]:e.NEAREST_MIPMAP_NEAREST,[_t]:e.NEAREST_MIPMAP_LINEAR,[H]:e.LINEAR,[ht]:e.LINEAR_MIPMAP_NEAREST,[mt]:e.LINEAR_MIPMAP_LINEAR},O={[xt]:e.NEVER,[Mt]:e.ALWAYS,[Tt]:e.LESS,[ae]:e.LEQUAL,[St]:e.EQUAL,[re]:e.GEQUAL,[Et]:e.GREATER,[vt]:e.NOTEQUAL};function B(t,i){if(i.type!==M||!1!==n.has("OES_texture_float_linear")||i.magFilter!==H&&i.magFilter!==ht&&i.magFilter!==_t&&i.magFilter!==mt&&i.minFilter!==H&&i.minFilter!==ht&&i.minFilter!==_t&&i.minFilter!==mt||E("WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),e.texParameteri(t,e.TEXTURE_WRAP_S,N[i.wrapS]),e.texParameteri(t,e.TEXTURE_WRAP_T,N[i.wrapT]),t!==e.TEXTURE_3D&&t!==e.TEXTURE_2D_ARRAY||e.texParameteri(t,e.TEXTURE_WRAP_R,N[i.wrapR]),e.texParameteri(t,e.TEXTURE_MAG_FILTER,F[i.magFilter]),e.texParameteri(t,e.TEXTURE_MIN_FILTER,F[i.minFilter]),i.compareFunction&&(e.texParameteri(t,e.TEXTURE_COMPARE_MODE,e.COMPARE_REF_TO_TEXTURE),e.texParameteri(t,e.TEXTURE_COMPARE_FUNC,O[i.compareFunction])),!0===n.has("EXT_texture_filter_anisotropic")){if(i.magFilter===Ce)return;if(i.minFilter!==_t&&i.minFilter!==mt)return;if(i.type===M&&!1===n.has("OES_texture_float_linear"))return;if(i.anisotropy>1||r.get(i).__currentAnisotropy){const o=n.get("EXT_texture_filter_anisotropic");e.texParameterf(t,o.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(i.anisotropy,a.getMaxAnisotropy())),r.get(i).__currentAnisotropy=i.anisotropy}}}function V(t,n){let i=!1;void 0===t.__webglInit&&(t.__webglInit=!0,n.addEventListener("dispose",L));const r=n.source;let a=h.get(r);void 0===a&&(a={},h.set(r,a));const o=function(e){const t=[];return t.push(e.wrapS),t.push(e.wrapT),t.push(e.wrapR||0),t.push(e.magFilter),t.push(e.minFilter),t.push(e.anisotropy),t.push(e.internalFormat),t.push(e.format),t.push(e.type),t.push(e.generateMipmaps),t.push(e.premultiplyAlpha),t.push(e.flipY),t.push(e.unpackAlignment),t.push(e.colorSpace),t.join()}(n);if(o!==t.__cacheKey){void 0===a[o]&&(a[o]={texture:e.createTexture(),usedTimes:0},s.memory.textures++,i=!0),a[o].usedTimes++;const r=a[t.__cacheKey];void 0!==r&&(a[t.__cacheKey].usedTimes--,0===r.usedTimes&&D(n)),t.__cacheKey=o,t.__webglTexture=a[o].texture}return i}function W(e,t,n){return Math.floor(Math.floor(e/n)/t)}function k(t,n,s){let l=e.TEXTURE_2D;(n.isDataArrayTexture||n.isCompressedArrayTexture)&&(l=e.TEXTURE_2D_ARRAY),n.isData3DTexture&&(l=e.TEXTURE_3D);const c=V(t,n),d=n.source;i.bindTexture(l,t.__webglTexture,e.TEXTURE0+s);const u=r.get(d);if(d.version!==u.__version||!0===c){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),f=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,f);let m=v(n.image,!1,a.maxTextureSize);m=Q(n,m);const h=o.convert(n.format,n.colorSpace),_=o.convert(n.type);let g,T=b(n.internalFormat,h,_,n.colorSpace,n.isVideoTexture);B(l,n);const M=n.mipmaps,R=!0!==n.isVideoTexture,L=void 0===u.__version||!0===c,U=d.dataReady,D=P(n,m);if(n.isDepthTexture)T=C(n.format===Rt,n.type),L&&(R?i.texStorage2D(e.TEXTURE_2D,1,T,m.width,m.height):i.texImage2D(e.TEXTURE_2D,0,T,m.width,m.height,0,h,_,null));else if(n.isDataTexture)if(M.length>0){R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,n=M.length;te.start-t.start);let s=0;for(let e=1;e0){const r=bt(g.width,g.height,n.format,n.type);for(const a of n.layerUpdates){const n=g.data.subarray(a*r/g.data.BYTES_PER_ELEMENT,(a+1)*r/g.data.BYTES_PER_ELEMENT);i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,a,g.width,g.height,1,h,n)}n.clearLayerUpdates()}else i.compressedTexSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,g.data)}else i.compressedTexImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,g.data,0,0);else E("WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else R?U&&i.texSubImage3D(e.TEXTURE_2D_ARRAY,t,0,0,0,g.width,g.height,m.depth,h,_,g.data):i.texImage3D(e.TEXTURE_2D_ARRAY,t,T,g.width,g.height,m.depth,0,h,_,g.data)}else{R&&L&&i.texStorage2D(e.TEXTURE_2D,D,T,M[0].width,M[0].height);for(let t=0,r=M.length;t0){const t=bt(m.width,m.height,n.format,n.type);for(const r of n.layerUpdates){const n=m.data.subarray(r*t/m.data.BYTES_PER_ELEMENT,(r+1)*t/m.data.BYTES_PER_ELEMENT);i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,r,m.width,m.height,1,h,_,n)}n.clearLayerUpdates()}else i.texSubImage3D(e.TEXTURE_2D_ARRAY,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)}else i.texImage3D(e.TEXTURE_2D_ARRAY,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isData3DTexture)R?(L&&i.texStorage3D(e.TEXTURE_3D,D,T,m.width,m.height,m.depth),U&&i.texSubImage3D(e.TEXTURE_3D,0,0,0,0,m.width,m.height,m.depth,h,_,m.data)):i.texImage3D(e.TEXTURE_3D,0,T,m.width,m.height,m.depth,0,h,_,m.data);else if(n.isFramebufferTexture){if(L)if(R)i.texStorage2D(e.TEXTURE_2D,D,T,m.width,m.height);else{let t=m.width,n=m.height;for(let r=0;r>=1,n>>=1}}else if(M.length>0){if(R&&L){const t=J(M[0]);i.texStorage2D(e.TEXTURE_2D,D,T,t.width,t.height)}for(let t=0,n=M.length;t>d),r=Math.max(1,n.height>>d);c===e.TEXTURE_3D||c===e.TEXTURE_2D_ARRAY?i.texImage3D(c,d,p,t,r,n.depth,0,u,f,null):i.texImage2D(c,d,p,t,r,0,u,f,null)}i.bindFramebuffer(e.FRAMEBUFFER,t),$(n)?l.framebufferTexture2DMultisampleEXT(e.FRAMEBUFFER,s,c,h.__webglTexture,0,Z(n)):(c===e.TEXTURE_2D||c>=e.TEXTURE_CUBE_MAP_POSITIVE_X&&c<=e.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&e.framebufferTexture2D(e.FRAMEBUFFER,s,c,h.__webglTexture,d),i.bindFramebuffer(e.FRAMEBUFFER,null)}function X(t,n,i){if(e.bindRenderbuffer(e.RENDERBUFFER,t),n.depthBuffer){const r=n.depthTexture,a=r&&r.isDepthTexture?r.type:null,o=C(n.stencilBuffer,a),s=n.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT;$(n)?l.renderbufferStorageMultisampleEXT(e.RENDERBUFFER,Z(n),o,n.width,n.height):i?e.renderbufferStorageMultisample(e.RENDERBUFFER,Z(n),o,n.width,n.height):e.renderbufferStorage(e.RENDERBUFFER,o,n.width,n.height),e.framebufferRenderbuffer(e.FRAMEBUFFER,s,e.RENDERBUFFER,t)}else{const t=n.textures;for(let r=0;r{delete n.__boundDepthTexture,delete n.__depthDisposeCallback,e.removeEventListener("dispose",t)};e.addEventListener("dispose",t),n.__depthDisposeCallback=t}n.__boundDepthTexture=e}if(t.depthTexture&&!n.__autoAllocateDepthBuffer)if(a)for(let e=0;e<6;e++)Y(n.__webglFramebuffer[e],t,e);else{const e=t.texture.mipmaps;e&&e.length>0?Y(n.__webglFramebuffer[0],t,0):Y(n.__webglFramebuffer,t,0)}else if(a){n.__webglDepthbuffer=[];for(let r=0;r<6;r++)if(i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[r]),void 0===n.__webglDepthbuffer[r])n.__webglDepthbuffer[r]=e.createRenderbuffer(),X(n.__webglDepthbuffer[r],t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,a=n.__webglDepthbuffer[r];e.bindRenderbuffer(e.RENDERBUFFER,a),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,a)}}else{const r=t.texture.mipmaps;if(r&&r.length>0?i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer[0]):i.bindFramebuffer(e.FRAMEBUFFER,n.__webglFramebuffer),void 0===n.__webglDepthbuffer)n.__webglDepthbuffer=e.createRenderbuffer(),X(n.__webglDepthbuffer,t,!1);else{const i=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,r=n.__webglDepthbuffer;e.bindRenderbuffer(e.RENDERBUFFER,r),e.framebufferRenderbuffer(e.FRAMEBUFFER,i,e.RENDERBUFFER,r)}}i.bindFramebuffer(e.FRAMEBUFFER,null)}const j=[],q=[];function Z(e){return Math.min(a.maxSamples,e.samples)}function $(e){const t=r.get(e);return e.samples>0&&!0===n.has("WEBGL_multisampled_render_to_texture")&&!1!==t.__useRenderToTexture}function Q(e,t){const n=e.colorSpace,i=e.format,r=e.type;return!0===e.isCompressedTexture||!0===e.isVideoTexture||n!==G&&n!==At&&(p.getTransfer(n)===m?i===x&&r===T||E("WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):y("WebGLTextures: Unsupported texture color space:",n)),t}function J(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement?(d.width=e.naturalWidth||e.width,d.height=e.naturalHeight||e.height):"undefined"!=typeof VideoFrame&&e instanceof VideoFrame?(d.width=e.displayWidth,d.height=e.displayHeight):(d.width=e.width,d.height=e.height),d}this.allocateTextureUnit=function(){const e=w;return e>=a.maxTextures&&E("WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+a.maxTextures),w+=1,e},this.resetTextureUnits=function(){w=0},this.setTexture2D=I,this.setTexture2DArray=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):(t.isExternalTexture&&(a.__webglTexture=t.sourceTexture?t.sourceTexture:null),i.bindTexture(e.TEXTURE_2D_ARRAY,a.__webglTexture,e.TEXTURE0+n))},this.setTexture3D=function(t,n){const a=r.get(t);!1===t.isRenderTargetTexture&&t.version>0&&a.__version!==t.version?k(a,t,n):i.bindTexture(e.TEXTURE_3D,a.__webglTexture,e.TEXTURE0+n)},this.setTextureCube=function(t,n){const s=r.get(t);!0!==t.isCubeDepthTexture&&t.version>0&&s.__version!==t.version?function(t,n,s){if(6!==n.image.length)return;const l=V(t,n),c=n.source;i.bindTexture(e.TEXTURE_CUBE_MAP,t.__webglTexture,e.TEXTURE0+s);const d=r.get(c);if(c.version!==d.__version||!0===l){i.activeTexture(e.TEXTURE0+s);const t=p.getPrimaries(p.workingColorSpace),r=n.colorSpace===At?null:p.getPrimaries(n.colorSpace),u=n.colorSpace===At||t===r?e.NONE:e.BROWSER_DEFAULT_WEBGL;e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,n.flipY),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,n.premultiplyAlpha),e.pixelStorei(e.UNPACK_ALIGNMENT,n.unpackAlignment),e.pixelStorei(e.UNPACK_COLORSPACE_CONVERSION_WEBGL,u);const f=n.isCompressedTexture||n.image[0].isCompressedTexture,m=n.image[0]&&n.image[0].isDataTexture,h=[];for(let e=0;e<6;e++)h[e]=f||m?m?n.image[e].image:n.image[e]:v(n.image[e],!0,a.maxCubemapSize),h[e]=Q(n,h[e]);const _=h[0],g=o.convert(n.format,n.colorSpace),T=o.convert(n.type),M=b(n.internalFormat,g,T,n.colorSpace),R=!0!==n.isVideoTexture,C=void 0===d.__version||!0===l,L=c.dataReady;let U,D=P(n,_);if(B(e.TEXTURE_CUBE_MAP,n),f){R&&C&&i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,_.width,_.height);for(let t=0;t<6;t++){U=h[t].mipmaps;for(let r=0;r0&&D++;const t=J(h[0]);i.texStorage2D(e.TEXTURE_CUBE_MAP,D,M,t.width,t.height)}for(let t=0;t<6;t++)if(m){R?L&&i.texSubImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,0,0,h[t].width,h[t].height,g,T,h[t].data):i.texImage2D(e.TEXTURE_CUBE_MAP_POSITIVE_X+t,0,M,h[t].width,h[t].height,0,g,T,h[t].data);for(let n=0;n1;if(u||(void 0===l.__webglTexture&&(l.__webglTexture=e.createTexture()),l.__version=n.version,s.memory.textures++),d){a.__webglFramebuffer=[];for(let t=0;t<6;t++)if(n.mipmaps&&n.mipmaps.length>0){a.__webglFramebuffer[t]=[];for(let i=0;i0){a.__webglFramebuffer=[];for(let t=0;t0&&!1===$(t)){a.__webglMultisampledFramebuffer=e.createFramebuffer(),a.__webglColorRenderbuffer=[],i.bindFramebuffer(e.FRAMEBUFFER,a.__webglMultisampledFramebuffer);for(let n=0;n0)for(let r=0;r0)for(let i=0;i0)if(!1===$(t)){const n=t.textures,a=t.width,o=t.height;let s=e.COLOR_BUFFER_BIT;const l=t.stencilBuffer?e.DEPTH_STENCIL_ATTACHMENT:e.DEPTH_ATTACHMENT,d=r.get(t),u=n.length>1;if(u)for(let t=0;t0?i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer[0]):i.bindFramebuffer(e.DRAW_FRAMEBUFFER,d.__webglFramebuffer);for(let i=0;i= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:t.z},depthHeight:{value:t.w}}});this.mesh=new o(new h(20,20),n)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class xa extends bn{constructor(e,n){super();const i=this;let a=null,o=1,s=null,l="local-floor",c=1,d=null,u=null,f=null,p=null,m=null,h=null;const _="undefined"!=typeof XRWebGLBinding,g=new Ma,v={},S=n.getContextAttributes();let M=null,A=null;const R=[],b=[],C=new t;let P=null;const L=new w;L.viewport=new X;const U=new w;U.viewport=new X;const D=[L,U],I=new Cn;let N=null,y=null;function F(e){const t=b.indexOf(e.inputSource);if(-1===t)return;const n=R[t];void 0!==n&&(n.update(e.inputSource,e.frame,d||s),n.dispatchEvent({type:e.type,data:e.inputSource}))}function B(){a.removeEventListener("select",F),a.removeEventListener("selectstart",F),a.removeEventListener("selectend",F),a.removeEventListener("squeeze",F),a.removeEventListener("squeezestart",F),a.removeEventListener("squeezeend",F),a.removeEventListener("end",B),a.removeEventListener("inputsourceschange",G);for(let e=0;e=0&&(b[i]=null,R[i].disconnect(n))}for(let t=0;t=b.length){b.push(n),i=e;break}if(null===b[e]){b[e]=n,i=e;break}}if(-1===i)break}const r=R[i];r&&r.connect(n)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getGripSpace()},this.getHand=function(e){let t=R[e];return void 0===t&&(t=new Pn,R[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){o=e,!0===i.isPresenting&&E("WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){l=e,!0===i.isPresenting&&E("WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return d||s},this.setReferenceSpace=function(e){d=e},this.getBaseLayer=function(){return null!==p?p:m},this.getBinding=function(){return null===f&&_&&(f=new XRWebGLBinding(a,n)),f},this.getFrame=function(){return h},this.getSession=function(){return a},this.setSession=async function(t){if(a=t,null!==a){M=e.getRenderTarget(),a.addEventListener("select",F),a.addEventListener("selectstart",F),a.addEventListener("selectend",F),a.addEventListener("squeeze",F),a.addEventListener("squeezestart",F),a.addEventListener("squeezeend",F),a.addEventListener("end",B),a.addEventListener("inputsourceschange",G),!0!==S.xrCompatible&&await n.makeXRCompatible(),P=e.getPixelRatio(),e.getSize(C);if(_&&"createProjectionLayer"in XRWebGLBinding.prototype){let t=null,i=null,r=null;S.depth&&(r=S.stencil?n.DEPTH24_STENCIL8:n.DEPTH_COMPONENT24,t=S.stencil?Rt:be,i=S.stencil?Ct:Le);const s={colorFormat:n.RGBA8,depthFormat:r,scaleFactor:o};f=this.getBinding(),p=f.createProjectionLayer(s),a.updateRenderState({layers:[p]}),e.setPixelRatio(1),e.setSize(p.textureWidth,p.textureHeight,!1),A=new O(p.textureWidth,p.textureHeight,{format:x,type:T,depthTexture:new oe(p.textureWidth,p.textureHeight,i,void 0,void 0,void 0,void 0,void 0,void 0,t),stencilBuffer:S.stencil,colorSpace:e.outputColorSpace,samples:S.antialias?4:0,resolveDepthBuffer:!1===p.ignoreDepthValues,resolveStencilBuffer:!1===p.ignoreDepthValues})}else{const t={antialias:S.antialias,alpha:!0,depth:S.depth,stencil:S.stencil,framebufferScaleFactor:o};m=new XRWebGLLayer(a,n,t),a.updateRenderState({baseLayer:m}),e.setPixelRatio(1),e.setSize(m.framebufferWidth,m.framebufferHeight,!1),A=new O(m.framebufferWidth,m.framebufferHeight,{format:x,type:T,colorSpace:e.outputColorSpace,stencilBuffer:S.stencil,resolveDepthBuffer:!1===m.ignoreDepthValues,resolveStencilBuffer:!1===m.ignoreDepthValues})}A.isXRRenderTarget=!0,this.setFoveation(c),d=null,s=await a.requestReferenceSpace(l),z.setContext(a),z.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==a)return a.environmentBlendMode},this.getDepthTexture=function(){return g.getDepthTexture()};const H=new r,V=new r;function W(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===a)return;let t=e.near,n=e.far;null!==g.texture&&(g.depthNear>0&&(t=g.depthNear),g.depthFar>0&&(n=g.depthFar)),I.near=U.near=L.near=t,I.far=U.far=L.far=n,N===I.near&&y===I.far||(a.updateRenderState({depthNear:I.near,depthFar:I.far}),N=I.near,y=I.far),I.layers.mask=6|e.layers.mask,L.layers.mask=-5&I.layers.mask,U.layers.mask=-3&I.layers.mask;const i=e.parent,r=I.cameras;W(I,i);for(let e=0;e0&&(e.alphaTest.value=i.alphaTest);const r=t.get(i),a=r.envMap,o=r.envMapRotation;a&&(e.envMap.value=a,Aa.copy(o),Aa.x*=-1,Aa.y*=-1,Aa.z*=-1,a.isCubeTexture&&!1===a.isRenderTargetTexture&&(Aa.y*=-1,Aa.z*=-1),e.envMapRotation.value.setFromMatrix4(Ra.makeRotationFromEuler(Aa)),e.flipEnvMap.value=a.isCubeTexture&&!1===a.isRenderTargetTexture?-1:1,e.reflectivity.value=i.reflectivity,e.ior.value=i.ior,e.refractionRatio.value=i.refractionRatio),i.lightMap&&(e.lightMap.value=i.lightMap,e.lightMapIntensity.value=i.lightMapIntensity,n(i.lightMap,e.lightMapTransform)),i.aoMap&&(e.aoMap.value=i.aoMap,e.aoMapIntensity.value=i.aoMapIntensity,n(i.aoMap,e.aoMapTransform))}return{refreshFogUniforms:function(t,n){n.color.getRGB(t.fogColor.value,g(e)),n.isFog?(t.fogNear.value=n.near,t.fogFar.value=n.far):n.isFogExp2&&(t.fogDensity.value=n.density)},refreshMaterialUniforms:function(e,r,a,o,s){r.isMeshBasicMaterial||r.isMeshLambertMaterial?i(e,r):r.isMeshToonMaterial?(i(e,r),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap)}(e,r)):r.isMeshPhongMaterial?(i(e,r),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4)}(e,r)):r.isMeshStandardMaterial?(i(e,r),function(e,t){e.metalness.value=t.metalness,t.metalnessMap&&(e.metalnessMap.value=t.metalnessMap,n(t.metalnessMap,e.metalnessMapTransform));e.roughness.value=t.roughness,t.roughnessMap&&(e.roughnessMap.value=t.roughnessMap,n(t.roughnessMap,e.roughnessMapTransform));t.envMap&&(e.envMapIntensity.value=t.envMapIntensity)}(e,r),r.isMeshPhysicalMaterial&&function(e,t,i){e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap,n(t.sheenColorMap,e.sheenColorMapTransform)),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap,n(t.sheenRoughnessMap,e.sheenRoughnessMapTransform)));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap,n(t.clearcoatMap,e.clearcoatMapTransform)),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap,n(t.clearcoatRoughnessMap,e.clearcoatRoughnessMapTransform)),t.clearcoatNormalMap&&(e.clearcoatNormalMap.value=t.clearcoatNormalMap,n(t.clearcoatNormalMap,e.clearcoatNormalMapTransform),e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),t.side===c&&e.clearcoatNormalScale.value.negate()));t.dispersion>0&&(e.dispersion.value=t.dispersion);t.iridescence>0&&(e.iridescence.value=t.iridescence,e.iridescenceIOR.value=t.iridescenceIOR,e.iridescenceThicknessMinimum.value=t.iridescenceThicknessRange[0],e.iridescenceThicknessMaximum.value=t.iridescenceThicknessRange[1],t.iridescenceMap&&(e.iridescenceMap.value=t.iridescenceMap,n(t.iridescenceMap,e.iridescenceMapTransform)),t.iridescenceThicknessMap&&(e.iridescenceThicknessMap.value=t.iridescenceThicknessMap,n(t.iridescenceThicknessMap,e.iridescenceThicknessMapTransform)));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=i.texture,e.transmissionSamplerSize.value.set(i.width,i.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap,n(t.transmissionMap,e.transmissionMapTransform)),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap,n(t.thicknessMap,e.thicknessMapTransform)),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));t.anisotropy>0&&(e.anisotropyVector.value.set(t.anisotropy*Math.cos(t.anisotropyRotation),t.anisotropy*Math.sin(t.anisotropyRotation)),t.anisotropyMap&&(e.anisotropyMap.value=t.anisotropyMap,n(t.anisotropyMap,e.anisotropyMapTransform)));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap,n(t.specularColorMap,e.specularColorMapTransform));t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap,n(t.specularIntensityMap,e.specularIntensityMapTransform))}(e,r,s)):r.isMeshMatcapMaterial?(i(e,r),function(e,t){t.matcap&&(e.matcap.value=t.matcap)}(e,r)):r.isMeshDepthMaterial?i(e,r):r.isMeshDistanceMaterial?(i(e,r),function(e,n){const i=t.get(n).light;e.referencePosition.value.setFromMatrixPosition(i.matrixWorld),e.nearDistance.value=i.shadow.camera.near,e.farDistance.value=i.shadow.camera.far}(e,r)):r.isMeshNormalMaterial?i(e,r):r.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform))}(e,r),r.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,r)):r.isPointsMaterial?function(e,t,i,r){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*r,t.map&&(e.map.value=t.map,n(t.map,e.uvTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r,a,o):r.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map,n(t.map,e.mapTransform));t.alphaMap&&(e.alphaMap.value=t.alphaMap,n(t.alphaMap,e.alphaMapTransform));t.alphaTest>0&&(e.alphaTest.value=t.alphaTest)}(e,r):r.isShadowMaterial?(e.color.value.copy(r.color),e.opacity.value=r.opacity):r.isShaderMaterial&&(r.uniformsNeedUpdate=!1)}}}function Ca(e,t,n,i){let r={},a={},o=[];const s=e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS);function l(e,t,n,i){const r=e.value,a=t+"_"+n;if(void 0===i[a])return i[a]="number"==typeof r||"boolean"==typeof r?r:r.clone(),!0;{const e=i[a];if("number"==typeof r||"boolean"==typeof r){if(e!==r)return i[a]=r,!0}else if(!1===e.equals(r))return e.copy(r),!0}return!1}function c(e){const t={boundary:0,storage:0};return"number"==typeof e||"boolean"==typeof e?(t.boundary=4,t.storage=4):e.isVector2?(t.boundary=8,t.storage=8):e.isVector3||e.isColor?(t.boundary=16,t.storage=12):e.isVector4?(t.boundary=16,t.storage=16):e.isMatrix3?(t.boundary=48,t.storage=48):e.isMatrix4?(t.boundary=64,t.storage=64):e.isTexture?E("WebGLRenderer: Texture samplers can not be part of an uniforms group."):E("WebGLRenderer: Unsupported uniform value type.",e),t}function d(t){const n=t.target;n.removeEventListener("dispose",d);const i=o.indexOf(n.__bindingPointIndex);o.splice(i,1),e.deleteBuffer(r[n.id]),delete r[n.id],delete a[n.id]}return{bind:function(e,t){const n=t.program;i.uniformBlockBinding(e,n)},update:function(n,u){let f=r[n.id];void 0===f&&(!function(e){const t=e.uniforms;let n=0;const i=16;for(let e=0,r=t.length;e0&&(n+=i-r);e.__size=n,e.__cache={}}(n),f=function(t){const n=function(){for(let e=0;e0),u=!!n.morphAttributes.position,f=!!n.morphAttributes.normal,p=!!n.morphAttributes.color;let m=I;i.toneMapped&&(null!==k&&!0!==k.isXRRenderTarget||(m=N.toneMapping));const h=n.morphAttributes.position||n.morphAttributes.normal||n.morphAttributes.color,_=void 0!==h?h.length:0,g=Se.get(i),v=L.state.lights;if(!0===se&&(!0===le||e!==Y)){const t=e===Y&&i.id===z;Ne.setState(i,e,t)}let E=!1;i.version===g.__version?g.needsLights&&g.lightsStateVersion!==v.state.version||g.outputColorSpace!==s||r.isBatchedMesh&&!1===g.batching?E=!0:r.isBatchedMesh||!0!==g.batching?r.isBatchedMesh&&!0===g.batchingColor&&null===r.colorTexture||r.isBatchedMesh&&!1===g.batchingColor&&null!==r.colorTexture||r.isInstancedMesh&&!1===g.instancing?E=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?E=!0:r.isSkinnedMesh||!0!==g.skinning?r.isInstancedMesh&&!0===g.instancingColor&&null===r.instanceColor||r.isInstancedMesh&&!1===g.instancingColor&&null!==r.instanceColor||r.isInstancedMesh&&!0===g.instancingMorph&&null===r.morphTexture||r.isInstancedMesh&&!1===g.instancingMorph&&null!==r.morphTexture||g.envMap!==l||!0===i.fog&&g.fog!==a?E=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===Ne.numPlanes&&g.numIntersection===Ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==d||g.morphTargets!==u||g.morphNormals!==f||g.morphColors!==p||g.toneMapping!==m||g.morphTargetsCount!==_)&&(E=!0):E=!0:E=!0:E=!0:E=!0:(E=!0,g.__version=i.version);let T=g.currentProgram;!0===E&&(T=st(i,t,r));let M=!1,x=!1,A=!1;const R=T.getUniforms(),b=g.uniforms;ve.useProgram(T.program)&&(M=!0,x=!0,A=!0);i.id!==z&&(z=i.id,x=!0);if(M||Y!==e){ve.buffers.depth.getReversed()&&!0!==e.reversedDepth&&(e._reversedDepth=!0,e.updateProjectionMatrix()),R.setValue(ke,"projectionMatrix",e.projectionMatrix),R.setValue(ke,"viewMatrix",e.matrixWorldInverse);const t=R.map.cameraPosition;void 0!==t&&t.setValue(ke,de.setFromMatrixPosition(e.matrixWorld)),ge.logarithmicDepthBuffer&&R.setValue(ke,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),(i.isMeshPhongMaterial||i.isMeshToonMaterial||i.isMeshLambertMaterial||i.isMeshBasicMaterial||i.isMeshStandardMaterial||i.isShaderMaterial)&&R.setValue(ke,"isOrthographic",!0===e.isOrthographicCamera),Y!==e&&(Y=e,x=!0,A=!0)}g.needsLights&&(v.state.directionalShadowMap.length>0&&R.setValue(ke,"directionalShadowMap",v.state.directionalShadowMap,xe),v.state.spotShadowMap.length>0&&R.setValue(ke,"spotShadowMap",v.state.spotShadowMap,xe),v.state.pointShadowMap.length>0&&R.setValue(ke,"pointShadowMap",v.state.pointShadowMap,xe));if(r.isSkinnedMesh){R.setOptional(ke,r,"bindMatrix"),R.setOptional(ke,r,"bindMatrixInverse");const e=r.skeleton;e&&(null===e.boneTexture&&e.computeBoneTexture(),R.setValue(ke,"boneTexture",e.boneTexture,xe))}r.isBatchedMesh&&(R.setOptional(ke,r,"batchingTexture"),R.setValue(ke,"batchingTexture",r._matricesTexture,xe),R.setOptional(ke,r,"batchingIdTexture"),R.setValue(ke,"batchingIdTexture",r._indirectTexture,xe),R.setOptional(ke,r,"batchingColorTexture"),null!==r._colorsTexture&&R.setValue(ke,"batchingColorTexture",r._colorsTexture,xe));const C=n.morphAttributes;void 0===C.position&&void 0===C.normal&&void 0===C.color||Oe.update(r,n,T);(x||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,R.setValue(ke,"receiveShadow",r.receiveShadow));i.isMeshStandardMaterial&&null===i.envMap&&null!==t.environment&&(b.envMapIntensity.value=t.environmentIntensity);void 0!==b.dfgLUT&&(b.dfgLUT.value=(null===La&&(La=new Un(Pa,16,16,Te,S),La.name="DFG_LUT",La.minFilter=H,La.magFilter=H,La.wrapS=ft,La.wrapT=ft,La.generateMipmaps=!1,La.needsUpdate=!0),La));x&&(R.setValue(ke,"toneMappingExposure",N.toneMappingExposure),g.needsLights&&(U=A,(P=b).ambientLightColor.needsUpdate=U,P.lightProbe.needsUpdate=U,P.directionalLights.needsUpdate=U,P.directionalLightShadows.needsUpdate=U,P.pointLights.needsUpdate=U,P.pointLightShadows.needsUpdate=U,P.spotLights.needsUpdate=U,P.spotLightShadows.needsUpdate=U,P.rectAreaLights.needsUpdate=U,P.hemisphereLights.needsUpdate=U),a&&!0===i.fog&&De.refreshFogUniforms(b,a),De.refreshMaterialUniforms(b,i,ee,J,L.state.transmissionRenderTarget[e.id]),Rr.upload(ke,lt(g),b,xe));var P,U;i.isShaderMaterial&&!0===i.uniformsNeedUpdate&&(Rr.upload(ke,lt(g),b,xe),i.uniformsNeedUpdate=!1);i.isSpriteMaterial&&R.setValue(ke,"center",r.center);if(R.setValue(ke,"modelViewMatrix",r.modelViewMatrix),R.setValue(ke,"normalMatrix",r.normalMatrix),R.setValue(ke,"modelMatrix",r.matrixWorld),i.isShaderMaterial||i.isRawShaderMaterial){const e=i.uniformsGroups;for(let t=0,n=e.length;t{function n(){i.forEach(function(e){Se.get(e).currentProgram.isReady()&&i.delete(e)}),0!==i.size?setTimeout(n,10):t(e)}null!==he.get("KHR_parallel_shader_compile")?n():setTimeout(n,10)})};let Qe=null;function Je(){tt.stop()}function et(){tt.start()}const tt=new On;function nt(e,t,n,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)n=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)L.pushLight(e),e.castShadow&&L.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||oe.intersectsSprite(e)){i&&ue.setFromMatrixPosition(e.matrixWorld).applyMatrix4(ce);const t=Pe.update(e),r=e.material;r.visible&&P.push(e,t,r,n,ue.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(!e.frustumCulled||oe.intersectsObject(e))){const t=Pe.update(e),r=e.material;if(i&&(void 0!==e.boundingSphere?(null===e.boundingSphere&&e.computeBoundingSphere(),ue.copy(e.boundingSphere.center)):(null===t.boundingSphere&&t.computeBoundingSphere(),ue.copy(t.boundingSphere.center)),ue.applyMatrix4(e.matrixWorld).applyMatrix4(ce)),Array.isArray(r)){const i=t.groups;for(let a=0,o=i.length;a0&&at(r,t,n),a.length>0&&at(a,t,n),o.length>0&&at(o,t,n),ve.buffers.depth.setTest(!0),ve.buffers.depth.setMask(!0),ve.buffers.color.setMask(!0),ve.setPolygonOffset(!1)}function rt(e,t,n,i){if(null!==(!0===n.isScene?n.overrideMaterial:null))return;if(void 0===L.state.transmissionRenderTarget[i.id]){const e=he.has("EXT_color_buffer_half_float")||he.has("EXT_color_buffer_float");L.state.transmissionRenderTarget[i.id]=new O(1,1,{generateMipmaps:!0,type:e?S:T,minFilter:mt,samples:ge.samples,stencilBuffer:o,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:p.workingColorSpace})}const r=L.state.transmissionRenderTarget[i.id],a=i.viewport||K;r.setSize(a.z*N.transmissionResolutionScale,a.w*N.transmissionResolutionScale);const s=N.getRenderTarget(),l=N.getActiveCubeFace(),d=N.getActiveMipmapLevel();N.setRenderTarget(r),N.getClearColor(Z),$=N.getClearAlpha(),$<1&&N.setClearColor(16777215,.5),N.clear(),pe&&Fe.render(n);const u=N.toneMapping;N.toneMapping=I;const f=i.viewport;if(void 0!==i.viewport&&(i.viewport=void 0),L.setupLightsView(i),!0===se&&Ne.setGlobalState(N.clippingPlanes,i),at(e,n,i),xe.updateMultisampleRenderTarget(r),xe.updateRenderTargetMipmap(r),!1===he.has("WEBGL_multisampled_render_to_texture")){let e=!1;for(let r=0,a=t.length;r0)for(let t=0,a=r.length;t0&&rt(n,i,e,t),pe&&Fe.render(e),it(P,e,t)}null!==k&&0===W&&(xe.updateMultisampleRenderTarget(k),xe.updateRenderTargetMipmap(k)),i&&w.end(N),!0===e.isScene&&e.onAfterRender(N,e,t),Ve.resetDefaultState(),z=-1,Y=null,D.pop(),D.length>0?(L=D[D.length-1],!0===se&&Ne.setGlobalState(N.clippingPlanes,L.state.camera)):L=null,U.pop(),P=U.length>0?U[U.length-1]:null},this.getActiveCubeFace=function(){return B},this.getActiveMipmapLevel=function(){return W},this.getRenderTarget=function(){return k},this.setRenderTargetTextures=function(e,t,n){const i=Se.get(e);i.__autoAllocateDepthBuffer=!1===e.resolveDepthBuffer,!1===i.__autoAllocateDepthBuffer&&(i.__useRenderToTexture=!1),Se.get(e.texture).__webglTexture=t,Se.get(e.depthTexture).__webglTexture=i.__autoAllocateDepthBuffer?void 0:n,i.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(e,t){const n=Se.get(e);n.__webglFramebuffer=t,n.__useDefaultFramebuffer=void 0===t};const dt=ke.createFramebuffer();this.setRenderTarget=function(e,t=0,n=0){k=e,B=t,W=n;let i=null,r=!1,a=!1;if(e){const o=Se.get(e);if(void 0!==o.__useDefaultFramebuffer)return ve.bindFramebuffer(ke.FRAMEBUFFER,o.__webglFramebuffer),K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest,ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),void(z=-1);if(void 0===o.__webglFramebuffer)xe.setupRenderTarget(e);else if(o.__hasExternalTextures)xe.rebindTextures(e,Se.get(e.texture).__webglTexture,Se.get(e.depthTexture).__webglTexture);else if(e.depthBuffer){const t=e.depthTexture;if(o.__boundDepthTexture!==t){if(null!==t&&Se.has(t)&&(e.width!==t.image.width||e.height!==t.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");xe.setupDepthRenderbuffer(e)}}const s=e.texture;(s.isData3DTexture||s.isDataArrayTexture||s.isCompressedArrayTexture)&&(a=!0);const l=Se.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(i=Array.isArray(l[t])?l[t][n]:l[t],r=!0):i=e.samples>0&&!1===xe.useMultisampledRTT(e)?Se.get(e).__webglMultisampledFramebuffer:Array.isArray(l)?l[n]:l,K.copy(e.viewport),j.copy(e.scissor),q=e.scissorTest}else K.copy(ie).multiplyScalar(ee).floor(),j.copy(re).multiplyScalar(ee).floor(),q=ae;0!==n&&(i=dt);if(ve.bindFramebuffer(ke.FRAMEBUFFER,i)&&ve.drawBuffers(e,i),ve.viewport(K),ve.scissor(j),ve.setScissorTest(q),r){const i=Se.get(e.texture);ke.framebufferTexture2D(ke.FRAMEBUFFER,ke.COLOR_ATTACHMENT0,ke.TEXTURE_CUBE_MAP_POSITIVE_X+t,i.__webglTexture,n)}else if(a){const i=t;for(let t=0;t1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(l))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(c))return void y("WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r&&ke.readPixels(t,n,i,r,He.convert(l),He.convert(c),a)}finally{const e=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,e)}}},this.readRenderTargetPixelsAsync=async function(e,t,n,i,r,a,o,s=0){if(!e||!e.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let l=Se.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==o&&(l=l[o]),l){if(t>=0&&t<=e.width-i&&n>=0&&n<=e.height-r){ve.bindFramebuffer(ke.FRAMEBUFFER,l);const o=e.textures[s],c=o.format,d=o.type;if(e.textures.length>1&&ke.readBuffer(ke.COLOR_ATTACHMENT0+s),!ge.textureFormatReadable(c))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!ge.textureTypeReadable(d))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const u=ke.createBuffer();ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.bufferData(ke.PIXEL_PACK_BUFFER,a.byteLength,ke.STREAM_READ),ke.readPixels(t,n,i,r,He.convert(c),He.convert(d),0);const f=null!==k?Se.get(k).__webglFramebuffer:null;ve.bindFramebuffer(ke.FRAMEBUFFER,f);const p=ke.fenceSync(ke.SYNC_GPU_COMMANDS_COMPLETE,0);return ke.flush(),await Fn(ke,p,4),ke.bindBuffer(ke.PIXEL_PACK_BUFFER,u),ke.getBufferSubData(ke.PIXEL_PACK_BUFFER,0,a),ke.deleteBuffer(u),ke.deleteSync(p),a}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(e,t=null,n=0){const i=Math.pow(2,-n),r=Math.floor(e.image.width*i),a=Math.floor(e.image.height*i),o=null!==t?t.x:0,s=null!==t?t.y:0;xe.setTexture2D(e,0),ke.copyTexSubImage2D(ke.TEXTURE_2D,n,0,0,o,s,r,a),ve.unbindTexture()};const ut=ke.createFramebuffer(),pt=ke.createFramebuffer();this.copyTextureToTexture=function(e,t,n=null,i=null,r=0,a=0){let o,s,l,c,d,u,f,p,m;const h=e.isCompressedTexture?e.mipmaps[a]:e.image;if(null!==n)o=n.max.x-n.min.x,s=n.max.y-n.min.y,l=n.isBox3?n.max.z-n.min.z:1,c=n.min.x,d=n.min.y,u=n.isBox3?n.min.z:0;else{const t=Math.pow(2,-r);o=Math.floor(h.width*t),s=Math.floor(h.height*t),l=e.isDataArrayTexture?h.depth:e.isData3DTexture?Math.floor(h.depth*t):1,c=0,d=0,u=0}null!==i?(f=i.x,p=i.y,m=i.z):(f=0,p=0,m=0);const _=He.convert(t.format),g=He.convert(t.type);let v;t.isData3DTexture?(xe.setTexture3D(t,0),v=ke.TEXTURE_3D):t.isDataArrayTexture||t.isCompressedArrayTexture?(xe.setTexture2DArray(t,0),v=ke.TEXTURE_2D_ARRAY):(xe.setTexture2D(t,0),v=ke.TEXTURE_2D),ke.pixelStorei(ke.UNPACK_FLIP_Y_WEBGL,t.flipY),ke.pixelStorei(ke.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),ke.pixelStorei(ke.UNPACK_ALIGNMENT,t.unpackAlignment);const E=ke.getParameter(ke.UNPACK_ROW_LENGTH),S=ke.getParameter(ke.UNPACK_IMAGE_HEIGHT),T=ke.getParameter(ke.UNPACK_SKIP_PIXELS),M=ke.getParameter(ke.UNPACK_SKIP_ROWS),x=ke.getParameter(ke.UNPACK_SKIP_IMAGES);ke.pixelStorei(ke.UNPACK_ROW_LENGTH,h.width),ke.pixelStorei(ke.UNPACK_IMAGE_HEIGHT,h.height),ke.pixelStorei(ke.UNPACK_SKIP_PIXELS,c),ke.pixelStorei(ke.UNPACK_SKIP_ROWS,d),ke.pixelStorei(ke.UNPACK_SKIP_IMAGES,u);const A=e.isDataArrayTexture||e.isData3DTexture,R=t.isDataArrayTexture||t.isData3DTexture;if(e.isDepthTexture){const n=Se.get(e),i=Se.get(t),h=Se.get(n.__renderTarget),_=Se.get(i.__renderTarget);ve.bindFramebuffer(ke.READ_FRAMEBUFFER,h.__webglFramebuffer),ve.bindFramebuffer(ke.DRAW_FRAMEBUFFER,_.__webglFramebuffer);for(let n=0;n0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ei(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ai=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ai[e],r=wi[e],s=Ci[e];Ei(t,r,s);for(let i=0;i<4;i++){t=Ai[e]+Ai[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ei(t,r,s);for(let n=0;n<4;n++){t=Ai[e]+Ai[i]+Ai[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ei(t,r,s);for(let a=0;a<4;a++)t=Ai[e]+Ai[i]+Ai[n]+Ai[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ei(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),En=new Xi("vec4"),An=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",En),Ni("toIVec4",An),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Ea(Zi(e),t));Ni("call",Aa);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=En(vn(n),0):s=En(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Eo=nn(ro,ro.TAN).setParameterLength(1),Ao=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Eo),Ni("asin",Ao),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Eu extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Au=rn(Eu),wu=(e,t=null)=>Au(e,t).toStack(),Cu=(e,t=null)=>Au(e,t,!0).toStack(),Mu=e=>Au(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=En(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=En(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=En(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=En(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class El extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Al=rn(El).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(Al(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(E.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==A&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return Al(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=En(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ed=un(e=>e.context.modelViewMatrix||Ad).once()().toVar("modelViewMatrix"),Ad=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),En()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ec=vc.cross(Rc),Ac=Rc.cross(_c),wc=Ec.mul(Nc.x).add(Ac.mul(Sc.x)),Cc=Ec.mul(Nc.y).add(Ac.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ed.mul(En(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Eh=sn(th,th.THICKNESS),Ah=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(Al(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(Al(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(Al(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ep=null;class Ap extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ep&&(Ep=new Y),super(e,t,Ep)}getTextureForReference(){return Ep}}const wp=rn(Ap).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return En(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>En(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>En(0)),En(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=En(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=En(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ed.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?En(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=En(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return En(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=En(Ed.mul(En(e,1))).toVar("start"),s=En(Ed.mul(En(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=En().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(En(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(En(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(En(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(En(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(En(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return En(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=En(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(En(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(En(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(En(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Eg=new fe;class Ag extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,En(i,r),To(t)),o=nm(e,En(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=En().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(En(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(En(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return En(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Em=gn(.4),Am=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Em),()=>{t.assign(Sm.sub(e).mul(Am.sub(Rm)).div(Sm.sub(Em)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Em.sub(e).mul(Cm.sub(Am)).div(Em.sub(wm)).add(Am))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),En(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),En(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ae(y,g)),T.setAttribute("uv",new Ae(b,m)),T.setAttribute("faceIndex",new Ae(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ee,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Ah;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Eh,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Ef=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Af extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Ef({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Af}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(En(1,0,0,0),En(0,Ro(e.x),So(e.x).negate(),0),En(0,So(e.x),Ro(e.x),0),En(0,0,0,1)),i=Ln(En(Ro(e.y),0,So(e.y),0),En(0,1,0,0),En(So(e.y).negate(),0,Ro(e.y),0),En(0,0,0,1)),n=Ln(En(Ro(e.z),So(e.z).negate(),0,0),En(So(e.z),Ro(e.z),0,0),En(0,0,1,0),En(0,0,0,1));return s.mul(i).mul(n).mul(En(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ed.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return En(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ed.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(En(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(En(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return An}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Eb=new r,Ab=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Eb.setFromMatrixPosition(n.matrixWorld),Ab.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Eb,Ab);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Eb),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Ab),Lb.subVectors(Eb,Cb),Lb.reflect(Rb).negate(),Lb.add(Eb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Eb),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=En(vn(e,t),1)):i=En(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=En(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(En(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=Al(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ae{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ed).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ex(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ex(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ex=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ax=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),En(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ed),s=gn(1),i=r.mul(En(Ld,1)),n=r.mul(En(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=En(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>En(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),ET=(e,t,r)=>RT(e,t,r).toStack();class AT extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===AT.SUBGROUP_ELECT?"bool":t===AT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===AT.SUBGROUP_BROADCAST||r===AT.SUBGROUP_SHUFFLE||r===AT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===AT.SUBGROUP_SHUFFLE_XOR||r===AT.SUBGROUP_SHUFFLE_DOWN||r===AT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}AT.SUBGROUP_ELECT="subgroupElect",AT.SUBGROUP_BALLOT="subgroupBallot",AT.SUBGROUP_ADD="subgroupAdd",AT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",AT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",AT.SUBGROUP_MUL="subgroupMul",AT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",AT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",AT.SUBGROUP_AND="subgroupAnd",AT.SUBGROUP_OR="subgroupOr",AT.SUBGROUP_XOR="subgroupXor",AT.SUBGROUP_MIN="subgroupMin",AT.SUBGROUP_MAX="subgroupMax",AT.SUBGROUP_ALL="subgroupAll",AT.SUBGROUP_ANY="subgroupAny",AT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",AT.QUAD_SWAP_X="quadSwapX",AT.QUAD_SWAP_Y="quadSwapY",AT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",AT.SUBGROUP_BROADCAST="subgroupBroadcast",AT.SUBGROUP_SHUFFLE="subgroupShuffle",AT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",AT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",AT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",AT.QUAD_BROADCAST="quadBroadcast";const wT=nn(AT,AT.SUBGROUP_ELECT).setParameterLength(0),CT=nn(AT,AT.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(AT,AT.SUBGROUP_ADD).setParameterLength(1),BT=nn(AT,AT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(AT,AT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(AT,AT.SUBGROUP_MUL).setParameterLength(1),PT=nn(AT,AT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(AT,AT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(AT,AT.SUBGROUP_AND).setParameterLength(1),IT=nn(AT,AT.SUBGROUP_OR).setParameterLength(1),OT=nn(AT,AT.SUBGROUP_XOR).setParameterLength(1),VT=nn(AT,AT.SUBGROUP_MIN).setParameterLength(1),kT=nn(AT,AT.SUBGROUP_MAX).setParameterLength(1),GT=nn(AT,AT.SUBGROUP_ALL).setParameterLength(0),zT=nn(AT,AT.SUBGROUP_ANY).setParameterLength(0),$T=nn(AT,AT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(AT,AT.QUAD_SWAP_X).setParameterLength(1),HT=nn(AT,AT.QUAD_SWAP_Y).setParameterLength(1),qT=nn(AT,AT.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(AT,AT.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(AT,AT.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(AT,AT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(AT,AT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(AT,AT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(AT,AT.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),E_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),A_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=En(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,E_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(Al(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=A_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Ev=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Av=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Ev(r,s),i,n),mv(Ev(r.add(mn(1)),s),i.sub(1),n),mv(Ev(r,s.add(mn(1))),i,n.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Ev(r,s,i),n,a,o),mv(Ev(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Ev(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Ev(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Ev(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Ev(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Ev(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Av(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return En(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:E_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Ao,assign:Ra,atan:Co,atomicAdd:(e,t)=>ET(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>ET(ST.ATOMIC_AND,e,t),atomicFunc:ET,atomicLoad:e=>ET(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>ET(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>ET(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>ET(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>ET(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>ET(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>ET(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Aa,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ax,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:A_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:An,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ex,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Ah,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Eh,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ad,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ed,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Av(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return En(wv(e),Av(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:Al,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:En,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=En(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ed.mul(En(m,0));let y=rd.mul(En(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=En(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new EN(e);else if("mat3"===t)s=new AN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ee){if(e.backgroundBlurriness>0||r.mapping===Ee)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:ES;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=AS.width,g.height=AS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:E,transparentDoublePass:A,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,E),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,E),!0===this.transparent&&w.length>0&&this._renderTransparents(w,A,t,l,E),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?Et:At:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[A]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ay(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const ER="point-list",AR="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eE="r16sint",tE="r16float",rE="rg8unorm",sE="rg8snorm",iE="rg8uint",nE="rg8sint",aE="r32uint",oE="r32sint",uE="r32float",lE="rg16uint",dE="rg16sint",cE="rg16float",hE="rgba8unorm",pE="rgba8unorm-srgb",gE="rgba8snorm",mE="rgba8uint",fE="rgba8sint",yE="bgra8unorm",bE="bgra8unorm-srgb",xE="rgb9e5ufloat",TE="rgb10a2unorm",_E="rg11b10ufloat",vE="rg32uint",NE="rg32sint",SE="rg32float",RE="rgba16uint",EE="rgba16sint",AE="rgba16float",wE="rgba32uint",CE="rgba32sint",ME="rgba32float",BE="depth16unorm",LE="depth24plus",FE="depth24plus-stencil8",PE="depth32float",DE="depth32float-stencil8",UE="bc1-rgba-unorm",IE="bc1-rgba-unorm-srgb",OE="bc2-rgba-unorm",VE="bc2-rgba-unorm-srgb",kE="bc3-rgba-unorm",GE="bc3-rgba-unorm-srgb",zE="bc4-r-unorm",$E="bc4-r-snorm",WE="bc5-rg-unorm",HE="bc5-rg-snorm",qE="bc6h-rgb-ufloat",jE="bc6h-rgb-float",XE="bc7-rgba-unorm",KE="bc7-rgba-unorm-srgb",YE="etc2-rgb8unorm",QE="etc2-rgb8unorm-srgb",ZE="etc2-rgb8a1unorm",JE="etc2-rgb8a1unorm-srgb",eA="etc2-rgba8unorm",tA="etc2-rgba8unorm-srgb",rA="eac-r11unorm",sA="eac-r11snorm",iA="eac-rg11unorm",nA="eac-rg11snorm",aA="astc-4x4-unorm",oA="astc-4x4-unorm-srgb",uA="astc-5x4-unorm",lA="astc-5x4-unorm-srgb",dA="astc-5x5-unorm",cA="astc-5x5-unorm-srgb",hA="astc-6x5-unorm",pA="astc-6x5-unorm-srgb",gA="astc-6x6-unorm",mA="astc-6x6-unorm-srgb",fA="astc-8x5-unorm",yA="astc-8x5-unorm-srgb",bA="astc-8x6-unorm",xA="astc-8x6-unorm-srgb",TA="astc-8x8-unorm",_A="astc-8x8-unorm-srgb",vA="astc-10x5-unorm",NA="astc-10x5-unorm-srgb",SA="astc-10x6-unorm",RA="astc-10x6-unorm-srgb",EA="astc-10x8-unorm",AA="astc-10x8-unorm-srgb",wA="astc-10x10-unorm",CA="astc-10x10-unorm-srgb",MA="astc-12x10-unorm",BA="astc-12x10-unorm-srgb",LA="astc-12x12-unorm",FA="astc-12x12-unorm-srgb",PA="clamp-to-edge",DA="repeat",UA="mirror-repeat",IA="linear",OA="nearest",VA="zero",kA="one",GA="src",zA="one-minus-src",$A="src-alpha",WA="one-minus-src-alpha",HA="dst",qA="one-minus-dst",jA="dst-alpha",XA="one-minus-dst-alpha",KA="src-alpha-saturated",YA="constant",QA="one-minus-constant",ZA="add",JA="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Ew="3d",Aw="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IA}),this.flipYSampler=e.createSampler({minFilter:OA}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Eu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Eu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Eu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(E.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FE:LE),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?ER:e.isLineSegments||e.isMesh&&!0===t.wireframe?AR:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yE;if(e===be)return AE;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Aw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(E.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},A=e.context.depth,w=e.context.stencil;if(!0!==A&&!0!==w||(!0===A&&(E.format=N,E.depthWriteEnabled=s.depthWrite,E.depthCompare=v),!0===w&&(E.stencilFront=f,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),R.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZA},r={srcFactor:i,dstFactor:n,operation:ZA}};if(e.premultipliedAlpha)switch(s){case ze:i(kA,WA,kA,WA);break;case qt:i(kA,kA,kA,kA);break;case Ht:i(VA,zA,VA,kA);break;case Wt:i(HA,WA,VA,kA)}else switch(s){case ze:i($A,WA,kA,WA);break;case qt:i($A,kA,kA,kA);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VA;break;case kt:t=kA;break;case Vt:t=GA;break;case Dt:t=zA;break;case $e:t=$A;break;case We:t=WA;break;case It:t=HA;break;case Pt:t=qA;break;case Ut:t=jA;break;case Ft:t=XA;break;case Ot:t=KA;break;case 211:t=YA;break;case 212:t=QA;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZA;break;case Lt:t=JA;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[E.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class _C extends As{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=En(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class RC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class EC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class AC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class wC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class CC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new AC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new wC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ei(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ai=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ai[e],r=wi[e],s=Ci[e];Ei(t,r,s);for(let i=0;i<4;i++){t=Ai[e]+Ai[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ei(t,r,s);for(let n=0;n<4;n++){t=Ai[e]+Ai[i]+Ai[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ei(t,r,s);for(let a=0;a<4;a++)t=Ai[e]+Ai[i]+Ai[n]+Ai[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ei(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),En=new Xi("vec4"),An=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",En),Ni("toIVec4",An),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Ea(Zi(e),t));Ni("call",Aa);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=En(vn(n),0):s=En(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Eo=nn(ro,ro.TAN).setParameterLength(1),Ao=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Eo),Ni("asin",Ao),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Eu extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Au=rn(Eu),wu=(e,t=null)=>Au(e,t).toStack(),Cu=(e,t=null)=>Au(e,t,!0).toStack(),Mu=e=>Au(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=En(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=En(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=En(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=En(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class El extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const Al=rn(El).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(Al(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(E.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==A&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return Al(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=En(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ed=un(e=>e.context.modelViewMatrix||Ad).once()().toVar("modelViewMatrix"),Ad=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),En()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ec=vc.cross(Rc),Ac=Rc.cross(_c),wc=Ec.mul(Nc.x).add(Ac.mul(Sc.x)),Cc=Ec.mul(Nc.y).add(Ac.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ed.mul(En(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Eh=sn(th,th.THICKNESS),Ah=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(Al(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(Al(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(Al(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ep=null;class Ap extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ep&&(Ep=new Y),super(e,t,Ep)}getTextureForReference(){return Ep}}const wp=rn(Ap).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return En(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>En(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>En(0)),En(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=En(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=En(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ed.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?En(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=En(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return En(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=En(Ed.mul(En(e,1))).toVar("start"),s=En(Ed.mul(En(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=En().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(En(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(En(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(En(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(En(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(En(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return En(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=En(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(En(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(En(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(En(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Eg=new fe;class Ag extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Eg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,En(i,r),To(t)),o=nm(e,En(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=En().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(En(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(En(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return En(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Em=gn(.4),Am=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Em),()=>{t.assign(Sm.sub(e).mul(Am.sub(Rm)).div(Sm.sub(Em)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Em.sub(e).mul(Cm.sub(Am)).div(Em.sub(wm)).add(Am))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),En(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),En(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ae(y,g)),T.setAttribute("uv",new Ae(b,m)),T.setAttribute("faceIndex",new Ae(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ee,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Ah;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Eh,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Ef=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Af extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Ef({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Af}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(En(1,0,0,0),En(0,Ro(e.x),So(e.x).negate(),0),En(0,So(e.x),Ro(e.x),0),En(0,0,0,1)),i=Ln(En(Ro(e.y),0,So(e.y),0),En(0,1,0,0),En(So(e.y).negate(),0,Ro(e.y),0),En(0,0,0,1)),n=Ln(En(Ro(e.z),So(e.z).negate(),0,0),En(So(e.z),Ro(e.z),0,0),En(0,0,1,0),En(0,0,0,1));return s.mul(i).mul(n).mul(En(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ed.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return En(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ed.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(En(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(En(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return An}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Eb=new r,Ab=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Eb.setFromMatrixPosition(n.matrixWorld),Ab.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Eb,Ab);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Eb),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Ab),Lb.subVectors(Eb,Cb),Lb.reflect(Rb).negate(),Lb.add(Eb),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Eb),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=En(vn(e,t),1)):i=En(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=En(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(En(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=Al(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ae{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ed).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ex(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ex(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ex=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ax=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),En(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ed),s=gn(1),i=r.mul(En(Ld,1)),n=r.mul(En(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=En(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>En(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),ET=(e,t,r)=>RT(e,t,r).toStack();class AT extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===AT.SUBGROUP_ELECT?"bool":t===AT.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===AT.SUBGROUP_BROADCAST||r===AT.SUBGROUP_SHUFFLE||r===AT.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===AT.SUBGROUP_SHUFFLE_XOR||r===AT.SUBGROUP_SHUFFLE_DOWN||r===AT.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}AT.SUBGROUP_ELECT="subgroupElect",AT.SUBGROUP_BALLOT="subgroupBallot",AT.SUBGROUP_ADD="subgroupAdd",AT.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",AT.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",AT.SUBGROUP_MUL="subgroupMul",AT.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",AT.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",AT.SUBGROUP_AND="subgroupAnd",AT.SUBGROUP_OR="subgroupOr",AT.SUBGROUP_XOR="subgroupXor",AT.SUBGROUP_MIN="subgroupMin",AT.SUBGROUP_MAX="subgroupMax",AT.SUBGROUP_ALL="subgroupAll",AT.SUBGROUP_ANY="subgroupAny",AT.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",AT.QUAD_SWAP_X="quadSwapX",AT.QUAD_SWAP_Y="quadSwapY",AT.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",AT.SUBGROUP_BROADCAST="subgroupBroadcast",AT.SUBGROUP_SHUFFLE="subgroupShuffle",AT.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",AT.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",AT.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",AT.QUAD_BROADCAST="quadBroadcast";const wT=nn(AT,AT.SUBGROUP_ELECT).setParameterLength(0),CT=nn(AT,AT.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(AT,AT.SUBGROUP_ADD).setParameterLength(1),BT=nn(AT,AT.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(AT,AT.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(AT,AT.SUBGROUP_MUL).setParameterLength(1),PT=nn(AT,AT.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(AT,AT.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(AT,AT.SUBGROUP_AND).setParameterLength(1),IT=nn(AT,AT.SUBGROUP_OR).setParameterLength(1),OT=nn(AT,AT.SUBGROUP_XOR).setParameterLength(1),VT=nn(AT,AT.SUBGROUP_MIN).setParameterLength(1),kT=nn(AT,AT.SUBGROUP_MAX).setParameterLength(1),GT=nn(AT,AT.SUBGROUP_ALL).setParameterLength(0),zT=nn(AT,AT.SUBGROUP_ANY).setParameterLength(0),$T=nn(AT,AT.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(AT,AT.QUAD_SWAP_X).setParameterLength(1),HT=nn(AT,AT.QUAD_SWAP_Y).setParameterLength(1),qT=nn(AT,AT.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(AT,AT.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(AT,AT.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(AT,AT.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(AT,AT.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(AT,AT.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(AT,AT.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),E_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),A_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=En(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,E_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(Al(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=A_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Ev=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Av=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Ev(r,s),i,n),mv(Ev(r.add(mn(1)),s),i.sub(1),n),mv(Ev(r,s.add(mn(1))),i,n.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Ev(r,s,i),n,a,o),mv(Ev(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Ev(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Ev(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Ev(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Ev(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Ev(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Ev(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=En(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Av(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return En(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:E_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Ao,assign:Ra,atan:Co,atomicAdd:(e,t)=>ET(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>ET(ST.ATOMIC_AND,e,t),atomicFunc:ET,atomicLoad:e=>ET(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>ET(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>ET(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>ET(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>ET(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>ET(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>ET(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Aa,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ax,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:A_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:An,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ex,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Ah,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Eh,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ad,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ed,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Av(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return En(wv(e),Av(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:Al,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:En,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=En(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ed.mul(En(m,0));let y=rd.mul(En(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=En(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new EN(e);else if("mat3"===t)s=new AN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ee){if(e.backgroundBlurriness>0||r.mapping===Ee)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:ES;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=AS.width,g.height=AS.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:E,transparentDoublePass:A,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,E),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,E),!0===this.transparent&&w.length>0&&this._renderTransparents(w,A,t,l,E),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?Et:At:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[A]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ay(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const ER="point-list",AR="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eE="r16sint",tE="r16float",rE="rg8unorm",sE="rg8snorm",iE="rg8uint",nE="rg8sint",aE="r32uint",oE="r32sint",uE="r32float",lE="rg16uint",dE="rg16sint",cE="rg16float",hE="rgba8unorm",pE="rgba8unorm-srgb",gE="rgba8snorm",mE="rgba8uint",fE="rgba8sint",yE="bgra8unorm",bE="bgra8unorm-srgb",xE="rgb9e5ufloat",TE="rgb10a2unorm",_E="rg11b10ufloat",vE="rg32uint",NE="rg32sint",SE="rg32float",RE="rgba16uint",EE="rgba16sint",AE="rgba16float",wE="rgba32uint",CE="rgba32sint",ME="rgba32float",BE="depth16unorm",LE="depth24plus",FE="depth24plus-stencil8",PE="depth32float",DE="depth32float-stencil8",UE="bc1-rgba-unorm",IE="bc1-rgba-unorm-srgb",OE="bc2-rgba-unorm",VE="bc2-rgba-unorm-srgb",kE="bc3-rgba-unorm",GE="bc3-rgba-unorm-srgb",zE="bc4-r-unorm",$E="bc4-r-snorm",WE="bc5-rg-unorm",HE="bc5-rg-snorm",qE="bc6h-rgb-ufloat",jE="bc6h-rgb-float",XE="bc7-rgba-unorm",KE="bc7-rgba-unorm-srgb",YE="etc2-rgb8unorm",QE="etc2-rgb8unorm-srgb",ZE="etc2-rgb8a1unorm",JE="etc2-rgb8a1unorm-srgb",eA="etc2-rgba8unorm",tA="etc2-rgba8unorm-srgb",rA="eac-r11unorm",sA="eac-r11snorm",iA="eac-rg11unorm",nA="eac-rg11snorm",aA="astc-4x4-unorm",oA="astc-4x4-unorm-srgb",uA="astc-5x4-unorm",lA="astc-5x4-unorm-srgb",dA="astc-5x5-unorm",cA="astc-5x5-unorm-srgb",hA="astc-6x5-unorm",pA="astc-6x5-unorm-srgb",gA="astc-6x6-unorm",mA="astc-6x6-unorm-srgb",fA="astc-8x5-unorm",yA="astc-8x5-unorm-srgb",bA="astc-8x6-unorm",xA="astc-8x6-unorm-srgb",TA="astc-8x8-unorm",_A="astc-8x8-unorm-srgb",vA="astc-10x5-unorm",NA="astc-10x5-unorm-srgb",SA="astc-10x6-unorm",RA="astc-10x6-unorm-srgb",EA="astc-10x8-unorm",AA="astc-10x8-unorm-srgb",wA="astc-10x10-unorm",CA="astc-10x10-unorm-srgb",MA="astc-12x10-unorm",BA="astc-12x10-unorm-srgb",LA="astc-12x12-unorm",FA="astc-12x12-unorm-srgb",PA="clamp-to-edge",DA="repeat",UA="mirror-repeat",IA="linear",OA="nearest",VA="zero",kA="one",GA="src",zA="one-minus-src",$A="src-alpha",WA="one-minus-src-alpha",HA="dst",qA="one-minus-dst",jA="dst-alpha",XA="one-minus-dst-alpha",KA="src-alpha-saturated",YA="constant",QA="one-minus-constant",ZA="add",JA="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Ew="3d",Aw="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IA}),this.flipYSampler=e.createSampler({minFilter:OA}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Aw,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Eu(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Eu(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Eu(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(E.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FE:LE),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?ER:e.isLineSegments||e.isMesh&&!0===t.wireframe?AR:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yE;if(e===be)return AE;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Aw,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(E.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},E={},A=e.context.depth,w=e.context.stencil;if(!0!==A&&!0!==w||(!0===A&&(E.format=N,E.depthWriteEnabled=s.depthWrite,E.depthCompare=v),!0===w&&(E.stencilFront=f,E.stencilBack={},E.stencilReadMask=s.stencilFuncMask,E.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(E.depthBias=s.polygonOffsetUnits,E.depthBiasSlopeScale=s.polygonOffsetFactor,E.depthBiasClamp=0),R.depthStencil=E),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZA},r={srcFactor:i,dstFactor:n,operation:ZA}};if(e.premultipliedAlpha)switch(s){case ze:i(kA,WA,kA,WA);break;case qt:i(kA,kA,kA,kA);break;case Ht:i(VA,zA,VA,kA);break;case Wt:i(HA,WA,VA,kA)}else switch(s){case ze:i($A,WA,kA,WA);break;case qt:i($A,kA,kA,kA);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VA;break;case kt:t=kA;break;case Vt:t=GA;break;case Dt:t=zA;break;case $e:t=$A;break;case We:t=WA;break;case It:t=HA;break;case Pt:t=qA;break;case Ut:t=jA;break;case Ft:t=XA;break;case Ot:t=KA;break;case 211:t=YA;break;case 212:t=QA;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZA;break;case Lt:t=JA;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[E.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}}class _C extends As{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=En(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!1,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.wrapR=xe,this.isStorageTexture=!0,this.is3DTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class RC extends N{constructor(e=1,t=1,r=1){super(),this.isArrayTexture=!0,this.image={width:e,height:t,depth:r},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0}setSize(e,t,r){this.image.width===e&&this.image.height===t&&this.image.depth===r||(this.image.width=e,this.image.height=t,this.image.depth=r,this.dispose())}}class EC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class AC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class wC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class CC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new AC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new wC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ai(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ei=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ei[e],r=wi[e],s=Ci[e];Ai(t,r,s);for(let i=0;i<4;i++){t=Ei[e]+Ei[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ai(t,r,s);for(let n=0;n<4;n++){t=Ei[e]+Ei[i]+Ei[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ai(t,r,s);for(let a=0;a<4;a++)t=Ei[e]+Ei[i]+Ei[n]+Ei[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ai(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),An=new Xi("vec4"),En=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",An),Ni("toIVec4",En),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Aa(Zi(e),t));Ni("call",Ea);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=An(vn(n),0):s=An(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Ao=nn(ro,ro.TAN).setParameterLength(1),Eo=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Ao),Ni("asin",Eo),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Au extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Eu=rn(Au),wu=(e,t=null)=>Eu(e,t).toStack(),Cu=(e,t=null)=>Eu(e,t,!0).toStack(),Mu=e=>Eu(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=An(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=An(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=An(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=An(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const El=rn(Al).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=An(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ad=un(e=>e.context.modelViewMatrix||Ed).once()().toVar("modelViewMatrix"),Ed=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),An()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ac=vc.cross(Rc),Ec=Rc.cross(_c),wc=Ac.mul(Nc.x).add(Ec.mul(Sc.x)),Cc=Ac.mul(Nc.y).add(Ec.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ad.mul(An(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Ah=sn(th,th.THICKNESS),Eh=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(El(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(El(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(El(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ap=null;class Ep extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ap&&(Ap=new Y),super(e,t,Ap)}getTextureForReference(){return Ap}}const wp=rn(Ep).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return An(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>An(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>An(0)),An(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=An(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=An(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ad.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?An(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=An(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return An(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=An(Ad.mul(An(e,1))).toVar("start"),s=An(Ad.mul(An(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=An().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(An(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(An(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(An(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(An(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(An(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return An(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=An(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(An(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(An(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(An(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Ag=new fe;class Eg extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,An(i,r),To(t)),o=nm(e,An(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=An().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(An(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(An(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return An(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Am=gn(.4),Em=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),An(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),An(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Eh;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Ah,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Af=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Ef extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Af({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Ef}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(An(1,0,0,0),An(0,Ro(e.x),So(e.x).negate(),0),An(0,So(e.x),Ro(e.x),0),An(0,0,0,1)),i=Ln(An(Ro(e.y),0,So(e.y),0),An(0,1,0,0),An(So(e.y).negate(),0,Ro(e.y),0),An(0,0,0,1)),n=Ln(An(Ro(e.z),So(e.z).negate(),0,0),An(So(e.z),Ro(e.z),0,0),An(0,0,1,0),An(0,0,0,1));return s.mul(i).mul(n).mul(An(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ad.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return An(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ad.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(An(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(An(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return En}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Ab=new r,Eb=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Ab.setFromMatrixPosition(n.matrixWorld),Eb.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Ab,Eb);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Ab),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Eb),Lb.subVectors(Ab,Cb),Lb.reflect(Rb).negate(),Lb.add(Ab),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Ab),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=An(vn(e,t),1)):i=An(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=An(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(An(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=El(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ad).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ax(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ax(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ax=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ex=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),An(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ad),s=gn(1),i=r.mul(An(Ld,1)),n=r.mul(An(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=An(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>An(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),AT=(e,t,r)=>RT(e,t,r).toStack();class ET extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===ET.SUBGROUP_ELECT?"bool":t===ET.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===ET.SUBGROUP_BROADCAST||r===ET.SUBGROUP_SHUFFLE||r===ET.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===ET.SUBGROUP_SHUFFLE_XOR||r===ET.SUBGROUP_SHUFFLE_DOWN||r===ET.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ET.SUBGROUP_ELECT="subgroupElect",ET.SUBGROUP_BALLOT="subgroupBallot",ET.SUBGROUP_ADD="subgroupAdd",ET.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",ET.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",ET.SUBGROUP_MUL="subgroupMul",ET.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",ET.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",ET.SUBGROUP_AND="subgroupAnd",ET.SUBGROUP_OR="subgroupOr",ET.SUBGROUP_XOR="subgroupXor",ET.SUBGROUP_MIN="subgroupMin",ET.SUBGROUP_MAX="subgroupMax",ET.SUBGROUP_ALL="subgroupAll",ET.SUBGROUP_ANY="subgroupAny",ET.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",ET.QUAD_SWAP_X="quadSwapX",ET.QUAD_SWAP_Y="quadSwapY",ET.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",ET.SUBGROUP_BROADCAST="subgroupBroadcast",ET.SUBGROUP_SHUFFLE="subgroupShuffle",ET.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",ET.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",ET.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",ET.QUAD_BROADCAST="quadBroadcast";const wT=nn(ET,ET.SUBGROUP_ELECT).setParameterLength(0),CT=nn(ET,ET.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(ET,ET.SUBGROUP_ADD).setParameterLength(1),BT=nn(ET,ET.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(ET,ET.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(ET,ET.SUBGROUP_MUL).setParameterLength(1),PT=nn(ET,ET.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(ET,ET.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(ET,ET.SUBGROUP_AND).setParameterLength(1),IT=nn(ET,ET.SUBGROUP_OR).setParameterLength(1),OT=nn(ET,ET.SUBGROUP_XOR).setParameterLength(1),VT=nn(ET,ET.SUBGROUP_MIN).setParameterLength(1),kT=nn(ET,ET.SUBGROUP_MAX).setParameterLength(1),GT=nn(ET,ET.SUBGROUP_ALL).setParameterLength(0),zT=nn(ET,ET.SUBGROUP_ANY).setParameterLength(0),$T=nn(ET,ET.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(ET,ET.QUAD_SWAP_X).setParameterLength(1),HT=nn(ET,ET.QUAD_SWAP_Y).setParameterLength(1),qT=nn(ET,ET.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(ET,ET.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(ET,ET.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(ET,ET.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(ET,ET.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(ET,ET.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(ET,ET.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),A_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),E_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=An(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,A_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(El(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=E_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Av=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ev=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Av(r,s),i,n),mv(Av(r.add(mn(1)),s),i.sub(1),n),mv(Av(r,s.add(mn(1))),i,n.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Av(r,s,i),n,a,o),mv(Av(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Av(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Av(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Av(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Av(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Av(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Ev(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return An(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:A_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Eo,assign:Ra,atan:Co,atomicAdd:(e,t)=>AT(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>AT(ST.ATOMIC_AND,e,t),atomicFunc:AT,atomicLoad:e=>AT(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>AT(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>AT(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>AT(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>AT(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>AT(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>AT(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Ea,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ex,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:E_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:En,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ax,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Eh,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Ah,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ed,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ad,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Ev(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return An(wv(e),Ev(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:El,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:An,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=An(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ad.mul(An(m,0));let y=rd.mul(An(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=An(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new AN(e);else if("mat3"===t)s=new EN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:AS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=ES.width,g.height=ES.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?At:Et:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ey(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const AR="point-list",ER="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eA="r16sint",tA="r16float",rA="rg8unorm",sA="rg8snorm",iA="rg8uint",nA="rg8sint",aA="r32uint",oA="r32sint",uA="r32float",lA="rg16uint",dA="rg16sint",cA="rg16float",hA="rgba8unorm",pA="rgba8unorm-srgb",gA="rgba8snorm",mA="rgba8uint",fA="rgba8sint",yA="bgra8unorm",bA="bgra8unorm-srgb",xA="rgb9e5ufloat",TA="rgb10a2unorm",_A="rg11b10ufloat",vA="rg32uint",NA="rg32sint",SA="rg32float",RA="rgba16uint",AA="rgba16sint",EA="rgba16float",wA="rgba32uint",CA="rgba32sint",MA="rgba32float",BA="depth16unorm",LA="depth24plus",FA="depth24plus-stencil8",PA="depth32float",DA="depth32float-stencil8",UA="bc1-rgba-unorm",IA="bc1-rgba-unorm-srgb",OA="bc2-rgba-unorm",VA="bc2-rgba-unorm-srgb",kA="bc3-rgba-unorm",GA="bc3-rgba-unorm-srgb",zA="bc4-r-unorm",$A="bc4-r-snorm",WA="bc5-rg-unorm",HA="bc5-rg-snorm",qA="bc6h-rgb-ufloat",jA="bc6h-rgb-float",XA="bc7-rgba-unorm",KA="bc7-rgba-unorm-srgb",YA="etc2-rgb8unorm",QA="etc2-rgb8unorm-srgb",ZA="etc2-rgb8a1unorm",JA="etc2-rgb8a1unorm-srgb",eE="etc2-rgba8unorm",tE="etc2-rgba8unorm-srgb",rE="eac-r11unorm",sE="eac-r11snorm",iE="eac-rg11unorm",nE="eac-rg11snorm",aE="astc-4x4-unorm",oE="astc-4x4-unorm-srgb",uE="astc-5x4-unorm",lE="astc-5x4-unorm-srgb",dE="astc-5x5-unorm",cE="astc-5x5-unorm-srgb",hE="astc-6x5-unorm",pE="astc-6x5-unorm-srgb",gE="astc-6x6-unorm",mE="astc-6x6-unorm-srgb",fE="astc-8x5-unorm",yE="astc-8x5-unorm-srgb",bE="astc-8x6-unorm",xE="astc-8x6-unorm-srgb",TE="astc-8x8-unorm",_E="astc-8x8-unorm-srgb",vE="astc-10x5-unorm",NE="astc-10x5-unorm-srgb",SE="astc-10x6-unorm",RE="astc-10x6-unorm-srgb",AE="astc-10x8-unorm",EE="astc-10x8-unorm-srgb",wE="astc-10x10-unorm",CE="astc-10x10-unorm-srgb",ME="astc-12x10-unorm",BE="astc-12x10-unorm-srgb",LE="astc-12x12-unorm",FE="astc-12x12-unorm-srgb",PE="clamp-to-edge",DE="repeat",UE="mirror-repeat",IE="linear",OE="nearest",VE="zero",kE="one",GE="src",zE="one-minus-src",$E="src-alpha",WE="one-minus-src-alpha",HE="dst",qE="one-minus-dst",jE="dst-alpha",XE="one-minus-dst-alpha",KE="src-alpha-saturated",YE="constant",QE="one-minus-constant",ZE="add",JE="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Aw="3d",Ew="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IE}),this.flipYSampler=e.createSampler({minFilter:OE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Au(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Au(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Au(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FA:LA),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?AR:e.isLineSegments||e.isMesh&&!0===t.wireframe?ER:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yA;if(e===be)return EA;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Ew,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZE},r={srcFactor:i,dstFactor:n,operation:ZE}};if(e.premultipliedAlpha)switch(s){case ze:i(kE,WE,kE,WE);break;case qt:i(kE,kE,kE,kE);break;case Ht:i(VE,zE,VE,kE);break;case Wt:i(HE,WE,VE,kE)}else switch(s){case ze:i($E,WE,kE,WE);break;case qt:i($E,kE,kE,kE);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VE;break;case kt:t=kE;break;case Vt:t=GE;break;case Dt:t=zE;break;case $e:t=$E;break;case We:t=WE;break;case It:t=HE;break;case Pt:t=qE;break;case Ut:t=jE;break;case Ft:t=XE;break;case Ot:t=KE;break;case 211:t=YE;break;case 212:t=QE;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZE;break;case Lt:t=JE;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0}}class _C extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=An(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class RC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class AC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class EC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new RC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new AC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t0){const{width:r,height:s}=e.context;t.bufferWidth=r,t.bufferHeight=s}t.lights=this.getLightsData(e.lightsNode.getLights()),this.renderObjects.set(e,t)}return t}getAttributesData(e){const t={};for(const r in e){const s=e[r];t[r]={version:s.version}}return t}containsNode(e){const t=e.material;for(const e in t)if(t[e]&&t[e].isNode)return!0;return!!(e.context.modelViewMatrix||e.context.modelNormalViewMatrix||e.context.getAO||e.context.getShadow)}getMaterialData(e){const t={};for(const r of this.refreshUniforms){const s=e[r];null!=s&&("object"==typeof s&&void 0!==s.clone?!0===s.isTexture?t[r]={id:s.id,version:s.version}:t[r]=s.clone():t[r]=s)}return t}equals(e,t){const{object:r,material:s,geometry:i}=e,n=this.getRenderObjectData(e);if(!0!==n.worldMatrix.equals(r.matrixWorld))return n.worldMatrix.copy(r.matrixWorld),!1;const a=n.material;for(const e in a){const t=a[e],r=s[e];if(void 0!==t.equals){if(!1===t.equals(r))return t.copy(r),!1}else if(!0===r.isTexture){if(t.id!==r.id||t.version!==r.version)return t.id=r.id,t.version=r.version,!1}else if(t!==r)return a[e]=r,!1}if(a.transmission>0){const{width:t,height:r}=e.context;if(n.bufferWidth!==t||n.bufferHeight!==r)return n.bufferWidth=t,n.bufferHeight=r,!1}const o=n.geometry,u=i.attributes,l=o.attributes,d=Object.keys(l),c=Object.keys(u);if(o.id!==i.id)return o.id=i.id,!1;if(d.length!==c.length)return n.geometry.attributes=this.getAttributesData(u),!1;for(const e of d){const t=l[e],r=u[e];if(void 0===r)return delete l[e],!1;if(t.version!==r.version)return t.version=r.version,!1}const h=i.index,p=o.indexVersion,g=h?h.version:null;if(p!==g)return o.indexVersion=g,!1;if(o.drawRange.start!==i.drawRange.start||o.drawRange.count!==i.drawRange.count)return o.drawRange.start=i.drawRange.start,o.drawRange.count=i.drawRange.count,!1;if(n.morphTargetInfluences){let e=!1;for(let t=0;t>>16,2246822507),r^=Math.imul(s^s>>>13,3266489909),s=Math.imul(s^s>>>16,2246822507),s^=Math.imul(r^r>>>13,3266489909),4294967296*(2097151&s)+(r>>>0)}const Us=e=>Ds(e),Is=e=>Ds(e),Os=(...e)=>Ds(e),Vs=new Map([[1,"float"],[2,"vec2"],[3,"vec3"],[4,"vec4"],[9,"mat3"],[16,"mat4"]]),ks=new WeakMap;function Gs(e){return Vs.get(e)}function zs(e){if(/[iu]?vec\d/.test(e))return e.startsWith("ivec")?Int32Array:e.startsWith("uvec")?Uint32Array:Float32Array;if(/mat\d/.test(e))return Float32Array;if(/float/.test(e))return Float32Array;if(/uint/.test(e))return Uint32Array;if(/int/.test(e))return Int32Array;throw new Error(`THREE.NodeUtils: Unsupported type: ${e}`)}function $s(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?9:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Ws(e){return/float|int|uint/.test(e)?1:/vec2/.test(e)?2:/vec3/.test(e)?3:/vec4/.test(e)||/mat2/.test(e)?4:/mat3/.test(e)?12:/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function Hs(e){return/float|int|uint/.test(e)?4:/vec2/.test(e)?8:/vec3/.test(e)||/vec4/.test(e)?16:/mat2/.test(e)?8:/mat3/.test(e)||/mat4/.test(e)?16:void o("TSL: Unsupported type:",e)}function qs(e){if(null==e)return null;const t=typeof e;return!0===e.isNode?"node":"number"===t?"float":"boolean"===t?"bool":"string"===t?"string":"function"===t?"shader":!0===e.isVector2?"vec2":!0===e.isVector3?"vec3":!0===e.isVector4?"vec4":!0===e.isMatrix2?"mat2":!0===e.isMatrix3?"mat3":!0===e.isMatrix4?"mat4":!0===e.isColor?"color":e instanceof ArrayBuffer?"ArrayBuffer":null}function js(o,...u){const l=o?o.slice(-4):void 0;return 1===u.length&&("vec2"===l?u=[u[0],u[0]]:"vec3"===l?u=[u[0],u[0],u[0]]:"vec4"===l&&(u=[u[0],u[0],u[0],u[0]])),"color"===o?new e(...u):"vec2"===l?new t(...u):"vec3"===l?new r(...u):"vec4"===l?new s(...u):"mat2"===l?new i(...u):"mat3"===l?new n(...u):"mat4"===l?new a(...u):"bool"===o?u[0]||!1:"float"===o||"int"===o||"uint"===o?u[0]||0:"string"===o?u[0]||"":"ArrayBuffer"===o?Ys(u[0]):null}function Xs(e){let t=ks.get(e);return void 0===t&&(t={},ks.set(e,t)),t}function Ks(e){let t="";const r=new Uint8Array(e);for(let e=0;ee.charCodeAt(0)).buffer}var Qs=Object.freeze({__proto__:null,arrayBufferToBase64:Ks,base64ToArrayBuffer:Ys,getAlignmentFromType:Hs,getDataFromObject:Xs,getLengthFromType:$s,getMemoryLengthFromType:Ws,getTypeFromLength:Gs,getTypedArrayFromType:zs,getValueFromType:js,getValueType:qs,hash:Os,hashArray:Is,hashString:Us});const Zs={VERTEX:"vertex",FRAGMENT:"fragment"},Js={NONE:"none",FRAME:"frame",RENDER:"render",OBJECT:"object"},ei={BOOLEAN:"bool",INTEGER:"int",FLOAT:"float",VECTOR2:"vec2",VECTOR3:"vec3",VECTOR4:"vec4",MATRIX2:"mat2",MATRIX3:"mat3",MATRIX4:"mat4"},ti={READ_ONLY:"readOnly",WRITE_ONLY:"writeOnly",READ_WRITE:"readWrite"},ri=["fragment","vertex"],si=["setup","analyze","generate"],ii=[...ri,"compute"],ni=["x","y","z","w"],ai={analyze:"setup",generate:"analyze"};let oi=0;class ui extends u{static get type(){return"Node"}constructor(e=null){super(),this.nodeType=e,this.updateType=Js.NONE,this.updateBeforeType=Js.NONE,this.updateAfterType=Js.NONE,this.uuid=l.generateUUID(),this.version=0,this.name="",this.global=!1,this.parents=!1,this.isNode=!0,this._beforeNodes=null,this._cacheKey=null,this._cacheKeyVersion=0,Object.defineProperty(this,"id",{value:oi++})}set needsUpdate(e){!0===e&&this.version++}get type(){return this.constructor.type}onUpdate(e,t){return this.updateType=t,this.update=e.bind(this),this}onFrameUpdate(e){return this.onUpdate(e,Js.FRAME)}onRenderUpdate(e){return this.onUpdate(e,Js.RENDER)}onObjectUpdate(e){return this.onUpdate(e,Js.OBJECT)}onReference(e){return this.updateReference=e.bind(this),this}updateReference(){return this}isGlobal(){return this.global}*getChildren(){for(const{childNode:e}of this._getChildren())yield e}dispose(){this.dispatchEvent({type:"dispose"})}traverse(e){e(this);for(const t of this.getChildren())t.traverse(e)}_getChildren(e=new Set){const t=[];e.add(this);for(const r of Object.getOwnPropertyNames(this)){const s=this[r];if(!0!==r.startsWith("_")&&!e.has(s))if(!0===Array.isArray(s))for(let e=0;e0&&(e.inputNodes=r)}deserialize(e){if(void 0!==e.inputNodes){const t=e.meta.nodes;for(const r in e.inputNodes)if(Array.isArray(e.inputNodes[r])){const s=[];for(const i of e.inputNodes[r])s.push(t[i]);this[r]=s}else if("object"==typeof e.inputNodes[r]){const s={};for(const i in e.inputNodes[r]){const n=e.inputNodes[r][i];s[i]=t[n]}this[r]=s}else{const s=e.inputNodes[r];this[r]=t[s]}}}toJSON(e){const{uuid:t,type:r}=this,s=void 0===e||"string"==typeof e;s&&(e={textures:{},images:{},nodes:{}});let i=e.nodes[t];function n(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(void 0===i&&(i={uuid:t,type:r,meta:e,metadata:{version:4.7,type:"Node",generator:"Node.toJSON"}},!0!==s&&(e.nodes[i.uuid]=i),this.serialize(i),delete i.meta),s){const t=n(e.textures),r=n(e.images),s=n(e.nodes);t.length>0&&(i.textures=t),r.length>0&&(i.images=r),s.length>0&&(i.nodes=s)}return i}}class li extends ui{static get type(){return"ArrayElementNode"}constructor(e,t){super(),this.node=e,this.indexNode=t,this.isArrayElementNode=!0}getNodeType(e){return this.node.getElementType(e)}getMemberType(e,t){return this.node.getMemberType(e,t)}generate(e){const t=this.indexNode.getNodeType(e);return`${this.node.build(e)}[ ${this.indexNode.build(e,!e.isVector(t)&&e.isInteger(t)?t:"uint")} ]`}}class di extends ui{static get type(){return"ConvertNode"}constructor(e,t){super(),this.node=e,this.convertTo=t}getNodeType(e){const t=this.node.getNodeType(e);let r=null;for(const s of this.convertTo.split("|"))null!==r&&e.getTypeLength(t)!==e.getTypeLength(s)||(r=s);return r}serialize(e){super.serialize(e),e.convertTo=this.convertTo}deserialize(e){super.deserialize(e),this.convertTo=e.convertTo}generate(e,t){const r=this.node,s=this.getNodeType(e),i=r.build(e,s);return e.format(i,s,t)}}class ci extends ui{static get type(){return"TempNode"}constructor(e=null){super(e),this.isTempNode=!0}hasDependencies(e){return e.getDataFromNode(this).usageCount>1}build(e,t){if("generate"===e.getBuildStage()){const r=e.getVectorType(this.getNodeType(e,t)),s=e.getDataFromNode(this);if(void 0!==s.propertyName)return e.format(s.propertyName,r,t);if("void"!==r&&"void"!==t&&this.hasDependencies(e)){const i=super.build(e,r),n=e.getVarFromNode(this,null,r),a=e.getPropertyName(n);return e.addLineFlowCode(`${a} = ${i}`,this),s.snippet=i,s.propertyName=a,e.format(s.propertyName,r,t)}}return super.build(e,t)}}class hi extends ci{static get type(){return"JoinNode"}constructor(e=[],t=null){super(t),this.nodes=e}getNodeType(e){return null!==this.nodeType?e.getVectorType(this.nodeType):e.getTypeFromLength(this.nodes.reduce((t,r)=>t+e.getTypeLength(r.getNodeType(e)),0))}generate(e,t){const r=this.getNodeType(e),s=e.getTypeLength(r),i=this.nodes,n=e.getComponentType(r),a=[];let u=0;for(const t of i){if(u>=s){o(`TSL: Length of parameters exceeds maximum length of function '${r}()' type.`);break}let i,l=t.getNodeType(e),d=e.getTypeLength(l);u+d>s&&(o(`TSL: Length of '${r}()' data exceeds maximum length of output type.`),d=s-u,l=e.getTypeFromLength(d)),u+=d,i=t.build(e,l);if(e.getComponentType(l)!==n){const t=e.getTypeFromLength(d,n);i=e.format(i,l,t)}a.push(i)}const l=`${e.getType(r)}( ${a.join(", ")} )`;return e.format(l,r,t)}}const pi=ni.join("");class gi extends ui{static get type(){return"SplitNode"}constructor(e,t="x"){super(),this.node=e,this.components=t,this.isSplitNode=!0}getVectorLength(){let e=this.components.length;for(const t of this.components)e=Math.max(ni.indexOf(t)+1,e);return e}getComponentType(e){return e.getComponentType(this.node.getNodeType(e))}getNodeType(e){return e.getTypeFromLength(this.components.length,this.getComponentType(e))}getScope(){return this.node.getScope()}generate(e,t){const r=this.node,s=e.getTypeLength(r.getNodeType(e));let i=null;if(s>1){let n=null;this.getVectorLength()>=s&&(n=e.getTypeFromLength(this.getVectorLength(),this.getComponentType(e)));const a=r.build(e,n);i=this.components.length===s&&this.components===pi.slice(0,this.components.length)?e.format(a,n,t):e.format(`${a}.${this.components}`,this.getNodeType(e),t)}else i=r.build(e,t);return i}serialize(e){super.serialize(e),e.components=this.components}deserialize(e){super.deserialize(e),this.components=e.components}}class mi extends ci{static get type(){return"SetNode"}constructor(e,t,r){super(),this.sourceNode=e,this.components=t,this.targetNode=r}getNodeType(e){return this.sourceNode.getNodeType(e)}generate(e){const{sourceNode:t,components:r,targetNode:s}=this,i=this.getNodeType(e),n=e.getComponentType(s.getNodeType(e)),a=e.getTypeFromLength(r.length,n),o=s.build(e,a),u=t.build(e,i),l=e.getTypeLength(i),d=[];for(let e=0;e(e=>e.replace(/r|s/g,"x").replace(/g|t/g,"y").replace(/b|p/g,"z").replace(/a|q/g,"w"))(e).split("").sort().join("");ui.prototype.assign=function(...e){if(!0!==this.isStackNode)return null!==_i?_i.assign(this,...e):o("TSL: No stack defined for assign operation. Make sure the assign is inside a Fn()."),this;{const t=vi.get("assign");return this.addToStack(t(...e))}},ui.prototype.toVarIntent=function(){return this},ui.prototype.get=function(e){return new Ti(this,e)};const Ri={};function Ai(e,t,r){Ri[e]=Ri[t]=Ri[r]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new gi(this,e),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};const s=e.toUpperCase(),i=t.toUpperCase(),n=r.toUpperCase();ui.prototype["set"+s]=ui.prototype["set"+i]=ui.prototype["set"+n]=function(t){const r=Si(e);return new mi(this,r,Zi(t))},ui.prototype["flip"+s]=ui.prototype["flip"+i]=ui.prototype["flip"+n]=function(){const t=Si(e);return new fi(this,t)}}const Ei=["x","y","z","w"],wi=["r","g","b","a"],Ci=["s","t","p","q"];for(let e=0;e<4;e++){let t=Ei[e],r=wi[e],s=Ci[e];Ai(t,r,s);for(let i=0;i<4;i++){t=Ei[e]+Ei[i],r=wi[e]+wi[i],s=Ci[e]+Ci[i],Ai(t,r,s);for(let n=0;n<4;n++){t=Ei[e]+Ei[i]+Ei[n],r=wi[e]+wi[i]+wi[n],s=Ci[e]+Ci[i]+Ci[n],Ai(t,r,s);for(let a=0;a<4;a++)t=Ei[e]+Ei[i]+Ei[n]+Ei[a],r=wi[e]+wi[i]+wi[n]+wi[a],s=Ci[e]+Ci[i]+Ci[n]+Ci[a],Ai(t,r,s)}}}for(let e=0;e<32;e++)Ri[e]={get(){this._cache=this._cache||{};let t=this._cache[e];return void 0===t&&(t=new li(this,new xi(e,"uint")),this._cache[e]=t),t},set(t){this[e].assign(Zi(t))}};Object.defineProperties(ui.prototype,Ri);const Mi=new WeakMap,Bi=function(e,t=null){for(const r in e)e[r]=Zi(e[r],t);return e},Li=function(e,t=null){const r=e.length;for(let s=0;su?(o(`TSL: "${r}" parameter length exceeds limit.`),t.slice(0,u)):t}return null===t?n=(...t)=>i(new e(...tn(d(t)))):null!==r?(r=Zi(r),n=(...s)=>i(new e(t,...tn(d(s)),r))):n=(...r)=>i(new e(t,...tn(d(r)))),n.setParameterLength=(...e)=>(1===e.length?a=u=e[0]:2===e.length&&([a,u]=e),n),n.setName=e=>(l=e,n),n},Pi=function(e,...t){return new e(...tn(t))};class Di extends ui{constructor(e,t){super(),this.shaderNode=e,this.rawInputs=t,this.isShaderCallNodeInternal=!0}getNodeType(e){return this.shaderNode.nodeType||this.getOutputNode(e).getNodeType(e)}getElementType(e){return this.getOutputNode(e).getElementType(e)}getMemberType(e,t){return this.getOutputNode(e).getMemberType(e,t)}call(e){const{shaderNode:t,rawInputs:r}=this,s=e.getNodeProperties(t),i=e.getClosestSubBuild(t.subBuilds)||"",n=i||"default";if(s[n])return s[n];const a=e.subBuildFn,o=e.fnCall;e.subBuildFn=i,e.fnCall=this;let u=null;if(t.layout){let s=Mi.get(e.constructor);void 0===s&&(s=new WeakMap,Mi.set(e.constructor,s));let i=s.get(t);void 0===i&&(i=Zi(e.buildFunctionNode(t)),s.set(t,i)),e.addInclude(i);const n=r?function(e){let t;en(e);t=e[0]&&(e[0].isNode||Object.getPrototypeOf(e[0])!==Object.prototype)?[...e]:e[0];return t}(r):null;u=Zi(i.call(n))}else{const s=new Proxy(e,{get:(e,t,r)=>{let s;return s=Symbol.iterator===t?function*(){yield}:Reflect.get(e,t,r),s}}),i=r?function(e){let t=0;return en(e),new Proxy(e,{get:(r,s,i)=>{let n;if("length"===s)return n=e.length,n;if(Symbol.iterator===s)n=function*(){for(const t of e)yield Zi(t)};else{if(e.length>0)if(Object.getPrototypeOf(e[0])===Object.prototype){const r=e[0];n=void 0===r[s]?r[t++]:Reflect.get(r,s,i)}else e[0]instanceof ui&&(n=void 0===e[s]?e[t++]:Reflect.get(e,s,i));else n=Reflect.get(r,s,i);n=Zi(n)}return n}})}(r):null,n=Array.isArray(r)?r.length>0:null!==r,a=t.jsFunc,o=n||a.length>1?a(i,s):a(s);u=Zi(o)}return e.subBuildFn=a,e.fnCall=o,t.once&&(s[n]=u),u}setupOutput(e){return e.addStack(),e.stack.outputNode=this.call(e),e.removeStack()}getOutputNode(e){const t=e.getNodeProperties(this),r=e.getSubBuildOutput(this);return t[r]=t[r]||this.setupOutput(e),t[r].subBuild=e.getClosestSubBuild(this),t[r]}build(e,t=null){let r=null;const s=e.getBuildStage(),i=e.getNodeProperties(this),n=e.getSubBuildOutput(this),a=this.getOutputNode(e),o=e.fnCall;if(e.fnCall=this,"setup"===s){const t=e.getSubBuildProperty("initialized",this);if(!0!==i[t]&&(i[t]=!0,i[n]=this.getOutputNode(e),i[n].build(e),this.shaderNode.subBuilds))for(const t of e.chaining){const r=e.getDataFromNode(t,"any");r.subBuilds=r.subBuilds||new Set;for(const e of this.shaderNode.subBuilds)r.subBuilds.add(e)}r=i[n]}else"analyze"===s?a.build(e,t):"generate"===s&&(r=a.build(e,t)||"");return e.fnCall=o,r}}class Ui extends ui{constructor(e,t){super(t),this.jsFunc=e,this.layout=null,this.global=!0,this.once=!1}setLayout(e){return this.layout=e,this}getLayout(){return this.layout}call(e=null){return new Di(this,e)}setup(){return this.call()}}const Ii=[!1,!0],Oi=[0,1,2,3],Vi=[-1,-2],ki=[.5,1.5,1/3,1e-6,1e6,Math.PI,2*Math.PI,1/Math.PI,2/Math.PI,1/(2*Math.PI),Math.PI/2],Gi=new Map;for(const e of Ii)Gi.set(e,new xi(e));const zi=new Map;for(const e of Oi)zi.set(e,new xi(e,"uint"));const $i=new Map([...zi].map(e=>new xi(e.value,"int")));for(const e of Vi)$i.set(e,new xi(e,"int"));const Wi=new Map([...$i].map(e=>new xi(e.value)));for(const e of ki)Wi.set(e,new xi(e));for(const e of ki)Wi.set(-e,new xi(-e));const Hi={bool:Gi,uint:zi,ints:$i,float:Wi},qi=new Map([...Gi,...Wi]),ji=(e,t)=>qi.has(e)?qi.get(e):!0===e.isNode?e:new xi(e,t),Xi=function(e,t=null){return(...r)=>{for(const t of r)if(void 0===t)return o(`TSL: Invalid parameter for the type "${e}".`),new xi(0,e);if((0===r.length||!["bool","float","int","uint"].includes(e)&&r.every(e=>{const t=typeof e;return"object"!==t&&"function"!==t}))&&(r=[js(e,...r)]),1===r.length&&null!==t&&t.has(r[0]))return Ji(t.get(r[0]));if(1===r.length){const t=ji(r[0],e);return t.nodeType===e?Ji(t):Ji(new di(t,e))}const s=r.map(e=>ji(e));return Ji(new hi(s,e))}},Ki=e=>"object"==typeof e&&null!==e?e.value:e,Yi=e=>null!=e?e.nodeType||e.convertTo||("string"==typeof e?e:null):null;function Qi(e,t){return new Ui(e,t)}const Zi=(e,t=null)=>function(e,t=null){const r=qs(e);return"node"===r?e:null===t&&("float"===r||"boolean"===r)||r&&"shader"!==r&&"string"!==r?Zi(ji(e,t)):"shader"===r?e.isFn?e:un(e):e}(e,t),Ji=(e,t=null)=>Zi(e,t).toVarIntent(),en=(e,t=null)=>new Bi(e,t),tn=(e,t=null)=>new Li(e,t),rn=(e,t=null,r=null,s=null)=>new Fi(e,t,r,s),sn=(e,...t)=>new Pi(e,...t),nn=(e,t=null,r=null,s={})=>new Fi(e,t,r,{...s,intent:!0});let an=0;class on extends ui{constructor(e,t=null){super();let r=null;null!==t&&("object"==typeof t?r=t.return:("string"==typeof t?r=t:o("TSL: Invalid layout type."),t=null)),this.shaderNode=new Qi(e,r),null!==t&&this.setLayout(t),this.isFn=!0}setLayout(e){const t=this.shaderNode.nodeType;if("object"!=typeof e.inputs){const r={name:"fn"+an++,type:t,inputs:[]};for(const t in e)"return"!==t&&r.inputs.push({name:t,type:e[t]});e=r}return this.shaderNode.setLayout(e),this}getNodeType(e){return this.shaderNode.getNodeType(e)||"float"}call(...e){const t=this.shaderNode.call(e);return"void"===this.shaderNode.nodeType&&t.toStack(),t.toVarIntent()}once(e=null){return this.shaderNode.once=!0,this.shaderNode.subBuilds=e,this}generate(e){const t=this.getNodeType(e);return o('TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".'),e.generateConst(t)}}function un(e,t=null){const r=new on(e,t);return new Proxy(()=>{},{apply:(e,t,s)=>r.call(...s),get:(e,t,s)=>Reflect.get(r,t,s),set:(e,t,s,i)=>Reflect.set(r,t,s,i)})}const ln=e=>{_i=e},dn=()=>_i,cn=(...e)=>_i.If(...e);function hn(e){return _i&&_i.addToStack(e),e}Ni("toStack",hn);const pn=new Xi("color"),gn=new Xi("float",Hi.float),mn=new Xi("int",Hi.ints),fn=new Xi("uint",Hi.uint),yn=new Xi("bool",Hi.bool),bn=new Xi("vec2"),xn=new Xi("ivec2"),Tn=new Xi("uvec2"),_n=new Xi("bvec2"),vn=new Xi("vec3"),Nn=new Xi("ivec3"),Sn=new Xi("uvec3"),Rn=new Xi("bvec3"),An=new Xi("vec4"),En=new Xi("ivec4"),wn=new Xi("uvec4"),Cn=new Xi("bvec4"),Mn=new Xi("mat2"),Bn=new Xi("mat3"),Ln=new Xi("mat4");Ni("toColor",pn),Ni("toFloat",gn),Ni("toInt",mn),Ni("toUint",fn),Ni("toBool",yn),Ni("toVec2",bn),Ni("toIVec2",xn),Ni("toUVec2",Tn),Ni("toBVec2",_n),Ni("toVec3",vn),Ni("toIVec3",Nn),Ni("toUVec3",Sn),Ni("toBVec3",Rn),Ni("toVec4",An),Ni("toIVec4",En),Ni("toUVec4",wn),Ni("toBVec4",Cn),Ni("toMat2",Mn),Ni("toMat3",Bn),Ni("toMat4",Ln);const Fn=rn(li).setParameterLength(2),Pn=(e,t)=>Zi(new di(Zi(e),t));Ni("element",Fn),Ni("convert",Pn);Ni("append",e=>(d("TSL: .append() has been renamed to .toStack()."),hn(e)));class Dn extends ui{static get type(){return"PropertyNode"}constructor(e,t=null,r=!1){super(e),this.name=t,this.varying=r,this.isPropertyNode=!0,this.global=!0}customCacheKey(){return Us(this.type+":"+(this.name||"")+":"+(this.varying?"1":"0"))}getHash(e){return this.name||super.getHash(e)}generate(e){let t;return!0===this.varying?(t=e.getVaryingFromNode(this,this.name),t.needsInterpolation=!0):t=e.getVarFromNode(this,this.name),e.getPropertyName(t)}}const Un=(e,t)=>new Dn(e,t),In=(e,t)=>new Dn(e,t,!0),On=sn(Dn,"vec4","DiffuseColor"),Vn=sn(Dn,"vec3","DiffuseContribution"),kn=sn(Dn,"vec3","EmissiveColor"),Gn=sn(Dn,"float","Roughness"),zn=sn(Dn,"float","Metalness"),$n=sn(Dn,"float","Clearcoat"),Wn=sn(Dn,"float","ClearcoatRoughness"),Hn=sn(Dn,"vec3","Sheen"),qn=sn(Dn,"float","SheenRoughness"),jn=sn(Dn,"float","Iridescence"),Xn=sn(Dn,"float","IridescenceIOR"),Kn=sn(Dn,"float","IridescenceThickness"),Yn=sn(Dn,"float","AlphaT"),Qn=sn(Dn,"float","Anisotropy"),Zn=sn(Dn,"vec3","AnisotropyT"),Jn=sn(Dn,"vec3","AnisotropyB"),ea=sn(Dn,"color","SpecularColor"),ta=sn(Dn,"color","SpecularColorBlended"),ra=sn(Dn,"float","SpecularF90"),sa=sn(Dn,"float","Shininess"),ia=sn(Dn,"vec4","Output"),na=sn(Dn,"float","dashSize"),aa=sn(Dn,"float","gapSize"),oa=sn(Dn,"float","pointWidth"),ua=sn(Dn,"float","IOR"),la=sn(Dn,"float","Transmission"),da=sn(Dn,"float","Thickness"),ca=sn(Dn,"float","AttenuationDistance"),ha=sn(Dn,"color","AttenuationColor"),pa=sn(Dn,"float","Dispersion");class ga extends ui{static get type(){return"UniformGroupNode"}constructor(e,t=!1,r=1){super("string"),this.name=e,this.shared=t,this.order=r,this.isUniformGroup=!0}serialize(e){super.serialize(e),e.name=this.name,e.version=this.version,e.shared=this.shared}deserialize(e){super.deserialize(e),this.name=e.name,this.version=e.version,this.shared=e.shared}}const ma=e=>new ga(e),fa=(e,t=0)=>new ga(e,!0,t),ya=fa("frame"),ba=fa("render"),xa=ma("object");class Ta extends yi{static get type(){return"UniformNode"}constructor(e,t=null){super(e,t),this.isUniformNode=!0,this.name="",this.groupNode=xa}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setGroup(e){return this.groupNode=e,this}getGroup(){return this.groupNode}getUniformHash(e){return this.getHash(e)}onUpdate(e,t){return e=e.bind(this),super.onUpdate(t=>{const r=e(t,this);void 0!==r&&(this.value=r)},t)}getInputType(e){let t=super.getInputType(e);return"bool"===t&&(t="uint"),t}generate(e,t){const r=this.getNodeType(e),s=this.getUniformHash(e);let i=e.getNodeFromHash(s);void 0===i&&(e.setHashNode(this,s),i=this);const n=i.getInputType(e),a=e.getUniformFromNode(i,n,e.shaderStage,this.name||e.context.nodeName),o=e.getPropertyName(a);void 0!==e.context.nodeName&&delete e.context.nodeName;let u=o;if("bool"===r){const t=e.getDataFromNode(this);let s=t.propertyName;if(void 0===s){const i=e.getVarFromNode(this,null,"bool");s=e.getPropertyName(i),t.propertyName=s,u=e.format(o,n,r),e.addLineFlowCode(`${s} = ${u}`,this)}u=s}return e.format(u,r,t)}}const _a=(e,t)=>{const r=Yi(t||e);if(r===e&&(e=js(r)),e&&!0===e.isNode){let t=e.value;e.traverse(e=>{!0===e.isConstNode&&(t=e.value)}),e=t}return new Ta(e,r)};class va extends ci{static get type(){return"ArrayNode"}constructor(e,t,r=null){super(e),this.count=t,this.values=r,this.isArrayNode=!0}getArrayCount(){return this.count}getNodeType(e){return null===this.nodeType?this.values[0].getNodeType(e):this.nodeType}getElementType(e){return this.getNodeType(e)}getMemberType(e,t){return null===this.nodeType?this.values[0].getMemberType(e,t):super.getMemberType(e,t)}generate(e){const t=this.getNodeType(e);return e.generateArray(t,this.count,this.values)}}const Na=(...e)=>{let t;if(1===e.length){const r=e[0];t=new va(null,r.length,r)}else{const r=e[0],s=e[1];t=new va(r,s)}return Zi(t)};Ni("toArray",(e,t)=>Na(Array(t).fill(e)));class Sa extends ci{static get type(){return"AssignNode"}constructor(e,t){super(),this.targetNode=e,this.sourceNode=t,this.isAssignNode=!0}hasDependencies(){return!1}getNodeType(e,t){return"void"!==t?this.targetNode.getNodeType(e):"void"}needsSplitAssign(e){const{targetNode:t}=this;if(!1===e.isAvailable("swizzleAssign")&&t.isSplitNode&&t.components.length>1){const r=e.getTypeLength(t.node.getNodeType(e));return ni.join("").slice(0,r)!==t.components}return!1}setup(e){const{targetNode:t,sourceNode:r}=this,s=t.getScope();e.getDataFromNode(s).assign=!0;const i=e.getNodeProperties(this);i.sourceNode=r,i.targetNode=t.context({assign:!0})}generate(e,t){const{targetNode:r,sourceNode:s}=e.getNodeProperties(this),i=this.needsSplitAssign(e),n=r.build(e),a=r.getNodeType(e),o=s.build(e,a),u=s.getNodeType(e),l=e.getDataFromNode(this);let d;if(!0===l.initialized)"void"!==t&&(d=n);else if(i){const s=e.getVarFromNode(this,null,a),i=e.getPropertyName(s);e.addLineFlowCode(`${i} = ${o}`,this);const u=r.node,l=u.node.context({assign:!0}).build(e);for(let t=0;t{const s=r.type;let i;return i="pointer"===s?"&"+t.build(e):t.build(e,s),i};if(Array.isArray(i)){if(i.length>s.length)o("TSL: The number of provided parameters exceeds the expected number of inputs in 'Fn()'."),i.length=s.length;else if(i.length(t=t.length>1||t[0]&&!0===t[0].isNode?tn(t):en(t[0]),new Aa(Zi(e),t));Ni("call",Ea);const wa={"==":"equal","!=":"notEqual","<":"lessThan",">":"greaterThan","<=":"lessThanEqual",">=":"greaterThanEqual","%":"mod"};class Ca extends ci{static get type(){return"OperatorNode"}constructor(e,t,r,...s){if(super(),s.length>0){let i=new Ca(e,t,r);for(let t=0;t>"===r||"<<"===r)return e.getIntegerType(n);if("!"===r||"&&"===r||"||"===r||"^^"===r)return"bool";if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r){const t=Math.max(e.getTypeLength(n),e.getTypeLength(a));return t>1?`bvec${t}`:"bool"}if(e.isMatrix(n)){if("float"===a)return n;if(e.isVector(a))return e.getVectorFromMatrix(n);if(e.isMatrix(a))return n}else if(e.isMatrix(a)){if("float"===n)return a;if(e.isVector(n))return e.getVectorFromMatrix(a)}return e.getTypeLength(a)>e.getTypeLength(n)?a:n}generate(e,t){const r=this.op,{aNode:s,bNode:i}=this,n=this.getNodeType(e,t);let a=null,o=null;"void"!==n?(a=s.getNodeType(e),o=i?i.getNodeType(e):null,"<"===r||">"===r||"<="===r||">="===r||"=="===r||"!="===r?e.isVector(a)?o=a:e.isVector(o)?a=o:a!==o&&(a=o="float"):">>"===r||"<<"===r?(a=n,o=e.changeComponentType(o,"uint")):"%"===r?(a=n,o=e.isInteger(a)&&e.isInteger(o)?o:a):e.isMatrix(a)?"float"===o?o="float":e.isVector(o)?o=e.getVectorFromMatrix(a):e.isMatrix(o)||(a=o=n):a=e.isMatrix(o)?"float"===a?"float":e.isVector(a)?e.getVectorFromMatrix(o):o=n:o=n):a=o=n;const u=s.build(e,a),l=i?i.build(e,o):null,d=e.getFunctionOperator(r);if("void"!==t){const s=e.renderer.coordinateSystem===c;if("=="===r||"!="===r||"<"===r||">"===r||"<="===r||">="===r)return s&&e.isVector(a)?e.format(`${this.getOperatorMethod(e,t)}( ${u}, ${l} )`,n,t):e.format(`( ${u} ${r} ${l} )`,n,t);if("%"===r)return e.isInteger(o)?e.format(`( ${u} % ${l} )`,n,t):e.format(`${this.getOperatorMethod(e,n)}( ${u}, ${l} )`,n,t);if("!"===r||"~"===r)return e.format(`(${r}${u})`,a,t);if(d)return e.format(`${d}( ${u}, ${l} )`,n,t);if(e.isMatrix(a)&&"float"===o)return e.format(`( ${l} ${r} ${u} )`,n,t);if("float"===a&&e.isMatrix(o))return e.format(`${u} ${r} ${l}`,n,t);{let i=`( ${u} ${r} ${l} )`;return!s&&"bool"===n&&e.isVector(a)&&e.isVector(o)&&(i=`all${i}`),e.format(i,n,t)}}if("void"!==a)return d?e.format(`${d}( ${u}, ${l} )`,n,t):e.isMatrix(a)&&"float"===o?e.format(`${l} ${r} ${u}`,n,t):e.format(`${u} ${r} ${l}`,n,t)}serialize(e){super.serialize(e),e.op=this.op}deserialize(e){super.deserialize(e),this.op=e.op}}const Ma=nn(Ca,"+").setParameterLength(2,1/0).setName("add"),Ba=nn(Ca,"-").setParameterLength(2,1/0).setName("sub"),La=nn(Ca,"*").setParameterLength(2,1/0).setName("mul"),Fa=nn(Ca,"/").setParameterLength(2,1/0).setName("div"),Pa=nn(Ca,"%").setParameterLength(2).setName("mod"),Da=nn(Ca,"==").setParameterLength(2).setName("equal"),Ua=nn(Ca,"!=").setParameterLength(2).setName("notEqual"),Ia=nn(Ca,"<").setParameterLength(2).setName("lessThan"),Oa=nn(Ca,">").setParameterLength(2).setName("greaterThan"),Va=nn(Ca,"<=").setParameterLength(2).setName("lessThanEqual"),ka=nn(Ca,">=").setParameterLength(2).setName("greaterThanEqual"),Ga=nn(Ca,"&&").setParameterLength(2,1/0).setName("and"),za=nn(Ca,"||").setParameterLength(2,1/0).setName("or"),$a=nn(Ca,"!").setParameterLength(1).setName("not"),Wa=nn(Ca,"^^").setParameterLength(2).setName("xor"),Ha=nn(Ca,"&").setParameterLength(2).setName("bitAnd"),qa=nn(Ca,"~").setParameterLength(1).setName("bitNot"),ja=nn(Ca,"|").setParameterLength(2).setName("bitOr"),Xa=nn(Ca,"^").setParameterLength(2).setName("bitXor"),Ka=nn(Ca,"<<").setParameterLength(2).setName("shiftLeft"),Ya=nn(Ca,">>").setParameterLength(2).setName("shiftRight"),Qa=un(([e])=>(e.addAssign(1),e)),Za=un(([e])=>(e.subAssign(1),e)),Ja=un(([e])=>{const t=mn(e).toConst();return e.addAssign(1),t}),eo=un(([e])=>{const t=mn(e).toConst();return e.subAssign(1),t});Ni("add",Ma),Ni("sub",Ba),Ni("mul",La),Ni("div",Fa),Ni("mod",Pa),Ni("equal",Da),Ni("notEqual",Ua),Ni("lessThan",Ia),Ni("greaterThan",Oa),Ni("lessThanEqual",Va),Ni("greaterThanEqual",ka),Ni("and",Ga),Ni("or",za),Ni("not",$a),Ni("xor",Wa),Ni("bitAnd",Ha),Ni("bitNot",qa),Ni("bitOr",ja),Ni("bitXor",Xa),Ni("shiftLeft",Ka),Ni("shiftRight",Ya),Ni("incrementBefore",Qa),Ni("decrementBefore",Za),Ni("increment",Ja),Ni("decrement",eo);const to=(e,t)=>(d('TSL: "modInt()" is deprecated. Use "mod( int( ... ) )" instead.'),Pa(mn(e),mn(t)));Ni("modInt",to);class ro extends ci{static get type(){return"MathNode"}constructor(e,t,r=null,s=null){if(super(),(e===ro.MAX||e===ro.MIN)&&arguments.length>3){let i=new ro(e,t,r);for(let t=2;tn&&i>a?t:n>a?r:a>i?s:t}getNodeType(e){const t=this.method;return t===ro.LENGTH||t===ro.DISTANCE||t===ro.DOT?"float":t===ro.CROSS?"vec3":t===ro.ALL||t===ro.ANY?"bool":t===ro.EQUALS?e.changeComponentType(this.aNode.getNodeType(e),"bool"):this.getInputType(e)}setup(e){const{aNode:t,bNode:r,method:s}=this;let i=null;if(s===ro.ONE_MINUS)i=Ba(1,t);else if(s===ro.RECIPROCAL)i=Fa(1,t);else if(s===ro.DIFFERENCE)i=Mo(Ba(t,r));else if(s===ro.TRANSFORM_DIRECTION){let s=t,n=r;e.isMatrix(s.getNodeType(e))?n=An(vn(n),0):s=An(vn(s),0);const a=La(s,n).xyz;i=vo(a)}return null!==i?i:super.setup(e)}generate(e,t){if(e.getNodeProperties(this).outputNode)return super.generate(e,t);let r=this.method;const s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=this.cNode,u=e.renderer.coordinateSystem;if(r===ro.NEGATE)return e.format("( - "+n.build(e,i)+" )",s,t);{const l=[];return r===ro.CROSS?l.push(n.build(e,s),a.build(e,s)):u===c&&r===ro.STEP?l.push(n.build(e,1===e.getTypeLength(n.getNodeType(e))?"float":i),a.build(e,i)):u!==c||r!==ro.MIN&&r!==ro.MAX?r===ro.REFRACT?l.push(n.build(e,i),a.build(e,i),o.build(e,"float")):r===ro.MIX?l.push(n.build(e,i),a.build(e,i),o.build(e,1===e.getTypeLength(o.getNodeType(e))?"float":i)):(u===h&&r===ro.ATAN&&null!==a&&(r="atan2"),"fragment"===e.shaderStage||r!==ro.DFDX&&r!==ro.DFDY||(d(`TSL: '${r}' is not supported in the ${e.shaderStage} stage.`),r="/*"+r+"*/"),l.push(n.build(e,i)),null!==a&&l.push(a.build(e,i)),null!==o&&l.push(o.build(e,i))):l.push(n.build(e,i),a.build(e,1===e.getTypeLength(a.getNodeType(e))?"float":i)),e.format(`${e.getMethod(r,s)}( ${l.join(", ")} )`,s,t)}}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ro.ALL="all",ro.ANY="any",ro.RADIANS="radians",ro.DEGREES="degrees",ro.EXP="exp",ro.EXP2="exp2",ro.LOG="log",ro.LOG2="log2",ro.SQRT="sqrt",ro.INVERSE_SQRT="inversesqrt",ro.FLOOR="floor",ro.CEIL="ceil",ro.NORMALIZE="normalize",ro.FRACT="fract",ro.SIN="sin",ro.COS="cos",ro.TAN="tan",ro.ASIN="asin",ro.ACOS="acos",ro.ATAN="atan",ro.ABS="abs",ro.SIGN="sign",ro.LENGTH="length",ro.NEGATE="negate",ro.ONE_MINUS="oneMinus",ro.DFDX="dFdx",ro.DFDY="dFdy",ro.ROUND="round",ro.RECIPROCAL="reciprocal",ro.TRUNC="trunc",ro.FWIDTH="fwidth",ro.TRANSPOSE="transpose",ro.DETERMINANT="determinant",ro.INVERSE="inverse",ro.EQUALS="equals",ro.MIN="min",ro.MAX="max",ro.STEP="step",ro.REFLECT="reflect",ro.DISTANCE="distance",ro.DIFFERENCE="difference",ro.DOT="dot",ro.CROSS="cross",ro.POW="pow",ro.TRANSFORM_DIRECTION="transformDirection",ro.MIX="mix",ro.CLAMP="clamp",ro.REFRACT="refract",ro.SMOOTHSTEP="smoothstep",ro.FACEFORWARD="faceforward";const so=gn(1e-6),io=gn(1e6),no=gn(Math.PI),ao=gn(2*Math.PI),oo=gn(2*Math.PI),uo=gn(.5*Math.PI),lo=nn(ro,ro.ALL).setParameterLength(1),co=nn(ro,ro.ANY).setParameterLength(1),ho=nn(ro,ro.RADIANS).setParameterLength(1),po=nn(ro,ro.DEGREES).setParameterLength(1),go=nn(ro,ro.EXP).setParameterLength(1),mo=nn(ro,ro.EXP2).setParameterLength(1),fo=nn(ro,ro.LOG).setParameterLength(1),yo=nn(ro,ro.LOG2).setParameterLength(1),bo=nn(ro,ro.SQRT).setParameterLength(1),xo=nn(ro,ro.INVERSE_SQRT).setParameterLength(1),To=nn(ro,ro.FLOOR).setParameterLength(1),_o=nn(ro,ro.CEIL).setParameterLength(1),vo=nn(ro,ro.NORMALIZE).setParameterLength(1),No=nn(ro,ro.FRACT).setParameterLength(1),So=nn(ro,ro.SIN).setParameterLength(1),Ro=nn(ro,ro.COS).setParameterLength(1),Ao=nn(ro,ro.TAN).setParameterLength(1),Eo=nn(ro,ro.ASIN).setParameterLength(1),wo=nn(ro,ro.ACOS).setParameterLength(1),Co=nn(ro,ro.ATAN).setParameterLength(1,2),Mo=nn(ro,ro.ABS).setParameterLength(1),Bo=nn(ro,ro.SIGN).setParameterLength(1),Lo=nn(ro,ro.LENGTH).setParameterLength(1),Fo=nn(ro,ro.NEGATE).setParameterLength(1),Po=nn(ro,ro.ONE_MINUS).setParameterLength(1),Do=nn(ro,ro.DFDX).setParameterLength(1),Uo=nn(ro,ro.DFDY).setParameterLength(1),Io=nn(ro,ro.ROUND).setParameterLength(1),Oo=nn(ro,ro.RECIPROCAL).setParameterLength(1),Vo=nn(ro,ro.TRUNC).setParameterLength(1),ko=nn(ro,ro.FWIDTH).setParameterLength(1),Go=nn(ro,ro.TRANSPOSE).setParameterLength(1),zo=nn(ro,ro.DETERMINANT).setParameterLength(1),$o=nn(ro,ro.INVERSE).setParameterLength(1),Wo=nn(ro,ro.MIN).setParameterLength(2,1/0),Ho=nn(ro,ro.MAX).setParameterLength(2,1/0),qo=nn(ro,ro.STEP).setParameterLength(2),jo=nn(ro,ro.REFLECT).setParameterLength(2),Xo=nn(ro,ro.DISTANCE).setParameterLength(2),Ko=nn(ro,ro.DIFFERENCE).setParameterLength(2),Yo=nn(ro,ro.DOT).setParameterLength(2),Qo=nn(ro,ro.CROSS).setParameterLength(2),Zo=nn(ro,ro.POW).setParameterLength(2),Jo=e=>La(e,e),eu=e=>La(e,e,e),tu=e=>La(e,e,e,e),ru=nn(ro,ro.TRANSFORM_DIRECTION).setParameterLength(2),su=e=>La(Bo(e),Zo(Mo(e),1/3)),iu=e=>Yo(e,e),nu=nn(ro,ro.MIX).setParameterLength(3),au=(e,t=0,r=1)=>Zi(new ro(ro.CLAMP,Zi(e),Zi(t),Zi(r))),ou=e=>au(e),uu=nn(ro,ro.REFRACT).setParameterLength(3),lu=nn(ro,ro.SMOOTHSTEP).setParameterLength(3),du=nn(ro,ro.FACEFORWARD).setParameterLength(3),cu=un(([e])=>{const t=Yo(e.xy,bn(12.9898,78.233)),r=Pa(t,no);return No(So(r).mul(43758.5453))}),hu=(e,t,r)=>nu(t,r,e),pu=(e,t,r)=>lu(t,r,e),gu=(e,t)=>qo(t,e),mu=du,fu=xo;Ni("all",lo),Ni("any",co),Ni("radians",ho),Ni("degrees",po),Ni("exp",go),Ni("exp2",mo),Ni("log",fo),Ni("log2",yo),Ni("sqrt",bo),Ni("inverseSqrt",xo),Ni("floor",To),Ni("ceil",_o),Ni("normalize",vo),Ni("fract",No),Ni("sin",So),Ni("cos",Ro),Ni("tan",Ao),Ni("asin",Eo),Ni("acos",wo),Ni("atan",Co),Ni("abs",Mo),Ni("sign",Bo),Ni("length",Lo),Ni("lengthSq",iu),Ni("negate",Fo),Ni("oneMinus",Po),Ni("dFdx",Do),Ni("dFdy",Uo),Ni("round",Io),Ni("reciprocal",Oo),Ni("trunc",Vo),Ni("fwidth",ko),Ni("min",Wo),Ni("max",Ho),Ni("step",gu),Ni("reflect",jo),Ni("distance",Xo),Ni("dot",Yo),Ni("cross",Qo),Ni("pow",Zo),Ni("pow2",Jo),Ni("pow3",eu),Ni("pow4",tu),Ni("transformDirection",ru),Ni("mix",hu),Ni("clamp",au),Ni("refract",uu),Ni("smoothstep",pu),Ni("faceForward",du),Ni("difference",Ko),Ni("saturate",ou),Ni("cbrt",su),Ni("transpose",Go),Ni("determinant",zo),Ni("inverse",$o),Ni("rand",cu);class yu extends ui{static get type(){return"ConditionalNode"}constructor(e,t,r=null){super(),this.condNode=e,this.ifNode=t,this.elseNode=r}getNodeType(e){const{ifNode:t,elseNode:r}=e.getNodeProperties(this);if(void 0===t)return e.flowBuildStage(this,"setup"),this.getNodeType(e);const s=t.getNodeType(e);if(null!==r){const t=r.getNodeType(e);if(e.getTypeLength(t)>e.getTypeLength(s))return t}return s}setup(e){const t=this.condNode,r=this.ifNode.isolate(),s=this.elseNode?this.elseNode.isolate():null,i=e.context.nodeBlock;e.getDataFromNode(r).parentNodeBlock=i,null!==s&&(e.getDataFromNode(s).parentNodeBlock=i);const n=e.context.uniformFlow,a=e.getNodeProperties(this);a.condNode=t,a.ifNode=n?r:r.context({nodeBlock:r}),a.elseNode=s?n?s:s.context({nodeBlock:s}):null}generate(e,t){const r=this.getNodeType(e),s=e.getDataFromNode(this);if(void 0!==s.nodeProperty)return s.nodeProperty;const{condNode:i,ifNode:n,elseNode:a}=e.getNodeProperties(this),o=e.currentFunctionNode,u="void"!==t,l=u?Un(r).build(e):"";s.nodeProperty=l;const c=i.build(e,"bool");if(e.context.uniformFlow&&null!==a){const s=n.build(e,r),i=a.build(e,r),o=e.getTernary(c,s,i);return e.format(o,r,t)}e.addFlowCode(`\n${e.tab}if ( ${c} ) {\n\n`).addFlowTab();let h=n.build(e,r);if(h&&(u?h=l+" = "+h+";":(h="return "+h+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),h="// "+h))),e.removeFlowTab().addFlowCode(e.tab+"\t"+h+"\n\n"+e.tab+"}"),null!==a){e.addFlowCode(" else {\n\n").addFlowTab();let t=a.build(e,r);t&&(u?t=l+" = "+t+";":(t="return "+t+";",null===o&&(d("TSL: Return statement used in an inline 'Fn()'. Define a layout struct to allow return values."),t="// "+t))),e.removeFlowTab().addFlowCode(e.tab+"\t"+t+"\n\n"+e.tab+"}\n\n")}else e.addFlowCode("\n\n");return e.format(l,r,t)}}const bu=rn(yu).setParameterLength(2,3);Ni("select",bu);class xu extends ui{static get type(){return"ContextNode"}constructor(e=null,t={}){super(),this.isContextNode=!0,this.node=e,this.value=t}getScope(){return this.node.getScope()}getNodeType(e){return this.node.getNodeType(e)}getFlowContextData(){const e=[];return this.traverse(t=>{!0===t.isContextNode&&e.push(t.value)}),Object.assign({},...e)}getMemberType(e,t){return this.node.getMemberType(e,t)}analyze(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}setup(e){const t=e.addContext(this.value);this.node.build(e),e.setContext(t)}generate(e,t){const r=e.addContext(this.value),s=this.node.build(e,t);return e.setContext(r),s}}const Tu=(e=null,t={})=>{let r=e;return null!==r&&!0===r.isNode||(t=r||t,r=null),new xu(r,t)},_u=e=>Tu(e,{uniformFlow:!0}),vu=(e,t)=>Tu(e,{nodeName:t});function Nu(e,t,r=null){return Tu(r,{getShadow:({light:r,shadowColorNode:s})=>t===r?s.mul(e):s})}function Su(e,t=null){return Tu(t,{getAO:(t,{material:r})=>!0===r.transparent?t:null!==t?t.mul(e):e})}function Ru(e,t){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),vu(e,t)}Ni("context",Tu),Ni("label",Ru),Ni("uniformFlow",_u),Ni("setName",vu),Ni("builtinShadowContext",(e,t,r)=>Nu(t,r,e)),Ni("builtinAOContext",(e,t)=>Su(t,e));class Au extends ui{static get type(){return"VarNode"}constructor(e,t=null,r=!1){super(),this.node=e,this.name=t,this.global=!0,this.isVarNode=!0,this.readOnly=r,this.parents=!0,this.intent=!1}setIntent(e){return this.intent=e,this}isIntent(e){return!0!==e.getDataFromNode(this).forceDeclaration&&this.intent}getIntent(){return this.intent}getMemberType(e,t){return this.node.getMemberType(e,t)}getElementType(e){return this.node.getElementType(e)}getNodeType(e){return this.node.getNodeType(e)}getArrayCount(e){return this.node.getArrayCount(e)}isAssign(e){return e.getDataFromNode(this).assign}build(...e){const t=e[0];if(!1===this._hasStack(t)&&"setup"===t.buildStage&&(t.context.nodeLoop||t.context.nodeBlock)){let e=!1;if(this.node.isShaderCallNodeInternal&&null===this.node.shaderNode.getLayout()&&t.fnCall&&t.fnCall.shaderNode){if(t.getDataFromNode(this.node.shaderNode).hasLoop){t.getDataFromNode(this).forceDeclaration=!0,e=!0}}const r=t.getBaseStack();e?r.addToStackBefore(this):r.addToStack(this)}return this.isIntent(t)&&!0!==this.isAssign(t)?this.node.build(...e):super.build(...e)}generate(e){const{node:t,name:r,readOnly:s}=this,{renderer:i}=e,n=!0===i.backend.isWebGPUBackend;let a=!1,u=!1;s&&(a=e.isDeterministic(t),u=n?s:a);const l=this.getNodeType(e);if("void"==l){!0!==this.isIntent(e)&&o('TSL: ".toVar()" can not be used with void type.');return t.build(e)}const d=e.getVectorType(l),c=t.build(e,d),h=e.getVarFromNode(this,r,d,void 0,u),p=e.getPropertyName(h);let g=p;if(u)if(n)g=a?`const ${p}`:`let ${p}`;else{const r=t.getArrayCount(e);g=`const ${e.getVar(h.type,p,r)}`}return e.addLineFlowCode(`${g} = ${c}`,this),p}_hasStack(e){return void 0!==e.getDataFromNode(this).stack}}const Eu=rn(Au),wu=(e,t=null)=>Eu(e,t).toStack(),Cu=(e,t=null)=>Eu(e,t,!0).toStack(),Mu=e=>Eu(e).setIntent(!0).toStack();Ni("toVar",wu),Ni("toConst",Cu),Ni("toVarIntent",Mu);class Bu extends ui{static get type(){return"SubBuild"}constructor(e,t,r=null){super(r),this.node=e,this.name=t,this.isSubBuildNode=!0}getNodeType(e){if(null!==this.nodeType)return this.nodeType;e.addSubBuild(this.name);const t=this.node.getNodeType(e);return e.removeSubBuild(),t}build(e,...t){e.addSubBuild(this.name);const r=this.node.build(e,...t);return e.removeSubBuild(),r}}const Lu=(e,t,r=null)=>Zi(new Bu(Zi(e),t,r));class Fu extends ui{static get type(){return"VaryingNode"}constructor(e,t=null){super(),this.node=Lu(e,"VERTEX"),this.name=t,this.isVaryingNode=!0,this.interpolationType=null,this.interpolationSampling=null,this.global=!0}setInterpolation(e,t=null){return this.interpolationType=e,this.interpolationSampling=t,this}getHash(e){return this.name||super.getHash(e)}getNodeType(e){return this.node.getNodeType(e)}setupVarying(e){const t=e.getNodeProperties(this);let r=t.varying;if(void 0===r){const s=this.name,i=this.getNodeType(e),n=this.interpolationType,a=this.interpolationSampling;t.varying=r=e.getVaryingFromNode(this,s,i,n,a),t.node=Lu(this.node,"VERTEX")}return r.needsInterpolation||(r.needsInterpolation="fragment"===e.shaderStage),r}setup(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}analyze(e){this.setupVarying(e),e.flowNodeFromShaderStage(Zs.VERTEX,this.node)}generate(e){const t=e.getSubBuildProperty("property",e.currentStack),r=e.getNodeProperties(this),s=this.setupVarying(e);if(void 0===r[t]){const i=this.getNodeType(e),n=e.getPropertyName(s,Zs.VERTEX);e.flowNodeFromShaderStage(Zs.VERTEX,r.node,i,n),r[t]=n}return e.getPropertyName(s)}}const Pu=rn(Fu).setParameterLength(1,2),Du=e=>Pu(e);Ni("toVarying",Pu),Ni("toVertexStage",Du);const Uu=un(([e])=>{const t=e.mul(.9478672986).add(.0521327014).pow(2.4),r=e.mul(.0773993808),s=e.lessThanEqual(.04045);return nu(t,r,s)}).setLayout({name:"sRGBTransferEOTF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Iu=un(([e])=>{const t=e.pow(.41666).mul(1.055).sub(.055),r=e.mul(12.92),s=e.lessThanEqual(.0031308);return nu(t,r,s)}).setLayout({name:"sRGBTransferOETF",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),Ou="WorkingColorSpace";class Vu extends ci{static get type(){return"ColorSpaceNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this.source=t,this.target=r}resolveColorSpace(e,t){return t===Ou?p.workingColorSpace:"OutputColorSpace"===t?e.context.outputColorSpace||e.renderer.outputColorSpace:t}setup(e){const{colorNode:t}=this,r=this.resolveColorSpace(e,this.source),s=this.resolveColorSpace(e,this.target);let i=t;return!1!==p.enabled&&r!==s&&r&&s?(p.getTransfer(r)===g&&(i=An(Uu(i.rgb),i.a)),p.getPrimaries(r)!==p.getPrimaries(s)&&(i=An(Bn(p._getMatrix(new n,r,s)).mul(i.rgb),i.a)),p.getTransfer(s)===g&&(i=An(Iu(i.rgb),i.a)),i):i}}const ku=(e,t)=>Zi(new Vu(Zi(e),Ou,t)),Gu=(e,t)=>Zi(new Vu(Zi(e),t,Ou));Ni("workingToColorSpace",ku),Ni("colorSpaceToWorking",Gu);let zu=class extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}};class $u extends ui{static get type(){return"ReferenceBaseNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.updateType=Js.OBJECT}setGroup(e){return this.group=e,this}element(e){return new zu(this,Zi(e))}setNodeType(e){const t=_a(null,e);null!==this.group&&t.setGroup(this.group),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew Wu(e,t,r);class qu extends ci{static get type(){return"ToneMappingNode"}constructor(e,t=Xu,r=null){super("vec3"),this._toneMapping=e,this.exposureNode=t,this.colorNode=r}customCacheKey(){return Os(this._toneMapping)}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup(e){const t=this.colorNode||e.context.color,r=this._toneMapping;if(r===m)return t;let s=null;const i=e.renderer.library.getToneMappingFunction(r);return null!==i?s=An(i(t.rgb,this.exposureNode),t.a):(o("ToneMappingNode: Unsupported Tone Mapping configuration.",r),s=t),s}}const ju=(e,t,r)=>Zi(new qu(e,Zi(t),Zi(r))),Xu=Hu("toneMappingExposure","float");Ni("toneMapping",(e,t,r)=>ju(t,r,e));const Ku=new WeakMap;function Yu(e,t){let r=Ku.get(e);return void 0===r&&(r=new b(e,t),Ku.set(e,r)),r}class Qu extends yi{static get type(){return"BufferAttributeNode"}constructor(e,t=null,r=0,s=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferStride=r,this.bufferOffset=s,this.usage=f,this.instanced=!1,this.attribute=null,this.global=!0,e&&!0===e.isBufferAttribute&&e.itemSize<=4&&(this.attribute=e,this.usage=e.usage,this.instanced=e.isInstancedBufferAttribute)}getHash(e){if(0===this.bufferStride&&0===this.bufferOffset){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getNodeType(e){return null===this.bufferType&&(this.bufferType=e.getTypeFromAttribute(this.attribute)),this.bufferType}setup(e){if(null!==this.attribute)return;const t=this.getNodeType(e),r=e.getTypeLength(t),s=this.value,i=this.bufferStride||r,n=this.bufferOffset;let a;a=!0===s.isInterleavedBuffer?s:!0===s.isBufferAttribute?Yu(s.array,i):Yu(s,i);const o=new y(a,r,n);a.setUsage(this.usage),this.attribute=o,this.attribute.isInstancedBufferAttribute=this.instanced}generate(e){const t=this.getNodeType(e),r=e.getBufferAttributeFromNode(this,t),s=e.getPropertyName(r);let i=null;if("vertex"===e.shaderStage||"compute"===e.shaderStage)this.name=s,i=s;else{i=Pu(this).build(e,t)}return i}getInputType(){return"bufferAttribute"}setUsage(e){return this.usage=e,this.attribute&&!0===this.attribute.isBufferAttribute&&(this.attribute.usage=e),this}setInstanced(e){return this.instanced=e,this}}function Zu(e,t=null,r=0,s=0,i=f,n=!1){return"mat3"===t||null===t&&9===e.itemSize?Bn(new Qu(e,"vec3",9,0).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,3).setUsage(i).setInstanced(n),new Qu(e,"vec3",9,6).setUsage(i).setInstanced(n)):"mat4"===t||null===t&&16===e.itemSize?Ln(new Qu(e,"vec4",16,0).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,4).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,8).setUsage(i).setInstanced(n),new Qu(e,"vec4",16,12).setUsage(i).setInstanced(n)):new Qu(e,t,r,s).setUsage(i)}const Ju=(e,t=null,r=0,s=0)=>Zu(e,t,r,s),el=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,f,!0),tl=(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x,!0);Ni("toAttribute",e=>Ju(e.value));class rl extends ui{static get type(){return"ComputeNode"}constructor(e,t){super("void"),this.isComputeNode=!0,this.computeNode=e,this.workgroupSize=t,this.count=null,this.version=1,this.name="",this.updateBeforeType=Js.OBJECT,this.onInitFunction=null}setCount(e){return this.count=e,this}getCount(){return this.count}dispose(){this.dispatchEvent({type:"dispose"})}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}onInit(e){return this.onInitFunction=e,this}updateBefore({renderer:e}){e.compute(this)}setup(e){const t=this.computeNode.build(e);if(t){e.getNodeProperties(this).outputComputeNode=t.outputNode,t.outputNode=null}return t}generate(e,t){const{shaderStage:r}=e;if("compute"===r){const t=this.computeNode.build(e,"void");""!==t&&e.addLineFlowCode(t,this)}else{const r=e.getNodeProperties(this).outputComputeNode;if(r)return r.build(e,t)}}}const sl=(e,t=[64])=>{(0===t.length||t.length>3)&&o("TSL: compute() workgroupSize must have 1, 2, or 3 elements");for(let e=0;esl(e,r).setCount(t);Ni("compute",il),Ni("computeKernel",sl);class nl extends ui{static get type(){return"IsolateNode"}constructor(e,t=!0){super(),this.node=e,this.parent=t,this.isIsolateNode=!0}getNodeType(e){const t=e.getCache(),r=e.getCacheFromNode(this,this.parent);e.setCache(r);const s=this.node.getNodeType(e);return e.setCache(t),s}build(e,...t){const r=e.getCache(),s=e.getCacheFromNode(this,this.parent);e.setCache(s);const i=this.node.build(e,...t);return e.setCache(r),i}setParent(e){return this.parent=e,this}getParent(){return this.parent}}const al=e=>new nl(Zi(e));function ol(e,t=!0){return d('TSL: "cache()" has been deprecated. Use "isolate()" instead.'),al(e).setParent(t)}Ni("cache",ol),Ni("isolate",al);class ul extends ui{static get type(){return"BypassNode"}constructor(e,t){super(),this.isBypassNode=!0,this.outputNode=e,this.callNode=t}getNodeType(e){return this.outputNode.getNodeType(e)}generate(e){const t=this.callNode.build(e,"void");return""!==t&&e.addLineFlowCode(t,this),this.outputNode.build(e)}}const ll=rn(ul).setParameterLength(2);Ni("bypass",ll);class dl extends ui{static get type(){return"RemapNode"}constructor(e,t,r,s=gn(0),i=gn(1)){super(),this.node=e,this.inLowNode=t,this.inHighNode=r,this.outLowNode=s,this.outHighNode=i,this.doClamp=!0}setup(){const{node:e,inLowNode:t,inHighNode:r,outLowNode:s,outHighNode:i,doClamp:n}=this;let a=e.sub(t).div(r.sub(t));return!0===n&&(a=a.clamp()),a.mul(i.sub(s)).add(s)}}const cl=rn(dl,null,null,{doClamp:!1}).setParameterLength(3,5),hl=rn(dl).setParameterLength(3,5);Ni("remap",cl),Ni("remapClamp",hl);class pl extends ui{static get type(){return"ExpressionNode"}constructor(e="",t="void"){super(t),this.snippet=e}generate(e,t){const r=this.getNodeType(e),s=this.snippet;if("void"!==r)return e.format(s,r,t);e.addLineFlowCode(s,this)}}const gl=rn(pl).setParameterLength(1,2),ml=e=>(e?bu(e,gl("discard")):gl("discard")).toStack();Ni("discard",ml);class fl extends ci{static get type(){return"RenderOutputNode"}constructor(e,t,r){super("vec4"),this.colorNode=e,this._toneMapping=t,this.outputColorSpace=r,this.isRenderOutputNode=!0}setToneMapping(e){return this._toneMapping=e,this}getToneMapping(){return this._toneMapping}setup({context:e}){let t=this.colorNode||e.color;const r=(null!==this._toneMapping?this._toneMapping:e.toneMapping)||m,s=(null!==this.outputColorSpace?this.outputColorSpace:e.outputColorSpace)||T;return r!==m&&(t=t.toneMapping(r)),s!==T&&s!==p.workingColorSpace&&(t=t.workingToColorSpace(s)),t}}const yl=(e,t=null,r=null)=>Zi(new fl(Zi(e),t,r));Ni("renderOutput",yl);class bl extends ci{static get type(){return"DebugNode"}constructor(e,t=null){super(),this.node=e,this.callback=t}getNodeType(e){return this.node.getNodeType(e)}setup(e){return this.node.build(e)}analyze(e){return this.node.build(e)}generate(e){const t=this.callback,r=this.node.build(e);if(null!==t)t(e,r);else{const t="--- TSL debug - "+e.shaderStage+" shader ---",s="-".repeat(t.length);let i="";i+="// #"+t+"#\n",i+=e.flow.code.replace(/^\t/gm,"")+"\n",i+="/* ... */ "+r+" /* ... */\n",i+="// #"+s+"#\n",_(i)}return r}}const xl=(e,t=null)=>Zi(new bl(Zi(e),t)).toStack();Ni("debug",xl);class Tl{constructor(){this._renderer=null,this.currentFrame=null}get nodeFrame(){return this._renderer._nodes.nodeFrame}setRenderer(e){return this._renderer=e,this}getRenderer(){return this._renderer}init(){}begin(){}finish(){}inspect(){}computeAsync(){}beginCompute(){}finishCompute(){}beginRender(){}finishRender(){}copyTextureToTexture(){}copyFramebufferToTexture(){}}class _l extends ui{static get type(){return"InspectorNode"}constructor(e,t="",r=null){super(),this.node=e,this.name=t,this.callback=r,this.updateType=Js.FRAME,this.isInspectorNode=!0}getName(){return this.name||this.node.name}update(e){e.renderer.inspector.inspect(this)}getNodeType(e){return this.node.getNodeType(e)}setup(e){let t=this.node;return!0===e.context.inspector&&null!==this.callback&&(t=this.callback(t)),!0!==e.renderer.backend.isWebGPUBackend&&e.renderer.inspector.constructor!==Tl&&v('TSL: ".toInspector()" is only available with WebGPU.'),t}}function vl(e,t="",r=null){return(e=Zi(e)).before(new _l(e,t,r))}Ni("toInspector",vl);class Nl extends ui{static get type(){return"AttributeNode"}constructor(e,t=null){super(t),this.global=!0,this._attributeName=e}getHash(e){return this.getAttributeName(e)}getNodeType(e){let t=this.nodeType;if(null===t){const r=this.getAttributeName(e);if(e.hasGeometryAttribute(r)){const s=e.geometry.getAttribute(r);t=e.getTypeFromAttribute(s)}else t="float"}return t}setAttributeName(e){return this._attributeName=e,this}getAttributeName(){return this._attributeName}generate(e){const t=this.getAttributeName(e),r=this.getNodeType(e);if(!0===e.hasGeometryAttribute(t)){const s=e.geometry.getAttribute(t),i=e.getTypeFromAttribute(s),n=e.getAttribute(t,i);if("vertex"===e.shaderStage)return e.format(n.name,i,r);return Pu(this).build(e,r)}return d(`AttributeNode: Vertex attribute "${t}" not found on geometry.`),e.generateConst(r)}serialize(e){super.serialize(e),e.global=this.global,e._attributeName=this._attributeName}deserialize(e){super.deserialize(e),this.global=e.global,this._attributeName=e._attributeName}}const Sl=(e,t=null)=>new Nl(e,t),Rl=(e=0)=>Sl("uv"+(e>0?e:""),"vec2");class Al extends ui{static get type(){return"TextureSizeNode"}constructor(e,t=null){super("uvec2"),this.isTextureSizeNode=!0,this.textureNode=e,this.levelNode=t}generate(e,t){const r=this.textureNode.build(e,"property"),s=null===this.levelNode?"0":this.levelNode.build(e,"int");return e.format(`${e.getMethod("textureDimensions")}( ${r}, ${s} )`,this.getNodeType(e),t)}}const El=rn(Al).setParameterLength(1,2);class wl extends Ta{static get type(){return"MaxMipLevelNode"}constructor(e){super(0),this._textureNode=e,this.updateType=Js.FRAME}get textureNode(){return this._textureNode}get texture(){return this._textureNode.value}update(){const e=this.texture,t=e.images,r=t&&t.length>0?t[0]&&t[0].image||t[0]:e.image;if(r&&void 0!==r.width){const{width:e,height:t}=r;this.value=Math.log2(Math.max(e,t))}}}const Cl=rn(wl).setParameterLength(1),Ml=new N;class Bl extends Ta{static get type(){return"TextureNode"}constructor(e=Ml,t=null,r=null,s=null){super(e),this.isTextureNode=!0,this.uvNode=t,this.levelNode=r,this.biasNode=s,this.compareNode=null,this.depthNode=null,this.gradNode=null,this.offsetNode=null,this.sampler=!0,this.updateMatrix=!1,this.updateType=Js.NONE,this.referenceNode=null,this._value=e,this._matrixUniform=null,this._flipYUniform=null,this.setUpdateMatrix(null===t)}set value(e){this.referenceNode?this.referenceNode.value=e:this._value=e}get value(){return this.referenceNode?this.referenceNode.value:this._value}getUniformHash(){return this.value.uuid}getNodeType(){return!0===this.value.isDepthTexture?"float":this.value.type===S?"uvec4":this.value.type===R?"ivec4":"vec4"}getInputType(){return"texture"}getDefaultUV(){return Rl(this.value.channel)}updateReference(){return this.value}getTransformedUV(e){return null===this._matrixUniform&&(this._matrixUniform=_a(this.value.matrix)),this._matrixUniform.mul(vn(e,1)).xy}setUpdateMatrix(e){return this.updateMatrix=e,this}setupUV(e,t){return e.isFlipY()&&(null===this._flipYUniform&&(this._flipYUniform=_a(!1)),t=t.toVar(),t=this.sampler?this._flipYUniform.select(t.flipY(),t):this._flipYUniform.select(t.setY(mn(El(this,this.levelNode).y).sub(t.y).sub(1)),t)),t}setup(e){const t=e.getNodeProperties(this);t.referenceNode=this.referenceNode;const r=this.value;if(!r||!0!==r.isTexture)throw new Error("THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().");const s=un(()=>{let t=this.uvNode;return null!==t&&!0!==e.context.forceUVContext||!e.context.getUV||(t=e.context.getUV(this,e)),t||(t=this.getDefaultUV()),!0===this.updateMatrix&&(t=this.getTransformedUV(t)),t=this.setupUV(e,t),this.updateType=null!==this._matrixUniform||null!==this._flipYUniform?Js.OBJECT:Js.NONE,t})();let i=this.levelNode;null===i&&e.context.getTextureLevel&&(i=e.context.getTextureLevel(this));let n=null,a=null;null!==this.compareNode&&(e.renderer.hasCompatibility(A.TEXTURE_COMPARE)?n=this.compareNode:(null!==this.value.compareFunction&&this.value.compareFunction!==E&&v('TSL: Only "LessCompare" is supported for depth texture comparison fallback.'),a=this.compareNode)),t.uvNode=s,t.levelNode=i,t.biasNode=this.biasNode,t.compareNode=n,t.compareStepNode=a,t.gradNode=this.gradNode,t.depthNode=this.depthNode,t.offsetNode=this.offsetNode}generateUV(e,t){return t.build(e,!0===this.sampler?"vec2":"ivec2")}generateOffset(e,t){return t.build(e,"ivec2")}generateSnippet(e,t,r,s,i,n,a,o,u){const l=this.value;let d;return d=i?e.generateTextureBias(l,t,r,i,n,u):o?e.generateTextureGrad(l,t,r,o,n,u):a?e.generateTextureCompare(l,t,r,a,n,u):!1===this.sampler?e.generateTextureLoad(l,t,r,s,n,u):s?e.generateTextureLevel(l,t,r,s,n,u):e.generateTexture(l,t,r,n,u),d}generate(e,t){const r=this.value,s=e.getNodeProperties(this),i=super.generate(e,"property");if(/^sampler/.test(t))return i+"_sampler";if(e.isReference(t))return i;{const n=e.getDataFromNode(this),a=this.getNodeType(e);let o=n.propertyName;if(void 0===o){const{uvNode:t,levelNode:r,biasNode:u,compareNode:l,compareStepNode:d,depthNode:c,gradNode:h,offsetNode:p}=s,g=this.generateUV(e,t),m=r?r.build(e,"float"):null,f=u?u.build(e,"float"):null,y=c?c.build(e,"int"):null,b=l?l.build(e,"float"):null,x=d?d.build(e,"float"):null,T=h?[h[0].build(e,"vec2"),h[1].build(e,"vec2")]:null,_=p?this.generateOffset(e,p):null,v=e.getVarFromNode(this);o=e.getPropertyName(v);let N=this.generateSnippet(e,i,g,m,f,y,b,T,_);null!==x&&(N=qo(gl(x,"float"),gl(N,a)).build(e,a)),e.addLineFlowCode(`${o} = ${N}`,this),n.snippet=N,n.propertyName=o}let u=o;return e.needsToWorkingColorSpace(r)&&(u=Gu(gl(u,a),r.colorSpace).setup(e).build(e,a)),e.format(u,a,t)}}setSampler(e){return this.sampler=e,this}getSampler(){return this.sampler}sample(e){const t=this.clone();return t.uvNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}load(e){return this.sample(e).setSampler(!1)}blur(e){const t=this.clone();t.biasNode=Zi(e).mul(Cl(t)),t.referenceNode=this.getBase();const r=t.value;return!1===t.generateMipmaps&&(r&&!1===r.generateMipmaps||r.minFilter===w||r.magFilter===w)&&(d("TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture."),t.biasNode=null),Zi(t)}level(e){const t=this.clone();return t.levelNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}size(e){return El(this,e)}bias(e){const t=this.clone();return t.biasNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}getBase(){return this.referenceNode?this.referenceNode.getBase():this}compare(e){const t=this.clone();return t.compareNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}grad(e,t){const r=this.clone();return r.gradNode=[Zi(e),Zi(t)],r.referenceNode=this.getBase(),Zi(r)}depth(e){const t=this.clone();return t.depthNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}offset(e){const t=this.clone();return t.offsetNode=Zi(e),t.referenceNode=this.getBase(),Zi(t)}serialize(e){super.serialize(e),e.value=this.value.toJSON(e.meta).uuid,e.sampler=this.sampler,e.updateMatrix=this.updateMatrix,e.updateType=this.updateType}deserialize(e){super.deserialize(e),this.value=e.meta.textures[e.value],this.sampler=e.sampler,this.updateMatrix=e.updateMatrix,this.updateType=e.updateType}update(){const e=this.value,t=this._matrixUniform;null!==t&&(t.value=e.matrix),!0===e.matrixAutoUpdate&&e.updateMatrix();const r=this._flipYUniform;null!==r&&(r.value=e.image instanceof ImageBitmap&&!0===e.flipY||!0===e.isRenderTargetTexture||!0===e.isFramebufferTexture||!0===e.isDepthTexture)}clone(){const e=new this.constructor(this.value,this.uvNode,this.levelNode,this.biasNode);return e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}const Ll=rn(Bl).setParameterLength(1,4).setName("texture"),Fl=(e=Ml,t=null,r=null,s=null)=>{let i;return e&&!0===e.isTextureNode?(i=Zi(e.clone()),i.referenceNode=e.getBase(),null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=Ll(e,t,r,s),i},Pl=(...e)=>Fl(...e).setSampler(!1);class Dl extends Ta{static get type(){return"BufferNode"}constructor(e,t,r=0){super(e,t),this.isBufferNode=!0,this.bufferType=t,this.bufferCount=r,this.updateRanges=[]}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}getElementType(e){return this.getNodeType(e)}getInputType(){return"buffer"}}const Ul=(e,t,r)=>new Dl(e,t,r);class Il extends li{static get type(){return"UniformArrayElementNode"}constructor(e,t){super(e,t),this.isArrayBufferElementNode=!0}generate(e){const t=super.generate(e),r=this.getNodeType(),s=this.node.getPaddedType();return e.format(t,s,r)}}class Ol extends Dl{static get type(){return"UniformArrayNode"}constructor(e,t=null){super(null),this.array=e,this.elementType=null===t?qs(e[0]):t,this.paddedType=this.getPaddedType(),this.updateType=Js.RENDER,this.isArrayBufferNode=!0}getNodeType(){return this.paddedType}getElementType(){return this.elementType}getPaddedType(){const e=this.elementType;let t="vec4";return"mat2"===e?t="mat2":!0===/mat/.test(e)?t="mat4":"i"===e.charAt(0)?t="ivec4":"u"===e.charAt(0)&&(t="uvec4"),t}update(){const{array:e,value:t}=this,r=this.elementType;if("float"===r||"int"===r||"uint"===r)for(let r=0;rnew Ol(e,t);const kl=rn(class extends ui{constructor(e){super("float"),this.name=e,this.isBuiltinNode=!0}generate(){return this.name}}).setParameterLength(1);let Gl,zl;class $l extends ui{static get type(){return"ScreenNode"}constructor(e){super(),this.scope=e,this._output=null,this.isViewportNode=!0}getNodeType(){return this.scope===$l.DPR?"float":this.scope===$l.VIEWPORT?"vec4":"vec2"}getUpdateType(){let e=Js.NONE;return this.scope!==$l.SIZE&&this.scope!==$l.VIEWPORT&&this.scope!==$l.DPR||(e=Js.RENDER),this.updateType=e,e}update({renderer:e}){const t=e.getRenderTarget();this.scope===$l.VIEWPORT?null!==t?zl.copy(t.viewport):(e.getViewport(zl),zl.multiplyScalar(e.getPixelRatio())):this.scope===$l.DPR?this._output.value=e.getPixelRatio():null!==t?(Gl.width=t.width,Gl.height=t.height):e.getDrawingBufferSize(Gl)}setup(){const e=this.scope;let r=null;return r=e===$l.SIZE?_a(Gl||(Gl=new t)):e===$l.VIEWPORT?_a(zl||(zl=new s)):e===$l.DPR?_a(1):bn(jl.div(ql)),this._output=r,r}generate(e){if(this.scope===$l.COORDINATE){let t=e.getFragCoord();if(e.isFlipY()){const r=e.getNodeProperties(ql).outputNode.build(e);t=`${e.getType("vec2")}( ${t}.x, ${r}.y - ${t}.y )`}return t}return super.generate(e)}}$l.COORDINATE="coordinate",$l.VIEWPORT="viewport",$l.SIZE="size",$l.UV="uv",$l.DPR="dpr";const Wl=sn($l,$l.DPR),Hl=sn($l,$l.UV),ql=sn($l,$l.SIZE),jl=sn($l,$l.COORDINATE),Xl=sn($l,$l.VIEWPORT),Kl=Xl.zw,Yl=jl.sub(Xl.xy),Ql=Yl.div(Kl),Zl=un(()=>(d('TSL: "viewportResolution" is deprecated. Use "screenSize" instead.'),ql),"vec2").once()(),Jl=_a(0,"uint").setName("u_cameraIndex").setGroup(fa("cameraIndex")).toVarying("v_cameraIndex"),ed=_a("float").setName("cameraNear").setGroup(ba).onRenderUpdate(({camera:e})=>e.near),td=_a("float").setName("cameraFar").setGroup(ba).onRenderUpdate(({camera:e})=>e.far),rd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrix);t=Vl(r).setGroup(ba).setName("cameraProjectionMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrix")}else t=_a("mat4").setName("cameraProjectionMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrix);return t}).once()(),sd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.projectionMatrixInverse);t=Vl(r).setGroup(ba).setName("cameraProjectionMatricesInverse").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraProjectionMatrixInverse")}else t=_a("mat4").setName("cameraProjectionMatrixInverse").setGroup(ba).onRenderUpdate(({camera:e})=>e.projectionMatrixInverse);return t}).once()(),id=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorldInverse);t=Vl(r).setGroup(ba).setName("cameraViewMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraViewMatrix")}else t=_a("mat4").setName("cameraViewMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorldInverse);return t}).once()(),nd=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.matrixWorld);t=Vl(r).setGroup(ba).setName("cameraWorldMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraWorldMatrix")}else t=_a("mat4").setName("cameraWorldMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.matrixWorld);return t}).once()(),ad=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.normalMatrix);t=Vl(r).setGroup(ba).setName("cameraNormalMatrices").element(e.isMultiViewCamera?kl("gl_ViewID_OVR"):Jl).toConst("cameraNormalMatrix")}else t=_a("mat3").setName("cameraNormalMatrix").setGroup(ba).onRenderUpdate(({camera:e})=>e.normalMatrix);return t}).once()(),od=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const s=[];for(let t=0,i=e.cameras.length;t{const r=e.cameras,s=t.array;for(let e=0,t=r.length;et.value.setFromMatrixPosition(e.matrixWorld));return t}).once()(),ud=un(({camera:e})=>{let t;if(e.isArrayCamera&&e.cameras.length>0){const r=[];for(const t of e.cameras)r.push(t.viewport);t=Vl(r,"vec4").setGroup(ba).setName("cameraViewports").element(Jl).toConst("cameraViewport")}else t=An(0,0,ql.x,ql.y).toConst("cameraViewport");return t}).once()(),ld=new C;class dd extends ui{static get type(){return"Object3DNode"}constructor(e,t=null){super(),this.scope=e,this.object3d=t,this.updateType=Js.OBJECT,this.uniformNode=new Ta(null)}getNodeType(){const e=this.scope;return e===dd.WORLD_MATRIX?"mat4":e===dd.POSITION||e===dd.VIEW_POSITION||e===dd.DIRECTION||e===dd.SCALE?"vec3":e===dd.RADIUS?"float":void 0}update(e){const t=this.object3d,s=this.uniformNode,i=this.scope;if(i===dd.WORLD_MATRIX)s.value=t.matrixWorld;else if(i===dd.POSITION)s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld);else if(i===dd.SCALE)s.value=s.value||new r,s.value.setFromMatrixScale(t.matrixWorld);else if(i===dd.DIRECTION)s.value=s.value||new r,t.getWorldDirection(s.value);else if(i===dd.VIEW_POSITION){const i=e.camera;s.value=s.value||new r,s.value.setFromMatrixPosition(t.matrixWorld),s.value.applyMatrix4(i.matrixWorldInverse)}else if(i===dd.RADIUS){const r=e.object.geometry;null===r.boundingSphere&&r.computeBoundingSphere(),ld.copy(r.boundingSphere).applyMatrix4(t.matrixWorld),s.value=ld.radius}}generate(e){const t=this.scope;return t===dd.WORLD_MATRIX?this.uniformNode.nodeType="mat4":t===dd.POSITION||t===dd.VIEW_POSITION||t===dd.DIRECTION||t===dd.SCALE?this.uniformNode.nodeType="vec3":t===dd.RADIUS&&(this.uniformNode.nodeType="float"),this.uniformNode.build(e)}serialize(e){super.serialize(e),e.scope=this.scope}deserialize(e){super.deserialize(e),this.scope=e.scope}}dd.WORLD_MATRIX="worldMatrix",dd.POSITION="position",dd.SCALE="scale",dd.VIEW_POSITION="viewPosition",dd.DIRECTION="direction",dd.RADIUS="radius";const cd=rn(dd,dd.DIRECTION).setParameterLength(1),hd=rn(dd,dd.WORLD_MATRIX).setParameterLength(1),pd=rn(dd,dd.POSITION).setParameterLength(1),gd=rn(dd,dd.SCALE).setParameterLength(1),md=rn(dd,dd.VIEW_POSITION).setParameterLength(1),fd=rn(dd,dd.RADIUS).setParameterLength(1);class yd extends dd{static get type(){return"ModelNode"}constructor(e){super(e)}update(e){this.object3d=e.object,super.update(e)}}const bd=sn(yd,yd.DIRECTION),xd=sn(yd,yd.WORLD_MATRIX),Td=sn(yd,yd.POSITION),_d=sn(yd,yd.SCALE),vd=sn(yd,yd.VIEW_POSITION),Nd=sn(yd,yd.RADIUS),Sd=_a(new n).onObjectUpdate(({object:e},t)=>t.value.getNormalMatrix(e.matrixWorld)),Rd=_a(new a).onObjectUpdate(({object:e},t)=>t.value.copy(e.matrixWorld).invert()),Ad=un(e=>e.context.modelViewMatrix||Ed).once()().toVar("modelViewMatrix"),Ed=id.mul(xd),wd=un(e=>(e.context.isHighPrecisionModelViewMatrix=!0,_a("mat4").onObjectUpdate(({object:e,camera:t})=>e.modelViewMatrix.multiplyMatrices(t.matrixWorldInverse,e.matrixWorld)))).once()().toVar("highpModelViewMatrix"),Cd=un(e=>{const t=e.context.isHighPrecisionModelViewMatrix;return _a("mat3").onObjectUpdate(({object:e,camera:r})=>(!0!==t&&e.modelViewMatrix.multiplyMatrices(r.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix)))}).once()().toVar("highpModelNormalViewMatrix"),Md=un(e=>"fragment"!==e.shaderStage?(v("TSL: `clipSpace` is only available in fragment stage."),An()):e.context.clipSpace.toVarying("v_clipSpace")).once()(),Bd=Sl("position","vec3"),Ld=Bd.toVarying("positionLocal"),Fd=Bd.toVarying("positionPrevious"),Pd=un(e=>xd.mul(Ld).xyz.toVarying(e.getSubBuildProperty("v_positionWorld")),"vec3").once(["POSITION"])(),Dd=un(()=>Ld.transformDirection(xd).toVarying("v_positionWorldDirection").normalize().toVar("positionWorldDirection"),"vec3").once(["POSITION"])(),Ud=un(e=>{if("fragment"===e.shaderStage&&e.material.vertexNode){const e=sd.mul(Md);return e.xyz.div(e.w).toVar("positionView")}return e.context.setupPositionView().toVarying("v_positionView")},"vec3").once(["POSITION","VERTEX"])(),Id=un(e=>{let t;return t=e.camera.isOrthographicCamera?vn(0,0,1):Ud.negate().toVarying("v_positionViewDirection").normalize(),t.toVar("positionViewDirection")},"vec3").once(["POSITION"])();class Od extends ui{static get type(){return"FrontFacingNode"}constructor(){super("bool"),this.isFrontFacingNode=!0}generate(e){if("fragment"!==e.shaderStage)return"true";const{material:t}=e;return t.side===M?"false":e.getFrontFacing()}}const Vd=sn(Od),kd=gn(Vd).mul(2).sub(1),Gd=un(([e],{material:t})=>{const r=t.side;return r===M?e=e.mul(-1):r===B&&(e=e.mul(kd)),e}),zd=Sl("normal","vec3"),$d=un(e=>!1===e.geometry.hasAttribute("normal")?(d('TSL: Vertex attribute "normal" not found on geometry.'),vn(0,1,0)):zd,"vec3").once()().toVar("normalLocal"),Wd=Ud.dFdx().cross(Ud.dFdy()).normalize().toVar("normalFlat"),Hd=un(e=>{let t;return t=!0===e.material.flatShading?Wd:Qd($d).toVarying("v_normalViewGeometry").normalize(),t},"vec3").once()().toVar("normalViewGeometry"),qd=un(e=>{let t=Hd.transformDirection(id);return!0!==e.material.flatShading&&(t=t.toVarying("v_normalWorldGeometry")),t.normalize().toVar("normalWorldGeometry")},"vec3").once()(),jd=un(({subBuildFn:e,material:t,context:r})=>{let s;return"NORMAL"===e||"VERTEX"===e?(s=Hd,!0!==t.flatShading&&(s=Gd(s))):s=r.setupNormal().context({getUV:null}),s},"vec3").once(["NORMAL","VERTEX"])().toVar("normalView"),Xd=jd.transformDirection(id).toVar("normalWorld"),Kd=un(({subBuildFn:e,context:t})=>{let r;return r="NORMAL"===e||"VERTEX"===e?jd:t.setupClearcoatNormal().context({getUV:null}),r},"vec3").once(["NORMAL","VERTEX"])().toVar("clearcoatNormalView"),Yd=un(([e,t=xd])=>{const r=Bn(t),s=e.div(vn(r[0].dot(r[0]),r[1].dot(r[1]),r[2].dot(r[2])));return r.mul(s).xyz}),Qd=un(([e],t)=>{const r=t.context.modelNormalViewMatrix;if(r)return r.transformDirection(e);const s=Sd.mul(e);return id.transformDirection(s)}),Zd=un(()=>(d('TSL: "transformedNormalView" is deprecated. Use "normalView" instead.'),jd)).once(["NORMAL","VERTEX"])(),Jd=un(()=>(d('TSL: "transformedNormalWorld" is deprecated. Use "normalWorld" instead.'),Xd)).once(["NORMAL","VERTEX"])(),ec=un(()=>(d('TSL: "transformedClearcoatNormalView" is deprecated. Use "clearcoatNormalView" instead.'),Kd)).once(["NORMAL","VERTEX"])(),tc=new L,rc=new a,sc=_a(0).onReference(({material:e})=>e).onObjectUpdate(({material:e})=>e.refractionRatio),ic=_a(1).onReference(({material:e})=>e).onObjectUpdate(function({material:e,scene:t}){return e.envMap?e.envMapIntensity:t.environmentIntensity}),nc=_a(new a).onReference(function(e){return e.material}).onObjectUpdate(function({material:e,scene:t}){const r=null!==t.environment&&null===e.envMap?t.environmentRotation:e.envMapRotation;return r?(tc.copy(r),rc.makeRotationFromEuler(tc)):rc.identity(),rc}),ac=Id.negate().reflect(jd),oc=Id.negate().refract(jd,sc),uc=ac.transformDirection(id).toVar("reflectVector"),lc=oc.transformDirection(id).toVar("reflectVector"),dc=new F;class cc extends Bl{static get type(){return"CubeTextureNode"}constructor(e,t=null,r=null,s=null){super(e,t,r,s),this.isCubeTextureNode=!0}getInputType(){return!0===this.value.isDepthTexture?"cubeDepthTexture":"cubeTexture"}getDefaultUV(){const e=this.value;return e.mapping===P?uc:e.mapping===D?lc:(o('CubeTextureNode: Mapping "%s" not supported.',e.mapping),vn(0,0,0))}setUpdateMatrix(){}setupUV(e,t){const r=this.value;return!0===r.isDepthTexture?e.renderer.coordinateSystem===h?vn(t.x,t.y.negate(),t.z):t:(e.renderer.coordinateSystem!==h&&r.isRenderTargetTexture||(t=vn(t.x.negate(),t.yz)),nc.mul(t))}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}}const hc=rn(cc).setParameterLength(1,4).setName("cubeTexture"),pc=(e=dc,t=null,r=null,s=null)=>{let i;return e&&!0===e.isCubeTextureNode?(i=Zi(e.clone()),i.referenceNode=e,null!==t&&(i.uvNode=Zi(t)),null!==r&&(i.levelNode=Zi(r)),null!==s&&(i.biasNode=Zi(s))):i=hc(e,t,r,s),i};class gc extends li{static get type(){return"ReferenceElementNode"}constructor(e,t){super(e,t),this.referenceNode=e,this.isReferenceElementNode=!0}getNodeType(){return this.referenceNode.uniformType}generate(e){const t=super.generate(e),r=this.referenceNode.getNodeType(),s=this.getNodeType();return e.format(t,r,s)}}class mc extends ui{static get type(){return"ReferenceNode"}constructor(e,t,r=null,s=null){super(),this.property=e,this.uniformType=t,this.object=r,this.count=s,this.properties=e.split("."),this.reference=r,this.node=null,this.group=null,this.name=null,this.updateType=Js.OBJECT}element(e){return new gc(this,Zi(e))}setGroup(e){return this.group=e,this}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setNodeType(e){let t=null;t=null!==this.count?Ul(null,e,this.count):Array.isArray(this.getValueFromReference())?Vl(null,e):"texture"===e?Fl(null):"cubeTexture"===e?pc(null):_a(null,e),null!==this.group&&t.setGroup(this.group),null!==this.name&&t.setName(this.name),this.node=t}getNodeType(e){return null===this.node&&(this.updateReference(e),this.updateValue()),this.node.getNodeType(e)}getValueFromReference(e=this.reference){const{properties:t}=this;let r=e[t[0]];for(let e=1;enew mc(e,t,r),yc=(e,t,r,s)=>new mc(e,t,s,r);class bc extends mc{static get type(){return"MaterialReferenceNode"}constructor(e,t,r=null){super(e,t,r),this.material=r,this.isMaterialReferenceNode=!0}updateReference(e){return this.reference=null!==this.material?this.material:e.material,this.reference}}const xc=(e,t,r=null)=>new bc(e,t,r),Tc=Rl(),_c=Ud.dFdx(),vc=Ud.dFdy(),Nc=Tc.dFdx(),Sc=Tc.dFdy(),Rc=jd,Ac=vc.cross(Rc),Ec=Rc.cross(_c),wc=Ac.mul(Nc.x).add(Ec.mul(Sc.x)),Cc=Ac.mul(Nc.y).add(Ec.mul(Sc.y)),Mc=wc.dot(wc).max(Cc.dot(Cc)),Bc=Mc.equal(0).select(0,Mc.inverseSqrt()),Lc=wc.mul(Bc).toVar("tangentViewFrame"),Fc=Cc.mul(Bc).toVar("bitangentViewFrame"),Pc=Sl("tangent","vec4"),Dc=Pc.xyz.toVar("tangentLocal"),Uc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Ad.mul(An(Dc,0)).xyz.toVarying("v_tangentView").normalize():Lc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("tangentView"),Ic=Uc.transformDirection(id).toVarying("v_tangentWorld").normalize().toVar("tangentWorld"),Oc=un(([e,t],{subBuildFn:r,material:s})=>{let i=e.mul(Pc.w).xyz;return"NORMAL"===r&&!0!==s.flatShading&&(i=i.toVarying(t)),i}).once(["NORMAL"]),Vc=Oc(zd.cross(Pc),"v_bitangentGeometry").normalize().toVar("bitangentGeometry"),kc=Oc($d.cross(Dc),"v_bitangentLocal").normalize().toVar("bitangentLocal"),Gc=un(({subBuildFn:e,geometry:t,material:r})=>{let s;return s="VERTEX"===e||t.hasAttribute("tangent")?Oc(jd.cross(Uc),"v_bitangentView").normalize():Fc,!0!==r.flatShading&&(s=Gd(s)),s},"vec3").once(["NORMAL","VERTEX"])().toVar("bitangentView"),zc=Oc(Xd.cross(Ic),"v_bitangentWorld").normalize().toVar("bitangentWorld"),$c=Bn(Uc,Gc,jd).toVar("TBNViewMatrix"),Wc=Id.mul($c),Hc=un(()=>{let e=Jn.cross(Id);return e=e.cross(Jn).normalize(),e=nu(e,jd,Qn.mul(Gn.oneMinus()).oneMinus().pow2().pow2()).normalize(),e}).once()(),qc=e=>Zi(e).mul(.5).add(.5),jc=e=>vn(e,bo(ou(gn(1).sub(Yo(e,e)))));class Xc extends ci{static get type(){return"NormalMapNode"}constructor(e,t=null){super("vec3"),this.node=e,this.scaleNode=t,this.normalMapType=U,this.unpackNormalMode=I}setup({material:e}){const{normalMapType:t,scaleNode:r,unpackNormalMode:s}=this;let i=this.node.mul(2).sub(1);if(t===U?s===O?i=jc(i.xy):s===V?i=jc(i.yw):s!==I&&console.error(`THREE.NodeMaterial: Unexpected unpack normal mode: ${s}`):s!==I&&console.error(`THREE.NodeMaterial: Normal map type '${t}' is not compatible with unpack normal mode '${s}'`),null!==r){let t=r;!0===e.flatShading&&(t=Gd(t)),i=vn(i.xy.mul(t),i.z)}let n=null;return t===k?n=Qd(i):t===U?n=$c.mul(i).normalize():(o(`NodeMaterial: Unsupported normal map type: ${t}`),n=jd),n}}const Kc=rn(Xc).setParameterLength(1,2),Yc=un(({textureNode:e,bumpScale:t})=>{const r=t=>e.isolate().context({getUV:e=>t(e.uvNode||Rl()),forceUVContext:!0}),s=gn(r(e=>e));return bn(gn(r(e=>e.add(e.dFdx()))).sub(s),gn(r(e=>e.add(e.dFdy()))).sub(s)).mul(t)}),Qc=un(e=>{const{surf_pos:t,surf_norm:r,dHdxy:s}=e,i=t.dFdx().normalize(),n=r,a=t.dFdy().normalize().cross(n),o=n.cross(i),u=i.dot(a).mul(kd),l=u.sign().mul(s.x.mul(a).add(s.y.mul(o)));return u.abs().mul(r).sub(l).normalize()});class Zc extends ci{static get type(){return"BumpMapNode"}constructor(e,t=null){super("vec3"),this.textureNode=e,this.scaleNode=t}setup(){const e=null!==this.scaleNode?this.scaleNode:1,t=Yc({textureNode:this.textureNode,bumpScale:e});return Qc({surf_pos:Ud,surf_norm:jd,dHdxy:t})}}const Jc=rn(Zc).setParameterLength(1,2),eh=new Map;class th extends ui{static get type(){return"MaterialNode"}constructor(e){super(),this.scope=e}getCache(e,t){let r=eh.get(e);return void 0===r&&(r=xc(e,t),eh.set(e,r)),r}getFloat(e){return this.getCache(e,"float")}getColor(e){return this.getCache(e,"color")}getTexture(e){return this.getCache("map"===e?"map":e+"Map","texture")}setup(e){const t=e.context.material,r=this.scope;let s=null;if(r===th.COLOR){const e=void 0!==t.color?this.getColor(r):vn();s=t.map&&!0===t.map.isTexture?e.mul(this.getTexture("map")):e}else if(r===th.OPACITY){const e=this.getFloat(r);s=t.alphaMap&&!0===t.alphaMap.isTexture?e.mul(this.getTexture("alpha")):e}else if(r===th.SPECULAR_STRENGTH)s=t.specularMap&&!0===t.specularMap.isTexture?this.getTexture("specular").r:gn(1);else if(r===th.SPECULAR_INTENSITY){const e=this.getFloat(r);s=t.specularIntensityMap&&!0===t.specularIntensityMap.isTexture?e.mul(this.getTexture(r).a):e}else if(r===th.SPECULAR_COLOR){const e=this.getColor(r);s=t.specularColorMap&&!0===t.specularColorMap.isTexture?e.mul(this.getTexture(r).rgb):e}else if(r===th.ROUGHNESS){const e=this.getFloat(r);s=t.roughnessMap&&!0===t.roughnessMap.isTexture?e.mul(this.getTexture(r).g):e}else if(r===th.METALNESS){const e=this.getFloat(r);s=t.metalnessMap&&!0===t.metalnessMap.isTexture?e.mul(this.getTexture(r).b):e}else if(r===th.EMISSIVE){const e=this.getFloat("emissiveIntensity"),i=this.getColor(r).mul(e);s=t.emissiveMap&&!0===t.emissiveMap.isTexture?i.mul(this.getTexture(r)):i}else if(r===th.NORMAL)t.normalMap?(s=Kc(this.getTexture("normal"),this.getCache("normalScale","vec2")),s.normalMapType=t.normalMapType,t.normalMap.format!=G&&t.normalMap.format!=z&&t.normalMap.format!=$||(s.unpackNormalMode=O)):s=t.bumpMap?Jc(this.getTexture("bump").r,this.getFloat("bumpScale")):jd;else if(r===th.CLEARCOAT){const e=this.getFloat(r);s=t.clearcoatMap&&!0===t.clearcoatMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_ROUGHNESS){const e=this.getFloat(r);s=t.clearcoatRoughnessMap&&!0===t.clearcoatRoughnessMap.isTexture?e.mul(this.getTexture(r).r):e}else if(r===th.CLEARCOAT_NORMAL)s=t.clearcoatNormalMap?Kc(this.getTexture(r),this.getCache(r+"Scale","vec2")):jd;else if(r===th.SHEEN){const e=this.getColor("sheenColor").mul(this.getFloat("sheen"));s=t.sheenColorMap&&!0===t.sheenColorMap.isTexture?e.mul(this.getTexture("sheenColor").rgb):e}else if(r===th.SHEEN_ROUGHNESS){const e=this.getFloat(r);s=t.sheenRoughnessMap&&!0===t.sheenRoughnessMap.isTexture?e.mul(this.getTexture(r).a):e,s=s.clamp(1e-4,1)}else if(r===th.ANISOTROPY)if(t.anisotropyMap&&!0===t.anisotropyMap.isTexture){const e=this.getTexture(r);s=Mn(Vh.x,Vh.y,Vh.y.negate(),Vh.x).mul(e.rg.mul(2).sub(bn(1)).normalize().mul(e.b))}else s=Vh;else if(r===th.IRIDESCENCE_THICKNESS){const e=fc("1","float",t.iridescenceThicknessRange);if(t.iridescenceThicknessMap){const i=fc("0","float",t.iridescenceThicknessRange);s=e.sub(i).mul(this.getTexture(r).g).add(i)}else s=e}else if(r===th.TRANSMISSION){const e=this.getFloat(r);s=t.transmissionMap?e.mul(this.getTexture(r).r):e}else if(r===th.THICKNESS){const e=this.getFloat(r);s=t.thicknessMap?e.mul(this.getTexture(r).g):e}else if(r===th.IOR)s=this.getFloat(r);else if(r===th.LIGHT_MAP)s=this.getTexture(r).rgb.mul(this.getFloat("lightMapIntensity"));else if(r===th.AO)s=this.getTexture(r).r.sub(1).mul(this.getFloat("aoMapIntensity")).add(1);else if(r===th.LINE_DASH_OFFSET)s=t.dashOffset?this.getFloat(r):gn(0);else{const t=this.getNodeType(e);s=this.getCache(r,t)}return s}}th.ALPHA_TEST="alphaTest",th.COLOR="color",th.OPACITY="opacity",th.SHININESS="shininess",th.SPECULAR="specular",th.SPECULAR_STRENGTH="specularStrength",th.SPECULAR_INTENSITY="specularIntensity",th.SPECULAR_COLOR="specularColor",th.REFLECTIVITY="reflectivity",th.ROUGHNESS="roughness",th.METALNESS="metalness",th.NORMAL="normal",th.CLEARCOAT="clearcoat",th.CLEARCOAT_ROUGHNESS="clearcoatRoughness",th.CLEARCOAT_NORMAL="clearcoatNormal",th.EMISSIVE="emissive",th.ROTATION="rotation",th.SHEEN="sheen",th.SHEEN_ROUGHNESS="sheenRoughness",th.ANISOTROPY="anisotropy",th.IRIDESCENCE="iridescence",th.IRIDESCENCE_IOR="iridescenceIOR",th.IRIDESCENCE_THICKNESS="iridescenceThickness",th.IOR="ior",th.TRANSMISSION="transmission",th.THICKNESS="thickness",th.ATTENUATION_DISTANCE="attenuationDistance",th.ATTENUATION_COLOR="attenuationColor",th.LINE_SCALE="scale",th.LINE_DASH_SIZE="dashSize",th.LINE_GAP_SIZE="gapSize",th.LINE_WIDTH="linewidth",th.LINE_DASH_OFFSET="dashOffset",th.POINT_SIZE="size",th.DISPERSION="dispersion",th.LIGHT_MAP="light",th.AO="ao";const rh=sn(th,th.ALPHA_TEST),sh=sn(th,th.COLOR),ih=sn(th,th.SHININESS),nh=sn(th,th.EMISSIVE),ah=sn(th,th.OPACITY),oh=sn(th,th.SPECULAR),uh=sn(th,th.SPECULAR_INTENSITY),lh=sn(th,th.SPECULAR_COLOR),dh=sn(th,th.SPECULAR_STRENGTH),ch=sn(th,th.REFLECTIVITY),hh=sn(th,th.ROUGHNESS),ph=sn(th,th.METALNESS),gh=sn(th,th.NORMAL),mh=sn(th,th.CLEARCOAT),fh=sn(th,th.CLEARCOAT_ROUGHNESS),yh=sn(th,th.CLEARCOAT_NORMAL),bh=sn(th,th.ROTATION),xh=sn(th,th.SHEEN),Th=sn(th,th.SHEEN_ROUGHNESS),_h=sn(th,th.ANISOTROPY),vh=sn(th,th.IRIDESCENCE),Nh=sn(th,th.IRIDESCENCE_IOR),Sh=sn(th,th.IRIDESCENCE_THICKNESS),Rh=sn(th,th.TRANSMISSION),Ah=sn(th,th.THICKNESS),Eh=sn(th,th.IOR),wh=sn(th,th.ATTENUATION_DISTANCE),Ch=sn(th,th.ATTENUATION_COLOR),Mh=sn(th,th.LINE_SCALE),Bh=sn(th,th.LINE_DASH_SIZE),Lh=sn(th,th.LINE_GAP_SIZE),Fh=sn(th,th.LINE_WIDTH),Ph=sn(th,th.LINE_DASH_OFFSET),Dh=sn(th,th.POINT_SIZE),Uh=sn(th,th.DISPERSION),Ih=sn(th,th.LIGHT_MAP),Oh=sn(th,th.AO),Vh=_a(new t).onReference(function(e){return e.material}).onRenderUpdate(function({material:e}){this.value.set(e.anisotropy*Math.cos(e.anisotropyRotation),e.anisotropy*Math.sin(e.anisotropyRotation))}),kh=un(e=>e.context.setupModelViewProjection(),"vec4").once()().toVarying("v_modelViewProjection");class Gh extends li{static get type(){return"StorageArrayElementNode"}constructor(e,t){super(e,t),this.isStorageArrayElementNode=!0}set storageBufferNode(e){this.node=e}get storageBufferNode(){return this.node}getMemberType(e,t){const r=this.storageBufferNode.structTypeNode;return r?r.getMemberType(e,t):"void"}setup(e){return!1===e.isAvailable("storageBuffer")&&!0===this.node.isPBO&&e.setupPBO(this.node),super.setup(e)}generate(e,t){let r;const s=e.context.assign;if(r=!1===e.isAvailable("storageBuffer")?!0!==this.node.isPBO||!0===s||!this.node.value.isInstancedBufferAttribute&&"compute"===e.shaderStage?this.node.build(e):e.generatePBO(this):super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}const zh=rn(Gh).setParameterLength(2);class $h extends Dl{static get type(){return"StorageBufferNode"}constructor(e,t=null,r=0){let s,i=null;t&&t.isStruct?(s="struct",i=t.layout,(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)&&(r=e.count)):null===t&&(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute)?(s=Gs(e.itemSize),r=e.count):s=t,super(e,s,r),this.isStorageBufferNode=!0,this.structTypeNode=i,this.access=ti.READ_WRITE,this.isAtomic=!1,this.isPBO=!1,this._attribute=null,this._varying=null,this.global=!0,!0!==e.isStorageBufferAttribute&&!0!==e.isStorageInstancedBufferAttribute&&(e.isInstancedBufferAttribute?e.isStorageInstancedBufferAttribute=!0:e.isStorageBufferAttribute=!0)}getHash(e){if(0===this.bufferCount){let t=e.globalCache.getData(this.value);return void 0===t&&(t={node:this},e.globalCache.setData(this.value,t)),t.node.uuid}return this.uuid}getInputType(){return this.value.isIndirectStorageBufferAttribute?"indirectStorageBuffer":"storageBuffer"}element(e){return zh(this,e)}setPBO(e){return this.isPBO=e,this}getPBO(){return this.isPBO}setAccess(e){return this.access=e,this}toReadOnly(){return this.setAccess(ti.READ_ONLY)}setAtomic(e){return this.isAtomic=e,this}toAtomic(){return this.setAtomic(!0)}getAttributeData(){return null===this._attribute&&(this._attribute=Ju(this.value),this._varying=Pu(this._attribute)),{attribute:this._attribute,varying:this._varying}}getNodeType(e){if(null!==this.structTypeNode)return this.structTypeNode.getNodeType(e);if(e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.getNodeType(e);const{attribute:t}=this.getAttributeData();return t.getNodeType(e)}getMemberType(e,t){return null!==this.structTypeNode?this.structTypeNode.getMemberType(e,t):"void"}generate(e){if(null!==this.structTypeNode&&this.structTypeNode.build(e),e.isAvailable("storageBuffer")||e.isAvailable("indirectStorageBuffer"))return super.generate(e);const{attribute:t,varying:r}=this.getAttributeData(),s=r.build(e);return e.registerTransform(s,t),s}}const Wh=(e,t=null,r=0)=>new $h(e,t,r);class Hh extends ui{static get type(){return"IndexNode"}constructor(e){super("uint"),this.scope=e,this.isIndexNode=!0}generate(e){const t=this.getNodeType(e),r=this.scope;let s,i;if(r===Hh.VERTEX)s=e.getVertexIndex();else if(r===Hh.INSTANCE)s=e.getInstanceIndex();else if(r===Hh.DRAW)s=e.getDrawIndex();else if(r===Hh.INVOCATION_LOCAL)s=e.getInvocationLocalIndex();else if(r===Hh.INVOCATION_SUBGROUP)s=e.getInvocationSubgroupIndex();else{if(r!==Hh.SUBGROUP)throw new Error("THREE.IndexNode: Unknown scope: "+r);s=e.getSubgroupIndex()}if("vertex"===e.shaderStage||"compute"===e.shaderStage)i=s;else{i=Pu(this).build(e,t)}return i}}Hh.VERTEX="vertex",Hh.INSTANCE="instance",Hh.SUBGROUP="subgroup",Hh.INVOCATION_LOCAL="invocationLocal",Hh.INVOCATION_SUBGROUP="invocationSubgroup",Hh.DRAW="draw";const qh=sn(Hh,Hh.VERTEX),jh=sn(Hh,Hh.INSTANCE),Xh=sn(Hh,Hh.SUBGROUP),Kh=sn(Hh,Hh.INVOCATION_SUBGROUP),Yh=sn(Hh,Hh.INVOCATION_LOCAL),Qh=sn(Hh,Hh.DRAW);class Zh extends ui{static get type(){return"InstanceNode"}constructor(e,t,r=null){super("void"),this.count=e,this.instanceMatrix=t,this.instanceColor=r,this.instanceMatrixNode=null,this.instanceColorNode=null,this.updateType=Js.FRAME,this.buffer=null,this.bufferColor=null,this.previousInstanceMatrixNode=null}get isStorageMatrix(){const{instanceMatrix:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}get isStorageColor(){const{instanceColor:e}=this;return e&&!0===e.isStorageInstancedBufferAttribute}setup(e){let{instanceMatrixNode:t,instanceColorNode:r}=this;null===t&&(t=this._createInstanceMatrixNode(!0,e),this.instanceMatrixNode=t);const{instanceColor:s,isStorageColor:i}=this;if(s&&null===r){if(i)r=Wh(s,"vec3",Math.max(s.count,1)).element(jh);else{const e=new W(s.array,3),t=s.usage===x?tl:el;this.bufferColor=e,r=vn(t(e,"vec3",3,0))}this.instanceColorNode=r}const n=t.mul(Ld).xyz;if(Ld.assign(n),e.needsPreviousData()&&Fd.assign(this.getPreviousInstancedPosition(e)),e.hasGeometryAttribute("normal")){const e=Yd($d,t);$d.assign(e)}null!==this.instanceColorNode&&In("vec3","vInstanceColor").assign(this.instanceColorNode)}update(e){null!==this.buffer&&!0!==this.isStorageMatrix&&(this.buffer.clearUpdateRanges(),this.buffer.updateRanges.push(...this.instanceMatrix.updateRanges),this.instanceMatrix.version!==this.buffer.version&&(this.buffer.version=this.instanceMatrix.version)),this.instanceColor&&null!==this.bufferColor&&!0!==this.isStorageColor&&(this.bufferColor.clearUpdateRanges(),this.bufferColor.updateRanges.push(...this.instanceColor.updateRanges),this.instanceColor.version!==this.bufferColor.version&&(this.bufferColor.version=this.instanceColor.version)),null!==this.previousInstanceMatrixNode&&e.object.previousInstanceMatrix.array.set(this.instanceMatrix.array)}getPreviousInstancedPosition(e){const t=e.object;return null===this.previousInstanceMatrixNode&&(t.previousInstanceMatrix=this.instanceMatrix.clone(),this.previousInstanceMatrixNode=this._createInstanceMatrixNode(!1,e)),this.previousInstanceMatrixNode.mul(Fd).xyz}_createInstanceMatrixNode(e,t){let r;const{instanceMatrix:s}=this,{count:i}=s;if(this.isStorageMatrix)r=Wh(s,"mat4",Math.max(i,1)).element(jh);else{if(i<=(!0===t.renderer.backend.isWebGPUBackend?1e3:250))r=Ul(s.array,"mat4",Math.max(i,1)).element(jh);else{const t=new H(s.array,16,1);!0===e&&(this.buffer=t);const i=s.usage===x?tl:el,n=[i(t,"vec4",16,0),i(t,"vec4",16,4),i(t,"vec4",16,8),i(t,"vec4",16,12)];r=Ln(...n)}}return r}}const Jh=rn(Zh).setParameterLength(2,3);class ep extends Zh{static get type(){return"InstancedMeshNode"}constructor(e){const{count:t,instanceMatrix:r,instanceColor:s}=e;super(t,r,s),this.instancedMesh=e}}const tp=rn(ep).setParameterLength(1);class rp extends ui{static get type(){return"BatchNode"}constructor(e){super("void"),this.batchMesh=e,this.batchingIdNode=null}setup(e){null===this.batchingIdNode&&(null===e.getDrawIndex()?this.batchingIdNode=jh:this.batchingIdNode=Qh);const t=un(([e])=>{const t=mn(El(Pl(this.batchMesh._indirectTexture),0).x).toConst(),r=mn(e).mod(t).toConst(),s=mn(e).div(t).toConst();return Pl(this.batchMesh._indirectTexture,xn(r,s)).x}).setLayout({name:"getIndirectIndex",type:"uint",inputs:[{name:"id",type:"int"}]}),r=t(mn(this.batchingIdNode)),s=this.batchMesh._matricesTexture,i=mn(El(Pl(s),0).x).toConst(),n=gn(r).mul(4).toInt().toConst(),a=n.mod(i).toConst(),o=n.div(i).toConst(),u=Ln(Pl(s,xn(a,o)),Pl(s,xn(a.add(1),o)),Pl(s,xn(a.add(2),o)),Pl(s,xn(a.add(3),o))),l=this.batchMesh._colorsTexture;if(null!==l){const e=un(([e])=>{const t=mn(El(Pl(l),0).x).toConst(),r=e,s=r.mod(t).toConst(),i=r.div(t).toConst();return Pl(l,xn(s,i)).rgb}).setLayout({name:"getBatchingColor",type:"vec3",inputs:[{name:"id",type:"int"}]}),t=e(r);In("vec3","vBatchColor").assign(t)}const d=Bn(u);Ld.assign(u.mul(Ld));const c=$d.div(vn(d[0].dot(d[0]),d[1].dot(d[1]),d[2].dot(d[2]))),h=d.mul(c).xyz;$d.assign(h),e.hasGeometryAttribute("tangent")&&Dc.mulAssign(d)}}const sp=rn(rp).setParameterLength(1),ip=new WeakMap;class np extends ui{static get type(){return"SkinningNode"}constructor(e){super("void"),this.skinnedMesh=e,this.updateType=Js.OBJECT,this.skinIndexNode=Sl("skinIndex","uvec4"),this.skinWeightNode=Sl("skinWeight","vec4"),this.bindMatrixNode=fc("bindMatrix","mat4"),this.bindMatrixInverseNode=fc("bindMatrixInverse","mat4"),this.boneMatricesNode=yc("skeleton.boneMatrices","mat4",e.skeleton.bones.length),this.positionNode=Ld,this.toPositionNode=Ld,this.previousBoneMatricesNode=null}getSkinnedPosition(e=this.boneMatricesNode,t=this.positionNode){const{skinIndexNode:r,skinWeightNode:s,bindMatrixNode:i,bindMatrixInverseNode:n}=this,a=e.element(r.x),o=e.element(r.y),u=e.element(r.z),l=e.element(r.w),d=i.mul(t),c=Ma(a.mul(s.x).mul(d),o.mul(s.y).mul(d),u.mul(s.z).mul(d),l.mul(s.w).mul(d));return n.mul(c).xyz}getSkinnedNormalAndTangent(e=this.boneMatricesNode,t=$d,r=Dc){const{skinIndexNode:s,skinWeightNode:i,bindMatrixNode:n,bindMatrixInverseNode:a}=this,o=e.element(s.x),u=e.element(s.y),l=e.element(s.z),d=e.element(s.w);let c=Ma(i.x.mul(o),i.y.mul(u),i.z.mul(l),i.w.mul(d));c=a.mul(c).mul(n);return{skinNormal:c.transformDirection(t).xyz,skinTangent:c.transformDirection(r).xyz}}getPreviousSkinnedPosition(e){const t=e.object;return null===this.previousBoneMatricesNode&&(t.skeleton.previousBoneMatrices=new Float32Array(t.skeleton.boneMatrices),this.previousBoneMatricesNode=yc("skeleton.previousBoneMatrices","mat4",t.skeleton.bones.length)),this.getSkinnedPosition(this.previousBoneMatricesNode,Fd)}setup(e){e.needsPreviousData()&&Fd.assign(this.getPreviousSkinnedPosition(e));const t=this.getSkinnedPosition();if(this.toPositionNode&&this.toPositionNode.assign(t),e.hasGeometryAttribute("normal")){const{skinNormal:t,skinTangent:r}=this.getSkinnedNormalAndTangent();$d.assign(t),e.hasGeometryAttribute("tangent")&&Dc.assign(r)}return t}generate(e,t){if("void"!==t)return super.generate(e,t)}update(e){const t=e.object&&e.object.skeleton?e.object.skeleton:this.skinnedMesh.skeleton;ip.get(t)!==e.frameId&&(ip.set(t,e.frameId),null!==this.previousBoneMatricesNode&&(null===t.previousBoneMatrices&&(t.previousBoneMatrices=new Float32Array(t.boneMatrices)),t.previousBoneMatrices.set(t.boneMatrices)),t.update())}}const ap=e=>new np(e);class op extends ui{static get type(){return"LoopNode"}constructor(e=[]){super("void"),this.params=e}getVarName(e){return String.fromCharCode("i".charCodeAt(0)+e)}getProperties(e){const t=e.getNodeProperties(this);if(void 0!==t.stackNode)return t;const r={};for(let e=0,t=this.params.length-1;eNumber(l)?">=":"<")),a)n=`while ( ${l} )`;else{const r={start:u,end:l},s=r.start,i=r.end;let a;const g=()=>h.includes("<")?"+=":"-=";if(null!=p)switch(typeof p){case"function":a=e.flowStagesNode(t.updateNode,"void").code.replace(/\t|;/g,"");break;case"number":a=d+" "+g()+" "+e.generateConst(c,p);break;case"string":a=d+" "+p;break;default:p.isNode?a=d+" "+g()+" "+p.build(e):(o("TSL: 'Loop( { update: ... } )' is not a function, string or number."),a="break /* invalid update */")}else p="int"===c||"uint"===c?h.includes("<")?"++":"--":g()+" 1.",a=d+" "+p;n=`for ( ${e.getVar(c,d)+" = "+s}; ${d+" "+h+" "+i}; ${a} )`}e.addFlowCode((0===s?"\n":"")+e.tab+n+" {\n\n").addFlowTab()}const i=s.build(e,"void");t.returnsNode.build(e,"void"),e.removeFlowTab().addFlowCode("\n"+e.tab+i);for(let t=0,r=this.params.length-1;tnew op(tn(e,"int")).toStack(),lp=()=>gl("break").toStack(),dp=new WeakMap,cp=new s,hp=un(({bufferMap:e,influence:t,stride:r,width:s,depth:i,offset:n})=>{const a=mn(qh).mul(r).add(n),o=a.div(s),u=a.sub(o.mul(s));return Pl(e,xn(u,o)).depth(i).xyz.mul(t)});class pp extends ui{static get type(){return"MorphNode"}constructor(e){super("void"),this.mesh=e,this.morphBaseInfluence=_a(1),this.updateType=Js.OBJECT}setup(e){const{geometry:r}=e,s=void 0!==r.morphAttributes.position,i=r.hasAttribute("normal")&&void 0!==r.morphAttributes.normal,n=r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color,a=void 0!==n?n.length:0,{texture:o,stride:u,size:l}=function(e){const r=void 0!==e.morphAttributes.position,s=void 0!==e.morphAttributes.normal,i=void 0!==e.morphAttributes.color,n=e.morphAttributes.position||e.morphAttributes.normal||e.morphAttributes.color,a=void 0!==n?n.length:0;let o=dp.get(e);if(void 0===o||o.count!==a){void 0!==o&&o.texture.dispose();const u=e.morphAttributes.position||[],l=e.morphAttributes.normal||[],d=e.morphAttributes.color||[];let c=0;!0===r&&(c=1),!0===s&&(c=2),!0===i&&(c=3);let h=e.attributes.position.count*c,p=1;const g=4096;h>g&&(p=Math.ceil(h/g),h=g);const m=new Float32Array(h*p*4*a),f=new q(m,h,p,a);f.type=j,f.needsUpdate=!0;const y=4*c;for(let x=0;x{const t=gn(0).toVar();this.mesh.count>1&&null!==this.mesh.morphTexture&&void 0!==this.mesh.morphTexture?t.assign(Pl(this.mesh.morphTexture,xn(mn(e).add(1),mn(jh))).r):t.assign(fc("morphTargetInfluences","float").element(e).toVar()),cn(t.notEqual(0),()=>{!0===s&&Ld.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(0)})),!0===i&&$d.addAssign(hp({bufferMap:o,influence:t,stride:u,width:d,depth:e,offset:mn(1)}))})})}update(){const e=this.morphBaseInfluence;this.mesh.geometry.morphTargetsRelative?e.value=1:e.value=1-this.mesh.morphTargetInfluences.reduce((e,t)=>e+t,0)}}const gp=rn(pp).setParameterLength(1);class mp extends ui{static get type(){return"LightingNode"}constructor(){super("vec3"),this.isLightingNode=!0}}class fp extends mp{static get type(){return"AONode"}constructor(e=null){super(),this.aoNode=e}setup(e){e.context.ambientOcclusion.mulAssign(this.aoNode)}}class yp extends xu{static get type(){return"LightingContextNode"}constructor(e,t=null,r=null,s=null){super(e),this.lightingModel=t,this.backdropNode=r,this.backdropAlphaNode=s,this._value=null}getContext(){const{backdropNode:e,backdropAlphaNode:t}=this,r={directDiffuse:vn().toVar("directDiffuse"),directSpecular:vn().toVar("directSpecular"),indirectDiffuse:vn().toVar("indirectDiffuse"),indirectSpecular:vn().toVar("indirectSpecular")};return{radiance:vn().toVar("radiance"),irradiance:vn().toVar("irradiance"),iblIrradiance:vn().toVar("iblIrradiance"),ambientOcclusion:gn(1).toVar("ambientOcclusion"),reflectedLight:r,backdrop:e,backdropAlpha:t}}setup(e){return this.value=this._value||(this._value=this.getContext()),this.value.lightingModel=this.lightingModel||e.context.lightingModel,super.setup(e)}}const bp=rn(yp);class xp extends mp{static get type(){return"IrradianceNode"}constructor(e){super(),this.node=e}setup(e){e.context.irradiance.addAssign(this.node)}}const Tp=new t;class _p extends Bl{static get type(){return"ViewportTextureNode"}constructor(e=Hl,t=null,r=null){let s=null;null===r?(s=new X,s.minFilter=K,r=s):s=r,super(r,e,t),this.generateMipmaps=!1,this.defaultFramebuffer=s,this.isOutputTextureNode=!0,this.updateBeforeType=Js.RENDER,this._cacheTextures=new WeakMap}getTextureForReference(e=null){let t,r;if(this.referenceNode?(t=this.referenceNode.defaultFramebuffer,r=this.referenceNode._cacheTextures):(t=this.defaultFramebuffer,r=this._cacheTextures),null===e)return t;if(!1===r.has(e)){const s=t.clone();r.set(e,s)}return r.get(e)}updateReference(e){const t=e.renderer.getRenderTarget();return this.value=this.getTextureForReference(t),this.value}updateBefore(e){const t=e.renderer,r=t.getRenderTarget();null===r?t.getDrawingBufferSize(Tp):Tp.set(r.width,r.height);const s=this.getTextureForReference(r);s.image.width===Tp.width&&s.image.height===Tp.height||(s.image.width=Tp.width,s.image.height=Tp.height,s.needsUpdate=!0);const i=s.generateMipmaps;s.generateMipmaps=this.generateMipmaps,t.copyFramebufferToTexture(s),s.generateMipmaps=i}clone(){const e=new this.constructor(this.uvNode,this.levelNode,this.value);return e.generateMipmaps=this.generateMipmaps,e}}const vp=rn(_p).setParameterLength(0,3),Np=rn(_p,null,null,{generateMipmaps:!0}).setParameterLength(0,3),Sp=Np(),Rp=(e=Hl,t=null)=>Sp.sample(e,t);let Ap=null;class Ep extends _p{static get type(){return"ViewportDepthTextureNode"}constructor(e=Hl,t=null){null===Ap&&(Ap=new Y),super(e,t,Ap)}getTextureForReference(){return Ap}}const wp=rn(Ep).setParameterLength(0,2);class Cp extends ui{static get type(){return"ViewportDepthNode"}constructor(e,t=null){super("float"),this.scope=e,this.valueNode=t,this.isViewportDepthNode=!0}generate(e){const{scope:t}=this;return t===Cp.DEPTH_BASE?e.getFragDepth():super.generate(e)}setup({camera:e}){const{scope:t}=this,r=this.valueNode;let s=null;if(t===Cp.DEPTH_BASE)null!==r&&(s=Pp().assign(r));else if(t===Cp.DEPTH)s=e.isPerspectiveCamera?Bp(Ud.z,ed,td):Mp(Ud.z,ed,td);else if(t===Cp.LINEAR_DEPTH)if(null!==r)if(e.isPerspectiveCamera){const e=Lp(r,ed,td);s=Mp(e,ed,td)}else s=r;else s=Mp(Ud.z,ed,td);return s}}Cp.DEPTH_BASE="depthBase",Cp.DEPTH="depth",Cp.LINEAR_DEPTH="linearDepth";const Mp=(e,t,r)=>e.add(t).div(t.sub(r)),Bp=(e,t,r)=>t.add(e).mul(r).div(r.sub(t).mul(e)),Lp=(e,t,r)=>t.mul(r).div(r.sub(t).mul(e).sub(r)),Fp=(e,t,r)=>{t=t.max(1e-6).toVar();const s=yo(e.negate().div(t)),i=yo(r.div(t));return s.div(i)},Pp=rn(Cp,Cp.DEPTH_BASE),Dp=sn(Cp,Cp.DEPTH),Up=rn(Cp,Cp.LINEAR_DEPTH).setParameterLength(0,1),Ip=Up(wp());Dp.assign=e=>Pp(e);class Op extends ui{static get type(){return"ClippingNode"}constructor(e=Op.DEFAULT){super(),this.scope=e}setup(e){super.setup(e);const t=e.clippingContext,{intersectionPlanes:r,unionPlanes:s}=t;return this.hardwareClipping=e.material.hardwareClipping,this.scope===Op.ALPHA_TO_COVERAGE?this.setupAlphaToCoverage(r,s):this.scope===Op.HARDWARE?this.setupHardwareClipping(s,e):this.setupDefault(r,s)}setupAlphaToCoverage(e,t){return un(()=>{const r=gn().toVar("distanceToPlane"),s=gn().toVar("distanceToGradient"),i=gn(1).toVar("clipOpacity"),n=t.length;if(!1===this.hardwareClipping&&n>0){const e=Vl(t).setGroup(ba);up(n,({i:t})=>{const n=e.element(t);r.assign(Ud.dot(n.xyz).negate().add(n.w)),s.assign(r.fwidth().div(2)),i.mulAssign(lu(s.negate(),s,r))})}const a=e.length;if(a>0){const t=Vl(e).setGroup(ba),n=gn(1).toVar("intersectionClipOpacity");up(a,({i:e})=>{const i=t.element(e);r.assign(Ud.dot(i.xyz).negate().add(i.w)),s.assign(r.fwidth().div(2)),n.mulAssign(lu(s.negate(),s,r).oneMinus())}),i.mulAssign(n.oneMinus())}On.a.mulAssign(i),On.a.equal(0).discard()})()}setupDefault(e,t){return un(()=>{const r=t.length;if(!1===this.hardwareClipping&&r>0){const e=Vl(t).setGroup(ba);up(r,({i:t})=>{const r=e.element(t);Ud.dot(r.xyz).greaterThan(r.w).discard()})}const s=e.length;if(s>0){const t=Vl(e).setGroup(ba),r=yn(!0).toVar("clipped");up(s,({i:e})=>{const s=t.element(e);r.assign(Ud.dot(s.xyz).greaterThan(s.w).and(r))}),r.discard()}})()}setupHardwareClipping(e,t){const r=e.length;return t.enableHardwareClipping(r),un(()=>{const s=Vl(e).setGroup(ba),i=kl(t.getClipDistance());up(r,({i:e})=>{const t=s.element(e),r=Ud.dot(t.xyz).sub(t.w).negate();i.element(e).assign(r)})})()}}Op.ALPHA_TO_COVERAGE="alphaToCoverage",Op.DEFAULT="default",Op.HARDWARE="hardware";const Vp=un(([e])=>No(La(1e4,So(La(17,e.x).add(La(.1,e.y)))).mul(Ma(.1,Mo(So(La(13,e.y).add(e.x))))))),kp=un(([e])=>Vp(bn(Vp(e.xy),e.z))),Gp=un(([e])=>{const t=Ho(Lo(Do(e.xyz)),Lo(Uo(e.xyz))),r=gn(1).div(gn(.05).mul(t)).toVar("pixScale"),s=bn(mo(To(yo(r))),mo(_o(yo(r)))),i=bn(kp(To(s.x.mul(e.xyz))),kp(To(s.y.mul(e.xyz)))),n=No(yo(r)),a=Ma(La(n.oneMinus(),i.x),La(n,i.y)),o=Wo(n,n.oneMinus()),u=vn(a.mul(a).div(La(2,o).mul(Ba(1,o))),a.sub(La(.5,o)).div(Ba(1,o)),Ba(1,Ba(1,a).mul(Ba(1,a)).div(La(2,o).mul(Ba(1,o))))),l=a.lessThan(o.oneMinus()).select(a.lessThan(o).select(u.x,u.y),u.z);return au(l,1e-6,1)}).setLayout({name:"getAlphaHashThreshold",type:"float",inputs:[{name:"position",type:"vec3"}]});class zp extends Nl{static get type(){return"VertexColorNode"}constructor(e){super(null,"vec4"),this.isVertexColorNode=!0,this.index=e}getAttributeName(){const e=this.index;return"color"+(e>0?e:"")}generate(e){const t=this.getAttributeName(e);let r;return r=!0===e.hasGeometryAttribute(t)?super.generate(e):e.generateConst(this.nodeType,new s(1,1,1,1)),r}serialize(e){super.serialize(e),e.index=this.index}deserialize(e){super.deserialize(e),this.index=e.index}}const $p=(e=0)=>new zp(e),Wp=un(([e,t])=>Wo(1,e.oneMinus().div(t)).oneMinus()).setLayout({name:"blendBurn",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Hp=un(([e,t])=>Wo(e.div(t.oneMinus()),1)).setLayout({name:"blendDodge",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),qp=un(([e,t])=>e.oneMinus().mul(t.oneMinus()).oneMinus()).setLayout({name:"blendScreen",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),jp=un(([e,t])=>nu(e.mul(2).mul(t),e.oneMinus().mul(2).mul(t.oneMinus()).oneMinus(),qo(.5,e))).setLayout({name:"blendOverlay",type:"vec3",inputs:[{name:"base",type:"vec3"},{name:"blend",type:"vec3"}]}),Xp=un(([e,t])=>{const r=t.a.add(e.a.mul(t.a.oneMinus()));return An(t.rgb.mul(t.a).add(e.rgb.mul(e.a).mul(t.a.oneMinus())).div(r),r)}).setLayout({name:"blendColor",type:"vec4",inputs:[{name:"base",type:"vec4"},{name:"blend",type:"vec4"}]}),Kp=un(([e])=>An(e.rgb.mul(e.a),e.a),{color:"vec4",return:"vec4"}),Yp=un(([e])=>(cn(e.a.equal(0),()=>An(0)),An(e.rgb.div(e.a),e.a)),{color:"vec4",return:"vec4"});class Qp extends Q{static get type(){return"NodeMaterial"}get type(){return this.constructor.type}set type(e){}constructor(){super(),this.isNodeMaterial=!0,this.fog=!0,this.lights=!1,this.hardwareClipping=!1,this.lightsNode=null,this.envNode=null,this.aoNode=null,this.colorNode=null,this.normalNode=null,this.opacityNode=null,this.backdropNode=null,this.backdropAlphaNode=null,this.alphaTestNode=null,this.maskNode=null,this.maskShadowNode=null,this.positionNode=null,this.geometryNode=null,this.depthNode=null,this.receivedShadowPositionNode=null,this.castShadowPositionNode=null,this.receivedShadowNode=null,this.castShadowNode=null,this.outputNode=null,this.mrtNode=null,this.fragmentNode=null,this.vertexNode=null,this.contextNode=null}_getNodeChildren(){const e=[];for(const t of Object.getOwnPropertyNames(this)){if(!0===t.startsWith("_"))continue;const r=this[t];r&&!0===r.isNode&&e.push({property:t,childNode:r})}return e}customProgramCacheKey(){const e=[];for(const{property:t,childNode:r}of this._getNodeChildren())e.push(Us(t.slice(0,-4)),r.getCacheKey());return this.type+Is(e)}build(e){this.setup(e)}setupObserver(e){return new Ps(e)}setup(e){e.context.setupNormal=()=>Lu(this.setupNormal(e),"NORMAL","vec3"),e.context.setupPositionView=()=>this.setupPositionView(e),e.context.setupModelViewProjection=()=>this.setupModelViewProjection(e);const t=e.renderer,r=t.getRenderTarget();!0===t.contextNode.isContextNode?e.context={...e.context,...t.contextNode.getFlowContextData()}:o('NodeMaterial: "renderer.contextNode" must be an instance of `context()`.'),null!==this.contextNode&&(!0===this.contextNode.isContextNode?e.context={...e.context,...this.contextNode.getFlowContextData()}:o('NodeMaterial: "material.contextNode" must be an instance of `context()`.')),e.addStack();const s=this.setupVertex(e),i=Lu(this.vertexNode||s,"VERTEX");let n;e.context.clipSpace=i,e.stack.outputNode=i,this.setupHardwareClipping(e),null!==this.geometryNode&&(e.stack.outputNode=e.stack.outputNode.bypass(this.geometryNode)),e.addFlow("vertex",e.removeStack()),e.addStack();const a=this.setupClipping(e);if(!0!==this.depthWrite&&!0!==this.depthTest||(null!==r?!0===r.depthBuffer&&this.setupDepth(e):!0===t.depth&&this.setupDepth(e)),null===this.fragmentNode){this.setupDiffuseColor(e),this.setupVariants(e);const s=this.setupLighting(e);null!==a&&e.stack.addToStack(a);const i=An(s,On.a).max(0);n=this.setupOutput(e,i),ia.assign(n);const o=null!==this.outputNode;if(o&&(n=this.outputNode),e.context.getOutput&&(n=e.context.getOutput(n,e)),null!==r){const e=t.getMRT(),r=this.mrtNode;null!==e?(o&&ia.assign(n),n=e,null!==r&&(n=e.merge(r))):null!==r&&(n=r)}}else{let t=this.fragmentNode;!0!==t.isOutputStructNode&&(t=An(t)),n=this.setupOutput(e,t)}e.stack.outputNode=n,e.addFlow("fragment",e.removeStack()),e.observer=this.setupObserver(e)}setupClipping(e){if(null===e.clippingContext)return null;const{unionPlanes:t,intersectionPlanes:r}=e.clippingContext;let s=null;if(t.length>0||r.length>0){const t=e.renderer.currentSamples;this.alphaToCoverage&&t>1?s=new Op(Op.ALPHA_TO_COVERAGE):e.stack.addToStack(new Op)}return s}setupHardwareClipping(e){if(this.hardwareClipping=!1,null===e.clippingContext)return;const t=e.clippingContext.unionPlanes.length;t>0&&t<=8&&e.isAvailable("clipDistance")&&(e.stack.addToStack(new Op(Op.HARDWARE)),this.hardwareClipping=!0)}setupDepth(e){const{renderer:t,camera:r}=e;let s=this.depthNode;if(null===s){const e=t.getMRT();e&&e.has("depth")?s=e.get("depth"):!0===t.logarithmicDepthBuffer&&(s=r.isPerspectiveCamera?Fp(Ud.z,ed,td):Mp(Ud.z,ed,td))}null!==s&&Dp.assign(s).toStack()}setupPositionView(){return Ad.mul(Ld).xyz}setupModelViewProjection(){return rd.mul(Ud)}setupVertex(e){return e.addStack(),this.setupPosition(e),e.context.position=e.removeStack(),kh}setupPosition(e){const{object:t,geometry:r}=e;if((r.morphAttributes.position||r.morphAttributes.normal||r.morphAttributes.color)&&gp(t).toStack(),!0===t.isSkinnedMesh&&ap(t).toStack(),this.displacementMap){const e=xc("displacementMap","texture"),t=xc("displacementScale","float"),r=xc("displacementBias","float");Ld.addAssign($d.normalize().mul(e.x.mul(t).add(r)))}return t.isBatchedMesh&&sp(t).toStack(),t.isInstancedMesh&&t.instanceMatrix&&!0===t.instanceMatrix.isInstancedBufferAttribute&&tp(t).toStack(),null!==this.positionNode&&Ld.assign(Lu(this.positionNode,"POSITION","vec3")),Ld}setupDiffuseColor(e){const{object:t,geometry:r}=e;null!==this.maskNode&&yn(this.maskNode).not().discard();let s=this.colorNode?An(this.colorNode):sh;if(!0===this.vertexColors&&r.hasAttribute("color")&&(s=s.mul($p())),t.instanceColor){s=In("vec3","vInstanceColor").mul(s)}if(t.isBatchedMesh&&t._colorsTexture){s=In("vec3","vBatchColor").mul(s)}On.assign(s);const i=this.opacityNode?gn(this.opacityNode):ah;On.a.assign(On.a.mul(i));let n=null;(null!==this.alphaTestNode||this.alphaTest>0)&&(n=null!==this.alphaTestNode?gn(this.alphaTestNode):rh,!0===this.alphaToCoverage?(On.a=lu(n,n.add(ko(On.a)),On.a),On.a.lessThanEqual(0).discard()):On.a.lessThanEqual(n).discard()),!0===this.alphaHash&&On.a.lessThan(Gp(Ld)).discard(),e.isOpaque()&&On.a.assign(1)}setupVariants(){}setupOutgoingLight(){return!0===this.lights?vn(0):On.rgb}setupNormal(){return this.normalNode?vn(this.normalNode):gh}setupEnvironment(){let e=null;return this.envNode?e=this.envNode:this.envMap&&(e=this.envMap.isCubeTexture?xc("envMap","cubeTexture"):xc("envMap","texture")),e}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new xp(Ih)),t}setupLights(e){const t=[],r=this.setupEnvironment(e);r&&r.isLightingNode&&t.push(r);const s=this.setupLightMap(e);s&&s.isLightingNode&&t.push(s);let i=this.aoNode;null===i&&e.material.aoMap&&(i=Oh),e.context.getAO&&(i=e.context.getAO(i,e)),i&&t.push(new fp(i));let n=this.lightsNode||e.lightsNode;return t.length>0&&(n=e.renderer.lighting.createNode([...n.getLights(),...t])),n}setupLightingModel(){}setupLighting(e){const{material:t}=e,{backdropNode:r,backdropAlphaNode:s,emissiveNode:i}=this,n=!0===this.lights||null!==this.lightsNode?this.setupLights(e):null;let a=this.setupOutgoingLight(e);if(n&&n.getScope().hasLights){const t=this.setupLightingModel(e)||null;a=bp(n,t,r,s)}else null!==r&&(a=vn(null!==s?nu(a,r,s):r));return(i&&!0===i.isNode||t.emissive&&!0===t.emissive.isColor)&&(kn.assign(vn(i||nh)),a=a.add(kn)),a}setupFog(e,t){const r=e.fogNode;return r&&(ia.assign(t),t=An(r.toVar())),t}setupPremultipliedAlpha(e,t){return Kp(t)}setupOutput(e,t){return!0===this.fog&&(t=this.setupFog(e,t)),!0===this.premultipliedAlpha&&(t=this.setupPremultipliedAlpha(e,t)),t}setDefaultValues(e){for(const t in e){const r=e[t];void 0===this[t]&&(this[t]=r,r&&r.clone&&(this[t]=r.clone()))}const t=Object.getOwnPropertyDescriptors(e.constructor.prototype);for(const e in t)void 0===Object.getOwnPropertyDescriptor(this.constructor.prototype,e)&&void 0!==t[e].get&&Object.defineProperty(this.constructor.prototype,e,t[e])}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{},nodes:{}});const r=Q.prototype.toJSON.call(this,e);r.inputNodes={};for(const{property:t,childNode:s}of this._getNodeChildren())r.inputNodes[t]=s.toJSON(e).uuid;function s(e){const t=[];for(const r in e){const s=e[r];delete s.metadata,t.push(s)}return t}if(t){const t=s(e.textures),i=s(e.images),n=s(e.nodes);t.length>0&&(r.textures=t),i.length>0&&(r.images=i),n.length>0&&(r.nodes=n)}return r}copy(e){return this.lightsNode=e.lightsNode,this.envNode=e.envNode,this.aoNode=e.aoNode,this.colorNode=e.colorNode,this.normalNode=e.normalNode,this.opacityNode=e.opacityNode,this.backdropNode=e.backdropNode,this.backdropAlphaNode=e.backdropAlphaNode,this.alphaTestNode=e.alphaTestNode,this.maskNode=e.maskNode,this.maskShadowNode=e.maskShadowNode,this.positionNode=e.positionNode,this.geometryNode=e.geometryNode,this.depthNode=e.depthNode,this.receivedShadowPositionNode=e.receivedShadowPositionNode,this.castShadowPositionNode=e.castShadowPositionNode,this.receivedShadowNode=e.receivedShadowNode,this.castShadowNode=e.castShadowNode,this.outputNode=e.outputNode,this.mrtNode=e.mrtNode,this.fragmentNode=e.fragmentNode,this.vertexNode=e.vertexNode,this.contextNode=e.contextNode,super.copy(e)}}const Zp=new Z;class Jp extends Qp{static get type(){return"LineBasicNodeMaterial"}constructor(e){super(),this.isLineBasicNodeMaterial=!0,this.setDefaultValues(Zp),this.setValues(e)}}const eg=new J;class tg extends Qp{static get type(){return"LineDashedNodeMaterial"}constructor(e){super(),this.isLineDashedNodeMaterial=!0,this.setDefaultValues(eg),this.dashOffset=0,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.setValues(e)}setupVariants(){const e=this.offsetNode?gn(this.offsetNode):Ph,t=this.dashScaleNode?gn(this.dashScaleNode):Mh,r=this.dashSizeNode?gn(this.dashSizeNode):Bh,s=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(r),aa.assign(s);const i=Pu(Sl("lineDistance").mul(t));(e?i.add(e):i).mod(na.add(aa)).greaterThan(na).discard()}}const rg=new J;class sg extends Qp{static get type(){return"Line2NodeMaterial"}constructor(e={}){super(),this.isLine2NodeMaterial=!0,this.setDefaultValues(rg),this.vertexColors=e.vertexColors,this.dashOffset=0,this.lineColorNode=null,this.offsetNode=null,this.dashScaleNode=null,this.dashSizeNode=null,this.gapSizeNode=null,this.blending=ee,this._useDash=e.dashed,this._useAlphaToCoverage=!0,this._useWorldUnits=!1,this.setValues(e)}setup(e){const{renderer:t}=e,r=this._useAlphaToCoverage,s=this.vertexColors,i=this._useDash,n=this._useWorldUnits,a=un(({start:e,end:t})=>{const r=rd.element(2).element(2),s=rd.element(3).element(2).mul(-.5).div(r).sub(e.z).div(t.z.sub(e.z));return An(nu(e.xyz,t.xyz,s),t.w)}).setLayout({name:"trimSegment",type:"vec4",inputs:[{name:"start",type:"vec4"},{name:"end",type:"vec4"}]});this.vertexNode=un(()=>{const e=Sl("instanceStart"),t=Sl("instanceEnd"),r=An(Ad.mul(An(e,1))).toVar("start"),s=An(Ad.mul(An(t,1))).toVar("end");if(i){const e=this.dashScaleNode?gn(this.dashScaleNode):Mh,t=this.offsetNode?gn(this.offsetNode):Ph,r=Sl("instanceDistanceStart"),s=Sl("instanceDistanceEnd");let i=Bd.y.lessThan(.5).select(e.mul(r),e.mul(s));i=i.add(t),In("float","lineDistance").assign(i)}n&&(In("vec3","worldStart").assign(r.xyz),In("vec3","worldEnd").assign(s.xyz));const o=Xl.z.div(Xl.w),u=rd.element(2).element(3).equal(-1);cn(u,()=>{cn(r.z.lessThan(0).and(s.z.greaterThan(0)),()=>{s.assign(a({start:r,end:s}))}).ElseIf(s.z.lessThan(0).and(r.z.greaterThanEqual(0)),()=>{r.assign(a({start:s,end:r}))})});const l=rd.mul(r),d=rd.mul(s),c=l.xyz.div(l.w),h=d.xyz.div(d.w),p=h.xy.sub(c.xy).toVar();p.x.assign(p.x.mul(o)),p.assign(p.normalize());const g=An().toVar();if(n){const e=s.xyz.sub(r.xyz).normalize(),t=nu(r.xyz,s.xyz,.5).normalize(),n=e.cross(t).normalize(),a=e.cross(n),o=In("vec4","worldPos");o.assign(Bd.y.lessThan(.5).select(r,s));const u=Fh.mul(.5);o.addAssign(An(Bd.x.lessThan(0).select(n.mul(u),n.mul(u).negate()),0)),i||(o.addAssign(An(Bd.y.lessThan(.5).select(e.mul(u).negate(),e.mul(u)),0)),o.addAssign(An(a.mul(u),0)),cn(Bd.y.greaterThan(1).or(Bd.y.lessThan(0)),()=>{o.subAssign(An(a.mul(2).mul(u),0))})),g.assign(rd.mul(o));const l=vn().toVar();l.assign(Bd.y.lessThan(.5).select(c,h)),g.z.assign(l.z.mul(g.w))}else{const e=bn(p.y,p.x.negate()).toVar("offset");p.x.assign(p.x.div(o)),e.x.assign(e.x.div(o)),e.assign(Bd.x.lessThan(0).select(e.negate(),e)),cn(Bd.y.lessThan(0),()=>{e.assign(e.sub(p))}).ElseIf(Bd.y.greaterThan(1),()=>{e.assign(e.add(p))}),e.assign(e.mul(Fh)),e.assign(e.div(Xl.w.div(Wl))),g.assign(Bd.y.lessThan(.5).select(l,d)),e.assign(e.mul(g.w)),g.assign(g.add(An(e,0,0)))}return g})();const o=un(({p1:e,p2:t,p3:r,p4:s})=>{const i=e.sub(r),n=s.sub(r),a=t.sub(e),o=i.dot(n),u=n.dot(a),l=i.dot(a),d=n.dot(n),c=a.dot(a).mul(d).sub(u.mul(u)),h=o.mul(u).sub(l.mul(d)).div(c).clamp(),p=o.add(u.mul(h)).div(d).clamp();return bn(h,p)});if(this.colorNode=un(()=>{const e=Rl();if(i){const t=this.dashSizeNode?gn(this.dashSizeNode):Bh,r=this.gapSizeNode?gn(this.gapSizeNode):Lh;na.assign(t),aa.assign(r);const s=In("float","lineDistance");e.y.lessThan(-1).or(e.y.greaterThan(1)).discard(),s.mod(na.add(aa)).greaterThan(na).discard()}const a=gn(1).toVar("alpha");if(n){const e=In("vec3","worldStart"),s=In("vec3","worldEnd"),n=In("vec4","worldPos").xyz.normalize().mul(1e5),u=s.sub(e),l=o({p1:e,p2:s,p3:vn(0,0,0),p4:n}),d=e.add(u.mul(l.x)),c=n.mul(l.y),h=d.sub(c).length().div(Fh);if(!i)if(r&&t.currentSamples>0){const e=h.fwidth();a.assign(lu(e.negate().add(.5),e.add(.5),h).oneMinus())}else h.greaterThan(.5).discard()}else if(r&&t.currentSamples>0){const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1)),s=t.mul(t).add(r.mul(r)),i=gn(s.fwidth()).toVar("dlen");cn(e.y.abs().greaterThan(1),()=>{a.assign(lu(i.oneMinus(),i.add(1),s).oneMinus())})}else cn(e.y.abs().greaterThan(1),()=>{const t=e.x,r=e.y.greaterThan(0).select(e.y.sub(1),e.y.add(1));t.mul(t).add(r.mul(r)).greaterThan(1).discard()});let u;if(this.lineColorNode)u=this.lineColorNode;else if(s){const e=Sl("instanceColorStart"),t=Sl("instanceColorEnd");u=Bd.y.lessThan(.5).select(e,t).mul(sh)}else u=sh;return An(u,a)})(),this.transparent){const e=this.opacityNode?gn(this.opacityNode):ah;this.outputNode=An(this.colorNode.rgb.mul(e).add(Rp().rgb.mul(e.oneMinus())),this.colorNode.a)}super.setup(e)}get worldUnits(){return this._useWorldUnits}set worldUnits(e){this._useWorldUnits!==e&&(this._useWorldUnits=e,this.needsUpdate=!0)}get dashed(){return this._useDash}set dashed(e){this._useDash!==e&&(this._useDash=e,this.needsUpdate=!0)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const ig=new te;class ng extends Qp{static get type(){return"MeshNormalNodeMaterial"}constructor(e){super(),this.isMeshNormalNodeMaterial=!0,this.setDefaultValues(ig),this.setValues(e)}setupDiffuseColor(){const e=this.opacityNode?gn(this.opacityNode):ah;On.assign(Gu(An(qc(jd),e),re))}}const ag=un(([e=Dd])=>{const t=e.z.atan(e.x).mul(1/(2*Math.PI)).add(.5),r=e.y.clamp(-1,1).asin().mul(1/Math.PI).add(.5);return bn(t,r)});class og extends se{constructor(e=1,t={}){super(e,t),this.isCubeRenderTarget=!0}fromEquirectangularTexture(e,t){const r=t.minFilter,s=t.generateMipmaps;t.generateMipmaps=!0,this.texture.type=t.type,this.texture.colorSpace=t.colorSpace,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i=new ie(5,5,5),n=ag(Dd),a=new Qp;a.colorNode=Fl(t,n,0),a.side=M,a.blending=ee;const o=new ne(i,a),u=new ae;u.add(o),t.minFilter===K&&(t.minFilter=oe);const l=new ue(1,10,this),d=e.getMRT();return e.setMRT(null),l.update(e,u),e.setMRT(d),t.minFilter=r,t.currentGenerateMipmaps=s,o.geometry.dispose(),o.material.dispose(),this}}const ug=new WeakMap;class lg extends ci{static get type(){return"CubeMapNode"}constructor(e){super("vec3"),this.envNode=e,this._cubeTexture=null,this._cubeTextureNode=pc(null);const t=new F;t.isRenderTargetTexture=!0,this._defaultTexture=t,this.updateBeforeType=Js.RENDER}updateBefore(e){const{renderer:t,material:r}=e,s=this.envNode;if(s.isTextureNode||s.isMaterialReferenceNode){const e=s.isTextureNode?s.value:r[s.property];if(e&&e.isTexture){const r=e.mapping;if(r===le||r===de){if(ug.has(e)){const t=ug.get(e);cg(t,e.mapping),this._cubeTexture=t}else{const r=e.image;if(function(e){return null!=e&&e.height>0}(r)){const s=new og(r.height);s.fromEquirectangularTexture(t,e),cg(s.texture,e.mapping),this._cubeTexture=s.texture,ug.set(e,s.texture),e.addEventListener("dispose",dg)}else this._cubeTexture=this._defaultTexture}this._cubeTextureNode.value=this._cubeTexture}else this._cubeTextureNode=this.envNode}}}setup(e){return this.updateBefore(e),this._cubeTextureNode}}function dg(e){const t=e.target;t.removeEventListener("dispose",dg);const r=ug.get(t);void 0!==r&&(ug.delete(t),r.dispose())}function cg(e,t){t===le?e.mapping=P:t===de&&(e.mapping=D)}const hg=rn(lg).setParameterLength(1);class pg extends mp{static get type(){return"BasicEnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){e.context.environment=hg(this.envNode)}}class gg extends mp{static get type(){return"BasicLightMapNode"}constructor(e=null){super(),this.lightMapNode=e}setup(e){const t=gn(1/Math.PI);e.context.irradianceLightMap=this.lightMapNode.mul(t)}}class mg{start(e){e.lightsNode.setupLights(e,e.lightsNode.getLightNodes(e)),this.indirect(e)}finish(){}direct(){}directRectArea(){}indirect(){}ambientOcclusion(){}}class fg extends mg{constructor(){super()}indirect({context:e}){const t=e.ambientOcclusion,r=e.reflectedLight,s=e.irradianceLightMap;r.indirectDiffuse.assign(An(0)),s?r.indirectDiffuse.addAssign(s):r.indirectDiffuse.addAssign(An(1,1,1,0)),r.indirectDiffuse.mulAssign(t),r.indirectDiffuse.mulAssign(On.rgb)}finish(e){const{material:t,context:r}=e,s=r.outgoingLight,i=e.context.environment;if(i)switch(t.combine){case pe:s.rgb.assign(nu(s.rgb,s.rgb.mul(i.rgb),dh.mul(ch)));break;case he:s.rgb.assign(nu(s.rgb,i.rgb,dh.mul(ch)));break;case ce:s.rgb.addAssign(i.rgb.mul(dh.mul(ch)));break;default:d("BasicLightingModel: Unsupported .combine value:",t.combine)}}}const yg=new ge;class bg extends Qp{static get type(){return"MeshBasicNodeMaterial"}constructor(e){super(),this.isMeshBasicNodeMaterial=!0,this.lights=!0,this.setDefaultValues(yg),this.setValues(e)}setupNormal(){return Gd(Hd)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightMap(e){let t=null;return e.material.lightMap&&(t=new gg(Ih)),t}setupOutgoingLight(){return On.rgb}setupLightingModel(){return new fg}}const xg=un(({f0:e,f90:t,dotVH:r})=>{const s=r.mul(-5.55473).sub(6.98316).mul(r).exp2();return e.mul(s.oneMinus()).add(t.mul(s))}),Tg=un(e=>e.diffuseColor.mul(1/Math.PI)),_g=un(({dotNH:e})=>sa.mul(gn(.5)).add(1).mul(gn(1/Math.PI)).mul(e.pow(sa))),vg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(t).clamp(),s=Id.dot(t).clamp(),i=xg({f0:ea,f90:1,dotVH:s}),n=gn(.25),a=_g({dotNH:r});return i.mul(n).mul(a)});class Ng extends fg{constructor(e=!0){super(),this.specular=e}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t);r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:On.rgb}))),!0===this.specular&&r.directSpecular.addAssign(s.mul(vg({lightDirection:e})).mul(dh))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const Sg=new me;class Rg extends Qp{static get type(){return"MeshLambertNodeMaterial"}constructor(e){super(),this.isMeshLambertNodeMaterial=!0,this.lights=!0,this.setDefaultValues(Sg),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng(!1)}}const Ag=new fe;class Eg extends Qp{static get type(){return"MeshPhongNodeMaterial"}constructor(e){super(),this.isMeshPhongNodeMaterial=!0,this.lights=!0,this.shininessNode=null,this.specularNode=null,this.setDefaultValues(Ag),this.setValues(e)}setupEnvironment(e){const t=super.setupEnvironment(e);return t?new pg(t):null}setupLightingModel(){return new Ng}setupVariants(){const e=(this.shininessNode?gn(this.shininessNode):ih).max(1e-4);sa.assign(e);const t=this.specularNode||oh;ea.assign(t)}copy(e){return this.shininessNode=e.shininessNode,this.specularNode=e.specularNode,super.copy(e)}}const wg=un(e=>{if(!1===e.geometry.hasAttribute("normal"))return gn(0);const t=Hd.dFdx().abs().max(Hd.dFdy().abs());return t.x.max(t.y).max(t.z)}),Cg=un(e=>{const{roughness:t}=e,r=wg();let s=t.max(.0525);return s=s.add(r),s=s.min(1),s}),Mg=un(({alpha:e,dotNL:t,dotNV:r})=>{const s=e.pow2(),i=t.mul(s.add(s.oneMinus().mul(r.pow2())).sqrt()),n=r.mul(s.add(s.oneMinus().mul(t.pow2())).sqrt());return Fa(.5,i.add(n).max(so))}).setLayout({name:"V_GGX_SmithCorrelated",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNL",type:"float"},{name:"dotNV",type:"float"}]}),Bg=un(({alphaT:e,alphaB:t,dotTV:r,dotBV:s,dotTL:i,dotBL:n,dotNV:a,dotNL:o})=>{const u=o.mul(vn(e.mul(r),t.mul(s),a).length()),l=a.mul(vn(e.mul(i),t.mul(n),o).length());return Fa(.5,u.add(l))}).setLayout({name:"V_GGX_SmithCorrelated_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotTV",type:"float",qualifier:"in"},{name:"dotBV",type:"float",qualifier:"in"},{name:"dotTL",type:"float",qualifier:"in"},{name:"dotBL",type:"float",qualifier:"in"},{name:"dotNV",type:"float",qualifier:"in"},{name:"dotNL",type:"float",qualifier:"in"}]}),Lg=un(({alpha:e,dotNH:t})=>{const r=e.pow2(),s=t.pow2().mul(r.oneMinus()).oneMinus();return r.div(s.pow2()).mul(1/Math.PI)}).setLayout({name:"D_GGX",type:"float",inputs:[{name:"alpha",type:"float"},{name:"dotNH",type:"float"}]}),Fg=gn(1/Math.PI),Pg=un(({alphaT:e,alphaB:t,dotNH:r,dotTH:s,dotBH:i})=>{const n=e.mul(t),a=vn(t.mul(s),e.mul(i),n.mul(r)),o=a.dot(a),u=n.div(o);return Fg.mul(n.mul(u.pow2()))}).setLayout({name:"D_GGX_Anisotropic",type:"float",inputs:[{name:"alphaT",type:"float",qualifier:"in"},{name:"alphaB",type:"float",qualifier:"in"},{name:"dotNH",type:"float",qualifier:"in"},{name:"dotTH",type:"float",qualifier:"in"},{name:"dotBH",type:"float",qualifier:"in"}]}),Dg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,normalView:n=jd,USE_IRIDESCENCE:a,USE_ANISOTROPY:o})=>{const u=s.pow2(),l=e.add(Id).normalize(),d=n.dot(e).clamp(),c=n.dot(Id).clamp(),h=n.dot(l).clamp(),p=Id.dot(l).clamp();let g,m,f=xg({f0:t,f90:r,dotVH:p});if(Ki(a)&&(f=jn.mix(f,i)),Ki(o)){const t=Zn.dot(e),r=Zn.dot(Id),s=Zn.dot(l),i=Jn.dot(e),n=Jn.dot(Id),a=Jn.dot(l);g=Bg({alphaT:Yn,alphaB:u,dotTV:r,dotBV:n,dotTL:t,dotBL:i,dotNV:c,dotNL:d}),m=Pg({alphaT:Yn,alphaB:u,dotNH:h,dotTH:s,dotBH:a})}else g=Mg({alpha:u,dotNL:d,dotNV:c}),m=Lg({alpha:u,dotNH:h});return f.mul(g).mul(m)}),Ug=new Uint16Array([12469,15057,12620,14925,13266,14620,13807,14376,14323,13990,14545,13625,14713,13328,14840,12882,14931,12528,14996,12233,15039,11829,15066,11525,15080,11295,15085,10976,15082,10705,15073,10495,13880,14564,13898,14542,13977,14430,14158,14124,14393,13732,14556,13410,14702,12996,14814,12596,14891,12291,14937,11834,14957,11489,14958,11194,14943,10803,14921,10506,14893,10278,14858,9960,14484,14039,14487,14025,14499,13941,14524,13740,14574,13468,14654,13106,14743,12678,14818,12344,14867,11893,14889,11509,14893,11180,14881,10751,14852,10428,14812,10128,14765,9754,14712,9466,14764,13480,14764,13475,14766,13440,14766,13347,14769,13070,14786,12713,14816,12387,14844,11957,14860,11549,14868,11215,14855,10751,14825,10403,14782,10044,14729,9651,14666,9352,14599,9029,14967,12835,14966,12831,14963,12804,14954,12723,14936,12564,14917,12347,14900,11958,14886,11569,14878,11247,14859,10765,14828,10401,14784,10011,14727,9600,14660,9289,14586,8893,14508,8533,15111,12234,15110,12234,15104,12216,15092,12156,15067,12010,15028,11776,14981,11500,14942,11205,14902,10752,14861,10393,14812,9991,14752,9570,14682,9252,14603,8808,14519,8445,14431,8145,15209,11449,15208,11451,15202,11451,15190,11438,15163,11384,15117,11274,15055,10979,14994,10648,14932,10343,14871,9936,14803,9532,14729,9218,14645,8742,14556,8381,14461,8020,14365,7603,15273,10603,15272,10607,15267,10619,15256,10631,15231,10614,15182,10535,15118,10389,15042,10167,14963,9787,14883,9447,14800,9115,14710,8665,14615,8318,14514,7911,14411,7507,14279,7198,15314,9675,15313,9683,15309,9712,15298,9759,15277,9797,15229,9773,15166,9668,15084,9487,14995,9274,14898,8910,14800,8539,14697,8234,14590,7790,14479,7409,14367,7067,14178,6621,15337,8619,15337,8631,15333,8677,15325,8769,15305,8871,15264,8940,15202,8909,15119,8775,15022,8565,14916,8328,14804,8009,14688,7614,14569,7287,14448,6888,14321,6483,14088,6171,15350,7402,15350,7419,15347,7480,15340,7613,15322,7804,15287,7973,15229,8057,15148,8012,15046,7846,14933,7611,14810,7357,14682,7069,14552,6656,14421,6316,14251,5948,14007,5528,15356,5942,15356,5977,15353,6119,15348,6294,15332,6551,15302,6824,15249,7044,15171,7122,15070,7050,14949,6861,14818,6611,14679,6349,14538,6067,14398,5651,14189,5311,13935,4958,15359,4123,15359,4153,15356,4296,15353,4646,15338,5160,15311,5508,15263,5829,15188,6042,15088,6094,14966,6001,14826,5796,14678,5543,14527,5287,14377,4985,14133,4586,13869,4257,15360,1563,15360,1642,15358,2076,15354,2636,15341,3350,15317,4019,15273,4429,15203,4732,15105,4911,14981,4932,14836,4818,14679,4621,14517,4386,14359,4156,14083,3795,13808,3437,15360,122,15360,137,15358,285,15355,636,15344,1274,15322,2177,15281,2765,15215,3223,15120,3451,14995,3569,14846,3567,14681,3466,14511,3305,14344,3121,14037,2800,13753,2467,15360,0,15360,1,15359,21,15355,89,15346,253,15325,479,15287,796,15225,1148,15133,1492,15008,1749,14856,1882,14685,1886,14506,1783,14324,1608,13996,1398,13702,1183]);let Ig=null;const Og=un(({roughness:e,dotNV:t})=>{null===Ig&&(Ig=new ye(Ug,16,16,G,be),Ig.name="DFG_LUT",Ig.minFilter=oe,Ig.magFilter=oe,Ig.wrapS=xe,Ig.wrapT=xe,Ig.generateMipmaps=!1,Ig.needsUpdate=!0);const r=bn(e,t);return Fl(Ig,r).rg}),Vg=un(({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a})=>{const o=Dg({lightDirection:e,f0:t,f90:r,roughness:s,f:i,USE_IRIDESCENCE:n,USE_ANISOTROPY:a}),u=jd.dot(e).clamp(),l=jd.dot(Id).clamp(),d=Og({roughness:s,dotNV:l}),c=Og({roughness:s,dotNV:u}),h=t.mul(d.x).add(r.mul(d.y)),p=t.mul(c.x).add(r.mul(c.y)),g=d.x.add(d.y),m=c.x.add(c.y),f=gn(1).sub(g),y=gn(1).sub(m),b=t.add(t.oneMinus().mul(.047619)),x=h.mul(p).mul(b).div(gn(1).sub(f.mul(y).mul(b).mul(b)).add(so)),T=f.mul(y),_=x.mul(T);return o.add(_)}),kg=un(e=>{const{dotNV:t,specularColor:r,specularF90:s,roughness:i}=e,n=Og({dotNV:t,roughness:i});return r.mul(n.x).add(s.mul(n.y))}),Gg=un(({f:e,f90:t,dotVH:r})=>{const s=r.oneMinus().saturate(),i=s.mul(s),n=s.mul(i,i).clamp(0,.9999);return e.sub(vn(t).mul(n)).div(n.oneMinus())}).setLayout({name:"Schlick_to_F0",type:"vec3",inputs:[{name:"f",type:"vec3"},{name:"f90",type:"float"},{name:"dotVH",type:"float"}]}),zg=un(({roughness:e,dotNH:t})=>{const r=e.pow2(),s=gn(1).div(r),i=t.pow2().oneMinus().max(.0078125);return gn(2).add(s).mul(i.pow(s.mul(.5))).div(2*Math.PI)}).setLayout({name:"D_Charlie",type:"float",inputs:[{name:"roughness",type:"float"},{name:"dotNH",type:"float"}]}),$g=un(({dotNV:e,dotNL:t})=>gn(1).div(gn(4).mul(t.add(e).sub(t.mul(e))))).setLayout({name:"V_Neubelt",type:"float",inputs:[{name:"dotNV",type:"float"},{name:"dotNL",type:"float"}]}),Wg=un(({lightDirection:e})=>{const t=e.add(Id).normalize(),r=jd.dot(e).clamp(),s=jd.dot(Id).clamp(),i=jd.dot(t).clamp(),n=zg({roughness:qn,dotNH:i}),a=$g({dotNV:s,dotNL:r});return Hn.mul(n).mul(a)}),Hg=un(({N:e,V:t,roughness:r})=>{const s=e.dot(t).saturate(),i=bn(r,s.oneMinus().sqrt());return i.assign(i.mul(.984375).add(.0078125)),i}).setLayout({name:"LTC_Uv",type:"vec2",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"roughness",type:"float"}]}),qg=un(({f:e})=>{const t=e.length();return Ho(t.mul(t).add(e.z).div(t.add(1)),0)}).setLayout({name:"LTC_ClippedSphereFormFactor",type:"float",inputs:[{name:"f",type:"vec3"}]}),jg=un(({v1:e,v2:t})=>{const r=e.dot(t),s=r.abs().toVar(),i=s.mul(.0145206).add(.4965155).mul(s).add(.8543985).toVar(),n=s.add(4.1616724).mul(s).add(3.417594).toVar(),a=i.div(n),o=r.greaterThan(0).select(a,Ho(r.mul(r).oneMinus(),1e-7).inverseSqrt().mul(.5).sub(a));return e.cross(t).mul(o)}).setLayout({name:"LTC_EdgeVectorFormFactor",type:"vec3",inputs:[{name:"v1",type:"vec3"},{name:"v2",type:"vec3"}]}),Xg=un(({N:e,V:t,P:r,mInv:s,p0:i,p1:n,p2:a,p3:o})=>{const u=n.sub(i).toVar(),l=o.sub(i).toVar(),d=u.cross(l),c=vn().toVar();return cn(d.dot(r.sub(i)).greaterThanEqual(0),()=>{const u=t.sub(e.mul(t.dot(e))).normalize(),l=e.cross(u).negate(),d=s.mul(Bn(u,l,e).transpose()).toVar(),h=d.mul(i.sub(r)).normalize().toVar(),p=d.mul(n.sub(r)).normalize().toVar(),g=d.mul(a.sub(r)).normalize().toVar(),m=d.mul(o.sub(r)).normalize().toVar(),f=vn(0).toVar();f.addAssign(jg({v1:h,v2:p})),f.addAssign(jg({v1:p,v2:g})),f.addAssign(jg({v1:g,v2:m})),f.addAssign(jg({v1:m,v2:h})),c.assign(vn(qg({f:f})))}),c}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"N",type:"vec3"},{name:"V",type:"vec3"},{name:"P",type:"vec3"},{name:"mInv",type:"mat3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Kg=un(({P:e,p0:t,p1:r,p2:s,p3:i})=>{const n=r.sub(t).toVar(),a=i.sub(t).toVar(),o=n.cross(a),u=vn().toVar();return cn(o.dot(e.sub(t)).greaterThanEqual(0),()=>{const n=t.sub(e).normalize().toVar(),a=r.sub(e).normalize().toVar(),o=s.sub(e).normalize().toVar(),l=i.sub(e).normalize().toVar(),d=vn(0).toVar();d.addAssign(jg({v1:n,v2:a})),d.addAssign(jg({v1:a,v2:o})),d.addAssign(jg({v1:o,v2:l})),d.addAssign(jg({v1:l,v2:n})),u.assign(vn(qg({f:d.abs()})))}),u}).setLayout({name:"LTC_Evaluate",type:"vec3",inputs:[{name:"P",type:"vec3"},{name:"p0",type:"vec3"},{name:"p1",type:"vec3"},{name:"p2",type:"vec3"},{name:"p3",type:"vec3"}]}),Yg=1/6,Qg=e=>La(Yg,La(e,La(e,e.negate().add(3)).sub(3)).add(1)),Zg=e=>La(Yg,La(e,La(e,La(3,e).sub(6))).add(4)),Jg=e=>La(Yg,La(e,La(e,La(-3,e).add(3)).add(3)).add(1)),em=e=>La(Yg,Zo(e,3)),tm=e=>Qg(e).add(Zg(e)),rm=e=>Jg(e).add(em(e)),sm=e=>Ma(-1,Zg(e).div(Qg(e).add(Zg(e)))),im=e=>Ma(1,em(e).div(Jg(e).add(em(e)))),nm=(e,t,r)=>{const s=e.uvNode,i=La(s,t.zw).add(.5),n=To(i),a=No(i),o=tm(a.x),u=rm(a.x),l=sm(a.x),d=im(a.x),c=sm(a.y),h=im(a.y),p=bn(n.x.add(l),n.y.add(c)).sub(.5).mul(t.xy),g=bn(n.x.add(d),n.y.add(c)).sub(.5).mul(t.xy),m=bn(n.x.add(l),n.y.add(h)).sub(.5).mul(t.xy),f=bn(n.x.add(d),n.y.add(h)).sub(.5).mul(t.xy),y=tm(a.y).mul(Ma(o.mul(e.sample(p).level(r)),u.mul(e.sample(g).level(r)))),b=rm(a.y).mul(Ma(o.mul(e.sample(m).level(r)),u.mul(e.sample(f).level(r))));return y.add(b)},am=un(([e,t])=>{const r=bn(e.size(mn(t))),s=bn(e.size(mn(t.add(1)))),i=Fa(1,r),n=Fa(1,s),a=nm(e,An(i,r),To(t)),o=nm(e,An(n,s),_o(t));return No(t).mix(a,o)}),om=un(([e,t])=>{const r=t.mul(Cl(e));return am(e,r)}),um=un(([e,t,r,s,i])=>{const n=vn(uu(t.negate(),vo(e),Fa(1,s))),a=vn(Lo(i[0].xyz),Lo(i[1].xyz),Lo(i[2].xyz));return vo(n).mul(r.mul(a))}).setLayout({name:"getVolumeTransmissionRay",type:"vec3",inputs:[{name:"n",type:"vec3"},{name:"v",type:"vec3"},{name:"thickness",type:"float"},{name:"ior",type:"float"},{name:"modelMatrix",type:"mat4"}]}),lm=un(([e,t])=>e.mul(au(t.mul(2).sub(2),0,1))).setLayout({name:"applyIorToRoughness",type:"float",inputs:[{name:"roughness",type:"float"},{name:"ior",type:"float"}]}),dm=Np(),cm=Rp(),hm=un(([e,t,r],{material:s})=>{const i=(s.side===M?dm:cm).sample(e),n=yo(ql.x).mul(lm(t,r));return am(i,n)}),pm=un(([e,t,r])=>(cn(r.notEqual(0),()=>{const s=fo(t).negate().div(r);return go(s.negate().mul(e))}),vn(1))).setLayout({name:"volumeAttenuation",type:"vec3",inputs:[{name:"transmissionDistance",type:"float"},{name:"attenuationColor",type:"vec3"},{name:"attenuationDistance",type:"float"}]}),gm=un(([e,t,r,s,i,n,a,o,u,l,d,c,h,p,g])=>{let m,f;if(g){m=An().toVar(),f=vn().toVar();const i=d.sub(1).mul(g.mul(.025)),n=vn(d.sub(i),d,d.add(i));up({start:0,end:3},({i:i})=>{const d=n.element(i),g=um(e,t,c,d,o),y=a.add(g),b=l.mul(u.mul(An(y,1))),x=bn(b.xy.div(b.w)).toVar();x.addAssign(1),x.divAssign(2),x.assign(bn(x.x,x.y.oneMinus()));const T=hm(x,r,d);m.element(i).assign(T.element(i)),m.a.addAssign(T.a),f.element(i).assign(s.element(i).mul(pm(Lo(g),h,p).element(i)))}),m.a.divAssign(3)}else{const i=um(e,t,c,d,o),n=a.add(i),g=l.mul(u.mul(An(n,1))),y=bn(g.xy.div(g.w)).toVar();y.addAssign(1),y.divAssign(2),y.assign(bn(y.x,y.y.oneMinus())),m=hm(y,r,d),f=s.mul(pm(Lo(i),h,p))}const y=f.rgb.mul(m.rgb),b=e.dot(t).clamp(),x=vn(kg({dotNV:b,specularColor:i,specularF90:n,roughness:r})),T=f.r.add(f.g,f.b).div(3);return An(x.oneMinus().mul(y),m.a.oneMinus().mul(T).oneMinus())}),mm=Bn(3.2404542,-.969266,.0556434,-1.5371385,1.8760108,-.2040259,-.4985314,.041556,1.0572252),fm=(e,t)=>e.sub(t).div(e.add(t)).pow2(),ym=un(({outsideIOR:e,eta2:t,cosTheta1:r,thinFilmThickness:s,baseF0:i})=>{const n=nu(e,t,lu(0,.03,s)),a=e.div(n).pow2().mul(r.pow2().oneMinus()).oneMinus();cn(a.lessThan(0),()=>vn(1));const o=a.sqrt(),u=fm(n,e),l=xg({f0:u,f90:1,dotVH:r}),d=l.oneMinus(),c=n.lessThan(e).select(Math.PI,0),h=gn(Math.PI).sub(c),p=(e=>{const t=e.sqrt();return vn(1).add(t).div(vn(1).sub(t))})(i.clamp(0,.9999)),g=fm(p,n.toVec3()),m=xg({f0:g,f90:1,dotVH:o}),f=vn(p.x.lessThan(n).select(Math.PI,0),p.y.lessThan(n).select(Math.PI,0),p.z.lessThan(n).select(Math.PI,0)),y=n.mul(s,o,2),b=vn(h).add(f),x=l.mul(m).clamp(1e-5,.9999),T=x.sqrt(),_=d.pow2().mul(m).div(vn(1).sub(x)),v=l.add(_).toVar(),N=_.sub(d).toVar();return up({start:1,end:2,condition:"<=",name:"m"},({m:e})=>{N.mulAssign(T);const t=((e,t)=>{const r=e.mul(2*Math.PI*1e-9),s=vn(54856e-17,44201e-17,52481e-17),i=vn(1681e3,1795300,2208400),n=vn(43278e5,93046e5,66121e5),a=gn(9747e-17*Math.sqrt(2*Math.PI*45282e5)).mul(r.mul(2239900).add(t.x).cos()).mul(r.pow2().mul(-45282e5).exp());let o=s.mul(n.mul(2*Math.PI).sqrt()).mul(i.mul(r).add(t).cos()).mul(r.pow2().negate().mul(n).exp());return o=vn(o.x.add(a),o.y,o.z).div(1.0685e-7),mm.mul(o)})(gn(e).mul(y),gn(e).mul(b)).mul(2);v.addAssign(N.mul(t))}),v.max(vn(0))}).setLayout({name:"evalIridescence",type:"vec3",inputs:[{name:"outsideIOR",type:"float"},{name:"eta2",type:"float"},{name:"cosTheta1",type:"float"},{name:"thinFilmThickness",type:"float"},{name:"baseF0",type:"vec3"}]}),bm=un(({normal:e,viewDir:t,roughness:r})=>{const s=e.dot(t).saturate(),i=r.mul(r),n=r.add(.1).reciprocal(),a=gn(-1.9362).add(r.mul(1.0678)).add(i.mul(.4573)).sub(n.mul(.8469)),o=gn(-.6014).add(r.mul(.5538)).sub(i.mul(.467)).sub(n.mul(.1255));return a.mul(s).add(o).exp().saturate()}),xm=vn(.04),Tm=gn(1);class _m extends mg{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1){super(),this.clearcoat=e,this.sheen=t,this.iridescence=r,this.anisotropy=s,this.transmission=i,this.dispersion=n,this.clearcoatRadiance=null,this.clearcoatSpecularDirect=null,this.clearcoatSpecularIndirect=null,this.sheenSpecularDirect=null,this.sheenSpecularIndirect=null,this.iridescenceFresnel=null,this.iridescenceF0=null,this.iridescenceF0Dielectric=null,this.iridescenceF0Metallic=null}start(e){if(!0===this.clearcoat&&(this.clearcoatRadiance=vn().toVar("clearcoatRadiance"),this.clearcoatSpecularDirect=vn().toVar("clearcoatSpecularDirect"),this.clearcoatSpecularIndirect=vn().toVar("clearcoatSpecularIndirect")),!0===this.sheen&&(this.sheenSpecularDirect=vn().toVar("sheenSpecularDirect"),this.sheenSpecularIndirect=vn().toVar("sheenSpecularIndirect")),!0===this.iridescence){const e=jd.dot(Id).clamp(),t=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:ea}),r=ym({outsideIOR:gn(1),eta2:Xn,cosTheta1:e,thinFilmThickness:Kn,baseF0:On.rgb});this.iridescenceFresnel=nu(t,r,zn),this.iridescenceF0Dielectric=Gg({f:t,f90:1,dotVH:e}),this.iridescenceF0Metallic=Gg({f:r,f90:1,dotVH:e}),this.iridescenceF0=nu(this.iridescenceF0Dielectric,this.iridescenceF0Metallic,zn)}if(!0===this.transmission){const t=Pd,r=od.sub(Pd).normalize(),s=Xd,i=e.context;i.backdrop=gm(s,r,Gn,Vn,ta,ra,t,xd,id,rd,ua,da,ha,ca,this.dispersion?pa:null),i.backdropAlpha=la,On.a.mulAssign(nu(1,i.backdrop.a,la))}super.start(e)}computeMultiscattering(e,t,r,s,i=null){const n=jd.dot(Id).clamp(),a=Og({roughness:Gn,dotNV:n}),o=i?jn.mix(s,i):s,u=o.mul(a.x).add(r.mul(a.y)),l=a.x.add(a.y).oneMinus(),d=o.add(o.oneMinus().mul(.047619)),c=u.mul(d).div(l.mul(d).oneMinus());e.addAssign(u),t.addAssign(c.mul(l))}direct({lightDirection:e,lightColor:t,reflectedLight:r}){const s=jd.dot(e).clamp().mul(t).toVar();if(!0===this.sheen){this.sheenSpecularDirect.addAssign(s.mul(Wg({lightDirection:e})));const t=bm({normal:jd,viewDir:Id,roughness:qn}),r=bm({normal:jd,viewDir:e,roughness:qn}),i=Hn.r.max(Hn.g).max(Hn.b).mul(t.max(r)).oneMinus();s.mulAssign(i)}if(!0===this.clearcoat){const r=Kd.dot(e).clamp().mul(t);this.clearcoatSpecularDirect.addAssign(r.mul(Dg({lightDirection:e,f0:xm,f90:Tm,roughness:Wn,normalView:Kd})))}r.directDiffuse.addAssign(s.mul(Tg({diffuseColor:Vn}))),r.directSpecular.addAssign(s.mul(Vg({lightDirection:e,f0:ta,f90:1,roughness:Gn,f:this.iridescenceFresnel,USE_IRIDESCENCE:this.iridescence,USE_ANISOTROPY:this.anisotropy})))}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s,reflectedLight:i,ltc_1:n,ltc_2:a}){const o=t.add(r).sub(s),u=t.sub(r).sub(s),l=t.sub(r).add(s),d=t.add(r).add(s),c=jd,h=Id,p=Ud.toVar(),g=Hg({N:c,V:h,roughness:Gn}),m=n.sample(g).toVar(),f=a.sample(g).toVar(),y=Bn(vn(m.x,0,m.y),vn(0,1,0),vn(m.z,0,m.w)).toVar(),b=ta.mul(f.x).add(ta.oneMinus().mul(f.y)).toVar();i.directSpecular.addAssign(e.mul(b).mul(Xg({N:c,V:h,P:p,mInv:y,p0:o,p1:u,p2:l,p3:d}))),i.directDiffuse.addAssign(e.mul(Vn).mul(Xg({N:c,V:h,P:p,mInv:Bn(1,0,0,0,1,0,0,0,1),p0:o,p1:u,p2:l,p3:d})))}indirect(e){this.indirectDiffuse(e),this.indirectSpecular(e),this.ambientOcclusion(e)}indirectDiffuse(e){const{irradiance:t,reflectedLight:r}=e.context,s=t.mul(Tg({diffuseColor:Vn})).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();s.mulAssign(t)}r.indirectDiffuse.addAssign(s)}indirectSpecular(e){const{radiance:t,iblIrradiance:r,reflectedLight:s}=e.context;if(!0===this.sheen&&this.sheenSpecularIndirect.addAssign(r.mul(Hn,bm({normal:jd,viewDir:Id,roughness:qn}))),!0===this.clearcoat){const e=Kd.dot(Id).clamp(),t=kg({dotNV:e,specularColor:xm,specularF90:Tm,roughness:Wn});this.clearcoatSpecularIndirect.addAssign(this.clearcoatRadiance.mul(t))}const i=vn().toVar("singleScatteringDielectric"),n=vn().toVar("multiScatteringDielectric"),a=vn().toVar("singleScatteringMetallic"),o=vn().toVar("multiScatteringMetallic");this.computeMultiscattering(i,n,ra,ea,this.iridescenceF0Dielectric),this.computeMultiscattering(a,o,ra,On.rgb,this.iridescenceF0Metallic);const u=nu(i,a,zn),l=nu(n,o,zn),d=i.add(n),c=Vn.mul(d.oneMinus()),h=r.mul(1/Math.PI),p=t.mul(u).add(l.mul(h)).toVar(),g=c.mul(h).toVar();if(!0===this.sheen){const e=bm({normal:jd,viewDir:Id,roughness:qn}),t=Hn.r.max(Hn.g).max(Hn.b).mul(e).oneMinus();p.mulAssign(t),g.mulAssign(t)}s.indirectSpecular.addAssign(p),s.indirectDiffuse.addAssign(g)}ambientOcclusion(e){const{ambientOcclusion:t,reflectedLight:r}=e.context,s=jd.dot(Id).clamp().add(t),i=Gn.mul(-16).oneMinus().negate().exp2(),n=t.sub(s.pow(i).oneMinus()).clamp();!0===this.clearcoat&&this.clearcoatSpecularIndirect.mulAssign(t),!0===this.sheen&&this.sheenSpecularIndirect.mulAssign(t),r.indirectDiffuse.mulAssign(t),r.indirectSpecular.mulAssign(n)}finish({context:e}){const{outgoingLight:t}=e;if(!0===this.clearcoat){const e=Kd.dot(Id).clamp(),r=xg({dotVH:e,f0:xm,f90:Tm}),s=t.mul($n.mul(r).oneMinus()).add(this.clearcoatSpecularDirect.add(this.clearcoatSpecularIndirect).mul($n));t.assign(s)}if(!0===this.sheen){const e=t.add(this.sheenSpecularDirect,this.sheenSpecularIndirect.mul(1/Math.PI));t.assign(e)}}}const vm=gn(1),Nm=gn(-2),Sm=gn(.8),Rm=gn(-1),Am=gn(.4),Em=gn(2),wm=gn(.305),Cm=gn(3),Mm=gn(.21),Bm=gn(4),Lm=gn(4),Fm=gn(16),Pm=un(([e])=>{const t=vn(Mo(e)).toVar(),r=gn(-1).toVar();return cn(t.x.greaterThan(t.z),()=>{cn(t.x.greaterThan(t.y),()=>{r.assign(bu(e.x.greaterThan(0),0,3))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}).Else(()=>{cn(t.z.greaterThan(t.y),()=>{r.assign(bu(e.z.greaterThan(0),2,5))}).Else(()=>{r.assign(bu(e.y.greaterThan(0),1,4))})}),r}).setLayout({name:"getFace",type:"float",inputs:[{name:"direction",type:"vec3"}]}),Dm=un(([e,t])=>{const r=bn().toVar();return cn(t.equal(0),()=>{r.assign(bn(e.z,e.y).div(Mo(e.x)))}).ElseIf(t.equal(1),()=>{r.assign(bn(e.x.negate(),e.z.negate()).div(Mo(e.y)))}).ElseIf(t.equal(2),()=>{r.assign(bn(e.x.negate(),e.y).div(Mo(e.z)))}).ElseIf(t.equal(3),()=>{r.assign(bn(e.z.negate(),e.y).div(Mo(e.x)))}).ElseIf(t.equal(4),()=>{r.assign(bn(e.x.negate(),e.z).div(Mo(e.y)))}).Else(()=>{r.assign(bn(e.x,e.y).div(Mo(e.z)))}),La(.5,r.add(1))}).setLayout({name:"getUV",type:"vec2",inputs:[{name:"direction",type:"vec3"},{name:"face",type:"float"}]}),Um=un(([e])=>{const t=gn(0).toVar();return cn(e.greaterThanEqual(Sm),()=>{t.assign(vm.sub(e).mul(Rm.sub(Nm)).div(vm.sub(Sm)).add(Nm))}).ElseIf(e.greaterThanEqual(Am),()=>{t.assign(Sm.sub(e).mul(Em.sub(Rm)).div(Sm.sub(Am)).add(Rm))}).ElseIf(e.greaterThanEqual(wm),()=>{t.assign(Am.sub(e).mul(Cm.sub(Em)).div(Am.sub(wm)).add(Em))}).ElseIf(e.greaterThanEqual(Mm),()=>{t.assign(wm.sub(e).mul(Bm.sub(Cm)).div(wm.sub(Mm)).add(Cm))}).Else(()=>{t.assign(gn(-2).mul(yo(La(1.16,e))))}),t}).setLayout({name:"roughnessToMip",type:"float",inputs:[{name:"roughness",type:"float"}]}),Im=un(([e,t])=>{const r=e.toVar();r.assign(La(2,r).sub(1));const s=vn(r,1).toVar();return cn(t.equal(0),()=>{s.assign(s.zyx)}).ElseIf(t.equal(1),()=>{s.assign(s.xzy),s.xz.mulAssign(-1)}).ElseIf(t.equal(2),()=>{s.x.mulAssign(-1)}).ElseIf(t.equal(3),()=>{s.assign(s.zyx),s.xz.mulAssign(-1)}).ElseIf(t.equal(4),()=>{s.assign(s.xzy),s.xy.mulAssign(-1)}).ElseIf(t.equal(5),()=>{s.z.mulAssign(-1)}),s}).setLayout({name:"getDirection",type:"vec3",inputs:[{name:"uv",type:"vec2"},{name:"face",type:"float"}]}),Om=un(([e,t,r,s,i,n])=>{const a=gn(r),o=vn(t),u=au(Um(a),Nm,n),l=No(u),d=To(u),c=vn(Vm(e,o,d,s,i,n)).toVar();return cn(l.notEqual(0),()=>{const t=vn(Vm(e,o,d.add(1),s,i,n)).toVar();c.assign(nu(c,t,l))}),c}),Vm=un(([e,t,r,s,i,n])=>{const a=gn(r).toVar(),o=vn(t),u=gn(Pm(o)).toVar(),l=gn(Ho(Lm.sub(a),0)).toVar();a.assign(Ho(a,Lm));const d=gn(mo(a)).toVar(),c=bn(Dm(o,u).mul(d.sub(2)).add(1)).toVar();return cn(u.greaterThan(2),()=>{c.y.addAssign(d),u.subAssign(3)}),c.x.addAssign(u.mul(d)),c.x.addAssign(l.mul(La(3,Fm))),c.y.addAssign(La(4,mo(n).sub(d))),c.x.mulAssign(s),c.y.mulAssign(i),e.sample(c).grad(bn(),bn())}),km=un(({envMap:e,mipInt:t,outputDirection:r,theta:s,axis:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=Ro(s),l=r.mul(u).add(i.cross(r).mul(So(s))).add(i.mul(i.dot(r).mul(u.oneMinus())));return Vm(e,l,t,n,a,o)}),Gm=un(({n:e,latitudinal:t,poleAxis:r,outputDirection:s,weights:i,samples:n,dTheta:a,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})=>{const h=vn(bu(t,r,Qo(r,s))).toVar();cn(h.equal(vn(0)),()=>{h.assign(vn(s.z,0,s.x.negate()))}),h.assign(vo(h));const p=vn().toVar();return p.addAssign(i.element(0).mul(km({theta:0,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),up({start:mn(1),end:e},({i:e})=>{cn(e.greaterThanEqual(n),()=>{lp()});const t=gn(a.mul(gn(e))).toVar();p.addAssign(i.element(e).mul(km({theta:t.mul(-1),axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c}))),p.addAssign(i.element(e).mul(km({theta:t,axis:h,outputDirection:s,mipInt:o,envMap:u,CUBEUV_TEXEL_WIDTH:l,CUBEUV_TEXEL_HEIGHT:d,CUBEUV_MAX_MIP:c})))}),An(p,1)}),zm=un(([e])=>{const t=fn(e).toVar();return t.assign(t.shiftLeft(fn(16)).bitOr(t.shiftRight(fn(16)))),t.assign(t.bitAnd(fn(1431655765)).shiftLeft(fn(1)).bitOr(t.bitAnd(fn(2863311530)).shiftRight(fn(1)))),t.assign(t.bitAnd(fn(858993459)).shiftLeft(fn(2)).bitOr(t.bitAnd(fn(3435973836)).shiftRight(fn(2)))),t.assign(t.bitAnd(fn(252645135)).shiftLeft(fn(4)).bitOr(t.bitAnd(fn(4042322160)).shiftRight(fn(4)))),t.assign(t.bitAnd(fn(16711935)).shiftLeft(fn(8)).bitOr(t.bitAnd(fn(4278255360)).shiftRight(fn(8)))),gn(t).mul(2.3283064365386963e-10)}),$m=un(([e,t])=>bn(gn(e).div(gn(t)),zm(e))),Wm=un(([e,t,r])=>{const s=r.mul(r).toConst(),i=vn(1,0,0).toConst(),n=Qo(t,i).toConst(),a=bo(e.x).toConst(),o=La(2,3.14159265359).mul(e.y).toConst(),u=a.mul(Ro(o)).toConst(),l=a.mul(So(o)).toVar(),d=La(.5,t.z.add(1)).toConst();l.assign(d.oneMinus().mul(bo(u.mul(u).oneMinus())).add(d.mul(l)));const c=i.mul(u).add(n.mul(l)).add(t.mul(bo(Ho(0,u.mul(u).add(l.mul(l)).oneMinus()))));return vo(vn(s.mul(c.x),s.mul(c.y),Ho(0,c.z)))}),Hm=un(({roughness:e,mipInt:t,envMap:r,N_immutable:s,GGX_SAMPLES:i,CUBEUV_TEXEL_WIDTH:n,CUBEUV_TEXEL_HEIGHT:a,CUBEUV_MAX_MIP:o})=>{const u=vn(s).toVar(),l=vn(0).toVar(),d=gn(0).toVar();return cn(e.lessThan(.001),()=>{l.assign(Vm(r,u,t,n,a,o))}).Else(()=>{const s=bu(Mo(u.z).lessThan(.999),vn(0,0,1),vn(1,0,0)),c=vo(Qo(s,u)).toVar(),h=Qo(u,c).toVar();up({start:fn(0),end:i},({i:s})=>{const p=$m(s,i),g=Wm(p,vn(0,0,1),e),m=vo(c.mul(g.x).add(h.mul(g.y)).add(u.mul(g.z))),f=vo(m.mul(Yo(u,m).mul(2)).sub(u)),y=Ho(Yo(u,f),0);cn(y.greaterThan(0),()=>{const e=Vm(r,f,t,n,a,o);l.addAssign(e.mul(y)),d.addAssign(y)})}),cn(d.greaterThan(0),()=>{l.assign(l.div(d))})}),An(l,1)}),qm=[.125,.215,.35,.446,.526,.582],jm=20,Xm=new _e(-1,1,1,-1,0,1),Km=new ve(90,1),Ym=new e;let Qm=null,Zm=0,Jm=0;const ef=new r,tf=new WeakMap,rf=[3,1,5,0,4,2],sf=Im(Rl(),Sl("faceIndex")).normalize(),nf=vn(sf.x,sf.y,sf.z);class af{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._sizeLods=[],this._sigmas=[],this._lodMeshes=[],this._blurMaterial=null,this._ggxMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._backgroundBox=null}get _hasInitialized(){return this._renderer.hasInitialized()}fromScene(e,t=0,r=.1,s=100,i={}){const{size:n=256,position:a=ef,renderTarget:o=null}=i;if(this._setSize(n),!1===this._hasInitialized){d('PMREMGenerator: ".fromScene()" called before the backend is initialized. Try using "await renderer.init()" instead.');const n=o||this._allocateTarget();return i.renderTarget=n,this.fromSceneAsync(e,t,r,s,i),n}Qm=this._renderer.getRenderTarget(),Zm=this._renderer.getActiveCubeFace(),Jm=this._renderer.getActiveMipmapLevel();const u=o||this._allocateTarget();return u.depthBuffer=!0,this._init(u),this._sceneToCubeUV(e,r,s,u,a),t>0&&this._blur(u,0,0,t),this._applyPMREM(u),this._cleanup(u),u}async fromSceneAsync(e,t=0,r=.1,s=100,i={}){return v('PMREMGenerator: ".fromSceneAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this.fromScene(e,t,r,s,i)}fromEquirectangular(e,t=null){if(!1===this._hasInitialized){d('PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using "await renderer.init()" instead.'),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromEquirectangularAsync(e,r),r}return this._fromTexture(e,t)}async fromEquirectangularAsync(e,t=null){return v('PMREMGenerator: ".fromEquirectangularAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}fromCubemap(e,t=null){if(!1===this._hasInitialized){d("PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead."),this._setSizeFromTexture(e);const r=t||this._allocateTarget();return this.fromCubemapAsync(e,t),r}return this._fromTexture(e,t)}async fromCubemapAsync(e,t=null){return v('PMREMGenerator: ".fromCubemapAsync()" is deprecated. Use "await renderer.init()" instead.'),await this._renderer.init(),this._fromTexture(e,t)}async compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=df(),await this._compileMaterial(this._cubemapMaterial))}async compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=cf(),await this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose(),null!==this._backgroundBox&&(this._backgroundBox.geometry.dispose(),this._backgroundBox.material.dispose())}_setSizeFromTexture(e){e.mapping===P||e.mapping===D?this._setSize(0===e.image.length?16:e.image[0].width||e.image[0].image.width):this._setSize(e.image.width/4)}_setSize(e){this._lodMax=Math.floor(Math.log2(e)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._ggxMaterial&&this._ggxMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let e=0;ee-4?o=qm[a-e+4-1]:0===a&&(o=0),r.push(o);const u=1/(n-2),l=-u,d=1+u,c=[l,l,d,l,d,d,l,l,d,d,l,d],h=6,p=6,g=3,m=2,f=1,y=new Float32Array(g*p*h),b=new Float32Array(m*p*h),x=new Float32Array(f*p*h);for(let e=0;e2?0:-1,s=[t,r,0,t+2/3,r,0,t+2/3,r+1,0,t,r,0,t+2/3,r+1,0,t,r+1,0],i=rf[e];y.set(s,g*p*i),b.set(c,m*p*i);const n=[i,i,i,i,i,i];x.set(n,f*p*i)}const T=new Te;T.setAttribute("position",new Ee(y,g)),T.setAttribute("uv",new Ee(b,m)),T.setAttribute("faceIndex",new Ee(x,f)),s.push(new ne(T,null)),i>4&&i--}return{lodMeshes:s,sizeLods:t,sigmas:r}}(t)),this._blurMaterial=function(e,t,s){const i=Vl(new Array(jm).fill(0)),n=_a(new r(0,1,0)),a=_a(0),o=gn(jm),u=_a(0),l=_a(1),d=Fl(),c=_a(0),h=gn(1/t),p=gn(1/s),g=gn(e),m={n:o,latitudinal:u,weights:i,poleAxis:n,outputDirection:nf,dTheta:a,samples:l,envMap:d,mipInt:c,CUBEUV_TEXEL_WIDTH:h,CUBEUV_TEXEL_HEIGHT:p,CUBEUV_MAX_MIP:g},f=lf("blur");return f.fragmentNode=Gm({...m,latitudinal:u.equal(1)}),tf.set(f,m),f}(t,e.width,e.height),this._ggxMaterial=function(e,t,r){const s=Fl(),i=_a(0),n=_a(0),a=gn(1/t),o=gn(1/r),u=gn(e),l={envMap:s,roughness:i,mipInt:n,CUBEUV_TEXEL_WIDTH:a,CUBEUV_TEXEL_HEIGHT:o,CUBEUV_MAX_MIP:u},d=lf("ggx");return d.fragmentNode=Hm({...l,N_immutable:nf,GGX_SAMPLES:fn(512)}),tf.set(d,l),d}(t,e.width,e.height)}}async _compileMaterial(e){const t=new ne(new Te,e);await this._renderer.compile(t,Xm)}_sceneToCubeUV(e,t,r,s,i){const n=Km;n.near=t,n.far=r;const a=[1,1,1,1,-1,1],o=[1,-1,1,-1,1,-1],u=this._renderer,l=u.autoClear;u.getClearColor(Ym),u.autoClear=!1,null===this._backgroundBox&&(this._backgroundBox=new ne(new ie,new ge({name:"PMREM.Background",side:M,depthWrite:!1,depthTest:!1})));const d=this._backgroundBox,c=d.material;let h=!1;const p=e.background;p?p.isColor&&(c.color.copy(p),e.background=null,h=!0):(c.color.copy(Ym),h=!0),u.setRenderTarget(s),u.clear(),h&&u.render(d,n);for(let t=0;t<6;t++){const r=t%3;0===r?(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x+o[t],i.y,i.z)):1===r?(n.up.set(0,0,a[t]),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y+o[t],i.z)):(n.up.set(0,a[t],0),n.position.set(i.x,i.y,i.z),n.lookAt(i.x,i.y,i.z+o[t]));const l=this._cubeSize;uf(s,r*l,t>2?l:0,l,l),u.render(e,n)}u.autoClear=l,e.background=p}_textureToCubeUV(e,t){const r=this._renderer,s=e.mapping===P||e.mapping===D;s?null===this._cubemapMaterial&&(this._cubemapMaterial=df(e)):null===this._equirectMaterial&&(this._equirectMaterial=cf(e));const i=s?this._cubemapMaterial:this._equirectMaterial;i.fragmentNode.value=e;const n=this._lodMeshes[0];n.material=i;const a=this._cubeSize;uf(t,0,0,3*a,2*a),r.setRenderTarget(t),r.render(n,Xm)}_applyPMREM(e){const t=this._renderer,r=t.autoClear;t.autoClear=!1;const s=this._lodMeshes.length;for(let t=1;tc-4?r-c+4:0),g=4*(this._cubeSize-h);e.texture.frame=(e.texture.frame||0)+1,o.envMap.value=e.texture,o.roughness.value=d,o.mipInt.value=c-t,uf(i,p,g,3*h,2*h),s.setRenderTarget(i),s.render(a,Xm),i.texture.frame=(i.texture.frame||0)+1,o.envMap.value=i.texture,o.roughness.value=0,o.mipInt.value=c-r,uf(e,p,g,3*h,2*h),s.setRenderTarget(e),s.render(a,Xm)}_blur(e,t,r,s,i){const n=this._pingPongRenderTarget;this._halfBlur(e,n,t,r,s,"latitudinal",i),this._halfBlur(n,e,r,r,s,"longitudinal",i)}_halfBlur(e,t,r,s,i,n,a){const u=this._renderer,l=this._blurMaterial;"latitudinal"!==n&&"longitudinal"!==n&&o("blur direction must be either latitudinal or longitudinal!");const c=this._lodMeshes[s];c.material=l;const h=tf.get(l),p=this._sizeLods[r]-1,g=isFinite(i)?Math.PI/(2*p):2*Math.PI/39,m=i/g,f=isFinite(i)?1+Math.floor(3*m):jm;f>jm&&d(`sigmaRadians, ${i}, is too large and will clip, as it requested ${f} samples when the maximum is set to 20`);const y=[];let b=0;for(let e=0;ex-4?s-x+4:0),4*(this._cubeSize-T),3*T,2*T),u.setRenderTarget(t),u.render(c,Xm)}}function of(e,t){const r=new Ne(e,t,{magFilter:oe,minFilter:oe,generateMipmaps:!1,type:be,format:Re,colorSpace:Se});return r.texture.mapping=Ae,r.texture.name="PMREM.cubeUv",r.texture.isPMREMTexture=!0,r.scissorTest=!0,r}function uf(e,t,r,s,i){e.viewport.set(t,r,s,i),e.scissor.set(t,r,s,i)}function lf(e){const t=new Qp;return t.depthTest=!1,t.depthWrite=!1,t.blending=ee,t.name=`PMREM_${e}`,t}function df(e){const t=lf("cubemap");return t.fragmentNode=pc(e,nf),t}function cf(e){const t=lf("equirect");return t.fragmentNode=Fl(e,ag(nf),0),t}const hf=new WeakMap;function pf(e,t,r){const s=function(e){let t=hf.get(e);void 0===t&&(t=new WeakMap,hf.set(e,t));return t}(t);let i=s.get(e);if((void 0!==i?i.pmremVersion:-1)!==e.pmremVersion){const t=e.image;if(e.isCubeTexture){if(!function(e){if(null==e)return!1;let t=0;const r=6;for(let s=0;s0}(t))return null;i=r.fromEquirectangular(e,i)}i.pmremVersion=e.pmremVersion,s.set(e,i)}return i.texture}class gf extends ci{static get type(){return"PMREMNode"}constructor(e,t=null,r=null){super("vec3"),this._value=e,this._pmrem=null,this.uvNode=t,this.levelNode=r,this._generator=null;const s=new N;s.isRenderTargetTexture=!0,this._texture=Fl(s),this._width=_a(0),this._height=_a(0),this._maxMip=_a(0),this.updateBeforeType=Js.RENDER}set value(e){this._value=e,this._pmrem=null}get value(){return this._value}updateFromTexture(e){const t=function(e){const t=Math.log2(e)-2,r=1/e;return{texelWidth:1/(3*Math.max(Math.pow(2,t),112)),texelHeight:r,maxMip:t}}(e.image.height);this._texture.value=e,this._width.value=t.texelWidth,this._height.value=t.texelHeight,this._maxMip.value=t.maxMip}updateBefore(e){let t=this._pmrem;const r=t?t.pmremVersion:-1,s=this._value;r!==s.pmremVersion&&(t=!0===s.isPMREMTexture?s:pf(s,e.renderer,this._generator),null!==t&&(this._pmrem=t,this.updateFromTexture(t)))}setup(e){null===this._generator&&(this._generator=new af(e.renderer)),this.updateBefore(e);let t=this.uvNode;null===t&&e.context.getUV&&(t=e.context.getUV(this,e)),t=nc.mul(vn(t.x,t.y.negate(),t.z));let r=this.levelNode;return null===r&&e.context.getTextureLevel&&(r=e.context.getTextureLevel(this)),Om(this._texture,t,r,this._width,this._height,this._maxMip)}dispose(){super.dispose(),null!==this._generator&&this._generator.dispose()}}const mf=rn(gf).setParameterLength(1,3),ff=new WeakMap;class yf extends mp{static get type(){return"EnvironmentNode"}constructor(e=null){super(),this.envNode=e}setup(e){const{material:t}=e;let r=this.envNode;if(r.isTextureNode||r.isMaterialReferenceNode){const e=r.isTextureNode?r.value:t[r.property];let s=ff.get(e);void 0===s&&(s=mf(e),ff.set(e,s)),r=s}const s=!0===t.useAnisotropy||t.anisotropy>0?Hc:jd,i=r.context(bf(Gn,s)).mul(ic),n=r.context(xf(Xd)).mul(Math.PI).mul(ic),a=al(i),o=al(n);e.context.radiance.addAssign(a),e.context.iblIrradiance.addAssign(o);const u=e.context.lightingModel.clearcoatRadiance;if(u){const e=r.context(bf(Wn,Kd)).mul(ic),t=al(e);u.addAssign(t)}}}const bf=(e,t)=>{let r=null;return{getUV:()=>(null===r&&(r=Id.negate().reflect(t),r=tu(e).mix(r,t).normalize(),r=r.transformDirection(id)),r),getTextureLevel:()=>e}},xf=e=>({getUV:()=>e,getTextureLevel:()=>gn(1)}),Tf=new we;class _f extends Qp{static get type(){return"MeshStandardNodeMaterial"}constructor(e){super(),this.isMeshStandardNodeMaterial=!0,this.lights=!0,this.emissiveNode=null,this.metalnessNode=null,this.roughnessNode=null,this.setDefaultValues(Tf),this.setValues(e)}setupEnvironment(e){let t=super.setupEnvironment(e);return null===t&&e.environmentNode&&(t=e.environmentNode),t?new yf(t):null}setupLightingModel(){return new _m}setupSpecular(){const e=nu(vn(.04),On.rgb,zn);ea.assign(vn(.04)),ta.assign(e),ra.assign(1)}setupVariants(){const e=this.metalnessNode?gn(this.metalnessNode):ph;zn.assign(e);let t=this.roughnessNode?gn(this.roughnessNode):hh;t=Cg({roughness:t}),Gn.assign(t),this.setupSpecular(),Vn.assign(On.rgb.mul(e.oneMinus()))}copy(e){return this.emissiveNode=e.emissiveNode,this.metalnessNode=e.metalnessNode,this.roughnessNode=e.roughnessNode,super.copy(e)}}const vf=new Ce;class Nf extends _f{static get type(){return"MeshPhysicalNodeMaterial"}constructor(e){super(),this.isMeshPhysicalNodeMaterial=!0,this.clearcoatNode=null,this.clearcoatRoughnessNode=null,this.clearcoatNormalNode=null,this.sheenNode=null,this.sheenRoughnessNode=null,this.iridescenceNode=null,this.iridescenceIORNode=null,this.iridescenceThicknessNode=null,this.specularIntensityNode=null,this.specularColorNode=null,this.iorNode=null,this.transmissionNode=null,this.thicknessNode=null,this.attenuationDistanceNode=null,this.attenuationColorNode=null,this.dispersionNode=null,this.anisotropyNode=null,this.setDefaultValues(vf),this.setValues(e)}get useClearcoat(){return this.clearcoat>0||null!==this.clearcoatNode}get useIridescence(){return this.iridescence>0||null!==this.iridescenceNode}get useSheen(){return this.sheen>0||null!==this.sheenNode}get useAnisotropy(){return this.anisotropy>0||null!==this.anisotropyNode}get useTransmission(){return this.transmission>0||null!==this.transmissionNode}get useDispersion(){return this.dispersion>0||null!==this.dispersionNode}setupSpecular(){const e=this.iorNode?gn(this.iorNode):Eh;ua.assign(e),ea.assign(Wo(Jo(ua.sub(1).div(ua.add(1))).mul(lh),vn(1)).mul(uh)),ta.assign(nu(ea,On.rgb,zn)),ra.assign(nu(uh,1,zn))}setupLightingModel(){return new _m(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion)}setupVariants(e){if(super.setupVariants(e),this.useClearcoat){const e=this.clearcoatNode?gn(this.clearcoatNode):mh,t=this.clearcoatRoughnessNode?gn(this.clearcoatRoughnessNode):fh;$n.assign(e),Wn.assign(Cg({roughness:t}))}if(this.useSheen){const e=this.sheenNode?vn(this.sheenNode):xh,t=this.sheenRoughnessNode?gn(this.sheenRoughnessNode):Th;Hn.assign(e),qn.assign(t)}if(this.useIridescence){const e=this.iridescenceNode?gn(this.iridescenceNode):vh,t=this.iridescenceIORNode?gn(this.iridescenceIORNode):Nh,r=this.iridescenceThicknessNode?gn(this.iridescenceThicknessNode):Sh;jn.assign(e),Xn.assign(t),Kn.assign(r)}if(this.useAnisotropy){const e=(this.anisotropyNode?bn(this.anisotropyNode):_h).toVar();Qn.assign(e.length()),cn(Qn.equal(0),()=>{e.assign(bn(1,0))}).Else(()=>{e.divAssign(bn(Qn)),Qn.assign(Qn.saturate())}),Yn.assign(Qn.pow2().mix(Gn.pow2(),1)),Zn.assign($c[0].mul(e.x).add($c[1].mul(e.y))),Jn.assign($c[1].mul(e.x).sub($c[0].mul(e.y)))}if(this.useTransmission){const e=this.transmissionNode?gn(this.transmissionNode):Rh,t=this.thicknessNode?gn(this.thicknessNode):Ah,r=this.attenuationDistanceNode?gn(this.attenuationDistanceNode):wh,s=this.attenuationColorNode?vn(this.attenuationColorNode):Ch;if(la.assign(e),da.assign(t),ca.assign(r),ha.assign(s),this.useDispersion){const e=this.dispersionNode?gn(this.dispersionNode):Uh;pa.assign(e)}}}setupClearcoatNormal(){return this.clearcoatNormalNode?vn(this.clearcoatNormalNode):yh}setup(e){e.context.setupClearcoatNormal=()=>Lu(this.setupClearcoatNormal(e),"NORMAL","vec3"),super.setup(e)}copy(e){return this.clearcoatNode=e.clearcoatNode,this.clearcoatRoughnessNode=e.clearcoatRoughnessNode,this.clearcoatNormalNode=e.clearcoatNormalNode,this.sheenNode=e.sheenNode,this.sheenRoughnessNode=e.sheenRoughnessNode,this.iridescenceNode=e.iridescenceNode,this.iridescenceIORNode=e.iridescenceIORNode,this.iridescenceThicknessNode=e.iridescenceThicknessNode,this.specularIntensityNode=e.specularIntensityNode,this.specularColorNode=e.specularColorNode,this.transmissionNode=e.transmissionNode,this.thicknessNode=e.thicknessNode,this.attenuationDistanceNode=e.attenuationDistanceNode,this.attenuationColorNode=e.attenuationColorNode,this.dispersionNode=e.dispersionNode,this.anisotropyNode=e.anisotropyNode,super.copy(e)}}class Sf extends _m{constructor(e=!1,t=!1,r=!1,s=!1,i=!1,n=!1,a=!1){super(e,t,r,s,i,n),this.useSSS=a}direct({lightDirection:e,lightColor:t,reflectedLight:r},s){if(!0===this.useSSS){const i=s.material,{thicknessColorNode:n,thicknessDistortionNode:a,thicknessAmbientNode:o,thicknessAttenuationNode:u,thicknessPowerNode:l,thicknessScaleNode:d}=i,c=e.add(jd.mul(a)).normalize(),h=gn(Id.dot(c.negate()).saturate().pow(l).mul(d)),p=vn(h.add(o).mul(n));r.directDiffuse.addAssign(p.mul(u.mul(t)))}super.direct({lightDirection:e,lightColor:t,reflectedLight:r},s)}}class Rf extends Nf{static get type(){return"MeshSSSNodeMaterial"}constructor(e){super(e),this.thicknessColorNode=null,this.thicknessDistortionNode=gn(.1),this.thicknessAmbientNode=gn(0),this.thicknessAttenuationNode=gn(.1),this.thicknessPowerNode=gn(2),this.thicknessScaleNode=gn(10)}get useSSS(){return null!==this.thicknessColorNode}setupLightingModel(){return new Sf(this.useClearcoat,this.useSheen,this.useIridescence,this.useAnisotropy,this.useTransmission,this.useDispersion,this.useSSS)}copy(e){return this.thicknessColorNode=e.thicknessColorNode,this.thicknessDistortionNode=e.thicknessDistortionNode,this.thicknessAmbientNode=e.thicknessAmbientNode,this.thicknessAttenuationNode=e.thicknessAttenuationNode,this.thicknessPowerNode=e.thicknessPowerNode,this.thicknessScaleNode=e.thicknessScaleNode,super.copy(e)}}const Af=un(({normal:e,lightDirection:t,builder:r})=>{const s=e.dot(t),i=bn(s.mul(.5).add(.5),0);if(r.material.gradientMap){const e=xc("gradientMap","texture").context({getUV:()=>i});return vn(e.r)}{const e=i.fwidth().mul(.5);return nu(vn(.7),vn(1),lu(gn(.7).sub(e.x),gn(.7).add(e.x),i.x))}});class Ef extends mg{direct({lightDirection:e,lightColor:t,reflectedLight:r},s){const i=Af({normal:zd,lightDirection:e,builder:s}).mul(t);r.directDiffuse.addAssign(i.mul(Tg({diffuseColor:On.rgb})))}indirect(e){const{ambientOcclusion:t,irradiance:r,reflectedLight:s}=e.context;s.indirectDiffuse.addAssign(r.mul(Tg({diffuseColor:On}))),s.indirectDiffuse.mulAssign(t)}}const wf=new Me;class Cf extends Qp{static get type(){return"MeshToonNodeMaterial"}constructor(e){super(),this.isMeshToonNodeMaterial=!0,this.lights=!0,this.setDefaultValues(wf),this.setValues(e)}setupLightingModel(){return new Ef}}const Mf=un(()=>{const e=vn(Id.z,0,Id.x.negate()).normalize(),t=Id.cross(e);return bn(e.dot(jd),t.dot(jd)).mul(.495).add(.5)}).once(["NORMAL","VERTEX"])().toVar("matcapUV"),Bf=new Be;class Lf extends Qp{static get type(){return"MeshMatcapNodeMaterial"}constructor(e){super(),this.isMeshMatcapNodeMaterial=!0,this.setDefaultValues(Bf),this.setValues(e)}setupVariants(e){const t=Mf;let r;r=e.material.matcap?xc("matcap","texture").context({getUV:()=>t}):vn(nu(.2,.8,t.y)),On.rgb.mulAssign(r.rgb)}}class Ff extends ci{static get type(){return"RotateNode"}constructor(e,t){super(),this.positionNode=e,this.rotationNode=t}getNodeType(e){return this.positionNode.getNodeType(e)}setup(e){const{rotationNode:t,positionNode:r}=this;if("vec2"===this.getNodeType(e)){const e=t.cos(),s=t.sin();return Mn(e,s,s.negate(),e).mul(r)}{const e=t,s=Ln(An(1,0,0,0),An(0,Ro(e.x),So(e.x).negate(),0),An(0,So(e.x),Ro(e.x),0),An(0,0,0,1)),i=Ln(An(Ro(e.y),0,So(e.y),0),An(0,1,0,0),An(So(e.y).negate(),0,Ro(e.y),0),An(0,0,0,1)),n=Ln(An(Ro(e.z),So(e.z).negate(),0,0),An(So(e.z),Ro(e.z),0,0),An(0,0,1,0),An(0,0,0,1));return s.mul(i).mul(n).mul(An(r,1)).xyz}}}const Pf=rn(Ff).setParameterLength(2),Df=new Le;class Uf extends Qp{static get type(){return"SpriteNodeMaterial"}constructor(e){super(),this.isSpriteNodeMaterial=!0,this._useSizeAttenuation=!0,this.positionNode=null,this.rotationNode=null,this.scaleNode=null,this.transparent=!0,this.setDefaultValues(Df),this.setValues(e)}setupPositionView(e){const{object:t,camera:r}=e,{positionNode:s,rotationNode:i,scaleNode:n,sizeAttenuation:a}=this,o=Ad.mul(vn(s||0));let u=bn(xd[0].xyz.length(),xd[1].xyz.length());null!==n&&(u=u.mul(bn(n))),r.isPerspectiveCamera&&!1===a&&(u=u.mul(o.z.negate()));let l=Bd.xy;if(t.center&&!0===t.center.isVector2){const e=((e,t,r)=>new $u(e,t,r))("center","vec2",t);l=l.sub(e.sub(.5))}l=l.mul(u);const d=gn(i||bh),c=Pf(l,d);return An(o.xy.add(c),o.zw)}copy(e){return this.positionNode=e.positionNode,this.rotationNode=e.rotationNode,this.scaleNode=e.scaleNode,super.copy(e)}get sizeAttenuation(){return this._useSizeAttenuation}set sizeAttenuation(e){this._useSizeAttenuation!==e&&(this._useSizeAttenuation=e,this.needsUpdate=!0)}}const If=new Fe,Of=new t;class Vf extends Uf{static get type(){return"PointsNodeMaterial"}constructor(e){super(),this.sizeNode=null,this.isPointsNodeMaterial=!0,this.setDefaultValues(If),this.setValues(e)}setupPositionView(){const{positionNode:e}=this;return Ad.mul(vn(e||Ld)).xyz}setupVertexSprite(e){const{material:t,camera:r}=e,{rotationNode:s,scaleNode:i,sizeNode:n,sizeAttenuation:a}=this;let o=super.setupVertex(e);if(!0!==t.isNodeMaterial)return o;let u=null!==n?bn(n):Dh;u=u.mul(Wl),r.isPerspectiveCamera&&!0===a&&(u=u.mul(kf.div(Ud.z.negate()))),i&&i.isNode&&(u=u.mul(bn(i)));let l=Bd.xy;if(s&&s.isNode){const e=gn(s);l=Pf(l,e)}return l=l.mul(u),l=l.div(Kl.div(2)),l=l.mul(o.w),o=o.add(An(l,0,0)),o}setupVertex(e){return e.object.isPoints?super.setupVertex(e):this.setupVertexSprite(e)}get alphaToCoverage(){return this._useAlphaToCoverage}set alphaToCoverage(e){this._useAlphaToCoverage!==e&&(this._useAlphaToCoverage=e,this.needsUpdate=!0)}}const kf=_a(1).onFrameUpdate(function({renderer:e}){const t=e.getSize(Of);this.value=.5*t.y});class Gf extends mg{constructor(){super(),this.shadowNode=gn(1).toVar("shadowMask")}direct({lightNode:e}){null!==e.shadowNode&&this.shadowNode.mulAssign(e.shadowNode)}finish({context:e}){On.a.mulAssign(this.shadowNode.oneMinus()),e.outgoingLight.rgb.assign(On.rgb)}}const zf=new Pe;class $f extends Qp{static get type(){return"ShadowNodeMaterial"}constructor(e){super(),this.isShadowNodeMaterial=!0,this.lights=!0,this.transparent=!0,this.setDefaultValues(zf),this.setValues(e)}setupLightingModel(){return new Gf}}const Wf=Un("vec3"),Hf=Un("vec3"),qf=Un("vec3");class jf extends mg{constructor(){super()}start(e){const{material:t}=e,r=Un("vec3"),s=Un("vec3");cn(od.sub(Pd).length().greaterThan(Nd.mul(2)),()=>{r.assign(od),s.assign(Pd)}).Else(()=>{r.assign(Pd),s.assign(od)});const i=s.sub(r),n=_a("int").onRenderUpdate(({material:e})=>e.steps),a=i.length().div(n).toVar(),o=i.normalize().toVar(),u=gn(0).toVar(),l=vn(1).toVar();t.offsetNode&&u.addAssign(t.offsetNode.mul(a)),up(n,()=>{const s=r.add(o.mul(u)),i=id.mul(An(s,1)).xyz;let n;null!==t.depthNode&&(Hf.assign(Up(Bp(i.z,ed,td))),e.context.sceneDepthNode=Up(t.depthNode).toVar()),e.context.positionWorld=s,e.context.shadowPositionWorld=s,e.context.positionView=i,Wf.assign(0),t.scatteringNode&&(n=t.scatteringNode({positionRay:s})),super.start(e),n&&Wf.mulAssign(n);const d=Wf.mul(.01).negate().mul(a).exp();l.mulAssign(d),u.addAssign(a)}),qf.addAssign(l.saturate().oneMinus())}scatteringLight(e,t){const r=t.context.sceneDepthNode;r?cn(r.greaterThanEqual(Hf),()=>{Wf.addAssign(e)}):Wf.addAssign(e)}direct({lightNode:e,lightColor:t},r){if(void 0===e.light.distance)return;const s=t.xyz.toVar();s.mulAssign(e.shadowNode),this.scatteringLight(s,r)}directRectArea({lightColor:e,lightPosition:t,halfWidth:r,halfHeight:s},i){const n=t.add(r).sub(s),a=t.sub(r).sub(s),o=t.sub(r).add(s),u=t.add(r).add(s),l=i.context.positionView,d=e.xyz.mul(Kg({P:l,p0:n,p1:a,p2:o,p3:u})).pow(1.5);this.scatteringLight(d,i)}finish(e){e.context.outgoingLight.assign(qf)}}class Xf extends Qp{static get type(){return"VolumeNodeMaterial"}constructor(e){super(),this.isVolumeNodeMaterial=!0,this.steps=25,this.offsetNode=null,this.scatteringNode=null,this.lights=!0,this.transparent=!0,this.side=M,this.depthTest=!1,this.depthWrite=!1,this.setValues(e)}setupLightingModel(){return new jf}}class Kf{constructor(e,t,r){this.renderer=e,this.nodes=t,this.info=r,this._context="undefined"!=typeof self?self:null,this._animationLoop=null,this._requestId=null}start(){const e=(t,r)=>{this._requestId=this._context.requestAnimationFrame(e),!0===this.info.autoReset&&this.info.reset(),this.nodes.nodeFrame.update(),this.info.frame=this.nodes.nodeFrame.frameId,this.renderer._inspector.begin(),null!==this._animationLoop&&this._animationLoop(t,r),this.renderer._inspector.finish()};e()}stop(){this._context.cancelAnimationFrame(this._requestId),this._requestId=null}getAnimationLoop(){return this._animationLoop}setAnimationLoop(e){this._animationLoop=e}getContext(){return this._context}setContext(e){this._context=e}dispose(){this.stop()}}class Yf{constructor(){this.weakMaps={}}_getWeakMap(e){const t=e.length;let r=this.weakMaps[t];return void 0===r&&(r=new WeakMap,this.weakMaps[t]=r),r}get(e){let t=this._getWeakMap(e);for(let r=0;r{this.dispose()},this.onGeometryDispose=()=>{this.attributes=null,this.attributesId=null},this.material.addEventListener("dispose",this.onMaterialDispose),this.geometry.addEventListener("dispose",this.onGeometryDispose)}updateClipping(e){this.clippingContext=e}get clippingNeedsUpdate(){return null!==this.clippingContext&&this.clippingContext.cacheKey!==this.clippingContextCacheKey&&(this.clippingContextCacheKey=this.clippingContext.cacheKey,!0)}get hardwareClippingPlanes(){return!0===this.material.hardwareClipping?this.clippingContext.unionClippingCount:0}getNodeBuilderState(){return this._nodeBuilderState||(this._nodeBuilderState=this._nodes.getForRender(this))}getMonitor(){return this._monitor||(this._monitor=this.getNodeBuilderState().observer)}getBindings(){return this._bindings||(this._bindings=this.getNodeBuilderState().createBindings())}getBindingGroup(e){for(const t of this.getBindings())if(t.name===e)return t}getIndex(){return this._geometries.getIndex(this)}getIndirect(){return this._geometries.getIndirect(this)}getIndirectOffset(){return this._geometries.getIndirectOffset(this)}getChainArray(){return[this.object,this.material,this.context,this.lightsNode]}setGeometry(e){this.geometry=e,this.attributes=null,this.attributesId=null}getAttributes(){if(null!==this.attributes)return this.attributes;const e=this.getNodeBuilderState().nodeAttributes,t=this.geometry,r=[],s=new Set,i={};for(const n of e){let e;if(n.node&&n.node.attribute?e=n.node.attribute:(e=t.getAttribute(n.name),i[n.name]=e.id),void 0===e)continue;r.push(e);const a=e.isInterleavedBufferAttribute?e.data:e;s.add(a)}return this.attributes=r,this.attributesId=i,this.vertexBuffers=Array.from(s.values()),r}getVertexBuffers(){return null===this.vertexBuffers&&this.getAttributes(),this.vertexBuffers}getDrawParameters(){const{object:e,material:t,geometry:r,group:s,drawRange:i}=this,n=this.drawParams||(this.drawParams={vertexCount:0,firstVertex:0,instanceCount:0,firstInstance:0}),a=this.getIndex(),o=null!==a;let u=1;if(!0===r.isInstancedBufferGeometry?u=r.instanceCount:void 0!==e.count&&(u=Math.max(0,e.count)),0===u)return null;if(n.instanceCount=u,!0===e.isBatchedMesh)return n;let l=1;!0!==t.wireframe||e.isPoints||e.isLineSegments||e.isLine||e.isLineLoop||(l=2);let d=i.start*l,c=(i.start+i.count)*l;null!==s&&(d=Math.max(d,s.start*l),c=Math.min(c,(s.start+s.count)*l));const h=r.attributes.position;let p=1/0;o?p=a.count:null!=h&&(p=h.count),d=Math.max(d,0),c=Math.min(c,p);const g=c-d;return g<0||g===1/0?null:(n.vertexCount=g,n.firstVertex=d,n)}getGeometryCacheKey(){const{geometry:e}=this;let t="";for(const r of Object.keys(e.attributes).sort()){const s=e.attributes[r];t+=r+",",s.data&&(t+=s.data.stride+","),s.offset&&(t+=s.offset+","),s.itemSize&&(t+=s.itemSize+","),s.normalized&&(t+="n,")}for(const r of Object.keys(e.morphAttributes).sort()){const s=e.morphAttributes[r];t+="morph-"+r+",";for(let e=0,r=s.length;e1||Array.isArray(e.morphTargetInfluences))&&(s+=e.uuid+","),s+=this.context.id+",",s+=e.receiveShadow+",",Us(s)}get needsGeometryUpdate(){if(this.geometry.id!==this.object.geometry.id)return!0;if(null!==this.attributes){const e=this.attributesId;for(const t in e){const r=this.geometry.getAttribute(t);if(void 0===r||e[t]!==r.id)return!0}}return!1}get needsUpdate(){return this.initialNodesCacheKey!==this.getDynamicCacheKey()||this.clippingNeedsUpdate}getDynamicCacheKey(){let e=0;return!0!==this.material.isShadowPassMaterial&&(e=this._nodes.getCacheKey(this.scene,this.lightsNode)),this.camera.isArrayCamera&&(e=Os(e,this.camera.cameras.length)),this.object.receiveShadow&&(e=Os(e,1)),e=Os(e,this.renderer.contextNode.id,this.renderer.contextNode.version),e}getCacheKey(){return this.getMaterialCacheKey()+this.getDynamicCacheKey()}dispose(){this.material.removeEventListener("dispose",this.onMaterialDispose),this.geometry.removeEventListener("dispose",this.onGeometryDispose),this.onDispose()}}const Jf=[];class ey{constructor(e,t,r,s,i,n){this.renderer=e,this.nodes=t,this.geometries=r,this.pipelines=s,this.bindings=i,this.info=n,this.chainMaps={}}get(e,t,r,s,i,n,a,o){const u=this.getChainMap(o);Jf[0]=e,Jf[1]=t,Jf[2]=n,Jf[3]=i;let l=u.get(Jf);return void 0===l?(l=this.createRenderObject(this.nodes,this.geometries,this.renderer,e,t,r,s,i,n,a,o),u.set(Jf,l)):(l.camera=s,l.updateClipping(a),l.needsGeometryUpdate&&l.setGeometry(e.geometry),(l.version!==t.version||l.needsUpdate)&&(l.initialCacheKey!==l.getCacheKey()?(l.dispose(),l=this.get(e,t,r,s,i,n,a,o)):l.version=t.version)),Jf[0]=null,Jf[1]=null,Jf[2]=null,Jf[3]=null,l}getChainMap(e="default"){return this.chainMaps[e]||(this.chainMaps[e]=new Yf)}dispose(){this.chainMaps={}}createRenderObject(e,t,r,s,i,n,a,o,u,l,d){const c=this.getChainMap(d),h=new Zf(e,t,r,s,i,n,a,o,u,l);return h.onDispose=()=>{this.pipelines.delete(h),this.bindings.deleteForRender(h),this.nodes.delete(h),c.delete(h.getChainArray())},h}}class ty{constructor(){this.data=new WeakMap}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}delete(e){let t=null;return this.data.has(e)&&(t=this.data.get(e),this.data.delete(e)),t}has(e){return this.data.has(e)}dispose(){this.data=new WeakMap}}const ry=1,sy=2,iy=3,ny=4,ay=16;class oy extends ty{constructor(e){super(),this.backend=e}delete(e){const t=super.delete(e);return null!==t&&this.backend.destroyAttribute(e),t}update(e,t){const r=this.get(e);if(void 0===r.version)t===ry?this.backend.createAttribute(e):t===sy?this.backend.createIndexAttribute(e):t===iy?this.backend.createStorageAttribute(e):t===ny&&this.backend.createIndirectStorageAttribute(e),r.version=this._getBufferAttribute(e).version;else{const t=this._getBufferAttribute(e);(r.version{this.info.memory.geometries--;const s=t.index,i=e.getAttributes();null!==s&&this.attributes.delete(s);for(const e of i)this.attributes.delete(e);const n=this.wireframes.get(t);void 0!==n&&this.attributes.delete(n),t.removeEventListener("dispose",r),this._geometryDisposeListeners.delete(t)};t.addEventListener("dispose",r),this._geometryDisposeListeners.set(t,r)}updateAttributes(e){const t=e.getAttributes();for(const e of t)e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute?this.updateAttribute(e,iy):this.updateAttribute(e,ry);const r=this.getIndex(e);null!==r&&this.updateAttribute(r,sy);const s=e.geometry.indirect;null!==s&&this.updateAttribute(s,ny)}updateAttribute(e,t){const r=this.info.render.calls;e.isInterleavedBufferAttribute?void 0===this.attributeCall.get(e)?(this.attributes.update(e,t),this.attributeCall.set(e,r)):this.attributeCall.get(e.data)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e.data,r),this.attributeCall.set(e,r)):this.attributeCall.get(e)!==r&&(this.attributes.update(e,t),this.attributeCall.set(e,r))}getIndirect(e){return e.geometry.indirect}getIndirectOffset(e){return e.geometry.indirectOffset}getIndex(e){const{geometry:t,material:r}=e;let s=t.index;if(!0===r.wireframe){const e=this.wireframes;let r=e.get(t);void 0===r?(r=ly(t),e.set(t,r)):r.version!==uy(t)&&(this.attributes.delete(r),r=ly(t),e.set(t,r)),s=r}return s}dispose(){for(const[e,t]of this._geometryDisposeListeners.entries())e.removeEventListener("dispose",t);this._geometryDisposeListeners.clear()}}class cy{constructor(){this.autoReset=!0,this.frame=0,this.calls=0,this.render={calls:0,frameCalls:0,drawCalls:0,triangles:0,points:0,lines:0,timestamp:0},this.compute={calls:0,frameCalls:0,timestamp:0},this.memory={geometries:0,textures:0}}update(e,t,r){this.render.drawCalls++,e.isMesh||e.isSprite?this.render.triangles+=r*(t/3):e.isPoints?this.render.points+=r*t:e.isLineSegments?this.render.lines+=r*(t/2):e.isLine?this.render.lines+=r*(t-1):o("WebGPUInfo: Unknown object type.")}reset(){this.render.drawCalls=0,this.render.frameCalls=0,this.compute.frameCalls=0,this.render.triangles=0,this.render.points=0,this.render.lines=0}dispose(){this.reset(),this.calls=0,this.render.calls=0,this.compute.calls=0,this.render.timestamp=0,this.compute.timestamp=0,this.memory.geometries=0,this.memory.textures=0}}class hy{constructor(e){this.cacheKey=e,this.usedTimes=0}}class py extends hy{constructor(e,t,r){super(e),this.vertexProgram=t,this.fragmentProgram=r}}class gy extends hy{constructor(e,t){super(e),this.computeProgram=t,this.isComputePipeline=!0}}let my=0;class fy{constructor(e,t,r,s=null,i=null){this.id=my++,this.code=e,this.stage=t,this.name=r,this.transforms=s,this.attributes=i,this.usedTimes=0}}class yy extends ty{constructor(e,t){super(),this.backend=e,this.nodes=t,this.bindings=null,this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}getForCompute(e,t){const{backend:r}=this,s=this.get(e);if(this._needsComputeUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.computeProgram.usedTimes--);const n=this.nodes.getForCompute(e);let a=this.programs.compute.get(n.computeShader);void 0===a&&(i&&0===i.computeProgram.usedTimes&&this._releaseProgram(i.computeProgram),a=new fy(n.computeShader,"compute",e.name,n.transforms,n.nodeAttributes),this.programs.compute.set(n.computeShader,a),r.createProgram(a));const o=this._getComputeCacheKey(e,a);let u=this.caches.get(o);void 0===u&&(i&&0===i.usedTimes&&this._releasePipeline(i),u=this._getComputePipeline(e,a,o,t)),u.usedTimes++,a.usedTimes++,s.version=e.version,s.pipeline=u}return s.pipeline}getForRender(e,t=null){const{backend:r}=this,s=this.get(e);if(this._needsRenderUpdate(e)){const i=s.pipeline;i&&(i.usedTimes--,i.vertexProgram.usedTimes--,i.fragmentProgram.usedTimes--);const n=e.getNodeBuilderState(),a=e.material?e.material.name:"";let o=this.programs.vertex.get(n.vertexShader);void 0===o&&(i&&0===i.vertexProgram.usedTimes&&this._releaseProgram(i.vertexProgram),o=new fy(n.vertexShader,"vertex",a),this.programs.vertex.set(n.vertexShader,o),r.createProgram(o));let u=this.programs.fragment.get(n.fragmentShader);void 0===u&&(i&&0===i.fragmentProgram.usedTimes&&this._releaseProgram(i.fragmentProgram),u=new fy(n.fragmentShader,"fragment",a),this.programs.fragment.set(n.fragmentShader,u),r.createProgram(u));const l=this._getRenderCacheKey(e,o,u);let d=this.caches.get(l);void 0===d?(i&&0===i.usedTimes&&this._releasePipeline(i),d=this._getRenderPipeline(e,o,u,l,t)):e.pipeline=d,d.usedTimes++,o.usedTimes++,u.usedTimes++,s.pipeline=d}return s.pipeline}delete(e){const t=this.get(e).pipeline;return t&&(t.usedTimes--,0===t.usedTimes&&this._releasePipeline(t),t.isComputePipeline?(t.computeProgram.usedTimes--,0===t.computeProgram.usedTimes&&this._releaseProgram(t.computeProgram)):(t.fragmentProgram.usedTimes--,t.vertexProgram.usedTimes--,0===t.vertexProgram.usedTimes&&this._releaseProgram(t.vertexProgram),0===t.fragmentProgram.usedTimes&&this._releaseProgram(t.fragmentProgram))),super.delete(e)}dispose(){super.dispose(),this.caches=new Map,this.programs={vertex:new Map,fragment:new Map,compute:new Map}}updateForRender(e){this.getForRender(e)}_getComputePipeline(e,t,r,s){r=r||this._getComputeCacheKey(e,t);let i=this.caches.get(r);return void 0===i&&(i=new gy(r,t),this.caches.set(r,i),this.backend.createComputePipeline(i,s)),i}_getRenderPipeline(e,t,r,s,i){s=s||this._getRenderCacheKey(e,t,r);let n=this.caches.get(s);return void 0===n&&(n=new py(s,t,r),this.caches.set(s,n),e.pipeline=n,this.backend.createRenderPipeline(e,i)),n}_getComputeCacheKey(e,t){return e.id+","+t.id}_getRenderCacheKey(e,t,r){return t.id+","+r.id+","+this.backend.getRenderCacheKey(e)}_releasePipeline(e){this.caches.delete(e.cacheKey)}_releaseProgram(e){const t=e.code,r=e.stage;this.programs[r].delete(t)}_needsComputeUpdate(e){const t=this.get(e);return void 0===t.pipeline||t.version!==e.version}_needsRenderUpdate(e){return void 0===this.get(e).pipeline||this.backend.needsRenderUpdate(e)}}class by extends ty{constructor(e,t,r,s,i,n){super(),this.backend=e,this.textures=r,this.pipelines=i,this.attributes=s,this.nodes=t,this.info=n,this.pipelines.bindings=this}getForRender(e){const t=e.getBindings();for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}getForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t){const r=this.get(e);void 0===r.bindGroup&&(this._init(e),this.backend.createBindings(e,t,0),r.bindGroup=e)}return t}updateForCompute(e){this._updateBindings(this.getForCompute(e))}updateForRender(e){this._updateBindings(this.getForRender(e))}deleteForCompute(e){const t=this.nodes.getForCompute(e).bindings;for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}deleteForRender(e){const t=e.getBindings();for(const e of t)this.backend.deleteBindGroupData(e),this.delete(e)}_updateBindings(e){for(const t of e)this._update(t,e)}_init(e){for(const t of e.bindings)if(t.isSampledTexture)this.textures.updateTexture(t.texture);else if(t.isSampler)this.textures.updateSampler(t.texture);else if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}}_update(e,t){const{backend:r}=this;let s=!1,i=!0,n=0,a=0;for(const t of e.bindings){if(!1!==this.nodes.updateGroup(t)){if(t.isStorageBuffer){const e=t.attribute,r=e.isIndirectStorageBufferAttribute?ny:iy;this.attributes.update(e,r)}if(t.isUniformBuffer){t.update()&&r.updateBinding(t)}else if(t.isSampledTexture){const e=t.update(),o=t.texture,u=this.textures.get(o);e&&(this.textures.updateTexture(o),t.generation!==u.generation&&(t.generation=u.generation,s=!0,i=!1));if(void 0!==r.get(o).externalTexture||u.isDefaultTexture?i=!1:(n=10*n+o.id,a+=o.version),!0===o.isStorageTexture&&!0===o.mipmapsAutoUpdate){const e=this.get(o);!0===t.store?e.needsMipmap=!0:this.textures.needsMipmaps(o)&&!0===e.needsMipmap&&(this.backend.generateMipmaps(o),e.needsMipmap=!1)}}else if(t.isSampler){if(t.update()){const e=this.textures.updateSampler(t.texture);t.samplerKey!==e&&(t.samplerKey=e,s=!0,i=!1)}}t.isBuffer&&t.updateRanges.length>0&&t.clearUpdateRanges()}}!0===s&&this.backend.updateBindings(e,t,i?n:0,a)}}function xy(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?e.z-t.z:e.id-t.id}function Ty(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function _y(e){return(e.transmission>0||e.transmissionNode&&e.transmissionNode.isNode)&&e.side===B&&!1===e.forceSinglePass}class vy{constructor(e,t,r){this.renderItems=[],this.renderItemsIndex=0,this.opaque=[],this.transparentDoublePass=[],this.transparent=[],this.bundles=[],this.lightsNode=e.getNode(t,r),this.lightsArray=[],this.scene=t,this.camera=r,this.occlusionQueryCount=0}begin(){return this.renderItemsIndex=0,this.opaque.length=0,this.transparentDoublePass.length=0,this.transparent.length=0,this.bundles.length=0,this.lightsArray.length=0,this.occlusionQueryCount=0,this}getNextRenderItem(e,t,r,s,i,n,a){let o=this.renderItems[this.renderItemsIndex];return void 0===o?(o={id:e.id,object:e,geometry:t,material:r,groupOrder:s,renderOrder:e.renderOrder,z:i,group:n,clippingContext:a},this.renderItems[this.renderItemsIndex]=o):(o.id=e.id,o.object=e,o.geometry=t,o.material=r,o.groupOrder=s,o.renderOrder=e.renderOrder,o.z=i,o.group=n,o.clippingContext=a),this.renderItemsIndex++,o}push(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===e.occlusionTest&&this.occlusionQueryCount++,!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.push(o),this.transparent.push(o)):this.opaque.push(o)}unshift(e,t,r,s,i,n,a){const o=this.getNextRenderItem(e,t,r,s,i,n,a);!0===r.transparent||r.transmission>0||r.transmissionNode&&r.transmissionNode.isNode||r.backdropNode&&r.backdropNode.isNode?(_y(r)&&this.transparentDoublePass.unshift(o),this.transparent.unshift(o)):this.opaque.unshift(o)}pushBundle(e){this.bundles.push(e)}pushLight(e){this.lightsArray.push(e)}sort(e,t){this.opaque.length>1&&this.opaque.sort(e||xy),this.transparentDoublePass.length>1&&this.transparentDoublePass.sort(t||Ty),this.transparent.length>1&&this.transparent.sort(t||Ty)}finish(){this.lightsNode.setLights(this.lightsArray);for(let e=this.renderItemsIndex,t=this.renderItems.length;e>t,u=a.height>>t;let l=e.depthTexture||i[t];const d=!0===e.depthBuffer||!0===e.stencilBuffer;let c=!1;void 0===l&&d&&(l=new Y,l.format=e.stencilBuffer?Oe:Ve,l.type=e.stencilBuffer?ke:S,l.image.width=o,l.image.height=u,l.image.depth=a.depth,l.renderTarget=e,l.isArrayTexture=!0===e.multiview&&a.depth>1,i[t]=l),r.width===a.width&&a.height===r.height||(c=!0,l&&(l.needsUpdate=!0,l.image.width=o,l.image.height=u,l.image.depth=l.isArrayTexture?l.image.depth:1)),r.width=a.width,r.height=a.height,r.textures=n,r.depthTexture=l||null,r.depth=e.depthBuffer,r.stencil=e.stencilBuffer,r.renderTarget=e,r.sampleCount!==s&&(c=!0,l&&(l.needsUpdate=!0),r.sampleCount=s);const h={sampleCount:s};if(!0!==e.isXRRenderTarget){for(let e=0;e{this._destroyRenderTarget(e)},e.addEventListener("dispose",r.onDispose))}updateTexture(e,t={}){const r=this.get(e);if(!0===r.initialized&&r.version===e.version)return;const s=e.isRenderTargetTexture||e.isDepthTexture||e.isFramebufferTexture,i=this.backend;if(s&&!0===r.initialized&&i.destroyTexture(e),e.isFramebufferTexture){const t=this.renderer.getRenderTarget();e.type=t?t.texture.type:Ge}const{width:n,height:a,depth:o}=this.getSize(e);if(t.width=n,t.height=a,t.depth=o,t.needsMipmaps=this.needsMipmaps(e),t.levels=t.needsMipmaps?this.getMipLevels(e,n,a):1,e.isCubeTexture&&e.mipmaps.length>0&&t.levels++,s||!0===e.isStorageTexture||!0===e.isExternalTexture)i.createTexture(e,t),r.generation=e.version;else if(e.version>0){const s=e.image;if(void 0===s)d("Renderer: Texture marked for update but image is undefined.");else if(!1===s.complete)d("Renderer: Texture marked for update but image is incomplete.");else{if(e.images){const r=[];for(const t of e.images)r.push(t);t.images=r}else t.image=s;void 0!==r.isDefaultTexture&&!0!==r.isDefaultTexture||(i.createTexture(e,t),r.isDefaultTexture=!1,r.generation=e.version),!0===e.source.dataReady&&i.updateTexture(e,t);const n=!0===e.isStorageTexture&&!1===e.mipmapsAutoUpdate;t.needsMipmaps&&0===e.mipmaps.length&&!n&&i.generateMipmaps(e),e.onUpdate&&e.onUpdate(e)}}else i.createDefaultTexture(e),r.isDefaultTexture=!0,r.generation=e.version;!0!==r.initialized&&(r.initialized=!0,r.generation=e.version,this.info.memory.textures++,e.isVideoTexture&&!0===p.enabled&&p.getTransfer(e.colorSpace)!==g&&d("WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace."),r.onDispose=()=>{this._destroyTexture(e)},e.addEventListener("dispose",r.onDispose)),r.version=e.version}updateSampler(e){return this.backend.updateSampler(e)}getSize(e,t=Cy){let r=e.images?e.images[0]:e.image;return r?(void 0!==r.image&&(r=r.image),"undefined"!=typeof HTMLVideoElement&&r instanceof HTMLVideoElement?(t.width=r.videoWidth||1,t.height=r.videoHeight||1,t.depth=1):"undefined"!=typeof VideoFrame&&r instanceof VideoFrame?(t.width=r.displayWidth||1,t.height=r.displayHeight||1,t.depth=1):(t.width=r.width||1,t.height=r.height||1,t.depth=e.isCubeTexture?6:r.depth||1)):t.width=t.height=t.depth=1,t}getMipLevels(e,t,r){let s;return s=e.mipmaps.length>0?e.mipmaps.length:!0===e.isCompressedTexture?1:Math.floor(Math.log2(Math.max(t,r)))+1,s}needsMipmaps(e){return!0===e.generateMipmaps||e.mipmaps.length>0}_destroyRenderTarget(e){if(!0===this.has(e)){const t=this.get(e),r=t.textures,s=t.depthTexture;e.removeEventListener("dispose",t.onDispose);for(let e=0;e=2)for(let r=0;r{if(this._currentNode=t,!t.isVarNode||!t.isIntent(e)||!0===t.isAssign(e))if("setup"===s)t.build(e);else if("analyze"===s)t.build(e,this);else if("generate"===s){const r=e.getDataFromNode(t,"any").stages,s=r&&r[e.shaderStage];if(t.isVarNode&&s&&1===s.length&&s[0]&&s[0].isStackNode)return;t.build(e,"void")}},n=[...this.nodes];for(const e of n)i(e);this._currentNode=null;const a=this.nodes.filter(e=>-1===n.indexOf(e));for(const e of a)i(e);let o;return o=this.hasOutput(e)?this.outputNode.build(e,...t):super.build(e,...t),ln(r),e.removeActiveStack(this),o}}const Py=rn(Fy).setParameterLength(0,1);class Dy extends ui{static get type(){return"StructTypeNode"}constructor(e,t=null){var r;super("struct"),this.membersLayout=(r=e,Object.entries(r).map(([e,t])=>"string"==typeof t?{name:e,type:t,atomic:!1}:{name:e,type:t.type,atomic:t.atomic||!1})),this.name=t,this.isStructLayoutNode=!0}getLength(){const e=Float32Array.BYTES_PER_ELEMENT;let t=1,r=0;for(const s of this.membersLayout){const i=s.type,n=Ws(i),a=Hs(i)/e;t=Math.max(t,a);const o=r%t%a;0!==o&&(r+=a-o),r+=n}return Math.ceil(r/t)*t}getMemberType(e,t){const r=this.membersLayout.find(e=>e.name===t);return r?r.type:"void"}getNodeType(e){return e.getStructTypeFromNode(this,this.membersLayout,this.name).name}setup(e){e.getStructTypeFromNode(this,this.membersLayout,this.name),e.addInclude(this)}generate(e){return this.getNodeType(e)}}class Uy extends ui{static get type(){return"StructNode"}constructor(e,t){super("vec3"),this.structTypeNode=e,this.values=t,this.isStructNode=!0}getNodeType(e){return this.structTypeNode.getNodeType(e)}getMemberType(e,t){return this.structTypeNode.getMemberType(e,t)}_getChildren(){const e=super._getChildren(),t=e.find(e=>e.childNode===this.structTypeNode);return e.splice(e.indexOf(t),1),e.push(t),e}generate(e){const t=e.getVarFromNode(this),r=t.type,s=e.getPropertyName(t);return e.addLineFlowCode(`${s} = ${e.generateStruct(r,this.structTypeNode.membersLayout,this.values)}`,this),t.name}}class Iy extends ui{static get type(){return"OutputStructNode"}constructor(...e){super(),this.members=e,this.isOutputStructNode=!0}getNodeType(){return"OutputType"}generate(e){const t=e.getDataFromNode(this);if(void 0===t.membersLayout){const r=this.members,s=[];for(let t=0;tnew Hy(e,"uint","float"),Xy={};class Ky extends ro{static get type(){return"BitcountNode"}constructor(e,t){super(e,t),this.isBitcountNode=!0}_resolveElementType(e,t,r){"int"===r?t.assign(qy(e,"uint")):t.assign(e)}_returnDataNode(e){switch(e){case"uint":return fn;case"int":return mn;case"uvec2":return Tn;case"uvec3":return Sn;case"uvec4":return wn;case"ivec2":return xn;case"ivec3":return Nn;case"ivec4":return En}}_createTrailingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t);const i=gn(s.bitAnd(Fo(s))),n=jy(i).shiftRight(23).sub(127);return r(n)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createLeadingZerosBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{cn(e.equal(fn(0)),()=>fn(32));const s=fn(0),i=fn(0);return this._resolveElementType(e,s,t),cn(s.shiftRight(16).equal(0),()=>{i.addAssign(16),s.shiftLeftAssign(16)}),cn(s.shiftRight(24).equal(0),()=>{i.addAssign(8),s.shiftLeftAssign(8)}),cn(s.shiftRight(28).equal(0),()=>{i.addAssign(4),s.shiftLeftAssign(4)}),cn(s.shiftRight(30).equal(0),()=>{i.addAssign(2),s.shiftLeftAssign(2)}),cn(s.shiftRight(31).equal(0),()=>{i.addAssign(1)}),r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createOneBitsBaseLayout(e,t){const r=this._returnDataNode(t);return un(([e])=>{const s=fn(0);this._resolveElementType(e,s,t),s.assign(s.sub(s.shiftRight(fn(1)).bitAnd(fn(1431655765)))),s.assign(s.bitAnd(fn(858993459)).add(s.shiftRight(fn(2)).bitAnd(fn(858993459))));const i=s.add(s.shiftRight(fn(4))).bitAnd(fn(252645135)).mul(fn(16843009)).shiftRight(fn(24));return r(i)}).setLayout({name:e,type:t,inputs:[{name:"value",type:t}]})}_createMainLayout(e,t,r,s){const i=this._returnDataNode(t);return un(([e])=>{if(1===r)return i(s(e));{const t=i(0),n=["x","y","z","w"];for(let i=0;id(r))()}}Ky.COUNT_TRAILING_ZEROS="countTrailingZeros",Ky.COUNT_LEADING_ZEROS="countLeadingZeros",Ky.COUNT_ONE_BITS="countOneBits";const Yy=nn(Ky,Ky.COUNT_TRAILING_ZEROS).setParameterLength(1),Qy=nn(Ky,Ky.COUNT_LEADING_ZEROS).setParameterLength(1),Zy=nn(Ky,Ky.COUNT_ONE_BITS).setParameterLength(1),Jy=un(([e])=>{const t=e.toUint().mul(747796405).add(2891336453),r=t.shiftRight(t.shiftRight(28).add(4)).bitXor(t).mul(277803737);return r.shiftRight(22).bitXor(r).toFloat().mul(1/2**32)}),eb=(e,t)=>Zo(La(4,e.mul(Ba(1,e))),t);class tb extends ci{static get type(){return"PackFloatNode"}constructor(e,t){super(),this.vectorNode=t,this.encoding=e,this.isPackFloatNode=!0}getNodeType(){return"uint"}generate(e){const t=this.vectorNode.getNodeType(e);return`${e.getFloatPackingMethod(this.encoding)}(${this.vectorNode.build(e,t)})`}}const rb=nn(tb,"snorm").setParameterLength(1),sb=nn(tb,"unorm").setParameterLength(1),ib=nn(tb,"float16").setParameterLength(1);class nb extends ci{static get type(){return"UnpackFloatNode"}constructor(e,t){super(),this.uintNode=t,this.encoding=e,this.isUnpackFloatNode=!0}getNodeType(){return"vec2"}generate(e){const t=this.uintNode.getNodeType(e);return`${e.getFloatUnpackingMethod(this.encoding)}(${this.uintNode.build(e,t)})`}}const ab=nn(nb,"snorm").setParameterLength(1),ob=nn(nb,"unorm").setParameterLength(1),ub=nn(nb,"float16").setParameterLength(1),lb=un(([e])=>e.fract().sub(.5).abs()).setLayout({name:"tri",type:"float",inputs:[{name:"x",type:"float"}]}),db=un(([e])=>vn(lb(e.z.add(lb(e.y.mul(1)))),lb(e.z.add(lb(e.x.mul(1)))),lb(e.y.add(lb(e.x.mul(1)))))).setLayout({name:"tri3",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),cb=un(([e,t,r])=>{const s=vn(e).toVar(),i=gn(1.4).toVar(),n=gn(0).toVar(),a=vn(s).toVar();return up({start:gn(0),end:gn(3),type:"float",condition:"<="},()=>{const e=vn(db(a.mul(2))).toVar();s.addAssign(e.add(r.mul(gn(.1).mul(t)))),a.mulAssign(1.8),i.mulAssign(1.5),s.mulAssign(1.2);const o=gn(lb(s.z.add(lb(s.x.add(lb(s.y)))))).toVar();n.addAssign(o.div(i)),a.addAssign(.14)}),n}).setLayout({name:"triNoise3D",type:"float",inputs:[{name:"position",type:"vec3"},{name:"speed",type:"float"},{name:"time",type:"float"}]});class hb extends ui{static get type(){return"FunctionOverloadingNode"}constructor(e=[],...t){super(),this.functionNodes=e,this.parametersNodes=t,this._candidateFn=null,this.global=!0}getNodeType(e){return this.getCandidateFn(e).shaderNode.layout.type}getCandidateFn(e){const t=this.parametersNodes;let r=this._candidateFn;if(null===r){let s=null,i=-1;for(const r of this.functionNodes){const n=r.shaderNode.layout;if(null===n)throw new Error("FunctionOverloadingNode: FunctionNode must be a layout.");const a=n.inputs;if(t.length===a.length){let n=0;for(let r=0;ri&&(s=r,i=n)}}this._candidateFn=r=s}return r}setup(e){return this.getCandidateFn(e)(...this.parametersNodes)}}const pb=rn(hb),gb=e=>(...t)=>pb(e,...t),mb=_a(0).setGroup(ba).onRenderUpdate(e=>e.time),fb=_a(0).setGroup(ba).onRenderUpdate(e=>e.deltaTime),yb=_a(0,"uint").setGroup(ba).onRenderUpdate(e=>e.frameId);const bb=un(([e,t,r=bn(.5)])=>Pf(e.sub(r),t).add(r)),xb=un(([e,t,r=bn(.5)])=>{const s=e.sub(r),i=s.dot(s),n=i.mul(i).mul(t);return e.add(s.mul(n))}),Tb=un(({position:e=null,horizontal:t=!0,vertical:r=!1})=>{let s;null!==e?(s=xd.toVar(),s[3][0]=e.x,s[3][1]=e.y,s[3][2]=e.z):s=xd;const i=id.mul(s);return Ki(t)&&(i[0][0]=xd[0].length(),i[0][1]=0,i[0][2]=0),Ki(r)&&(i[1][0]=0,i[1][1]=xd[1].length(),i[1][2]=0),i[2][0]=0,i[2][1]=0,i[2][2]=1,rd.mul(i).mul(Ld)}),_b=un(([e=null])=>{const t=Up();return Up(wp(e)).sub(t).lessThan(0).select(Hl,e)}),vb=un(([e,t=Rl(),r=gn(0)])=>{const s=e.x,i=e.y,n=r.mod(s.mul(i)).floor(),a=n.mod(s),o=i.sub(n.add(1).div(s).ceil()),u=e.reciprocal(),l=bn(a,o);return t.add(l).mul(u)}),Nb=un(([e,t=null,r=null,s=gn(1),i=Ld,n=$d])=>{let a=n.abs().normalize();a=a.div(a.dot(vn(1)));const o=i.yz.mul(s),u=i.zx.mul(s),l=i.xy.mul(s),d=e.value,c=null!==t?t.value:d,h=null!==r?r.value:d,p=Fl(d,o).mul(a.x),g=Fl(c,u).mul(a.y),m=Fl(h,l).mul(a.z);return Ma(p,g,m)}),Sb=new je,Rb=new r,Ab=new r,Eb=new r,wb=new a,Cb=new r(0,0,-1),Mb=new s,Bb=new r,Lb=new r,Fb=new s,Pb=new t,Db=new Ne,Ub=Hl.flipX();Db.depthTexture=new Y(1,1);let Ib=!1;class Ob extends Bl{static get type(){return"ReflectorNode"}constructor(e={}){super(e.defaultTexture||Db.texture,Ub),this._reflectorBaseNode=e.reflector||new Vb(this,e),this._depthNode=null,this.setUpdateMatrix(!1)}get reflector(){return this._reflectorBaseNode}get target(){return this._reflectorBaseNode.target}getDepthNode(){if(null===this._depthNode){if(!0!==this._reflectorBaseNode.depth)throw new Error("THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ");this._depthNode=Zi(new Ob({defaultTexture:Db.depthTexture,reflector:this._reflectorBaseNode}))}return this._depthNode}setup(e){return e.object.isQuadMesh||this._reflectorBaseNode.build(e),super.setup(e)}clone(){const e=new this.constructor(this.reflectorNode);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e._reflectorBaseNode=this._reflectorBaseNode,e}dispose(){super.dispose(),this._reflectorBaseNode.dispose()}}class Vb extends ui{static get type(){return"ReflectorBaseNode"}constructor(e,t={}){super();const{target:r=new Xe,resolutionScale:s=1,generateMipmaps:i=!1,bounces:n=!0,depth:a=!1,samples:o=0}=t;this.textureNode=e,this.target=r,this.resolutionScale=s,void 0!==t.resolution&&(v('ReflectorNode: The "resolution" parameter has been renamed to "resolutionScale".'),this.resolutionScale=t.resolution),this.generateMipmaps=i,this.bounces=n,this.depth=a,this.samples=o,this.updateBeforeType=n?Js.RENDER:Js.FRAME,this.virtualCameras=new WeakMap,this.renderTargets=new Map,this.forceUpdate=!1,this.hasOutput=!1}_updateResolution(e,t){const r=this.resolutionScale;t.getDrawingBufferSize(Pb),e.setSize(Math.round(Pb.width*r),Math.round(Pb.height*r))}setup(e){return this._updateResolution(Db,e.renderer),super.setup(e)}dispose(){super.dispose();for(const e of this.renderTargets.values())e.dispose()}getVirtualCamera(e){let t=this.virtualCameras.get(e);return void 0===t&&(t=e.clone(),this.virtualCameras.set(e,t)),t}getRenderTarget(e){let t=this.renderTargets.get(e);return void 0===t&&(t=new Ne(0,0,{type:be,samples:this.samples}),!0===this.generateMipmaps&&(t.texture.minFilter=Ke,t.texture.generateMipmaps=!0),!0===this.depth&&(t.depthTexture=new Y),this.renderTargets.set(e,t)),t}updateBefore(e){if(!1===this.bounces&&Ib)return!1;Ib=!0;const{scene:t,camera:r,renderer:s,material:i}=e,{target:n}=this,a=this.getVirtualCamera(r),o=this.getRenderTarget(a);s.getDrawingBufferSize(Pb),this._updateResolution(o,s),Ab.setFromMatrixPosition(n.matrixWorld),Eb.setFromMatrixPosition(r.matrixWorld),wb.extractRotation(n.matrixWorld),Rb.set(0,0,1),Rb.applyMatrix4(wb),Bb.subVectors(Ab,Eb);let u=!1;if(!0===Bb.dot(Rb)>0&&!1===this.forceUpdate){if(!1===this.hasOutput)return void(Ib=!1);u=!0}Bb.reflect(Rb).negate(),Bb.add(Ab),wb.extractRotation(r.matrixWorld),Cb.set(0,0,-1),Cb.applyMatrix4(wb),Cb.add(Eb),Lb.subVectors(Ab,Cb),Lb.reflect(Rb).negate(),Lb.add(Ab),a.coordinateSystem=r.coordinateSystem,a.position.copy(Bb),a.up.set(0,1,0),a.up.applyMatrix4(wb),a.up.reflect(Rb),a.lookAt(Lb),a.near=r.near,a.far=r.far,a.updateMatrixWorld(),a.projectionMatrix.copy(r.projectionMatrix),Sb.setFromNormalAndCoplanarPoint(Rb,Ab),Sb.applyMatrix4(a.matrixWorldInverse),Mb.set(Sb.normal.x,Sb.normal.y,Sb.normal.z,Sb.constant);const l=a.projectionMatrix;Fb.x=(Math.sign(Mb.x)+l.elements[8])/l.elements[0],Fb.y=(Math.sign(Mb.y)+l.elements[9])/l.elements[5],Fb.z=-1,Fb.w=(1+l.elements[10])/l.elements[14],Mb.multiplyScalar(1/Mb.dot(Fb));l.elements[2]=Mb.x,l.elements[6]=Mb.y,l.elements[10]=s.coordinateSystem===h?Mb.z-0:Mb.z+1-0,l.elements[14]=Mb.w,this.textureNode.value=o.texture,!0===this.depth&&(this.textureNode.getDepthNode().value=o.depthTexture),i.visible=!1;const d=s.getRenderTarget(),c=s.getMRT(),p=s.autoClear;s.setMRT(null),s.setRenderTarget(o),s.autoClear=!0;const g=t.name;t.name=(t.name||"Scene")+" [ Reflector ]",u?(s.clear(),this.hasOutput=!1):(s.render(t,a),this.hasOutput=!0),t.name=g,s.setMRT(c),s.setRenderTarget(d),s.autoClear=p,i.visible=!0,Ib=!1,this.forceUpdate=!1}get resolution(){return v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale}set resolution(e){v('ReflectorNode: The "resolution" property has been renamed to "resolutionScale".'),this.resolutionScale=e}}const kb=new _e(-1,1,1,-1,0,1);class Gb extends Te{constructor(e=!1){super();const t=!1===e?[0,-1,0,1,2,1]:[0,2,0,0,2,0];this.setAttribute("position",new Ye([-1,3,0,-1,-1,0,3,-1,0],3)),this.setAttribute("uv",new Ye(t,2))}}const zb=new Gb;class $b extends ne{constructor(e=null){super(zb,e),this.camera=kb,this.isQuadMesh=!0}async renderAsync(e){v('QuadMesh: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await e.init(),e.render(this,kb)}render(e){e.render(this,kb)}}const Wb=new t;class Hb extends Bl{static get type(){return"RTTNode"}constructor(e,t=null,r=null,s={type:be}){const i=new Ne(t,r,s);super(i.texture,Rl()),this.isRTTNode=!0,this.node=e,this.width=t,this.height=r,this.pixelRatio=1,this.renderTarget=i,this.textureNeedsUpdate=!0,this.autoUpdate=!0,this._rttNode=null,this._quadMesh=new $b(new Qp),this.updateBeforeType=Js.RENDER}get autoResize(){return null===this.width}setup(e){return this._rttNode=this.node.context(e.getSharedContext()),this._quadMesh.material.name="RTT",this._quadMesh.material.needsUpdate=!0,super.setup(e)}setSize(e,t){this.width=e,this.height=t;const r=e*this.pixelRatio,s=t*this.pixelRatio;this.renderTarget.setSize(r,s),this.textureNeedsUpdate=!0}setPixelRatio(e){this.pixelRatio=e,this.setSize(this.width,this.height)}updateBefore({renderer:e}){if(!1===this.textureNeedsUpdate&&!1===this.autoUpdate)return;if(this.textureNeedsUpdate=!1,!0===this.autoResize){const t=e.getPixelRatio(),r=e.getSize(Wb),s=Math.floor(r.width*t),i=Math.floor(r.height*t);s===this.renderTarget.width&&i===this.renderTarget.height||(this.renderTarget.setSize(s,i),this.textureNeedsUpdate=!0)}let t="RTT";this.node.name&&(t=this.node.name+" [ "+t+" ]"),this._quadMesh.material.fragmentNode=this._rttNode,this._quadMesh.name=t;const r=e.getRenderTarget();e.setRenderTarget(this.renderTarget),this._quadMesh.render(e),e.setRenderTarget(r)}clone(){const e=new Bl(this.value,this.uvNode,this.levelNode);return e.sampler=this.sampler,e.referenceNode=this,e}}const qb=(e,...t)=>Zi(new Hb(Zi(e),...t)),jb=un(([e,t,r],s)=>{let i;s.renderer.coordinateSystem===h?(e=bn(e.x,e.y.oneMinus()).mul(2).sub(1),i=An(vn(e,t),1)):i=An(vn(e.x,e.y.oneMinus(),t).mul(2).sub(1),1);const n=An(r.mul(i));return n.xyz.div(n.w)}),Xb=un(([e,t])=>{const r=t.mul(An(e,1)),s=r.xy.div(r.w).mul(.5).add(.5).toVar();return bn(s.x,s.y.oneMinus())}),Kb=un(([e,t,r])=>{const s=El(Pl(t)),i=xn(e.mul(s)).toVar(),n=Pl(t,i).toVar(),a=Pl(t,i.sub(xn(2,0))).toVar(),o=Pl(t,i.sub(xn(1,0))).toVar(),u=Pl(t,i.add(xn(1,0))).toVar(),l=Pl(t,i.add(xn(2,0))).toVar(),d=Pl(t,i.add(xn(0,2))).toVar(),c=Pl(t,i.add(xn(0,1))).toVar(),h=Pl(t,i.sub(xn(0,1))).toVar(),p=Pl(t,i.sub(xn(0,2))).toVar(),g=Mo(Ba(gn(2).mul(o).sub(a),n)).toVar(),m=Mo(Ba(gn(2).mul(u).sub(l),n)).toVar(),f=Mo(Ba(gn(2).mul(c).sub(d),n)).toVar(),y=Mo(Ba(gn(2).mul(h).sub(p),n)).toVar(),b=jb(e,n,r).toVar(),x=g.lessThan(m).select(b.sub(jb(e.sub(bn(gn(1).div(s.x),0)),o,r)),b.negate().add(jb(e.add(bn(gn(1).div(s.x),0)),u,r))),T=f.lessThan(y).select(b.sub(jb(e.add(bn(0,gn(1).div(s.y))),c,r)),b.negate().add(jb(e.sub(bn(0,gn(1).div(s.y))),h,r)));return vo(Qo(x,T))}),Yb=un(([e])=>No(gn(52.9829189).mul(No(Yo(e,bn(.06711056,.00583715)))))).setLayout({name:"interleavedGradientNoise",type:"float",inputs:[{name:"position",type:"vec2"}]}),Qb=un(([e,t,r])=>{const s=gn(2.399963229728653),i=bo(gn(e).add(.5).div(gn(t))),n=gn(e).mul(s).add(r);return bn(Ro(n),So(n)).mul(i)}).setLayout({name:"vogelDiskSample",type:"vec2",inputs:[{name:"sampleIndex",type:"int"},{name:"samplesCount",type:"int"},{name:"phi",type:"float"}]});class Zb extends ui{static get type(){return"SampleNode"}constructor(e,t=null){super(),this.callback=e,this.uvNode=t,this.isSampleNode=!0}setup(){return this.sample(Rl())}sample(e){return this.callback(e)}}class Jb extends ui{static get type(){return"EventNode"}constructor(e,t){super("void"),this.eventType=e,this.callback=t,e===Jb.OBJECT?this.updateType=Js.OBJECT:e===Jb.MATERIAL?this.updateType=Js.RENDER:e===Jb.BEFORE_OBJECT?this.updateBeforeType=Js.OBJECT:e===Jb.BEFORE_MATERIAL&&(this.updateBeforeType=Js.RENDER)}update(e){this.callback(e)}updateBefore(e){this.callback(e)}}Jb.OBJECT="object",Jb.MATERIAL="material",Jb.BEFORE_OBJECT="beforeObject",Jb.BEFORE_MATERIAL="beforeMaterial";const ex=(e,t)=>new Jb(e,t).toStack();class tx extends W{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageInstancedBufferAttribute=!0}}class rx extends Ee{constructor(e,t,r=Float32Array){super(ArrayBuffer.isView(e)?e:new r(e*t),t),this.isStorageBufferAttribute=!0}}class sx extends ui{static get type(){return"PointUVNode"}constructor(){super("vec2"),this.isPointUVNode=!0}generate(){return"vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )"}}const ix=sn(sx),nx=new L,ax=new a;class ox extends ui{static get type(){return"SceneNode"}constructor(e=ox.BACKGROUND_BLURRINESS,t=null){super(),this.scope=e,this.scene=t}setup(e){const t=this.scope,r=null!==this.scene?this.scene:e.scene;let s;return t===ox.BACKGROUND_BLURRINESS?s=fc("backgroundBlurriness","float",r):t===ox.BACKGROUND_INTENSITY?s=fc("backgroundIntensity","float",r):t===ox.BACKGROUND_ROTATION?s=_a("mat4").setName("backgroundRotation").setGroup(ba).onRenderUpdate(()=>{const e=r.background;return null!==e&&e.isTexture&&e.mapping!==Qe?(nx.copy(r.backgroundRotation),nx.x*=-1,nx.y*=-1,nx.z*=-1,ax.makeRotationFromEuler(nx)):ax.identity(),ax}):o("SceneNode: Unknown scope:",t),s}}ox.BACKGROUND_BLURRINESS="backgroundBlurriness",ox.BACKGROUND_INTENSITY="backgroundIntensity",ox.BACKGROUND_ROTATION="backgroundRotation";const ux=sn(ox,ox.BACKGROUND_BLURRINESS),lx=sn(ox,ox.BACKGROUND_INTENSITY),dx=sn(ox,ox.BACKGROUND_ROTATION);class cx extends Bl{static get type(){return"StorageTextureNode"}constructor(e,t,r=null){super(e,t),this.storeNode=r,this.mipLevel=0,this.isStorageTextureNode=!0,this.access=ti.WRITE_ONLY}getInputType(){return"storageTexture"}setup(e){super.setup(e);const t=e.getNodeProperties(this);return t.storeNode=this.storeNode,t}setAccess(e){return this.access=e,this}setMipLevel(e){return this.mipLevel=e,this}generate(e,t){let r;return r=null!==this.storeNode?this.generateStore(e):super.generate(e,t),r}toReadWrite(){return this.setAccess(ti.READ_WRITE)}toReadOnly(){return this.setAccess(ti.READ_ONLY)}toWriteOnly(){return this.setAccess(ti.WRITE_ONLY)}generateStore(e){const t=e.getNodeProperties(this),{uvNode:r,storeNode:s,depthNode:i}=t,n=super.generate(e,"property"),a=r.build(e,!0===this.value.is3DTexture?"uvec3":"uvec2"),o=s.build(e,"vec4"),u=i?i.build(e,"int"):null,l=e.generateTextureStore(e,n,a,u,o);e.addLineFlowCode(l,this)}clone(){const e=super.clone();return e.storeNode=this.storeNode,e.mipLevel=this.mipLevel,e}}const hx=rn(cx).setParameterLength(1,3),px=un(({texture:e,uv:t})=>{const r=1e-4,s=vn().toVar();return cn(t.x.lessThan(r),()=>{s.assign(vn(1,0,0))}).ElseIf(t.y.lessThan(r),()=>{s.assign(vn(0,1,0))}).ElseIf(t.z.lessThan(r),()=>{s.assign(vn(0,0,1))}).ElseIf(t.x.greaterThan(.9999),()=>{s.assign(vn(-1,0,0))}).ElseIf(t.y.greaterThan(.9999),()=>{s.assign(vn(0,-1,0))}).ElseIf(t.z.greaterThan(.9999),()=>{s.assign(vn(0,0,-1))}).Else(()=>{const r=.01,i=e.sample(t.add(vn(-.01,0,0))).r.sub(e.sample(t.add(vn(r,0,0))).r),n=e.sample(t.add(vn(0,-.01,0))).r.sub(e.sample(t.add(vn(0,r,0))).r),a=e.sample(t.add(vn(0,0,-.01))).r.sub(e.sample(t.add(vn(0,0,r))).r);s.assign(vn(i,n,a))}),s.normalize()});class gx extends Bl{static get type(){return"Texture3DNode"}constructor(e,t=null,r=null){super(e,t,r),this.isTexture3DNode=!0}getInputType(){return"texture3D"}getDefaultUV(){return vn(.5,.5,.5)}setUpdateMatrix(){}generateUV(e,t){return t.build(e,!0===this.sampler?"vec3":"ivec3")}generateOffset(e,t){return t.build(e,"ivec3")}normal(e){return px({texture:this,uv:e})}}const mx=rn(gx).setParameterLength(1,3);class fx extends mc{static get type(){return"UserDataNode"}constructor(e,t,r=null){super(e,t,r),this.userData=r}updateReference(e){return this.reference=null!==this.userData?this.userData:e.object.userData,this.reference}}const yx=new WeakMap;class bx extends ci{static get type(){return"VelocityNode"}constructor(){super("vec2"),this.projectionMatrix=null,this.updateType=Js.OBJECT,this.updateAfterType=Js.OBJECT,this.previousModelWorldMatrix=_a(new a),this.previousProjectionMatrix=_a(new a).setGroup(ba),this.previousCameraViewMatrix=_a(new a)}setProjectionMatrix(e){this.projectionMatrix=e}update({frameId:e,camera:t,object:r}){const s=Tx(r);this.previousModelWorldMatrix.value.copy(s);const i=xx(t);i.frameId!==e&&(i.frameId=e,void 0===i.previousProjectionMatrix?(i.previousProjectionMatrix=new a,i.previousCameraViewMatrix=new a,i.currentProjectionMatrix=new a,i.currentCameraViewMatrix=new a,i.previousProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.previousCameraViewMatrix.copy(t.matrixWorldInverse)):(i.previousProjectionMatrix.copy(i.currentProjectionMatrix),i.previousCameraViewMatrix.copy(i.currentCameraViewMatrix)),i.currentProjectionMatrix.copy(this.projectionMatrix||t.projectionMatrix),i.currentCameraViewMatrix.copy(t.matrixWorldInverse),this.previousProjectionMatrix.value.copy(i.previousProjectionMatrix),this.previousCameraViewMatrix.value.copy(i.previousCameraViewMatrix))}updateAfter({object:e}){Tx(e).copy(e.matrixWorld)}setup(){const e=null===this.projectionMatrix?rd:_a(this.projectionMatrix),t=this.previousCameraViewMatrix.mul(this.previousModelWorldMatrix),r=e.mul(Ad).mul(Ld),s=this.previousProjectionMatrix.mul(t).mul(Fd),i=r.xy.div(r.w),n=s.xy.div(s.w);return Ba(i,n)}}function xx(e){let t=yx.get(e);return void 0===t&&(t={},yx.set(e,t)),t}function Tx(e,t=0){const r=xx(e);let s=r[t];return void 0===s&&(r[t]=s=new a,r[t].copy(e.matrixWorld)),s}const _x=sn(bx),vx=un(([e])=>Ax(e.rgb)),Nx=un(([e,t=gn(1)])=>t.mix(Ax(e.rgb),e.rgb)),Sx=un(([e,t=gn(1)])=>{const r=Ma(e.r,e.g,e.b).div(3),s=e.r.max(e.g.max(e.b)),i=s.sub(r).mul(t).mul(-3);return nu(e.rgb,s,i)}),Rx=un(([e,t=gn(1)])=>{const r=vn(.57735,.57735,.57735),s=t.cos();return vn(e.rgb.mul(s).add(r.cross(e.rgb).mul(t.sin()).add(r.mul(Yo(r,e.rgb).mul(s.oneMinus())))))}),Ax=(e,t=vn(p.getLuminanceCoefficients(new r)))=>Yo(e,t),Ex=un(([e,t=vn(1),s=vn(0),i=vn(1),n=gn(1),a=vn(p.getLuminanceCoefficients(new r,Se))])=>{const o=e.rgb.dot(vn(a)),u=Ho(e.rgb.mul(t).add(s),0).toVar(),l=u.pow(i).toVar();return cn(u.r.greaterThan(0),()=>{u.r.assign(l.r)}),cn(u.g.greaterThan(0),()=>{u.g.assign(l.g)}),cn(u.b.greaterThan(0),()=>{u.b.assign(l.b)}),u.assign(o.add(u.sub(o).mul(n))),An(u.rgb,e.a)});class wx extends ci{static get type(){return"PosterizeNode"}constructor(e,t){super(),this.sourceNode=e,this.stepsNode=t}setup(){const{sourceNode:e,stepsNode:t}=this;return e.mul(t).floor().div(t)}}const Cx=rn(wx).setParameterLength(2);let Mx=null;class Bx extends _p{static get type(){return"ViewportSharedTextureNode"}constructor(e=Hl,t=null){null===Mx&&(Mx=new X),super(e,t,Mx)}getTextureForReference(){return Mx}updateReference(){return this}}const Lx=rn(Bx).setParameterLength(0,2),Fx=new t;class Px extends Bl{static get type(){return"PassTextureNode"}constructor(e,t){super(t),this.passNode=e,this.setUpdateMatrix(!1)}setup(e){return this.passNode.build(e),super.setup(e)}clone(){return new this.constructor(this.passNode,this.value)}}class Dx extends Px{static get type(){return"PassMultipleTextureNode"}constructor(e,t,r=!1){super(e,null),this.textureName=t,this.previousTexture=r}updateTexture(){this.value=this.previousTexture?this.passNode.getPreviousTexture(this.textureName):this.passNode.getTexture(this.textureName)}setup(e){return this.updateTexture(),super.setup(e)}clone(){const e=new this.constructor(this.passNode,this.textureName,this.previousTexture);return e.uvNode=this.uvNode,e.levelNode=this.levelNode,e.biasNode=this.biasNode,e.sampler=this.sampler,e.depthNode=this.depthNode,e.compareNode=this.compareNode,e.gradNode=this.gradNode,e.offsetNode=this.offsetNode,e}}class Ux extends ci{static get type(){return"PassNode"}constructor(e,t,r,s={}){super("vec4"),this.scope=e,this.scene=t,this.camera=r,this.options=s,this._pixelRatio=1,this._width=1,this._height=1;const i=new Y;i.isRenderTargetTexture=!0,i.name="depth";const n=new Ne(this._width*this._pixelRatio,this._height*this._pixelRatio,{type:be,...s});n.texture.name="output",n.depthTexture=i,this.renderTarget=n,this.overrideMaterial=null,this.transparent=!0,this.opaque=!0,this.contextNode=null,this._contextNodeCache=null,this._textures={output:n.texture,depth:i},this._textureNodes={},this._linearDepthNodes={},this._viewZNodes={},this._previousTextures={},this._previousTextureNodes={},this._cameraNear=_a(0),this._cameraFar=_a(0),this._mrt=null,this._layers=null,this._resolutionScale=1,this._viewport=null,this._scissor=null,this.isPassNode=!0,this.updateBeforeType=Js.FRAME,this.global=!0}setResolutionScale(e){return this._resolutionScale=e,this}getResolutionScale(){return this._resolutionScale}setResolution(e){return d("PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead."),this.setResolutionScale(e)}getResolution(){return d("PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead."),this.getResolutionScale()}setLayers(e){return this._layers=e,this}getLayers(){return this._layers}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getTexture(e){let t=this._textures[e];if(void 0===t){t=this.renderTarget.texture.clone(),t.name=e,this._textures[e]=t,this.renderTarget.textures.push(t)}return t}getPreviousTexture(e){let t=this._previousTextures[e];return void 0===t&&(t=this.getTexture(e).clone(),this._previousTextures[e]=t),t}toggleTexture(e){const t=this._previousTextures[e];if(void 0!==t){const r=this._textures[e],s=this.renderTarget.textures.indexOf(r);this.renderTarget.textures[s]=t,this._textures[e]=t,this._previousTextures[e]=r,this._textureNodes[e].updateTexture(),this._previousTextureNodes[e].updateTexture()}}getTextureNode(e="output"){let t=this._textureNodes[e];return void 0===t&&(t=new Dx(this,e),t.updateTexture(),this._textureNodes[e]=t),t}getPreviousTextureNode(e="output"){let t=this._previousTextureNodes[e];return void 0===t&&(void 0===this._textureNodes[e]&&this.getTextureNode(e),t=new Dx(this,e,!0),t.updateTexture(),this._previousTextureNodes[e]=t),t}getViewZNode(e="depth"){let t=this._viewZNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar;this._viewZNodes[e]=t=Lp(this.getTextureNode(e),r,s)}return t}getLinearDepthNode(e="depth"){let t=this._linearDepthNodes[e];if(void 0===t){const r=this._cameraNear,s=this._cameraFar,i=this.getViewZNode(e);this._linearDepthNodes[e]=t=Mp(i,r,s)}return t}async compileAsync(e){const t=e.getRenderTarget(),r=e.getMRT();e.setRenderTarget(this.renderTarget),e.setMRT(this._mrt),await e.compileAsync(this.scene,this.camera),e.setRenderTarget(t),e.setMRT(r)}setup({renderer:e}){return this.renderTarget.samples=void 0===this.options.samples?e.samples:this.options.samples,this.renderTarget.texture.type=e.getOutputBufferType(),this.scope===Ux.COLOR?this.getTextureNode():this.getLinearDepthNode()}updateBefore(e){const{renderer:t}=e,{scene:r}=this;let s,i;const n=t.getOutputRenderTarget();n&&!0===n.isXRRenderTarget?(i=1,s=t.xr.getCamera(),t.xr.updateCamera(s),Fx.set(n.width,n.height)):(s=this.camera,i=t.getPixelRatio(),t.getSize(Fx)),this._pixelRatio=i,this.setSize(Fx.width,Fx.height);const a=t.getRenderTarget(),o=t.getMRT(),u=t.autoClear,l=t.transparent,d=t.opaque,c=s.layers.mask,h=t.contextNode,p=r.overrideMaterial;this._cameraNear.value=s.near,this._cameraFar.value=s.far,null!==this._layers&&(s.layers.mask=this._layers.mask);for(const e in this._previousTextures)this.toggleTexture(e);null!==this.overrideMaterial&&(r.overrideMaterial=this.overrideMaterial),t.setRenderTarget(this.renderTarget),t.setMRT(this._mrt),t.autoClear=!0,t.transparent=this.transparent,t.opaque=this.opaque,null!==this.contextNode&&(null!==this._contextNodeCache&&this._contextNodeCache.version===this.version||(this._contextNodeCache={version:this.version,context:Tu({...t.contextNode.getFlowContextData(),...this.contextNode.getFlowContextData()})}),t.contextNode=this._contextNodeCache.context);const g=r.name;r.name=this.name?this.name:r.name,t.render(r,s),r.name=g,r.overrideMaterial=p,t.setRenderTarget(a),t.setMRT(o),t.autoClear=u,t.transparent=l,t.opaque=d,t.contextNode=h,s.layers.mask=c}setSize(e,t){this._width=e,this._height=t;const r=Math.floor(this._width*this._pixelRatio*this._resolutionScale),s=Math.floor(this._height*this._pixelRatio*this._resolutionScale);this.renderTarget.setSize(r,s),null!==this._scissor&&this.renderTarget.scissor.copy(this._scissor),null!==this._viewport&&this.renderTarget.viewport.copy(this._viewport)}setScissor(e,t,r,i){null===e?this._scissor=null:(null===this._scissor&&(this._scissor=new s),e.isVector4?this._scissor.copy(e):this._scissor.set(e,t,r,i),this._scissor.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setViewport(e,t,r,i){null===e?this._viewport=null:(null===this._viewport&&(this._viewport=new s),e.isVector4?this._viewport.copy(e):this._viewport.set(e,t,r,i),this._viewport.multiplyScalar(this._pixelRatio*this._resolutionScale).floor())}setPixelRatio(e){this._pixelRatio=e,this.setSize(this._width,this._height)}dispose(){this.renderTarget.dispose()}}Ux.COLOR="color",Ux.DEPTH="depth";class Ix extends Ux{static get type(){return"ToonOutlinePassNode"}constructor(e,t,r,s,i){super(Ux.COLOR,e,t),this.colorNode=r,this.thicknessNode=s,this.alphaNode=i,this._materialCache=new WeakMap,this.name="Outline Pass"}updateBefore(e){const{renderer:t}=e,r=t.getRenderObjectFunction();t.setRenderObjectFunction((e,r,s,i,n,a,o,u)=>{if((n.isMeshToonMaterial||n.isMeshToonNodeMaterial)&&!1===n.wireframe){const l=this._getOutlineMaterial(n);t.renderObject(e,r,s,i,l,a,o,u)}t.renderObject(e,r,s,i,n,a,o,u)}),super.updateBefore(e),t.setRenderObjectFunction(r)}_createMaterial(){const e=new Qp;e.isMeshToonOutlineMaterial=!0,e.name="Toon_Outline",e.side=M;const t=$d.negate(),r=rd.mul(Ad),s=gn(1),i=r.mul(An(Ld,1)),n=r.mul(An(Ld.add(t),1)),a=vo(i.sub(n));return e.vertexNode=i.add(a.mul(this.thicknessNode).mul(i.w).mul(s)),e.colorNode=An(this.colorNode,this.alphaNode),e}_getOutlineMaterial(e){let t=this._materialCache.get(e);return void 0===t&&(t=this._createMaterial(),this._materialCache.set(e,t)),t}}const Ox=un(([e,t])=>e.mul(t).clamp()).setLayout({name:"linearToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Vx=un(([e,t])=>(e=e.mul(t)).div(e.add(1)).clamp()).setLayout({name:"reinhardToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),kx=un(([e,t])=>{const r=(e=(e=e.mul(t)).sub(.004).max(0)).mul(e.mul(6.2).add(.5)),s=e.mul(e.mul(6.2).add(1.7)).add(.06);return r.div(s).pow(2.2)}).setLayout({name:"cineonToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),Gx=un(([e])=>{const t=e.mul(e.add(.0245786)).sub(90537e-9),r=e.mul(e.add(.432951).mul(.983729)).add(.238081);return t.div(r)}),zx=un(([e,t])=>{const r=Bn(.59719,.35458,.04823,.076,.90834,.01566,.0284,.13383,.83777),s=Bn(1.60475,-.53108,-.07367,-.10208,1.10813,-.00605,-.00327,-.07276,1.07602);return e=e.mul(t).div(.6),e=r.mul(e),e=Gx(e),(e=s.mul(e)).clamp()}).setLayout({name:"acesFilmicToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),$x=Bn(vn(1.6605,-.1246,-.0182),vn(-.5876,1.1329,-.1006),vn(-.0728,-.0083,1.1187)),Wx=Bn(vn(.6274,.0691,.0164),vn(.3293,.9195,.088),vn(.0433,.0113,.8956)),Hx=un(([e])=>{const t=vn(e).toVar(),r=vn(t.mul(t)).toVar(),s=vn(r.mul(r)).toVar();return gn(15.5).mul(s.mul(r)).sub(La(40.14,s.mul(t))).add(La(31.96,s).sub(La(6.868,r.mul(t))).add(La(.4298,r).add(La(.1191,t).sub(.00232))))}),qx=un(([e,t])=>{const r=vn(e).toVar(),s=Bn(vn(.856627153315983,.137318972929847,.11189821299995),vn(.0951212405381588,.761241990602591,.0767994186031903),vn(.0482516061458583,.101439036467562,.811302368396859)),i=Bn(vn(1.1271005818144368,-.1413297634984383,-.14132976349843826),vn(-.11060664309660323,1.157823702216272,-.11060664309660294),vn(-.016493938717834573,-.016493938717834257,1.2519364065950405)),n=gn(-12.47393),a=gn(4.026069);return r.mulAssign(t),r.assign(Wx.mul(r)),r.assign(s.mul(r)),r.assign(Ho(r,1e-10)),r.assign(yo(r)),r.assign(r.sub(n).div(a.sub(n))),r.assign(au(r,0,1)),r.assign(Hx(r)),r.assign(i.mul(r)),r.assign(Zo(Ho(vn(0),r),vn(2.2))),r.assign($x.mul(r)),r.assign(au(r,0,1)),r}).setLayout({name:"agxToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]}),jx=un(([e,t])=>{const r=gn(.76),s=gn(.15);e=e.mul(t);const i=Wo(e.r,Wo(e.g,e.b)),n=bu(i.lessThan(.08),i.sub(La(6.25,i.mul(i))),.04);e.subAssign(n);const a=Ho(e.r,Ho(e.g,e.b));cn(a.lessThan(r),()=>e);const o=Ba(1,r),u=Ba(1,o.mul(o).div(a.add(o.sub(r))));e.mulAssign(u.div(a));const l=Ba(1,Fa(1,s.mul(a.sub(u)).add(1)));return nu(e,vn(u),l)}).setLayout({name:"neutralToneMapping",type:"vec3",inputs:[{name:"color",type:"vec3"},{name:"exposure",type:"float"}]});class Xx extends ui{static get type(){return"CodeNode"}constructor(e="",t=[],r=""){super("code"),this.isCodeNode=!0,this.global=!0,this.code=e,this.includes=t,this.language=r}setIncludes(e){return this.includes=e,this}getIncludes(){return this.includes}generate(e){const t=this.getIncludes(e);for(const r of t)r.build(e);const r=e.getCodeFromNode(this,this.getNodeType(e));return r.code=this.code,r.code}serialize(e){super.serialize(e),e.code=this.code,e.language=this.language}deserialize(e){super.deserialize(e),this.code=e.code,this.language=e.language}}const Kx=rn(Xx).setParameterLength(1,3);class Yx extends Xx{static get type(){return"FunctionNode"}constructor(e="",t=[],r=""){super(e,t,r)}getNodeType(e){return this.getNodeFunction(e).type}getMemberType(e,t){const r=this.getNodeType(e);return e.getStructTypeNode(r).getMemberType(e,t)}getInputs(e){return this.getNodeFunction(e).inputs}getNodeFunction(e){const t=e.getDataFromNode(this);let r=t.nodeFunction;return void 0===r&&(r=e.parser.parseFunction(this.code),t.nodeFunction=r),r}generate(e,t){super.generate(e);const r=this.getNodeFunction(e),s=r.name,i=r.type,n=e.getCodeFromNode(this,i);""!==s&&(n.name=s);const a=e.getPropertyName(n),o=this.getNodeFunction(e).getCode(a);return n.code=o+"\n","property"===t?a:e.format(`${a}()`,i,t)}}const Qx=(e,t=[],r="")=>{for(let e=0;es.call(...e);return i.functionNode=s,i};class Zx extends ui{static get type(){return"ScriptableValueNode"}constructor(e=null){super(),this._value=e,this._cache=null,this.inputType=null,this.outputType=null,this.events=new u,this.isScriptableValueNode=!0}get isScriptableOutputNode(){return null!==this.outputType}set value(e){this._value!==e&&(this._cache&&"URL"===this.inputType&&this.value.value instanceof ArrayBuffer&&(URL.revokeObjectURL(this._cache),this._cache=null),this._value=e,this.events.dispatchEvent({type:"change"}),this.refresh())}get value(){return this._value}refresh(){this.events.dispatchEvent({type:"refresh"})}getValue(){const e=this.value;if(e&&null===this._cache&&"URL"===this.inputType&&e.value instanceof ArrayBuffer)this._cache=URL.createObjectURL(new Blob([e.value]));else if(e&&null!==e.value&&void 0!==e.value&&(("URL"===this.inputType||"String"===this.inputType)&&"string"==typeof e.value||"Number"===this.inputType&&"number"==typeof e.value||"Vector2"===this.inputType&&e.value.isVector2||"Vector3"===this.inputType&&e.value.isVector3||"Vector4"===this.inputType&&e.value.isVector4||"Color"===this.inputType&&e.value.isColor||"Matrix3"===this.inputType&&e.value.isMatrix3||"Matrix4"===this.inputType&&e.value.isMatrix4))return e.value;return this._cache||e}getNodeType(e){return this.value&&this.value.isNode?this.value.getNodeType(e):"float"}setup(){return this.value&&this.value.isNode?this.value:gn()}serialize(e){super.serialize(e),null!==this.value?"ArrayBuffer"===this.inputType?e.value=Ks(this.value):e.value=this.value?this.value.toJSON(e.meta).uuid:null:e.value=null,e.inputType=this.inputType,e.outputType=this.outputType}deserialize(e){super.deserialize(e);let t=null;null!==e.value&&(t="ArrayBuffer"===e.inputType?Ys(e.value):"Texture"===e.inputType?e.meta.textures[e.value]:e.meta.nodes[e.value]||null),this.value=t,this.inputType=e.inputType,this.outputType=e.outputType}}const Jx=rn(Zx).setParameterLength(1);class eT extends Map{get(e,t=null,...r){if(this.has(e))return super.get(e);if(null!==t){const s=t(...r);return this.set(e,s),s}}}class tT{constructor(e){this.scriptableNode=e}get parameters(){return this.scriptableNode.parameters}get layout(){return this.scriptableNode.getLayout()}getInputLayout(e){return this.scriptableNode.getInputLayout(e)}get(e){const t=this.parameters[e];return t?t.getValue():null}}const rT=new eT;class sT extends ui{static get type(){return"ScriptableNode"}constructor(e=null,t={}){super(),this.codeNode=e,this.parameters=t,this._local=new eT,this._output=Jx(null),this._outputs={},this._source=this.source,this._method=null,this._object=null,this._value=null,this._needsOutputUpdate=!0,this.onRefresh=this.onRefresh.bind(this),this.isScriptableNode=!0}get source(){return this.codeNode?this.codeNode.code:""}setLocal(e,t){return this._local.set(e,t)}getLocal(e){return this._local.get(e)}onRefresh(){this._refresh()}getInputLayout(e){for(const t of this.getLayout())if(t.inputType&&(t.id===e||t.name===e))return t}getOutputLayout(e){for(const t of this.getLayout())if(t.outputType&&(t.id===e||t.name===e))return t}setOutput(e,t){const r=this._outputs;return void 0===r[e]?r[e]=Jx(t):r[e].value=t,this}getOutput(e){return this._outputs[e]}getParameter(e){return this.parameters[e]}setParameter(e,t){const r=this.parameters;return t&&t.isScriptableNode?(this.deleteParameter(e),r[e]=t,r[e].getDefaultOutput().events.addEventListener("refresh",this.onRefresh)):t&&t.isScriptableValueNode?(this.deleteParameter(e),r[e]=t,r[e].events.addEventListener("refresh",this.onRefresh)):void 0===r[e]?(r[e]=Jx(t),r[e].events.addEventListener("refresh",this.onRefresh)):r[e].value=t,this}getValue(){return this.getDefaultOutput().getValue()}deleteParameter(e){let t=this.parameters[e];return t&&(t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.removeEventListener("refresh",this.onRefresh)),this}clearParameters(){for(const e of Object.keys(this.parameters))this.deleteParameter(e);return this.needsUpdate=!0,this}call(e,...t){const r=this.getObject()[e];if("function"==typeof r)return r(...t)}async callAsync(e,...t){const r=this.getObject()[e];if("function"==typeof r)return"AsyncFunction"===r.constructor.name?await r(...t):r(...t)}getNodeType(e){return this.getDefaultOutputNode().getNodeType(e)}refresh(e=null){null!==e?this.getOutput(e).refresh():this._refresh()}getObject(){if(this.needsUpdate&&this.dispose(),null!==this._object)return this._object;const e=new tT(this),t=rT.get("THREE"),r=rT.get("TSL"),s=this.getMethod(),i=[e,this._local,rT,()=>this.refresh(),(e,t)=>this.setOutput(e,t),t,r];this._object=s(...i);const n=this._object.layout;if(n&&(!1===n.cache&&this._local.clear(),this._output.outputType=n.outputType||null,Array.isArray(n.elements)))for(const e of n.elements){const t=e.id||e.name;e.inputType&&(void 0===this.getParameter(t)&&this.setParameter(t,null),this.getParameter(t).inputType=e.inputType),e.outputType&&(void 0===this.getOutput(t)&&this.setOutput(t,null),this.getOutput(t).outputType=e.outputType)}return this._object}deserialize(e){super.deserialize(e);for(const e in this.parameters){let t=this.parameters[e];t.isScriptableNode&&(t=t.getDefaultOutput()),t.events.addEventListener("refresh",this.onRefresh)}}getLayout(){return this.getObject().layout}getDefaultOutputNode(){const e=this.getDefaultOutput().value;return e&&e.isNode?e:gn()}getDefaultOutput(){return this._exec()._output}getMethod(){if(this.needsUpdate&&this.dispose(),null!==this._method)return this._method;const e=["layout","init","main","dispose"].join(", "),t="\nreturn { ...output, "+e+" };",r="var "+e+"; var output = {};\n"+this.codeNode.code+t;return this._method=new Function(...["parameters","local","global","refresh","setOutput","THREE","TSL"],r),this._method}dispose(){null!==this._method&&(this._object&&"function"==typeof this._object.dispose&&this._object.dispose(),this._method=null,this._object=null,this._source=null,this._value=null,this._needsOutputUpdate=!0,this._output.value=null,this._outputs={})}setup(){return this.getDefaultOutputNode()}getCacheKey(e){const t=[Us(this.source),this.getDefaultOutputNode().getCacheKey(e)];for(const r in this.parameters)t.push(this.parameters[r].getCacheKey(e));return Is(t)}set needsUpdate(e){!0===e&&this.dispose()}get needsUpdate(){return this.source!==this._source}_exec(){return null===this.codeNode||(!0===this._needsOutputUpdate&&(this._value=this.call("main"),this._needsOutputUpdate=!1),this._output.value=this._value),this}_refresh(){this.needsUpdate=!0,this._exec(),this._output.refresh()}}const iT=rn(sT).setParameterLength(1,2);function nT(e){let t;const r=e.context.getViewZ;return void 0!==r&&(t=r(this)),(t||Ud.z).negate()}const aT=un(([e,t],r)=>{const s=nT(r);return lu(e,t,s)}),oT=un(([e],t)=>{const r=nT(t);return e.mul(e,r,r).negate().exp().oneMinus()}),uT=un(([e,t],r)=>{const s=nT(r),i=t.sub(Pd.y).max(0).toConst().mul(s).toConst();return e.mul(e,i,i).negate().exp().oneMinus()}),lT=un(([e,t])=>An(t.toFloat().mix(ia.rgb,e.toVec3()),ia.a));let dT=null,cT=null;class hT extends ui{static get type(){return"RangeNode"}constructor(e=gn(),t=gn()){super(),this.minNode=e,this.maxNode=t}getVectorLength(e){const t=this.getConstNode(this.minNode),r=this.getConstNode(this.maxNode),s=e.getTypeLength(qs(t.value)),i=e.getTypeLength(qs(r.value));return s>i?s:i}getNodeType(e){return e.object.count>1?e.getTypeFromLength(this.getVectorLength(e)):"float"}getConstNode(e){let t=null;if(e.traverse(e=>{!0===e.isConstNode&&(t=e)}),null===t)throw new Error('THREE.TSL: No "ConstNode" found in node graph.');return t}setup(e){const t=e.object;let r=null;if(t.count>1){const i=this.getConstNode(this.minNode),n=this.getConstNode(this.maxNode),a=i.value,o=n.value,u=e.getTypeLength(qs(a)),d=e.getTypeLength(qs(o));dT=dT||new s,cT=cT||new s,dT.setScalar(0),cT.setScalar(0),1===u?dT.setScalar(a):a.isColor?dT.set(a.r,a.g,a.b,1):dT.set(a.x,a.y,a.z||0,a.w||0),1===d?cT.setScalar(o):o.isColor?cT.set(o.r,o.g,o.b,1):cT.set(o.x,o.y,o.z||0,o.w||0);const c=4,h=c*t.count,p=new Float32Array(h);for(let e=0;enew gT(e,t),fT=mT("numWorkgroups","uvec3"),yT=mT("workgroupId","uvec3"),bT=mT("globalId","uvec3"),xT=mT("localId","uvec3"),TT=mT("subgroupSize","uint");const _T=rn(class extends ui{constructor(e){super(),this.scope=e}generate(e){const{scope:t}=this,{renderer:r}=e;!0===r.backend.isWebGLBackend?e.addFlowCode(`\t// ${t}Barrier \n`):e.addLineFlowCode(`${t}Barrier()`,this)}});class vT extends li{constructor(e,t){super(e,t),this.isWorkgroupInfoElementNode=!0}generate(e,t){let r;const s=e.context.assign;if(r=super.generate(e),!0!==s){const s=this.getNodeType(e);r=e.format(r,s,t)}return r}}class NT extends ui{constructor(e,t,r=0){super(t),this.bufferType=t,this.bufferCount=r,this.isWorkgroupInfoNode=!0,this.elementType=t,this.scope=e,this.name=""}setName(e){return this.name=e,this}label(e){return d('TSL: "label()" has been deprecated. Use "setName()" instead.'),this.setName(e)}setScope(e){return this.scope=e,this}getElementType(){return this.elementType}getInputType(){return`${this.scope}Array`}element(e){return new vT(this,e)}generate(e){const t=""!==this.name?this.name:`${this.scope}Array_${this.id}`;return e.getScopedArray(t,this.scope.toLowerCase(),this.bufferType,this.bufferCount)}}class ST extends ui{static get type(){return"AtomicFunctionNode"}constructor(e,t,r){super("uint"),this.method=e,this.pointerNode=t,this.valueNode=r,this.parents=!0}getInputType(e){return this.pointerNode.getNodeType(e)}getNodeType(e){return this.getInputType(e)}generate(e){const t=e.getNodeProperties(this),r=t.parents,s=this.method,i=this.getNodeType(e),n=this.getInputType(e),a=this.pointerNode,o=this.valueNode,u=[];u.push(`&${a.build(e,n)}`),null!==o&&u.push(o.build(e,n));const l=`${e.getMethod(s,i)}( ${u.join(", ")} )`;if(!(!!r&&(1===r.length&&!0===r[0].isStackNode)))return void 0===t.constNode&&(t.constNode=gl(l,i).toConst()),t.constNode.build(e);e.addLineFlowCode(l,this)}}ST.ATOMIC_LOAD="atomicLoad",ST.ATOMIC_STORE="atomicStore",ST.ATOMIC_ADD="atomicAdd",ST.ATOMIC_SUB="atomicSub",ST.ATOMIC_MAX="atomicMax",ST.ATOMIC_MIN="atomicMin",ST.ATOMIC_AND="atomicAnd",ST.ATOMIC_OR="atomicOr",ST.ATOMIC_XOR="atomicXor";const RT=rn(ST),AT=(e,t,r)=>RT(e,t,r).toStack();class ET extends ci{static get type(){return"SubgroupFunctionNode"}constructor(e,t=null,r=null){super(),this.method=e,this.aNode=t,this.bNode=r}getInputType(e){const t=this.aNode?this.aNode.getNodeType(e):null,r=this.bNode?this.bNode.getNodeType(e):null;return(e.isMatrix(t)?0:e.getTypeLength(t))>(e.isMatrix(r)?0:e.getTypeLength(r))?t:r}getNodeType(e){const t=this.method;return t===ET.SUBGROUP_ELECT?"bool":t===ET.SUBGROUP_BALLOT?"uvec4":this.getInputType(e)}generate(e,t){const r=this.method,s=this.getNodeType(e),i=this.getInputType(e),n=this.aNode,a=this.bNode,o=[];if(r===ET.SUBGROUP_BROADCAST||r===ET.SUBGROUP_SHUFFLE||r===ET.QUAD_BROADCAST){const t=a.getNodeType(e);o.push(n.build(e,s),a.build(e,"float"===t?"int":s))}else r===ET.SUBGROUP_SHUFFLE_XOR||r===ET.SUBGROUP_SHUFFLE_DOWN||r===ET.SUBGROUP_SHUFFLE_UP?o.push(n.build(e,s),a.build(e,"uint")):(null!==n&&o.push(n.build(e,i)),null!==a&&o.push(a.build(e,i)));const u=0===o.length?"()":`( ${o.join(", ")} )`;return e.format(`${e.getMethod(r,s)}${u}`,s,t)}serialize(e){super.serialize(e),e.method=this.method}deserialize(e){super.deserialize(e),this.method=e.method}}ET.SUBGROUP_ELECT="subgroupElect",ET.SUBGROUP_BALLOT="subgroupBallot",ET.SUBGROUP_ADD="subgroupAdd",ET.SUBGROUP_INCLUSIVE_ADD="subgroupInclusiveAdd",ET.SUBGROUP_EXCLUSIVE_AND="subgroupExclusiveAdd",ET.SUBGROUP_MUL="subgroupMul",ET.SUBGROUP_INCLUSIVE_MUL="subgroupInclusiveMul",ET.SUBGROUP_EXCLUSIVE_MUL="subgroupExclusiveMul",ET.SUBGROUP_AND="subgroupAnd",ET.SUBGROUP_OR="subgroupOr",ET.SUBGROUP_XOR="subgroupXor",ET.SUBGROUP_MIN="subgroupMin",ET.SUBGROUP_MAX="subgroupMax",ET.SUBGROUP_ALL="subgroupAll",ET.SUBGROUP_ANY="subgroupAny",ET.SUBGROUP_BROADCAST_FIRST="subgroupBroadcastFirst",ET.QUAD_SWAP_X="quadSwapX",ET.QUAD_SWAP_Y="quadSwapY",ET.QUAD_SWAP_DIAGONAL="quadSwapDiagonal",ET.SUBGROUP_BROADCAST="subgroupBroadcast",ET.SUBGROUP_SHUFFLE="subgroupShuffle",ET.SUBGROUP_SHUFFLE_XOR="subgroupShuffleXor",ET.SUBGROUP_SHUFFLE_UP="subgroupShuffleUp",ET.SUBGROUP_SHUFFLE_DOWN="subgroupShuffleDown",ET.QUAD_BROADCAST="quadBroadcast";const wT=nn(ET,ET.SUBGROUP_ELECT).setParameterLength(0),CT=nn(ET,ET.SUBGROUP_BALLOT).setParameterLength(1),MT=nn(ET,ET.SUBGROUP_ADD).setParameterLength(1),BT=nn(ET,ET.SUBGROUP_INCLUSIVE_ADD).setParameterLength(1),LT=nn(ET,ET.SUBGROUP_EXCLUSIVE_AND).setParameterLength(1),FT=nn(ET,ET.SUBGROUP_MUL).setParameterLength(1),PT=nn(ET,ET.SUBGROUP_INCLUSIVE_MUL).setParameterLength(1),DT=nn(ET,ET.SUBGROUP_EXCLUSIVE_MUL).setParameterLength(1),UT=nn(ET,ET.SUBGROUP_AND).setParameterLength(1),IT=nn(ET,ET.SUBGROUP_OR).setParameterLength(1),OT=nn(ET,ET.SUBGROUP_XOR).setParameterLength(1),VT=nn(ET,ET.SUBGROUP_MIN).setParameterLength(1),kT=nn(ET,ET.SUBGROUP_MAX).setParameterLength(1),GT=nn(ET,ET.SUBGROUP_ALL).setParameterLength(0),zT=nn(ET,ET.SUBGROUP_ANY).setParameterLength(0),$T=nn(ET,ET.SUBGROUP_BROADCAST_FIRST).setParameterLength(2),WT=nn(ET,ET.QUAD_SWAP_X).setParameterLength(1),HT=nn(ET,ET.QUAD_SWAP_Y).setParameterLength(1),qT=nn(ET,ET.QUAD_SWAP_DIAGONAL).setParameterLength(1),jT=nn(ET,ET.SUBGROUP_BROADCAST).setParameterLength(2),XT=nn(ET,ET.SUBGROUP_SHUFFLE).setParameterLength(2),KT=nn(ET,ET.SUBGROUP_SHUFFLE_XOR).setParameterLength(2),YT=nn(ET,ET.SUBGROUP_SHUFFLE_UP).setParameterLength(2),QT=nn(ET,ET.SUBGROUP_SHUFFLE_DOWN).setParameterLength(2),ZT=nn(ET,ET.QUAD_BROADCAST).setParameterLength(1);let JT;function e_(e){JT=JT||new WeakMap;let t=JT.get(e);return void 0===t&&JT.set(e,t={}),t}function t_(e){const t=e_(e);return t.shadowMatrix||(t.shadowMatrix=_a("mat4").setGroup(ba).onRenderUpdate(t=>(!0===e.castShadow&&!1!==t.renderer.shadowMap.enabled||(e.shadow.camera.coordinateSystem!==t.camera.coordinateSystem&&(e.shadow.camera.coordinateSystem=t.camera.coordinateSystem,e.shadow.camera.updateProjectionMatrix()),e.shadow.updateMatrices(e)),e.shadow.matrix)))}function r_(e,t=Pd){const r=t_(e).mul(t);return r.xyz.div(r.w)}function s_(e){const t=e_(e);return t.position||(t.position=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.matrixWorld)))}function i_(e){const t=e_(e);return t.targetPosition||(t.targetPosition=_a(new r).setGroup(ba).onRenderUpdate((t,r)=>r.value.setFromMatrixPosition(e.target.matrixWorld)))}function n_(e){const t=e_(e);return t.viewPosition||(t.viewPosition=_a(new r).setGroup(ba).onRenderUpdate(({camera:t},s)=>{s.value=s.value||new r,s.value.setFromMatrixPosition(e.matrixWorld),s.value.applyMatrix4(t.matrixWorldInverse)}))}const a_=e=>id.transformDirection(s_(e).sub(i_(e))),o_=(e,t)=>{for(const r of t)if(r.isAnalyticLightNode&&r.light.id===e)return r;return null},u_=new WeakMap,l_=[];class d_ extends ui{static get type(){return"LightsNode"}constructor(){super("vec3"),this.totalDiffuseNode=Un("vec3","totalDiffuse"),this.totalSpecularNode=Un("vec3","totalSpecular"),this.outgoingLightNode=Un("vec3","outgoingLight"),this._lights=[],this._lightNodes=null,this._lightNodesHash=null,this.global=!0}customCacheKey(){const e=this._lights;for(let t=0;te.sort((e,t)=>e.id-t.id))(this._lights),i=e.renderer.library;for(const e of s)if(e.isNode)t.push(Zi(e));else{let s=null;if(null!==r&&(s=o_(e.id,r)),null===s){const r=i.getLightNodeClass(e.constructor);if(null===r){d(`LightsNode.setupNodeLights: Light node not found for ${e.constructor.name}`);continue}let s=null;u_.has(e)?s=u_.get(e):(s=new r(e),u_.set(e,s)),t.push(s)}}this._lightNodes=t}setupDirectLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.direct({...r,lightNode:t,reflectedLight:i},e)}setupDirectRectAreaLight(e,t,r){const{lightingModel:s,reflectedLight:i}=e.context;s.directRectArea({...r,lightNode:t,reflectedLight:i},e)}setupLights(e,t){for(const r of t)r.build(e)}getLightNodes(e){return null===this._lightNodes&&this.setupLightsNode(e),this._lightNodes}setup(e){const t=e.lightsNode;e.lightsNode=this;let r=this.outgoingLightNode;const s=e.context,i=s.lightingModel,n=e.getNodeProperties(this);if(i){const{totalDiffuseNode:t,totalSpecularNode:a}=this;s.outgoingLight=r;const o=e.addStack();n.nodes=o.nodes,i.start(e);const{backdrop:u,backdropAlpha:l}=s,{directDiffuse:d,directSpecular:c,indirectDiffuse:h,indirectSpecular:p}=s.reflectedLight;let g=d.add(h);null!==u&&(g=vn(null!==l?l.mix(g,u):u)),t.assign(g),a.assign(c.add(p)),r.assign(t.add(a)),i.finish(e),r=r.bypass(e.removeStack())}else n.nodes=[];return e.lightsNode=t,r}setLights(e){return this._lights=e,this._lightNodes=null,this._lightNodesHash=null,this}getLights(){return this._lights}get hasLights(){return this._lights.length>0}}class c_ extends ui{static get type(){return"ShadowBaseNode"}constructor(e){super(),this.light=e,this.updateBeforeType=Js.RENDER,this.isShadowBaseNode=!0}setupShadowPosition({context:e,material:t}){h_.assign(t.receivedShadowPositionNode||e.shadowPositionWorld||Pd)}}const h_=Un("vec3","shadowPositionWorld");function p_(t,r={}){return r.toneMapping=t.toneMapping,r.toneMappingExposure=t.toneMappingExposure,r.outputColorSpace=t.outputColorSpace,r.renderTarget=t.getRenderTarget(),r.activeCubeFace=t.getActiveCubeFace(),r.activeMipmapLevel=t.getActiveMipmapLevel(),r.renderObjectFunction=t.getRenderObjectFunction(),r.pixelRatio=t.getPixelRatio(),r.mrt=t.getMRT(),r.clearColor=t.getClearColor(r.clearColor||new e),r.clearAlpha=t.getClearAlpha(),r.autoClear=t.autoClear,r.scissorTest=t.getScissorTest(),r}function g_(e,t){return t=p_(e,t),e.setMRT(null),e.setRenderObjectFunction(null),e.setClearColor(0,1),e.autoClear=!0,t}function m_(e,t){e.toneMapping=t.toneMapping,e.toneMappingExposure=t.toneMappingExposure,e.outputColorSpace=t.outputColorSpace,e.setRenderTarget(t.renderTarget,t.activeCubeFace,t.activeMipmapLevel),e.setRenderObjectFunction(t.renderObjectFunction),e.setPixelRatio(t.pixelRatio),e.setMRT(t.mrt),e.setClearColor(t.clearColor,t.clearAlpha),e.autoClear=t.autoClear,e.setScissorTest(t.scissorTest)}function f_(e,t={}){return t.background=e.background,t.backgroundNode=e.backgroundNode,t.overrideMaterial=e.overrideMaterial,t}function y_(e,t){return t=f_(e,t),e.background=null,e.backgroundNode=null,e.overrideMaterial=null,t}function b_(e,t){e.background=t.background,e.backgroundNode=t.backgroundNode,e.overrideMaterial=t.overrideMaterial}function x_(e,t,r){return r=y_(t,r=g_(e,r))}function T_(e,t,r){m_(e,r),b_(t,r)}var __=Object.freeze({__proto__:null,resetRendererAndSceneState:x_,resetRendererState:g_,resetSceneState:y_,restoreRendererAndSceneState:T_,restoreRendererState:m_,restoreSceneState:b_,saveRendererAndSceneState:function(e,t,r={}){return r=f_(t,r=p_(e,r))},saveRendererState:p_,saveSceneState:f_});const v_=new WeakMap,N_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e,t.xy).setName("t_basic");return e.isArrayTexture&&(s=s.depth(r)),s.compare(t.z)}),S_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=fc("radius","float",r).setGroup(ba),o=bn(1).div(n),u=a.mul(o.x),l=Yb(jl.xy).mul(6.28318530718);return Ma(i(t.xy.add(Qb(0,5,l).mul(u)),t.z),i(t.xy.add(Qb(1,5,l).mul(u)),t.z),i(t.xy.add(Qb(2,5,l).mul(u)),t.z),i(t.xy.add(Qb(3,5,l).mul(u)),t.z),i(t.xy.add(Qb(4,5,l).mul(u)),t.z)).mul(.2)}),R_=un(({depthTexture:e,shadowCoord:t,shadow:r,depthLayer:s})=>{const i=(t,r)=>{let i=Fl(e,t);return e.isArrayTexture&&(i=i.depth(s)),i.compare(r)},n=fc("mapSize","vec2",r).setGroup(ba),a=bn(1).div(n),o=a.x,u=a.y,l=t.xy,d=No(l.mul(n).add(.5));return l.subAssign(d.mul(a)),Ma(i(l,t.z),i(l.add(bn(o,0)),t.z),i(l.add(bn(0,u)),t.z),i(l.add(a),t.z),nu(i(l.add(bn(o.negate(),0)),t.z),i(l.add(bn(o.mul(2),0)),t.z),d.x),nu(i(l.add(bn(o.negate(),u)),t.z),i(l.add(bn(o.mul(2),u)),t.z),d.x),nu(i(l.add(bn(0,u.negate())),t.z),i(l.add(bn(0,u.mul(2))),t.z),d.y),nu(i(l.add(bn(o,u.negate())),t.z),i(l.add(bn(o,u.mul(2))),t.z),d.y),nu(nu(i(l.add(bn(o.negate(),u.negate())),t.z),i(l.add(bn(o.mul(2),u.negate())),t.z),d.x),nu(i(l.add(bn(o.negate(),u.mul(2))),t.z),i(l.add(bn(o.mul(2),u.mul(2))),t.z),d.x),d.y)).mul(1/9)}),A_=un(({depthTexture:e,shadowCoord:t,depthLayer:r})=>{let s=Fl(e).sample(t.xy);e.isArrayTexture&&(s=s.depth(r)),s=s.rg;const i=s.x,n=Ho(1e-7,s.y.mul(s.y)),a=qo(t.z,i);cn(a.equal(1),()=>gn(1));const o=t.z.sub(i);let u=n.div(n.add(o.mul(o)));return u=au(Ba(u,.3).div(.65)),Ho(a,u)}),E_=e=>{let t=v_.get(e);return void 0===t&&(t=new Qp,t.colorNode=An(0,0,0,1),t.isShadowPassMaterial=!0,t.name="ShadowMaterial",t.blending=ee,t.fog=!1,v_.set(e,t)),t},w_=e=>{const t=v_.get(e);void 0!==t&&(t.dispose(),v_.delete(e))},C_=new Yf,M_=[],B_=(e,t,r,s)=>{M_[0]=e,M_[1]=t;let i=C_.get(M_);return void 0!==i&&i.shadowType===r&&i.useVelocity===s||(i=(i,n,a,o,u,l,...d)=>{(!0===i.castShadow||i.receiveShadow&&r===Ze)&&(s&&(Xs(i).useVelocity=!0),i.onBeforeShadow(e,i,a,t.camera,o,n.overrideMaterial,l),e.renderObject(i,n,a,o,u,l,...d),i.onAfterShadow(e,i,a,t.camera,o,n.overrideMaterial,l))},i.shadowType=r,i.useVelocity=s,C_.set(M_,i)),M_[0]=null,M_[1]=null,i},L_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanVertical"),a=gn(0).toVar("squareMeanVertical"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(0,l).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),d=d.x,n.addAssign(d),a.addAssign(d.mul(d))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),F_=un(({samples:e,radius:t,size:r,shadowPass:s,depthLayer:i})=>{const n=gn(0).toVar("meanHorizontal"),a=gn(0).toVar("squareMeanHorizontal"),o=e.lessThanEqual(gn(1)).select(gn(0),gn(2).div(e.sub(1))),u=e.lessThanEqual(gn(1)).select(gn(0),gn(-1));up({start:mn(0),end:mn(e),type:"int",condition:"<"},({i:e})=>{const l=u.add(gn(e).mul(o));let d=s.sample(Ma(jl.xy,bn(l,0).mul(t)).div(r));s.value.isArrayTexture&&(d=d.depth(i)),n.addAssign(d.x),a.addAssign(Ma(d.y.mul(d.y),d.x.mul(d.x)))}),n.divAssign(e),a.divAssign(e);const l=bo(a.sub(n.mul(n)).max(0));return bn(n,l)}),P_=[N_,S_,R_,A_];let D_;const U_=new $b;class I_ extends c_{static get type(){return"ShadowNode"}constructor(e,t=null){super(e),this.shadow=t||e.shadow,this.shadowMap=null,this.vsmShadowMapVertical=null,this.vsmShadowMapHorizontal=null,this.vsmMaterialVertical=null,this.vsmMaterialHorizontal=null,this._node=null,this._currentShadowType=null,this._cameraFrameId=new WeakMap,this.isShadowNode=!0,this.depthLayer=0}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n}){const a=s.x.greaterThanEqual(0).and(s.x.lessThanEqual(1)).and(s.y.greaterThanEqual(0)).and(s.y.lessThanEqual(1)).and(s.z.lessThanEqual(1)),o=t({depthTexture:r,shadowCoord:s,shadow:i,depthLayer:n});return a.select(o,gn(1))}setupShadowCoord(e,t){const{shadow:r}=this,{renderer:s}=e,i=fc("bias","float",r).setGroup(ba);let n,a=t;if(r.camera.isOrthographicCamera||!0!==s.logarithmicDepthBuffer)a=a.xyz.div(a.w),n=a.z,s.coordinateSystem===h&&(n=n.mul(2).sub(1));else{const e=a.w;a=a.xy.div(e);const t=fc("near","float",r.camera).setGroup(ba),s=fc("far","float",r.camera).setGroup(ba);n=Fp(e.negate(),t,s)}return a=vn(a.x,a.y.oneMinus(),n.add(i)),a}getShadowFilterFn(e){return P_[e]}setupRenderTarget(e,t){const r=new Y(e.mapSize.width,e.mapSize.height);r.name="ShadowDepthTexture",r.compareFunction=Je;const s=t.createRenderTarget(e.mapSize.width,e.mapSize.height);return s.texture.name="ShadowMap",s.texture.type=e.mapType,s.depthTexture=r,{shadowMap:s,depthTexture:r}}setupShadow(e){const{renderer:t,camera:r}=e,{light:s,shadow:i}=this,{depthTexture:n,shadowMap:a}=this.setupRenderTarget(i,e),o=t.shadowMap.type;if(o===et||o===tt?(n.minFilter=oe,n.magFilter=oe):(n.minFilter=w,n.magFilter=w),i.camera.coordinateSystem=r.coordinateSystem,i.camera.updateProjectionMatrix(),o===Ze&&!0!==i.isPointLightShadow){n.compareFunction=null,a.depth>1?(a._vsmShadowMapVertical||(a._vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapVertical.texture.name="VSMVertical"),this.vsmShadowMapVertical=a._vsmShadowMapVertical,a._vsmShadowMapHorizontal||(a._vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depth:a.depth,depthBuffer:!1}),a._vsmShadowMapHorizontal.texture.name="VSMHorizontal"),this.vsmShadowMapHorizontal=a._vsmShadowMapHorizontal):(this.vsmShadowMapVertical=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}),this.vsmShadowMapHorizontal=e.createRenderTarget(i.mapSize.width,i.mapSize.height,{format:G,type:be,depthBuffer:!1}));let t=Fl(n);n.isArrayTexture&&(t=t.depth(this.depthLayer));let r=Fl(this.vsmShadowMapVertical.texture);n.isArrayTexture&&(r=r.depth(this.depthLayer));const s=fc("blurSamples","float",i).setGroup(ba),o=fc("radius","float",i).setGroup(ba),u=fc("mapSize","vec2",i).setGroup(ba);let l=this.vsmMaterialVertical||(this.vsmMaterialVertical=new Qp);l.fragmentNode=L_({samples:s,radius:o,size:u,shadowPass:t,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMVertical",l=this.vsmMaterialHorizontal||(this.vsmMaterialHorizontal=new Qp),l.fragmentNode=F_({samples:s,radius:o,size:u,shadowPass:r,depthLayer:this.depthLayer}).context(e.getSharedContext()),l.name="VSMHorizontal"}const u=fc("intensity","float",i).setGroup(ba),l=fc("normalBias","float",i).setGroup(ba),d=t_(s).mul(h_.add(Xd.mul(l))),c=this.setupShadowCoord(e,d),h=i.filterNode||this.getShadowFilterFn(t.shadowMap.type)||null;if(null===h)throw new Error("THREE.WebGPURenderer: Shadow map type not supported yet.");const p=o===Ze&&!0!==i.isPointLightShadow?this.vsmShadowMapHorizontal.texture:n,g=this.setupShadowFilter(e,{filterFn:h,shadowTexture:a.texture,depthTexture:p,shadowCoord:c,shadow:i,depthLayer:this.depthLayer});let m,f;!0===t.shadowMap.transmitted&&(a.texture.isCubeTexture?m=pc(a.texture,c.xyz):(m=Fl(a.texture,c),n.isArrayTexture&&(m=m.depth(this.depthLayer)))),f=m?nu(1,g.rgb.mix(m,1),u.mul(m.a)).toVar():nu(1,g,u).toVar(),this.shadowMap=a,this.shadow.map=a;const y=`${this.light.type} Shadow [ ${this.light.name||"ID: "+this.light.id} ]`;return m&&f.toInspector(`${y} / Color`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture):Fl(this.shadowMap.texture)),f.toInspector(`${y} / Depth`,()=>this.shadowMap.texture.isCubeTexture?pc(this.shadowMap.texture).r.oneMinus():Pl(this.shadowMap.depthTexture,Rl().mul(El(Fl(this.shadowMap.depthTexture)))).r.oneMinus())}setup(e){if(!1!==e.renderer.shadowMap.enabled)return un(()=>{const t=e.renderer.shadowMap.type;this._currentShadowType!==t&&(this._reset(),this._node=null);let r=this._node;return this.setupShadowPosition(e),null===r&&(this._node=r=this.setupShadow(e),this._currentShadowType=t),e.material.receivedShadowNode&&(r=e.material.receivedShadowNode(r)),r})()}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e;t.updateMatrices(s),r.setSize(t.mapSize.width,t.mapSize.height,r.depth);const a=n.name;n.name=`Shadow Map [ ${s.name||"ID: "+s.id} ]`,i.render(n,t.camera),n.name=a}updateShadow(e){const{shadowMap:t,light:r,shadow:s}=this,{renderer:i,scene:n,camera:a}=e,o=i.shadowMap.type,u=t.depthTexture.version;this._depthVersionCached=u;const l=s.camera.layers.mask;4294967294&s.camera.layers.mask||(s.camera.layers.mask=a.layers.mask);const d=i.getRenderObjectFunction(),c=i.getMRT(),h=!!c&&c.has("velocity");D_=x_(i,n,D_),n.overrideMaterial=E_(r),i.setRenderObjectFunction(B_(i,s,o,h)),i.setClearColor(0,0),i.setRenderTarget(t),this.renderShadow(e),i.setRenderObjectFunction(d),o===Ze&&!0!==s.isPointLightShadow&&this.vsmPass(i),s.camera.layers.mask=l,T_(i,n,D_)}vsmPass(e){const{shadow:t}=this,r=this.shadowMap.depth;this.vsmShadowMapVertical.setSize(t.mapSize.width,t.mapSize.height,r),this.vsmShadowMapHorizontal.setSize(t.mapSize.width,t.mapSize.height,r),e.setRenderTarget(this.vsmShadowMapVertical),U_.material=this.vsmMaterialVertical,U_.render(e),e.setRenderTarget(this.vsmShadowMapHorizontal),U_.material=this.vsmMaterialHorizontal,U_.render(e)}dispose(){this._reset(),super.dispose()}_reset(){this._currentShadowType=null,w_(this.light),this.shadowMap&&(this.shadowMap.dispose(),this.shadowMap=null),null!==this.vsmShadowMapVertical&&(this.vsmShadowMapVertical.dispose(),this.vsmShadowMapVertical=null,this.vsmMaterialVertical.dispose(),this.vsmMaterialVertical=null),null!==this.vsmShadowMapHorizontal&&(this.vsmShadowMapHorizontal.dispose(),this.vsmShadowMapHorizontal=null,this.vsmMaterialHorizontal.dispose(),this.vsmMaterialHorizontal=null)}updateBefore(e){const{shadow:t}=this;let r=t.needsUpdate||t.autoUpdate;r&&(this._cameraFrameId[e.camera]===e.frameId&&(r=!1),this._cameraFrameId[e.camera]=e.frameId),r&&(this.updateShadow(e),this.shadowMap.depthTexture.version===this._depthVersionCached&&(t.needsUpdate=!1))}}const O_=(e,t)=>new I_(e,t),V_=new e,k_=new a,G_=new r,z_=new r,$_=[new r(1,0,0),new r(-1,0,0),new r(0,-1,0),new r(0,1,0),new r(0,0,1),new r(0,0,-1)],W_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,-1),new r(0,0,1),new r(0,-1,0),new r(0,-1,0)],H_=[new r(1,0,0),new r(-1,0,0),new r(0,1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1)],q_=[new r(0,-1,0),new r(0,-1,0),new r(0,0,1),new r(0,0,-1),new r(0,-1,0),new r(0,-1,0)],j_=un(({depthTexture:e,bd3D:t,dp:r})=>pc(e,t).compare(r)),X_=un(({depthTexture:e,bd3D:t,dp:r,shadow:s})=>{const i=fc("radius","float",s).setGroup(ba),n=fc("mapSize","vec2",s).setGroup(ba),a=i.div(n.x),o=Mo(t),u=vo(Qo(t,o.x.greaterThan(o.z).select(vn(0,1,0),vn(1,0,0)))),l=Qo(t,u),d=Yb(jl.xy).mul(6.28318530718),c=Qb(0,5,d),h=Qb(1,5,d),p=Qb(2,5,d),g=Qb(3,5,d),m=Qb(4,5,d);return pc(e,t.add(u.mul(c.x).add(l.mul(c.y)).mul(a))).compare(r).add(pc(e,t.add(u.mul(h.x).add(l.mul(h.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(p.x).add(l.mul(p.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(g.x).add(l.mul(g.y)).mul(a))).compare(r)).add(pc(e,t.add(u.mul(m.x).add(l.mul(m.y)).mul(a))).compare(r)).mul(.2)}),K_=un(({filterFn:e,depthTexture:t,shadowCoord:r,shadow:s})=>{const i=r.xyz.toConst(),n=i.abs().toConst(),a=n.x.max(n.y).max(n.z),o=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.near),u=_a("float").setGroup(ba).onRenderUpdate(()=>s.camera.far),l=fc("bias","float",s).setGroup(ba),d=gn(1).toVar();return cn(a.sub(u).lessThanEqual(0).and(a.sub(o).greaterThanEqual(0)),()=>{const r=Bp(a.negate(),o,u);r.addAssign(l);const n=i.normalize();d.assign(e({depthTexture:t,bd3D:n,dp:r,shadow:s}))}),d});class Y_ extends I_{static get type(){return"PointShadowNode"}constructor(e,t=null){super(e,t)}getShadowFilterFn(e){return e===rt?j_:X_}setupShadowCoord(e,t){return t}setupShadowFilter(e,{filterFn:t,depthTexture:r,shadowCoord:s,shadow:i}){return K_({filterFn:t,depthTexture:r,shadowCoord:s,shadow:i})}setupRenderTarget(e,t){const r=new st(e.mapSize.width);r.name="PointShadowDepthTexture",r.compareFunction=Je;const s=t.createCubeRenderTarget(e.mapSize.width);return s.texture.name="PointShadowMap",s.depthTexture=r,{shadowMap:s,depthTexture:r}}renderShadow(e){const{shadow:t,shadowMap:r,light:s}=this,{renderer:i,scene:n}=e,a=t.camera,o=t.matrix,u=i.coordinateSystem===h,l=u?$_:H_,d=u?W_:q_;r.setSize(t.mapSize.width,t.mapSize.width);const c=i.autoClear,p=i.getClearColor(V_),g=i.getClearAlpha();i.autoClear=!1,i.setClearColor(t.clearColor,t.clearAlpha);for(let e=0;e<6;e++){i.setRenderTarget(r,e),i.clear();const u=s.distance||a.far;u!==a.far&&(a.far=u,a.updateProjectionMatrix()),G_.setFromMatrixPosition(s.matrixWorld),a.position.copy(G_),z_.copy(a.position),z_.add(l[e]),a.up.copy(d[e]),a.lookAt(z_),a.updateMatrixWorld(),o.makeTranslation(-G_.x,-G_.y,-G_.z),k_.multiplyMatrices(a.projectionMatrix,a.matrixWorldInverse),t._frustum.setFromProjectionMatrix(k_,a.coordinateSystem,a.reversedDepth);const c=n.name;n.name=`Point Light Shadow [ ${s.name||"ID: "+s.id} ] - Face ${e+1}`,i.render(n,a),n.name=c}i.autoClear=c,i.setClearColor(p,g)}}const Q_=(e,t)=>new Y_(e,t);class Z_ extends mp{static get type(){return"AnalyticLightNode"}constructor(t=null){super(),this.light=t,this.color=new e,this.colorNode=t&&t.colorNode||_a(this.color).setGroup(ba),this.baseColorNode=null,this.shadowNode=null,this.shadowColorNode=null,this.isAnalyticLightNode=!0,this.updateType=Js.FRAME,t&&t.shadow&&(this._shadowDisposeListener=()=>{this.disposeShadow()},t.addEventListener("dispose",this._shadowDisposeListener))}dispose(){this._shadowDisposeListener&&this.light.removeEventListener("dispose",this._shadowDisposeListener),super.dispose()}disposeShadow(){null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null),this.shadowColorNode=null,null!==this.baseColorNode&&(this.colorNode=this.baseColorNode,this.baseColorNode=null)}getHash(){return this.light.uuid}getLightVector(e){return n_(this.light).sub(e.context.positionView||Ud)}setupDirect(){}setupDirectRectArea(){}setupShadowNode(){return O_(this.light)}setupShadow(e){const{renderer:t}=e;if(!1===t.shadowMap.enabled)return;let r=this.shadowColorNode;if(null===r){const e=this.light.shadow.shadowNode;let t;t=void 0!==e?Zi(e):this.setupShadowNode(),this.shadowNode=t,this.shadowColorNode=r=this.colorNode.mul(t),this.baseColorNode=this.colorNode}e.context.getShadow&&(r=e.context.getShadow(this,e)),this.colorNode=r}setup(e){this.colorNode=this.baseColorNode||this.colorNode,this.light.castShadow?e.object.receiveShadow&&this.setupShadow(e):null!==this.shadowNode&&(this.shadowNode.dispose(),this.shadowNode=null,this.shadowColorNode=null);const t=this.setupDirect(e),r=this.setupDirectRectArea(e);t&&e.lightsNode.setupDirectLight(e,this,t),r&&e.lightsNode.setupDirectRectAreaLight(e,this,r)}update(){const{light:e}=this;this.color.copy(e.color).multiplyScalar(e.intensity)}}const J_=un(({lightDistance:e,cutoffDistance:t,decayExponent:r})=>{const s=e.pow(r).max(.01).reciprocal();return t.greaterThan(0).select(s.mul(e.div(t).pow4().oneMinus().clamp().pow2()),s)}),ev=({color:e,lightVector:t,cutoffDistance:r,decayExponent:s})=>{const i=t.normalize(),n=t.length(),a=J_({lightDistance:n,cutoffDistance:r,decayExponent:s});return{lightDirection:i,lightColor:e.mul(a)}};class tv extends Z_{static get type(){return"PointLightNode"}constructor(e=null){super(e),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(2).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}setupShadowNode(){return Q_(this.light)}setupDirect(e){return ev({color:this.colorNode,lightVector:this.getLightVector(e),cutoffDistance:this.cutoffDistanceNode,decayExponent:this.decayExponentNode})}}const rv=un(([e=Rl()])=>{const t=e.mul(2),r=t.x.floor(),s=t.y.floor();return r.add(s).mod(2).sign()}),sv=un(([e=Rl()],{renderer:t,material:r})=>{const s=iu(e.mul(2).sub(1));let i;if(r.alphaToCoverage&&t.currentSamples>0){const e=gn(s.fwidth()).toVar();i=lu(e.oneMinus(),e.add(1),s).oneMinus()}else i=bu(s.greaterThan(1),0,1);return i}),iv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=yn(e).toVar();return bu(n,i,s)}).setLayout({name:"mx_select",type:"float",inputs:[{name:"b",type:"bool"},{name:"t",type:"float"},{name:"f",type:"float"}]}),nv=un(([e,t])=>{const r=yn(t).toVar(),s=gn(e).toVar();return bu(r,s.negate(),s)}).setLayout({name:"mx_negate_if",type:"float",inputs:[{name:"val",type:"float"},{name:"b",type:"bool"}]}),av=un(([e])=>{const t=gn(e).toVar();return mn(To(t))}).setLayout({name:"mx_floor",type:"int",inputs:[{name:"x",type:"float"}]}),ov=un(([e,t])=>{const r=gn(e).toVar();return t.assign(av(r)),r.sub(gn(t))}),uv=gb([un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=gn(s).toVar(),l=gn(r).toVar(),d=gn(t).toVar(),c=gn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"}]}),un(([e,t,r,s,i,n])=>{const a=gn(n).toVar(),o=gn(i).toVar(),u=vn(s).toVar(),l=vn(r).toVar(),d=vn(t).toVar(),c=vn(e).toVar(),h=gn(Ba(1,o)).toVar();return Ba(1,a).mul(c.mul(h).add(d.mul(o))).add(a.mul(l.mul(h).add(u.mul(o))))}).setLayout({name:"mx_bilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"}]})]),lv=gb([un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=gn(o).toVar(),m=gn(a).toVar(),f=gn(n).toVar(),y=gn(i).toVar(),b=gn(s).toVar(),x=gn(r).toVar(),T=gn(t).toVar(),_=gn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_0",type:"float",inputs:[{name:"v0",type:"float"},{name:"v1",type:"float"},{name:"v2",type:"float"},{name:"v3",type:"float"},{name:"v4",type:"float"},{name:"v5",type:"float"},{name:"v6",type:"float"},{name:"v7",type:"float"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]}),un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=gn(d).toVar(),h=gn(l).toVar(),p=gn(u).toVar(),g=vn(o).toVar(),m=vn(a).toVar(),f=vn(n).toVar(),y=vn(i).toVar(),b=vn(s).toVar(),x=vn(r).toVar(),T=vn(t).toVar(),_=vn(e).toVar(),v=gn(Ba(1,p)).toVar(),N=gn(Ba(1,h)).toVar();return gn(Ba(1,c)).toVar().mul(N.mul(_.mul(v).add(T.mul(p))).add(h.mul(x.mul(v).add(b.mul(p))))).add(c.mul(N.mul(y.mul(v).add(f.mul(p))).add(h.mul(m.mul(v).add(g.mul(p))))))}).setLayout({name:"mx_trilerp_1",type:"vec3",inputs:[{name:"v0",type:"vec3"},{name:"v1",type:"vec3"},{name:"v2",type:"vec3"},{name:"v3",type:"vec3"},{name:"v4",type:"vec3"},{name:"v5",type:"vec3"},{name:"v6",type:"vec3"},{name:"v7",type:"vec3"},{name:"s",type:"float"},{name:"t",type:"float"},{name:"r",type:"float"}]})]),dv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=fn(e).toVar(),a=fn(n.bitAnd(fn(7))).toVar(),o=gn(iv(a.lessThan(fn(4)),i,s)).toVar(),u=gn(La(2,iv(a.lessThan(fn(4)),s,i))).toVar();return nv(o,yn(a.bitAnd(fn(1)))).add(nv(u,yn(a.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_0",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"}]}),cv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=fn(e).toVar(),u=fn(o.bitAnd(fn(15))).toVar(),l=gn(iv(u.lessThan(fn(8)),a,n)).toVar(),d=gn(iv(u.lessThan(fn(4)),n,iv(u.equal(fn(12)).or(u.equal(fn(14))),a,i))).toVar();return nv(l,yn(u.bitAnd(fn(1)))).add(nv(d,yn(u.bitAnd(fn(2)))))}).setLayout({name:"mx_gradient_float_1",type:"float",inputs:[{name:"hash",type:"uint"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),hv=gb([dv,cv]),pv=un(([e,t,r])=>{const s=gn(r).toVar(),i=gn(t).toVar(),n=Sn(e).toVar();return vn(hv(n.x,i,s),hv(n.y,i,s),hv(n.z,i,s))}).setLayout({name:"mx_gradient_vec3_0",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"}]}),gv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=gn(t).toVar(),o=Sn(e).toVar();return vn(hv(o.x,a,n,i),hv(o.y,a,n,i),hv(o.z,a,n,i))}).setLayout({name:"mx_gradient_vec3_1",type:"vec3",inputs:[{name:"hash",type:"uvec3"},{name:"x",type:"float"},{name:"y",type:"float"},{name:"z",type:"float"}]}),mv=gb([pv,gv]),fv=un(([e])=>{const t=gn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_0",type:"float",inputs:[{name:"v",type:"float"}]}),yv=un(([e])=>{const t=gn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_0",type:"float",inputs:[{name:"v",type:"float"}]}),bv=gb([fv,un(([e])=>{const t=vn(e).toVar();return La(.6616,t)}).setLayout({name:"mx_gradient_scale2d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),xv=gb([yv,un(([e])=>{const t=vn(e).toVar();return La(.982,t)}).setLayout({name:"mx_gradient_scale3d_1",type:"vec3",inputs:[{name:"v",type:"vec3"}]})]),Tv=un(([e,t])=>{const r=mn(t).toVar(),s=fn(e).toVar();return s.shiftLeft(r).bitOr(s.shiftRight(mn(32).sub(r)))}).setLayout({name:"mx_rotl32",type:"uint",inputs:[{name:"x",type:"uint"},{name:"k",type:"int"}]}),_v=un(([e,t,r])=>{e.subAssign(r),e.bitXorAssign(Tv(r,mn(4))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(6))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(8))),t.addAssign(e),e.subAssign(r),e.bitXorAssign(Tv(r,mn(16))),r.addAssign(t),t.subAssign(e),t.bitXorAssign(Tv(e,mn(19))),e.addAssign(r),r.subAssign(t),r.bitXorAssign(Tv(t,mn(4))),t.addAssign(e)}),vv=un(([e,t,r])=>{const s=fn(r).toVar(),i=fn(t).toVar(),n=fn(e).toVar();return s.bitXorAssign(i),s.subAssign(Tv(i,mn(14))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(11))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(25))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(16))),n.bitXorAssign(s),n.subAssign(Tv(s,mn(4))),i.bitXorAssign(n),i.subAssign(Tv(n,mn(14))),s.bitXorAssign(i),s.subAssign(Tv(i,mn(24))),s}).setLayout({name:"mx_bjfinal",type:"uint",inputs:[{name:"a",type:"uint"},{name:"b",type:"uint"},{name:"c",type:"uint"}]}),Nv=un(([e])=>{const t=fn(e).toVar();return gn(t).div(gn(fn(mn(4294967295))))}).setLayout({name:"mx_bits_to_01",type:"float",inputs:[{name:"bits",type:"uint"}]}),Sv=un(([e])=>{const t=gn(e).toVar();return t.mul(t).mul(t).mul(t.mul(t.mul(6).sub(15)).add(10))}).setLayout({name:"mx_fade",type:"float",inputs:[{name:"t",type:"float"}]}),Rv=gb([un(([e])=>{const t=mn(e).toVar(),r=fn(fn(1)).toVar(),s=fn(fn(mn(3735928559)).add(r.shiftLeft(fn(2))).add(fn(13))).toVar();return vv(s.add(fn(t)),s,s)}).setLayout({name:"mx_hash_int_0",type:"uint",inputs:[{name:"x",type:"int"}]}),un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(fn(2)).toVar(),n=fn().toVar(),a=fn().toVar(),o=fn().toVar();return n.assign(a.assign(o.assign(fn(mn(3735928559)).add(i.shiftLeft(fn(2))).add(fn(13))))),n.addAssign(fn(s)),a.addAssign(fn(r)),vv(n,a,o)}).setLayout({name:"mx_hash_int_1",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(fn(3)).toVar(),o=fn().toVar(),u=fn().toVar(),l=fn().toVar();return o.assign(u.assign(l.assign(fn(mn(3735928559)).add(a.shiftLeft(fn(2))).add(fn(13))))),o.addAssign(fn(n)),u.addAssign(fn(i)),l.addAssign(fn(s)),vv(o,u,l)}).setLayout({name:"mx_hash_int_2",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]}),un(([e,t,r,s])=>{const i=mn(s).toVar(),n=mn(r).toVar(),a=mn(t).toVar(),o=mn(e).toVar(),u=fn(fn(4)).toVar(),l=fn().toVar(),d=fn().toVar(),c=fn().toVar();return l.assign(d.assign(c.assign(fn(mn(3735928559)).add(u.shiftLeft(fn(2))).add(fn(13))))),l.addAssign(fn(o)),d.addAssign(fn(a)),c.addAssign(fn(n)),_v(l,d,c),l.addAssign(fn(i)),vv(l,d,c)}).setLayout({name:"mx_hash_int_3",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"}]}),un(([e,t,r,s,i])=>{const n=mn(i).toVar(),a=mn(s).toVar(),o=mn(r).toVar(),u=mn(t).toVar(),l=mn(e).toVar(),d=fn(fn(5)).toVar(),c=fn().toVar(),h=fn().toVar(),p=fn().toVar();return c.assign(h.assign(p.assign(fn(mn(3735928559)).add(d.shiftLeft(fn(2))).add(fn(13))))),c.addAssign(fn(l)),h.addAssign(fn(u)),p.addAssign(fn(o)),_v(c,h,p),c.addAssign(fn(a)),h.addAssign(fn(n)),vv(c,h,p)}).setLayout({name:"mx_hash_int_4",type:"uint",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xx",type:"int"},{name:"yy",type:"int"}]})]),Av=gb([un(([e,t])=>{const r=mn(t).toVar(),s=mn(e).toVar(),i=fn(Rv(s,r)).toVar(),n=Sn().toVar();return n.x.assign(i.bitAnd(mn(255))),n.y.assign(i.shiftRight(mn(8)).bitAnd(mn(255))),n.z.assign(i.shiftRight(mn(16)).bitAnd(mn(255))),n}).setLayout({name:"mx_hash_vec3_0",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"}]}),un(([e,t,r])=>{const s=mn(r).toVar(),i=mn(t).toVar(),n=mn(e).toVar(),a=fn(Rv(n,i,s)).toVar(),o=Sn().toVar();return o.x.assign(a.bitAnd(mn(255))),o.y.assign(a.shiftRight(mn(8)).bitAnd(mn(255))),o.z.assign(a.shiftRight(mn(16)).bitAnd(mn(255))),o}).setLayout({name:"mx_hash_vec3_1",type:"uvec3",inputs:[{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"}]})]),Ev=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=gn(uv(hv(Rv(r,s),i,n),hv(Rv(r.add(mn(1)),s),i.sub(1),n),hv(Rv(r,s.add(mn(1))),i,n.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=gn(lv(hv(Rv(r,s,i),n,a,o),hv(Rv(r.add(mn(1)),s,i),n.sub(1),a,o),hv(Rv(r,s.add(mn(1)),i),n,a.sub(1),o),hv(Rv(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),hv(Rv(r,s,i.add(mn(1))),n,a,o.sub(1)),hv(Rv(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),hv(Rv(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),hv(Rv(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"}]})]),wv=gb([un(([e])=>{const t=bn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=gn(ov(t.x,r)).toVar(),n=gn(ov(t.y,s)).toVar(),a=gn(Sv(i)).toVar(),o=gn(Sv(n)).toVar(),u=vn(uv(mv(Av(r,s),i,n),mv(Av(r.add(mn(1)),s),i.sub(1),n),mv(Av(r,s.add(mn(1))),i,n.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1))),i.sub(1),n.sub(1)),a,o)).toVar();return bv(u)}).setLayout({name:"mx_perlin_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn().toVar(),s=mn().toVar(),i=mn().toVar(),n=gn(ov(t.x,r)).toVar(),a=gn(ov(t.y,s)).toVar(),o=gn(ov(t.z,i)).toVar(),u=gn(Sv(n)).toVar(),l=gn(Sv(a)).toVar(),d=gn(Sv(o)).toVar(),c=vn(lv(mv(Av(r,s,i),n,a,o),mv(Av(r.add(mn(1)),s,i),n.sub(1),a,o),mv(Av(r,s.add(mn(1)),i),n,a.sub(1),o),mv(Av(r.add(mn(1)),s.add(mn(1)),i),n.sub(1),a.sub(1),o),mv(Av(r,s,i.add(mn(1))),n,a,o.sub(1)),mv(Av(r.add(mn(1)),s,i.add(mn(1))),n.sub(1),a,o.sub(1)),mv(Av(r,s.add(mn(1)),i.add(mn(1))),n,a.sub(1),o.sub(1)),mv(Av(r.add(mn(1)),s.add(mn(1)),i.add(mn(1))),n.sub(1),a.sub(1),o.sub(1)),u,l,d)).toVar();return xv(c)}).setLayout({name:"mx_perlin_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"}]})]),Cv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return Nv(Rv(r))}).setLayout({name:"mx_cell_noise_float_0",type:"float",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return Nv(Rv(r,s))}).setLayout({name:"mx_cell_noise_float_1",type:"float",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return Nv(Rv(r,s,i))}).setLayout({name:"mx_cell_noise_float_2",type:"float",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return Nv(Rv(r,s,i,n))}).setLayout({name:"mx_cell_noise_float_3",type:"float",inputs:[{name:"p",type:"vec4"}]})]),Mv=gb([un(([e])=>{const t=gn(e).toVar(),r=mn(av(t)).toVar();return vn(Nv(Rv(r,mn(0))),Nv(Rv(r,mn(1))),Nv(Rv(r,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"float"}]}),un(([e])=>{const t=bn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar();return vn(Nv(Rv(r,s,mn(0))),Nv(Rv(r,s,mn(1))),Nv(Rv(r,s,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec2"}]}),un(([e])=>{const t=vn(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar();return vn(Nv(Rv(r,s,i,mn(0))),Nv(Rv(r,s,i,mn(1))),Nv(Rv(r,s,i,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_2",type:"vec3",inputs:[{name:"p",type:"vec3"}]}),un(([e])=>{const t=An(e).toVar(),r=mn(av(t.x)).toVar(),s=mn(av(t.y)).toVar(),i=mn(av(t.z)).toVar(),n=mn(av(t.w)).toVar();return vn(Nv(Rv(r,s,i,n,mn(0))),Nv(Rv(r,s,i,n,mn(1))),Nv(Rv(r,s,i,n,mn(2))))}).setLayout({name:"mx_cell_noise_vec3_3",type:"vec3",inputs:[{name:"p",type:"vec4"}]})]),Bv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=gn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(Ev(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_float",type:"float",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Lv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(0).toVar(),l=gn(1).toVar();return up(a,()=>{u.addAssign(l.mul(wv(o))),l.mulAssign(i),o.mulAssign(n)}),u}).setLayout({name:"mx_fractal_noise_vec3",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Fv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar();return bn(Bv(o,a,n,i),Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i))}).setLayout({name:"mx_fractal_noise_vec2",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Pv=un(([e,t,r,s])=>{const i=gn(s).toVar(),n=gn(r).toVar(),a=mn(t).toVar(),o=vn(e).toVar(),u=vn(Lv(o,a,n,i)).toVar(),l=gn(Bv(o.add(vn(mn(19),mn(193),mn(17))),a,n,i)).toVar();return An(u,l)}).setLayout({name:"mx_fractal_noise_vec4",type:"vec4",inputs:[{name:"p",type:"vec3"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Dv=gb([un(([e,t,r,s,i,n,a])=>{const o=mn(a).toVar(),u=gn(n).toVar(),l=mn(i).toVar(),d=mn(s).toVar(),c=mn(r).toVar(),h=mn(t).toVar(),p=bn(e).toVar(),g=vn(Mv(bn(h.add(d),c.add(l)))).toVar(),m=bn(g.x,g.y).toVar();m.subAssign(.5),m.mulAssign(u),m.addAssign(.5);const f=bn(bn(gn(h),gn(c)).add(m)).toVar(),y=bn(f.sub(p)).toVar();return cn(o.equal(mn(2)),()=>Mo(y.x).add(Mo(y.y))),cn(o.equal(mn(3)),()=>Ho(Mo(y.x),Mo(y.y))),Yo(y,y)}).setLayout({name:"mx_worley_distance_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),un(([e,t,r,s,i,n,a,o,u])=>{const l=mn(u).toVar(),d=gn(o).toVar(),c=mn(a).toVar(),h=mn(n).toVar(),p=mn(i).toVar(),g=mn(s).toVar(),m=mn(r).toVar(),f=mn(t).toVar(),y=vn(e).toVar(),b=vn(Mv(vn(f.add(p),m.add(h),g.add(c)))).toVar();b.subAssign(.5),b.mulAssign(d),b.addAssign(.5);const x=vn(vn(gn(f),gn(m),gn(g)).add(b)).toVar(),T=vn(x.sub(y)).toVar();return cn(l.equal(mn(2)),()=>Mo(T.x).add(Mo(T.y)).add(Mo(T.z))),cn(l.equal(mn(3)),()=>Ho(Mo(T.x),Mo(T.y),Mo(T.z))),Yo(T,T)}).setLayout({name:"mx_worley_distance_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"x",type:"int"},{name:"y",type:"int"},{name:"z",type:"int"},{name:"xoff",type:"int"},{name:"yoff",type:"int"},{name:"zoff",type:"int"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Uv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();l.assign(Wo(l,r))})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_float_0",type:"float",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Iv=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.y.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec2_0",type:"vec2",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Ov=un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=bn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=bn(ov(n.x,a),ov(n.y,o)).toVar(),l=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{const r=gn(Dv(u,e,t,a,o,i,s)).toVar();cn(r.lessThan(l.x),()=>{l.z.assign(l.y),l.y.assign(l.x),l.x.assign(r)}).ElseIf(r.lessThan(l.y),()=>{l.z.assign(l.y),l.y.assign(r)}).ElseIf(r.lessThan(l.z),()=>{l.z.assign(r)})})}),cn(s.equal(mn(0)),()=>{l.assign(bo(l))}),l}).setLayout({name:"mx_worley_noise_vec3_0",type:"vec3",inputs:[{name:"p",type:"vec2"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]}),Vv=gb([Uv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=gn(1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();d.assign(Wo(d,n))})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_float_1",type:"float",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),kv=gb([Iv,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=bn(1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.y.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec2_1",type:"vec2",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),Gv=gb([Ov,un(([e,t,r])=>{const s=mn(r).toVar(),i=gn(t).toVar(),n=vn(e).toVar(),a=mn().toVar(),o=mn().toVar(),u=mn().toVar(),l=vn(ov(n.x,a),ov(n.y,o),ov(n.z,u)).toVar(),d=vn(1e6,1e6,1e6).toVar();return up({start:-1,end:mn(1),name:"x",condition:"<="},({x:e})=>{up({start:-1,end:mn(1),name:"y",condition:"<="},({y:t})=>{up({start:-1,end:mn(1),name:"z",condition:"<="},({z:r})=>{const n=gn(Dv(l,e,t,r,a,o,u,i,s)).toVar();cn(n.lessThan(d.x),()=>{d.z.assign(d.y),d.y.assign(d.x),d.x.assign(n)}).ElseIf(n.lessThan(d.y),()=>{d.z.assign(d.y),d.y.assign(n)}).ElseIf(n.lessThan(d.z),()=>{d.z.assign(n)})})})}),cn(s.equal(mn(0)),()=>{d.assign(bo(d))}),d}).setLayout({name:"mx_worley_noise_vec3_1",type:"vec3",inputs:[{name:"p",type:"vec3"},{name:"jitter",type:"float"},{name:"metric",type:"int"}]})]),zv=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=bn(t).toVar(),p=bn(r).toVar(),g=bn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(vn(v,0),x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise2d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"texcoord",type:"vec2"},{name:"freq",type:"vec2"},{name:"offset",type:"vec2"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),$v=un(([e,t,r,s,i,n,a,o,u,l,d])=>{const c=mn(e).toVar(),h=vn(t).toVar(),p=vn(r).toVar(),g=vn(s).toVar(),m=gn(i).toVar(),f=gn(n).toVar(),y=gn(a).toVar(),b=yn(o).toVar(),x=mn(u).toVar(),T=gn(l).toVar(),_=gn(d).toVar(),v=h.mul(p).add(g),N=gn(0).toVar();return cn(c.equal(mn(0)),()=>{N.assign(wv(v))}),cn(c.equal(mn(1)),()=>{N.assign(Mv(v))}),cn(c.equal(mn(2)),()=>{N.assign(Gv(v,m,mn(0)))}),cn(c.equal(mn(3)),()=>{N.assign(Lv(v,x,T,_))}),N.assign(N.mul(y.sub(f)).add(f)),cn(b,()=>{N.assign(au(N,f,y))}),N}).setLayout({name:"mx_unifiednoise3d",type:"float",inputs:[{name:"noiseType",type:"int"},{name:"position",type:"vec3"},{name:"freq",type:"vec3"},{name:"offset",type:"vec3"},{name:"jitter",type:"float"},{name:"outmin",type:"float"},{name:"outmax",type:"float"},{name:"clampoutput",type:"bool"},{name:"octaves",type:"int"},{name:"lacunarity",type:"float"},{name:"diminish",type:"float"}]}),Wv=un(([e])=>{const t=e.y,r=e.z,s=vn().toVar();return cn(t.lessThan(1e-4),()=>{s.assign(vn(r,r,r))}).Else(()=>{let i=e.x;i=i.sub(To(i)).mul(6).toVar();const n=mn(Vo(i)),a=i.sub(gn(n)),o=r.mul(t.oneMinus()),u=r.mul(t.mul(a).oneMinus()),l=r.mul(t.mul(a.oneMinus()).oneMinus());cn(n.equal(mn(0)),()=>{s.assign(vn(r,l,o))}).ElseIf(n.equal(mn(1)),()=>{s.assign(vn(u,r,o))}).ElseIf(n.equal(mn(2)),()=>{s.assign(vn(o,r,l))}).ElseIf(n.equal(mn(3)),()=>{s.assign(vn(o,u,r))}).ElseIf(n.equal(mn(4)),()=>{s.assign(vn(l,o,r))}).Else(()=>{s.assign(vn(r,o,u))})}),s}).setLayout({name:"mx_hsvtorgb",type:"vec3",inputs:[{name:"hsv",type:"vec3"}]}),Hv=un(([e])=>{const t=vn(e).toVar(),r=gn(t.x).toVar(),s=gn(t.y).toVar(),i=gn(t.z).toVar(),n=gn(Wo(r,Wo(s,i))).toVar(),a=gn(Ho(r,Ho(s,i))).toVar(),o=gn(a.sub(n)).toVar(),u=gn().toVar(),l=gn().toVar(),d=gn().toVar();return d.assign(a),cn(a.greaterThan(0),()=>{l.assign(o.div(a))}).Else(()=>{l.assign(0)}),cn(l.lessThanEqual(0),()=>{u.assign(0)}).Else(()=>{cn(r.greaterThanEqual(a),()=>{u.assign(s.sub(i).div(o))}).ElseIf(s.greaterThanEqual(a),()=>{u.assign(Ma(2,i.sub(r).div(o)))}).Else(()=>{u.assign(Ma(4,r.sub(s).div(o)))}),u.mulAssign(1/6),cn(u.lessThan(0),()=>{u.addAssign(1)})}),vn(u,l,d)}).setLayout({name:"mx_rgbtohsv",type:"vec3",inputs:[{name:"c",type:"vec3"}]}),qv=un(([e])=>{const t=vn(e).toVar(),r=Rn(Oa(t,vn(.04045))).toVar(),s=vn(t.div(12.92)).toVar(),i=vn(Zo(Ho(t.add(vn(.055)),vn(0)).div(1.055),vn(2.4))).toVar();return nu(s,i,r)}).setLayout({name:"mx_srgb_texture_to_lin_rec709",type:"vec3",inputs:[{name:"color",type:"vec3"}]}),jv=(e,t)=>{e=gn(e),t=gn(t);const r=bn(t.dFdx(),t.dFdy()).length().mul(.7071067811865476);return lu(e.sub(r),e.add(r),t)},Xv=(e,t,r,s)=>nu(e,t,r[s].clamp()),Kv=(e,t,r,s,i)=>nu(e,t,jv(r,s[i])),Yv=un(([e,t,r])=>{const s=vo(e).toVar(),i=Ba(gn(.5).mul(t.sub(r)),Pd).div(s).toVar(),n=Ba(gn(-.5).mul(t.sub(r)),Pd).div(s).toVar(),a=vn().toVar();a.x=s.x.greaterThan(gn(0)).select(i.x,n.x),a.y=s.y.greaterThan(gn(0)).select(i.y,n.y),a.z=s.z.greaterThan(gn(0)).select(i.z,n.z);const o=Wo(a.x,a.y,a.z).toVar();return Pd.add(s.mul(o)).toVar().sub(r)}),Qv=un(([e,t])=>{const r=e.x,s=e.y,i=e.z;let n=t.element(0).mul(.886227);return n=n.add(t.element(1).mul(1.023328).mul(s)),n=n.add(t.element(2).mul(1.023328).mul(i)),n=n.add(t.element(3).mul(1.023328).mul(r)),n=n.add(t.element(4).mul(.858086).mul(r).mul(s)),n=n.add(t.element(5).mul(.858086).mul(s).mul(i)),n=n.add(t.element(6).mul(i.mul(i).mul(.743125).sub(.247708))),n=n.add(t.element(7).mul(.858086).mul(r).mul(i)),n=n.add(t.element(8).mul(.429043).mul(La(r,r).sub(La(s,s)))),n});var Zv=Object.freeze({__proto__:null,BRDF_GGX:Dg,BRDF_Lambert:Tg,BasicPointShadowFilter:j_,BasicShadowFilter:N_,Break:lp,Const:Cu,Continue:()=>gl("continue").toStack(),DFGLUT:Og,D_GGX:Lg,Discard:ml,EPSILON:so,F_Schlick:xg,Fn:un,HALF_PI:uo,INFINITY:io,If:cn,Loop:up,NodeAccess:ti,NodeShaderStage:Zs,NodeType:ei,NodeUpdateType:Js,OnBeforeMaterialUpdate:e=>ex(Jb.BEFORE_MATERIAL,e),OnBeforeObjectUpdate:e=>ex(Jb.BEFORE_OBJECT,e),OnMaterialUpdate:e=>ex(Jb.MATERIAL,e),OnObjectUpdate:e=>ex(Jb.OBJECT,e),PCFShadowFilter:S_,PCFSoftShadowFilter:R_,PI:no,PI2:ao,PointShadowFilter:X_,Return:()=>gl("return").toStack(),Schlick_to_F0:Gg,ScriptableNodeResources:rT,ShaderNode:Qi,Stack:hn,Switch:(...e)=>_i.Switch(...e),TBNViewMatrix:$c,TWO_PI:oo,VSMShadowFilter:A_,V_GGX_SmithCorrelated:Mg,Var:wu,VarIntent:Mu,abs:Mo,acesFilmicToneMapping:zx,acos:wo,add:Ma,addMethodChaining:Ni,addNodeElement:function(e){d("TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add",e)},agxToneMapping:qx,all:lo,alphaT:Yn,and:Ga,anisotropy:Qn,anisotropyB:Jn,anisotropyT:Zn,any:co,append:e=>(d("TSL: append() has been renamed to Stack()."),hn(e)),array:Na,arrayBuffer:e=>new xi(e,"ArrayBuffer"),asin:Eo,assign:Ra,atan:Co,atomicAdd:(e,t)=>AT(ST.ATOMIC_ADD,e,t),atomicAnd:(e,t)=>AT(ST.ATOMIC_AND,e,t),atomicFunc:AT,atomicLoad:e=>AT(ST.ATOMIC_LOAD,e,null),atomicMax:(e,t)=>AT(ST.ATOMIC_MAX,e,t),atomicMin:(e,t)=>AT(ST.ATOMIC_MIN,e,t),atomicOr:(e,t)=>AT(ST.ATOMIC_OR,e,t),atomicStore:(e,t)=>AT(ST.ATOMIC_STORE,e,t),atomicSub:(e,t)=>AT(ST.ATOMIC_SUB,e,t),atomicXor:(e,t)=>AT(ST.ATOMIC_XOR,e,t),attenuationColor:ha,attenuationDistance:ca,attribute:Sl,attributeArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new rx(e,r,s);return Wh(i,t,e)},backgroundBlurriness:ux,backgroundIntensity:lx,backgroundRotation:dx,batch:sp,bentNormalView:Hc,billboarding:Tb,bitAnd:Ha,bitNot:qa,bitOr:ja,bitXor:Xa,bitangentGeometry:Vc,bitangentLocal:kc,bitangentView:Gc,bitangentWorld:zc,bitcast:qy,blendBurn:Wp,blendColor:Xp,blendDodge:Hp,blendOverlay:jp,blendScreen:qp,blur:Gm,bool:yn,buffer:Ul,bufferAttribute:Ju,builtin:kl,builtinAOContext:Su,builtinShadowContext:Nu,bumpMap:Jc,bvec2:_n,bvec3:Rn,bvec4:Cn,bypass:ll,cache:ol,call:Ea,cameraFar:td,cameraIndex:Jl,cameraNear:ed,cameraNormalMatrix:ad,cameraPosition:od,cameraProjectionMatrix:rd,cameraProjectionMatrixInverse:sd,cameraViewMatrix:id,cameraViewport:ud,cameraWorldMatrix:nd,cbrt:su,cdl:Ex,ceil:_o,checker:rv,cineonToneMapping:kx,clamp:au,clearcoat:$n,clearcoatNormalView:Kd,clearcoatRoughness:Wn,clipSpace:Md,code:Kx,color:pn,colorSpaceToWorking:Gu,colorToDirection:e=>Zi(e).mul(2).sub(1),compute:il,computeKernel:sl,computeSkinning:(e,t=null)=>{const r=new np(e);return r.positionNode=Wh(new W(e.geometry.getAttribute("position").array,3),"vec3").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinIndexNode=Wh(new W(new Uint32Array(e.geometry.getAttribute("skinIndex").array),4),"uvec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.skinWeightNode=Wh(new W(e.geometry.getAttribute("skinWeight").array,4),"vec4").setPBO(!0).toReadOnly().element(jh).toVar(),r.bindMatrixNode=_a(e.bindMatrix,"mat4"),r.bindMatrixInverseNode=_a(e.bindMatrixInverse,"mat4"),r.boneMatricesNode=Ul(e.skeleton.boneMatrices,"mat4",e.skeleton.bones.length),r.toPositionNode=t,Zi(r)},context:Tu,convert:Pn,convertColorSpace:(e,t,r)=>Zi(new Vu(Zi(e),t,r)),convertToTexture:(e,...t)=>e.isSampleNode||e.isTextureNode?e:e.isPassNode?e.getTextureNode():qb(e,...t),cos:Ro,countLeadingZeros:Qy,countOneBits:Zy,countTrailingZeros:Yy,cross:Qo,cubeTexture:pc,cubeTextureBase:hc,dFdx:Do,dFdy:Uo,dashSize:na,debug:xl,decrement:eo,decrementBefore:Za,defaultBuildStages:si,defaultShaderStages:ri,defined:Ki,degrees:po,deltaTime:fb,densityFogFactor:oT,depth:Dp,depthPass:(e,t,r)=>new Ux(Ux.DEPTH,e,t,r),determinant:zo,difference:Ko,diffuseColor:On,diffuseContribution:Vn,directPointLight:ev,directionToColor:qc,directionToFaceDirection:Gd,dispersion:pa,disposeShadowMaterial:w_,distance:Xo,div:Fa,dot:Yo,drawIndex:Qh,dynamicBufferAttribute:(e,t=null,r=0,s=0)=>Zu(e,t,r,s,x),element:Fn,emissive:kn,equal:Da,equirectUV:ag,exp:go,exp2:mo,exponentialHeightFogFactor:uT,expression:gl,faceDirection:kd,faceForward:du,faceforward:mu,float:gn,floatBitsToInt:e=>new Hy(e,"int","float"),floatBitsToUint:jy,floor:To,fog:lT,fract:No,frameGroup:ya,frameId:yb,frontFacing:Vd,fwidth:ko,gain:(e,t)=>e.lessThan(.5)?eb(e.mul(2),t).div(2):Ba(1,eb(La(Ba(1,e),2),t).div(2)),gapSize:aa,getConstNodeType:Yi,getCurrentStack:dn,getDirection:Im,getDistanceAttenuation:J_,getGeometryRoughness:wg,getNormalFromDepth:Kb,getParallaxCorrectNormal:Yv,getRoughness:Cg,getScreenPosition:Xb,getShIrradianceAt:Qv,getShadowMaterial:E_,getShadowRenderObjectFunction:B_,getTextureIndex:zy,getViewPosition:jb,ggxConvolution:Hm,globalId:bT,glsl:(e,t)=>Kx(e,t,"glsl"),glslFn:(e,t)=>Qx(e,t,"glsl"),grayscale:vx,greaterThan:Oa,greaterThanEqual:ka,hash:Jy,highpModelNormalViewMatrix:Cd,highpModelViewMatrix:wd,hue:Rx,increment:Ja,incrementBefore:Qa,inspector:vl,instance:Jh,instanceIndex:jh,instancedArray:(e,t="float")=>{let r,s;!0===t.isStruct?(r=t.layout.getLength(),s=zs("float")):(r=$s(t),s=zs(t));const i=new tx(e,r,s);return Wh(i,t,e)},instancedBufferAttribute:el,instancedDynamicBufferAttribute:tl,instancedMesh:tp,int:mn,intBitsToFloat:e=>new Hy(e,"float","int"),interleavedGradientNoise:Yb,inverse:$o,inverseSqrt:xo,inversesqrt:fu,invocationLocalIndex:Yh,invocationSubgroupIndex:Kh,ior:ua,iridescence:jn,iridescenceIOR:Xn,iridescenceThickness:Kn,isolate:al,ivec2:xn,ivec3:Nn,ivec4:En,js:(e,t)=>Kx(e,t,"js"),label:Ru,length:Lo,lengthSq:iu,lessThan:Ia,lessThanEqual:Va,lightPosition:s_,lightProjectionUV:r_,lightShadowMatrix:t_,lightTargetDirection:a_,lightTargetPosition:i_,lightViewPosition:n_,lightingContext:bp,lights:(e=[])=>(new d_).setLights(e),linearDepth:Up,linearToneMapping:Ox,localId:xT,log:fo,log2:yo,logarithmicDepthToViewZ:(e,t,r)=>{const s=e.mul(fo(r.div(t)));return gn(Math.E).pow(s).mul(t).negate()},luminance:Ax,mat2:Mn,mat3:Bn,mat4:Ln,matcapUV:Mf,materialAO:Oh,materialAlphaTest:rh,materialAnisotropy:_h,materialAnisotropyVector:Vh,materialAttenuationColor:Ch,materialAttenuationDistance:wh,materialClearcoat:mh,materialClearcoatNormal:yh,materialClearcoatRoughness:fh,materialColor:sh,materialDispersion:Uh,materialEmissive:nh,materialEnvIntensity:ic,materialEnvRotation:nc,materialIOR:Eh,materialIridescence:vh,materialIridescenceIOR:Nh,materialIridescenceThickness:Sh,materialLightMap:Ih,materialLineDashOffset:Ph,materialLineDashSize:Bh,materialLineGapSize:Lh,materialLineScale:Mh,materialLineWidth:Fh,materialMetalness:ph,materialNormal:gh,materialOpacity:ah,materialPointSize:Dh,materialReference:xc,materialReflectivity:ch,materialRefractionRatio:sc,materialRotation:bh,materialRoughness:hh,materialSheen:xh,materialSheenRoughness:Th,materialShininess:ih,materialSpecular:oh,materialSpecularColor:lh,materialSpecularIntensity:uh,materialSpecularStrength:dh,materialThickness:Ah,materialTransmission:Rh,max:Ho,maxMipLevel:Cl,mediumpModelViewMatrix:Ed,metalness:zn,min:Wo,mix:nu,mixElement:hu,mod:Pa,modInt:to,modelDirection:bd,modelNormalMatrix:Sd,modelPosition:Td,modelRadius:Nd,modelScale:_d,modelViewMatrix:Ad,modelViewPosition:vd,modelViewProjection:kh,modelWorldMatrix:xd,modelWorldMatrixInverse:Rd,morphReference:gp,mrt:Wy,mul:La,mx_aastep:jv,mx_add:(e,t=gn(0))=>Ma(e,t),mx_atan2:(e=gn(0),t=gn(1))=>Co(e,t),mx_cell_noise_float:(e=Rl())=>Cv(e.convert("vec2|vec3")),mx_contrast:(e,t=1,r=.5)=>gn(e).sub(r).mul(t).add(r),mx_divide:(e,t=gn(1))=>Fa(e,t),mx_fractal_noise_float:(e=Rl(),t=3,r=2,s=.5,i=1)=>Bv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec2:(e=Rl(),t=3,r=2,s=.5,i=1)=>Fv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec3:(e=Rl(),t=3,r=2,s=.5,i=1)=>Lv(e,mn(t),r,s).mul(i),mx_fractal_noise_vec4:(e=Rl(),t=3,r=2,s=.5,i=1)=>Pv(e,mn(t),r,s).mul(i),mx_frame:()=>yb,mx_heighttonormal:(e,t)=>(e=vn(e),t=gn(t),Jc(e,t)),mx_hsvtorgb:Wv,mx_ifequal:(e,t,r,s)=>e.equal(t).mix(r,s),mx_ifgreater:(e,t,r,s)=>e.greaterThan(t).mix(r,s),mx_ifgreatereq:(e,t,r,s)=>e.greaterThanEqual(t).mix(r,s),mx_invert:(e,t=gn(1))=>Ba(t,e),mx_modulo:(e,t=gn(1))=>Pa(e,t),mx_multiply:(e,t=gn(1))=>La(e,t),mx_noise_float:(e=Rl(),t=1,r=0)=>Ev(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec3:(e=Rl(),t=1,r=0)=>wv(e.convert("vec2|vec3")).mul(t).add(r),mx_noise_vec4:(e=Rl(),t=1,r=0)=>{e=e.convert("vec2|vec3");return An(wv(e),Ev(e.add(bn(19,73)))).mul(t).add(r)},mx_place2d:(e,t=bn(.5,.5),r=bn(1,1),s=gn(0),i=bn(0,0))=>{let n=e;if(t&&(n=n.sub(t)),r&&(n=n.mul(r)),s){const e=s.mul(Math.PI/180),t=e.cos(),r=e.sin();n=bn(n.x.mul(t).sub(n.y.mul(r)),n.x.mul(r).add(n.y.mul(t)))}return t&&(n=n.add(t)),i&&(n=n.add(i)),n},mx_power:(e,t=gn(1))=>Zo(e,t),mx_ramp4:(e,t,r,s,i=Rl())=>{const n=i.x.clamp(),a=i.y.clamp(),o=nu(e,t,n),u=nu(r,s,n);return nu(o,u,a)},mx_ramplr:(e,t,r=Rl())=>Xv(e,t,r,"x"),mx_ramptb:(e,t,r=Rl())=>Xv(e,t,r,"y"),mx_rgbtohsv:Hv,mx_rotate2d:(e,t)=>{e=bn(e);const r=(t=gn(t)).mul(Math.PI/180);return Pf(e,r)},mx_rotate3d:(e,t,r)=>{e=vn(e),t=gn(t),r=vn(r);const s=t.mul(Math.PI/180),i=r.normalize(),n=s.cos(),a=s.sin(),o=gn(1).sub(n);return e.mul(n).add(i.cross(e).mul(a)).add(i.mul(i.dot(e)).mul(o))},mx_safepower:(e,t=1)=>(e=gn(e)).abs().pow(t).mul(e.sign()),mx_separate:(e,t=null)=>{if("string"==typeof t){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3},s=t.replace(/^out/,"").toLowerCase();if(void 0!==r[s])return e.element(r[s])}if("number"==typeof t)return e.element(t);if("string"==typeof t&&1===t.length){const r={x:0,r:0,y:1,g:1,z:2,b:2,w:3,a:3};if(void 0!==r[t])return e.element(r[t])}return e},mx_splitlr:(e,t,r,s=Rl())=>Kv(e,t,r,s,"x"),mx_splittb:(e,t,r,s=Rl())=>Kv(e,t,r,s,"y"),mx_srgb_texture_to_lin_rec709:qv,mx_subtract:(e,t=gn(0))=>Ba(e,t),mx_timer:()=>mb,mx_transform_uv:(e=1,t=0,r=Rl())=>r.mul(e).add(t),mx_unifiednoise2d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>zv(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_unifiednoise3d:(e,t=Rl(),r=bn(1,1),s=bn(0,0),i=1,n=0,a=1,o=!1,u=1,l=2,d=.5)=>$v(e,t.convert("vec2|vec3"),r,s,i,n,a,o,u,l,d),mx_worley_noise_float:(e=Rl(),t=1)=>Vv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec2:(e=Rl(),t=1)=>kv(e.convert("vec2|vec3"),t,mn(1)),mx_worley_noise_vec3:(e=Rl(),t=1)=>Gv(e.convert("vec2|vec3"),t,mn(1)),negate:Fo,neutralToneMapping:jx,nodeArray:tn,nodeImmutable:sn,nodeObject:Zi,nodeObjectIntent:Ji,nodeObjects:en,nodeProxy:rn,nodeProxyIntent:nn,normalFlat:Wd,normalGeometry:zd,normalLocal:$d,normalMap:Kc,normalView:jd,normalViewGeometry:Hd,normalWorld:Xd,normalWorldGeometry:qd,normalize:vo,not:$a,notEqual:Ua,numWorkgroups:fT,objectDirection:cd,objectGroup:xa,objectPosition:pd,objectRadius:fd,objectScale:gd,objectViewPosition:md,objectWorldMatrix:hd,oneMinus:Po,or:za,orthographicDepthToViewZ:(e,t,r)=>t.sub(r).mul(e).sub(t),oscSawtooth:(e=mb)=>e.fract(),oscSine:(e=mb)=>e.add(.75).mul(2*Math.PI).sin().mul(.5).add(.5),oscSquare:(e=mb)=>e.fract().round(),oscTriangle:(e=mb)=>e.add(.5).fract().mul(2).sub(1).abs(),output:ia,outputStruct:Oy,overloadingFn:gb,packHalf2x16:ib,packSnorm2x16:rb,packUnorm2x16:sb,parabola:eb,parallaxDirection:Wc,parallaxUV:(e,t)=>e.sub(Wc.mul(t)),parameter:(e,t)=>new Ly(e,t),pass:(e,t,r)=>new Ux(Ux.COLOR,e,t,r),passTexture:(e,t)=>new Px(e,t),pcurve:(e,t,r)=>Zo(Fa(Zo(e,t),Ma(Zo(e,t),Zo(Ba(1,e),r))),1/t),perspectiveDepthToViewZ:Lp,pmremTexture:mf,pointShadow:Q_,pointUV:ix,pointWidth:oa,positionGeometry:Bd,positionLocal:Ld,positionPrevious:Fd,positionView:Ud,positionViewDirection:Id,positionWorld:Pd,positionWorldDirection:Dd,posterize:Cx,pow:Zo,pow2:Jo,pow3:eu,pow4:tu,premultiplyAlpha:Kp,property:Un,quadBroadcast:ZT,quadSwapDiagonal:qT,quadSwapX:WT,quadSwapY:HT,radians:ho,rand:cu,range:pT,rangeFogFactor:aT,reciprocal:Oo,reference:fc,referenceBuffer:yc,reflect:jo,reflectVector:uc,reflectView:ac,reflector:e=>new Ob(e),refract:uu,refractVector:lc,refractView:oc,reinhardToneMapping:Vx,remap:cl,remapClamp:hl,renderGroup:ba,renderOutput:yl,rendererReference:Hu,replaceDefaultUV:function(e,t=null){return Tu(t,{getUV:e})},rotate:Pf,rotateUV:bb,roughness:Gn,round:Io,rtt:qb,sRGBTransferEOTF:Uu,sRGBTransferOETF:Iu,sample:(e,t=null)=>new Zb(e,Zi(t)),sampler:e=>(!0===e.isNode?e:Fl(e)).convert("sampler"),samplerComparison:e=>(!0===e.isNode?e:Fl(e)).convert("samplerComparison"),saturate:ou,saturation:Nx,screenCoordinate:jl,screenDPR:Wl,screenSize:ql,screenUV:Hl,scriptable:iT,scriptableValue:Jx,select:bu,setCurrentStack:ln,setName:vu,shaderStages:ii,shadow:O_,shadowPositionWorld:h_,shapeCircle:sv,sharedUniformGroup:fa,sheen:Hn,sheenRoughness:qn,shiftLeft:Ka,shiftRight:Ya,shininess:sa,sign:Bo,sin:So,sinc:(e,t)=>So(no.mul(t.mul(e).sub(1))).div(no.mul(t.mul(e).sub(1))),skinning:ap,smoothstep:lu,smoothstepElement:pu,specularColor:ea,specularColorBlended:ta,specularF90:ra,spherizeUV:xb,split:(e,t)=>Zi(new gi(Zi(e),t)),spritesheetUV:vb,sqrt:bo,stack:Py,step:qo,stepElement:gu,storage:Wh,storageBarrier:()=>_T("storage").toStack(),storageTexture:hx,string:(e="")=>new xi(e,"string"),struct:(e,t=null)=>{const r=new Dy(e,t),s=(...t)=>{let s=null;if(t.length>0)if(t[0].isNode){s={};const r=Object.keys(e);for(let e=0;emx(e,t).level(r),texture3DLoad:(...e)=>mx(...e).setSampler(!1),textureBarrier:()=>_T("texture").toStack(),textureBicubic:om,textureBicubicLevel:am,textureCubeUV:Om,textureLevel:(e,t,r)=>Fl(e,t).level(r),textureLoad:Pl,textureSize:El,textureStore:(e,t,r)=>{const s=hx(e,t,r);return null!==r&&s.toStack(),s},thickness:da,time:mb,toneMapping:ju,toneMappingExposure:Xu,toonOutlinePass:(t,r,s=new e(0,0,0),i=.003,n=1)=>Zi(new Ix(t,r,Zi(s),Zi(i),Zi(n))),transformDirection:ru,transformNormal:Yd,transformNormalToView:Qd,transformedClearcoatNormalView:ec,transformedNormalView:Zd,transformedNormalWorld:Jd,transmission:la,transpose:Go,triNoise3D:cb,triplanarTexture:(...e)=>Nb(...e),triplanarTextures:Nb,trunc:Vo,uint:fn,uintBitsToFloat:e=>new Hy(e,"float","uint"),uniform:_a,uniformArray:Vl,uniformCubeTexture:(e=dc)=>hc(e),uniformFlow:_u,uniformGroup:ma,uniformTexture:(e=Ml)=>Fl(e),unpackHalf2x16:ub,unpackNormal:jc,unpackSnorm2x16:ab,unpackUnorm2x16:ob,unpremultiplyAlpha:Yp,userData:(e,t,r)=>new fx(e,t,r),uv:Rl,uvec2:Tn,uvec3:Sn,uvec4:wn,varying:Pu,varyingProperty:In,vec2:bn,vec3:vn,vec4:An,vectorComponents:ni,velocity:_x,vertexColor:$p,vertexIndex:qh,vertexStage:Du,vibrance:Sx,viewZToLogarithmicDepth:Fp,viewZToOrthographicDepth:Mp,viewZToPerspectiveDepth:Bp,viewport:Xl,viewportCoordinate:Yl,viewportDepthTexture:wp,viewportLinearDepth:Ip,viewportMipTexture:Np,viewportOpaqueMipTexture:Rp,viewportResolution:Zl,viewportSafeUV:_b,viewportSharedTexture:Lx,viewportSize:Kl,viewportTexture:vp,viewportUV:Ql,vogelDiskSample:Qb,wgsl:(e,t)=>Kx(e,t,"wgsl"),wgslFn:(e,t)=>Qx(e,t,"wgsl"),workgroupArray:(e,t)=>new NT("Workgroup",e,t),workgroupBarrier:()=>_T("workgroup").toStack(),workgroupId:yT,workingToColorSpace:ku,xor:Wa});const Jv=new By;class eN extends ty{constructor(e,t){super(),this.renderer=e,this.nodes=t}update(e,t,r){const s=this.renderer,i=this.nodes.getBackgroundNode(e)||e.background;let n=!1;if(null===i)s._clearColor.getRGB(Jv),Jv.a=s._clearColor.a;else if(!0===i.isColor)i.getRGB(Jv),Jv.a=1,n=!0;else if(!0===i.isNode){const u=this.get(e),l=i;Jv.copy(s._clearColor);let d=u.backgroundMesh;if(void 0===d){const h=An(l).mul(lx).context({getUV:()=>dx.mul(qd),getTextureLevel:()=>ux}),p=rd.element(3).element(3).equal(1),g=Fa(1,rd.element(1).element(1)).mul(3),m=p.select(Ld.mul(g),Ld),f=Ad.mul(An(m,0));let y=rd.mul(An(f.xyz,1));y=y.setZ(y.w);const b=new Qp;function x(){i.removeEventListener("dispose",x),d.material.dispose(),d.geometry.dispose()}b.name="Background.material",b.side=M,b.depthTest=!1,b.depthWrite=!1,b.allowOverride=!1,b.fog=!1,b.lights=!1,b.vertexNode=y,b.colorNode=h,u.backgroundMeshNode=h,u.backgroundMesh=d=new ne(new it(1,32,32),b),d.frustumCulled=!1,d.name="Background.mesh",i.addEventListener("dispose",x)}const c=l.getCacheKey();u.backgroundCacheKey!==c&&(u.backgroundMeshNode.node=An(l).mul(lx),u.backgroundMeshNode.needsUpdate=!0,d.material.needsUpdate=!0,u.backgroundCacheKey=c),t.unshift(d,d.geometry,d.material,0,0,null,null)}else o("Renderer: Unsupported background configuration.",i);const a=s.xr.getEnvironmentBlendMode();if("additive"===a?Jv.set(0,0,0,1):"alpha-blend"===a&&Jv.set(0,0,0,0),!0===s.autoClear||!0===n){const T=r.clearColorValue;T.r=Jv.r,T.g=Jv.g,T.b=Jv.b,T.a=Jv.a,!0!==s.backend.isWebGLBackend&&!0!==s.alpha||(T.r*=T.a,T.g*=T.a,T.b*=T.a),r.depthClearValue=s._clearDepth,r.stencilClearValue=s._clearStencil,r.clearColor=!0===s.autoClearColor,r.clearDepth=!0===s.autoClearDepth,r.clearStencil=!0===s.autoClearStencil}else r.clearColor=!1,r.clearDepth=!1,r.clearStencil=!1}}let tN=0;class rN{constructor(e="",t=[],r=0,s=[]){this.name=e,this.bindings=t,this.index=r,this.bindingsReference=s,this.id=tN++}}class sN{constructor(e,t,r,s,i,n,a,o,u,l=[]){this.vertexShader=e,this.fragmentShader=t,this.computeShader=r,this.transforms=l,this.nodeAttributes=s,this.bindings=i,this.updateNodes=n,this.updateBeforeNodes=a,this.updateAfterNodes=o,this.observer=u,this.usedTimes=0}createBindings(){const e=[];for(const t of this.bindings){if(!0!==t.bindings[0].groupNode.shared){const r=new rN(t.name,[],t.index,t.bindingsReference);e.push(r);for(const e of t.bindings)r.bindings.push(e.clone())}else e.push(t)}return e}}class iN{constructor(e,t,r=null){this.isNodeAttribute=!0,this.name=e,this.type=t,this.node=r}}class nN{constructor(e,t,r){this.isNodeUniform=!0,this.name=e,this.type=t,this.node=r}get value(){return this.node.value}set value(e){this.node.value=e}get id(){return this.node.id}get groupNode(){return this.node.groupNode}}class aN{constructor(e,t,r=!1,s=null){this.isNodeVar=!0,this.name=e,this.type=t,this.readOnly=r,this.count=s}}class oN extends aN{constructor(e,t,r=null,s=null){super(e,t),this.needsInterpolation=!1,this.isNodeVarying=!0,this.interpolationType=r,this.interpolationSampling=s}}class uN{constructor(e,t,r=""){this.name=e,this.type=t,this.code=r,Object.defineProperty(this,"isNodeCode",{value:!0})}}let lN=0;class dN{constructor(e=null){this.id=lN++,this.nodesData=new WeakMap,this.parent=e}getData(e){let t=this.nodesData.get(e);return void 0===t&&null!==this.parent&&(t=this.parent.getData(e)),t}setData(e,t){this.nodesData.set(e,t)}}class cN{constructor(e,t){this.name=e,this.members=t,this.output=!1}}class hN{constructor(e,t){this.name=e,this.value=t,this.boundary=0,this.itemSize=0,this.offset=0,this.index=-1}setValue(e){this.value=e}getValue(){return this.value}}class pN extends hN{constructor(e,t=0){super(e,t),this.isNumberUniform=!0,this.boundary=4,this.itemSize=1}}class gN extends hN{constructor(e,r=new t){super(e,r),this.isVector2Uniform=!0,this.boundary=8,this.itemSize=2}}class mN extends hN{constructor(e,t=new r){super(e,t),this.isVector3Uniform=!0,this.boundary=16,this.itemSize=3}}class fN extends hN{constructor(e,t=new s){super(e,t),this.isVector4Uniform=!0,this.boundary=16,this.itemSize=4}}class yN extends hN{constructor(t,r=new e){super(t,r),this.isColorUniform=!0,this.boundary=16,this.itemSize=3}}class bN extends hN{constructor(e,t=new i){super(e,t),this.isMatrix2Uniform=!0,this.boundary=8,this.itemSize=4}}class xN extends hN{constructor(e,t=new n){super(e,t),this.isMatrix3Uniform=!0,this.boundary=48,this.itemSize=12}}class TN extends hN{constructor(e,t=new a){super(e,t),this.isMatrix4Uniform=!0,this.boundary=64,this.itemSize=16}}class _N extends pN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class vN extends gN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class NN extends mN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class SN extends fN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class RN extends yN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class AN extends bN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class EN extends xN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}class wN extends TN{constructor(e){super(e.name,e.value),this.nodeUniform=e}getValue(){return this.nodeUniform.value}getType(){return this.nodeUniform.type}}let CN=0;const MN=new WeakMap,BN=new WeakMap,LN=new Map([[Int8Array,"int"],[Int16Array,"int"],[Int32Array,"int"],[Uint8Array,"uint"],[Uint16Array,"uint"],[Uint32Array,"uint"],[Float32Array,"float"]]),FN=e=>/e/g.test(e)?String(e).replace(/\+/g,""):(e=Number(e))+(e%1?"":".0");class PN{constructor(e,t,r){this.object=e,this.material=e&&e.material||null,this.geometry=e&&e.geometry||null,this.renderer=t,this.parser=r,this.scene=null,this.camera=null,this.nodes=[],this.sequentialNodes=[],this.updateNodes=[],this.updateBeforeNodes=[],this.updateAfterNodes=[],this.hashNodes={},this.observer=null,this.lightsNode=null,this.environmentNode=null,this.fogNode=null,this.clippingContext=null,this.vertexShader=null,this.fragmentShader=null,this.computeShader=null,this.flowNodes={vertex:[],fragment:[],compute:[]},this.flowCode={vertex:"",fragment:"",compute:""},this.uniforms={vertex:[],fragment:[],compute:[],index:0},this.structs={vertex:[],fragment:[],compute:[],index:0},this.types={vertex:[],fragment:[],compute:[],index:0},this.bindings={vertex:{},fragment:{},compute:{}},this.bindingsIndexes={},this.bindGroups=null,this.attributes=[],this.bufferAttributes=[],this.varyings=[],this.codes={},this.vars={},this.declarations={},this.flow={code:""},this.chaining=[],this.stack=Py(),this.stacks=[],this.tab="\t",this.currentFunctionNode=null,this.context={material:this.material},this.cache=new dN,this.globalCache=this.cache,this.flowsData=new WeakMap,this.shaderStage=null,this.buildStage=null,this.subBuildLayers=[],this.activeStacks=[],this.subBuildFn=null,this.fnCall=null,Object.defineProperty(this,"id",{value:CN++})}isOpaque(){const e=this.material;return!1===e.transparent&&e.blending===ze&&!1===e.alphaToCoverage}getBindGroupsCache(){let e=BN.get(this.renderer);return void 0===e&&(e=new Yf,BN.set(this.renderer,e)),e}createRenderTarget(e,t,r){return new Ne(e,t,r)}createCubeRenderTarget(e,t){return new og(e,t)}includes(e){return this.nodes.includes(e)}getOutputStructName(){}_getBindGroup(e,t){const r=this.getBindGroupsCache(),s=[];let i,n=!0;for(const e of t)s.push(e),n=n&&!0!==e.groupNode.shared;return n?(i=r.get(s),void 0===i&&(i=new rN(e,s,this.bindingsIndexes[e].group,s),r.set(s,i))):i=new rN(e,s,this.bindingsIndexes[e].group,s),i}getBindGroupArray(e,t){const r=this.bindings[t];let s=r[e];return void 0===s&&(void 0===this.bindingsIndexes[e]&&(this.bindingsIndexes[e]={binding:0,group:Object.keys(this.bindingsIndexes).length}),r[e]=s=[]),s}getBindings(){let e=this.bindGroups;if(null===e){const t={},r=this.bindings;for(const e of ii)for(const s in r[e]){const i=r[e][s],n=t[s]||(t[s]=[]);for(const e of i)!1===n.includes(e)&&n.push(e)}e=[];for(const r in t){const s=t[r],i=this._getBindGroup(r,s);e.push(i)}this.bindGroups=e}return e}sortBindingGroups(){const e=this.getBindings();e.sort((e,t)=>e.bindings[0].groupNode.order-t.bindings[0].groupNode.order);for(let t=0;t=0?`${Math.round(n)}u`:"0u";if("bool"===i)return n?"true":"false";if("color"===i)return`${this.getType("vec3")}( ${FN(n.r)}, ${FN(n.g)}, ${FN(n.b)} )`;const a=this.getTypeLength(i),o=this.getComponentType(i),u=e=>this.generateConst(o,e);if(2===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)} )`;if(3===a)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)} )`;if(4===a&&"mat2"!==i)return`${this.getType(i)}( ${u(n.x)}, ${u(n.y)}, ${u(n.z)}, ${u(n.w)} )`;if(a>=4&&n&&(n.isMatrix2||n.isMatrix3||n.isMatrix4))return`${this.getType(i)}( ${n.elements.map(u).join(", ")} )`;if(a>4)return`${this.getType(i)}()`;throw new Error(`NodeBuilder: Type '${i}' not found in generate constant attempt.`)}getType(e){return"color"===e?"vec3":e}hasGeometryAttribute(e){return this.geometry&&void 0!==this.geometry.getAttribute(e)}getAttribute(e,t){const r=this.attributes;for(const t of r)if(t.name===e)return t;const s=new iN(e,t);return this.registerDeclaration(s),r.push(s),s}getPropertyName(e){return e.name}isVector(e){return/vec\d/.test(e)}isMatrix(e){return/mat\d/.test(e)}isReference(e){return"void"===e||"property"===e||"sampler"===e||"samplerComparison"===e||"texture"===e||"cubeTexture"===e||"storageTexture"===e||"depthTexture"===e||"texture3D"===e}needsToWorkingColorSpace(){return!1}getComponentTypeFromTexture(e){const t=e.type;if(e.isDataTexture){if(t===R)return"int";if(t===S)return"uint"}return"float"}getElementType(e){return"mat2"===e?"vec2":"mat3"===e?"vec3":"mat4"===e?"vec4":this.getComponentType(e)}getComponentType(e){if("float"===(e=this.getVectorType(e))||"bool"===e||"int"===e||"uint"===e)return e;const t=/(b|i|u|)(vec|mat)([2-4])/.exec(e);return null===t?null:"b"===t[1]?"bool":"i"===t[1]?"int":"u"===t[1]?"uint":"float"}getVectorType(e){return"color"===e?"vec3":"texture"===e||"cubeTexture"===e||"storageTexture"===e||"texture3D"===e?"vec4":e}getTypeFromLength(e,t="float"){if(1===e)return t;let r=Gs(e);const s="float"===t?"":t[0];return!0===/mat2/.test(t)&&(r=r.replace("vec","mat")),s+r}getTypeFromArray(e){return LN.get(e.constructor)}isInteger(e){return/int|uint|(i|u)vec/.test(e)}getTypeFromAttribute(e){let t=e;e.isInterleavedBufferAttribute&&(t=e.data);const r=t.array,s=e.itemSize,i=e.normalized;let n;return e instanceof ot||!0===i||(n=this.getTypeFromArray(r)),this.getTypeFromLength(s,n)}getTypeLength(e){const t=this.getVectorType(e),r=/vec([2-4])/.exec(t);return null!==r?Number(r[1]):"float"===t||"bool"===t||"int"===t||"uint"===t?1:!0===/mat2/.test(e)?4:!0===/mat3/.test(e)?9:!0===/mat4/.test(e)?16:0}getVectorFromMatrix(e){return e.replace("mat","vec")}changeComponentType(e,t){return this.getTypeFromLength(this.getTypeLength(e),t)}getIntegerType(e){const t=this.getComponentType(e);return"int"===t||"uint"===t?e:this.changeComponentType(e,"int")}setActiveStack(e){this.activeStacks.push(e)}removeActiveStack(e){if(this.activeStacks[this.activeStacks.length-1]!==e)throw new Error("NodeBuilder: Invalid active stack removal.");this.activeStacks.pop()}getActiveStack(){return this.activeStacks[this.activeStacks.length-1]}getBaseStack(){return this.activeStacks[0]}addStack(){this.stack=Py(this.stack);const e=dn();return this.stacks.push(e),ln(this.stack),this.stack}removeStack(){const e=this.stack;for(const t of e.nodes){this.getDataFromNode(t).stack=e}return this.stack=e.parent,ln(this.stacks.pop()),e}getDataFromNode(e,t=this.shaderStage,r=null){let s=(r=null===r?e.isGlobal(this)?this.globalCache:this.cache:r).getData(e);void 0===s&&(s={},r.setData(e,s)),void 0===s[t]&&(s[t]={});let i=s[t];const n=s.any?s.any.subBuilds:null,a=this.getClosestSubBuild(n);return a&&(void 0===i.subBuildsCache&&(i.subBuildsCache={}),i=i.subBuildsCache[a]||(i.subBuildsCache[a]={}),i.subBuilds=n),i}getNodeProperties(e,t="any"){const r=this.getDataFromNode(e,t);return r.properties||(r.properties={outputNode:null})}getBufferAttributeFromNode(e,t){const r=this.getDataFromNode(e,"vertex");let s=r.bufferAttribute;if(void 0===s){const i=this.uniforms.index++;s=new iN("nodeAttribute"+i,t,e),this.bufferAttributes.push(s),r.bufferAttribute=s}return s}getStructTypeNode(e,t=this.shaderStage){return this.types[t][e]||null}getStructTypeFromNode(e,t,r=null,s=this.shaderStage){const i=this.getDataFromNode(e,s,this.globalCache);let n=i.structType;if(void 0===n){const a=this.structs.index++;null===r&&(r="StructType"+a),n=new cN(r,t),this.structs[s].push(n),this.types[s][r]=e,i.structType=n}return n}getOutputStructTypeFromNode(e,t){const r=this.getStructTypeFromNode(e,t,"OutputType","fragment");return r.output=!0,r}getUniformFromNode(e,t,r=this.shaderStage,s=null){const i=this.getDataFromNode(e,r,this.globalCache);let n=i.uniform;if(void 0===n){const a=this.uniforms.index++;n=new nN(s||"nodeUniform"+a,t,e),this.uniforms[r].push(n),this.registerDeclaration(n),i.uniform=n}return n}getVarFromNode(e,t=null,r=e.getNodeType(this),s=this.shaderStage,i=!1){const n=this.getDataFromNode(e,s),a=this.getSubBuildProperty("variable",n.subBuilds);let o=n[a];if(void 0===o){const u=i?"_const":"_var",l=this.vars[s]||(this.vars[s]=[]),d=this.vars[u]||(this.vars[u]=0);null===t&&(t=(i?"nodeConst":"nodeVar")+d,this.vars[u]++),"variable"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds));const c=e.getArrayCount(this);o=new aN(t,r,i,c),i||l.push(o),this.registerDeclaration(o),n[a]=o}return o}isDeterministic(e){if(e.isMathNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode))&&(!e.cNode||this.isDeterministic(e.cNode));if(e.isOperatorNode)return this.isDeterministic(e.aNode)&&(!e.bNode||this.isDeterministic(e.bNode));if(e.isArrayNode){if(null!==e.values)for(const t of e.values)if(!this.isDeterministic(t))return!1;return!0}return!!e.isConstNode}getVaryingFromNode(e,t=null,r=e.getNodeType(this),s=null,i=null){const n=this.getDataFromNode(e,"any"),a=this.getSubBuildProperty("varying",n.subBuilds);let o=n[a];if(void 0===o){const e=this.varyings,u=e.length;null===t&&(t="nodeVarying"+u),"varying"!==a&&(t=this.getSubBuildProperty(t,n.subBuilds)),o=new oN(t,r,s,i),e.push(o),this.registerDeclaration(o),n[a]=o}return o}registerDeclaration(e){const t=this.shaderStage,r=this.declarations[t]||(this.declarations[t]={}),s=this.getPropertyName(e);let i=1,n=s;for(;void 0!==r[n];)n=s+"_"+i++;i>1&&(e.name=n,d(`TSL: Declaration name '${s}' of '${e.type}' already in use. Renamed to '${n}'.`)),r[n]=e}getCodeFromNode(e,t,r=this.shaderStage){const s=this.getDataFromNode(e);let i=s.code;if(void 0===i){const e=this.codes[r]||(this.codes[r]=[]),n=e.length;i=new uN("nodeCode"+n,t),e.push(i),s.code=i}return i}addFlowCodeHierarchy(e,t){const{flowCodes:r,flowCodeBlock:s}=this.getDataFromNode(e);let i=!0,n=t;for(;n;){if(!0===s.get(n)){i=!1;break}n=this.getDataFromNode(n).parentNodeBlock}if(i)for(const e of r)this.addLineFlowCode(e)}addLineFlowCodeBlock(e,t,r){const s=this.getDataFromNode(e),i=s.flowCodes||(s.flowCodes=[]),n=s.flowCodeBlock||(s.flowCodeBlock=new WeakMap);i.push(t),n.set(r,!0)}addLineFlowCode(e,t=null){return""===e||(null!==t&&this.context.nodeBlock&&this.addLineFlowCodeBlock(t,e,this.context.nodeBlock),e=this.tab+e,/;\s*$/.test(e)||(e+=";\n"),this.flow.code+=e),this}addFlowCode(e){return this.flow.code+=e,this}addFlowTab(){return this.tab+="\t",this}removeFlowTab(){return this.tab=this.tab.slice(0,-1),this}getFlowData(e){return this.flowsData.get(e)}flowNode(e){const t=e.getNodeType(this),r=this.flowChildNode(e,t);return this.flowsData.set(e,r),r}addInclude(e){null!==this.currentFunctionNode&&this.currentFunctionNode.includes.push(e)}buildFunctionNode(e){const t=new Yx,r=this.currentFunctionNode;return this.currentFunctionNode=t,t.code=this.buildFunctionCode(e),this.currentFunctionNode=r,t}flowShaderNode(e){const t=e.layout,r={[Symbol.iterator](){let e=0;const t=Object.values(this);return{next:()=>({value:t[e],done:e++>=t.length})}}};for(const e of t.inputs)r[e.name]=new Ly(e.type,e.name);e.layout=null;const s=e.call(r),i=this.flowStagesNode(s,t.type);return e.layout=t,i}flowBuildStage(e,t,r=null){const s=this.getBuildStage();this.setBuildStage(t);const i=e.build(this,r);return this.setBuildStage(s),i}flowStagesNode(e,t=null){const r=this.flow,s=this.vars,i=this.declarations,n=this.cache,a=this.buildStage,o=this.stack,u={code:""};this.flow=u,this.vars={},this.declarations={},this.cache=new dN,this.stack=Py();for(const r of si)this.setBuildStage(r),u.result=e.build(this,t);return u.vars=this.getVars(this.shaderStage),this.flow=r,this.vars=s,this.declarations=i,this.cache=n,this.stack=o,this.setBuildStage(a),u}getFunctionOperator(){return null}buildFunctionCode(){d("Abstract function.")}flowChildNode(e,t=null){const r=this.flow,s={code:""};return this.flow=s,s.result=e.build(this,t),this.flow=r,s}flowNodeFromShaderStage(e,t,r=null,s=null){const i=this.tab,n=this.cache,a=this.shaderStage,o=this.context;this.setShaderStage(e);const u={...this.context};delete u.nodeBlock,this.cache=this.globalCache,this.tab="\t",this.context=u;let l=null;if("generate"===this.buildStage){const i=this.flowChildNode(t,r);null!==s&&(i.code+=`${this.tab+s} = ${i.result};\n`),this.flowCode[e]=this.flowCode[e]+i.code,l=i}else l=t.build(this);return this.setShaderStage(a),this.cache=n,this.tab=i,this.context=o,l}getAttributesArray(){return this.attributes.concat(this.bufferAttributes)}getAttributes(){d("Abstract function.")}getVaryings(){d("Abstract function.")}getVar(e,t,r=null){return`${null!==r?this.generateArrayDeclaration(e,r):this.getType(e)} ${t}`}getVars(e){let t="";const r=this.vars[e];if(void 0!==r)for(const e of r)t+=`${this.getVar(e.type,e.name)}; `;return t}getUniforms(){d("Abstract function.")}getCodes(e){const t=this.codes[e];let r="";if(void 0!==t)for(const e of t)r+=e.code+"\n";return r}getHash(){return this.vertexShader+this.fragmentShader+this.computeShader}setShaderStage(e){this.shaderStage=e}getShaderStage(){return this.shaderStage}setBuildStage(e){this.buildStage=e}getBuildStage(){return this.buildStage}buildCode(){d("Abstract function.")}get subBuild(){return this.subBuildLayers[this.subBuildLayers.length-1]||null}addSubBuild(e){this.subBuildLayers.push(e)}removeSubBuild(){return this.subBuildLayers.pop()}getClosestSubBuild(e){let t;if(t=e&&e.isNode?e.isShaderCallNodeInternal?e.shaderNode.subBuilds:e.isStackNode?[e.subBuild]:this.getDataFromNode(e,"any").subBuilds:e instanceof Set?[...e]:e,!t)return null;const r=this.subBuildLayers;for(let e=t.length-1;e>=0;e--){const s=t[e];if(r.includes(s))return s}return null}getSubBuildOutput(e){return this.getSubBuildProperty("outputNode",e)}getSubBuildProperty(e="",t=null){let r,s;return r=null!==t?this.getClosestSubBuild(t):this.subBuildFn,s=r?e?r+"_"+e:r:e,s}build(){const{object:e,material:t,renderer:r}=this;if(null!==t){let e=r.library.fromMaterial(t);null===e&&(o(`NodeMaterial: Material "${t.type}" is not compatible.`),e=new Qp),e.build(this)}else this.addFlow("compute",e);for(const e of si){this.setBuildStage(e),this.context.position&&this.context.position.isNode&&this.flowNodeFromShaderStage("vertex",this.context.position);for(const t of ii){this.setShaderStage(t);const r=this.flowNodes[t];for(const t of r)"generate"===e?this.flowNode(t):t.build(this)}}return this.setBuildStage(null),this.setShaderStage(null),this.buildCode(),this.buildUpdateNodes(),this}getSharedDataFromNode(e){let t=MN.get(e);return void 0===t&&(t={}),t}getNodeUniform(e,t){const r=this.getSharedDataFromNode(e);let s=r.cache;if(void 0===s){if("float"===t||"int"===t||"uint"===t)s=new _N(e);else if("vec2"===t||"ivec2"===t||"uvec2"===t)s=new vN(e);else if("vec3"===t||"ivec3"===t||"uvec3"===t)s=new NN(e);else if("vec4"===t||"ivec4"===t||"uvec4"===t)s=new SN(e);else if("color"===t)s=new RN(e);else if("mat2"===t)s=new AN(e);else if("mat3"===t)s=new EN(e);else{if("mat4"!==t)throw new Error(`Uniform "${t}" not implemented.`);s=new wN(e)}r.cache=s}return s}format(e,t,r){if((t=this.getVectorType(t))===(r=this.getVectorType(r))||null===r||this.isReference(r))return e;const s=this.getTypeLength(t),i=this.getTypeLength(r);return 16===s&&9===i?`${this.getType(r)}( ${e}[ 0 ].xyz, ${e}[ 1 ].xyz, ${e}[ 2 ].xyz )`:9===s&&4===i?`${this.getType(r)}( ${e}[ 0 ].xy, ${e}[ 1 ].xy )`:s>4||i>4||0===i?e:s===i?`${this.getType(r)}( ${e} )`:s>i?(e="bool"===r?`all( ${e} )`:`${e}.${"xyz".slice(0,i)}`,this.format(e,this.getTypeFromLength(i,this.getComponentType(t)),r)):4===i&&s>1?`${this.getType(r)}( ${this.format(e,t,"vec3")}, 1.0 )`:2===s?`${this.getType(r)}( ${this.format(e,t,"vec2")}, 0.0 )`:(1===s&&i>1&&t!==this.getComponentType(r)&&(e=`${this.getType(this.getComponentType(r))}( ${e} )`),`${this.getType(r)}( ${e} )`)}getSignature(){return`// Three.js r${ut} - Node System\n`}needsPreviousData(){const e=this.renderer.getMRT();return e&&e.has("velocity")||!0===Xs(this.object).useVelocity}}class DN{constructor(){this.time=0,this.deltaTime=0,this.frameId=0,this.renderId=0,this.updateMap=new WeakMap,this.updateBeforeMap=new WeakMap,this.updateAfterMap=new WeakMap,this.renderer=null,this.material=null,this.camera=null,this.object=null,this.scene=null}_getMaps(e,t){let r=e.get(t);return void 0===r&&(r={renderId:0,frameId:0},e.set(t,r)),r}updateBeforeNode(e){const t=e.getUpdateBeforeType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateBeforeMap,r);if(t.frameId!==this.frameId){const r=t.frameId;t.frameId=this.frameId,!1===e.updateBefore(this)&&(t.frameId=r)}}else if(t===Js.RENDER){const t=this._getMaps(this.updateBeforeMap,r);if(t.renderId!==this.renderId){const r=t.renderId;t.renderId=this.renderId,!1===e.updateBefore(this)&&(t.renderId=r)}}else t===Js.OBJECT&&e.updateBefore(this)}updateAfterNode(e){const t=e.getUpdateAfterType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateAfterMap,r);t.frameId!==this.frameId&&!1!==e.updateAfter(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateAfterMap,r);t.renderId!==this.renderId&&!1!==e.updateAfter(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.updateAfter(this)}updateNode(e){const t=e.getUpdateType(),r=e.updateReference(this);if(t===Js.FRAME){const t=this._getMaps(this.updateMap,r);t.frameId!==this.frameId&&!1!==e.update(this)&&(t.frameId=this.frameId)}else if(t===Js.RENDER){const t=this._getMaps(this.updateMap,r);t.renderId!==this.renderId&&!1!==e.update(this)&&(t.renderId=this.renderId)}else t===Js.OBJECT&&e.update(this)}update(){this.frameId++,void 0===this.lastTime&&(this.lastTime=performance.now()),this.deltaTime=(performance.now()-this.lastTime)/1e3,this.lastTime=performance.now(),this.time+=this.deltaTime}}class UN{constructor(e,t,r=null,s="",i=!1){this.type=e,this.name=t,this.count=r,this.qualifier=s,this.isConst=i}}UN.isNodeFunctionInput=!0;class IN extends Z_{static get type(){return"DirectionalLightNode"}constructor(e=null){super(e)}setupDirect(){const e=this.colorNode;return{lightDirection:a_(this.light),lightColor:e}}}const ON=new a,VN=new a;let kN=null;class GN extends Z_{static get type(){return"RectAreaLightNode"}constructor(e=null){super(e),this.halfHeight=_a(new r).setGroup(ba),this.halfWidth=_a(new r).setGroup(ba),this.updateType=Js.RENDER}update(e){super.update(e);const{light:t}=this,r=e.camera.matrixWorldInverse;VN.identity(),ON.copy(t.matrixWorld),ON.premultiply(r),VN.extractRotation(ON),this.halfWidth.value.set(.5*t.width,0,0),this.halfHeight.value.set(0,.5*t.height,0),this.halfWidth.value.applyMatrix4(VN),this.halfHeight.value.applyMatrix4(VN)}setupDirectRectArea(e){let t,r;e.isAvailable("float32Filterable")?(t=Fl(kN.LTC_FLOAT_1),r=Fl(kN.LTC_FLOAT_2)):(t=Fl(kN.LTC_HALF_1),r=Fl(kN.LTC_HALF_2));const{colorNode:s,light:i}=this;return{lightColor:s,lightPosition:n_(i),halfWidth:this.halfWidth,halfHeight:this.halfHeight,ltc_1:t,ltc_2:r}}static setLTC(e){kN=e}}class zN extends Z_{static get type(){return"SpotLightNode"}constructor(e=null){super(e),this.coneCosNode=_a(0).setGroup(ba),this.penumbraCosNode=_a(0).setGroup(ba),this.cutoffDistanceNode=_a(0).setGroup(ba),this.decayExponentNode=_a(0).setGroup(ba),this.colorNode=_a(this.color).setGroup(ba)}update(e){super.update(e);const{light:t}=this;this.coneCosNode.value=Math.cos(t.angle),this.penumbraCosNode.value=Math.cos(t.angle*(1-t.penumbra)),this.cutoffDistanceNode.value=t.distance,this.decayExponentNode.value=t.decay}getSpotAttenuation(e,t){const{coneCosNode:r,penumbraCosNode:s}=this;return lu(r,s,t)}getLightCoord(e){const t=e.getNodeProperties(this);let r=t.projectionUV;return void 0===r&&(r=r_(this.light,e.context.positionWorld),t.projectionUV=r),r}setupDirect(e){const{colorNode:t,cutoffDistanceNode:r,decayExponentNode:s,light:i}=this,n=this.getLightVector(e),a=n.normalize(),o=a.dot(a_(i)),u=this.getSpotAttenuation(e,o),l=n.length(),d=J_({lightDistance:l,cutoffDistance:r,decayExponent:s});let c,h,p=t.mul(u).mul(d);if(i.colorNode?(h=this.getLightCoord(e),c=i.colorNode(h)):i.map&&(h=this.getLightCoord(e),c=Fl(i.map,h.xy).onRenderUpdate(()=>i.map)),c){p=h.mul(2).sub(1).abs().lessThan(1).all().select(p.mul(c),p)}return{lightColor:p,lightDirection:a}}}class $N extends zN{static get type(){return"IESSpotLightNode"}getSpotAttenuation(e,t){const r=this.light.iesMap;let s=null;if(r&&!0===r.isTexture){const e=t.acos().mul(1/Math.PI);s=Fl(r,bn(e,0),0).r}else s=super.getSpotAttenuation(t);return s}}const WN=un(([e,t])=>{const r=e.abs().sub(t);return Lo(Ho(r,0)).add(Wo(Ho(r.x,r.y),0))});class HN extends zN{static get type(){return"ProjectorLightNode"}update(e){super.update(e);const t=this.light;if(this.penumbraCosNode.value=Math.min(Math.cos(t.angle*(1-t.penumbra)),.99999),null===t.aspect){let e=1;null!==t.map&&(e=t.map.width/t.map.height),t.shadow.aspect=e}else t.shadow.aspect=t.aspect}getSpotAttenuation(e){const t=gn(0),r=this.penumbraCosNode,s=t_(this.light).mul(e.context.positionWorld||Pd);return cn(s.w.greaterThan(0),()=>{const e=s.xyz.div(s.w),i=WN(e.xy.sub(bn(.5)),bn(.5)),n=Fa(-1,Ba(1,wo(r)).sub(1));t.assign(ou(i.mul(-2).mul(n)))}),t}}class qN extends Z_{static get type(){return"AmbientLightNode"}constructor(e=null){super(e)}setup({context:e}){e.irradiance.addAssign(this.colorNode)}}class jN extends Z_{static get type(){return"HemisphereLightNode"}constructor(t=null){super(t),this.lightPositionNode=s_(t),this.lightDirectionNode=this.lightPositionNode.normalize(),this.groundColorNode=_a(new e).setGroup(ba)}update(e){const{light:t}=this;super.update(e),this.lightPositionNode.object3d=t,this.groundColorNode.value.copy(t.groundColor).multiplyScalar(t.intensity)}setup(e){const{colorNode:t,groundColorNode:r,lightDirectionNode:s}=this,i=Xd.dot(s).mul(.5).add(.5),n=nu(r,t,i);e.context.irradiance.addAssign(n)}}class XN extends Z_{static get type(){return"LightProbeNode"}constructor(e=null){super(e);const t=[];for(let e=0;e<9;e++)t.push(new r);this.lightProbe=Vl(t)}update(e){const{light:t}=this;super.update(e);for(let e=0;e<9;e++)this.lightProbe.array[e].copy(t.sh.coefficients[e]).multiplyScalar(t.intensity)}setup(e){const t=Qv(Xd,this.lightProbe);e.context.irradiance.addAssign(t)}}class KN{parseFunction(){d("Abstract function.")}}class YN{constructor(e,t,r="",s=""){this.type=e,this.inputs=t,this.name=r,this.precision=s}getCode(){d("Abstract function.")}}YN.isNodeFunction=!0;const QN=/^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i,ZN=/[a-z_0-9]+/gi,JN="#pragma main";class eS extends YN{constructor(e){const{type:t,inputs:r,name:s,precision:i,inputsCode:n,blockCode:a,headerCode:o}=(e=>{const t=(e=e.trim()).indexOf(JN),r=-1!==t?e.slice(t+12):e,s=r.match(QN);if(null!==s&&5===s.length){const i=s[4],n=[];let a=null;for(;null!==(a=ZN.exec(i));)n.push(a);const o=[];let u=0;for(;u{const r=this.backend.createNodeBuilder(e.object,this.renderer);return r.scene=e.scene,r.material=t,r.camera=e.camera,r.context.material=t,r.lightsNode=e.lightsNode,r.environmentNode=this.getEnvironmentNode(e.scene),r.fogNode=this.getFogNode(e.scene),r.clippingContext=e.clippingContext,this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview&&r.enableMultiview(),r};let n=t(e.material);try{n.build()}catch(e){n=t(new Qp),n.build(),o("TSL: "+e)}r=this._createNodeBuilderState(n),s.set(i,r)}r.usedTimes++,t.nodeBuilderState=r}return r}delete(e){if(e.isRenderObject){const t=this.get(e).nodeBuilderState;t.usedTimes--,0===t.usedTimes&&this.nodeBuilderCache.delete(this.getForRenderCacheKey(e))}return super.delete(e)}getForCompute(e){const t=this.get(e);let r=t.nodeBuilderState;if(void 0===r){const s=this.backend.createNodeBuilder(e,this.renderer);s.build(),r=this._createNodeBuilderState(s),t.nodeBuilderState=r}return r}_createNodeBuilderState(e){return new sN(e.vertexShader,e.fragmentShader,e.computeShader,e.getAttributesArray(),e.getBindings(),e.updateNodes,e.updateBeforeNodes,e.updateAfterNodes,e.observer,e.transforms)}getEnvironmentNode(e){this.updateEnvironment(e);let t=null;if(e.environmentNode&&e.environmentNode.isNode)t=e.environmentNode;else{const r=this.get(e);r.environmentNode&&(t=r.environmentNode)}return t}getBackgroundNode(e){this.updateBackground(e);let t=null;if(e.backgroundNode&&e.backgroundNode.isNode)t=e.backgroundNode;else{const r=this.get(e);r.backgroundNode&&(t=r.backgroundNode)}return t}getFogNode(e){return this.updateFog(e),e.fogNode||this.get(e).fogNode||null}getCacheKey(e,t){sS[0]=e,sS[1]=t;const r=this.renderer.info.calls,s=this.callHashCache.get(sS)||{};if(s.callId!==r){const i=this.getEnvironmentNode(e),n=this.getFogNode(e);t&&iS.push(t.getCacheKey(!0)),i&&iS.push(i.getCacheKey()),n&&iS.push(n.getCacheKey()),iS.push(this.renderer.getOutputRenderTarget()&&this.renderer.getOutputRenderTarget().multiview?1:0),iS.push(this.renderer.shadowMap.enabled?1:0),iS.push(this.renderer.shadowMap.type),s.callId=r,s.cacheKey=Is(iS),this.callHashCache.set(sS,s),iS.length=0}return sS.length=0,s.cacheKey}get isToneMappingState(){return!this.renderer.getRenderTarget()}updateBackground(e){const t=this.get(e),r=e.background;if(r){const s=0===e.backgroundBlurriness&&t.backgroundBlurriness>0||e.backgroundBlurriness>0&&0===t.backgroundBlurriness;if(t.background!==r||s){const i=this.getCacheNode("background",r,()=>{if(!0===r.isCubeTexture||r.mapping===le||r.mapping===de||r.mapping===Ae){if(e.backgroundBlurriness>0||r.mapping===Ae)return mf(r);{let e;return e=!0===r.isCubeTexture?pc(r):Fl(r),hg(e)}}if(!0===r.isTexture)return Fl(r,Hl.flipY()).setUpdateMatrix(!0);!0!==r.isColor&&o("WebGPUNodes: Unsupported background configuration.",r)},s);t.backgroundNode=i,t.background=r,t.backgroundBlurriness=e.backgroundBlurriness}}else t.backgroundNode&&(delete t.backgroundNode,delete t.background)}getCacheNode(e,t,r,s=!1){const i=this.cacheLib[e]||(this.cacheLib[e]=new WeakMap);let n=i.get(t);return(void 0===n||s)&&(n=r(),i.set(t,n)),n}updateFog(e){const t=this.get(e),r=e.fog;if(r){if(t.fog!==r){const e=this.getCacheNode("fog",r,()=>{if(r.isFogExp2){const e=fc("color","color",r).setGroup(ba),t=fc("density","float",r).setGroup(ba);return lT(e,oT(t))}if(r.isFog){const e=fc("color","color",r).setGroup(ba),t=fc("near","float",r).setGroup(ba),s=fc("far","float",r).setGroup(ba);return lT(e,aT(t,s))}o("Renderer: Unsupported fog configuration.",r)});t.fogNode=e,t.fog=r}}else delete t.fogNode,delete t.fog}updateEnvironment(e){const t=this.get(e),r=e.environment;if(r){if(t.environment!==r){const e=this.getCacheNode("environment",r,()=>!0===r.isCubeTexture?pc(r):!0===r.isTexture?Fl(r):void o("Nodes: Unsupported environment configuration.",r));t.environmentNode=e,t.environment=r}}else t.environmentNode&&(delete t.environmentNode,delete t.environment)}getNodeFrame(e=this.renderer,t=null,r=null,s=null,i=null){const n=this.nodeFrame;return n.renderer=e,n.scene=t,n.object=r,n.camera=s,n.material=i,n}getNodeFrameForRender(e){return this.getNodeFrame(e.renderer,e.scene,e.object,e.camera,e.material)}getOutputCacheKey(){const e=this.renderer;return e.toneMapping+","+e.currentColorSpace+","+e.xr.isPresenting}hasOutputChange(e){return rS.get(e)!==this.getOutputCacheKey()}getOutputNode(e){const t=this.renderer,r=this.getOutputCacheKey(),s=e.isArrayTexture?mx(e,vn(Hl,kl("gl_ViewID_OVR"))).renderOutput(t.toneMapping,t.currentColorSpace):Fl(e,Hl).renderOutput(t.toneMapping,t.currentColorSpace);return rS.set(e,r),s}updateBefore(e){const t=e.getNodeBuilderState();for(const r of t.updateBeforeNodes)this.getNodeFrameForRender(e).updateBeforeNode(r)}updateAfter(e){const t=e.getNodeBuilderState();for(const r of t.updateAfterNodes)this.getNodeFrameForRender(e).updateAfterNode(r)}updateForCompute(e){const t=this.getNodeFrame(),r=this.getForCompute(e);for(const e of r.updateNodes)t.updateNode(e)}updateForRender(e){const t=this.getNodeFrameForRender(e),r=e.getNodeBuilderState();for(const e of r.updateNodes)t.updateNode(e)}needsRefresh(e){const t=this.getNodeFrameForRender(e);return e.getMonitor().needsRefresh(e,t)}dispose(){super.dispose(),this.nodeFrame=new DN,this.nodeBuilderCache=new Map,this.cacheLib={}}}const aS=new je;class oS{constructor(e=null){this.version=0,this.clipIntersection=null,this.cacheKey="",this.shadowPass=!1,this.viewNormalMatrix=new n,this.clippingGroupContexts=new WeakMap,this.intersectionPlanes=[],this.unionPlanes=[],this.parentVersion=null,null!==e&&(this.viewNormalMatrix=e.viewNormalMatrix,this.clippingGroupContexts=e.clippingGroupContexts,this.shadowPass=e.shadowPass,this.viewMatrix=e.viewMatrix)}projectPlanes(e,t,r){const s=e.length;for(let i=0;i0,alpha:!0,depth:t.depth,stencil:t.stencil,framebufferScaleFactor:this.getFramebufferScaleFactor()},i=new XRWebGLLayer(e,s,r);this._glBaseLayer=i,e.updateRenderState({baseLayer:i}),t.setPixelRatio(1),t._setXRLayerSize(i.framebufferWidth,i.framebufferHeight),this._xrRenderTarget=new mS(i.framebufferWidth,i.framebufferHeight,{format:Re,type:Ge,colorSpace:t.outputColorSpace,stencilBuffer:t.stencil,resolveDepthBuffer:!1===i.ignoreDepthValues,resolveStencilBuffer:!1===i.ignoreDepthValues}),this._xrRenderTarget._isOpaqueFramebuffer=!0,this._referenceSpace=await e.requestReferenceSpace(this.getReferenceSpaceType())}this.setFoveation(this.getFoveation()),t._animation.setAnimationLoop(this._onAnimationFrame),t._animation.setContext(e),t._animation.start(),this.isPresenting=!0,this.dispatchEvent({type:"sessionstart"})}}updateCamera(e){const t=this._session;if(null===t)return;const r=e.near,s=e.far,i=this._cameraXR,n=this._cameraL,a=this._cameraR;i.near=a.near=n.near=r,i.far=a.far=n.far=s,i.isMultiViewCamera=this._useMultiview,this._currentDepthNear===i.near&&this._currentDepthFar===i.far||(t.updateRenderState({depthNear:i.near,depthFar:i.far}),this._currentDepthNear=i.near,this._currentDepthFar=i.far),i.layers.mask=6|e.layers.mask,n.layers.mask=-5&i.layers.mask,a.layers.mask=-3&i.layers.mask;const o=e.parent,u=i.cameras;xS(i,o);for(let e=0;e=0&&(r[n]=null,t[n].disconnect(i))}for(let s=0;s=r.length){r.push(i),n=e;break}if(null===r[e]){r[e]=i,n=e;break}}if(-1===n)break}const a=t[n];a&&a.connect(i)}}function NS(e){return"quad"===e.type?this._glBinding.createQuadLayer({transform:new XRRigidTransform(e.translation,e.quaternion),width:e.width/2,height:e.height/2,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1}):this._glBinding.createCylinderLayer({transform:new XRRigidTransform(e.translation,e.quaternion),radius:e.radius,centralAngle:e.centralAngle,aspectRatio:e.aspectRatio,space:this._referenceSpace,viewPixelWidth:e.pixelwidth,viewPixelHeight:e.pixelheight,clearOnAccess:!1})}function SS(e,t){if(void 0===t)return;const r=this._cameraXR,i=this._renderer,n=i.backend,a=this._glBaseLayer,o=this.getReferenceSpace(),u=t.getViewerPose(o);if(this._xrFrame=t,null!==u){const e=u.views;null!==this._glBaseLayer&&n.setXRTarget(a.framebuffer);let t=!1;e.length!==r.cameras.length&&(r.cameras.length=0,t=!0);for(let i=0;i{await this.compileAsync(e,t);const s=this._renderLists.get(e,t),i=this._renderContexts.get(this._renderTarget,this._mrt),n=e.overrideMaterial||r.material,a=this._objects.get(r,n,e,t,s.lightsNode,i,i.clippingContext),{fragmentShader:o,vertexShader:u}=a.getNodeBuilderState();return{fragmentShader:o,vertexShader:u}}}}async init(){return null!==this._initPromise||(this._initPromise=new Promise(async(e,t)=>{let r=this.backend;try{await r.init(this)}catch(e){if(null===this._getFallback)return void t(e);try{this.backend=r=this._getFallback(e),await r.init(this)}catch(e){return void t(e)}}this._nodes=new nS(this,r),this._animation=new Kf(this,this._nodes,this.info),this._attributes=new oy(r),this._background=new eN(this,this._nodes),this._geometries=new dy(this._attributes,this.info),this._textures=new My(this,r,this.info),this._pipelines=new yy(r,this._nodes),this._bindings=new by(r,this._nodes,this._textures,this._attributes,this._pipelines,this.info),this._objects=new ey(this,this._nodes,this._geometries,this._pipelines,this._bindings,this.info),this._renderLists=new Sy(this.lighting),this._bundles=new dS,this._renderContexts=new wy,this._animation.start(),this._initialized=!0,this._inspector.init(),e(this)})),this._initPromise}get domElement(){return this._canvasTarget.domElement}get coordinateSystem(){return this.backend.coordinateSystem}async compileAsync(e,t,r=null){if(!0===this._isDeviceLost)return;!1===this._initialized&&await this.init();const s=this._nodes.nodeFrame,i=s.renderId,n=this._currentRenderContext,a=this._currentRenderObjectFunction,o=this._handleObjectFunction,u=this._compilationPromises,l=!0===e.isScene?e:AS;null===r&&(r=e);const d=this._renderTarget,c=this._renderContexts.get(d,this._mrt),h=this._activeMipmapLevel,p=[];this._currentRenderContext=c,this._currentRenderObjectFunction=this.renderObject,this._handleObjectFunction=this._createObjectPipeline,this._compilationPromises=p,s.renderId++,s.update(),c.depth=this.depth,c.stencil=this.stencil,c.clippingContext||(c.clippingContext=new oS),c.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,d);const g=this._renderLists.get(e,t);if(g.begin(),this._projectObject(e,t,0,g,c.clippingContext),r!==e&&r.traverseVisible(function(e){e.isLight&&e.layers.test(t.layers)&&g.pushLight(e)}),g.finish(),null!==d){this._textures.updateRenderTarget(d,h);const e=this._textures.get(d);c.textures=e.textures,c.depthTexture=e.depthTexture}else c.textures=null,c.depthTexture=null;r!==e?this._background.update(r,g,c):this._background.update(l,g,c);const m=g.opaque,f=g.transparent,y=g.transparentDoublePass,b=g.lightsNode;!0===this.opaque&&m.length>0&&this._renderObjects(m,t,l,b),!0===this.transparent&&f.length>0&&this._renderTransparents(f,y,t,l,b),s.renderId=i,this._currentRenderContext=n,this._currentRenderObjectFunction=a,this._handleObjectFunction=o,this._compilationPromises=u,await Promise.all(p)}async renderAsync(e,t){v('Renderer: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.render(e,t)}async waitForGPU(){o("Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.")}set inspector(e){null!==this._inspector&&this._inspector.setRenderer(null),this._inspector=e,this._inspector.setRenderer(this)}get inspector(){return this._inspector}set highPrecision(e){const t=this.contextNode.value;!0===e?(t.modelViewMatrix=wd,t.modelNormalViewMatrix=Cd):this.highPrecision&&(delete t.modelViewMatrix,delete t.modelNormalViewMatrix)}get highPrecision(){const e=this.contextNode.value;return e.modelViewMatrix===wd&&e.modelNormalViewMatrix===Cd}setMRT(e){return this._mrt=e,this}getMRT(){return this._mrt}getOutputBufferType(){return this._outputBufferType}getColorBufferType(){return v('Renderer: ".getColorBufferType()" has been renamed to ".getOutputBufferType()".'),this.getOutputBufferType()}_onDeviceLost(e){let t=`THREE.WebGPURenderer: ${e.api} Device Lost:\n\nMessage: ${e.message}`;e.reason&&(t+=`\nReason: ${e.reason}`),o(t),this._isDeviceLost=!0}_renderBundle(e,t,r){const{bundleGroup:s,camera:i,renderList:n}=e,a=this._currentRenderContext,o=this._bundles.get(s,i),u=this.backend.get(o);void 0===u.renderContexts&&(u.renderContexts=new Set);const l=s.version!==u.version,d=!1===u.renderContexts.has(a)||l;if(u.renderContexts.add(a),d){this.backend.beginBundle(a),(void 0===u.renderObjects||l)&&(u.renderObjects=[]),this._currentRenderBundle=o;const{transparentDoublePass:e,transparent:d,opaque:c}=n;!0===this.opaque&&c.length>0&&this._renderObjects(c,i,t,r),!0===this.transparent&&d.length>0&&this._renderTransparents(d,e,i,t,r),this._currentRenderBundle=null,this.backend.finishBundle(a,o),u.version=s.version}else{const{renderObjects:e}=u;for(let t=0,r=e.length;t>=h,g.viewportValue.height>>=h,g.viewportValue.minDepth=_,g.viewportValue.maxDepth=v,g.viewport=!1===g.viewportValue.equals(wS),g.scissorValue.copy(x).multiplyScalar(T).floor(),g.scissor=y._scissorTest&&!1===g.scissorValue.equals(wS),g.scissorValue.width>>=h,g.scissorValue.height>>=h,g.clippingContext||(g.clippingContext=new oS),g.clippingContext.updateGlobal(l,t),l.onBeforeRender(this,e,t,p);const N=t.isArrayCamera?MS:CS;t.isArrayCamera||(BS.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(BS,t.coordinateSystem,t.reversedDepth));const S=this._renderLists.get(e,t);if(S.begin(),this._projectObject(e,t,0,S,g.clippingContext),S.finish(),!0===this.sortObjects&&S.sort(this._opaqueSort,this._transparentSort),null!==p){this._textures.updateRenderTarget(p,h);const e=this._textures.get(p);g.textures=e.textures,g.depthTexture=e.depthTexture,g.width=e.width,g.height=e.height,g.renderTarget=p,g.depth=p.depthBuffer,g.stencil=p.stencilBuffer}else g.textures=null,g.depthTexture=null,g.width=ES.width,g.height=ES.height,g.depth=this.depth,g.stencil=this.stencil;g.width>>=h,g.height>>=h,g.activeCubeFace=c,g.activeMipmapLevel=h,g.occlusionQueryCount=S.occlusionQueryCount,g.scissorValue.max(LS.set(0,0,0,0)),g.scissorValue.x+g.scissorValue.width>g.width&&(g.scissorValue.width=Math.max(g.width-g.scissorValue.x,0)),g.scissorValue.y+g.scissorValue.height>g.height&&(g.scissorValue.height=Math.max(g.height-g.scissorValue.y,0)),this._background.update(l,S,g),g.camera=t,this.backend.beginRender(g);const{bundles:R,lightsNode:A,transparentDoublePass:E,transparent:w,opaque:C}=S;return R.length>0&&this._renderBundles(R,l,A),!0===this.opaque&&C.length>0&&this._renderObjects(C,t,l,A),!0===this.transparent&&w.length>0&&this._renderTransparents(w,E,t,l,A),this.backend.finishRender(g),i.renderId=n,this._currentRenderContext=a,this._currentRenderObjectFunction=o,this._handleObjectFunction=u,this._callDepth--,null!==s&&(this.setRenderTarget(d,c,h),this._renderOutput(p)),l.onAfterRender(this,e,t,p),this.inspector.finishRender(this.backend.getTimestampUID(g)),g}_setXRLayerSize(e,t){this._canvasTarget._width=e,this._canvasTarget._height=t,this.setViewport(0,0,e,t)}_renderOutput(e){const t=this._quad;this._nodes.hasOutputChange(e.texture)&&(t.material.fragmentNode=this._nodes.getOutputNode(e.texture),t.material.needsUpdate=!0);const r=this.autoClear,s=this.xr.enabled;this.autoClear=!1,this.xr.enabled=!1,this._renderScene(t,t.camera,!1),this.autoClear=r,this.xr.enabled=s}getMaxAnisotropy(){return this.backend.getMaxAnisotropy()}getActiveCubeFace(){return this._activeCubeFace}getActiveMipmapLevel(){return this._activeMipmapLevel}async setAnimationLoop(e){!1===this._initialized&&await this.init(),this._animation.setAnimationLoop(e)}getAnimationLoop(){return this._animation.getAnimationLoop()}async getArrayBufferAsync(e){return await this.backend.getArrayBufferAsync(e)}getContext(){return this.backend.getContext()}getPixelRatio(){return this._canvasTarget.getPixelRatio()}getDrawingBufferSize(e){return this._canvasTarget.getDrawingBufferSize(e)}getSize(e){return this._canvasTarget.getSize(e)}setPixelRatio(e=1){this._canvasTarget.setPixelRatio(e)}setDrawingBufferSize(e,t,r){this.xr&&this.xr.isPresenting||this._canvasTarget.setDrawingBufferSize(e,t,r)}setSize(e,t,r=!0){this.xr&&this.xr.isPresenting||this._canvasTarget.setSize(e,t,r)}setOpaqueSort(e){this._opaqueSort=e}setTransparentSort(e){this._transparentSort=e}getScissor(e){return this._canvasTarget.getScissor(e)}setScissor(e,t,r,s){this._canvasTarget.setScissor(e,t,r,s)}getScissorTest(){return this._canvasTarget.getScissorTest()}setScissorTest(e){this._canvasTarget.setScissorTest(e),this.backend.setScissorTest(e)}getViewport(e){return this._canvasTarget.getViewport(e)}setViewport(e,t,r,s,i=0,n=1){this._canvasTarget.setViewport(e,t,r,s,i,n)}getClearColor(e){return e.copy(this._clearColor)}setClearColor(e,t=1){this._clearColor.set(e),this._clearColor.a=t}getClearAlpha(){return this._clearColor.a}setClearAlpha(e){this._clearColor.a=e}getClearDepth(){return this._clearDepth}setClearDepth(e){this._clearDepth=e}getClearStencil(){return this._clearStencil}setClearStencil(e){this._clearStencil=e}isOccluded(e){const t=this._currentRenderContext;return t&&this.backend.isOccluded(t,e)}clear(e=!0,t=!0,r=!0){if(!1===this._initialized)throw new Error('Renderer: .clear() called before the backend is initialized. Use "await renderer.init();" before before using this method.');const s=this._renderTarget||this._getFrameBufferTarget();let i=null;if(null!==s){this._textures.updateRenderTarget(s);const e=this._textures.get(s);i=this._renderContexts.get(s),i.textures=e.textures,i.depthTexture=e.depthTexture,i.width=e.width,i.height=e.height,i.renderTarget=s,i.depth=s.depthBuffer,i.stencil=s.stencilBuffer;const t=this.backend.getClearColor();i.clearColorValue.r=t.r,i.clearColorValue.g=t.g,i.clearColorValue.b=t.b,i.clearColorValue.a=t.a,i.activeCubeFace=this.getActiveCubeFace(),i.activeMipmapLevel=this.getActiveMipmapLevel()}this.backend.clear(e,t,r,i),null!==s&&null===this._renderTarget&&this._renderOutput(s)}clearColor(){this.clear(!0,!1,!1)}clearDepth(){this.clear(!1,!0,!1)}clearStencil(){this.clear(!1,!1,!0)}async clearAsync(e=!0,t=!0,r=!0){v('Renderer: "clearAsync()" has been deprecated. Use "clear()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.clear(e,t,r)}async clearColorAsync(){v('Renderer: "clearColorAsync()" has been deprecated. Use "clearColor()" and "await renderer.init();" when creating the renderer.'),this.clear(!0,!1,!1)}async clearDepthAsync(){v('Renderer: "clearDepthAsync()" has been deprecated. Use "clearDepth()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!0,!1)}async clearStencilAsync(){v('Renderer: "clearStencilAsync()" has been deprecated. Use "clearStencil()" and "await renderer.init();" when creating the renderer.'),this.clear(!1,!1,!0)}get needsFrameBufferTarget(){const e=this.currentToneMapping!==m,t=this.currentColorSpace!==p.workingColorSpace;return e||t}get samples(){return this._samples}get currentSamples(){let e=this._samples;return null!==this._renderTarget?e=this._renderTarget.samples:this.needsFrameBufferTarget&&(e=0),e}get currentToneMapping(){return this.isOutputTarget?this.toneMapping:m}get currentColorSpace(){return this.isOutputTarget?this.outputColorSpace:p.workingColorSpace}get isOutputTarget(){return this._renderTarget===this._outputRenderTarget||null===this._renderTarget}dispose(){!0===this._initialized&&(this.info.dispose(),this.backend.dispose(),this._animation.dispose(),this._objects.dispose(),this._geometries.dispose(),this._pipelines.dispose(),this._nodes.dispose(),this._bindings.dispose(),this._renderLists.dispose(),this._renderContexts.dispose(),this._textures.dispose(),null!==this._frameBufferTarget&&this._frameBufferTarget.dispose(),Object.values(this.backend.timestampQueryPool).forEach(e=>{null!==e&&e.dispose()})),this.setRenderTarget(null),this.setAnimationLoop(null)}setRenderTarget(e,t=0,r=0){this._renderTarget=e,this._activeCubeFace=t,this._activeMipmapLevel=r}getRenderTarget(){return this._renderTarget}setOutputRenderTarget(e){this._outputRenderTarget=e}getOutputRenderTarget(){return this._outputRenderTarget}setCanvasTarget(e){this._canvasTarget.removeEventListener("resize",this._onCanvasTargetResize),this._canvasTarget=e,this._canvasTarget.addEventListener("resize",this._onCanvasTargetResize)}getCanvasTarget(){return this._canvasTarget}_resetXRState(){this.backend.setXRTarget(null),this.setOutputRenderTarget(null),this.setRenderTarget(null),this._frameBufferTarget.dispose(),this._frameBufferTarget=null}setRenderObjectFunction(e){this._renderObjectFunction=e}getRenderObjectFunction(){return this._renderObjectFunction}compute(e,t=null){if(!0===this._isDeviceLost)return;if(!1===this._initialized)return d("Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead."),this.computeAsync(e,t);const r=this._nodes.nodeFrame,s=r.renderId;this.info.calls++,this.info.compute.calls++,this.info.compute.frameCalls++,r.renderId=this.info.calls,this.backend.updateTimeStampUID(e),this.inspector.beginCompute(this.backend.getTimestampUID(e),e);const i=this.backend,n=this._pipelines,a=this._bindings,o=this._nodes,u=Array.isArray(e)?e:[e];if(void 0===u[0]||!0!==u[0].isComputeNode)throw new Error("THREE.Renderer: .compute() expects a ComputeNode.");i.beginCompute(e);for(const r of u){if(!1===n.has(r)){const e=()=>{r.removeEventListener("dispose",e),n.delete(r),a.deleteForCompute(r),o.delete(r)};r.addEventListener("dispose",e);const t=r.onInitFunction;null!==t&&t.call(r,{renderer:this})}o.updateForCompute(r),a.updateForCompute(r);const s=a.getForCompute(r),u=n.getForCompute(r,s);i.compute(e,r,s,u,t)}i.finishCompute(e),r.renderId=s,this.inspector.finishCompute(this.backend.getTimestampUID(e))}async computeAsync(e,t=null){!1===this._initialized&&await this.init(),this.compute(e,t)}async hasFeatureAsync(e){return v('Renderer: "hasFeatureAsync()" has been deprecated. Use "hasFeature()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.hasFeature(e)}async resolveTimestampsAsync(e="render"){return!1===this._initialized&&await this.init(),this.backend.resolveTimestampsAsync(e)}hasFeature(e){if(!1===this._initialized)throw new Error('Renderer: .hasFeature() called before the backend is initialized. Use "await renderer.init();" before before using this method.');return this.backend.hasFeature(e)}hasInitialized(){return this._initialized}async initTextureAsync(e){v('Renderer: "initTextureAsync()" has been deprecated. Use "initTexture()" and "await renderer.init();" when creating the renderer.'),await this.init(),this.initTexture(e)}initTexture(e){if(!1===this._initialized)throw new Error('Renderer: .initTexture() called before the backend is initialized. Use "await renderer.init();" before before using this method.');this._textures.updateTexture(e)}copyFramebufferToTexture(e,t=null){if(null!==t)if(t.isVector2)t=LS.set(t.x,t.y,e.image.width,e.image.height).floor();else{if(!t.isVector4)return void o("Renderer.copyFramebufferToTexture: Invalid rectangle.");t=LS.copy(t).floor()}else t=LS.set(0,0,e.image.width,e.image.height);let r,s=this._currentRenderContext;null!==s?r=s.renderTarget:(r=this._renderTarget||this._getFrameBufferTarget(),null!==r&&(this._textures.updateRenderTarget(r),s=this._textures.get(r))),this._textures.updateTexture(e,{renderTarget:r}),this.backend.copyFramebufferToTexture(e,s,t),this._inspector.copyFramebufferToTexture(e)}copyTextureToTexture(e,t,r=null,s=null,i=0,n=0){this._textures.updateTexture(e),this._textures.updateTexture(t),this.backend.copyTextureToTexture(e,t,r,s,i,n),this._inspector.copyTextureToTexture(e,t)}async readRenderTargetPixelsAsync(e,t,r,s,i,n=0,a=0){return this.backend.copyTextureToBuffer(e.textures[n],t,r,s,i,a)}_projectObject(e,t,r,s,i){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)r=e.renderOrder,e.isClippingGroup&&e.enabled&&(i=i.getGroupContext(e));else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)s.pushLight(e);else if(e.isSprite){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsSprite(e,t)){!0===this.sortObjects&&LS.setFromMatrixPosition(e.matrixWorld).applyMatrix4(BS);const{geometry:t,material:n}=e;n.visible&&s.push(e,t,n,r,LS.z,null,i)}}else if(e.isLineLoop)o("Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.");else if(e.isMesh||e.isLine||e.isPoints){const n=t.isArrayCamera?MS:CS;if(!e.frustumCulled||n.intersectsObject(e,t)){const{geometry:t,material:n}=e;if(!0===this.sortObjects&&(null===t.boundingSphere&&t.computeBoundingSphere(),LS.copy(t.boundingSphere.center).applyMatrix4(e.matrixWorld).applyMatrix4(BS)),Array.isArray(n)){const a=t.groups;for(let o=0,u=a.length;o0){for(const{material:e}of t)e.side=M;this._renderObjects(t,r,s,i,"backSide");for(const{material:e}of t)e.side=ct;this._renderObjects(e,r,s,i);for(const{material:e}of t)e.side=B}else this._renderObjects(e,r,s,i)}_renderObjects(e,t,r,s,i=null){for(let n=0,a=e.length;n(t.not().discard(),e))(u)}}e.depthNode&&e.depthNode.isNode&&(l=e.depthNode),e.castShadowPositionNode&&e.castShadowPositionNode.isNode?o=e.castShadowPositionNode:e.positionNode&&e.positionNode.isNode&&(o=e.positionNode),r={version:t,colorNode:u,depthNode:l,positionNode:o},this._cacheShadowNodes.set(e,r)}return r}renderObject(e,t,r,s,i,n,a,o=null,u=null){let l,d,c,h,p=!1;if(e.onBeforeRender(this,t,r,s,i,n),!0===i.allowOverride&&null!==t.overrideMaterial){const e=t.overrideMaterial;if(p=!0,l=t.overrideMaterial.colorNode,d=t.overrideMaterial.depthNode,c=t.overrideMaterial.positionNode,h=t.overrideMaterial.side,i.positionNode&&i.positionNode.isNode&&(e.positionNode=i.positionNode),e.alphaTest=i.alphaTest,e.alphaMap=i.alphaMap,e.transparent=i.transparent||i.transmission>0||i.transmissionNode&&i.transmissionNode.isNode||i.backdropNode&&i.backdropNode.isNode,e.isShadowPassMaterial){const{colorNode:t,depthNode:r,positionNode:s}=this._getShadowNodes(i);this.shadowMap.type===Ze?e.side=null!==i.shadowSide?i.shadowSide:i.side:e.side=null!==i.shadowSide?i.shadowSide:FS[i.side],null!==t&&(e.colorNode=t),null!==r&&(e.depthNode=r),null!==s&&(e.positionNode=s)}i=e}!0===i.transparent&&i.side===B&&!1===i.forceSinglePass?(i.side=M,this._handleObjectFunction(e,i,t,r,a,n,o,"backSide"),i.side=ct,this._handleObjectFunction(e,i,t,r,a,n,o,u),i.side=B):this._handleObjectFunction(e,i,t,r,a,n,o,u),p&&(t.overrideMaterial.colorNode=l,t.overrideMaterial.depthNode=d,t.overrideMaterial.positionNode=c,t.overrideMaterial.side=h),e.onAfterRender(this,t,r,s,i,n)}hasCompatibility(e){return this.backend.hasCompatibility(e)}_renderObjectDirect(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n;const l=this._nodes.needsRefresh(u);if(l&&(this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u)),this._pipelines.updateForRender(u),null!==this._currentRenderBundle){this.backend.get(this._currentRenderBundle).renderObjects.push(u),u.bundle=this._currentRenderBundle.bundleGroup}this.backend.draw(u,this.info),l&&this._nodes.updateAfter(u)}_createObjectPipeline(e,t,r,s,i,n,a,o){const u=this._objects.get(e,t,r,s,i,this._currentRenderContext,a,o);u.drawRange=e.geometry.drawRange,u.group=n,this._nodes.updateBefore(u),this._geometries.updateForRender(u),this._nodes.updateForRender(u),this._bindings.updateForRender(u),this._pipelines.getForRender(u,this._compilationPromises),this._nodes.updateAfter(u)}_onCanvasTargetResize(){this._initialized&&this.backend.updateSize()}get compile(){return this.compileAsync}}class DS{constructor(e=""){this.name=e,this.visibility=0}setVisibility(e){this.visibility|=e}getVisibility(){return this.visibility}clone(){return Object.assign(new this.constructor,this)}}class US extends DS{constructor(e,t=null){super(e),this.isBuffer=!0,this.bytesPerElement=Float32Array.BYTES_PER_ELEMENT,this._buffer=t,this._updateRanges=[]}get updateRanges(){return this._updateRanges}addUpdateRange(e,t){this.updateRanges.push({start:e,count:t})}clearUpdateRanges(){this.updateRanges.length=0}get byteLength(){return(e=this._buffer.byteLength)+(ay-e%ay)%ay;var e}get buffer(){return this._buffer}update(){return!0}}class IS extends US{constructor(e,t=null){super(e,t),this.isUniformBuffer=!0}}let OS=0;class VS extends IS{constructor(e,t){super("UniformBuffer_"+OS++,e?e.value:null),this.nodeUniform=e,this.groupNode=t,this.isNodeUniformBuffer=!0}set updateRanges(e){this.nodeUniform.updateRanges=e}get updateRanges(){return this.nodeUniform.updateRanges}addUpdateRange(e,t){this.nodeUniform.addUpdateRange(e,t)}clearUpdateRanges(){this.nodeUniform.clearUpdateRanges()}get buffer(){return this.nodeUniform.value}}class kS extends IS{constructor(e){super(e),this.isUniformsGroup=!0,this._values=null,this.uniforms=[],this._updateRangeCache=new Map}addUniformUpdateRange(e){const t=e.index;if(!0!==this._updateRangeCache.has(t)){const r=this.updateRanges,s={start:e.offset,count:e.itemSize};r.push(s),this._updateRangeCache.set(t,s)}}clearUpdateRanges(){this._updateRangeCache.clear(),super.clearUpdateRanges()}addUniform(e){return this.uniforms.push(e),this}removeUniform(e){const t=this.uniforms.indexOf(e);return-1!==t&&this.uniforms.splice(t,1),this}get values(){return null===this._values&&(this._values=Array.from(this.buffer)),this._values}get buffer(){let e=this._buffer;if(null===e){const t=this.byteLength;e=new Float32Array(new ArrayBuffer(t)),this._buffer=e}return e}get byteLength(){const e=this.bytesPerElement;let t=0;for(let r=0,s=this.uniforms.length;r{this.generation=null,this.version=0},this.texture=t,this.version=t?t.version:0,this.generation=null,this.samplerKey="",this.isSampler=!0}set texture(e){this._texture!==e&&(this._texture&&this._texture.removeEventListener("dispose",this._onTextureDispose),this._texture=e,this.generation=null,this.version=0,this._texture&&this._texture.addEventListener("dispose",this._onTextureDispose))}get texture(){return this._texture}update(){const{texture:e,version:t}=this;return t!==e.version&&(this.version=e.version,!0)}clone(){const e=super.clone();return e._texture=null,e._onTextureDispose=()=>{e.generation=null,e.version=0},e.texture=this.texture,e}}let WS=0;class HS extends $S{constructor(e,t){super(e,t),this.id=WS++,this.store=!1,this.mipLevel=0,this.isSampledTexture=!0}}class qS extends HS{constructor(e,t,r,s=null){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r,this.access=s}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class jS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledCubeTexture=!0}}class XS extends qS{constructor(e,t,r,s=null){super(e,t,r,s),this.isSampledTexture3D=!0}}const KS={bitcast_int_uint:new Xx("uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }"),bitcast_uint_int:new Xx("uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }")},YS={textureDimensions:"textureSize",equals:"equal",bitcast_float_int:"floatBitsToInt",bitcast_int_float:"intBitsToFloat",bitcast_uint_float:"uintBitsToFloat",bitcast_float_uint:"floatBitsToUint",bitcast_uint_int:"tsl_bitcast_uint_to_int",bitcast_int_uint:"tsl_bitcast_int_to_uint",floatpack_snorm_2x16:"packSnorm2x16",floatpack_unorm_2x16:"packUnorm2x16",floatpack_float16_2x16:"packHalf2x16",floatunpack_snorm_2x16:"unpackSnorm2x16",floatunpack_unorm_2x16:"unpackUnorm2x16",floatunpack_float16_2x16:"unpackHalf2x16"},QS={low:"lowp",medium:"mediump",high:"highp"},ZS={swizzleAssign:!0,storageBuffer:!1},JS={perspective:"smooth",linear:"noperspective"},eR={centroid:"centroid"},tR="\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision highp sampler2DShadow;\nprecision highp sampler2DArrayShadow;\nprecision highp samplerCubeShadow;\n";class rR extends PN{constructor(e,t){super(e,t,new tS),this.uniformGroups={},this.transforms=[],this.extensions={},this.builtins={vertex:[],fragment:[],compute:[]}}needsToWorkingColorSpace(e){return!0===e.isVideoTexture&&e.colorSpace!==T}_include(e){const t=KS[e];return t.build(this),this.addInclude(t),t}getMethod(e){return void 0!==KS[e]&&this._include(e),YS[e]||e}getBitcastMethod(e,t){return this.getMethod(`bitcast_${t}_${e}`)}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`${e} ? ${t} : ${r}`}getOutputStructName(){return""}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(this.getType(e.type)+" "+e.name);return`${this.getType(t.type)} ${t.name}( ${s.join(", ")} ) {\n\n\t${r.vars}\n\n${r.code}\n\treturn ${r.result};\n\n}`}setupPBO(e){const t=e.value;if(void 0===t.pbo){const e=t.array,r=t.count*t.itemSize,{itemSize:s}=t,i=t.array.constructor.name.toLowerCase().includes("int");let n=i?Tt:_t;2===s?n=i?Rt:G:3===s?n=i?At:Et:4===s&&(n=i?wt:Re);const a={Float32Array:j,Uint8Array:Ge,Uint16Array:St,Uint32Array:S,Int8Array:Nt,Int16Array:vt,Int32Array:R,Uint8ClampedArray:Ge},o=Math.pow(2,Math.ceil(Math.log2(Math.sqrt(r/s))));let u=Math.ceil(r/s/o);o*u*s0?i:"";t=`${r.name} {\n\t${s} ${e.name}[${n}];\n};\n`}else{const t=e.groupNode.name;if(void 0===s[t]){const e=this.uniformGroups[t];if(void 0!==e){const r=[];for(const t of e.uniforms){const e=t.getType(),s=this.getVectorType(e),i=t.nodeUniform.node.precision;let n=`${s} ${t.name};`;null!==i&&(n=QS[i]+" "+n),r.push("\t"+n)}s[t]=r}}i=!0}if(!i){const s=e.node.precision;null!==s&&(t=QS[s]+" "+t),t="uniform "+t,r.push(t)}}let i="";for(const e in s){const t=s[e];i+=this._getGLSLUniformStruct(e,t.join("\n"))+"\n"}return i+=r.join("\n"),i}getTypeFromAttribute(e){let t=super.getTypeFromAttribute(e);if(/^[iu]/.test(t)&&e.gpuType!==R){let r=e;e.isInterleavedBufferAttribute&&(r=e.data);const s=r.array;!1==(s instanceof Uint32Array||s instanceof Int32Array)&&(t=t.slice(1))}return t}getAttributes(e){let t="";if("vertex"===e||"compute"===e){const e=this.getAttributesArray();let r=0;for(const s of e)t+=`layout( location = ${r++} ) in ${s.type} ${s.name};\n`}return t}getStructMembers(e){const t=[];for(const r of e.members)t.push(`\t${r.type} ${r.name};`);return t.join("\n")}getStructs(e){const t=[],r=this.structs[e],s=[];for(const e of r)if(e.output)for(const t of e.members)s.push(`layout( location = ${t.index} ) out ${t.type} ${t.name};`);else{let r="struct "+e.name+" {\n";r+=this.getStructMembers(e),r+="\n};\n",t.push(r)}return 0===s.length&&s.push("layout( location = 0 ) out vec4 fragColor;"),"\n"+s.join("\n")+"\n\n"+t.join("\n")}getVaryings(e){let t="";const r=this.varyings;if("vertex"===e||"compute"===e)for(const s of r){"compute"===e&&(s.needsInterpolation=!0);const r=this.getType(s.type);if(s.needsInterpolation)if(s.interpolationType){t+=`${JS[s.interpolationType]||s.interpolationType} ${eR[s.interpolationSampling]||""} out ${r} ${s.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}out ${r} ${s.name};\n`}else t+=`${r} ${s.name};\n`}else if("fragment"===e)for(const e of r)if(e.needsInterpolation){const r=this.getType(e.type);if(e.interpolationType){t+=`${JS[e.interpolationType]||e.interpolationType} ${eR[e.interpolationSampling]||""} in ${r} ${e.name};\n`}else{t+=`${r.includes("int")||r.includes("uv")||r.includes("iv")?"flat ":""}in ${r} ${e.name};\n`}}for(const r of this.builtins[e])t+=`${r};\n`;return t}getVertexIndex(){return"uint( gl_VertexID )"}getInstanceIndex(){return"uint( gl_InstanceID )"}getInvocationLocalIndex(){return`uint( gl_InstanceID ) % ${this.object.workgroupSize.reduce((e,t)=>e*t,1)}u`}getSubgroupSize(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node")}getInvocationSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node")}getSubgroupIndex(){o("GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node")}getDrawIndex(){return this.renderer.backend.extensions.has("WEBGL_multi_draw")?"uint( gl_DrawID )":null}getFrontFacing(){return"gl_FrontFacing"}getFragCoord(){return"gl_FragCoord.xy"}getFragDepth(){return"gl_FragDepth"}enableExtension(e,t,r=this.shaderStage){const s=this.extensions[r]||(this.extensions[r]=new Map);!1===s.has(e)&&s.set(e,{name:e,behavior:t})}getExtensions(e){const t=[];if("vertex"===e){const t=this.renderer.backend.extensions;this.object.isBatchedMesh&&t.has("WEBGL_multi_draw")&&this.enableExtension("GL_ANGLE_multi_draw","require",e)}const r=this.extensions[e];if(void 0!==r)for(const{name:e,behavior:s}of r.values())t.push(`#extension ${e} : ${s}`);return t.join("\n")}getClipDistance(){return"gl_ClipDistance"}isAvailable(e){let t=ZS[e];if(void 0===t){let r;switch(t=!1,e){case"float32Filterable":r="OES_texture_float_linear";break;case"clipDistance":r="WEBGL_clip_cull_distance"}if(void 0!==r){const e=this.renderer.backend.extensions;e.has(r)&&(e.get(r),t=!0)}ZS[e]=t}return t}isFlipY(){return!0}enableHardwareClipping(e){this.enableExtension("GL_ANGLE_clip_cull_distance","require"),this.builtins.vertex.push(`out float gl_ClipDistance[ ${e} ]`)}enableMultiview(){this.enableExtension("GL_OVR_multiview2","require","fragment"),this.enableExtension("GL_OVR_multiview2","require","vertex"),this.builtins.vertex.push("layout(num_views = 2) in")}registerTransform(e,t){this.transforms.push({varyingName:e,attributeNode:t})}getTransforms(){const e=this.transforms;let t="";for(let r=0;r0&&(r+="\n"),r+=`\t// flow -> ${n}\n\t`),r+=`${s.code}\n\t`,e===i&&"compute"!==t&&(r+="// result\n\t","vertex"===t?(r+="gl_Position = ",r+=`${s.result};`):"fragment"===t&&(e.outputNode.isOutputStructNode||(r+="fragColor = ",r+=`${s.result};`)))}const n=e[t];n.extensions=this.getExtensions(t),n.uniforms=this.getUniforms(t),n.attributes=this.getAttributes(t),n.varyings=this.getVaryings(t),n.vars=this.getVars(t),n.structs=this.getStructs(t),n.codes=this.getCodes(t),n.transforms=this.getTransforms(t),n.flow=r}null!==this.material?(this.vertexShader=this._getGLSLVertexCode(e.vertex),this.fragmentShader=this._getGLSLFragmentCode(e.fragment)):this.computeShader=this._getGLSLVertexCode(e.compute)}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);let a=n.uniformGPU;if(void 0===a){const s=e.groupNode,o=s.name,u=this.getBindGroupArray(o,r);if("texture"===t)a=new qS(i.name,i.node,s),u.push(a);else if("cubeTexture"===t||"cubeDepthTexture"===t)a=new jS(i.name,i.node,s),u.push(a);else if("texture3D"===t)a=new XS(i.name,i.node,s),u.push(a);else if("buffer"===t){i.name=`buffer${e.id}`;const t=this.getSharedDataFromNode(e);let r=t.buffer;void 0===r&&(e.name=`NodeBuffer_${e.id}`,r=new VS(e,s),r.name=e.name,t.buffer=r),u.push(r),a=r}else{let e=this.uniformGroups[o];void 0===e?(e=new zS(o,s),this.uniformGroups[o]=e,u.push(e)):-1===u.indexOf(e)&&u.push(e),a=this.getNodeUniform(i,t);const r=a.name;e.uniforms.some(e=>e.name===r)||e.addUniform(a)}n.uniformGPU=a}return i}}let sR=null,iR=null;class nR{constructor(e={}){this.parameters=Object.assign({},e),this.data=new WeakMap,this.renderer=null,this.domElement=null,this.timestampQueryPool={[Ct.RENDER]:null,[Ct.COMPUTE]:null},this.trackTimestamp=!0===e.trackTimestamp}async init(e){this.renderer=e}get coordinateSystem(){}beginRender(){}finishRender(){}beginCompute(){}finishCompute(){}draw(){}compute(){}createProgram(){}destroyProgram(){}createBindings(){}updateBindings(){}updateBinding(){}createRenderPipeline(){}createComputePipeline(){}needsRenderUpdate(){}getRenderCacheKey(){}createNodeBuilder(){}updateSampler(){}createDefaultTexture(){}createTexture(){}updateTexture(){}generateMipmaps(){}destroyTexture(){}async copyTextureToBuffer(){}copyTextureToTexture(){}copyFramebufferToTexture(){}createAttribute(){}createIndexAttribute(){}createStorageAttribute(){}updateAttribute(){}destroyAttribute(){}getContext(){}updateSize(){}updateViewport(){}updateTimeStampUID(e){const t=this.get(e),r=this.renderer.info.frame;let s;s=!0===e.isComputeNode?"c:"+this.renderer.info.compute.frameCalls:"r:"+this.renderer.info.render.frameCalls,t.timestampUID=s+":"+e.id+":f"+r}getTimestampUID(e){return this.get(e).timestampUID}getTimestampFrames(e){const t=this.timestampQueryPool[e];return t?t.getTimestampFrames():[]}_getQueryPool(e){const t=e.startsWith("c:")?Ct.COMPUTE:Ct.RENDER;return this.timestampQueryPool[t]}getTimestamp(e){return this._getQueryPool(e).getTimestamp(e)}hasTimestamp(e){return this._getQueryPool(e).hasTimestamp(e)}isOccluded(){}async resolveTimestampsAsync(e="render"){if(!this.trackTimestamp)return void v("WebGPURenderer: Timestamp tracking is disabled.");const t=this.timestampQueryPool[e];if(!t)return;const r=await t.resolveQueriesAsync();return this.renderer.info[e].timestamp=r,r}async getArrayBufferAsync(){}async hasFeatureAsync(){}hasFeature(){}getMaxAnisotropy(){}getDrawingBufferSize(){return sR=sR||new t,this.renderer.getDrawingBufferSize(sR)}setScissorTest(){}getClearColor(){const e=this.renderer;return iR=iR||new By,e.getClearColor(iR),iR.getRGB(iR),iR}getDomElement(){let e=this.domElement;return null===e&&(e=void 0!==this.parameters.canvas?this.parameters.canvas:Mt(),"setAttribute"in e&&e.setAttribute("data-engine",`three.js r${ut} webgpu`),this.domElement=e),e}hasCompatibility(){return!1}set(e,t){this.data.set(e,t)}get(e){let t=this.data.get(e);return void 0===t&&(t={},this.data.set(e,t)),t}has(e){return this.data.has(e)}delete(e){this.data.delete(e)}deleteBindGroupData(){}dispose(){}}let aR,oR,uR=0;class lR{constructor(e,t){this.buffers=[e.bufferGPU,t],this.type=e.type,this.bufferType=e.bufferType,this.pbo=e.pbo,this.byteLength=e.byteLength,this.bytesPerElement=e.BYTES_PER_ELEMENT,this.version=e.version,this.isInteger=e.isInteger,this.activeBufferIndex=0,this.baseId=e.id}get id(){return`${this.baseId}|${this.activeBufferIndex}`}get bufferGPU(){return this.buffers[this.activeBufferIndex]}get transformBuffer(){return this.buffers[1^this.activeBufferIndex]}switchBuffers(){this.activeBufferIndex^=1}}class dR{constructor(e){this.backend=e}createAttribute(e,t){const r=this.backend,{gl:s}=r,i=e.array,n=e.usage||s.STATIC_DRAW,a=e.isInterleavedBufferAttribute?e.data:e,o=r.get(a);let u,l=o.bufferGPU;if(void 0===l&&(l=this._createBuffer(s,t,i,n),o.bufferGPU=l,o.bufferType=t,o.version=a.version),i instanceof Float32Array)u=s.FLOAT;else if("undefined"!=typeof Float16Array&&i instanceof Float16Array)u=s.HALF_FLOAT;else if(i instanceof Uint16Array)u=e.isFloat16BufferAttribute?s.HALF_FLOAT:s.UNSIGNED_SHORT;else if(i instanceof Int16Array)u=s.SHORT;else if(i instanceof Uint32Array)u=s.UNSIGNED_INT;else if(i instanceof Int32Array)u=s.INT;else if(i instanceof Int8Array)u=s.BYTE;else if(i instanceof Uint8Array)u=s.UNSIGNED_BYTE;else{if(!(i instanceof Uint8ClampedArray))throw new Error("THREE.WebGLBackend: Unsupported buffer data format: "+i);u=s.UNSIGNED_BYTE}let d={bufferGPU:l,bufferType:t,type:u,byteLength:i.byteLength,bytesPerElement:i.BYTES_PER_ELEMENT,version:e.version,pbo:e.pbo,isInteger:u===s.INT||u===s.UNSIGNED_INT||e.gpuType===R,id:uR++};if(e.isStorageBufferAttribute||e.isStorageInstancedBufferAttribute){const e=this._createBuffer(s,t,i,n);d=new lR(d,e)}r.set(e,d)}updateAttribute(e){const t=this.backend,{gl:r}=t,s=e.array,i=e.isInterleavedBufferAttribute?e.data:e,n=t.get(i),a=n.bufferType,o=e.isInterleavedBufferAttribute?e.data.updateRanges:e.updateRanges;if(r.bindBuffer(a,n.bufferGPU),0===o.length)r.bufferSubData(a,0,s);else{for(let e=0,t=o.length;e0?this.enable(s.SAMPLE_ALPHA_TO_COVERAGE):this.disable(s.SAMPLE_ALPHA_TO_COVERAGE),r>0&&this.currentClippingPlanes!==r){const e=12288;for(let t=0;t<8;t++)t{!function i(){const n=e.clientWaitSync(t,e.SYNC_FLUSH_COMMANDS_BIT,0);if(n===e.WAIT_FAILED)return e.deleteSync(t),void s();n!==e.TIMEOUT_EXPIRED?(e.deleteSync(t),r()):requestAnimationFrame(i)}()})}}let pR,gR,mR,fR=!1;class yR{constructor(e){this.backend=e,this.gl=e.gl,this.extensions=e.extensions,this.defaultTextures={},this._srcFramebuffer=null,this._dstFramebuffer=null,!1===fR&&(this._init(),fR=!0)}_init(){const e=this.gl;pR={[Vr]:e.REPEAT,[xe]:e.CLAMP_TO_EDGE,[Or]:e.MIRRORED_REPEAT},gR={[w]:e.NEAREST,[kr]:e.NEAREST_MIPMAP_NEAREST,[at]:e.NEAREST_MIPMAP_LINEAR,[oe]:e.LINEAR,[nt]:e.LINEAR_MIPMAP_NEAREST,[K]:e.LINEAR_MIPMAP_LINEAR},mR={[qr]:e.NEVER,[Hr]:e.ALWAYS,[E]:e.LESS,[Je]:e.LEQUAL,[Wr]:e.EQUAL,[$r]:e.GEQUAL,[zr]:e.GREATER,[Gr]:e.NOTEQUAL}}getGLTextureType(e){const{gl:t}=this;let r;return r=!0===e.isCubeTexture?t.TEXTURE_CUBE_MAP:!0===e.isArrayTexture||!0===e.isDataArrayTexture||!0===e.isCompressedArrayTexture?t.TEXTURE_2D_ARRAY:!0===e.isData3DTexture?t.TEXTURE_3D:t.TEXTURE_2D,r}getInternalFormat(e,t,r,s,i=!1){const{gl:n,extensions:a}=this;if(null!==e){if(void 0!==n[e])return n[e];d("WebGLBackend: Attempt to use non-existing WebGL internal format '"+e+"'")}let o=t;if(t===n.RED&&(r===n.FLOAT&&(o=n.R32F),r===n.HALF_FLOAT&&(o=n.R16F),r===n.UNSIGNED_BYTE&&(o=n.R8),r===n.UNSIGNED_SHORT&&(o=n.R16),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RED_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.R8UI),r===n.UNSIGNED_SHORT&&(o=n.R16UI),r===n.UNSIGNED_INT&&(o=n.R32UI),r===n.BYTE&&(o=n.R8I),r===n.SHORT&&(o=n.R16I),r===n.INT&&(o=n.R32I)),t===n.RG&&(r===n.FLOAT&&(o=n.RG32F),r===n.HALF_FLOAT&&(o=n.RG16F),r===n.UNSIGNED_BYTE&&(o=n.RG8),r===n.UNSIGNED_SHORT&&(o=n.RG16),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RG_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RG8UI),r===n.UNSIGNED_SHORT&&(o=n.RG16UI),r===n.UNSIGNED_INT&&(o=n.RG32UI),r===n.BYTE&&(o=n.RG8I),r===n.SHORT&&(o=n.RG16I),r===n.INT&&(o=n.RG32I)),t===n.RGB){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGB32F),r===n.HALF_FLOAT&&(o=n.RGB16F),r===n.UNSIGNED_BYTE&&(o=n.RGB8),r===n.UNSIGNED_SHORT&&(o=n.RGB16),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8:n.RGB8),r===n.UNSIGNED_SHORT_5_6_5&&(o=n.RGB565),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGB4),r===n.UNSIGNED_INT_5_9_9_9_REV&&(o=n.RGB9_E5),r===n.UNSIGNED_INT_10F_11F_11F_REV&&(o=n.R11F_G11F_B10F)}if(t===n.RGB_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGB8UI),r===n.UNSIGNED_SHORT&&(o=n.RGB16UI),r===n.UNSIGNED_INT&&(o=n.RGB32UI),r===n.BYTE&&(o=n.RGB8I),r===n.SHORT&&(o=n.RGB16I),r===n.INT&&(o=n.RGB32I)),t===n.RGBA){const e=i?jr:p.getTransfer(s);r===n.FLOAT&&(o=n.RGBA32F),r===n.HALF_FLOAT&&(o=n.RGBA16F),r===n.UNSIGNED_BYTE&&(o=n.RGBA8),r===n.UNSIGNED_SHORT&&(o=n.RGBA16),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I),r===n.UNSIGNED_BYTE&&(o=e===g?n.SRGB8_ALPHA8:n.RGBA8),r===n.UNSIGNED_SHORT_4_4_4_4&&(o=n.RGBA4),r===n.UNSIGNED_SHORT_5_5_5_1&&(o=n.RGB5_A1)}return t===n.RGBA_INTEGER&&(r===n.UNSIGNED_BYTE&&(o=n.RGBA8UI),r===n.UNSIGNED_SHORT&&(o=n.RGBA16UI),r===n.UNSIGNED_INT&&(o=n.RGBA32UI),r===n.BYTE&&(o=n.RGBA8I),r===n.SHORT&&(o=n.RGBA16I),r===n.INT&&(o=n.RGBA32I)),t===n.DEPTH_COMPONENT&&(r===n.UNSIGNED_SHORT&&(o=n.DEPTH_COMPONENT16),r===n.UNSIGNED_INT&&(o=n.DEPTH_COMPONENT24),r===n.FLOAT&&(o=n.DEPTH_COMPONENT32F)),t===n.DEPTH_STENCIL&&r===n.UNSIGNED_INT_24_8&&(o=n.DEPTH24_STENCIL8),o!==n.R16F&&o!==n.R32F&&o!==n.RG16F&&o!==n.RG32F&&o!==n.RGBA16F&&o!==n.RGBA32F||a.get("EXT_color_buffer_float"),o}setTextureParameters(e,t){const{gl:r,extensions:s,backend:i}=this,n=p.getPrimaries(p.workingColorSpace),a=t.colorSpace===T?null:p.getPrimaries(t.colorSpace),o=t.colorSpace===T||n===a?r.NONE:r.BROWSER_DEFAULT_WEBGL;r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,t.flipY),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t.premultiplyAlpha),r.pixelStorei(r.UNPACK_ALIGNMENT,t.unpackAlignment),r.pixelStorei(r.UNPACK_COLORSPACE_CONVERSION_WEBGL,o),r.texParameteri(e,r.TEXTURE_WRAP_S,pR[t.wrapS]),r.texParameteri(e,r.TEXTURE_WRAP_T,pR[t.wrapT]),e!==r.TEXTURE_3D&&e!==r.TEXTURE_2D_ARRAY||t.isArrayTexture||r.texParameteri(e,r.TEXTURE_WRAP_R,pR[t.wrapR]),r.texParameteri(e,r.TEXTURE_MAG_FILTER,gR[t.magFilter]);const u=void 0!==t.mipmaps&&t.mipmaps.length>0,l=t.minFilter===oe&&u?K:t.minFilter;if(r.texParameteri(e,r.TEXTURE_MIN_FILTER,gR[l]),t.compareFunction&&(r.texParameteri(e,r.TEXTURE_COMPARE_MODE,r.COMPARE_REF_TO_TEXTURE),r.texParameteri(e,r.TEXTURE_COMPARE_FUNC,mR[t.compareFunction])),!0===s.has("EXT_texture_filter_anisotropic")){if(t.magFilter===w)return;if(t.minFilter!==at&&t.minFilter!==K)return;if(t.type===j&&!1===s.has("OES_texture_float_linear"))return;if(t.anisotropy>1){const n=s.get("EXT_texture_filter_anisotropic");r.texParameterf(e,n.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(t.anisotropy,i.getMaxAnisotropy()))}}}createDefaultTexture(e){const{gl:t,backend:r,defaultTextures:s}=this,i=this.getGLTextureType(e);let n=s[i];void 0===n&&(n=t.createTexture(),r.state.bindTexture(i,n),t.texParameteri(i,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(i,t.TEXTURE_MAG_FILTER,t.NEAREST),s[i]=n),r.set(e,{textureGPU:n,glTextureType:i})}createTexture(e,t){const{gl:r,backend:s}=this,{levels:i,width:n,height:a,depth:o}=t,u=s.utils.convert(e.format,e.colorSpace),l=s.utils.convert(e.type),d=this.getInternalFormat(e.internalFormat,u,l,e.colorSpace,e.isVideoTexture),c=r.createTexture(),h=this.getGLTextureType(e);s.state.bindTexture(h,c),this.setTextureParameters(h,e),e.isArrayTexture||e.isDataArrayTexture||e.isCompressedArrayTexture?r.texStorage3D(r.TEXTURE_2D_ARRAY,i,d,n,a,o):e.isData3DTexture?r.texStorage3D(r.TEXTURE_3D,i,d,n,a,o):e.isVideoTexture||r.texStorage2D(h,i,d,n,a),s.set(e,{textureGPU:c,glTextureType:h,glFormat:u,glType:l,glInternalFormat:d})}copyBufferToTexture(e,t){const{gl:r,backend:s}=this,{textureGPU:i,glTextureType:n,glFormat:a,glType:o}=s.get(t),{width:u,height:l}=t.source.data;r.bindBuffer(r.PIXEL_UNPACK_BUFFER,e),s.state.bindTexture(n,i),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,!1),r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),r.texSubImage2D(n,0,0,0,u,l,a,o,0),r.bindBuffer(r.PIXEL_UNPACK_BUFFER,null),s.state.unbindTexture()}updateTexture(e,t){const{gl:r}=this,{width:s,height:i}=t,{textureGPU:n,glTextureType:a,glFormat:o,glType:u,glInternalFormat:l}=this.backend.get(e);if(!e.isRenderTargetTexture&&void 0!==n)if(this.backend.state.bindTexture(a,n),this.setTextureParameters(a,e),e.isCompressedTexture){const s=e.mipmaps,i=t.image;for(let t=0;t0){const t=Xr(s.width,s.height,e.format,e.type);for(const i of e.layerUpdates){const e=s.data.subarray(i*t/s.data.BYTES_PER_ELEMENT,(i+1)*t/s.data.BYTES_PER_ELEMENT);r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,i,s.width,s.height,1,o,u,e)}e.clearLayerUpdates()}else r.texSubImage3D(r.TEXTURE_2D_ARRAY,0,0,0,0,s.width,s.height,s.depth,o,u,s.data)}else if(e.isData3DTexture){const e=t.image;r.texSubImage3D(r.TEXTURE_3D,0,0,0,0,e.width,e.height,e.depth,o,u,e.data)}else if(e.isVideoTexture)e.update(),r.texImage2D(a,0,l,o,u,t.image);else{const n=e.mipmaps;if(n.length>0)for(let e=0,t=n.length;e0,c=t.renderTarget?t.renderTarget.height:this.backend.getDrawingBufferSize().y;if(d){const r=0!==a||0!==o;let d,h;if(!0===e.isDepthTexture?(d=s.DEPTH_BUFFER_BIT,h=s.DEPTH_ATTACHMENT,t.stencil&&(d|=s.STENCIL_BUFFER_BIT)):(d=s.COLOR_BUFFER_BIT,h=s.COLOR_ATTACHMENT0),r){const e=this.backend.get(t.renderTarget),r=e.framebuffers[t.getCacheKey()],h=e.msaaFrameBuffer;i.bindFramebuffer(s.DRAW_FRAMEBUFFER,r),i.bindFramebuffer(s.READ_FRAMEBUFFER,h);const p=c-o-l;s.blitFramebuffer(a,p,a+u,p+l,a,p,a+u,p+l,d,s.NEAREST),i.bindFramebuffer(s.READ_FRAMEBUFFER,r),i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,p,u,l),i.unbindTexture()}else{const e=s.createFramebuffer();i.bindFramebuffer(s.DRAW_FRAMEBUFFER,e),s.framebufferTexture2D(s.DRAW_FRAMEBUFFER,h,s.TEXTURE_2D,n,0),s.blitFramebuffer(0,0,u,l,0,0,u,l,d,s.NEAREST),s.deleteFramebuffer(e)}}else i.bindTexture(s.TEXTURE_2D,n),s.copyTexSubImage2D(s.TEXTURE_2D,0,0,0,a,c-l-o,u,l),i.unbindTexture();e.generateMipmaps&&this.generateMipmaps(e),this.backend._setFramebuffer(t)}setupRenderBufferStorage(e,t,r,s=!1){const{gl:i}=this,n=t.renderTarget,{depthTexture:a,depthBuffer:o,stencilBuffer:u,width:l,height:d}=n;if(i.bindRenderbuffer(i.RENDERBUFFER,e),o&&!u){let t=i.DEPTH_COMPONENT24;if(!0===s){this.extensions.get("WEBGL_multisampled_render_to_texture").renderbufferStorageMultisampleEXT(i.RENDERBUFFER,n.samples,t,l,d)}else r>0?(a&&a.isDepthTexture&&a.type===i.FLOAT&&(t=i.DEPTH_COMPONENT32F),i.renderbufferStorageMultisample(i.RENDERBUFFER,r,t,l,d)):i.renderbufferStorage(i.RENDERBUFFER,t,l,d);i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_ATTACHMENT,i.RENDERBUFFER,e)}else o&&u&&(r>0?i.renderbufferStorageMultisample(i.RENDERBUFFER,r,i.DEPTH24_STENCIL8,l,d):i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,l,d),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,e));i.bindRenderbuffer(i.RENDERBUFFER,null)}async copyTextureToBuffer(e,t,r,s,i,n){const{backend:a,gl:o}=this,{textureGPU:u,glFormat:l,glType:d}=this.backend.get(e),c=o.createFramebuffer();a.state.bindFramebuffer(o.READ_FRAMEBUFFER,c);const h=e.isCubeTexture?o.TEXTURE_CUBE_MAP_POSITIVE_X+n:o.TEXTURE_2D;o.framebufferTexture2D(o.READ_FRAMEBUFFER,o.COLOR_ATTACHMENT0,h,u,0);const p=this._getTypedArrayType(d),g=s*i*this._getBytesPerTexel(d,l),m=o.createBuffer();o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.bufferData(o.PIXEL_PACK_BUFFER,g,o.STREAM_READ),o.readPixels(t,r,s,i,l,d,0),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),await a.utils._clientWaitAsync();const f=new p(g/p.BYTES_PER_ELEMENT);return o.bindBuffer(o.PIXEL_PACK_BUFFER,m),o.getBufferSubData(o.PIXEL_PACK_BUFFER,0,f),o.bindBuffer(o.PIXEL_PACK_BUFFER,null),a.state.bindFramebuffer(o.READ_FRAMEBUFFER,null),o.deleteFramebuffer(c),f}_getTypedArrayType(e){const{gl:t}=this;if(e===t.UNSIGNED_BYTE)return Uint8Array;if(e===t.UNSIGNED_SHORT_4_4_4_4)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_5_5_1)return Uint16Array;if(e===t.UNSIGNED_SHORT_5_6_5)return Uint16Array;if(e===t.UNSIGNED_SHORT)return Uint16Array;if(e===t.UNSIGNED_INT)return Uint32Array;if(e===t.HALF_FLOAT)return Uint16Array;if(e===t.FLOAT)return Float32Array;throw new Error(`Unsupported WebGL type: ${e}`)}_getBytesPerTexel(e,t){const{gl:r}=this;let s=0;return e===r.UNSIGNED_BYTE&&(s=1),e!==r.UNSIGNED_SHORT_4_4_4_4&&e!==r.UNSIGNED_SHORT_5_5_5_1&&e!==r.UNSIGNED_SHORT_5_6_5&&e!==r.UNSIGNED_SHORT&&e!==r.HALF_FLOAT||(s=2),e!==r.UNSIGNED_INT&&e!==r.FLOAT||(s=4),t===r.RGBA?4*s:t===r.RGB?3*s:t===r.ALPHA?s:void 0}dispose(){const{gl:e}=this;null!==this._srcFramebuffer&&e.deleteFramebuffer(this._srcFramebuffer),null!==this._dstFramebuffer&&e.deleteFramebuffer(this._dstFramebuffer)}}function bR(e){return e.isDataTexture?e.image.data:"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap||"undefined"!=typeof OffscreenCanvas&&e instanceof OffscreenCanvas?e:e.data}class xR{constructor(e){this.backend=e,this.gl=this.backend.gl,this.availableExtensions=this.gl.getSupportedExtensions(),this.extensions={}}get(e){let t=this.extensions[e];return void 0===t&&(t=this.gl.getExtension(e),this.extensions[e]=t),t}has(e){return this.availableExtensions.includes(e)}}class TR{constructor(e){this.backend=e,this.maxAnisotropy=null}getMaxAnisotropy(){if(null!==this.maxAnisotropy)return this.maxAnisotropy;const e=this.backend.gl,t=this.backend.extensions;if(!0===t.has("EXT_texture_filter_anisotropic")){const r=t.get("EXT_texture_filter_anisotropic");this.maxAnisotropy=e.getParameter(r.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else this.maxAnisotropy=0;return this.maxAnisotropy}}const _R={WEBGL_multi_draw:"WEBGL_multi_draw",WEBGL_compressed_texture_astc:"texture-compression-astc",WEBGL_compressed_texture_etc:"texture-compression-etc2",WEBGL_compressed_texture_etc1:"texture-compression-etc1",WEBGL_compressed_texture_pvrtc:"texture-compression-pvrtc",WEBGL_compressed_texture_s3tc:"texture-compression-s3tc",EXT_texture_compression_bptc:"texture-compression-bc",EXT_disjoint_timer_query_webgl2:"timestamp-query",OVR_multiview2:"OVR_multiview2"};class vR{constructor(e){this.gl=e.gl,this.extensions=e.extensions,this.info=e.renderer.info,this.mode=null,this.index=0,this.type=null,this.object=null}render(e,t){const{gl:r,mode:s,object:i,type:n,info:a,index:o}=this;0!==o?r.drawElements(s,t,n,e):r.drawArrays(s,e,t),a.update(i,t,1)}renderInstances(e,t,r){const{gl:s,mode:i,type:n,index:a,object:o,info:u}=this;0!==r&&(0!==a?s.drawElementsInstanced(i,t,n,e,r):s.drawArraysInstanced(i,e,t,r),u.update(o,t,r))}renderMultiDraw(e,t,r){const{extensions:s,mode:i,object:n,info:a}=this;if(0===r)return;const o=s.get("WEBGL_multi_draw");if(null===o)for(let s=0;sthis.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryStates.set(t,"inactive"),this.queryOffsets.set(e,t),t}beginQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null==t)return;if(null!==this.activeQuery)return;const r=this.queries[t];if(r)try{"inactive"===this.queryStates.get(t)&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,r),this.activeQuery=t,this.queryStates.set(t,"started"))}catch(e){o("Error in beginQuery:",e),this.activeQuery=null,this.queryStates.set(t,"inactive")}}endQuery(e){if(!this.trackTimestamp||this.isDisposed)return;const t=this.queryOffsets.get(e);if(null!=t&&this.activeQuery===t)try{this.gl.endQuery(this.ext.TIME_ELAPSED_EXT),this.queryStates.set(t,"ended"),this.activeQuery=null}catch(e){o("Error in endQuery:",e),this.queryStates.set(t,"inactive"),this.activeQuery=null}}async resolveQueriesAsync(){if(!this.trackTimestamp||this.pendingResolve)return this.lastValue;this.pendingResolve=!0;try{const e=new Map;for(const[t,r]of this.queryOffsets){if("ended"===this.queryStates.get(r)){const s=this.queries[r];e.set(t,this.resolveQuery(s))}}if(0===e.size)return this.lastValue;const t={},r=[];for(const[s,i]of e){const e=s.match(/^(.*):f(\d+)$/),n=parseInt(e[2]);!1===r.includes(n)&&r.push(n),void 0===t[n]&&(t[n]=0);const a=await i;this.timestamps.set(s,a),t[n]+=a}const s=t[r[r.length-1]];return this.lastValue=s,this.frames=r,this.currentQueryIndex=0,this.queryOffsets.clear(),this.queryStates.clear(),this.activeQuery=null,s}catch(e){return o("Error resolving queries:",e),this.lastValue}finally{this.pendingResolve=!1}}async resolveQuery(e){return new Promise(t=>{if(this.isDisposed)return void t(this.lastValue);let r,s=!1;const i=e=>{s||(s=!0,r&&(clearTimeout(r),r=null),t(e))},n=()=>{if(this.isDisposed)i(this.lastValue);else try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return void i(this.lastValue);if(!this.gl.getQueryParameter(e,this.gl.QUERY_RESULT_AVAILABLE))return void(r=setTimeout(n,1));const s=this.gl.getQueryParameter(e,this.gl.QUERY_RESULT);t(Number(s)/1e6)}catch(e){o("Error checking query:",e),t(this.lastValue)}};n()})}dispose(){if(!this.isDisposed&&(this.isDisposed=!0,this.trackTimestamp)){for(const e of this.queries)this.gl.deleteQuery(e);this.queries=[],this.queryStates.clear(),this.queryOffsets.clear(),this.lastValue=0,this.activeQuery=null}}}class RR extends nR{constructor(e={}){super(e),this.isWebGLBackend=!0,this.attributeUtils=null,this.extensions=null,this.capabilities=null,this.textureUtils=null,this.bufferRenderer=null,this.gl=null,this.state=null,this.utils=null,this.vaoCache={},this.transformFeedbackCache={},this.discard=!1,this.disjoint=null,this.parallel=null,this._currentContext=null,this._knownBindings=new WeakSet,this._supportsInvalidateFramebuffer="undefined"!=typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),this._xrFramebuffer=null}init(e){super.init(e);const t=this.parameters,r={antialias:e.currentSamples>0,alpha:!0,depth:e.depth,stencil:e.stencil},s=void 0!==t.context?t.context:e.domElement.getContext("webgl2",r);function i(t){t.preventDefault();const r={api:"WebGL",message:t.statusMessage||"Unknown reason",reason:null,originalEvent:t};e.onDeviceLost(r)}this._onContextLost=i,e.domElement.addEventListener("webglcontextlost",i,!1),this.gl=s,this.extensions=new xR(this),this.capabilities=new TR(this),this.attributeUtils=new dR(this),this.textureUtils=new yR(this),this.bufferRenderer=new vR(this),this.state=new cR(this),this.utils=new hR(this),this.extensions.get("EXT_color_buffer_float"),this.extensions.get("WEBGL_clip_cull_distance"),this.extensions.get("OES_texture_float_linear"),this.extensions.get("EXT_color_buffer_half_float"),this.extensions.get("WEBGL_multisampled_render_to_texture"),this.extensions.get("WEBGL_render_shared_exponent"),this.extensions.get("WEBGL_multi_draw"),this.extensions.get("OVR_multiview2"),this.disjoint=this.extensions.get("EXT_disjoint_timer_query_webgl2"),this.parallel=this.extensions.get("KHR_parallel_shader_compile"),this.drawBuffersIndexedExt=this.extensions.get("OES_draw_buffers_indexed")}get coordinateSystem(){return c}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}async makeXRCompatible(){!0!==this.gl.getContextAttributes().xrCompatible&&await this.gl.makeXRCompatible()}setXRTarget(e){this._xrFramebuffer=e}setXRRenderTargetTextures(e,t,r=null){const s=this.gl;if(this.set(e.texture,{textureGPU:t,glInternalFormat:s.RGBA8}),null!==r){const t=e.stencilBuffer?s.DEPTH24_STENCIL8:s.DEPTH_COMPONENT24;this.set(e.depthTexture,{textureGPU:r,glInternalFormat:t}),!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!0===e._autoAllocateDepthBuffer&&!1===e.multiview&&d("WebGLBackend: Render-to-texture extension was disabled because an external texture was provided"),e._autoAllocateDepthBuffer=!1}}initTimestampQuery(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e]||(this.timestampQueryPool[e]=new SR(this.gl,e,2048));const r=this.timestampQueryPool[e];null!==r.allocateQueriesForContext(t)&&r.beginQuery(t)}prepareTimestampBuffer(e,t){if(!this.disjoint||!this.trackTimestamp)return;this.timestampQueryPool[e].endQuery(t)}getContext(){return this.gl}beginRender(e){const{state:t}=this,r=this.get(e);if(e.viewport)this.updateViewport(e);else{const{width:e,height:r}=this.getDrawingBufferSize();t.viewport(0,0,e,r)}if(e.scissor){const{x:r,y:s,width:i,height:n}=e.scissorValue;t.scissor(r,e.height-n-s,i,n)}this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e)),r.previousContext=this._currentContext,this._currentContext=e,this._setFramebuffer(e),this.clear(e.clearColor,e.clearDepth,e.clearStencil,e,!1);const s=e.occlusionQueryCount;s>0&&(r.currentOcclusionQueries=r.occlusionQueries,r.currentOcclusionQueryObjects=r.occlusionQueryObjects,r.lastOcclusionObject=null,r.occlusionQueries=new Array(s),r.occlusionQueryObjects=new Array(s),r.occlusionQueryIndex=0)}finishRender(e){const{gl:t,state:r}=this,s=this.get(e),i=s.previousContext;r.resetVertexState();const n=e.occlusionQueryCount;n>0&&(n>s.occlusionQueryIndex&&t.endQuery(t.ANY_SAMPLES_PASSED),this.resolveOccludedAsync(e));const a=e.textures;if(null!==a)for(let e=0;e{let a=0;for(let t=0;t{t.isBatchedMesh?null!==t._multiDrawInstances?(v("WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),b.renderMultiDrawInstances(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount,t._multiDrawInstances)):this.hasFeature("WEBGL_multi_draw")?b.renderMultiDraw(t._multiDrawStarts,t._multiDrawCounts,t._multiDrawCount):v("WebGLBackend: WEBGL_multi_draw not supported."):T>1?b.renderInstances(_,x,T):b.render(_,x)};if(!0===e.camera.isArrayCamera&&e.camera.cameras.length>0&&!1===e.camera.isMultiViewCamera){const r=this.get(e.camera),s=e.camera.cameras,i=e.getBindingGroup("cameraIndex").bindings[0];if(void 0===r.indexesGPU||r.indexesGPU.length!==s.length){const e=new Uint32Array([0,0,0,0]),t=[];for(let r=0,i=s.length;r{const i=this.parallel,n=()=>{r.getProgramParameter(a,i.COMPLETION_STATUS_KHR)?(this._completeCompile(e,s),t()):requestAnimationFrame(n)};n()});return void t.push(i)}this._completeCompile(e,s)}_handleSource(e,t){const r=e.split("\n"),s=[],i=Math.max(t-6,0),n=Math.min(t+6,r.length);for(let e=i;e":" "} ${i}: ${r[e]}`)}return s.join("\n")}_getShaderErrors(e,t,r){const s=e.getShaderParameter(t,e.COMPILE_STATUS),i=(e.getShaderInfoLog(t)||"").trim();if(s&&""===i)return"";const n=/ERROR: 0:(\d+)/.exec(i);if(n){const s=parseInt(n[1]);return r.toUpperCase()+"\n\n"+i+"\n\n"+this._handleSource(e.getShaderSource(t),s)}return i}_logProgramError(e,t,r){if(this.renderer.debug.checkShaderErrors){const s=this.gl,i=(s.getProgramInfoLog(e)||"").trim();if(!1===s.getProgramParameter(e,s.LINK_STATUS))if("function"==typeof this.renderer.debug.onShaderError)this.renderer.debug.onShaderError(s,e,r,t);else{const n=this._getShaderErrors(s,r,"vertex"),a=this._getShaderErrors(s,t,"fragment");o("THREE.WebGLProgram: Shader Error "+s.getError()+" - VALIDATE_STATUS "+s.getProgramParameter(e,s.VALIDATE_STATUS)+"\n\nProgram Info Log: "+i+"\n"+n+"\n"+a)}else""!==i&&d("WebGLProgram: Program Info Log:",i)}}_completeCompile(e,t){const{state:r,gl:s}=this,i=this.get(t),{programGPU:n,fragmentShader:a,vertexShader:o}=i;!1===s.getProgramParameter(n,s.LINK_STATUS)&&this._logProgramError(n,a,o),r.useProgram(n);const u=e.getBindings();this._setupBindings(u,n),this.set(t,{programGPU:n})}createComputePipeline(e,t){const{state:r,gl:s}=this,i={stage:"fragment",code:"#version 300 es\nprecision highp float;\nvoid main() {}"};this.createProgram(i);const{computeProgram:n}=e,a=s.createProgram(),o=this.get(i).shaderGPU,u=this.get(n).shaderGPU,l=n.transforms,d=[],c=[];for(let e=0;e_R[t]===e),r=this.extensions;for(let e=0;e1,h=!0===i.isXRRenderTarget,p=!0===h&&!0===i._hasExternalTextures;let g=n.msaaFrameBuffer,m=n.depthRenderbuffer;const f=this.extensions.get("WEBGL_multisampled_render_to_texture"),y=this.extensions.get("OVR_multiview2"),b=this._useMultisampledExtension(i),x=Ey(e);let T;if(l?(n.cubeFramebuffers||(n.cubeFramebuffers={}),T=n.cubeFramebuffers[x]):h&&!1===p?T=this._xrFramebuffer:(n.framebuffers||(n.framebuffers={}),T=n.framebuffers[x]),void 0===T){T=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,T);const s=e.textures,o=[];if(l){n.cubeFramebuffers[x]=T;const{textureGPU:e}=this.get(s[0]),r=this.renderer._activeCubeFace,i=this.renderer._activeMipmapLevel;t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_CUBE_MAP_POSITIVE_X+r,e,i)}else{n.framebuffers[x]=T;for(let r=0;r0&&!1===b&&!i.multiview){if(void 0===g){const s=[];g=t.createFramebuffer(),r.bindFramebuffer(t.FRAMEBUFFER,g);const i=[],l=e.textures;for(let r=0;r0&&!1===this._useMultisampledExtension(s)){const n=i.framebuffers[e.getCacheKey()];let a=t.COLOR_BUFFER_BIT;s.resolveDepthBuffer&&(s.depthBuffer&&(a|=t.DEPTH_BUFFER_BIT),s.stencilBuffer&&s.resolveStencilBuffer&&(a|=t.STENCIL_BUFFER_BIT));const o=i.msaaFrameBuffer,u=i.msaaRenderbuffers,l=e.textures,d=l.length>1;if(r.bindFramebuffer(t.READ_FRAMEBUFFER,o),r.bindFramebuffer(t.DRAW_FRAMEBUFFER,n),d)for(let e=0;e0&&!0===this.extensions.has("WEBGL_multisampled_render_to_texture")&&!1!==e._autoAllocateDepthBuffer}dispose(){null!==this.textureUtils&&this.textureUtils.dispose();const e=this.extensions.get("WEBGL_lose_context");e&&e.loseContext(),this.renderer.domElement.removeEventListener("webglcontextlost",this._onContextLost)}}const AR="point-list",ER="line-list",wR="line-strip",CR="triangle-list",MR="triangle-strip",BR="undefined"!=typeof self&&self.GPUShaderStage?self.GPUShaderStage:{VERTEX:1,FRAGMENT:2,COMPUTE:4},LR="never",FR="less",PR="equal",DR="less-equal",UR="greater",IR="not-equal",OR="greater-equal",VR="always",kR="store",GR="load",zR="clear",$R="ccw",WR="cw",HR="none",qR="back",jR="uint16",XR="uint32",KR="r8unorm",YR="r8snorm",QR="r8uint",ZR="r8sint",JR="r16uint",eA="r16sint",tA="r16float",rA="rg8unorm",sA="rg8snorm",iA="rg8uint",nA="rg8sint",aA="r32uint",oA="r32sint",uA="r32float",lA="rg16uint",dA="rg16sint",cA="rg16float",hA="rgba8unorm",pA="rgba8unorm-srgb",gA="rgba8snorm",mA="rgba8uint",fA="rgba8sint",yA="bgra8unorm",bA="bgra8unorm-srgb",xA="rgb9e5ufloat",TA="rgb10a2unorm",_A="rg11b10ufloat",vA="rg32uint",NA="rg32sint",SA="rg32float",RA="rgba16uint",AA="rgba16sint",EA="rgba16float",wA="rgba32uint",CA="rgba32sint",MA="rgba32float",BA="depth16unorm",LA="depth24plus",FA="depth24plus-stencil8",PA="depth32float",DA="depth32float-stencil8",UA="bc1-rgba-unorm",IA="bc1-rgba-unorm-srgb",OA="bc2-rgba-unorm",VA="bc2-rgba-unorm-srgb",kA="bc3-rgba-unorm",GA="bc3-rgba-unorm-srgb",zA="bc4-r-unorm",$A="bc4-r-snorm",WA="bc5-rg-unorm",HA="bc5-rg-snorm",qA="bc6h-rgb-ufloat",jA="bc6h-rgb-float",XA="bc7-rgba-unorm",KA="bc7-rgba-unorm-srgb",YA="etc2-rgb8unorm",QA="etc2-rgb8unorm-srgb",ZA="etc2-rgb8a1unorm",JA="etc2-rgb8a1unorm-srgb",eE="etc2-rgba8unorm",tE="etc2-rgba8unorm-srgb",rE="eac-r11unorm",sE="eac-r11snorm",iE="eac-rg11unorm",nE="eac-rg11snorm",aE="astc-4x4-unorm",oE="astc-4x4-unorm-srgb",uE="astc-5x4-unorm",lE="astc-5x4-unorm-srgb",dE="astc-5x5-unorm",cE="astc-5x5-unorm-srgb",hE="astc-6x5-unorm",pE="astc-6x5-unorm-srgb",gE="astc-6x6-unorm",mE="astc-6x6-unorm-srgb",fE="astc-8x5-unorm",yE="astc-8x5-unorm-srgb",bE="astc-8x6-unorm",xE="astc-8x6-unorm-srgb",TE="astc-8x8-unorm",_E="astc-8x8-unorm-srgb",vE="astc-10x5-unorm",NE="astc-10x5-unorm-srgb",SE="astc-10x6-unorm",RE="astc-10x6-unorm-srgb",AE="astc-10x8-unorm",EE="astc-10x8-unorm-srgb",wE="astc-10x10-unorm",CE="astc-10x10-unorm-srgb",ME="astc-12x10-unorm",BE="astc-12x10-unorm-srgb",LE="astc-12x12-unorm",FE="astc-12x12-unorm-srgb",PE="clamp-to-edge",DE="repeat",UE="mirror-repeat",IE="linear",OE="nearest",VE="zero",kE="one",GE="src",zE="one-minus-src",$E="src-alpha",WE="one-minus-src-alpha",HE="dst",qE="one-minus-dst",jE="dst-alpha",XE="one-minus-dst-alpha",KE="src-alpha-saturated",YE="constant",QE="one-minus-constant",ZE="add",JE="subtract",ew="reverse-subtract",tw="min",rw="max",sw=0,iw=15,nw="keep",aw="zero",ow="replace",uw="invert",lw="increment-clamp",dw="decrement-clamp",cw="increment-wrap",hw="decrement-wrap",pw="storage",gw="read-only-storage",mw="write-only",fw="read-only",yw="read-write",bw="non-filtering",xw="comparison",Tw="float",_w="unfilterable-float",vw="depth",Nw="sint",Sw="uint",Rw="2d",Aw="3d",Ew="2d",ww="2d-array",Cw="cube",Mw="3d",Bw="all",Lw="vertex",Fw="instance",Pw={CoreFeaturesAndLimits:"core-features-and-limits",DepthClipControl:"depth-clip-control",Depth32FloatStencil8:"depth32float-stencil8",TextureCompressionBC:"texture-compression-bc",TextureCompressionBCSliced3D:"texture-compression-bc-sliced-3d",TextureCompressionETC2:"texture-compression-etc2",TextureCompressionASTC:"texture-compression-astc",TextureCompressionASTCSliced3D:"texture-compression-astc-sliced-3d",TimestampQuery:"timestamp-query",IndirectFirstInstance:"indirect-first-instance",ShaderF16:"shader-f16",RG11B10UFloat:"rg11b10ufloat-renderable",BGRA8UNormStorage:"bgra8unorm-storage",Float32Filterable:"float32-filterable",Float32Blendable:"float32-blendable",ClipDistances:"clip-distances",DualSourceBlending:"dual-source-blending",Subgroups:"subgroups",TextureFormatsTier1:"texture-formats-tier1",TextureFormatsTier2:"texture-formats-tier2"},Dw={"texture-compression-s3tc":"texture-compression-bc","texture-compression-etc1":"texture-compression-etc2"};class Uw extends $S{constructor(e,t,r){super(e,t?t.value:null),this.textureNode=t,this.groupNode=r}update(){const{textureNode:e}=this;return this.texture!==e.value?(this.texture=e.value,!0):super.update()}}class Iw extends US{constructor(e,t){super(e,t?t.array:null),this.attribute=t,this.isStorageBuffer=!0}}let Ow=0;class Vw extends Iw{constructor(e,t){super("StorageBuffer_"+Ow++,e?e.value:null),this.nodeUniform=e,this.access=e?e.access:ti.READ_WRITE,this.groupNode=t}get buffer(){return this.nodeUniform.value}}class kw extends ty{constructor(e){super(),this.device=e;this.mipmapSampler=e.createSampler({minFilter:IE}),this.flipYSampler=e.createSampler({minFilter:OE}),this.transferPipelines={},this.flipYPipelines={},this.mipmapVertexShaderModule=e.createShaderModule({label:"mipmapVertex",code:"\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4,\n\t@location( 0 ) vTex : vec2\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2, 4 >(\n\t\tvec2( -1.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 ),\n\t\tvec2( -1.0, -1.0 ),\n\t\tvec2( 1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2, 4 >(\n\t\tvec2( 0.0, 0.0 ),\n\t\tvec2( 1.0, 0.0 ),\n\t\tvec2( 0.0, 1.0 ),\n\t\tvec2( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n"}),this.mipmapFragmentShaderModule=e.createShaderModule({label:"mipmapFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n"}),this.flipYFragmentShaderModule=e.createShaderModule({label:"flipYFragment",code:"\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2 ) -> @location( 0 ) vec4 {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n"})}getTransferPipeline(e){let t=this.transferPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`mipmap-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.mipmapFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.transferPipelines[e]=t),t}getFlipYPipeline(e){let t=this.flipYPipelines[e];return void 0===t&&(t=this.device.createRenderPipeline({label:`flipY-${e}`,vertex:{module:this.mipmapVertexShaderModule,entryPoint:"main"},fragment:{module:this.flipYFragmentShaderModule,entryPoint:"main",targets:[{format:e}]},primitive:{topology:MR,stripIndexFormat:XR},layout:"auto"}),this.flipYPipelines[e]=t),t}flipY(e,t,r=0){const s=t.format,{width:i,height:n}=t.size,a=this.getTransferPipeline(s),o=this.getFlipYPipeline(s),u=this.device.createTexture({size:{width:i,height:n,depthOrArrayLayers:1},format:s,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.TEXTURE_BINDING}),l=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r}),d=u.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:0}),c=this.device.createCommandEncoder({}),h=(e,t,r)=>{const s=e.getBindGroupLayout(0),i=this.device.createBindGroup({layout:s,entries:[{binding:0,resource:this.flipYSampler},{binding:1,resource:t}]}),n=c.beginRenderPass({colorAttachments:[{view:r,loadOp:zR,storeOp:kR,clearValue:[0,0,0,0]}]});n.setPipeline(e),n.setBindGroup(0,i),n.draw(4,1,0,0),n.end()};h(a,l,d),h(o,d,l),this.device.queue.submit([c.finish()]),u.destroy()}generateMipmaps(e,t,r=0,s=null){const i=this.get(e);void 0===i.layers&&(i.layers=[]);const n=i.layers[r]||this._mipmapCreateBundles(e,t,r),a=s||this.device.createCommandEncoder({label:"mipmapEncoder"});this._mipmapRunBundles(a,n),null===s&&this.device.queue.submit([a.finish()]),i.layers[r]=n}_mipmapCreateBundles(e,t,r){const s=this.getTransferPipeline(t.format),i=s.getBindGroupLayout(0);let n=e.createView({baseMipLevel:0,mipLevelCount:1,dimension:Ew,baseArrayLayer:r});const a=[];for(let o=1;o0)for(let t=0,n=s.length;t0)for(let t=0,n=s.length;t0?e.width:r.size.width,l=a>0?e.height:r.size.height;try{o.queue.copyExternalImageToTexture({source:e,flipY:i},{texture:t,mipLevel:a,origin:{x:0,y:0,z:s},premultipliedAlpha:n},{width:u,height:l,depthOrArrayLayers:1})}catch(e){}}_getPassUtils(){let e=this._passUtils;return null===e&&(this._passUtils=e=new kw(this.backend.device)),e}_generateMipmaps(e,t,r=0,s=null){this._getPassUtils().generateMipmaps(e,t,r,s)}_flipY(e,t,r=0){this._getPassUtils().flipY(e,t,r)}_copyBufferToTexture(e,t,r,s,i,n=0,a=0){const o=this.backend.device,u=e.data,l=this._getBytesPerTexel(r.format),d=e.width*l;o.queue.writeTexture({texture:t,mipLevel:a,origin:{x:0,y:0,z:s}},u,{offset:e.width*e.height*l*n,bytesPerRow:d},{width:e.width,height:e.height,depthOrArrayLayers:1}),!0===i&&this._flipY(t,r,s)}_copyCompressedBufferToTexture(e,t,r){const s=this.backend.device,i=this._getBlockData(r.format),n=r.size.depthOrArrayLayers>1;for(let a=0;a]*\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/i,qw=/([a-z_0-9]+)\s*:\s*([a-z_0-9]+(?:<[\s\S]+?>)?)/gi,jw={f32:"float",i32:"int",u32:"uint",bool:"bool","vec2":"vec2","vec2":"ivec2","vec2":"uvec2","vec2":"bvec2",vec2f:"vec2",vec2i:"ivec2",vec2u:"uvec2",vec2b:"bvec2","vec3":"vec3","vec3":"ivec3","vec3":"uvec3","vec3":"bvec3",vec3f:"vec3",vec3i:"ivec3",vec3u:"uvec3",vec3b:"bvec3","vec4":"vec4","vec4":"ivec4","vec4":"uvec4","vec4":"bvec4",vec4f:"vec4",vec4i:"ivec4",vec4u:"uvec4",vec4b:"bvec4","mat2x2":"mat2",mat2x2f:"mat2","mat3x3":"mat3",mat3x3f:"mat3","mat4x4":"mat4",mat4x4f:"mat4",sampler:"sampler",texture_1d:"texture",texture_2d:"texture",texture_2d_array:"texture",texture_multisampled_2d:"cubeTexture",texture_depth_2d:"depthTexture",texture_depth_2d_array:"depthTexture",texture_depth_multisampled_2d:"depthTexture",texture_depth_cube:"depthTexture",texture_depth_cube_array:"depthTexture",texture_3d:"texture3D",texture_cube:"cubeTexture",texture_cube_array:"cubeTexture",texture_storage_1d:"storageTexture",texture_storage_2d:"storageTexture",texture_storage_2d_array:"storageTexture",texture_storage_3d:"storageTexture"};class Xw extends YN{constructor(e){const{type:t,inputs:r,name:s,inputsCode:i,blockCode:n,outputType:a}=(e=>{const t=(e=e.trim()).match(Hw);if(null!==t&&4===t.length){const r=t[2],s=[];let i=null;for(;null!==(i=qw.exec(r));)s.push({name:i[1],type:i[2]});const n=[];for(let e=0;e "+this.outputType:"";return`fn ${e} ( ${this.inputsCode.trim()} ) ${t}`+this.blockCode}}class Kw extends KN{parseFunction(e){return new Xw(e)}}const Yw={[ti.READ_ONLY]:"read",[ti.WRITE_ONLY]:"write",[ti.READ_WRITE]:"read_write"},Qw={[Vr]:"repeat",[xe]:"clamp",[Or]:"mirror"},Zw={vertex:BR.VERTEX,fragment:BR.FRAGMENT,compute:BR.COMPUTE},Jw={instance:!0,swizzleAssign:!1,storageBuffer:!0},eC={"^^":"tsl_xor"},tC={float:"f32",int:"i32",uint:"u32",bool:"bool",color:"vec3",vec2:"vec2",ivec2:"vec2",uvec2:"vec2",bvec2:"vec2",vec3:"vec3",ivec3:"vec3",uvec3:"vec3",bvec3:"vec3",vec4:"vec4",ivec4:"vec4",uvec4:"vec4",bvec4:"vec4",mat2:"mat2x2",mat3:"mat3x3",mat4:"mat4x4"},rC={},sC={tsl_xor:new Xx("fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }"),mod_float:new Xx("fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }"),mod_vec2:new Xx("fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }"),mod_vec3:new Xx("fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }"),mod_vec4:new Xx("fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }"),equals_bool:new Xx("fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }"),equals_bvec2:new Xx("fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2 { return vec2( a.x == b.x, a.y == b.y ); }"),equals_bvec3:new Xx("fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3 { return vec3( a.x == b.x, a.y == b.y, a.z == b.z ); }"),equals_bvec4:new Xx("fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4 { return vec4( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }"),repeatWrapping_float:new Xx("fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }"),mirrorWrapping_float:new Xx("fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }"),clampWrapping_float:new Xx("fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }"),biquadraticTexture:new Xx("\nfn tsl_biquadraticTexture( map : texture_2d, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n")},iC={dFdx:"dpdx",dFdy:"- dpdy",mod_float:"tsl_mod_float",mod_vec2:"tsl_mod_vec2",mod_vec3:"tsl_mod_vec3",mod_vec4:"tsl_mod_vec4",equals_bool:"tsl_equals_bool",equals_bvec2:"tsl_equals_bvec2",equals_bvec3:"tsl_equals_bvec3",equals_bvec4:"tsl_equals_bvec4",inversesqrt:"inverseSqrt",bitcast:"bitcast",floatpack_snorm_2x16:"pack2x16snorm",floatpack_unorm_2x16:"pack2x16unorm",floatpack_float16_2x16:"pack2x16float",floatunpack_snorm_2x16:"unpack2x16snorm",floatunpack_unorm_2x16:"unpack2x16unorm",floatunpack_float16_2x16:"unpack2x16float"};let nC="";!0!==("undefined"!=typeof navigator&&/Firefox|Deno/g.test(navigator.userAgent))&&(nC+="diagnostic( off, derivative_uniformity );\n");class aC extends PN{constructor(e,t){super(e,t,new Kw),this.uniformGroups={},this.uniformGroupsBindings={},this.builtins={},this.directives={},this.scopedArrays=new Map}_generateTextureSample(e,t,r,s,i,n=this.shaderStage){return"fragment"===n?s?i?`textureSample( ${t}, ${t}_sampler, ${r}, ${s}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r}, ${s} )`:i?`textureSample( ${t}, ${t}_sampler, ${r}, ${i} )`:`textureSample( ${t}, ${t}_sampler, ${r} )`:this.generateTextureSampleLevel(e,t,r,"0",s)}generateTextureSampleLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateWrapFunction(e){const t=`tsl_coord_${Qw[e.wrapS]}S_${Qw[e.wrapT]}_${e.is3DTexture||e.isData3DTexture?"3d":"2d"}T`;let r=rC[t];if(void 0===r){const s=[],i=e.is3DTexture||e.isData3DTexture?"vec3f":"vec2f";let n=`fn ${t}( coord : ${i} ) -> ${i} {\n\n\treturn ${i}(\n`;const a=(e,t)=>{e===Vr?(s.push(sC.repeatWrapping_float),n+=`\t\ttsl_repeatWrapping_float( coord.${t} )`):e===xe?(s.push(sC.clampWrapping_float),n+=`\t\ttsl_clampWrapping_float( coord.${t} )`):e===Or?(s.push(sC.mirrorWrapping_float),n+=`\t\ttsl_mirrorWrapping_float( coord.${t} )`):(n+=`\t\tcoord.${t}`,d(`WebGPURenderer: Unsupported texture wrap type "${e}" for vertex shader.`))};a(e.wrapS,"x"),n+=",\n",a(e.wrapT,"y"),(e.is3DTexture||e.isData3DTexture)&&(n+=",\n",a(e.wrapR,"z")),n+="\n\t);\n\n}\n",rC[t]=r=new Xx(n,s)}return r.build(this),t}generateArrayDeclaration(e,t){return`array< ${this.getType(e)}, ${t} >`}generateTextureDimension(e,t,r){const s=this.getDataFromNode(e,this.shaderStage,this.globalCache);void 0===s.dimensionsSnippet&&(s.dimensionsSnippet={});let i=s.dimensionsSnippet[r];if(void 0===s.dimensionsSnippet[r]){let n,a;const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(e),u=o>1;a=e.is3DTexture||e.isData3DTexture?"vec3":"vec2",n=u||e.isStorageTexture?t:`${t}${r?`, u32( ${r} )`:""}`,i=new Au(new pl(`textureDimensions( ${n} )`,a)),s.dimensionsSnippet[r]=i,(e.isArrayTexture||e.isDataArrayTexture||e.is3DTexture||e.isData3DTexture)&&(s.arrayLayerCount=new Au(new pl(`textureNumLayers(${t})`,"u32"))),e.isTextureCube&&(s.cubeFaceCount=new Au(new pl("6u","u32")))}return i.build(this)}generateFilteredTexture(e,t,r,s,i="0u"){this._include("biquadraticTexture");const n=this.generateWrapFunction(e),a=this.generateTextureDimension(e,t,i);return s&&(r=`${r} + vec2(${s}) / ${a}`),`tsl_biquadraticTexture( ${t}, ${n}( ${r} ), ${a}, u32( ${i} ) )`}generateTextureLod(e,t,r,s,i,n="0u"){if(!0===e.isCubeTexture){i&&(r=`${r} + vec3(${i})`);return`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${e.isDepthTexture?"u32":"f32"}( ${n} ) )`}const a=this.generateWrapFunction(e),o=this.generateTextureDimension(e,t,n),u=e.is3DTexture||e.isData3DTexture?"vec3":"vec2";return i&&(r=`${r} + ${u}(${i}) / ${u}( ${o} )`),r=`${u}( ${a}( ${r} ) * ${u}( ${o} ) )`,this.generateTextureLoad(e,t,r,n,s,null)}generateTextureLoad(e,t,r,s,i,n){let a;return null===s&&(s="0u"),n&&(r=`${r} + ${n}`),i?a=`textureLoad( ${t}, ${r}, ${i}, u32( ${s} ) )`:(a=`textureLoad( ${t}, ${r}, u32( ${s} ) )`,this.renderer.backend.compatibilityMode&&e.isDepthTexture&&(a+=".x")),a}generateTextureStore(e,t,r,s,i){let n;return n=s?`textureStore( ${t}, ${r}, ${s}, ${i} )`:`textureStore( ${t}, ${r}, ${i} )`,n}isSampleCompare(e){return!0===e.isDepthTexture&&null!==e.compareFunction&&this.renderer.hasCompatibility(A.TEXTURE_COMPARE)}isUnfilterable(e){return"float"!==this.getComponentTypeFromTexture(e)||!this.isAvailable("float32Filterable")&&!0===e.isDataTexture&&e.type===j||!1===this.isSampleCompare(e)&&e.minFilter===w&&e.magFilter===w||this.renderer.backend.utils.getTextureSampleData(e).primarySamples>1}generateTexture(e,t,r,s,i,n=this.shaderStage){let a=null;return a=this.isUnfilterable(e)?this.generateTextureLod(e,t,r,s,i,"0",n):this._generateTextureSample(e,t,r,s,i,n),a}generateTextureGrad(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]}, ${n} )`:`textureSampleGrad( ${t}, ${t}_sampler, ${r}, ${s[0]}, ${s[1]} )`;o(`WebGPURenderer: THREE.TextureNode.gradient() does not support ${a} shader.`)}generateTextureCompare(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return!0===e.isDepthTexture&&!0===e.isArrayTexture?n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${i}, ${s} )`:n?`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleCompare( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${a} shader.`)}generateTextureLevel(e,t,r,s,i,n){return!1===this.isUnfilterable(e)?n?`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleLevel( ${t}, ${t}_sampler, ${r}, ${s} )`:this.isFilteredTexture(e)?this.generateFilteredTexture(e,t,r,n,s):this.generateTextureLod(e,t,r,i,n,s)}generateTextureBias(e,t,r,s,i,n,a=this.shaderStage){if("fragment"===a)return n?`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s}, ${n} )`:`textureSampleBias( ${t}, ${t}_sampler, ${r}, ${s} )`;o(`WebGPURenderer: THREE.TextureNode.biasNode does not support ${a} shader.`)}getPropertyName(e,t=this.shaderStage){if(!0===e.isNodeVarying&&!0===e.needsInterpolation){if("vertex"===t)return`varyings.${e.name}`}else if(!0===e.isNodeUniform){const t=e.name,r=e.type;return"texture"===r||"cubeTexture"===r||"cubeDepthTexture"===r||"storageTexture"===r||"texture3D"===r?t:"buffer"===r||"storageBuffer"===r||"indirectStorageBuffer"===r?this.isCustomStruct(e)?t:t+".value":e.groupNode.name+"."+t}return super.getPropertyName(e)}getOutputStructName(){return"output"}getFunctionOperator(e){const t=eC[e];return void 0!==t?(this._include(t),t):null}getNodeAccess(e,t){return"compute"!==t?!0===e.isAtomic?(d("WebGPURenderer: Atomic operations are only supported in compute shaders."),ti.READ_WRITE):ti.READ_ONLY:e.access}getStorageAccess(e,t){return Yw[this.getNodeAccess(e,t)]}getUniformFromNode(e,t,r,s=null){const i=super.getUniformFromNode(e,t,r,s),n=this.getDataFromNode(e,r,this.globalCache);if(void 0===n.uniformGPU){let a;const o=e.groupNode,u=o.name,l=this.getBindGroupArray(u,r);if("texture"===t||"cubeTexture"===t||"cubeDepthTexture"===t||"storageTexture"===t||"texture3D"===t){let s=null;const n=this.getNodeAccess(e,r);"texture"===t||"storageTexture"===t?s=!0===e.value.is3DTexture?new XS(i.name,i.node,o,n):new qS(i.name,i.node,o,n):"cubeTexture"===t||"cubeDepthTexture"===t?s=new jS(i.name,i.node,o,n):"texture3D"===t&&(s=new XS(i.name,i.node,o,n)),s.store=!0===e.isStorageTextureNode,s.mipLevel=s.store?e.mipLevel:0,s.setVisibility(Zw[r]);if(!0===e.value.isCubeTexture||!1===this.isUnfilterable(e.value)&&!1===s.store){const e=new Uw(`${i.name}_sampler`,i.node,o);e.setVisibility(Zw[r]),l.push(e,s),a=[e,s]}else l.push(s),a=[s]}else if("buffer"===t||"storageBuffer"===t||"indirectStorageBuffer"===t){const n=this.getSharedDataFromNode(e);let u=n.buffer;if(void 0===u){u=new("buffer"===t?VS:Vw)(e,o),n.buffer=u}u.setVisibility(u.getVisibility()|Zw[r]),l.push(u),a=u,i.name=s||"NodeBuffer_"+i.id}else{let e=this.uniformGroups[u];void 0===e?(e=new zS(u,o),e.setVisibility(Zw[r]),this.uniformGroups[u]=e,l.push(e)):(e.setVisibility(e.getVisibility()|Zw[r]),-1===l.indexOf(e)&&l.push(e)),a=this.getNodeUniform(i,t);const s=a.name;e.uniforms.some(e=>e.name===s)||e.addUniform(a)}n.uniformGPU=a}return i}getBuiltin(e,t,r,s=this.shaderStage){const i=this.builtins[s]||(this.builtins[s]=new Map);return!1===i.has(e)&&i.set(e,{name:e,property:t,type:r}),t}hasBuiltin(e,t=this.shaderStage){return void 0!==this.builtins[t]&&this.builtins[t].has(e)}getVertexIndex(){return"vertex"===this.shaderStage?this.getBuiltin("vertex_index","vertexIndex","u32","attribute"):"vertexIndex"}buildFunctionCode(e){const t=e.layout,r=this.flowShaderNode(e),s=[];for(const e of t.inputs)s.push(e.name+" : "+this.getType(e.type));let i=`fn ${t.name}( ${s.join(", ")} ) -> ${this.getType(t.type)} {\n${r.vars}\n${r.code}\n`;return r.result&&(i+=`\treturn ${r.result};\n`),i+="\n}\n",i}getInstanceIndex(){return"vertex"===this.shaderStage?this.getBuiltin("instance_index","instanceIndex","u32","attribute"):"instanceIndex"}getInvocationLocalIndex(){return this.getBuiltin("local_invocation_index","invocationLocalIndex","u32","attribute")}getSubgroupSize(){return this.enableSubGroups(),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute")}getInvocationSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_invocation_id","invocationSubgroupIndex","u32","attribute")}getSubgroupIndex(){return this.enableSubGroups(),this.getBuiltin("subgroup_id","subgroupIndex","u32","attribute")}getDrawIndex(){return null}getFrontFacing(){return this.getBuiltin("front_facing","isFront","bool")}getFragCoord(){return this.getBuiltin("position","fragCoord","vec4")+".xy"}getFragDepth(){return"output."+this.getBuiltin("frag_depth","depth","f32","output")}getClipDistance(){return"varyings.hw_clip_distances"}isFlipY(){return!1}enableDirective(e,t=this.shaderStage){(this.directives[t]||(this.directives[t]=new Set)).add(e)}getDirectives(e){const t=[],r=this.directives[e];if(void 0!==r)for(const e of r)t.push(`enable ${e};`);return t.join("\n")}enableSubGroups(){this.enableDirective("subgroups")}enableSubgroupsF16(){this.enableDirective("subgroups-f16")}enableClipDistances(){this.enableDirective("clip_distances")}enableShaderF16(){this.enableDirective("f16")}enableDualSourceBlending(){this.enableDirective("dual_source_blending")}enableHardwareClipping(e){this.enableClipDistances(),this.getBuiltin("clip_distances","hw_clip_distances",`array`,"vertex")}getBuiltins(e){const t=[],r=this.builtins[e];if(void 0!==r)for(const{name:e,property:s,type:i}of r.values())t.push(`@builtin( ${e} ) ${s} : ${i}`);return t.join(",\n\t")}getScopedArray(e,t,r,s){return!1===this.scopedArrays.has(e)&&this.scopedArrays.set(e,{name:e,scope:t,bufferType:r,bufferCount:s}),e}getScopedArrays(e){if("compute"!==e)return;const t=[];for(const{name:e,scope:r,bufferType:s,bufferCount:i}of this.scopedArrays.values()){const n=this.getType(s);t.push(`var<${r}> ${e}: array< ${n}, ${i} >;`)}return t.join("\n")}getAttributes(e){const t=[];if("compute"===e&&(this.getBuiltin("global_invocation_id","globalId","vec3","attribute"),this.getBuiltin("workgroup_id","workgroupId","vec3","attribute"),this.getBuiltin("local_invocation_id","localId","vec3","attribute"),this.getBuiltin("num_workgroups","numWorkgroups","vec3","attribute"),this.renderer.hasFeature("subgroups")&&(this.enableDirective("subgroups",e),this.getBuiltin("subgroup_size","subgroupSize","u32","attribute"))),"vertex"===e||"compute"===e){const e=this.getBuiltins("attribute");e&&t.push(e);const r=this.getAttributesArray();for(let e=0,s=r.length;e"),t.push(`\t${s+r.name} : ${i}`)}return e.output&&t.push(`\t${this.getBuiltins("output")}`),t.join(",\n")}getStructs(e){let t="";const r=this.structs[e];if(r.length>0){const e=[];for(const t of r){let r=`struct ${t.name} {\n`;r+=this.getStructMembers(t),r+="\n};",e.push(r)}t="\n"+e.join("\n\n")+"\n"}return t}getVar(e,t,r=null){let s=`var ${t} : `;return s+=null!==r?this.generateArrayDeclaration(e,r):this.getType(e),s}getVars(e){const t=[],r=this.vars[e];if(void 0!==r)for(const e of r)t.push(`\t${this.getVar(e.type,e.name,e.count)};`);return`\n${t.join("\n")}\n`}getVaryings(e){const t=[];if("vertex"===e&&this.getBuiltin("position","builtinClipSpace","vec4","vertex"),"vertex"===e||"fragment"===e){const r=this.varyings,s=this.vars[e];for(let i=0;ir.value.itemSize;return s&&!i}getUniforms(e){const t=this.uniforms[e],r=[],s=[],i=[],n={};for(const i of t){const t=i.groupNode.name,a=this.bindingsIndexes[t];if("texture"===i.type||"cubeTexture"===i.type||"cubeDepthTexture"===i.type||"storageTexture"===i.type||"texture3D"===i.type){const t=i.node.value;let s;(!0===t.isCubeTexture||!1===this.isUnfilterable(t)&&!0!==i.node.isStorageTextureNode)&&(this.isSampleCompare(t)?r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler_comparison;`):r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name}_sampler : sampler;`));let n="";const{primarySamples:o}=this.renderer.backend.utils.getTextureSampleData(t);if(o>1&&(n="_multisampled"),!0===t.isCubeTexture&&!0===t.isDepthTexture)s="texture_depth_cube";else if(!0===t.isCubeTexture)s="texture_cube";else if(!0===t.isDepthTexture)s=this.renderer.backend.compatibilityMode&&null===t.compareFunction?`texture${n}_2d`:`texture_depth${n}_2d${!0===t.isArrayTexture?"_array":""}`;else if(!0===i.node.isStorageTextureNode){const r=Ww(t),n=this.getStorageAccess(i.node,e),a=i.node.value.is3DTexture,o=i.node.value.isArrayTexture;s=`texture_storage_${a?"3d":"2d"+(o?"_array":"")}<${r}, ${n}>`}else if(!0===t.isArrayTexture||!0===t.isDataArrayTexture||!0===t.isCompressedArrayTexture)s="texture_2d_array";else if(!0===t.is3DTexture||!0===t.isData3DTexture)s="texture_3d";else{s=`texture${n}_2d<${this.getComponentTypeFromTexture(t).charAt(0)}32>`}r.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var ${i.name} : ${s};`)}else if("buffer"===i.type||"storageBuffer"===i.type||"indirectStorageBuffer"===i.type){const t=i.node,r=this.getType(t.getNodeType(this)),n=t.bufferCount,o=n>0&&"buffer"===i.type?", "+n:"",u=t.isStorageBufferNode?`storage, ${this.getStorageAccess(t,e)}`:"uniform";if(this.isCustomStruct(i))s.push(`@binding( ${a.binding++} ) @group( ${a.group} ) var<${u}> ${i.name} : ${r};`);else{const e=`\tvalue : array< ${t.isAtomic?`atomic<${r}>`:`${r}`}${o} >`;s.push(this._getWGSLStructBinding(i.name,e,u,a.binding++,a.group))}}else{const e=i.groupNode.name;if(void 0===n[e]){const t=this.uniformGroups[e];if(void 0!==t){const r=[];for(const e of t.uniforms){const t=e.getType(),s=this.getType(this.getVectorType(t));r.push(`\t${e.name} : ${s}`)}let s=this.uniformGroupsBindings[e];void 0===s&&(s={index:a.binding++,id:a.group},this.uniformGroupsBindings[e]=s),n[e]={index:s.index,id:s.id,snippets:r}}}}}for(const e in n){const t=n[e];i.push(this._getWGSLStructBinding(e,t.snippets.join(",\n"),"uniform",t.index,t.id))}return[...r,...s,...i].join("\n")}buildCode(){const e=null!==this.material?{fragment:{},vertex:{}}:{compute:{}};this.sortBindingGroups();for(const t in e){this.shaderStage=t;const r=e[t];r.uniforms=this.getUniforms(t),r.attributes=this.getAttributes(t),r.varyings=this.getVaryings(t),r.structs=this.getStructs(t),r.vars=this.getVars(t),r.codes=this.getCodes(t),r.directives=this.getDirectives(t),r.scopedArrays=this.getScopedArrays(t);let s="// code\n\n";s+=this.flowCode[t];const i=this.flowNodes[t],n=i[i.length-1],a=n.outputNode,o=void 0!==a&&!0===a.isOutputStructNode;for(const e of i){const i=this.getFlowData(e),u=e.name;if(u&&(s.length>0&&(s+="\n"),s+=`\t// flow -> ${u}\n`),s+=`${i.code}\n\t`,e===n&&"compute"!==t)if(s+="// result\n\n\t","vertex"===t)s+=`varyings.builtinClipSpace = ${i.result};`;else if("fragment"===t)if(o)r.returnType=a.getNodeType(this),r.structs+="var output : "+r.returnType+";",s+=`return ${i.result};`;else{let e="\t@location(0) color: vec4";const t=this.getBuiltins("output");t&&(e+=",\n\t"+t),r.returnType="OutputStruct",r.structs+=this._getWGSLStruct("OutputStruct",e),r.structs+="\nvar output : OutputStruct;",s+=`output.color = ${i.result};\n\n\treturn output;`}}r.flow=s}if(this.shaderStage=null,null!==this.material)this.vertexShader=this._getWGSLVertexCode(e.vertex),this.fragmentShader=this._getWGSLFragmentCode(e.fragment);else{const t=this.object.workgroupSize;this.computeShader=this._getWGSLComputeCode(e.compute,t)}}getMethod(e,t=null){let r;return null!==t&&(r=this._getWGSLMethod(e+"_"+t)),void 0===r&&(r=this._getWGSLMethod(e)),r||e}getBitcastMethod(e){return`bitcast<${this.getType(e)}>`}getFloatPackingMethod(e){return this.getMethod(`floatpack_${e}_2x16`)}getFloatUnpackingMethod(e){return this.getMethod(`floatunpack_${e}_2x16`)}getTernary(e,t,r){return`select( ${r}, ${t}, ${e} )`}getType(e){return tC[e]||e}isAvailable(e){let t=Jw[e];return void 0===t&&("float32Filterable"===e?t=this.renderer.hasFeature("float32-filterable"):"clipDistance"===e&&(t=this.renderer.hasFeature("clip-distances")),Jw[e]=t),t}_getWGSLMethod(e){return void 0!==sC[e]&&this._include(e),iC[e]}_include(e){const t=sC[e];return t.build(this),this.addInclude(t),t}_getWGSLVertexCode(e){return`${this.getSignature()}\n// directives\n${e.directives}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// varyings\n${e.varyings}\nvar varyings : VaryingsStruct;\n\n// codes\n${e.codes}\n\n@vertex\nfn main( ${e.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n\treturn varyings;\n\n}\n`}_getWGSLFragmentCode(e){return`${this.getSignature()}\n// global\n${nC}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@fragment\nfn main( ${e.varyings} ) -> ${e.returnType} {\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLComputeCode(e,t){const[r,s,i]=t;return`${this.getSignature()}\n// directives\n${e.directives}\n\n// system\nvar instanceIndex : u32;\n\n// locals\n${e.scopedArrays}\n\n// structs\n${e.structs}\n\n// uniforms\n${e.uniforms}\n\n// codes\n${e.codes}\n\n@compute @workgroup_size( ${r}, ${s}, ${i} )\nfn main( ${e.attributes} ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${r} * numWorkgroups.x )\n\t\t+ globalId.z * ( ${r} * numWorkgroups.x ) * ( ${s} * numWorkgroups.y );\n\n\t// vars\n\t${e.vars}\n\n\t// flow\n\t${e.flow}\n\n}\n`}_getWGSLStruct(e,t){return`\nstruct ${e} {\n${t}\n};`}_getWGSLStructBinding(e,t,r,s=0,i=0){const n=e+"Struct";return`${this._getWGSLStruct(n,t)}\n@binding( ${s} ) @group( ${i} )\nvar<${r}> ${e} : ${n};`}}class oC{constructor(e){this.backend=e}getCurrentDepthStencilFormat(e){let t;return e.depth&&(t=null!==e.depthTexture?this.getTextureFormatGPU(e.depthTexture):e.stencil?FA:LA),t}getTextureFormatGPU(e){return this.backend.get(e).format}getTextureSampleData(e){let t;if(e.isFramebufferTexture)t=1;else if(e.isDepthTexture&&!e.renderTarget){const e=this.backend.renderer,r=e.getRenderTarget();t=r?r.samples:e.currentSamples}else e.renderTarget&&(t=e.renderTarget.samples);t=t||1;const r=t>1&&null!==e.renderTarget&&!0!==e.isDepthTexture&&!0!==e.isFramebufferTexture;return{samples:t,primarySamples:r?1:t,isMSAA:r}}getCurrentColorFormat(e){let t;return t=null!==e.textures?this.getTextureFormatGPU(e.textures[0]):this.getPreferredCanvasFormat(),t}getCurrentColorFormats(e){return null!==e.textures?e.textures.map(e=>this.getTextureFormatGPU(e)):[this.getPreferredCanvasFormat()]}getCurrentColorSpace(e){return null!==e.textures?e.textures[0].colorSpace:this.backend.renderer.outputColorSpace}getPrimitiveTopology(e,t){return e.isPoints?AR:e.isLineSegments||e.isMesh&&!0===t.wireframe?ER:e.isLine?wR:e.isMesh?CR:void 0}getSampleCount(e){return e>=4?4:1}getSampleCountRenderContext(e){return null!==e.textures?this.getSampleCount(e.sampleCount):this.getSampleCount(this.backend.renderer.currentSamples)}getPreferredCanvasFormat(){const e=this.backend.parameters.outputType;if(void 0===e)return navigator.gpu.getPreferredCanvasFormat();if(e===Ge)return yA;if(e===be)return EA;throw new Error("Unsupported output buffer type.")}}const uC=new Map([[Int8Array,["sint8","snorm8"]],[Uint8Array,["uint8","unorm8"]],[Int16Array,["sint16","snorm16"]],[Uint16Array,["uint16","unorm16"]],[Int32Array,["sint32","snorm32"]],[Uint32Array,["uint32","unorm32"]],[Float32Array,["float32"]]]);"undefined"!=typeof Float16Array&&uC.set(Float16Array,["float16"]);const lC=new Map([[ot,["float16"]]]),dC=new Map([[Int32Array,"sint32"],[Int16Array,"sint32"],[Uint32Array,"uint32"],[Uint16Array,"uint32"],[Float32Array,"float32"]]);class cC{constructor(e){this.backend=e}createAttribute(e,t){const r=this._getBufferAttribute(e),s=this.backend,i=s.get(r);let n=i.buffer;if(void 0===n){const a=s.device;let o=r.array;if(!1===e.normalized)if(o.constructor===Int16Array||o.constructor===Int8Array)o=new Int32Array(o);else if((o.constructor===Uint16Array||o.constructor===Uint8Array)&&(o=new Uint32Array(o),t&GPUBufferUsage.INDEX))for(let e=0;e0&&(void 0===n.groups&&(n.groups=[],n.versions=[]),n.versions[r]===s&&(o=n.groups[r])),void 0===o&&(o=this.createBindGroup(e,a),r>0&&(n.groups[r]=o,n.versions[r]=s)),n.group=o}updateBinding(e){const t=this.backend,r=t.device,s=e.buffer,i=t.get(e).buffer,n=e.updateRanges;if(0===n.length)r.queue.writeBuffer(i,0,s,0);else{const e=Kr(s),t=e?1:s.BYTES_PER_ELEMENT;for(let a=0,o=n.length;a1&&(i+=`-${e.texture.depthOrArrayLayers}`),i+=`-${r}-${s}`,a=e[i],void 0===a){const n=Bw;let o;o=t.isSampledCubeTexture?Cw:t.isSampledTexture3D?Mw:t.texture.isArrayTexture||t.texture.isDataArrayTexture||t.texture.isCompressedArrayTexture?ww:Ew,a=e[i]=e.texture.createView({aspect:n,dimension:o,mipLevelCount:r,baseMipLevel:s})}}n.push({binding:i,resource:a})}else if(t.isSampler){const e=r.get(t.texture);n.push({binding:i,resource:e.sampler})}i++}return s.createBindGroup({label:"bindGroup_"+e.name,layout:t,entries:n})}_createLayoutEntries(e){const t=[];let r=0;for(const s of e.bindings){const e=this.backend,i={binding:r,visibility:s.visibility};if(s.isUniformBuffer||s.isStorageBuffer){const e={};s.isStorageBuffer&&(s.visibility&BR.COMPUTE&&(s.access===ti.READ_WRITE||s.access===ti.WRITE_ONLY)?e.type=pw:e.type=gw),i.buffer=e}else if(s.isSampledTexture&&s.store){const e={};e.format=this.backend.get(s.texture).texture.format;const t=s.access;e.access=t===ti.READ_WRITE?yw:t===ti.WRITE_ONLY?mw:fw,s.texture.isArrayTexture?e.viewDimension=ww:s.texture.is3DTexture&&(e.viewDimension=Mw),i.storageTexture=e}else if(s.isSampledTexture){const t={},{primarySamples:r}=e.utils.getTextureSampleData(s.texture);if(r>1&&(t.multisampled=!0,s.texture.isDepthTexture||(t.sampleType=_w)),s.texture.isDepthTexture)e.compatibilityMode&&null===s.texture.compareFunction?t.sampleType=_w:t.sampleType=vw;else if(s.texture.isDataTexture||s.texture.isDataArrayTexture||s.texture.isData3DTexture){const e=s.texture.type;e===R?t.sampleType=Nw:e===S?t.sampleType=Sw:e===j&&(this.backend.hasFeature("float32-filterable")?t.sampleType=Tw:t.sampleType=_w)}s.isSampledCubeTexture?t.viewDimension=Cw:s.texture.isArrayTexture||s.texture.isDataArrayTexture||s.texture.isCompressedArrayTexture?t.viewDimension=ww:s.isSampledTexture3D&&(t.viewDimension=Mw),i.texture=t}else if(s.isSampler){const t={};s.texture.isDepthTexture&&(null!==s.texture.compareFunction&&e.hasCompatibility(A.TEXTURE_COMPARE)?t.type=xw:t.type=bw),i.sampler=t}else o(`WebGPUBindingUtils: Unsupported binding "${s}".`);t.push(i),r++}return t}deleteBindGroupData(e){const{backend:t}=this,r=t.get(e);r.layout&&(r.layout.usedTimes--,0===r.layout.usedTimes&&this._bindGroupLayoutCache.delete(r.layoutKey),r.layout=void 0,r.layoutKey=void 0)}dispose(){this._bindGroupLayoutCache.clear()}}class gC{constructor(e){this.backend=e,this._activePipelines=new WeakMap}setPipeline(e,t){this._activePipelines.get(e)!==t&&(e.setPipeline(t),this._activePipelines.set(e,t))}_getSampleCount(e){return this.backend.utils.getSampleCountRenderContext(e)}createRenderPipeline(e,t){const{object:r,material:s,geometry:i,pipeline:n}=e,{vertexProgram:a,fragmentProgram:u}=n,l=this.backend,d=l.device,c=l.utils,h=l.get(n),p=[];for(const t of e.getBindings()){const e=l.get(t),{layoutGPU:r}=e.layout;p.push(r)}const g=l.attributeUtils.createShaderVertexBuffers(e);let m;s.blending===ee||s.blending===ze&&!1===s.transparent||(m=this._getBlending(s));let f={};!0===s.stencilWrite&&(f={compare:this._getStencilCompare(s),failOp:this._getStencilOperation(s.stencilFail),depthFailOp:this._getStencilOperation(s.stencilZFail),passOp:this._getStencilOperation(s.stencilZPass)});const y=this._getColorWriteMask(s),b=[];if(null!==e.context.textures){const t=e.context.textures,r=e.context.mrt;for(let e=0;e1},layout:d.createPipelineLayout({bindGroupLayouts:p})},A={},E=e.context.depth,w=e.context.stencil;if(!0!==E&&!0!==w||(!0===E&&(A.format=N,A.depthWriteEnabled=s.depthWrite,A.depthCompare=v),!0===w&&(A.stencilFront=f,A.stencilBack={},A.stencilReadMask=s.stencilFuncMask,A.stencilWriteMask=s.stencilWriteMask),!0===s.polygonOffset&&(A.depthBias=s.polygonOffsetUnits,A.depthBiasSlopeScale=s.polygonOffsetFactor,A.depthBiasClamp=0),R.depthStencil=A),d.pushErrorScope("validation"),null===t)h.pipeline=d.createRenderPipeline(R),d.popErrorScope().then(e=>{null!==e&&(h.error=!0,o(e.message))});else{const e=new Promise(async e=>{try{h.pipeline=await d.createRenderPipelineAsync(R)}catch(e){}const t=await d.popErrorScope();null!==t&&(h.error=!0,o(t.message)),e()});t.push(e)}}createBundleEncoder(e,t="renderBundleEncoder"){const r=this.backend,{utils:s,device:i}=r,n=s.getCurrentDepthStencilFormat(e),a={label:t,colorFormats:s.getCurrentColorFormats(e),depthStencilFormat:n,sampleCount:this._getSampleCount(e)};return i.createRenderBundleEncoder(a)}createComputePipeline(e,t){const r=this.backend,s=r.device,i=r.get(e.computeProgram).module,n=r.get(e),a=[];for(const e of t){const t=r.get(e),{layoutGPU:s}=t.layout;a.push(s)}n.pipeline=s.createComputePipeline({compute:i,layout:s.createPipelineLayout({bindGroupLayouts:a})})}_getBlending(e){let t,r;const s=e.blending,i=e.blendSrc,n=e.blendDst,a=e.blendEquation;if(s===ht){const s=null!==e.blendSrcAlpha?e.blendSrcAlpha:i,o=null!==e.blendDstAlpha?e.blendDstAlpha:n,u=null!==e.blendEquationAlpha?e.blendEquationAlpha:a;t={srcFactor:this._getBlendFactor(i),dstFactor:this._getBlendFactor(n),operation:this._getBlendOperation(a)},r={srcFactor:this._getBlendFactor(s),dstFactor:this._getBlendFactor(o),operation:this._getBlendOperation(u)}}else{const i=(e,s,i,n)=>{t={srcFactor:e,dstFactor:s,operation:ZE},r={srcFactor:i,dstFactor:n,operation:ZE}};if(e.premultipliedAlpha)switch(s){case ze:i(kE,WE,kE,WE);break;case qt:i(kE,kE,kE,kE);break;case Ht:i(VE,zE,VE,kE);break;case Wt:i(HE,WE,VE,kE)}else switch(s){case ze:i($E,WE,kE,WE);break;case qt:i($E,kE,kE,kE);break;case Ht:o(`WebGPURenderer: "SubtractiveBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`);break;case Wt:o(`WebGPURenderer: "MultiplyBlending" requires "${e.isMaterial?"material":"blendMode"}.premultipliedAlpha = true".`)}}if(void 0!==t&&void 0!==r)return{color:t,alpha:r};o("WebGPURenderer: Invalid blending: ",s)}_getBlendFactor(e){let t;switch(e){case pt:t=VE;break;case kt:t=kE;break;case Vt:t=GE;break;case Dt:t=zE;break;case $e:t=$E;break;case We:t=WE;break;case It:t=HE;break;case Pt:t=qE;break;case Ut:t=jE;break;case Ft:t=XE;break;case Ot:t=KE;break;case 211:t=YE;break;case 212:t=QE;break;default:o("WebGPURenderer: Blend factor not supported.",e)}return t}_getStencilCompare(e){let t;const r=e.stencilFunc;switch(r){case ss:t=LR;break;case rs:t=VR;break;case ts:t=FR;break;case es:t=DR;break;case Jr:t=PR;break;case Zr:t=OR;break;case Qr:t=UR;break;case Yr:t=IR;break;default:o("WebGPURenderer: Invalid stencil function.",r)}return t}_getStencilOperation(e){let t;switch(e){case cs:t=nw;break;case ds:t=aw;break;case ls:t=ow;break;case us:t=uw;break;case os:t=lw;break;case as:t=dw;break;case ns:t=cw;break;case is:t=hw;break;default:o("WebGPURenderer: Invalid stencil operation.",t)}return t}_getBlendOperation(e){let t;switch(e){case He:t=ZE;break;case Lt:t=JE;break;case Bt:t=ew;break;case ps:t=tw;break;case hs:t=rw;break;default:o("WebGPUPipelineUtils: Blend equation not supported.",e)}return t}_getPrimitiveState(e,t,r){const s={},i=this.backend.utils;s.topology=i.getPrimitiveTopology(e,r),null!==t.index&&!0===e.isLine&&!0!==e.isLineSegments&&(s.stripIndexFormat=t.index.array instanceof Uint16Array?jR:XR);let n=r.side===M;return e.isMesh&&e.matrixWorld.determinant()<0&&(n=!n),s.frontFace=!0===n?WR:$R,s.cullMode=r.side===B?HR:qR,s}_getColorWriteMask(e){return!0===e.colorWrite?iw:sw}_getDepthCompare(e){let t;if(!1===e.depthTest)t=VR;else{const r=e.depthFunc;switch(r){case er:t=LR;break;case Jt:t=VR;break;case Zt:t=FR;break;case Qt:t=DR;break;case Yt:t=PR;break;case Kt:t=OR;break;case Xt:t=UR;break;case jt:t=IR;break;default:o("WebGPUPipelineUtils: Invalid depth function.",r)}}return t}}class mC extends NR{constructor(e,t,r=2048){super(r),this.device=e,this.type=t,this.querySet=this.device.createQuerySet({type:"timestamp",count:this.maxQueries,label:`queryset_global_timestamp_${t}`});const s=8*this.maxQueries;this.resolveBuffer=this.device.createBuffer({label:`buffer_timestamp_resolve_${t}`,size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.resultBuffer=this.device.createBuffer({label:`buffer_timestamp_result_${t}`,size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})}allocateQueriesForContext(e){if(!this.trackTimestamp||this.isDisposed)return null;if(this.currentQueryIndex+2>this.maxQueries)return v(`WebGPUTimestampQueryPool [${this.type}]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${this.type.toUpperCase()} ).`),null;const t=this.currentQueryIndex;return this.currentQueryIndex+=2,this.queryOffsets.set(e,t),t}async resolveQueriesAsync(){if(!this.trackTimestamp||0===this.currentQueryIndex||this.isDisposed)return this.lastValue;if(this.pendingResolve)return this.pendingResolve;this.pendingResolve=this._resolveQueries();try{return await this.pendingResolve}finally{this.pendingResolve=null}}async _resolveQueries(){if(this.isDisposed)return this.lastValue;try{if("unmapped"!==this.resultBuffer.mapState)return this.lastValue;const e=new Map(this.queryOffsets),t=this.currentQueryIndex,r=8*t;this.currentQueryIndex=0,this.queryOffsets.clear();const s=this.device.createCommandEncoder();s.resolveQuerySet(this.querySet,0,t,this.resolveBuffer,0),s.copyBufferToBuffer(this.resolveBuffer,0,this.resultBuffer,0,r);const i=s.finish();if(this.device.queue.submit([i]),"unmapped"!==this.resultBuffer.mapState)return this.lastValue;if(await this.resultBuffer.mapAsync(GPUMapMode.READ,0,r),this.isDisposed)return"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue;const n=new BigUint64Array(this.resultBuffer.getMappedRange(0,r)),a={},o=[];for(const[t,r]of e){const e=t.match(/^(.*):f(\d+)$/),s=parseInt(e[2]);!1===o.includes(s)&&o.push(s),void 0===a[s]&&(a[s]=0);const i=n[r],u=n[r+1],l=Number(u-i)/1e6;this.timestamps.set(t,l),a[s]+=l}const u=a[o[o.length-1]];return this.resultBuffer.unmap(),this.lastValue=u,this.frames=o,u}catch(e){return o("Error resolving queries:",e),"mapped"===this.resultBuffer.mapState&&this.resultBuffer.unmap(),this.lastValue}}async dispose(){if(!this.isDisposed){if(this.isDisposed=!0,this.pendingResolve)try{await this.pendingResolve}catch(e){o("Error waiting for pending resolve:",e)}if(this.resultBuffer&&"mapped"===this.resultBuffer.mapState)try{this.resultBuffer.unmap()}catch(e){o("Error unmapping buffer:",e)}this.querySet&&(this.querySet.destroy(),this.querySet=null),this.resolveBuffer&&(this.resolveBuffer.destroy(),this.resolveBuffer=null),this.resultBuffer&&(this.resultBuffer.destroy(),this.resultBuffer=null),this.queryOffsets.clear(),this.pendingResolve=null}}}class fC extends nR{constructor(e={}){super(e),this.isWebGPUBackend=!0,this.parameters.alpha=void 0===e.alpha||e.alpha,this.parameters.compatibilityMode=void 0!==e.compatibilityMode&&e.compatibilityMode,this.parameters.requiredLimits=void 0===e.requiredLimits?{}:e.requiredLimits,this.compatibilityMode=this.parameters.compatibilityMode,this.device=null,this.defaultRenderPassdescriptor=null,this.utils=new oC(this),this.attributeUtils=new cC(this),this.bindingUtils=new pC(this),this.pipelineUtils=new gC(this),this.textureUtils=new $w(this),this.occludedResolveCache=new Map;const t="undefined"==typeof navigator||!1===/Android/.test(navigator.userAgent);this._compatibility={[A.TEXTURE_COMPARE]:t}}async init(e){await super.init(e);const t=this.parameters;let r;if(void 0===t.device){const e={powerPreference:t.powerPreference,featureLevel:t.compatibilityMode?"compatibility":void 0},s="undefined"!=typeof navigator?await navigator.gpu.requestAdapter(e):null;if(null===s)throw new Error("WebGPUBackend: Unable to create WebGPU adapter.");const i=Object.values(Pw),n=[];for(const e of i)s.features.has(e)&&n.push(e);const a={requiredFeatures:n,requiredLimits:t.requiredLimits};r=await s.requestDevice(a)}else r=t.device;r.lost.then(t=>{if("destroyed"===t.reason)return;const r={api:"WebGPU",message:t.message||"Unknown reason",reason:t.reason||null,originalEvent:t};e.onDeviceLost(r)}),this.device=r,this.trackTimestamp=this.trackTimestamp&&this.hasFeature(Pw.TimestampQuery),this.updateSize()}get context(){const e=this.renderer.getCanvasTarget(),t=this.get(e);let r=t.context;if(void 0===r){const s=this.parameters;r=!0===e.isDefaultCanvasTarget&&void 0!==s.context?s.context:e.domElement.getContext("webgpu"),"setAttribute"in e.domElement&&e.domElement.setAttribute("data-engine",`three.js r${ut} webgpu`);const i=s.alpha?"premultiplied":"opaque",n=s.outputType===be?"extended":"standard";r.configure({device:this.device,format:this.utils.getPreferredCanvasFormat(),usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC,alphaMode:i,toneMapping:{mode:n}}),t.context=r}return r}get coordinateSystem(){return h}async getArrayBufferAsync(e){return await this.attributeUtils.getArrayBufferAsync(e)}getContext(){return this.context}_getDefaultRenderPassDescriptor(){const e=this.renderer,t=e.getCanvasTarget(),r=this.get(t),s=e.currentSamples;let i=r.descriptor;if(void 0===i||r.samples!==s){i={colorAttachments:[{view:null}]},!0!==e.depth&&!0!==e.stencil||(i.depthStencilAttachment={view:this.textureUtils.getDepthBuffer(e.depth,e.stencil).createView()});const t=i.colorAttachments[0];s>0?t.view=this.textureUtils.getColorBuffer().createView():t.resolveTarget=void 0,r.descriptor=i,r.samples=s}const n=i.colorAttachments[0];return s>0?n.resolveTarget=this.context.getCurrentTexture().createView():n.view=this.context.getCurrentTexture().createView(),i}_isRenderCameraDepthArray(e){return e.depthTexture&&e.depthTexture.image.depth>1&&e.camera.isArrayCamera}_getRenderPassDescriptor(e,t={}){const r=e.renderTarget,s=this.get(r);let i=s.descriptors;void 0!==i&&s.width===r.width&&s.height===r.height&&s.samples===r.samples||(i={},s.descriptors=i);const n=e.getCacheKey();let a=i[n];if(void 0===a){const t=e.textures,o=[];let u;const l=this._isRenderCameraDepthArray(e);for(let s=0;s1)if(!0===l){const t=e.camera.cameras;for(let e=0;e0&&(t.currentOcclusionQuerySet&&t.currentOcclusionQuerySet.destroy(),t.currentOcclusionQueryBuffer&&t.currentOcclusionQueryBuffer.destroy(),t.currentOcclusionQuerySet=t.occlusionQuerySet,t.currentOcclusionQueryBuffer=t.occlusionQueryBuffer,t.currentOcclusionQueryObjects=t.occlusionQueryObjects,i=r.createQuerySet({type:"occlusion",count:s,label:`occlusionQuerySet_${e.id}`}),t.occlusionQuerySet=i,t.occlusionQueryIndex=0,t.occlusionQueryObjects=new Array(s),t.lastOcclusionObject=null),n=null===e.textures?this._getDefaultRenderPassDescriptor():this._getRenderPassDescriptor(e,{loadOp:GR}),this.initTimestampQuery(Ct.RENDER,this.getTimestampUID(e),n),n.occlusionQuerySet=i;const a=n.depthStencilAttachment;if(null!==e.textures){const t=n.colorAttachments;for(let r=0;r0&&t.currentPass.executeBundles(t.renderBundles),r>t.occlusionQueryIndex&&t.currentPass.endOcclusionQuery();const s=t.encoder;if(!0===this._isRenderCameraDepthArray(e)){const r=[];for(let e=0;e0){const s=8*r;let i=this.occludedResolveCache.get(s);void 0===i&&(i=this.device.createBuffer({size:s,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC}),this.occludedResolveCache.set(s,i));const n=this.device.createBuffer({size:s,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});t.encoder.resolveQuerySet(t.occlusionQuerySet,0,r,i,0),t.encoder.copyBufferToBuffer(i,0,n,0,s),t.occlusionQueryBuffer=n,this.resolveOccludedAsync(e)}if(this.device.queue.submit([t.encoder.finish()]),null!==e.textures){const t=e.textures;for(let e=0;eo&&(i[0]=Math.min(a,o),i[1]=Math.ceil(a/o)),n.dispatchSize=i}i=n.dispatchSize}a.dispatchWorkgroups(i[0],i[1]||1,i[2]||1)}finishCompute(e){const t=this.get(e);t.passEncoderGPU.end(),this.device.queue.submit([t.cmdEncoderGPU.finish()])}draw(e,t){const{object:r,material:s,context:i,pipeline:n}=e,a=e.getBindings(),o=this.get(i),u=this.get(n),l=u.pipeline;if(!0===u.error)return;const d=e.getIndex(),c=null!==d,h=e.getDrawParameters();if(null===h)return;const p=(t,r)=>{this.pipelineUtils.setPipeline(t,l),r.pipeline=l;const n=r.bindingGroups;for(let e=0,r=a.length;e{if(p(s,i),!0===r.isBatchedMesh){const e=r._multiDrawStarts,i=r._multiDrawCounts,n=r._multiDrawCount,a=r._multiDrawInstances;null!==a&&v("WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.");for(let o=0;o1?0:o;!0===c?s.drawIndexed(i[o],n,e[o]/d.array.BYTES_PER_ELEMENT,0,u):s.draw(i[o],n,e[o],u),t.update(r,i[o],n)}}else if(!0===c){const{vertexCount:i,instanceCount:n,firstVertex:a}=h,o=e.getIndirect();if(null!==o){const t=this.get(o).buffer,r=e.getIndirectOffset(),i=Array.isArray(r)?r:[r];for(let e=0;e0){const t=this.get(e.camera),s=e.camera.cameras,n=e.getBindingGroup("cameraIndex");if(void 0===t.indexesGPU||t.indexesGPU.length!==s.length){const e=this.get(n),r=[],i=new Uint32Array([0,0,0,0]);for(let t=0,n=s.length;t(d("WebGPURenderer: WebGPU is not available, running under WebGL2 backend."),new RR(e)));super(new t(e),e),this.library=new xC,this.isWebGPURenderer=!0}}class _C extends Es{constructor(){super(),this.isBundleGroup=!0,this.type="BundleGroup",this.static=!0,this.version=0}set needsUpdate(e){!0===e&&this.version++}}class vC{constructor(e,t=An(0,0,1,1)){this.renderer=e,this.outputNode=t,this.outputColorTransform=!0,this.needsUpdate=!0;const r=new Qp;r.name="PostProcessing",this._quadMesh=new $b(r),this._quadMesh.name="Post-Processing",this._context=null}render(){const e=this.renderer;this._update(),null!==this._context.onBeforePostProcessing&&this._context.onBeforePostProcessing();const t=e.toneMapping,r=e.outputColorSpace;e.toneMapping=m,e.outputColorSpace=p.workingColorSpace;const s=e.xr.enabled;e.xr.enabled=!1,this._quadMesh.render(e),e.xr.enabled=s,e.toneMapping=t,e.outputColorSpace=r,null!==this._context.onAfterPostProcessing&&this._context.onAfterPostProcessing()}get context(){return this._context}dispose(){this._quadMesh.material.dispose()}_update(){if(!0===this.needsUpdate){const e=this.renderer,t=e.toneMapping,r=e.outputColorSpace,s={postProcessing:this,onBeforePostProcessing:null,onAfterPostProcessing:null};let i=this.outputNode;!0===this.outputColorTransform?(i=i.context(s),i=yl(i,t,r)):(s.toneMapping=t,s.outputColorSpace=r,i=i.context(s)),this._context=s,this._quadMesh.material.fragmentNode=i,this._quadMesh.material.needsUpdate=!0,this.needsUpdate=!1}}async renderAsync(){v('PostProcessing: "renderAsync()" has been deprecated. Use "render()" and "await renderer.init();" when creating the renderer.'),await this.renderer.init(),this.render()}}class NC extends N{constructor(e=1,t=1){super(),this.image={width:e,height:t},this.magFilter=oe,this.minFilter=oe,this.isStorageTexture=!0,this.mipmapsAutoUpdate=!0}setSize(e,t){this.image.width===e&&this.image.height===t||(this.image.width=e,this.image.height=t,this.dispose())}}class SC extends rx{constructor(e,t){super(e,t,Uint32Array),this.isIndirectStorageBufferAttribute=!0}}class RC extends ws{constructor(e){super(e),this.textures={},this.nodes={}}load(e,t,r,s){const i=new Cs(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,r=>{try{t(this.parse(JSON.parse(r)))}catch(t){s?s(t):o(t),this.manager.itemError(e)}},r,s)}parseNodes(e){const t={};if(void 0!==e){for(const r of e){const{uuid:e,type:s}=r;t[e]=this.createNodeFromType(s),t[e].uuid=e}const r={nodes:t,textures:this.textures};for(const s of e){s.meta=r;t[s.uuid].deserialize(s),delete s.meta}}return t}parse(e){const t=this.createNodeFromType(e.type);t.uuid=e.uuid;const r={nodes:this.parseNodes(e.nodes),textures:this.textures};return e.meta=r,t.deserialize(e),delete e.meta,t}setTextures(e){return this.textures=e,this}setNodes(e){return this.nodes=e,this}createNodeFromType(e){return void 0===this.nodes[e]?(o("NodeLoader: Node type not found:",e),gn()):new this.nodes[e]}}class AC extends Ms{constructor(e){super(e),this.nodes={},this.nodeMaterials={}}parse(e){const t=super.parse(e),r=this.nodes,s=e.inputNodes;for(const e in s){const i=s[e];t[e]=r[i]}return t}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}createMaterialFromType(e){const t=this.nodeMaterials[e];return void 0!==t?new t:super.createMaterialFromType(e)}}class EC extends Bs{constructor(e){super(e),this.nodes={},this.nodeMaterials={},this._nodesJSON=null}setNodes(e){return this.nodes=e,this}setNodeMaterials(e){return this.nodeMaterials=e,this}parse(e,t){this._nodesJSON=e.nodes;const r=super.parse(e,t);return this._nodesJSON=null,r}parseNodes(e,t){if(void 0!==e){const r=new RC;return r.setNodes(this.nodes),r.setTextures(t),r.parseNodes(e)}return{}}parseMaterials(e,t){const r={};if(void 0!==e){const s=this.parseNodes(this._nodesJSON,t),i=new AC;i.setTextures(t),i.setNodes(s),i.setNodeMaterials(this.nodeMaterials);for(let t=0,s=e.length;t { - - return this.value; - - }; - - this.setWidth( width ); - - const title = new TitleElement( name ) - .setObjectCallback( getObjectCallback ) - .setSerializable( false ); - - setOutputAestheticsFromNode( title, value ); - - const contextButton = new ButtonInput().onClick( () => { - - context.open(); - - } ).setIcon( 'ti ti-dots' ); - - const onAddButtons = () => { - - context.removeEventListener( 'show', onAddButtons ); - - context.add( new ButtonInput( 'Remove' ).setIcon( 'ti ti-trash' ).onClick( () => { - - this.dispose(); - - } ) ); - - if ( this.hasJSON() ) { - - this.context.add( new ButtonInput( 'Export' ).setIcon( 'ti ti-download' ).onClick( () => { - - exportJSON( this.exportJSON(), this.constructor.name ); - - } ) ); - - } - - context.add( new ButtonInput( 'Isolate' ).setIcon( 'ti ti-3d-cube-sphere' ).onClick( () => { - - this.context.hide(); - - this.title.dom.dispatchEvent( new MouseEvent( 'dblclick' ) ); - - } ) ); - - }; - - const context = new ContextMenu( this.dom ); - context.addEventListener( 'show', onAddButtons ); - - this.title = title; - - if ( this.icon ) this.setIcon( 'ti ti-' + this.icon ); - - this.contextButton = contextButton; - this.context = context; - - title.addButton( contextButton ); - - this.add( title ); - - this.editor = null; - - this.value = value; - - this.onValidElement = onValidNode; - - this.outputLength = getLengthFromNode( value ); - - } - - getColor() { - - const color = getColorFromNode( this.value ); - - return color ? color + 'BB' : null; - - } - - hasJSON() { - - return this.value && typeof this.value.toJSON === 'function'; - - } - - exportJSON() { - - return this.value.toJSON(); - - } - - serialize( data ) { - - super.serialize( data ); - - delete data.width; - - } - - deserialize( data ) { - - delete data.width; - - super.deserialize( data ); - - } - - setEditor( value ) { - - this.editor = value; - - this.dispatchEvent( new Event( 'editor' ) ); - - return this; - - } - - add( element ) { - - element.onValid( ( source, target ) => this.onValidElement( source, target ) ); - - return super.add( element ); - - } - - setName( value ) { - - this.title.setTitle( value ); - - return this; - - } - - setIcon( value ) { - - this.title.setIcon( 'ti ti-' + value ); - - return this; - - } - - getName() { - - return this.title.getTitle(); - - } - - setObjectCallback( callback ) { - - this.title.setObjectCallback( callback ); - - return this; - - } - - getObject( callback ) { - - return this.title.getObject( callback ); - - } - - setColor( color ) { - - this.title.setColor( color ); - - return this; - - } - - invalidate() { - - this.title.dispatchEvent( new Event( 'connect' ) ); - - } - - dispose() { - - this.setEditor( null ); - - this.context.hide(); - - super.dispose(); - - } - -} diff --git a/playground/DataTypeLib.js b/playground/DataTypeLib.js deleted file mode 100644 index 606adec2b27f75..00000000000000 --- a/playground/DataTypeLib.js +++ /dev/null @@ -1,166 +0,0 @@ -export const typeToLengthLib = { - // gpu - string: 1, - float: 1, - bool: 1, - vec2: 2, - vec3: 3, - vec4: 4, - color: 3, - mat2: 1, - mat3: 1, - mat4: 1, - // cpu - String: 1, - Number: 1, - Vector2: 2, - Vector3: 3, - Vector4: 4, - Color: 3, - // cpu: other stuff - Material: 1, - Object3D: 1, - CodeNode: 1, - Texture: 1, - URL: 1, - node: 1 -}; - -export const defaultLength = 1; - -export function getLengthFromType( type ) { - - return typeToLengthLib[ type ] || defaultLength; - -} - -export function getLengthFromNode( value ) { - - const type = getTypeFromNode( value ); - - return getLengthFromType( type ); - -} - -export const typeToColorLib = { - // gpu - string: '#ff0000', - float: '#eeeeee', - bool: '#0060ff', - mat2: '#d0dc8b', - mat3: '#d0dc8b', - mat4: '#d0dc8b', - // cpu - String: '#ff0000', - Number: '#eeeeee', - // cpu: other stuff - Material: '#228b22', - Object3D: '#00a1ff', - CodeNode: '#ff00ff', - Texture: '#ffa500', - URL: '#ff0080' -}; - -export function getColorFromType( type ) { - - return typeToColorLib[ type ] || null; - -} - -export function getColorFromNode( value ) { - - const type = getTypeFromNode( value ); - - return getColorFromType( type ); - -} - -function getTypeFromNode( value ) { - - if ( value ) { - - if ( value.isMaterial ) return 'Material'; - - return value.nodeType === 'ArrayBuffer' ? 'URL' : ( value.nodeType || getTypeFromValue( value.value ) ); - - } - -} - -function getTypeFromValue( value ) { - - if ( value && value.isScriptableValueNode ) value = value.value; - if ( ! value ) return; - - if ( value.isNode && value.nodeType === 'string' ) return 'string'; - if ( value.isNode && value.nodeType === 'ArrayBuffer' ) return 'URL'; - - for ( const type of Object.keys( typeToLengthLib ).reverse() ) { - - if ( value[ 'is' + type ] === true ) return type; - - } - -} - -export function setInputAestheticsFromType( element, type ) { - - element.setInput( getLengthFromType( type ) ); - - const color = getColorFromType( type ); - - if ( color ) { - - element.setInputColor( color ); - - } - - return element; - -} - -export function setOutputAestheticsFromNode( element, node ) { - - if ( ! node ) { - - element.setOutput( 0 ); - - return element; - - } - - return setOutputAestheticsFromType( element, getTypeFromNode( node ) ); - -} - -export function setOutputAestheticsFromType( element, type ) { - - if ( ! type ) { - - element.setOutput( 1 ); - - return element; - - } - - if ( type == 'void' ) { - - element.setOutput( 0 ); - - return element; - - } - - element.setOutput( getLengthFromType( type ) ); - - const color = getColorFromType( type ); - - if ( color ) { - - element.setOutputColor( color ); - - } - - return element; - -} diff --git a/playground/NodeEditor.js b/playground/NodeEditor.js deleted file mode 100644 index 44a01dc0703a3e..00000000000000 --- a/playground/NodeEditor.js +++ /dev/null @@ -1,796 +0,0 @@ -import * as THREE from 'three'; -import * as TSL from 'three/tsl'; -import { Canvas, CircleMenu, ButtonInput, StringInput, ContextMenu, Tips, Search, Loader, Node, TreeViewNode, TreeViewInput, Element } from 'flow'; -import { FileEditor } from './editors/FileEditor.js'; -import { exportJSON } from './NodeEditorUtils.js'; -import { init, ClassLib, getNodeEditorClass, getNodeList } from './NodeEditorLib.js'; -import { SplitscreenManager } from './SplitscreenManager.js'; - -init(); - -Element.icons.unlink = 'ti ti-unlink'; - -export class NodeEditor extends THREE.EventDispatcher { - - constructor( scene = null, renderer = null, composer = null ) { - - super(); - - const domElement = document.createElement( 'flow' ); - const canvas = new Canvas(); - - domElement.append( canvas.dom ); - - this.scene = scene; - this.renderer = renderer; - - const { ScriptableNodeResources } = TSL; - - ScriptableNodeResources.set( 'THREE', THREE ); - ScriptableNodeResources.set( 'TSL', TSL ); - - ScriptableNodeResources.set( 'scene', scene ); - ScriptableNodeResources.set( 'renderer', renderer ); - ScriptableNodeResources.set( 'composer', composer ); - - this.nodeClasses = []; - - this.canvas = canvas; - this.domElement = domElement; - - this._preview = false; - this._splitscreen = false; - - this.search = null; - - this.menu = null; - this.previewMenu = null; - - this.nodesContext = null; - this.examplesContext = null; - - this._initSplitview(); - this._initUpload(); - this._initTips(); - this._initMenu(); - this._initSearch(); - this._initNodesContext(); - this._initExamplesContext(); - this._initShortcuts(); - this._initParams(); - - } - - setSize( width, height ) { - - this.canvas.setSize( width, height ); - - return this; - - } - - centralizeNode( node ) { - - const canvas = this.canvas; - const nodeRect = node.dom.getBoundingClientRect(); - - node.setPosition( - ( ( canvas.width / 2 ) - canvas.scrollLeft ) - nodeRect.width, - ( ( canvas.height / 2 ) - canvas.scrollTop ) - nodeRect.height - ); - - return this; - - } - - add( node ) { - - const onRemove = () => { - - node.removeEventListener( 'remove', onRemove ); - - node.setEditor( null ); - - }; - - node.setEditor( this ); - node.addEventListener( 'remove', onRemove ); - - this.canvas.add( node ); - - this.dispatchEvent( { type: 'add', node } ); - - return this; - - } - - get nodes() { - - return this.canvas.nodes; - - } - - set preview( value ) { - - if ( this._preview === value ) return; - - if ( value ) { - - this._wasSplitscreen = this.splitscreen; - - this.splitscreen = false; - - this.menu.dom.remove(); - this.canvas.dom.remove(); - this.search.dom.remove(); - - this.domElement.append( this.previewMenu.dom ); - - } else { - - this.canvas.focusSelected = false; - - this.domElement.append( this.menu.dom ); - this.domElement.append( this.canvas.dom ); - this.domElement.append( this.search.dom ); - - this.previewMenu.dom.remove(); - - if ( this._wasSplitscreen == true ) { - - this.splitscreen = true; - - } - - } - - this._preview = value; - - } - - get preview() { - - return this._preview; - - } - - set splitscreen( value ) { - - if ( this._splitscreen === value ) return; - - this.splitview.setSplitview( value ); - - this._splitscreen = value; - - } - - get splitscreen() { - - return this._splitscreen; - - } - - newProject() { - - const canvas = this.canvas; - canvas.clear(); - canvas.scrollLeft = 0; - canvas.scrollTop = 0; - canvas.zoom = 1; - - this.dispatchEvent( { type: 'new' } ); - - } - - async loadURL( url ) { - - const loader = new Loader( Loader.OBJECTS ); - const json = await loader.load( url, ClassLib ); - - this.loadJSON( json ); - - } - - loadJSON( json ) { - - const canvas = this.canvas; - - canvas.clear(); - - canvas.deserialize( json ); - - for ( const node of canvas.nodes ) { - - this.add( node ); - - } - - this.dispatchEvent( { type: 'load' } ); - - } - - _initSplitview() { - - this.splitview = new SplitscreenManager( this ); - - } - - _initUpload() { - - const canvas = this.canvas; - - canvas.onDrop( () => { - - for ( const item of canvas.droppedItems ) { - - const { relativeClientX, relativeClientY } = canvas; - - const file = item.getAsFile(); - const reader = new FileReader(); - - reader.onload = () => { - - const fileEditor = new FileEditor( reader.result, file.name ); - - fileEditor.setPosition( - relativeClientX - ( fileEditor.getWidth() / 2 ), - relativeClientY - 20 - ); - - this.add( fileEditor ); - - }; - - reader.readAsArrayBuffer( file ); - - } - - } ); - - } - - _initTips() { - - this.tips = new Tips(); - - this.domElement.append( this.tips.dom ); - - } - - _initMenu() { - - const menu = new CircleMenu(); - const previewMenu = new CircleMenu(); - - menu.setAlign( 'top left' ); - previewMenu.setAlign( 'top left' ); - - const previewButton = new ButtonInput().setIcon( 'ti ti-brand-threejs' ).setToolTip( 'Preview' ); - const splitscreenButton = new ButtonInput().setIcon( 'ti ti-layout-sidebar-right-expand' ).setToolTip( 'Splitscreen' ); - const menuButton = new ButtonInput().setIcon( 'ti ti-apps' ).setToolTip( 'Add' ); - const examplesButton = new ButtonInput().setIcon( 'ti ti-file-symlink' ).setToolTip( 'Examples' ); - const newButton = new ButtonInput().setIcon( 'ti ti-file' ).setToolTip( 'New' ); - const openButton = new ButtonInput().setIcon( 'ti ti-upload' ).setToolTip( 'Open' ); - const saveButton = new ButtonInput().setIcon( 'ti ti-download' ).setToolTip( 'Save' ); - - const editorButton = new ButtonInput().setIcon( 'ti ti-subtask' ).setToolTip( 'Editor' ); - - previewButton.onClick( () => this.preview = true ); - editorButton.onClick( () => this.preview = false ); - - splitscreenButton.onClick( () => { - - this.splitscreen = ! this.splitscreen; - splitscreenButton.setIcon( this.splitscreen ? 'ti ti-layout-sidebar-right-collapse' : 'ti ti-layout-sidebar-right-expand' ); - - } ); - - menuButton.onClick( () => this.nodesContext.open() ); - examplesButton.onClick( () => this.examplesContext.open() ); - - newButton.onClick( () => { - - if ( confirm( 'Are you sure?' ) === true ) { - - this.newProject(); - - } - - } ); - - openButton.onClick( () => { - - const input = document.createElement( 'input' ); - input.type = 'file'; - - input.onchange = e => { - - const file = e.target.files[ 0 ]; - - const reader = new FileReader(); - reader.readAsText( file, 'UTF-8' ); - - reader.onload = readerEvent => { - - const loader = new Loader( Loader.OBJECTS ); - const json = loader.parse( JSON.parse( readerEvent.target.result ), ClassLib ); - - this.loadJSON( json ); - - }; - - }; - - input.click(); - - } ); - - saveButton.onClick( () => { - - exportJSON( this.canvas.toJSON(), 'node_editor' ); - - } ); - - menu.add( previewButton ) - .add( splitscreenButton ) - .add( newButton ) - .add( examplesButton ) - .add( openButton ) - .add( saveButton ) - .add( menuButton ); - - previewMenu.add( editorButton ); - - this.domElement.appendChild( menu.dom ); - - this.menu = menu; - this.previewMenu = previewMenu; - - } - - _initExamplesContext() { - - const context = new ContextMenu(); - - //**************// - // MAIN - //**************// - - const onClickExample = async ( button ) => { - - this.examplesContext.hide(); - - const filename = button.getExtra(); - - this.loadURL( `./examples/${filename}.json` ); - - }; - - const addExamples = ( category, names ) => { - - const subContext = new ContextMenu(); - - for ( const name of names ) { - - const filename = name.replaceAll( ' ', '-' ).toLowerCase(); - - subContext.add( new ButtonInput( name ) - .setIcon( 'ti ti-file-symlink' ) - .onClick( onClickExample ) - .setExtra( category.toLowerCase() + '/' + filename ) - ); - - } - - context.add( new ButtonInput( category ), subContext ); - - return subContext; - - }; - - //**************// - // EXAMPLES - //**************// - - addExamples( 'Basic', [ - 'Teapot', - 'Matcap', - 'Fresnel', - 'Particles' - ] ); - - this.examplesContext = context; - - } - - _initShortcuts() { - - document.addEventListener( 'keydown', ( e ) => { - - if ( e.target === document.body ) { - - const key = e.key; - - if ( key === 'Tab' ) { - - this.search.inputDOM.focus(); - - e.preventDefault(); - e.stopImmediatePropagation(); - - } else if ( key === ' ' ) { - - this.preview = ! this.preview; - - } else if ( key === 'Delete' ) { - - if ( this.canvas.selected ) this.canvas.selected.dispose(); - - } else if ( key === 'Escape' ) { - - this.canvas.select( null ); - - } - - } - - } ); - - } - - _initParams() { - - const urlParams = new URLSearchParams( window.location.search ); - - const example = urlParams.get( 'example' ) || 'basic/teapot'; - - this.loadURL( `./examples/${example}.json` ); - - } - - addClass( nodeData ) { - - this.removeClass( nodeData ); - - this.nodeClasses.push( nodeData ); - - ClassLib[ nodeData.name ] = nodeData.nodeClass; - - return this; - - } - - removeClass( nodeData ) { - - const index = this.nodeClasses.indexOf( nodeData ); - - if ( index !== - 1 ) { - - this.nodeClasses.splice( index, 1 ); - - delete ClassLib[ nodeData.name ]; - - } - - return this; - - } - - _initSearch() { - - const traverseNodeEditors = ( item ) => { - - if ( item.children ) { - - for ( const subItem of item.children ) { - - traverseNodeEditors( subItem ); - - } - - } else { - - const button = new ButtonInput( item.name ); - button.setIcon( `ti ti-${item.icon}` ); - button.addEventListener( 'complete', async () => { - - const nodeClass = await getNodeEditorClass( item ); - - const node = new nodeClass(); - - this.add( node ); - - this.centralizeNode( node ); - this.canvas.select( node ); - - } ); - - search.add( button ); - - if ( item.tags !== undefined ) { - - search.setTag( button, item.tags ); - - } - - } - - - - }; - - const search = new Search(); - search.forceAutoComplete = true; - - search.onFilter( async () => { - - search.clear(); - - const nodeList = await getNodeList(); - - for ( const item of nodeList.nodes ) { - - traverseNodeEditors( item ); - - } - - for ( const item of this.nodeClasses ) { - - traverseNodeEditors( item ); - - } - - } ); - - search.onSubmit( () => { - - if ( search.currentFiltered !== null ) { - - search.currentFiltered.button.dispatchEvent( new Event( 'complete' ) ); - - } - - } ); - - this.search = search; - - this.domElement.append( search.dom ); - - } - - async _initNodesContext() { - - const context = new ContextMenu( this.canvas.canvas ).setWidth( 300 ); - - let isContext = false; - const contextPosition = {}; - - const add = ( node ) => { - - context.hide(); - - this.add( node ); - - if ( isContext ) { - - node.setPosition( - Math.round( contextPosition.x ), - Math.round( contextPosition.y ) - ); - - } else { - - this.centralizeNode( node ); - - } - - this.canvas.select( node ); - - isContext = false; - - }; - - context.onContext( () => { - - isContext = true; - - const { relativeClientX, relativeClientY } = this.canvas; - - contextPosition.x = Math.round( relativeClientX ); - contextPosition.y = Math.round( relativeClientY ); - - } ); - - context.addEventListener( 'show', () => { - - reset(); - focus(); - - } ); - - //**************// - // INPUTS - //**************// - - const nodeButtons = []; - - let nodeButtonsVisible = []; - let nodeButtonsIndex = - 1; - - const focus = () => requestAnimationFrame( () => search.inputDOM.focus() ); - const reset = () => { - - search.setValue( '', false ); - - for ( const button of nodeButtons ) { - - button.setOpened( false ).setVisible( true ).setSelected( false ); - - } - - }; - - const node = new Node(); - context.add( node ); - - const search = new StringInput().setPlaceHolder( 'Search...' ).setIcon( 'ti ti-list-search' ); - - search.inputDOM.addEventListener( 'keydown', e => { - - const key = e.key; - - if ( key === 'ArrowDown' ) { - - const previous = nodeButtonsVisible[ nodeButtonsIndex ]; - if ( previous ) previous.setSelected( false ); - - const current = nodeButtonsVisible[ nodeButtonsIndex = ( nodeButtonsIndex + 1 ) % nodeButtonsVisible.length ]; - if ( current ) current.setSelected( true ); - - e.preventDefault(); - e.stopImmediatePropagation(); - - } else if ( key === 'ArrowUp' ) { - - const previous = nodeButtonsVisible[ nodeButtonsIndex ]; - if ( previous ) previous.setSelected( false ); - - const current = nodeButtonsVisible[ nodeButtonsIndex > 0 ? -- nodeButtonsIndex : ( nodeButtonsIndex = nodeButtonsVisible.length - 1 ) ]; - if ( current ) current.setSelected( true ); - - e.preventDefault(); - e.stopImmediatePropagation(); - - } else if ( key === 'Enter' ) { - - if ( nodeButtonsVisible[ nodeButtonsIndex ] !== undefined ) { - - nodeButtonsVisible[ nodeButtonsIndex ].dom.click(); - - } else { - - context.hide(); - - } - - e.preventDefault(); - e.stopImmediatePropagation(); - - } else if ( key === 'Escape' ) { - - context.hide(); - - } - - } ); - - search.onChange( () => { - - const value = search.getValue().toLowerCase(); - - if ( value.length === 0 ) return reset(); - - nodeButtonsVisible = []; - nodeButtonsIndex = 0; - - for ( const button of nodeButtons ) { - - const buttonLabel = button.getLabel().toLowerCase(); - - button.setVisible( false ).setSelected( false ); - - const visible = buttonLabel.indexOf( value ) !== - 1; - - if ( visible && button.children.length === 0 ) { - - nodeButtonsVisible.push( button ); - - } - - } - - for ( const button of nodeButtonsVisible ) { - - let parent = button; - - while ( parent !== null ) { - - parent.setOpened( true ).setVisible( true ); - - parent = parent.parent; - - } - - } - - if ( nodeButtonsVisible[ nodeButtonsIndex ] !== undefined ) { - - nodeButtonsVisible[ nodeButtonsIndex ].setSelected( true ); - - } - - } ); - - const treeView = new TreeViewInput(); - node.add( new Element().setHeight( 30 ).add( search ) ); - node.add( new Element().setHeight( 200 ).add( treeView ) ); - - const addNodeEditorElement = ( nodeData ) => { - - const button = new TreeViewNode( nodeData.name ); - button.setIcon( `ti ti-${nodeData.icon}` ); - - if ( nodeData.children === undefined ) { - - button.isNodeClass = true; - button.onClick( async () => { - - const nodeClass = await getNodeEditorClass( nodeData ); - - add( new nodeClass() ); - - } ); - - } - - if ( nodeData.tip ) { - - //button.setToolTip( item.tip ); - - } - - nodeButtons.push( button ); - - if ( nodeData.children ) { - - for ( const subItem of nodeData.children ) { - - const subButton = addNodeEditorElement( subItem ); - - button.add( subButton ); - - } - - } - - return button; - - }; - - // - - const nodeList = await getNodeList(); - - for ( const node of nodeList.nodes ) { - - const button = addNodeEditorElement( node ); - - treeView.add( button ); - - } - - this.nodesContext = context; - - } - -} diff --git a/playground/NodeEditorLib.js b/playground/NodeEditorLib.js deleted file mode 100644 index 3e56949936a89e..00000000000000 --- a/playground/NodeEditorLib.js +++ /dev/null @@ -1,177 +0,0 @@ -import { NodePrototypeEditor } from './editors/NodePrototypeEditor.js'; -import { ScriptableEditor } from './editors/ScriptableEditor.js'; -import { BasicMaterialEditor } from './editors/BasicMaterialEditor.js'; -import { StandardMaterialEditor } from './editors/StandardMaterialEditor.js'; -import { PointsMaterialEditor } from './editors/PointsMaterialEditor.js'; -import { FloatEditor } from './editors/FloatEditor.js'; -import { Vector2Editor } from './editors/Vector2Editor.js'; -import { Vector3Editor } from './editors/Vector3Editor.js'; -import { Vector4Editor } from './editors/Vector4Editor.js'; -import { SliderEditor } from './editors/SliderEditor.js'; -import { ColorEditor } from './editors/ColorEditor.js'; -import { TextureEditor } from './editors/TextureEditor.js'; -import { UVEditor } from './editors/UVEditor.js'; -import { PreviewEditor } from './editors/PreviewEditor.js'; -import { TimerEditor } from './editors/TimerEditor.js'; -import { SplitEditor } from './editors/SplitEditor.js'; -import { SwizzleEditor } from './editors/SwizzleEditor.js'; -import { JoinEditor } from './editors/JoinEditor.js'; -import { StringEditor } from './editors/StringEditor.js'; -import { FileEditor } from './editors/FileEditor.js'; -import { CustomNodeEditor } from './editors/CustomNodeEditor.js'; - -export const ClassLib = { - BasicMaterialEditor, - StandardMaterialEditor, - PointsMaterialEditor, - FloatEditor, - Vector2Editor, - Vector3Editor, - Vector4Editor, - SliderEditor, - ColorEditor, - TextureEditor, - UVEditor, - TimerEditor, - SplitEditor, - SwizzleEditor, - JoinEditor, - StringEditor, - FileEditor, - ScriptableEditor, - PreviewEditor, - NodePrototypeEditor -}; - -let nodeList = null; -let nodeListLoading = false; - -export const getNodeList = async () => { - - if ( nodeList === null ) { - - if ( nodeListLoading === false ) { - - nodeListLoading = true; - - const response = await fetch( './Nodes.json' ); - nodeList = await response.json(); - - } else { - - await new Promise( res => { - - const verifyNodeList = () => { - - if ( nodeList !== null ) { - - res(); - - } else { - - window.requestAnimationFrame( verifyNodeList ); - - } - - }; - - verifyNodeList(); - - } ); - - } - - } - - return nodeList; - -}; - -export const init = async () => { - - const nodeList = await getNodeList(); - - const traverseNodeEditors = ( list ) => { - - for ( const node of list ) { - - getNodeEditorClass( node ); - - if ( Array.isArray( node.children ) ) { - - traverseNodeEditors( node.children ); - - } - - } - - }; - - traverseNodeEditors( nodeList.nodes ); - -}; - -export const getNodeEditorClass = async ( nodeData ) => { - - const editorClass = nodeData.editorClass || nodeData.name.replace( / /g, '' ); - - // - - let nodeClass = nodeData.nodeClass || ClassLib[ editorClass ]; - - if ( nodeClass !== undefined ) { - - if ( nodeData.editorClass !== undefined ) { - - nodeClass.prototype.icon = nodeData.icon; - - } - - return nodeClass; - - } - - // - - if ( nodeData.editorURL ) { - - const moduleEditor = await import( nodeData.editorURL ); - const moduleName = nodeData.editorClass || Object.keys( moduleEditor )[ 0 ]; - - nodeClass = moduleEditor[ moduleName ]; - - } else if ( nodeData.shaderNode ) { - - const createNodeEditorClass = ( nodeData ) => { - - return class extends CustomNodeEditor { - - constructor() { - - super( nodeData ); - - } - - get className() { - - return editorClass; - - } - - }; - - }; - - nodeClass = createNodeEditorClass( nodeData ); - - } - - if ( nodeClass !== null ) { - - ClassLib[ editorClass ] = nodeClass; - - } - - return nodeClass; - -}; diff --git a/playground/NodeEditorUtils.js b/playground/NodeEditorUtils.js deleted file mode 100644 index a09f2fda2f7bdc..00000000000000 --- a/playground/NodeEditorUtils.js +++ /dev/null @@ -1,398 +0,0 @@ -import { StringInput, NumberInput, ColorInput, Element, LabelElement } from 'flow'; -import { string, float, vec2, vec3, vec4, color } from 'three/tsl'; -import { Color } from 'three'; -import { setInputAestheticsFromType, setOutputAestheticsFromType } from './DataTypeLib.js'; - -export function exportJSON( object, name ) { - - const json = JSON.stringify( object ); - - const a = document.createElement( 'a' ); - const file = new Blob( [ json ], { type: 'text/plain' } ); - - a.href = URL.createObjectURL( file ); - a.download = name + '.json'; - a.click(); - -} - -export function disposeScene( scene ) { - - scene.traverse( object => { - - if ( ! object.isMesh ) return; - - object.geometry.dispose(); - - if ( object.material.isMaterial ) { - - disposeMaterial( object.material ); - - } else { - - for ( const material of object.material ) { - - disposeMaterial( material ); - - } - - } - - } ); - -} - -export function resetScene( scene ) { - - if ( scene.environment !== null ) { - - scene.environment.dispose(); - scene.environment = null; - - } - - if ( scene.background !== null ) { - - if ( scene.background.isTexture ) scene.background.dispose(); - - } - - scene.background = new Color( 0x333333 ); - -} - -export function disposeMaterial( material ) { - - material.dispose(); - - for ( const key of Object.keys( material ) ) { - - const value = material[ key ]; - - if ( value && typeof value === 'object' && typeof value.dispose === 'function' ) { - - value.dispose(); - - } - - } - -} - -export const createColorInput = ( node, element ) => { - - const input = new ColorInput().onChange( () => { - - node.value.setHex( input.getValue() ); - - element.dispatchEvent( new Event( 'changeInput' ) ); - - } ); - - element.add( input ); - -}; - -export const createFloatInput = ( node, element ) => { - - const input = new NumberInput().onChange( () => { - - node.value = input.getValue(); - - element.dispatchEvent( new Event( 'changeInput' ) ); - - } ); - - element.add( input ); - -}; - -export const createStringInput = ( node, element, settings = {} ) => { - - const input = new StringInput().onChange( () => { - - let value = input.getValue(); - - if ( settings.transform === 'lowercase' ) value = value.toLowerCase(); - else if ( settings.transform === 'uppercase' ) value = value.toUpperCase(); - - node.value = value; - - element.dispatchEvent( new Event( 'changeInput' ) ); - - } ); - - element.add( input ); - - if ( settings.options ) { - - for ( const option of settings.options ) { - - input.addOption( option ); - - } - - } - - const field = input.getInput(); - - if ( settings.allows ) field.addEventListener( 'input', () => field.value = field.value.replace( new RegExp( '[^\\s' + settings.allows + ']', 'gi' ), '' ) ); - if ( settings.maxLength ) field.maxLength = settings.maxLength; - if ( settings.transform ) field.style[ 'text-transform' ] = settings.transform; - -}; - -export const createVector2Input = ( node, element ) => { - - const onUpdate = () => { - - node.value.x = fieldX.getValue(); - node.value.y = fieldY.getValue(); - - element.dispatchEvent( new Event( 'changeInput' ) ); - - }; - - const fieldX = new NumberInput().setTagColor( 'red' ).onChange( onUpdate ); - const fieldY = new NumberInput().setTagColor( 'green' ).onChange( onUpdate ); - - element.add( fieldX ).add( fieldY ); - -}; - -export const createVector3Input = ( node, element ) => { - - const onUpdate = () => { - - node.value.x = fieldX.getValue(); - node.value.y = fieldY.getValue(); - node.value.z = fieldZ.getValue(); - - element.dispatchEvent( new Event( 'changeInput' ) ); - - }; - - const fieldX = new NumberInput().setTagColor( 'red' ).onChange( onUpdate ); - const fieldY = new NumberInput().setTagColor( 'green' ).onChange( onUpdate ); - const fieldZ = new NumberInput().setTagColor( 'blue' ).onChange( onUpdate ); - - element.add( fieldX ).add( fieldY ).add( fieldZ ); - -}; - -export const createVector4Input = ( node, element ) => { - - const onUpdate = () => { - - node.value.x = fieldX.getValue(); - node.value.y = fieldY.getValue(); - node.value.z = fieldZ.getValue(); - node.value.w = fieldZ.getValue(); - - element.dispatchEvent( new Event( 'changeInput' ) ); - - }; - - const fieldX = new NumberInput().setTagColor( 'red' ).onChange( onUpdate ); - const fieldY = new NumberInput().setTagColor( 'green' ).onChange( onUpdate ); - const fieldZ = new NumberInput().setTagColor( 'blue' ).onChange( onUpdate ); - const fieldW = new NumberInput( 1 ).setTagColor( 'white' ).onChange( onUpdate ); - - element.add( fieldX ).add( fieldY ).add( fieldZ ).add( fieldW ); - -}; - - -export const createInputLib = { - // gpu - string: createStringInput, - float: createFloatInput, - vec2: createVector2Input, - vec3: createVector3Input, - vec4: createVector4Input, - color: createColorInput, - // cpu - Number: createFloatInput, - String: createStringInput, - Vector2: createVector2Input, - Vector3: createVector3Input, - Vector4: createVector4Input, - Color: createColorInput -}; - -export const inputNodeLib = { - // gpu - string, - float, - vec2, - vec3, - vec4, - color, - // cpu - Number: float, - String: string, - Vector2: vec2, - Vector3: vec3, - Vector4: vec4, - Color: color -}; - -export function createElementFromJSON( json ) { - - const { inputType, outputType, nullable } = json; - - const id = json.id || json.name; - const element = json.name ? new LabelElement( json.name ) : new Element(); - const field = nullable !== true && json.field !== false; - - // - - let inputNode = null; - - if ( nullable !== true && inputNodeLib[ inputType ] !== undefined ) { - - inputNode = inputNodeLib[ inputType ](); - - } - - element.value = inputNode; - - // - - if ( json.height ) element.setHeight( json.height ); - - if ( inputType ) { - - if ( field && createInputLib[ inputType ] ) { - - createInputLib[ inputType ]( inputNode, element, json ); - - } - - element.onConnect( () => { - - const externalNode = element.getLinkedObject(); - - element.setEnabledInputs( externalNode === null ); - - element.value = externalNode || inputNode; - - } ); - - } - - // - - if ( inputType && json.inputConnection !== false ) { - - setInputAestheticsFromType( element, inputType ); - //element.setInputStyle( 'dotted' ); // 'border-style: dotted;' - - element.onValid( onValidType( inputType ) ); - - } - - if ( outputType ) { - - setOutputAestheticsFromType( element, outputType ); - //element.setInputStyle( 'dotted' ); // 'border-style: dotted;' - - } - - return { id, element, inputNode, inputType, outputType }; - -} - -export function isGPUNode( object ) { - - return object && object.isNode === true && object.isCodeNode !== true && object.nodeType !== 'string' && object.nodeType !== 'ArrayBuffer'; - -} - -export function isValidTypeToType( sourceType, targetType ) { - - if ( sourceType === targetType ) return true; - - return false; - -} - -export const onValidNode = onValidType(); - -export function onValidType( types = 'node', node = null ) { - - return ( source, target, stage ) => { - - const targetObject = target.getObject(); - - if ( targetObject ) { - - for ( const type of types.split( '|' ) ) { - - let object = targetObject; - - if ( object.isScriptableValueNode ) { - - if ( object.outputType ) { - - if ( isValidTypeToType( object.outputType, type ) ) { - - return true; - - } - - } - - object = object.value; - - } - - if ( object === null || object === undefined ) continue; - - let isValid = false; - - if ( type === 'any' ) { - - isValid = true; - - } else if ( type === 'node' ) { - - isValid = isGPUNode( object ); - - } else if ( type === 'string' || type === 'String' ) { - - isValid = object.nodeType === 'string'; - - } else if ( type === 'Number' ) { - - isValid = object.isInputNode && typeof object.value === 'number'; - - } else if ( type === 'URL' ) { - - isValid = object.nodeType === 'string' || object.nodeType === 'ArrayBuffer'; - - } else if ( object[ 'is' + type ] === true ) { - - isValid = true; - - } - - if ( isValid ) return true; - - } - - if ( node !== null && stage === 'dragged' ) { - - const name = target.node.getName(); - - node.editor.tips.error( `"${name}" is not a "${types}".` ); - - } - - return false; - - } - - }; - -} diff --git a/playground/Nodes.json b/playground/Nodes.json deleted file mode 100644 index a9f42c6558dc65..00000000000000 --- a/playground/Nodes.json +++ /dev/null @@ -1,2025 +0,0 @@ -{ - "nodes": [ - { - "name": "Inputs", - "icon": "stack-push", - "children": [ - { - "name": "Primitives", - "icon": "forms", - "children": [ - { - "name": "Color", - "icon": "palette", - "editorClass": "ColorEditor" - }, - { - "name": "Float", - "icon": "box-multiple-1", - "editorClass": "FloatEditor" - }, - { - "name": "Slider", - "icon": "adjustments-horizontal", - "editorClass": "SliderEditor" - }, - { - "name": "String", - "icon": "forms", - "editorClass": "StringEditor" - }, - { - "name": "Texture", - "icon": "photo", - "editorClass": "TextureEditor" - }, - { - "name": "Vector 2", - "icon": "box-multiple-2", - "editorClass": "Vector2Editor" - }, - { - "name": "Vector 3", - "icon": "box-multiple-3", - "editorClass": "Vector3Editor" - }, - { - "name": "Vector 4", - "icon": "box-multiple-4", - "editorClass": "Vector4Editor" - } - ] - }, - { - "name": "Camera", - "icon": "video", - "children": [ - { - "name": "Camera Normal Matrix", - "icon": "video", - "nodeType": "mat3", - "shaderNode": "cameraNormalMatrix" - }, - { - "name": "Camera Position", - "icon": "video", - "description": "Returns the global transform of the camera.", - "nodeType": "vec3", - "shaderNode": "cameraPosition" - }, - { - "name": "Camera Projection Matrix", - "icon": "video", - "nodeType": "mat4", - "description": "Returns the matrix which contains the projection.", - "shaderNode": "cameraProjectionMatrix" - }, - { - "name": "Camera View Matrix", - "icon": "video", - "nodeType": "mat4", - "shaderNode": "cameraViewMatrix" - }, - { - "name": "Camera World Matrix", - "icon": "video", - "description": "Returns the global transform of the camera.", - "nodeType": "mat4", - "shaderNode": "cameraWorldMatrix" - } - ] - }, - { - "name": "Normal", - "icon": "arrow-bar-up", - "children": [ - { - "name": "Normal Geometry", - "icon": "arrow-bar-up", - "description": "Return the normal vector from the coordinate space Geometry.", - "nodeType": "vec3", - "shaderNode": "normalGeometry" - }, - { - "name": "Normal Local", - "icon": "arrow-bar-up", - "description": "Return the normal vector from the coordinate space Local.", - "nodeType": "vec3", - "shaderNode": "normalLocal" - }, - { - "name": "Normal View", - "icon": "arrow-bar-up", - "description": "Return the normal vector from the coordinate space View.", - "nodeType": "vec3", - "shaderNode": "normalView" - }, - { - "name": "Normal World", - "icon": "arrow-bar-up", - "description": "Return the normal vector from the coordinate space World.", - "nodeType": "vec3", - "shaderNode": "normalWorld" - }, - { - "name": "Transformed Normal View", - "icon": "arrow-bar-up", - "nodeType": "vec3", - "shaderNode": "transformedNormalView" - }, - { - "name": "Transformed Normal World", - "icon": "arrow-bar-up", - "nodeType": "vec3", - "shaderNode": "transformedNormalWorld" - } - ] - }, - { - "name": "Tangent", - "icon": "arrows-up-right", - "children": [ - { - "name": "Tangent Geometry", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "tangentGeometry" - }, - { - "name": "Tangent Local", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "tangentLocal" - }, - { - "name": "Tangent View", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "tangentView" - }, - { - "name": "Tangent World", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "tangentWorld" - }, - { - "name": "Transformed Tangent View", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "transformedTangentView" - }, - { - "name": "Transformed Tangent World", - "icon": "arrows-up-right", - "nodeType": "vec3", - "shaderNode": "transformedTangentWorld" - } - ] - }, - { - "name": "Bitangent", - "icon": "arrows-up-left", - "children": [ - { - "name": "Bitangent Geometry", - "icon": "arrows-up-left", - "nodeType": "vec3", - "shaderNode": "bitangentGeometry" - }, - { - "name": "Bitangent Local", - "icon": "arrows-up-left", - "nodeType": "vec3", - "shaderNode": "bitangentLocal" - }, - { - "name": "Bitangent View", - "icon": "arrow-up-left", - "nodeType": "vec3", - "shaderNode": "bitangentView" - }, - { - "name": "Bitangent World", - "icon": "arrows-up-left", - "nodeType": "vec3", - "shaderNode": "bitangentWorld" - }, - { - "name": "Transformed Bitangent View", - "icon": "arrows-up-left", - "nodeType": "vec3", - "shaderNode": "transformedBitangentView" - }, - { - "name": "Transformed Bitangent World", - "icon": "arrows-up-left", - "nodeType": "vec3", - "shaderNode": "transformedBitangentWorld" - } - ] - }, - { - "name": "Model", - "icon": "box", - "children": [ - { - "name": "Model Direction", - "icon": "box", - "nodeType": "vec3", - "shaderNode": "modelDirection" - }, - { - "name": "Model Normal Matrix", - "icon": "box", - "nodeType": "mat3", - "shaderNode": "modelNormalMatrix" - }, - { - "name": "Model Position", - "icon": "box", - "nodeType": "vec3", - "shaderNode": "modelPosition" - }, - { - "name": "Model View Matrix", - "icon": "box", - "nodeType": "mat4", - "shaderNode": "modelViewMatrix" - }, - { - "name": "Model View Position", - "icon": "box", - "nodeType": "vec3", - "shaderNode": "modelViewPosition" - }, - { - "name": "Model World Matrix", - "icon": "box", - "nodeType": "mat4", - "shaderNode": "modelWorldMatrix" - } - ] - }, - { - "name": "Object", - "icon": "3d-cube-sphere", - "children": [ - { - "name": "Object Direction", - "icon": "3d-cube-sphere", - "shaderNode": "objectDirection", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - }, - { - "name": "Object Normal Matrix", - "icon": "3d-cube-sphere", - "shaderNode": "objectNormalMatrix", - "nodeType": "mat3", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - }, - { - "name": "Object Position", - "icon": "3d-cube-sphere", - "shaderNode": "objectPosition", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - }, - { - "name": "Object View Matrix", - "icon": "3d-cube-sphere", - "shaderNode": "objectViewMatrix", - "nodeType": "mat4", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - }, - { - "name": "Object View Position", - "icon": "3d-cube-sphere", - "shaderNode": "objectViewPosition", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - }, - { - "name": "Object World Matrix", - "icon": "3d-cube-sphere", - "shaderNode": "objectWorldMatrix", - "properties": [ - { - "name": "object3d", - "nodeType": "Object3D" - } - ] - } - ] - }, - { - "name": "Position", - "icon": "gizmo", - "children": [ - { - "name": "Position Geometry", - "icon": "gizmo", - "nodeType": "vec3", - "shaderNode": "positionGeometry" - }, - { - "name": "Position Local", - "icon": "gizmo", - "nodeType": "mat4", - "shaderNode": "positionLocal" - }, - { - "name": "Position View", - "icon": "gizmo", - "nodeType": "vec3", - "shaderNode": "positionView" - }, - { - "name": "Position View Direction", - "icon": "gizmo", - "nodeType": "vec3", - "shaderNode": "positionViewDirection" - }, - { - "name": "Position World", - "icon": "gizmo", - "nodeType": "mat3", - "shaderNode": "positionWorld" - }, - { - "name": "Position World Direction", - "icon": "gizmo", - "nodeType": "mat4", - "shaderNode": "positionWorldDirection" - } - ] - }, - { - "name": "Viewport", - "icon": "device-desktop", - "children": [ - { - "name": "Viewport Bottom Left", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportBottomLeft" - }, - { - "name": "Viewport Bottom Right", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportBottomRight" - }, - { - "name": "Viewport Coordinate", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportCoordinate" - }, - { - "name": "Viewport Resolution", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportResolution" - }, - { - "name": "Viewport Top Left", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportTopLeft" - }, - { - "name": "Viewport Top Right", - "icon": "device-desktop", - "nodeType": "vec3", - "shaderNode": "viewportTopRight" - } - ] - }, - { - "name": "UV", - "icon": "chart-treemap", - "children": [ - { - "name": "UV", - "icon": "chart-treemap", - "nodeType": "vec2", - "editorClass": "UVEditor" - }, - { - "name": "Matcap UV", - "icon": "chart-treemap", - "nodeType": "vec1", - "shaderNode": "matcapUV" - }, - { - "name": "Point UV", - "icon": "chart-treemap", - "nodeType": "vec1", - "shaderNode": "pointUV" - } - ] - }, - { - "name": "Geometry", - "icon": "world", - "children": [ - { - "name": "Attribute", - "icon": "book-upload", - "shaderNode": "attribute", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - } - ] - }, - { - "name": "Face Direction", - "icon": "brightness", - "nodeType": "float", - "shaderNode": "faceDirection" - }, - { - "name": "Front Facing", - "icon": "brightness", - "shaderNode": "frontFacing", - "nodeType": "bool" - }, - { - "name": "Geometry Color", - "icon": "palette", - "shaderNode": "geometryColor", - "nodeType": "color" - } - ] - } - ] - }, - { - "name": "Math", - "icon": "calculator", - "children": [ - { - "name": "Arithmetic Operators", - "icon": "math-symbols", - "children": [ - { - "name": "Addition", - "icon": "plus", - "description": "Addition operator.", - "shaderNode": "add", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Division", - "icon": "divide", - "description": "Division operator.", - "shaderNode": "div", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Multiply", - "icon": "x", - "tags": "tag1,tag2", - "description": "Multiply operator.", - "shaderNode": "mul", - "nodeType": "node", - "renderers": "WebGPU", - "properties": [ - { - "name": "aNode", - "nodeType": "float" - }, - { - "name": "bNode", - "nodeType": "float" - } - ] - }, - { - "name": "Power", - "icon": "arrow-up-right", - "description": "Exponentiation operator.", - "shaderNode": "pow", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Remainder", - "icon": "percentage", - "description": "Remainder operator.", - "shaderNode": "remainder", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Subtraction", - "icon": "minus", - "description": "Subtraction operator.", - "shaderNode": "sub", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - } - ] - }, - { - "name": "Logic Operators", - "icon": "math-symbols", - "children": [ - { - "name": "Less Than", - "icon": "math-lower", - "description": "Less than operator..", - "shaderNode": "lessThan", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Less Than Or Equal", - "icon": "math-equal-lower", - "description": "Less than or equal operator.", - "shaderNode": "lessThanEqual", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Greater Than", - "icon": "math-greater", - "description": "Greater than operator.", - "shaderNode": "greaterThan", - "nodeType": "bool", - "renderers": "WebGPU", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Greater Than Or Equal", - "icon": "math-equal-greater", - "description": "Greater than or equal operator.", - "shaderNode": "greaterThanEqual", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Equality", - "icon": "equal-double", - "description": "Equality operator.", - "shaderNode": "equal", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Inequality", - "icon": "equal-not", - "description": "Inequality operator.", - "shaderNode": "notEqual", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "And", - "icon": "ampersand", - "description": "Logical AND operator.", - "shaderNode": "and", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Or", - "icon": "switch-horizontal", - "description": "Logical OR operator.", - "shaderNode": "or", - "nodeType": "bool", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Conditional", - "icon": "arrows-split", - "description": "Logical OR operator.", - "shaderNode": "Conditional", - "nodeType": "bool", - "properties": [ - { - "name": "condNode", - "nodeType": "node" - }, - { - "name": "ifNode", - "nodeType": "node" - }, - { - "name": "elseNode", - "nodeType": "node" - } - ] - } - ] - }, - { - "name": "Bitwise Operators", - "icon": "math-symbols", - "children": [ - { - "name": "Bitwise AND", - "icon": "binary", - "description": "Bitwise AND operator.", - "shaderNode": "bitAnd", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Bitwise OR", - "icon": "binary", - "description": "Bitwise OR operator.", - "shaderNode": "bitOr", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Bitwise XOR", - "icon": "binary", - "description": "Bitwise XOR operator.", - "shaderNode": "bitXor", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Shift left", - "icon": "binary", - "description": "Bitwise left shift operator.", - "shaderNode": "shiftLeft", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "Shift right", - "icon": "binary", - "description": "Bitwise right shift operator.", - "shaderNode": "shiftRight", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - }, - { - "name": "XOR", - "icon": "binary", - "description": "Bitwise XOR operator.", - "shaderNode": "xor", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - }, - { - "name": "bNode", - "nodeType": "node" - } - ] - } - ] - }, - { - "name": "Functions", - "icon": "math-function", - "children": [ - { - "name": "Abs", - "icon": "math-function", - "description": "Returns the absolute value of x.", - "shaderNode": "abs", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value of which to return the absolute." - } - ] - }, - { - "name": "Acos", - "icon": "math-function", - "description": "Returns the angle whose trigonometric cosine is x.", - "shaderNode": "acos", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value whose arccosine to return." - } - ] - }, - { - "name": "Asin", - "icon": "math-function", - "description": "Returns the angle whose trigonometric sine is X.", - "shaderNode": "asin", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value whose arcsine to return." - } - ] - }, - { - "name": "Atan", - "icon": "math-function", - "description": "Returns either the angle whose trigonometric arctangent is yx or y_over_x, depending on which overload is invoked. In the first overload, the signs of y and x are used to determine the quadrant that the angle lies in.", - "shaderNode": "atan", - "nodeType": "node", - "properties": [ - { - "name": "aSNode", - "nodeType": "node", - "label": "y_over_x", - "description": "Specify the fraction whose arctangent to return." - } - ] - }, - { - "name": "Atan2", - "icon": "math-function", - "description": "Return the arc-tangent of the parameters", - "shaderNode": "atan2", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "y", - "description": "Specify the numerator of the fraction whose arctangent to return." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "x", - "description": "Specify the denominator of the fraction whose arctangent to return." - } - ] - }, - { - "name": "Ceil", - "icon": "math-function", - "description": "Returns a value equal to the nearest integer that is greater than or equal to x.", - "shaderNode": "ceil", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to evaluate." - } - ] - }, - { - "name": "Clamp", - "icon": "math-function", - "description": "Constrain a value to lie between two further values", - "shaderNode": "clamp", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to constrain." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "minVal", - "description": "Specify the lower end of the range into which to constrain." - }, - { - "name": "cNode", - "nodeType": "node", - "label": "maxVal", - "description": "Specify the upper end of the range into which to constrain." - } - ] - }, - { - "name": "Cosine", - "icon": "math-function", - "description": "Returns the trigonometric cosine of angle.", - "shaderNode": "cos", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "angle", - "description": "Specify the quantity, in radians, of which to return the cosine." - } - ] - }, - { - "name": "Cross", - "icon": "math-function", - "description": "Calculate the cross product of two vectors", - "shaderNode": "cross", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specifies the first of two points." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specifies the second of two points." - } - ] - }, - { - "name": "Degrees", - "icon": "math-function", - "description": "Converts a quantity specified in radians into degrees.", - "shaderNode": "degrees", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "radians", - "description": "Specify the quantity, in radians, to be converted to degrees." - } - ] - }, - { - "name": "Distance", - "icon": "math-function", - "description": "Calculate the distance between two points", - "shaderNode": "distance", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "p0", - "description": "Specifies the first of two points." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "p1", - "description": "Specifies the second of two points." - } - ] - }, - { - "name": "Dot", - "icon": "math-function", - "description": "Calculate the dot product of two vectors", - "shaderNode": "dot", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specifies the first of two points." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specifies the second of two points." - } - ] - }, - { - "name": "Exp", - "icon": "math-function", - "description": "Returns the natural exponentiation of x. i.e., ex.", - "shaderNode": "exp", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to exponentiate." - } - ] - }, - { - "name": "Face Forward", - "icon": "math-function", - "description": "Return a vector pointing in the same direction as another", - "shaderNode": "faceForward", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "n", - "description": "Specifies the vector to orient." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "i", - "description": "Specifies the incident vector." - }, - { - "name": "cNode", - "nodeType": "node", - "label": "nref", - "description": "Specifies the reference vector." - } - ] - }, - { - "name": "Floor", - "icon": "math-function", - "description": "Returns a value equal to the nearest integer that is less than or equal to x.", - "shaderNode": "floor", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to evaluate." - } - ] - }, - { - "name": "Fract", - "icon": "math-function", - "description": "Returns the fractional part of x. This is calculated as x - floor(x).", - "shaderNode": "fract", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to evaluate." - } - ] - }, - { - "name": "Inverse Sqrt", - "icon": "math-function", - "description": "Returns the inverse of the square root of x; i.e. the value 1x√.", - "shaderNode": "inversesqrt", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value of which to take the inverse of the square root." - } - ] - }, - { - "name": "Length", - "icon": "math-function", - "description": "Returns the length of the vector, i.e.", - "shaderNode": "length", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the vector of which to calculate the length." - } - ] - }, - { - "name": "Log", - "icon": "math-function", - "description": "Returns the natural logarithm of x, i.e. the value y which satisfies x=ey.", - "shaderNode": "log", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value of which to take the natural logarithm." - } - ] - }, - { - "name": "Log2", - "icon": "math-function", - "description": "Returns the base 2 logarithm of x, i.e. the value y which satisfies x=2y.", - "shaderNode": "log2", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value of which to take the base 2 logarithm." - } - ] - }, - { - "name": "Max", - "icon": "math-function", - "description": "Returns the maximum of the two parameters.", - "shaderNode": "max", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the first value to compare." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specify the second value to compare." - } - ] - }, - { - "name": "Min", - "icon": "math-function", - "description": "Returns the minimum of the two parameters.", - "shaderNode": "min", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the first value to compare." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specify the second value to compare." - } - ] - }, - { - "name": "Mix", - "icon": "math-function", - "description": "Linearly interpolate between two values", - "shaderNode": "mix", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the start of the range in which to interpolate." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specify the end of the range in which to interpolate." - }, - { - "name": "cNode", - "nodeType": "node", - "label": "a", - "description": "Specify the value to use to interpolate between x and y." - } - ] - }, - { - "name": "Modulo", - "icon": "math-function", - "description": "Returns the value of x modulo y.", - "shaderNode": "mod", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to evaluate." - }, - { - "name": "bNode", - "nodeType": "float", - "label": "y", - "description": "Specify the value to evaluate." - } - ] - }, - { - "name": "Negate", - "icon": "math-function", - "description": "Returns the flipped sign value of input In", - "shaderNode": "negate", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "description": "Input value." - } - ] - }, - { - "name": "Normalize", - "icon": "math-function", - "description": "Returns a vector with the same direction as its parameter, v, but with length 1.", - "shaderNode": "normalize", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "v", - "description": "Specifies the vector to normalize." - } - ] - }, - { - "name": "One Minus", - "icon": "math-function", - "description": "Returns the result of input `a` subtracted from 1.", - "shaderNode": "oneMinus", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "description": "Input value." - } - ] - }, - { - "name": "Pow", - "icon": "math-function", - "description": "Return the value of the first parameter raised to the power of the second", - "shaderNode": "pow", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to raise to the power y." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "y", - "description": "Specify the value to raise x." - } - ] - }, - { - "name": "Radians", - "icon": "math-function", - "description": "Converts a quantity specified in degrees into radians.", - "shaderNode": "radians", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "degrees", - "description": "Specify the quantity, in degrees, to be converted to radians." - } - ] - }, - { - "name": "Reciprocal", - "icon": "math-function", - "description": "Returns the result of dividing 1 by the input.", - "shaderNode": "reciprocal", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "description": "Input value." - } - ] - }, - { - "name": "Reflect", - "icon": "math-function", - "description": "Calculate the reflection direction for an incident vector", - "shaderNode": "reflect", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "i", - "description": "Specifies the incident vector." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "n", - "description": "Specifies the normal vector." - } - ] - }, - { - "name": "Refract", - "icon": "math-function", - "description": "Calculate the refraction direction for an incident vector", - "shaderNode": "refract", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "i", - "description": "Specifies the incident vector." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "n", - "description": "Specifies the normal vector." - }, - { - "name": "cNode", - "nodeType": "node", - "label": "eta", - "description": "Specifies the ratio of indices of refraction." - } - ] - }, - { - "name": "Remap", - "icon": "math-function", - "nodeType": "node", - "shaderNode": "remap", - "properties": [ - { - "name": "node", - "nodeType": "node" - }, - { - "name": "inLowNode", - "nodeType": "node" - }, - { - "name": "inHighNode", - "nodeType": "node" - }, - { - "name": "outLowNode", - "nodeType": "node" - }, - { - "name": "outHighNode", - "nodeType": "node" - } - ] - }, - { - "name": "Normal Map", - "icon": "photo", - "description": "Converts a normal map value to a normal vector.", - "shaderNode": "normalMap", - "nodeType": "node", - "properties": [ - { - "name": "node", - "nodeType": "vec3", - "label": "normal", - "description": "Specifies the vector to convert." - } - ] - }, - { - "name": "Round", - "icon": "math-function", - "description": "Round returns a value equal to the nearest integer to x.", - "shaderNode": "round", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to evaluate." - } - ] - }, - { - "name": "Saturate", - "icon": "math-function", - "shaderNode": "saturate", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node" - } - ] - }, - { - "name": "Sign", - "icon": "math-function", - "description": "Returns -1.0 if x is less than 0.0, 0.0 if x is equal to 0.0, and +1.0 if x is greater than 0.0.", - "shaderNode": "sign", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value from which to extract the sign." - } - ] - }, - { - "name": "Sine", - "icon": "math-function", - "description": "Returns the trigonometric sine of angle.", - "shaderNode": "sin", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "angle", - "description": "Specify the quantity, in radians, of which to return the sine." - } - ] - }, - { - "name": "Smoothstep", - "icon": "math-function", - "description": "Perform Hermite interpolation between two values", - "shaderNode": "smoothstep", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "edge0", - "description": "Specifies the value of the lower edge of the Hermite function." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "edge1", - "description": "Specifies the value of the upper edge of the Hermite function." - }, - { - "name": "cNode", - "nodeType": "node", - "label": "x", - "description": "Specifies the value to be used to generate the Hermite function." - } - ] - }, - { - "name": "Sqrt", - "icon": "math-function", - "description": "Returns the square root of x, i.e.", - "shaderNode": "sqrt", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value of which to take the square root." - } - ] - }, - { - "name": "Tangent", - "icon": "math-function", - "description": "Returns the trigonometric tangent of angle.", - "shaderNode": "tan", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "angle", - "description": "Specify the quantity, in radians, of which to return the tangent." - } - ] - }, - { - "name": "Transform Direction", - "icon": "math-function", - "description": "Transforms the direction of vector by a matrix and then normalizes the result.", - "shaderNode": "transformDirection", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "dir" - }, - { - "name": "bNode", - "nodeType": "node", - "label": "matrix" - } - ] - }, - { - "name": "dFdx", - "icon": "math-function", - "description": "Return the partial derivative of expression p with respect to the window x coordinate.", - "shaderNode": "dFdx", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "p", - "description": "Specifies the expression of which to take the partial derivative." - } - ] - }, - { - "name": "dFdy", - "icon": "math-function", - "description": "Return the partial derivative of expression p with respect to the window y coordinate.", - "shaderNode": "dFdy", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "p", - "description": "Specifies the expression of which to take the partial derivative." - } - ] - }, - { - "name": "Step", - "icon": "math-function", - "description": "Generates a step function by comparing x to edge.", - "shaderNode": "step", - "nodeType": "node", - "properties": [ - { - "name": "aNode", - "nodeType": "node", - "label": "edge", - "description": "Specifies the location of the edge of the step function." - }, - { - "name": "bNode", - "nodeType": "node", - "label": "x", - "description": "Specify the value to be used to generate the step function." - } - ] - } - ] - }, - { - "name": "Constants", - "icon": "123", - "children": [ - { - "name": "Epsilon", - "icon": "letter-e", - "shaderNode": "EPSILON", - "nodeType": "float", - "value": 1000000 - }, - { - "name": "Infinity", - "icon": "infinity", - "shaderNode": "INFINITY", - "nodeType": "float", - "value": 0.000001 - }, - { - "name": "PI", - "icon": "math-pi", - "shaderNode": "PI", - "nodeType": "float", - "value": 3.141592653589793 - } - ] - } - ] - }, - { - "name": "Filters", - "icon": "color-filter", - "children": [ - { - "name": "Burn", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "burn", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Difference", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "difference", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Dodge", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "dodge", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Hue", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "hue", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Luminance", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "luminance", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Overlay", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "overlay", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Posterize", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "posterize", - "visible": false, - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Saturation", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "saturation", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Screen", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "screen", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - }, - { - "name": "Vibrance", - "icon": "color-filter", - "nodeType": "color", - "shaderNode": "vibrance", - "properties": [ - { - "name": "blendNode", - "nodeType": "color" - }, - { - "name": "baseNode", - "nodeType": "color" - } - ] - } - ] - }, - { - "name": "Utils", - "icon": "apps", - "children": [ - { - "name": "Channel", - "icon": "server-2", - "children": [ - { - "name": "Join", - "icon": "arrows-join", - "nodeType": "node", - "editorClass": "JoinEditor" - }, - { - "name": "Split", - "icon": "arrows-split", - "nodeType": "node", - "editorClass": "SplitEditor" - }, - { - "name": "Swizzle", - "icon": "switch-3", - "nodeType": "node", - "editorClass": "SwizzleEditor" - } - ] - }, - { - "name": "UV", - "icon": "chart-treemap", - "children": [ - { - "name": "Rotate UV", - "icon": "rotate-clockwise-2", - "nodeType": "float", - "shaderNode": "rotateUV" - } - ] - }, - { - "name": "Preview", - "icon": "square-check", - "nodeType": "float", - "editorClass": "PreviewEditor" - }, - { - "name": "Timer", - "icon": "clock", - "editorClass": "TimerEditor" - } - ] - }, - { - "name": "Conversions", - "icon": "arrows-exchange", - "children": [ - { - "name": "Color To Direction", - "icon": "arrows-exchange", - "nodeType": "color", - "shaderNode": "colorToDirection" - }, - { - "name": "Direction To Color", - "icon": "arrows-exchange", - "nodeType": "color", - "shaderNode": "directionToColor" - } - ] - }, - { - "name": "Procedural", - "icon": "binary-tree", - "children": [ - { - "name": "Checker", - "icon": "border-all", - "nodeType": "float", - "shaderNode": "checker", - "properties": [ - { - "name": "uvNode", - "nodeType": "vec2" - } - ] - }, - { - "name": "Range", - "icon": "sort-ascending-2", - "nodeType": "node", - "shaderNode": "range", - "properties": [ - { - "name": "minNode", - "nodeType": "InputNode" - }, - { - "name": "maxNode", - "nodeType": "InputNode" - } - ] - } - ] - }, - { - "name": "Prototype", - "icon": "code", - "children": [ - { - "name": "Node Prototype", - "icon": "components", - "editorClass": "NodePrototypeEditor" - }, - { - "name": "Scriptable", - "icon": "variable", - "editorClass": "ScriptableEditor" - } - ] - }, - { - "name": "Material", - "icon": "circles", - "children": [ - { - "name": "Basic Material", - "icon": "circle", - "nodeType": "float", - "editorClass": "BasicMaterialEditor", - "editorURL": "./materials/BasicMaterialEditor.js" - }, - { - "name": "Points Material", - "icon": "circle-dotted", - "nodeType": "float", - "editorClass": "PointsMaterialEditor" - }, - { - "name": "Standard Material", - "icon": "inner-shadow-top-left", - "nodeType": "float", - "editorClass": "StandardMaterialEditor" - } - ] - } - ] -} diff --git a/playground/SplitscreenManager.js b/playground/SplitscreenManager.js deleted file mode 100644 index fdbeacf391c1bb..00000000000000 --- a/playground/SplitscreenManager.js +++ /dev/null @@ -1,91 +0,0 @@ -export class SplitscreenManager { - - constructor( editor ) { - - this.editor = editor; - this.renderer = editor.renderer; - this.composer = editor.composer; - - this.gutter = null; - this.gutterMoving = false; - this.gutterOffset = 0.6; - - } - - setSplitview( value ) { - - const nodeDOM = this.editor.domElement; - const rendererContainer = this.renderer.domElement.parentNode; - - if ( value ) { - - this.addGutter( rendererContainer, nodeDOM ); - - } else { - - this.removeGutter( rendererContainer, nodeDOM ); - - } - - } - - addGutter( rendererContainer, nodeDOM ) { - - rendererContainer.style[ 'z-index' ] = 20; - - this.gutter = document.createElement( 'f-gutter' ); - - nodeDOM.parentNode.appendChild( this.gutter ); - - const onGutterMovement = () => { - - const offset = this.gutterOffset; - - this.gutter.style[ 'left' ] = 100 * offset + '%'; - rendererContainer.style[ 'left' ] = 100 * offset + '%'; - rendererContainer.style[ 'width' ] = 100 * ( 1 - offset ) + '%'; - nodeDOM.style[ 'width' ] = 100 * offset + '%'; - - }; - - this.gutter.addEventListener( 'mousedown', () => { - - this.gutterMoving = true; - - } ); - - document.addEventListener( 'mousemove', ( event ) => { - - if ( this.gutter && this.gutterMoving ) { - - this.gutterOffset = Math.max( 0, Math.min( 1, event.clientX / window.innerWidth ) ); - onGutterMovement(); - - } - - } ); - - document.addEventListener( 'mouseup', () => { - - this.gutterMoving = false; - - } ); - - onGutterMovement(); - - } - - removeGutter( rendererContainer, nodeDOM ) { - - rendererContainer.style[ 'z-index' ] = 0; - - this.gutter.remove(); - this.gutter = null; - - rendererContainer.style[ 'left' ] = '0%'; - rendererContainer.style[ 'width' ] = '100%'; - nodeDOM.style[ 'width' ] = '100%'; - - } - -} diff --git a/playground/editors/BasicMaterialEditor.js b/playground/editors/BasicMaterialEditor.js deleted file mode 100644 index 759547bc5584d4..00000000000000 --- a/playground/editors/BasicMaterialEditor.js +++ /dev/null @@ -1,81 +0,0 @@ -import { ColorInput, SliderInput, LabelElement } from 'flow'; -import { MaterialEditor } from './MaterialEditor.js'; -import { MeshBasicNodeMaterial } from 'three/webgpu'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -export class BasicMaterialEditor extends MaterialEditor { - - constructor() { - - const material = new MeshBasicNodeMaterial(); - - super( 'Basic Material', material ); - - const color = setInputAestheticsFromType( new LabelElement( 'color' ), 'Color' ); - const opacity = setInputAestheticsFromType( new LabelElement( 'opacity' ), 'Number' ); - const position = setInputAestheticsFromType( new LabelElement( 'position' ), 'Vector3' ); - - color.add( new ColorInput( material.color.getHex() ).onChange( ( input ) => { - - material.color.setHex( input.getValue() ); - - } ) ); - - opacity.add( new SliderInput( material.opacity, 0, 1 ).onChange( ( input ) => { - - material.opacity = input.getValue(); - - this.updateTransparent(); - - } ) ); - - color.onConnect( () => this.update(), true ); - opacity.onConnect( () => this.update(), true ); - position.onConnect( () => this.update(), true ); - - this.add( color ) - .add( opacity ) - .add( position ); - - this.color = color; - this.opacity = opacity; - this.position = position; - - this.update(); - - } - - update() { - - const { material, color, opacity, position } = this; - - color.setEnabledInputs( ! color.getLinkedObject() ); - opacity.setEnabledInputs( ! opacity.getLinkedObject() ); - - material.colorNode = color.getLinkedObject(); - material.opacityNode = opacity.getLinkedObject() || null; - - material.positionNode = position.getLinkedObject() || null; - - material.dispose(); - - this.updateTransparent(); - - } - - updateTransparent() { - - const { material, opacity } = this; - - const transparent = opacity.getLinkedObject() || material.opacity < 1 ? true : false; - const needsUpdate = transparent !== material.transparent; - - material.transparent = transparent; - - opacity.setIcon( material.transparent ? 'ti ti-layers-intersect' : 'ti ti-layers-subtract' ); - - if ( needsUpdate === true ) material.dispose(); - - } - -} diff --git a/playground/editors/ColorEditor.js b/playground/editors/ColorEditor.js deleted file mode 100644 index f626872b1304ec..00000000000000 --- a/playground/editors/ColorEditor.js +++ /dev/null @@ -1,99 +0,0 @@ -import { ColorInput, StringInput, NumberInput, LabelElement, Element } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { Color } from 'three'; -import { UniformNode } from 'three/webgpu'; - -export class ColorEditor extends BaseNodeEditor { - - constructor() { - - const v = new Color(); - const node = new UniformNode( v ); - - super( 'Color', node ); - - const updateFields = ( editing ) => { - - const value = node.value; - const hexValue = value.getHex(); - const hexString = hexValue.toString( 16 ).toUpperCase().padStart( 6, '0' ); - - if ( editing !== 'color' ) { - - field.setValue( hexValue, false ); - - } - - if ( editing !== 'hex' ) { - - hexField.setValue( '#' + hexString, false ); - - } - - if ( editing !== 'rgb' ) { - - fieldR.setValue( value.r.toFixed( 3 ), false ); - fieldG.setValue( value.g.toFixed( 3 ), false ); - fieldB.setValue( value.b.toFixed( 3 ), false ); - - } - - fieldR.setTagColor( `#${hexString.slice( 0, 2 )}0000` ); - fieldG.setTagColor( `#00${hexString.slice( 2, 4 )}00` ); - fieldB.setTagColor( `#0000${hexString.slice( 4, 6 )}` ); - - this.invalidate(); // it's important to scriptable nodes ( cpu nodes needs update ) - - }; - - const field = new ColorInput( 0xFFFFFF ).onChange( () => { - - node.value.setHex( field.getValue() ); - - updateFields( 'picker' ); - - } ); - - const hexField = new StringInput().onChange( () => { - - const value = hexField.getValue(); - - if ( value.indexOf( '#' ) === 0 ) { - - const hexStr = value.slice( 1 ).padEnd( 6, '0' ); - - node.value.setHex( parseInt( hexStr, 16 ) ); - - updateFields( 'hex' ); - - } - - } ); - - hexField.addEventListener( 'blur', () => { - - updateFields(); - - } ); - - const onChangeRGB = () => { - - node.value.setRGB( fieldR.getValue(), fieldG.getValue(), fieldB.getValue() ); - - updateFields( 'rgb' ); - - }; - - const fieldR = new NumberInput( 1, 0, 1 ).setTagColor( 'red' ).onChange( onChangeRGB ); - const fieldG = new NumberInput( 1, 0, 1 ).setTagColor( 'green' ).onChange( onChangeRGB ); - const fieldB = new NumberInput( 1, 0, 1 ).setTagColor( 'blue' ).onChange( onChangeRGB ); - - this.add( new Element().add( field ).setSerializable( false ) ) - .add( new LabelElement( 'Hex' ).add( hexField ).setSerializable( false ) ) - .add( new LabelElement( 'RGB' ).add( fieldR ).add( fieldG ).add( fieldB ) ); - - updateFields(); - - } - -} diff --git a/playground/editors/CustomNodeEditor.js b/playground/editors/CustomNodeEditor.js deleted file mode 100644 index df359b8f888731..00000000000000 --- a/playground/editors/CustomNodeEditor.js +++ /dev/null @@ -1,97 +0,0 @@ -import { LabelElement } from 'flow'; -import { Color, Vector2, Vector3, Vector4 } from 'three'; -import * as Nodes from 'three/tsl'; -import { uniform } from 'three/tsl'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createInputLib } from '../NodeEditorUtils.js'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -const typeToValue = { - 'color': Color, - 'vec2': Vector2, - 'vec3': Vector3, - 'vec4': Vector4 -}; - -const createElementFromProperty = ( node, property ) => { - - const nodeType = property.nodeType; - const defaultValue = uniform( typeToValue[ nodeType ] ? new typeToValue[ nodeType ]() : 0 ); - - let label = property.label; - - if ( label === undefined ) { - - label = property.name; - - if ( label.endsWith( 'Node' ) === true ) { - - label = label.slice( 0, label.length - 4 ); - - } - - } - - node[ property.name ] = defaultValue; - - const element = setInputAestheticsFromType( new LabelElement( label ), nodeType ); - - if ( createInputLib[ nodeType ] !== undefined ) { - - createInputLib[ nodeType ]( defaultValue, element ); - - } - - element.onConnect( ( elmt ) => { - - elmt.setEnabledInputs( ! elmt.getLinkedObject() ); - - node[ property.name ] = elmt.getLinkedObject() || defaultValue; - - } ); - - return element; - -}; - -export class CustomNodeEditor extends BaseNodeEditor { - - constructor( settings ) { - - const shaderNode = Nodes[ settings.shaderNode ]; - - let node = null; - - const elements = []; - - if ( settings.properties !== undefined ) { - - node = shaderNode(); - - for ( const property of settings.properties ) { - - elements.push( createElementFromProperty( node, property ) ); - - } - - } else { - - node = shaderNode; - - } - - node.nodeType = node.nodeType || settings.nodeType; - - super( settings.name, node, 300 ); - - this.title.setIcon( 'ti ti-' + settings.icon ); - - for ( const element of elements ) { - - this.add( element ); - - } - - } - -} diff --git a/playground/editors/FileEditor.js b/playground/editors/FileEditor.js deleted file mode 100644 index 66819ca6a4246c..00000000000000 --- a/playground/editors/FileEditor.js +++ /dev/null @@ -1,71 +0,0 @@ -import { StringInput, Element } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { NodeUtils } from 'three/webgpu'; -import { arrayBuffer } from 'three/tsl'; - -export class FileEditor extends BaseNodeEditor { - - constructor( buffer = null, name = 'File' ) { - - super( 'File', arrayBuffer( buffer ), 250 ); - - this.nameInput = new StringInput( name ).setReadOnly( true ); - - this.add( new Element().add( this.nameInput ) ); - - this.url = null; - - } - - set buffer( arrayBuffer ) { - - if ( this.url !== null ) { - - URL.revokeObjectUR( this.url ); - - } - - this.value.value = arrayBuffer; - this.url = null; - - } - - get buffer() { - - return this.value.value; - - } - - getURL() { - - if ( this.url === null ) { - - const blob = new Blob( [ this.buffer ], { type: 'application/octet-stream' } ); - - this.url = URL.createObjectURL( blob ); - - } - - return this.url; - - } - - serialize( data ) { - - super.serialize( data ); - - data.buffer = NodeUtils.arrayBufferToBase64( this.buffer ); - data.name = this.nameInput.getValue(); - - } - - deserialize( data ) { - - super.deserialize( data ); - - this.buffer = NodeUtils.base64ToArrayBuffer( data.buffer ); - this.nameInput.setValue( data.name ); - - } - -} diff --git a/playground/editors/FloatEditor.js b/playground/editors/FloatEditor.js deleted file mode 100644 index e0f77af9d56205..00000000000000 --- a/playground/editors/FloatEditor.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; - -export class FloatEditor extends BaseNodeEditor { - - constructor() { - - const { element, inputNode } = createElementFromJSON( { - inputType: 'float', - inputConnection: false - } ); - - super( 'Float', inputNode, 150 ); - - element.addEventListener( 'changeInput', () => this.invalidate() ); - - this.add( element ); - - } - -} diff --git a/playground/editors/JavaScriptEditor.js b/playground/editors/JavaScriptEditor.js deleted file mode 100644 index b4a1f2d39ec549..00000000000000 --- a/playground/editors/JavaScriptEditor.js +++ /dev/null @@ -1,50 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { CodeEditorElement } from '../elements/CodeEditorElement.js'; -import { js } from 'three/tsl'; - -export class JavaScriptEditor extends BaseNodeEditor { - - constructor( source = '' ) { - - const codeNode = js( source ); - - super( 'JavaScript', codeNode, 500 ); - - this.setResizable( true ); - - // - - this.editorElement = new CodeEditorElement( source ); - this.editorElement.addEventListener( 'change', () => { - - codeNode.code = this.editorElement.source; - - this.invalidate(); - - this.editorElement.focus(); - - } ); - - this.add( this.editorElement ); - - } - - set source( value ) { - - this.codeNode.code = value; - - } - - get source() { - - return this.codeNode.code; - - } - - get codeNode() { - - return this.value; - - } - -} diff --git a/playground/editors/JoinEditor.js b/playground/editors/JoinEditor.js deleted file mode 100644 index c27a1d66cb8c49..00000000000000 --- a/playground/editors/JoinEditor.js +++ /dev/null @@ -1,62 +0,0 @@ -import { LabelElement } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { JoinNode, UniformNode } from 'three/webgpu'; -import { float } from 'three/tsl'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -const NULL_VALUE = new UniformNode( 0 ); - -export class JoinEditor extends BaseNodeEditor { - - constructor() { - - const node = new JoinNode(); - - super( 'Join', node, 175 ); - - const update = () => { - - const values = [ - xElement.getLinkedObject(), - yElement.getLinkedObject(), - zElement.getLinkedObject(), - wElement.getLinkedObject() - ]; - - let length = 1; - - if ( values[ 3 ] !== null ) length = 4; - else if ( values[ 2 ] !== null ) length = 3; - else if ( values[ 1 ] !== null ) length = 2; - - const nodes = []; - - for ( let i = 0; i < length; i ++ ) { - - nodes.push( float( values[ i ] || NULL_VALUE ) ); - - } - - node.nodes = nodes; - - this.invalidate(); - - this.title.setOutput( length ); - - }; - - const xElement = setInputAestheticsFromType( new LabelElement( 'x | r' ), 'Number' ).onConnect( update ); - const yElement = setInputAestheticsFromType( new LabelElement( 'y | g' ), 'Number' ).onConnect( update ); - const zElement = setInputAestheticsFromType( new LabelElement( 'z | b' ), 'Number' ).onConnect( update ); - const wElement = setInputAestheticsFromType( new LabelElement( 'w | a' ), 'Number' ).onConnect( update ); - - this.add( xElement ) - .add( yElement ) - .add( zElement ) - .add( wElement ); - - update(); - - } - -} diff --git a/playground/editors/MaterialEditor.js b/playground/editors/MaterialEditor.js deleted file mode 100644 index a24a5292c10578..00000000000000 --- a/playground/editors/MaterialEditor.js +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; - -export class MaterialEditor extends BaseNodeEditor { - - constructor( name, material, width = 300 ) { - - super( name, material, width ); - - } - - get material() { - - return this.value; - - } - -} diff --git a/playground/editors/NodePrototypeEditor.js b/playground/editors/NodePrototypeEditor.js deleted file mode 100644 index 8f98d501c5c749..00000000000000 --- a/playground/editors/NodePrototypeEditor.js +++ /dev/null @@ -1,214 +0,0 @@ -import { JavaScriptEditor } from './JavaScriptEditor.js'; -import { ScriptableEditor } from './ScriptableEditor.js'; -import { scriptable } from 'three/tsl'; - -const defaultCode = `// Addition Node Example -// Enjoy! :) - -// layout must be the first variable. - -layout = { - name: "Custom Addition", - outputType: 'node', - icon: 'heart-plus', - width: 200, - elements: [ - { name: 'A', inputType: 'node' }, - { name: 'B', inputType: 'node' } - ] -}; - -// THREE and TSL (Three.js Shading Language) namespaces are available. -// main code must be in the output function. - -const { add, float } = TSL; - -function main() { - - const nodeA = parameters.get( 'A' ) || float(); - const nodeB = parameters.get( 'B' ) || float(); - - return add( nodeA, nodeB ); - -} -`; - -export class NodePrototypeEditor extends JavaScriptEditor { - - constructor( source = defaultCode ) { - - super( source ); - - this.setName( 'Node Prototype' ); - - this.nodeClass = new WeakMap(); - this.scriptableNode = scriptable( this.codeNode ); - - this.instances = []; - - this.editorElement.addEventListener( 'change', () => { - - this.updatePrototypes(); - - } ); - - this._prototype = null; - - this.updatePrototypes(); - - } - - serialize( data ) { - - super.serialize( data ); - - data.source = this.source; - - } - - deserialize( data ) { - - super.deserialize( data ); - - this.source = data.source; - - } - - deserializeLib( data, lib ) { - - super.deserializeLib( data, lib ); - - this.source = data.source; - - const nodePrototype = this.createPrototype(); - lib[ nodePrototype.name ] = nodePrototype.nodeClass; - - } - - setEditor( editor ) { - - if ( editor === null && this.editor ) { - - this.editor.removeClass( this._prototype ); - - } - - super.setEditor( editor ); - - if ( editor === null ) { - - for ( const proto of [ ...this.instances ] ) { - - proto.dispose(); - - } - - this.instances = []; - - } - - this.updatePrototypes(); - - } - - createPrototype() { - - if ( this._prototype !== null ) return this._prototype; - - const nodePrototype = this; - const scriptableNode = this.scriptableNode; - const editorElement = this.editorElement; - - const nodeClass = class extends ScriptableEditor { - - constructor() { - - super( scriptableNode.codeNode, false ); - - this.serializePriority = - 1; - - this.onCode = this.onCode.bind( this ); - - } - - onCode() { - - this.update(); - - } - - setEditor( editor ) { - - super.setEditor( editor ); - - const index = nodePrototype.instances.indexOf( this ); - - if ( editor ) { - - if ( index === - 1 ) nodePrototype.instances.push( this ); - - editorElement.addEventListener( 'change', this.onCode ); - - } else { - - if ( index !== - 1 ) nodePrototype.instances.splice( index, 1 ); - - editorElement.removeEventListener( 'change', this.onCode ); - - } - - } - - get className() { - - return scriptableNode.getLayout().name; - - } - - }; - - this._prototype = { - get name() { - - return scriptableNode.getLayout().name; - - }, - get icon() { - - return scriptableNode.getLayout().icon; - - }, - nodeClass, - reference: this, - editor: this.editor - }; - - return this._prototype; - - } - - updatePrototypes() { - - if ( this._prototype !== null && this._prototype.editor !== null ) { - - this._prototype.editor.removeClass( this._prototype ); - - } - - // - - const layout = this.scriptableNode.getLayout(); - - if ( layout && layout.name ) { - - if ( this.editor ) { - - this.editor.addClass( this.createPrototype() ); - - } - - } - - } - -} diff --git a/playground/editors/PointsMaterialEditor.js b/playground/editors/PointsMaterialEditor.js deleted file mode 100644 index c7a164cdf433ee..00000000000000 --- a/playground/editors/PointsMaterialEditor.js +++ /dev/null @@ -1,99 +0,0 @@ -import { ColorInput, ToggleInput, SliderInput, LabelElement } from 'flow'; -import { MaterialEditor } from './MaterialEditor.js'; -import { PointsNodeMaterial } from 'three/webgpu'; -import * as THREE from 'three'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -export class PointsMaterialEditor extends MaterialEditor { - - constructor() { - - const material = new PointsNodeMaterial(); - - super( 'Points Material', material ); - - const color = setInputAestheticsFromType( new LabelElement( 'color' ), 'Color' ); - const opacity = setInputAestheticsFromType( new LabelElement( 'opacity' ), 'Number' ); - const size = setInputAestheticsFromType( new LabelElement( 'size' ), 'Number' ); - const position = setInputAestheticsFromType( new LabelElement( 'position' ), 'Vector3' ); - const sizeAttenuation = setInputAestheticsFromType( new LabelElement( 'Size Attenuation' ), 'Number' ); - - color.add( new ColorInput( material.color.getHex() ).onChange( ( input ) => { - - material.color.setHex( input.getValue() ); - - } ) ); - - opacity.add( new SliderInput( material.opacity, 0, 1 ).onChange( ( input ) => { - - material.opacity = input.getValue(); - - this.updateTransparent(); - - } ) ); - - sizeAttenuation.add( new ToggleInput( material.sizeAttenuation ).onClick( ( input ) => { - - material.sizeAttenuation = input.getValue(); - material.dispose(); - - } ) ); - - color.onConnect( () => this.update(), true ); - opacity.onConnect( () => this.update(), true ); - size.onConnect( () => this.update(), true ); - position.onConnect( () => this.update(), true ); - - this.add( color ) - .add( opacity ) - .add( size ) - .add( position ) - .add( sizeAttenuation ); - - this.color = color; - this.opacity = opacity; - this.size = size; - this.position = position; - this.sizeAttenuation = sizeAttenuation; - - this.update(); - - } - - update() { - - const { material, color, opacity, size, position } = this; - - color.setEnabledInputs( ! color.getLinkedObject() ); - opacity.setEnabledInputs( ! opacity.getLinkedObject() ); - - material.colorNode = color.getLinkedObject(); - material.opacityNode = opacity.getLinkedObject() || null; - - material.sizeNode = size.getLinkedObject() || null; - material.positionNode = position.getLinkedObject() || null; - - material.dispose(); - - this.updateTransparent(); - - // TODO: Fix on NodeMaterial System - material.customProgramCacheKey = () => { - - return THREE.MathUtils.generateUUID(); - - }; - - } - - updateTransparent() { - - const { material, opacity } = this; - - material.transparent = opacity.getLinkedObject() || material.opacity < 1 ? true : false; - - opacity.setIcon( material.transparent ? 'ti ti-layers-intersect' : 'ti ti-layers-subtract' ); - - } - -} diff --git a/playground/editors/PreviewEditor.js b/playground/editors/PreviewEditor.js deleted file mode 100644 index 8ab7c19324e503..00000000000000 --- a/playground/editors/PreviewEditor.js +++ /dev/null @@ -1,173 +0,0 @@ -import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; -import { ViewHelper } from 'three/addons/helpers/ViewHelper.js'; -import { Element, LabelElement, SelectInput } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { MeshBasicNodeMaterial } from 'three/webgpu'; -import { vec4 } from 'three/tsl'; -import { PerspectiveCamera, Scene, Mesh, DoubleSide, SphereGeometry, BoxGeometry, PlaneGeometry, TorusKnotGeometry, WebGPURenderer } from 'three'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -const sceneDict = {}; - -const getScene = ( name ) => { - - let scene = sceneDict[ name ]; - - if ( scene === undefined ) { - - scene = new Scene(); - - if ( name === 'box' ) { - - const box = new Mesh( new BoxGeometry( 1.3, 1.3, 1.3 ) ); - scene.add( box ); - - } else if ( name === 'sphere' ) { - - const sphere = new Mesh( new SphereGeometry( 1, 32, 16 ) ); - scene.add( sphere ); - - } else if ( name === 'plane' || name === 'sprite' ) { - - const plane = new Mesh( new PlaneGeometry( 2, 2 ) ); - scene.add( plane ); - - - } else if ( name === 'torus' ) { - - const torus = new Mesh( new TorusKnotGeometry( .7, .1, 100, 16 ) ); - scene.add( torus ); - - } - - sceneDict[ name ] = scene; - - } - - return scene; - -}; - -export class PreviewEditor extends BaseNodeEditor { - - constructor() { - - const width = 300; - const height = 300; - - super( 'Preview', null, width ); - - const material = new MeshBasicNodeMaterial(); - material.colorNode = vec4( 0, 0, 0, 1 ); - material.side = DoubleSide; - material.transparent = true; - - const previewElement = new Element(); - previewElement.dom.style[ 'padding-top' ] = 0; - previewElement.dom.style[ 'padding-bottom' ] = 0; - previewElement.dom.style[ 'padding-left' ] = 0; - previewElement.dom.style[ 'padding-right' ] = '14px'; - - const sceneInput = new SelectInput( [ - { name: 'Box', value: 'box' }, - { name: 'Sphere', value: 'sphere' }, - { name: 'Plane', value: 'plane' }, - { name: 'Sprite', value: 'sprite' }, - { name: 'Torus', value: 'torus' } - ], 'box' ); - - const inputElement = setInputAestheticsFromType( new LabelElement( 'Input' ), 'Color' ).onConnect( () => { - - material.colorNode = inputElement.getLinkedObject() || vec4( 0, 0, 0, 1 ); - material.dispose(); - - }, true ); - - const canvas = document.createElement( 'canvas' ); - canvas.style.position = 'absolute'; - previewElement.dom.append( canvas ); - previewElement.setHeight( height ); - - previewElement.dom.addEventListener( 'wheel', e => e.stopPropagation() ); - - const renderer = new WebGPURenderer( { - canvas, - alpha: true, - antialias: true - } ); - - renderer.autoClear = false; - renderer.setSize( width, height, true ); - renderer.setPixelRatio( window.devicePixelRatio ); - - const camera = new PerspectiveCamera( 45, width / height, 0.1, 100 ); - camera.aspect = width / height; - camera.updateProjectionMatrix(); - camera.position.set( - 2, 2, 2 ); - camera.lookAt( 0, 0, 0 ); - - const controls = new OrbitControls( camera, previewElement.dom ); - controls.enableKeys = false; - controls.update(); - - const viewHelper = new ViewHelper( camera, previewElement.dom ); - - this.sceneInput = sceneInput; - this.viewHelper = viewHelper; - this.material = material; - this.camera = camera; - this.renderer = renderer; - - this.add( inputElement ) - .add( new LabelElement( 'Object' ).add( sceneInput ) ) - .add( previewElement ); - - } - - setEditor( editor ) { - - super.setEditor( editor ); - - this.updateAnimationRequest(); - - } - - updateAnimationRequest() { - - if ( this.editor !== null ) { - - requestAnimationFrame( () => this.update() ); - - } - - } - - async update() { - - const { viewHelper, material, renderer, camera, sceneInput } = this; - - this.updateAnimationRequest(); - - const sceneName = sceneInput.getValue(); - - const scene = getScene( sceneName ); - const mesh = scene.children[ 0 ]; - - mesh.material = material; - - if ( sceneName === 'sprite' ) { - - mesh.lookAt( camera.position ); - - } - - if ( renderer.hasInitialized() === false ) await renderer.init(); - - renderer.clear(); - renderer.render( scene, camera ); - - viewHelper.render( renderer ); - - } - -} diff --git a/playground/editors/ScriptableEditor.js b/playground/editors/ScriptableEditor.js deleted file mode 100644 index 33ff26c6706325..00000000000000 --- a/playground/editors/ScriptableEditor.js +++ /dev/null @@ -1,486 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { CodeEditorElement } from '../elements/CodeEditorElement.js'; -import { disposeScene, resetScene, createElementFromJSON, isGPUNode, onValidType } from '../NodeEditorUtils.js'; -import { ScriptableNodeResources, scriptable, js, scriptableValue } from 'three/tsl'; -import { getColorFromType, setInputAestheticsFromType, setOutputAestheticsFromType } from '../DataTypeLib.js'; - -const defaultTitle = 'Scriptable'; -const defaultWidth = 500; - -export class ScriptableEditor extends BaseNodeEditor { - - constructor( source = null, enableEditor = true ) { - - let codeNode = null; - let scriptableNode = null; - - if ( source && source.isCodeNode ) { - - codeNode = source; - - } else { - - codeNode = js( source || '' ); - - } - - scriptableNode = scriptable( codeNode ); - - super( defaultTitle, scriptableNode, defaultWidth ); - - this.scriptableNode = scriptableNode; - this.editorCodeNode = codeNode; - this.editorOutput = null; - this.editorOutputAdded = null; - - this.layout = null; - this.editorElement = null; - - this.layoutJSON = ''; - this.initCacheKey = ''; - this.initId = 0; - this.waitToLayoutJSON = null; - - this.hasInternalEditor = false; - - this._updating = false; - - this.onValidElement = () => {}; - - if ( enableEditor ) { - - this.title.setSerializable( true ); - - this._initExternalConnection(); - - this._toInternal(); - - } - - const defaultOutput = this.scriptableNode.getDefaultOutput(); - defaultOutput.events.addEventListener( 'refresh', () => { - - this.update(); - - } ); - - this.update(); - - } - - getColor() { - - const color = getColorFromType( this.layout ? this.layout.outputType : null ); - - return color ? color + 'BB' : null; - - } - - hasJSON() { - - return true; - - } - - exportJSON() { - - return this.scriptableNode.toJSON(); - - } - - setSource( source ) { - - this.editorCodeNode.code = source; - - this.update(); - - return this; - - } - - update( force = false ) { - - if ( this._updating === true ) return; - - this._updating = true; - - this.scriptableNode.codeNode = this.codeNode; - this.scriptableNode.needsUpdate = true; - - let layout = null; - let scriptableValueOutput = null; - - try { - - const object = this.scriptableNode.getObject(); - - layout = this.scriptableNode.getLayout(); - - this.updateLayout( layout, force ); - - scriptableValueOutput = this.scriptableNode.getDefaultOutput(); - - const initCacheKey = typeof object.init === 'function' ? object.init.toString() : ''; - - if ( initCacheKey !== this.initCacheKey ) { - - this.initCacheKey = initCacheKey; - - const initId = ++ this.initId; - - this.scriptableNode.callAsync( 'init' ).then( () => { - - if ( initId === this.initId ) { - - this.update(); - - if ( this.editor ) this.editor.tips.message( 'ScriptEditor: Initialized.' ); - - } - - } ); - - } - - } catch ( e ) { - - console.error( e ); - - if ( this.editor ) this.editor.tips.error( e.message ); - - } - - const editorOutput = scriptableValueOutput ? scriptableValueOutput.value : null; - - this.value = isGPUNode( editorOutput ) ? this.scriptableNode : scriptableValueOutput; - this.layout = layout; - this.editorOutput = editorOutput; - - this.updateOutputInEditor(); - this.updateOutputConnection(); - - this.invalidate(); - - this._updating = false; - - } - - updateOutputConnection() { - - const layout = this.layout; - - if ( layout ) { - - const outputType = layout.outputType; - - setOutputAestheticsFromType( this.title, outputType ); - - } else { - - this.title.setOutput( 0 ); - - } - - } - - updateOutputInEditor() { - - const { editor, editorOutput, editorOutputAdded } = this; - - if ( editor && editorOutput === editorOutputAdded ) return; - - const scene = ScriptableNodeResources.get( 'scene' ); - const composer = ScriptableNodeResources.get( 'composer' ); - - if ( editor ) { - - if ( editorOutputAdded && editorOutputAdded.isObject3D === true ) { - - editorOutputAdded.removeFromParent(); - - disposeScene( editorOutputAdded ); - - resetScene( scene ); - - } else if ( composer && editorOutputAdded && editorOutputAdded.isPass === true ) { - - composer.removePass( editorOutputAdded ); - - } - - if ( editorOutput && editorOutput.isObject3D === true ) { - - scene.add( editorOutput ); - - } else if ( composer && editorOutput && editorOutput.isPass === true ) { - - composer.addPass( editorOutput ); - - } - - this.editorOutputAdded = editorOutput; - - } else { - - if ( editorOutputAdded && editorOutputAdded.isObject3D === true ) { - - editorOutputAdded.removeFromParent(); - - disposeScene( editorOutputAdded ); - - resetScene( scene ); - - } else if ( composer && editorOutputAdded && editorOutputAdded.isPass === true ) { - - composer.removePass( editorOutputAdded ); - - } - - this.editorOutputAdded = null; - - } - - } - - setEditor( editor ) { - - super.setEditor( editor ); - - this.updateOutputInEditor(); - - } - - clearParameters() { - - this.layoutJSON = ''; - - this.scriptableNode.clearParameters(); - - for ( const element of this.elements.concat() ) { - - if ( element !== this.editorElement && element !== this.title ) { - - this.remove( element ); - - } - - } - - } - - addElementFromJSON( json ) { - - const { id, element, inputNode, outputType } = createElementFromJSON( json ); - - this.add( element ); - - this.scriptableNode.setParameter( id, inputNode ); - - if ( outputType ) { - - element.setObjectCallback( () => { - - return this.scriptableNode.getOutput( id ); - - } ); - - } - - // - - const onUpdate = () => { - - const value = element.value; - const paramValue = value && value.isScriptableValueNode ? value : scriptableValue( value ); - - this.scriptableNode.setParameter( id, paramValue ); - - this.update(); - - }; - - element.addEventListener( 'changeInput', onUpdate ); - element.onConnect( onUpdate, true ); - - //element.onConnect( () => this.getScriptable().call( 'onDeepChange' ), true ); - - return element; - - } - - updateLayout( layout = null, force = false ) { - - const needsUpdateWidth = this.hasExternalEditor || this.editorElement === null; - - if ( this.waitToLayoutJSON !== null ) { - - if ( this.waitToLayoutJSON === JSON.stringify( layout || '{}' ) ) { - - this.waitToLayoutJSON = null; - - if ( needsUpdateWidth ) this.setWidth( layout.width ); - - } else { - - return; - - } - - } - - if ( layout ) { - - const layoutCacheKey = JSON.stringify( layout ); - - if ( this.layoutJSON !== layoutCacheKey || force === true ) { - - this.clearParameters(); - - if ( layout.name ) { - - this.setName( layout.name ); - - } - - - if ( layout.icon ) { - - this.setIcon( layout.icon ); - - } - - if ( needsUpdateWidth ) { - - if ( layout.width !== undefined ) { - - this.setWidth( layout.width ); - - } else { - - this.setWidth( defaultWidth ); - - } - - } - - if ( layout.elements ) { - - for ( const element of layout.elements ) { - - this.addElementFromJSON( element ); - - } - - if ( this.editorElement ) { - - this.remove( this.editorElement ); - this.add( this.editorElement ); - - } - - } - - this.layoutJSON = layoutCacheKey; - - } - - } else { - - this.setName( defaultTitle ); - this.setIcon( null ); - this.setWidth( defaultWidth ); - - this.clearParameters(); - - } - - this.updateOutputConnection(); - - } - - get hasExternalEditor() { - - return this.title.getLinkedObject() !== null; - - } - - get codeNode() { - - return this.hasExternalEditor ? this.title.getLinkedObject() : this.editorCodeNode; - - } - - _initExternalConnection() { - - setInputAestheticsFromType( this.title, 'CodeNode' ).onValid( onValidType( 'CodeNode' ) ).onConnect( () => { - - this.hasExternalEditor ? this._toExternal() : this._toInternal(); - - this.update(); - - }, true ); - - } - - _toInternal() { - - if ( this.hasInternalEditor === true ) return; - - if ( this.editorElement === null ) { - - this.editorElement = new CodeEditorElement( this.editorCodeNode.code ); - this.editorElement.addEventListener( 'change', () => { - - this.setSource( this.editorElement.source ); - - this.editorElement.focus(); - - } ); - - this.add( this.editorElement ); - - } - - this.setResizable( true ); - - this.editorElement.setVisible( true ); - - this.hasInternalEditor = true; - - this.update( /*true*/ ); - - } - - _toExternal() { - - if ( this.hasInternalEditor === false ) return; - - this.editorElement.setVisible( false ); - - this.setResizable( false ); - - this.hasInternalEditor = false; - - this.update( /*true*/ ); - - } - - serialize( data ) { - - super.serialize( data ); - - data.layoutJSON = this.layoutJSON; - - } - - deserialize( data ) { - - this.updateLayout( JSON.parse( data.layoutJSON || '{}' ), true ); - - this.waitToLayoutJSON = data.layoutJSON; - - super.deserialize( data ); - - } - -} diff --git a/playground/editors/SliderEditor.js b/playground/editors/SliderEditor.js deleted file mode 100644 index ca7d0ef58d058b..00000000000000 --- a/playground/editors/SliderEditor.js +++ /dev/null @@ -1,67 +0,0 @@ -import { ButtonInput, SliderInput, NumberInput, LabelElement, Element } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { float } from 'three/tsl'; - -export class SliderEditor extends BaseNodeEditor { - - constructor() { - - const node = float( 0 ); - - super( 'Slider', node ); - - this.collapse = true; - - const field = new SliderInput( 0, 0, 1 ).onChange( () => { - - node.value = field.getValue(); - - } ); - - const updateRange = () => { - - const min = minInput.getValue(); - const max = maxInput.getValue(); - - if ( min <= max ) { - - field.setRange( min, max ); - - } else { - - maxInput.setValue( min ); - - } - - }; - - const minInput = new NumberInput().onChange( updateRange ); - const maxInput = new NumberInput( 1 ).onChange( updateRange ); - - const minElement = new LabelElement( 'Min.' ).add( minInput ).setVisible( false ); - const maxElement = new LabelElement( 'Max.' ).add( maxInput ).setVisible( false ); - - const moreElement = new Element().add( new ButtonInput( 'More' ).onClick( () => { - - minElement.setVisible( true ); - maxElement.setVisible( true ); - moreElement.setVisible( false ); - - } ) ).setSerializable( false ); - - this.add( new Element().add( field ) ) - .add( minElement ) - .add( maxElement ) - .add( moreElement ); - - this.onBlur( () => { - - minElement.setVisible( false ); - maxElement.setVisible( false ); - moreElement.setVisible( true ); - - } ); - - } - -} diff --git a/playground/editors/SplitEditor.js b/playground/editors/SplitEditor.js deleted file mode 100644 index 65ddce5b487be7..00000000000000 --- a/playground/editors/SplitEditor.js +++ /dev/null @@ -1,49 +0,0 @@ -import { LabelElement } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { nodeObject, float } from 'three/tsl'; -import { setInputAestheticsFromType, setOutputAestheticsFromType } from '../DataTypeLib.js'; - -export class SplitEditor extends BaseNodeEditor { - - constructor() { - - super( 'Split', null, 175 ); - - let node = null; - - const inputElement = setInputAestheticsFromType( new LabelElement( 'Input' ), 'node' ).onConnect( () => { - - node = inputElement.getLinkedObject(); - - if ( node !== null ) { - - xElement.setObject( nodeObject( node ).x ); - yElement.setObject( nodeObject( node ).y ); - zElement.setObject( nodeObject( node ).z ); - wElement.setObject( nodeObject( node ).w ); - - } else { - - xElement.setObject( float() ); - yElement.setObject( float() ); - zElement.setObject( float() ); - wElement.setObject( float() ); - - } - - } ); - - const xElement = setOutputAestheticsFromType( new LabelElement( 'x | r' ), 'Number' ).setObject( float() ); - const yElement = setOutputAestheticsFromType( new LabelElement( 'y | g' ), 'Number' ).setObject( float() ); - const zElement = setOutputAestheticsFromType( new LabelElement( 'z | b' ), 'Number' ).setObject( float() ); - const wElement = setOutputAestheticsFromType( new LabelElement( 'w | a' ), 'Number' ).setObject( float() ); - - this.add( inputElement ) - .add( xElement ) - .add( yElement ) - .add( zElement ) - .add( wElement ); - - } - -} diff --git a/playground/editors/StandardMaterialEditor.js b/playground/editors/StandardMaterialEditor.js deleted file mode 100644 index 4b76e84f0cb04f..00000000000000 --- a/playground/editors/StandardMaterialEditor.js +++ /dev/null @@ -1,115 +0,0 @@ -import { ColorInput, SliderInput, LabelElement } from 'flow'; -import { MaterialEditor } from './MaterialEditor.js'; -import { MeshStandardNodeMaterial } from 'three/webgpu'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -export class StandardMaterialEditor extends MaterialEditor { - - constructor() { - - const material = new MeshStandardNodeMaterial(); - - super( 'Standard Material', material ); - - const color = setInputAestheticsFromType( new LabelElement( 'color' ), 'Color' ); - const opacity = setInputAestheticsFromType( new LabelElement( 'opacity' ), 'Number' ); - const metalness = setInputAestheticsFromType( new LabelElement( 'metalness' ), 'Number' ); - const roughness = setInputAestheticsFromType( new LabelElement( 'roughness' ), 'Number' ); - const emissive = setInputAestheticsFromType( new LabelElement( 'emissive' ), 'Color' ); - const normal = setInputAestheticsFromType( new LabelElement( 'normal' ), 'Vector3' ); - const position = setInputAestheticsFromType( new LabelElement( 'position' ), 'Vector3' ); - - color.add( new ColorInput( material.color.getHex() ).onChange( ( input ) => { - - material.color.setHex( input.getValue() ); - - } ) ); - - opacity.add( new SliderInput( material.opacity, 0, 1 ).onChange( ( input ) => { - - material.opacity = input.getValue(); - - this.updateTransparent(); - - } ) ); - - metalness.add( new SliderInput( material.metalness, 0, 1 ).onChange( ( input ) => { - - material.metalness = input.getValue(); - - } ) ); - - roughness.add( new SliderInput( material.roughness, 0, 1 ).onChange( ( input ) => { - - material.roughness = input.getValue(); - - } ) ); - - color.onConnect( () => this.update(), true ); - opacity.onConnect( () => this.update(), true ); - metalness.onConnect( () => this.update(), true ); - roughness.onConnect( () => this.update(), true ); - emissive.onConnect( () => this.update(), true ); - normal.onConnect( () => this.update(), true ); - position.onConnect( () => this.update(), true ); - - this.add( color ) - .add( opacity ) - .add( metalness ) - .add( roughness ) - .add( emissive ) - .add( normal ) - .add( position ); - - this.color = color; - this.opacity = opacity; - this.metalness = metalness; - this.roughness = roughness; - this.emissive = emissive; - this.normal = normal; - this.position = position; - - this.update(); - - } - - update() { - - const { material, color, opacity, emissive, roughness, metalness, normal, position } = this; - - color.setEnabledInputs( ! color.getLinkedObject() ); - opacity.setEnabledInputs( ! opacity.getLinkedObject() ); - roughness.setEnabledInputs( ! roughness.getLinkedObject() ); - metalness.setEnabledInputs( ! metalness.getLinkedObject() ); - - material.colorNode = color.getLinkedObject(); - material.opacityNode = opacity.getLinkedObject(); - material.metalnessNode = metalness.getLinkedObject(); - material.roughnessNode = roughness.getLinkedObject(); - material.emissiveNode = emissive.getLinkedObject(); - material.normalNode = normal.getLinkedObject(); - - material.positionNode = position.getLinkedObject(); - - material.dispose(); - - this.updateTransparent(); - - } - - updateTransparent() { - - const { material, opacity } = this; - - const transparent = opacity.getLinkedObject() || material.opacity < 1 ? true : false; - const needsUpdate = transparent !== material.transparent; - - material.transparent = transparent; - - opacity.setIcon( material.transparent ? 'ti ti-layers-intersect' : 'ti ti-layers-subtract' ); - - if ( needsUpdate === true ) material.dispose(); - - } - -} diff --git a/playground/editors/StringEditor.js b/playground/editors/StringEditor.js deleted file mode 100644 index 6cef4421de7bf0..00000000000000 --- a/playground/editors/StringEditor.js +++ /dev/null @@ -1,33 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; - -export class StringEditor extends BaseNodeEditor { - - constructor() { - - const { element, inputNode } = createElementFromJSON( { - inputType: 'string', - inputConnection: false - } ); - - super( 'String', inputNode, 350 ); - - element.addEventListener( 'changeInput', () => this.invalidate() ); - - this.add( element ); - - } - - get stringNode() { - - return this.value; - - } - - getURL() { - - return this.stringNode.value; - - } - -} diff --git a/playground/editors/SwizzleEditor.js b/playground/editors/SwizzleEditor.js deleted file mode 100644 index d80b27fddb2519..00000000000000 --- a/playground/editors/SwizzleEditor.js +++ /dev/null @@ -1,47 +0,0 @@ -import { LabelElement } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; -import { split, float } from 'three/tsl'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -export class SwizzleEditor extends BaseNodeEditor { - - constructor() { - - const node = split( float(), 'x' ); - - super( 'Swizzle', node, 175 ); - - const inputElement = setInputAestheticsFromType( new LabelElement( 'Input' ), 'node' ).onConnect( () => { - - node.node = inputElement.getLinkedObject() || float(); - - } ); - - this.add( inputElement ); - - // - - const { element: componentsElement } = createElementFromJSON( { - inputType: 'String', - allows: 'xyzwrgba', - transform: 'lowercase', - options: [ 'x', 'y', 'z', 'w', 'r', 'g', 'b', 'a' ], - maxLength: 4 - } ); - - componentsElement.addEventListener( 'changeInput', () => { - - const string = componentsElement.value.value; - - node.components = string || 'x'; - - this.invalidate(); - - } ); - - this.add( componentsElement ); - - } - -} diff --git a/playground/editors/TextureEditor.js b/playground/editors/TextureEditor.js deleted file mode 100644 index 881c960d7269f3..00000000000000 --- a/playground/editors/TextureEditor.js +++ /dev/null @@ -1,119 +0,0 @@ -import { LabelElement, ToggleInput, SelectInput } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { onValidNode, onValidType } from '../NodeEditorUtils.js'; -import { texture, uv } from 'three/tsl'; -import { Texture, TextureLoader, RepeatWrapping, ClampToEdgeWrapping, MirroredRepeatWrapping } from 'three'; -import { setInputAestheticsFromType } from '../DataTypeLib.js'; - -const textureLoader = new TextureLoader(); -const defaultTexture = new Texture(); - -let defaultUV = null; - -const getTexture = ( url ) => { - - return textureLoader.load( url ); - -}; - -export class TextureEditor extends BaseNodeEditor { - - constructor() { - - const node = texture( defaultTexture ); - - super( 'Texture', node, 250 ); - - this.texture = null; - - this._initFile(); - this._initParams(); - - this.onValidElement = () => {}; - - } - - _initFile() { - - const fileElement = setInputAestheticsFromType( new LabelElement( 'File' ), 'URL' ); - - fileElement.onValid( onValidType( 'URL' ) ).onConnect( () => { - - const textureNode = this.value; - const fileEditorElement = fileElement.getLinkedElement(); - - this.texture = fileEditorElement ? getTexture( fileEditorElement.node.getURL() ) : null; - - textureNode.value = this.texture || defaultTexture; - - this.update(); - - }, true ); - - this.add( fileElement ); - - } - - _initParams() { - - const uvField = setInputAestheticsFromType( new LabelElement( 'UV' ), 'Vector2' ); - - uvField.onValid( onValidNode ).onConnect( () => { - - const node = this.value; - - node.uvNode = uvField.getLinkedObject() || defaultUV || ( defaultUV = uv() ); - - } ); - - this.wrapSInput = new SelectInput( [ - { name: 'Repeat Wrapping', value: RepeatWrapping }, - { name: 'Clamp To Edge Wrapping', value: ClampToEdgeWrapping }, - { name: 'Mirrored Repeat Wrapping', value: MirroredRepeatWrapping } - ], RepeatWrapping ).onChange( () => { - - this.update(); - - } ); - - this.wrapTInput = new SelectInput( [ - { name: 'Repeat Wrapping', value: RepeatWrapping }, - { name: 'Clamp To Edge Wrapping', value: ClampToEdgeWrapping }, - { name: 'Mirrored Repeat Wrapping', value: MirroredRepeatWrapping } - ], RepeatWrapping ).onChange( () => { - - this.update(); - - } ); - - this.flipYInput = new ToggleInput( false ).onChange( () => { - - this.update(); - - } ); - - this.add( uvField ) - .add( new LabelElement( 'Wrap S' ).add( this.wrapSInput ) ) - .add( new LabelElement( 'Wrap T' ).add( this.wrapTInput ) ) - .add( new LabelElement( 'Flip Y' ).add( this.flipYInput ) ); - - } - - update() { - - const texture = this.texture; - - if ( texture ) { - - texture.wrapS = Number( this.wrapSInput.getValue() ); - texture.wrapT = Number( this.wrapTInput.getValue() ); - texture.flipY = this.flipYInput.getValue(); - texture.dispose(); - - this.invalidate(); - - } - - } - -} diff --git a/playground/editors/TimerEditor.js b/playground/editors/TimerEditor.js deleted file mode 100644 index e94cba1b4ec771..00000000000000 --- a/playground/editors/TimerEditor.js +++ /dev/null @@ -1,58 +0,0 @@ -import { NumberInput, LabelElement, Element, ButtonInput } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { time } from 'three/tsl'; - -export class TimerEditor extends BaseNodeEditor { - - constructor() { - - const node = time; - - super( 'Timer', node, 200 ); - - this.title.setIcon( 'ti ti-clock' ); - - const updateField = () => { - - field.setValue( node.value.toFixed( 3 ) ); - - }; - - const field = new NumberInput().onChange( () => { - - node.value = field.getValue(); - - } ); - - const scaleField = new NumberInput( 1 ).onChange( () => { - - node.scale = scaleField.getValue(); - - } ); - - const moreElement = new Element().add( new ButtonInput( 'Reset' ).onClick( () => { - - node.value = 0; - - updateField(); - - } ) ).setSerializable( false ); - - this.add( new Element().add( field ).setSerializable( false ) ) - .add( new LabelElement( 'Speed' ).add( scaleField ) ) - .add( moreElement ); - - // extends node - - node._update = node.update; - node.update = function ( ...params ) { - - this._update( ...params ); - - updateField(); - - }; - - } - -} diff --git a/playground/editors/UVEditor.js b/playground/editors/UVEditor.js deleted file mode 100644 index bfdc1700f81174..00000000000000 --- a/playground/editors/UVEditor.js +++ /dev/null @@ -1,25 +0,0 @@ -import { SelectInput, LabelElement } from 'flow'; -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { uv } from 'three/tsl'; - -export class UVEditor extends BaseNodeEditor { - - constructor() { - - const node = uv(); - - super( 'UV', node, 200 ); - - const optionsField = new SelectInput( [ '0', '1', '2', '3' ], 0 ).onChange( () => { - - node.index = Number( optionsField.getValue() ); - - this.invalidate(); - - } ); - - this.add( new LabelElement( 'Channel' ).add( optionsField ) ); - - } - -} diff --git a/playground/editors/Vector2Editor.js b/playground/editors/Vector2Editor.js deleted file mode 100644 index d643e8c3c31762..00000000000000 --- a/playground/editors/Vector2Editor.js +++ /dev/null @@ -1,22 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; - -export class Vector2Editor extends BaseNodeEditor { - - constructor() { - - const { element, inputNode } = createElementFromJSON( { - inputType: 'vec2', - inputConnection: false - } ); - - super( 'Vector 2', inputNode ); - - element.addEventListener( 'changeInput', () => this.invalidate() ); - - this.add( element ); - - - } - -} diff --git a/playground/editors/Vector3Editor.js b/playground/editors/Vector3Editor.js deleted file mode 100644 index f74a241c2d1515..00000000000000 --- a/playground/editors/Vector3Editor.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; - -export class Vector3Editor extends BaseNodeEditor { - - constructor() { - - const { element, inputNode } = createElementFromJSON( { - inputType: 'vec3', - inputConnection: false - } ); - - super( 'Vector 3', inputNode, 325 ); - - element.addEventListener( 'changeInput', () => this.invalidate() ); - - this.add( element ); - - } - -} diff --git a/playground/editors/Vector4Editor.js b/playground/editors/Vector4Editor.js deleted file mode 100644 index e57ec6cf21d057..00000000000000 --- a/playground/editors/Vector4Editor.js +++ /dev/null @@ -1,21 +0,0 @@ -import { BaseNodeEditor } from '../BaseNodeEditor.js'; -import { createElementFromJSON } from '../NodeEditorUtils.js'; - -export class Vector4Editor extends BaseNodeEditor { - - constructor() { - - const { element, inputNode } = createElementFromJSON( { - inputType: 'vec4', - inputConnection: false - } ); - - super( 'Vector 4', inputNode, 350 ); - - element.addEventListener( 'changeInput', () => this.invalidate() ); - - this.add( element ); - - } - -} diff --git a/playground/elements/CodeEditorElement.js b/playground/elements/CodeEditorElement.js deleted file mode 100644 index fee1ea57e3f18d..00000000000000 --- a/playground/elements/CodeEditorElement.js +++ /dev/null @@ -1,99 +0,0 @@ -import { Element, LoaderLib } from 'flow'; - -export class CodeEditorElement extends Element { - - constructor( source = '' ) { - - super(); - - this.updateInterval = 500; - - this._source = source; - - this.dom.style[ 'z-index' ] = - 1; - this.dom.classList.add( 'no-zoom' ); - - this.setHeight( 500 ); - - const editorDOM = document.createElement( 'div' ); - editorDOM.style.width = '100%'; - editorDOM.style.height = '100%'; - this.dom.appendChild( editorDOM ); - - this.editor = null; // async - - window.require.config( { paths: { 'vs': 'https://cdn.jsdelivr.net/npm/monaco-editor@0.52.2/min/vs' } } ); - - require( [ 'vs/editor/editor.main' ], () => { - - this.editor = window.monaco.editor.create( editorDOM, { - value: this.source, - language: 'javascript', - theme: 'vs-dark', - automaticLayout: true, - minimap: { enabled: false } - } ); - - let timeout = null; - - this.editor.getModel().onDidChangeContent( () => { - - this._source = this.editor.getValue(); - - if ( timeout ) clearTimeout( timeout ); - - timeout = setTimeout( () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }, this.updateInterval ); - - } ); - - } ); - - } - - set source( value ) { - - if ( this._source === value ) return; - - this._source = value; - - if ( this.editor ) this.editor.setValue( value ); - - this.dispatchEvent( new Event( 'change' ) ); - - } - - get source() { - - return this._source; - - } - - focus() { - - if ( this.editor ) this.editor.focus(); - - } - - serialize( data ) { - - super.serialize( data ); - - data.source = this.source; - - } - - deserialize( data ) { - - super.deserialize( data ); - - this.source = data.source || ''; - - } - -} - -LoaderLib[ 'CodeEditorElement' ] = CodeEditorElement; diff --git a/playground/examples/basic/fresnel.json b/playground/examples/basic/fresnel.json deleted file mode 100644 index f470eb616784ee..00000000000000 --- a/playground/examples/basic/fresnel.json +++ /dev/null @@ -1 +0,0 @@ -{"objects":{"72":{"x":1534,"y":591,"elements":[73,75],"autoResize":true,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshBasicMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":72,"type":"NodePrototypeEditor"},"73":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":73,"type":"TitleElement"},"75":{"height":758,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshBasicMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":75,"type":"CodeEditorElement"},"78":{"x":1346,"y":362,"elements":[79,145],"autoResize":false,"layoutJSON":"{\"name\":\"Teapot Scene\",\"width\":300,\"elements\":[{\"name\":\"Material\",\"inputType\":\"Material\"}]}","id":78,"type":"Teapot Scene"},"79":{"height":null,"title":"Teapot Scene","icon":"ti ti-ti ti-variable","id":79,"type":"TitleElement"},"84":{"x":840,"y":323,"elements":[85,87,88,89],"autoResize":false,"id":84,"type":"BasicMaterialEditor"},"85":{"outputLength":1,"height":null,"title":"Basic Material","icon":"ti ti-ti ti-circle","id":85,"type":"TitleElement"},"87":{"inputLength":3,"inputs":[90],"links":[333],"height":null,"id":87,"type":"LabelElement"},"88":{"inputLength":1,"inputs":[91],"height":null,"id":88,"type":"LabelElement"},"89":{"inputLength":3,"height":null,"id":89,"type":"LabelElement"},"90":{"value":16777215,"id":90,"type":"ColorInput"},"91":{"min":0,"max":1,"value":1,"id":91,"type":"SliderInput"},"145":{"inputLength":1,"links":[85],"height":null,"id":145,"type":"LabelElement"},"146":{"x":2110,"y":592,"elements":[147,149],"autoResize":true,"source":"// Simple Fresnel\n// Enjoy! :)\n\n// layout must be the first variable.\n\nlayout = {\n\tname: \"Fresnel\",\n\toutputType: 'node',\n\ticon: 'angle',\n\twidth: 200,\n\telements: [\n\t\t{ name: 'Color A', inputType: 'node' },\n\t\t{ name: 'Color B', inputType: 'node' },\n\t\t{ name: 'Fresnel Factor', inputType: 'node' },\n\t]\n};\n\n// THREE and TSL (Three.js Shading Language) namespaces are available.\n\nconst { color, float, dot, vec3, normalView } = TSL;\n\nfunction main() {\n\n\tconst colorA = parameters.get( 'Color A' ) || color( 0xff0000 );\n\tconst colorB = parameters.get( 'Color B' ) || float( 0x0000ff );\n\tconst fresnelFactor = parameters.get( 'Fresnel Factor' ) || float( 1.3 );\n\n\tconst fresnel = dot( normalView, vec3( 0, 0, 1 ) ).oneMinus().pow( fresnelFactor );\n\n\treturn fresnel.mix( colorA, colorB );\n\n}\n","id":146,"type":"NodePrototypeEditor"},"147":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":147,"type":"TitleElement"},"149":{"height":500,"source":"// Simple Fresnel\n// Enjoy! :)\n\n// layout must be the first variable.\n\nlayout = {\n\tname: \"Fresnel\",\n\toutputType: 'node',\n\ticon: 'angle',\n\twidth: 200,\n\telements: [\n\t\t{ name: 'Color A', inputType: 'node' },\n\t\t{ name: 'Color B', inputType: 'node' },\n\t\t{ name: 'Fresnel Factor', inputType: 'node' },\n\t]\n};\n\n// THREE and TSL (Three.js Shading Language) namespaces are available.\n\nconst { color, float, dot, vec3, normalView } = TSL;\n\nfunction main() {\n\n\tconst colorA = parameters.get( 'Color A' ) || color( 0xff0000 );\n\tconst colorB = parameters.get( 'Color B' ) || float( 0x0000ff );\n\tconst fresnelFactor = parameters.get( 'Fresnel Factor' ) || float( 1.3 );\n\n\tconst fresnel = dot( normalView, vec3( 0, 0, 1 ) ).oneMinus().pow( fresnelFactor );\n\n\treturn fresnel.mix( colorA, colorB );\n\n}\n","id":149,"type":"CodeEditorElement"},"332":{"x":478,"y":323,"elements":[333,335,336,337],"autoResize":false,"layoutJSON":"{\"name\":\"Fresnel\",\"outputType\":\"node\",\"icon\":\"angle\",\"width\":200,\"elements\":[{\"name\":\"Color A\",\"inputType\":\"node\"},{\"name\":\"Color B\",\"inputType\":\"node\"},{\"name\":\"Fresnel Factor\",\"inputType\":\"node\"}]}","id":332,"type":"Fresnel"},"333":{"outputLength":1,"height":null,"title":"Fresnel","icon":"ti ti-angle","id":333,"type":"TitleElement"},"335":{"inputLength":1,"links":[520],"height":null,"id":335,"type":"LabelElement"},"336":{"inputLength":1,"links":[339],"height":null,"id":336,"type":"LabelElement"},"337":{"inputLength":1,"links":[703],"height":null,"id":337,"type":"LabelElement"},"338":{"x":-62,"y":359,"elements":[339,346,347,348],"autoResize":false,"id":338,"type":"ColorEditor"},"339":{"outputLength":3,"height":null,"title":"Color","icon":"ti ti-ti ti-palette","id":339,"type":"TitleElement"},"341":{"value":16711680,"id":341,"type":"ColorInput"},"342":{"value":"#FF0000","id":342,"type":"StringInput"},"343":{"min":0,"max":1,"step":0.01,"value":1,"id":343,"type":"NumberInput"},"344":{"min":0,"max":1,"step":0.01,"value":0,"id":344,"type":"NumberInput"},"345":{"min":0,"max":1,"step":0.01,"value":0,"id":345,"type":"NumberInput"},"346":{"inputs":[341],"height":null,"id":346,"type":"Element"},"347":{"inputs":[342],"height":null,"id":347,"type":"LabelElement"},"348":{"inputs":[343,344,345],"height":null,"id":348,"type":"LabelElement"},"519":{"x":-59,"y":191,"elements":[520,527,528,529],"autoResize":false,"id":519,"type":"ColorEditor"},"520":{"outputLength":3,"height":null,"title":"Color","icon":"ti ti-ti ti-palette","id":520,"type":"TitleElement"},"522":{"value":34047,"id":522,"type":"ColorInput"},"523":{"value":"#0084FF","id":523,"type":"StringInput"},"524":{"min":0,"max":1,"step":0.01,"value":0,"id":524,"type":"NumberInput"},"525":{"min":0,"max":1,"step":0.01,"value":0.518,"id":525,"type":"NumberInput"},"526":{"min":0,"max":1,"step":0.01,"value":1,"id":526,"type":"NumberInput"},"527":{"inputs":[522],"height":null,"id":527,"type":"Element"},"528":{"inputs":[523],"height":null,"id":528,"type":"LabelElement"},"529":{"inputs":[524,525,526],"height":null,"id":529,"type":"LabelElement"},"700":{"inputs":[701],"height":null,"id":700,"type":"Element"},"701":{"value":1.7,"id":701,"type":"NumberInput"},"702":{"x":75,"y":530,"elements":[703,700],"autoResize":false,"id":702,"type":"FloatEditor"},"703":{"outputLength":1,"height":null,"title":"Float","icon":"ti ti-ti ti-box-multiple-1","id":703,"type":"TitleElement"}},"nodes":[72,84,146,338,519,702,78,332],"id":2,"type":"Canvas"} \ No newline at end of file diff --git a/playground/examples/basic/matcap.json b/playground/examples/basic/matcap.json deleted file mode 100644 index 8a3c6d6eb220bb..00000000000000 --- a/playground/examples/basic/matcap.json +++ /dev/null @@ -1 +0,0 @@ -{"objects":{"18":{"x":1534,"y":591,"elements":[19,21],"autoResize":true,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshBasicMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":18,"type":"NodePrototypeEditor"},"19":{"outputLength":1,"height":null,"title":"Node Prototype","id":19,"type":"TitleElement"},"21":{"height":758,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshBasicMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":21,"type":"CodeEditorElement"},"24":{"x":1346,"y":362,"elements":[25,67],"autoResize":false,"layoutJSON":"{\"name\":\"Teapot Scene\",\"width\":300,\"elements\":[{\"name\":\"Material\",\"inputType\":\"Material\"}]}","id":24,"type":"Teapot Scene"},"25":{"height":null,"title":"Teapot Scene","id":25,"type":"TitleElement"},"67":{"inputLength":1,"links":[72],"height":null,"id":67,"type":"LabelElement"},"71":{"x":840,"y":323,"elements":[72,74,75,76],"autoResize":false,"id":71,"type":"BasicMaterialEditor"},"72":{"outputLength":1,"height":null,"title":"Basic Material","id":72,"type":"TitleElement"},"74":{"inputLength":3,"inputs":[77],"links":[107],"height":null,"id":74,"type":"LabelElement"},"75":{"inputLength":1,"inputs":[78],"height":null,"id":75,"type":"LabelElement"},"76":{"inputLength":3,"height":null,"id":76,"type":"LabelElement"},"77":{"value":16777215,"id":77,"type":"ColorInput"},"78":{"min":0,"max":1,"value":1,"id":78,"type":"SliderInput"},"80":{"x":-332,"y":264,"elements":[81,84],"autoResize":false,"buffer":"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AAAAAAAAAAAAUnNsdFVudEYjUHhsQFIAAAAAAAAAAAAKdmVjdG9yRGF0YWJvb2wBAAAAAFBnUHNlbnVtAAAAAFBnUHMAAAAAUGdQQwAAAABMZWZ0VW50RiNSbHQAAAAAAAAAAAAAAABUb3AgVW50RiNSbHQAAAAAAAAAAAAAAABTY2wgVW50RiNQcmNAWQAAAAAAAAAAABBjcm9wV2hlblByaW50aW5nYm9vbAAAAAAOY3JvcFJlY3RCb3R0b21sb25nAAAAAAAAAAxjcm9wUmVjdExlZnRsb25nAAAAAAAAAA1jcm9wUmVjdFJpZ2h0bG9uZwAAAAAAAAALY3JvcFJlY3RUb3Bsb25nAAAAAAA4QklNA+0AAAAAABAASAAAAAEAAQBIAAAAAQABOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNBA0AAAAAAAQAAAAeOEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNJxAAAAAAAAoAAQAAAAAAAAABOEJJTQP1AAAAAABIAC9mZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAABAC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0ECAAAAAAAEAAAAAEAAAJAAAACQAAAAAA4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAAM9AAAABgAAAAAAAAAAAAACAAAAAgAAAAAEAGEALQA0ADUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHNPYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAAAAQnRvbWxvbmcAAAIAAAAAAFJnaHRsb25nAAACAAAAAAZzbGljZXNW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ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAxMi0wNi0yM1QwNjoyODozOC0wNDowMCIgeG1wOk1vZGlmeURhdGU9IjIwMTYtMDMtMTNUMjE6MDE6MjYtMDQ6MDAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMTYtMDMtMTNUMjE6MDE6MjYtMDQ6MDAiIGRjOmZvcm1hdD0iaW1hZ2UvanBlZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkIzNDk3MjIyODBFOUU1MTE4NkRCOEJCQTc4M0ZEMzcyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkIyNDk3MjIyODBFOUU1MTE4NkRCOEJCQTc4M0ZEMzcyIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6QjI0OTcyMjI4MEU5RTUxMTg2REI4QkJBNzgzRkQzNzIiPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOkIyNDk3MjIyODBFOUU1MTE4NkRCOEJCQTc4M0ZEMzcyIiBzdEV2dDp3aGVuPSIyMDEyLTA2LTIzVDA2OjI4OjM4LTA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGltYWdlL2JtcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpCMzQ5NzIyMjgwRTlFNTExODZEQjhCQkE3ODNGRDM3MiIgc3RFdnQ6d2hlbj0iMjAxNi0wMy0xM1QyMTowMToyNi0wNDowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9InciPz7/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAA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","name":"matcap-porcelain-white.jpg","id":80,"type":"FileEditor"},"81":{"outputLength":1,"height":null,"title":"File","id":81,"type":"TitleElement"},"83":{"value":"matcap-porcelain-white.jpg","id":83,"type":"StringInput"},"84":{"inputs":[83],"height":null,"id":84,"type":"Element"},"85":{"x":-379,"y":487,"elements":[86],"autoResize":false,"id":85,"type":"MatcapUV"},"86":{"outputLength":1,"height":null,"title":"Matcap UV","icon":"ti ti-chart-treemap","id":86,"type":"TitleElement"},"91":{"x":89,"y":339,"elements":[92,94,95,99,100,101],"autoResize":false,"id":91,"type":"TextureEditor"},"92":{"outputLength":4,"height":null,"title":"Texture","id":92,"type":"TitleElement"},"94":{"inputLength":1,"links":[81],"height":null,"id":94,"type":"LabelElement"},"95":{"inputLength":2,"links":[86],"height":null,"id":95,"type":"LabelElement"},"96":{"options":[{"name":"Repeat Wrapping","value":1000},{"name":"Clamp To Edge Wrapping","value":1001},{"name":"Mirrored Repeat Wrapping","value":1002}],"value":"1000","id":96,"type":"SelectInput"},"97":{"options":[{"name":"Repeat Wrapping","value":1000},{"name":"Clamp To Edge Wrapping","value":1001},{"name":"Mirrored Repeat Wrapping","value":1002}],"value":"1000","id":97,"type":"SelectInput"},"98":{"value":false,"id":98,"type":"ToggleInput"},"99":{"inputs":[96],"height":null,"id":99,"type":"LabelElement"},"100":{"inputs":[97],"height":null,"id":100,"type":"LabelElement"},"101":{"inputs":[98],"height":null,"id":101,"type":"LabelElement"},"102":{"inputLength":1,"inputs":[103],"links":[92],"height":null,"id":102,"type":"LabelElement"},"103":{"value":0,"id":103,"type":"NumberInput"},"104":{"inputLength":1,"inputs":[105],"height":null,"id":104,"type":"LabelElement"},"105":{"value":0.68,"id":105,"type":"NumberInput"},"106":{"x":442,"y":319,"elements":[107,102,104],"autoResize":false,"id":106,"type":"Multiply"},"107":{"outputLength":1,"height":null,"title":"Multiply","icon":"ti ti-x","id":107,"type":"TitleElement"}},"nodes":[18,71,80,85,91,106,24],"id":2,"type":"Canvas"} \ No newline at end of file diff --git a/playground/examples/basic/particles.json b/playground/examples/basic/particles.json deleted file mode 100644 index 3fed9d2e257a0a..00000000000000 --- a/playground/examples/basic/particles.json +++ /dev/null @@ -1 +0,0 @@ -{"objects":{"71":{"x":2705,"y":459,"elements":[72,74],"autoResize":true,"source":"layout = {\n\tname: 'Emiter',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'count', inputType: 'Number' },\n\t\t{ name: 'color', inputType: 'node' },\n\t\t{ name: 'opacity', inputType: 'node' },\n\t\t{ name: 'position', inputType: 'node' },\n\t\t{ name: 'rotation', inputType: 'node' },\n\t\t{ name: 'scale', inputType: 'node' }\n\t]\n};\n\nfunction load() {\n\n\tconst fireNodeMaterial = new THREE.SpriteNodeMaterial();\n\tfireNodeMaterial.blending = THREE.AdditiveBlending;\n\tfireNodeMaterial.transparent = true;\n\tfireNodeMaterial.depthWrite = false;\n\n\tconst fireInstancedSprite = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1 ), fireNodeMaterial );\n\tfireInstancedSprite.isInstancedMesh = true;\n\tfireInstancedSprite.count = 100;\n\n\treturn fireInstancedSprite;\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.count = Math.round( parameters.get( 'count' ) || 1 );\n\n\t\tmesh.material.colorNode = parameters.get( 'color' );\n\t\tmesh.material.opacityNode = parameters.get( 'opacity' );\n\t\tmesh.material.positionNode = parameters.get( 'position' );\n\t\tmesh.material.rotationNode = parameters.get( 'rotation' );\n\t\tmesh.material.scaleNode = parameters.get( 'scale' );\n\t\tmesh.material.dispose();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":71,"type":"NodePrototypeEditor"},"72":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":72,"type":"TitleElement"},"74":{"height":969,"source":"layout = {\n\tname: 'Emiter',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'count', inputType: 'Number' },\n\t\t{ name: 'color', inputType: 'node' },\n\t\t{ name: 'opacity', inputType: 'node' },\n\t\t{ name: 'position', inputType: 'node' },\n\t\t{ name: 'rotation', inputType: 'node' },\n\t\t{ name: 'scale', inputType: 'node' }\n\t]\n};\n\nfunction load() {\n\n\tconst fireNodeMaterial = new THREE.SpriteNodeMaterial();\n\tfireNodeMaterial.blending = THREE.AdditiveBlending;\n\tfireNodeMaterial.transparent = true;\n\tfireNodeMaterial.depthWrite = false;\n\n\tconst fireInstancedSprite = new THREE.Mesh( new THREE.PlaneGeometry( 1, 1 ), fireNodeMaterial );\n\tfireInstancedSprite.isInstancedMesh = true;\n\tfireInstancedSprite.count = 100;\n\n\treturn fireInstancedSprite;\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.count = Math.round( parameters.get( 'count' ) || 1 );\n\n\t\tmesh.material.colorNode = parameters.get( 'color' );\n\t\tmesh.material.opacityNode = parameters.get( 'opacity' );\n\t\tmesh.material.positionNode = parameters.get( 'position' );\n\t\tmesh.material.rotationNode = parameters.get( 'rotation' );\n\t\tmesh.material.scaleNode = parameters.get( 'scale' );\n\t\tmesh.material.dispose();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":74,"type":"CodeEditorElement"},"77":{"x":2824,"y":-88,"elements":[78,282,284,285,286,287,288],"autoResize":false,"layoutJSON":"{\"name\":\"Emiter\",\"width\":300,\"elements\":[{\"name\":\"count\",\"inputType\":\"Number\"},{\"name\":\"color\",\"inputType\":\"node\"},{\"name\":\"opacity\",\"inputType\":\"node\"},{\"name\":\"position\",\"inputType\":\"node\"},{\"name\":\"rotation\",\"inputType\":\"node\"},{\"name\":\"scale\",\"inputType\":\"node\"}]}","id":77,"type":"Emiter"},"78":{"height":null,"title":"Emiter","icon":"ti ti-ti ti-variable","id":78,"type":"TitleElement"},"92":{"inputs":[93,94,95],"height":null,"id":92,"type":"Element"},"93":{"value":3,"id":93,"type":"NumberInput"},"94":{"value":3,"id":94,"type":"NumberInput"},"95":{"value":3,"id":95,"type":"NumberInput"},"96":{"x":270,"y":87,"elements":[97,92],"autoResize":false,"id":96,"type":"Vector3Editor"},"97":{"outputLength":3,"height":null,"title":"Vector 3","icon":"ti ti-ti ti-box-multiple-3","id":97,"type":"TitleElement"},"102":{"inputLength":1,"links":[117],"height":null,"id":102,"type":"LabelElement"},"103":{"inputLength":1,"links":[97],"height":null,"id":103,"type":"LabelElement"},"104":{"x":860,"y":-93,"elements":[105,102,103],"autoResize":false,"id":104,"type":"Range"},"105":{"outputLength":1,"height":null,"title":"Range","icon":"ti ti-sort-ascending-2","id":105,"type":"TitleElement"},"112":{"inputs":[113,114,115],"height":null,"id":112,"type":"Element"},"113":{"value":-3,"id":113,"type":"NumberInput"},"114":{"value":-3,"id":114,"type":"NumberInput"},"115":{"value":-3,"id":115,"type":"NumberInput"},"116":{"x":256,"y":-136,"elements":[117,112],"autoResize":false,"id":116,"type":"Vector3Editor"},"117":{"outputLength":3,"height":null,"title":"Vector 3","icon":"ti ti-ti ti-box-multiple-3","id":117,"type":"TitleElement"},"120":{"x":735,"y":90,"elements":[121,127,128,125],"autoResize":false,"id":120,"type":"TimerEditor"},"121":{"outputLength":1,"height":null,"title":"Timer","icon":"ti ti-clock","id":121,"type":"TitleElement"},"123":{"value":13.595,"id":123,"type":"NumberInput"},"124":{"value":1,"id":124,"type":"NumberInput"},"125":{"inputs":[126],"height":null,"id":125,"type":"Element"},"126":{"value":"Reset","id":126,"type":"ButtonInput"},"127":{"inputs":[123],"height":null,"id":127,"type":"Element"},"128":{"inputs":[124],"height":null,"id":128,"type":"LabelElement"},"140":{"inputLength":1,"inputs":[141],"links":[105],"height":null,"id":140,"type":"LabelElement"},"141":{"value":0,"id":141,"type":"NumberInput"},"142":{"inputLength":1,"inputs":[143],"links":[165],"height":null,"id":142,"type":"LabelElement"},"143":{"value":0,"id":143,"type":"NumberInput"},"144":{"x":1621,"y":77,"elements":[145,140,142],"autoResize":false,"id":144,"type":"Multiply"},"145":{"outputLength":1,"height":null,"title":"Multiply","icon":"ti ti-x","id":145,"type":"TitleElement"},"151":{"inputLength":1,"links":[209],"height":null,"id":151,"type":"LabelElement"},"152":{"inputLength":1,"links":[201],"height":null,"id":152,"type":"LabelElement"},"153":{"inputLength":1,"links":[217],"height":null,"id":153,"type":"LabelElement"},"154":{"x":1819,"y":301,"elements":[155,151,152,153],"autoResize":false,"id":154,"type":"Mix"},"155":{"outputLength":1,"height":null,"title":"Mix","icon":"ti ti-math-function","id":155,"type":"TitleElement"},"161":{"inputLength":1,"links":[121],"height":null,"id":161,"type":"LabelElement"},"162":{"inputLength":1,"inputs":[163],"links":[225],"height":null,"id":162,"type":"LabelElement"},"163":{"value":2.63,"id":163,"type":"NumberInput"},"164":{"x":1148,"y":167,"elements":[165,161,162],"autoResize":false,"id":164,"type":"Modulo"},"165":{"outputLength":1,"height":null,"title":"Modulo","icon":"ti ti-math-function","id":165,"type":"TitleElement"},"168":{"x":1600,"y":-374,"elements":[169,172],"autoResize":false,"buffer":"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","name":"Lovepik_com-611645078-Particle light effect.png","id":168,"type":"FileEditor"},"169":{"outputLength":1,"height":null,"title":"File","id":169,"type":"TitleElement"},"171":{"value":"Lovepik_com-611645078-Particle light effect.png","id":171,"type":"StringInput"},"172":{"inputs":[171],"height":null,"id":172,"type":"Element"},"176":{"x":1964,"y":-160,"elements":[177,179,180,184,185,186],"autoResize":false,"id":176,"type":"TextureEditor"},"177":{"outputLength":4,"height":null,"title":"Texture","icon":"ti ti-ti ti-photo","id":177,"type":"TitleElement"},"179":{"inputLength":1,"links":[169],"height":null,"id":179,"type":"LabelElement"},"180":{"inputLength":2,"height":null,"id":180,"type":"LabelElement"},"181":{"options":[{"name":"Repeat Wrapping","value":1000},{"name":"Clamp To Edge Wrapping","value":1001},{"name":"Mirrored Repeat Wrapping","value":1002}],"value":"1000","id":181,"type":"SelectInput"},"182":{"options":[{"name":"Repeat Wrapping","value":1000},{"name":"Clamp To Edge Wrapping","value":1001},{"name":"Mirrored Repeat Wrapping","value":1002}],"value":"1000","id":182,"type":"SelectInput"},"183":{"value":false,"id":183,"type":"ToggleInput"},"184":{"inputs":[181],"height":null,"id":184,"type":"LabelElement"},"185":{"inputs":[182],"height":null,"id":185,"type":"LabelElement"},"186":{"inputs":[183],"height":null,"id":186,"type":"LabelElement"},"198":{"inputs":[199],"height":null,"id":198,"type":"Element"},"199":{"value":0,"id":199,"type":"NumberInput"},"200":{"x":1248,"y":450,"elements":[201,198],"autoResize":false,"id":200,"type":"FloatEditor"},"201":{"outputLength":1,"height":null,"title":"Float","icon":"ti ti-ti ti-box-multiple-1","id":201,"type":"TitleElement"},"206":{"inputs":[207],"height":null,"id":206,"type":"Element"},"207":{"value":1.62,"id":207,"type":"NumberInput"},"208":{"x":1255,"y":342,"elements":[209,206],"autoResize":false,"id":208,"type":"FloatEditor"},"209":{"outputLength":1,"height":null,"title":"Float","icon":"ti ti-ti ti-box-multiple-1","id":209,"type":"TitleElement"},"214":{"inputLength":1,"links":[165],"height":null,"id":214,"type":"LabelElement"},"215":{"inputLength":1,"links":[225],"height":null,"id":215,"type":"LabelElement"},"216":{"x":1498,"y":538,"elements":[217,214,215],"autoResize":false,"id":216,"type":"Division"},"217":{"outputLength":1,"height":null,"title":"Division","icon":"ti ti-divide","id":217,"type":"TitleElement"},"222":{"inputs":[223],"height":null,"id":222,"type":"Element"},"223":{"value":2.79,"id":223,"type":"NumberInput"},"224":{"x":641,"y":528,"elements":[225,222],"autoResize":false,"id":224,"type":"FloatEditor"},"225":{"outputLength":1,"height":null,"title":"Float","icon":"ti ti-ti ti-box-multiple-1","id":225,"type":"TitleElement"},"230":{"inputLength":1,"height":null,"id":230,"type":"LabelElement"},"231":{"inputLength":1,"links":[241],"height":null,"id":231,"type":"LabelElement"},"232":{"x":2129,"y":-557,"elements":[233,230,231],"autoResize":false,"id":232,"type":"Range"},"233":{"outputLength":1,"height":null,"title":"Range","icon":"ti ti-sort-ascending-2","id":233,"type":"TitleElement"},"238":{"inputs":[239],"height":null,"id":238,"type":"Element"},"239":{"value":1,"id":239,"type":"NumberInput"},"240":{"x":1895,"y":-506,"elements":[241,238],"autoResize":false,"id":240,"type":"FloatEditor"},"241":{"outputLength":1,"height":null,"title":"Float","icon":"ti ti-ti ti-box-multiple-1","id":241,"type":"TitleElement"},"248":{"inputLength":1,"inputs":[249],"links":[233],"height":null,"id":248,"type":"LabelElement"},"249":{"value":0,"id":249,"type":"NumberInput"},"250":{"inputLength":1,"inputs":[251],"links":[272],"height":null,"id":250,"type":"LabelElement"},"251":{"value":0,"id":251,"type":"NumberInput"},"252":{"x":2527,"y":-425,"elements":[253,248,250],"autoResize":false,"id":252,"type":"Multiply"},"253":{"outputLength":1,"height":null,"title":"Multiply","icon":"ti ti-x","id":253,"type":"TitleElement"},"267":{"inputLength":1,"inputs":[268],"links":[165],"height":null,"id":267,"type":"LabelElement"},"268":{"value":0,"id":268,"type":"NumberInput"},"269":{"inputLength":1,"inputs":[270],"height":null,"id":269,"type":"LabelElement"},"270":{"value":10,"id":270,"type":"NumberInput"},"271":{"x":2122,"y":-371,"elements":[272,267,269],"autoResize":false,"id":271,"type":"Multiply"},"272":{"outputLength":1,"height":null,"title":"Multiply","icon":"ti ti-x","id":272,"type":"TitleElement"},"282":{"inputLength":1,"inputs":[283],"height":null,"id":282,"type":"LabelElement"},"283":{"value":500,"id":283,"type":"NumberInput"},"284":{"inputLength":1,"links":[177],"height":null,"id":284,"type":"LabelElement"},"285":{"inputLength":1,"height":null,"id":285,"type":"LabelElement"},"286":{"inputLength":1,"links":[145],"height":null,"id":286,"type":"LabelElement"},"287":{"inputLength":1,"links":[253],"height":null,"id":287,"type":"LabelElement"},"288":{"inputLength":1,"links":[155],"height":null,"id":288,"type":"LabelElement"}},"nodes":[71,96,104,116,120,144,154,164,168,176,200,208,216,224,232,240,252,271,77],"id":2,"type":"Canvas"} diff --git a/playground/examples/basic/teapot.json b/playground/examples/basic/teapot.json deleted file mode 100644 index 4114efd6150844..00000000000000 --- a/playground/examples/basic/teapot.json +++ /dev/null @@ -1 +0,0 @@ -{"objects":{"71":{"x":1534,"y":591,"elements":[72,74],"autoResize":true,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { HDRCubeTextureLoader } = await import( 'three/addons/loaders/HDRCubeTextureLoader.js' );\n\n\t\tconst hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];\n\n\t\tconst cubeMap = await new HDRCubeTextureLoader()\n\t\t\t.setPath( '../examples/textures/cube/pisaHDR/' )\n\t\t\t.loadAsync( hdrUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":71,"type":"NodePrototypeEditor"},"72":{"outputLength":1,"height":null,"title":"Node Prototype","icon":"ti ti-ti ti-components","id":72,"type":"TitleElement"},"74":{"height":507,"source":"layout = {\n\tname: 'Teapot Scene',\n\twidth: 300,\n\telements: [\n\t\t{ name: 'Material', inputType: 'Material' }\n\t]\n};\n\nfunction load() {\n\n\tasync function asyncLoad() {\n\n\t\tconst { HDRCubeTextureLoader } = await import( 'three/addons/loaders/HDRCubeTextureLoader.js' );\n\n\t\tconst hdrUrls = [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ];\n\n\t\tconst cubeMap = await new HDRCubeTextureLoader()\n\t\t\t.setPath( '../examples/textures/cube/pisaHDR/' )\n\t\t\t.loadAsync( hdrUrls );\n\n\t\tcubeMap.generateMipmaps = true;\n\t\tcubeMap.minFilter = THREE.LinearMipmapLinearFilter;\n\n\t\t//\n\n\t\tconst scene = global.get( 'scene' );\n\n\t\tscene.environment = cubeMap;\n\n\t\t//\n\n\t\tconst { TeapotGeometry } = await import( 'three/addons/geometries/TeapotGeometry.js' );\n\n\t\tconst geometryTeapot = new TeapotGeometry( 1, 18 );\n\t\tconst mesh = new THREE.Mesh( geometryTeapot );\n\n\t\tlocal.set( 'mesh', mesh );\n\n\t\trefresh();\n\n\t}\n\n\tasyncLoad();\n\n}\n\nfunction main() {\n\n\tconst mesh = local.get( 'mesh', load );\n\n\tif ( mesh ) {\n\n\t\tmesh.material = parameters.get( 'Material' ) || new THREE.MeshStandardMaterial();\n\n\t}\n\n\treturn mesh;\n\n}\n","id":74,"type":"CodeEditorElement"},"77":{"x":1346,"y":362,"elements":[78,120],"autoResize":false,"layoutJSON":"{\"name\":\"Teapot Scene\",\"width\":300,\"elements\":[{\"name\":\"Material\",\"inputType\":\"Material\"}]}","id":77,"type":"Teapot Scene"},"78":{"outputLength":1,"height":null,"title":"Teapot Scene","icon":"ti ti-ti ti-variable","id":78,"type":"TitleElement"},"82":{"x":750,"y":240,"elements":[83,85,86,87,88,89,90,91],"autoResize":false,"id":82,"type":"StandardMaterialEditor"},"83":{"outputLength":1,"height":null,"title":"Standard Material","icon":"ti ti-ti ti-inner-shadow-top-left","id":83,"type":"TitleElement"},"85":{"inputLength":3,"inputs":[92],"links":[115],"height":null,"id":85,"type":"LabelElement"},"86":{"inputLength":1,"inputs":[93],"height":null,"id":86,"type":"LabelElement"},"87":{"inputLength":1,"inputs":[95],"height":null,"id":87,"type":"LabelElement"},"88":{"inputLength":1,"inputs":[97],"height":null,"id":88,"type":"LabelElement"},"89":{"inputLength":3,"height":null,"id":89,"type":"LabelElement"},"90":{"inputLength":3,"height":null,"id":90,"type":"LabelElement"},"91":{"inputLength":3,"height":null,"id":91,"type":"LabelElement"},"92":{"value":15860226,"id":92,"type":"ColorInput"},"93":{"min":0,"max":1,"value":1,"id":93,"type":"SliderInput"},"95":{"min":0,"max":1,"value":1,"id":95,"type":"SliderInput"},"97":{"min":0,"max":1,"value":0,"id":97,"type":"SliderInput"},"114":{"x":140,"y":405,"elements":[115],"autoResize":false,"id":114,"type":"NormalWorld"},"115":{"outputLength":3,"height":null,"title":"Normal World","icon":"ti ti-arrow-bar-up","id":115,"type":"TitleElement"},"120":{"inputLength":1,"links":[83],"height":null,"id":120,"type":"LabelElement"}},"nodes":[71,82,114,77],"id":2,"type":"Canvas"} \ No newline at end of file diff --git a/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff b/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff deleted file mode 100644 index a96746c5f47fa0..00000000000000 Binary files a/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff and /dev/null differ diff --git a/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 b/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 deleted file mode 100644 index 9908e32378c9a7..00000000000000 Binary files a/playground/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 and /dev/null differ diff --git a/playground/fonts/open-sans/open-sans.css b/playground/fonts/open-sans/open-sans.css deleted file mode 100644 index 0c1e68f98a327b..00000000000000 --- a/playground/fonts/open-sans/open-sans.css +++ /dev/null @@ -1,9 +0,0 @@ -/* open-sans-regular - cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans Regular'), local('OpenSans-Regular'), - url('./open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ - url('./open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ -} \ No newline at end of file diff --git a/playground/fonts/tabler-icons/fonts/tabler-icons.eot b/playground/fonts/tabler-icons/fonts/tabler-icons.eot deleted file mode 100644 index 2533b0e8f1ddcf..00000000000000 Binary files a/playground/fonts/tabler-icons/fonts/tabler-icons.eot and /dev/null differ diff --git a/playground/fonts/tabler-icons/fonts/tabler-icons.ttf b/playground/fonts/tabler-icons/fonts/tabler-icons.ttf deleted file mode 100644 index 250624bc245d69..00000000000000 Binary files a/playground/fonts/tabler-icons/fonts/tabler-icons.ttf and /dev/null differ diff --git a/playground/fonts/tabler-icons/fonts/tabler-icons.woff b/playground/fonts/tabler-icons/fonts/tabler-icons.woff deleted file mode 100644 index 8a97a55fcec3b4..00000000000000 Binary files a/playground/fonts/tabler-icons/fonts/tabler-icons.woff and /dev/null differ diff --git a/playground/fonts/tabler-icons/fonts/tabler-icons.woff2 b/playground/fonts/tabler-icons/fonts/tabler-icons.woff2 deleted file mode 100644 index 6f22df9b215b68..00000000000000 Binary files a/playground/fonts/tabler-icons/fonts/tabler-icons.woff2 and /dev/null differ diff --git a/playground/fonts/tabler-icons/tabler-icons.css b/playground/fonts/tabler-icons/tabler-icons.css deleted file mode 100644 index b935485bb8ddf1..00000000000000 --- a/playground/fonts/tabler-icons/tabler-icons.css +++ /dev/null @@ -1,16129 +0,0 @@ -/*! - * Tabler Icons 2.11.0 by tabler - https://tabler.io - * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE - */ -@font-face { - font-family: "tabler-icons"; - font-style: normal; - font-weight: 400; - src: url("./fonts/tabler-icons.eot?v2.11.0"); - src: url("./fonts/tabler-icons.eot?#iefix-v2.11.0") format("embedded-opentype"), url("./fonts/tabler-icons.woff2?v2.11.0") format("woff2"), url("./fonts/tabler-icons.woff?") format("woff"), url("./fonts/tabler-icons.ttf?v2.11.0") format("truetype"); -} -.ti { - font-family: "tabler-icons" !important; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - /* Better Font Rendering */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.ti-123:before { - content: "\f554"; -} - -.ti-24-hours:before { - content: "\f5e7"; -} - -.ti-2fa:before { - content: "\eca0"; -} - -.ti-360:before { - content: "\f62f"; -} - -.ti-360-view:before { - content: "\f566"; -} - -.ti-3d-cube-sphere:before { - content: "\ecd7"; -} - -.ti-3d-cube-sphere-off:before { - content: "\f3b5"; -} - -.ti-3d-rotate:before { - content: "\f020"; -} - -.ti-a-b:before { - content: "\ec36"; -} - -.ti-a-b-2:before { - content: "\f25f"; -} - -.ti-a-b-off:before { - content: "\f0a6"; -} - -.ti-abacus:before { - content: "\f05c"; -} - -.ti-abacus-off:before { - content: "\f3b6"; -} - -.ti-abc:before { - content: "\f567"; -} - -.ti-access-point:before { - content: "\ed1b"; -} - -.ti-access-point-off:before { - content: "\ed1a"; -} - -.ti-accessible:before { - content: "\eba9"; -} - -.ti-accessible-off:before { - content: "\f0a7"; -} - -.ti-accessible-off-filled:before { - content: "\f6ea"; -} - -.ti-activity:before { - content: "\ed23"; -} - -.ti-activity-heartbeat:before { - content: "\f0db"; -} - -.ti-ad:before { - content: "\ea02"; -} - -.ti-ad-2:before { - content: "\ef1f"; -} - -.ti-ad-circle:before { - content: "\f79e"; -} - -.ti-ad-circle-filled:before { - content: "\f7d3"; -} - -.ti-ad-circle-off:before { - content: "\f79d"; -} - -.ti-ad-filled:before { - content: "\f6eb"; -} - -.ti-ad-off:before { - content: "\f3b7"; -} - -.ti-address-book:before { - content: "\f021"; -} - -.ti-address-book-off:before { - content: "\f3b8"; -} - -.ti-adjustments:before { - content: "\ea03"; -} - -.ti-adjustments-alt:before { - content: "\ec37"; -} - -.ti-adjustments-bolt:before { - content: "\f7fb"; -} - -.ti-adjustments-cancel:before { - content: "\f7fc"; -} - -.ti-adjustments-check:before { - content: "\f7fd"; -} - -.ti-adjustments-code:before { - content: "\f7fe"; -} - -.ti-adjustments-cog:before { - content: "\f7ff"; -} - -.ti-adjustments-dollar:before { - content: "\f800"; -} - -.ti-adjustments-down:before { - content: "\f801"; -} - -.ti-adjustments-exclamation:before { - content: "\f802"; -} - -.ti-adjustments-filled:before { - content: "\f6ec"; -} - -.ti-adjustments-heart:before { - content: "\f803"; -} - -.ti-adjustments-horizontal:before { - content: "\ec38"; -} - -.ti-adjustments-minus:before { - content: "\f804"; -} - -.ti-adjustments-off:before { - content: "\f0a8"; -} - -.ti-adjustments-pause:before { - content: "\f805"; -} - -.ti-adjustments-pin:before { - content: "\f806"; -} - -.ti-adjustments-plus:before { - content: "\f807"; -} - -.ti-adjustments-question:before { - content: "\f808"; -} - -.ti-adjustments-search:before { - content: "\f809"; -} - -.ti-adjustments-share:before { - content: "\f80a"; -} - -.ti-adjustments-star:before { - content: "\f80b"; -} - -.ti-adjustments-up:before { - content: "\f80c"; -} - -.ti-adjustments-x:before { - content: "\f80d"; -} - -.ti-aerial-lift:before { - content: "\edfe"; -} - -.ti-affiliate:before { - content: "\edff"; -} - -.ti-affiliate-filled:before { - content: "\f6ed"; -} - -.ti-air-balloon:before { - content: "\f4a6"; -} - -.ti-air-conditioning:before { - content: "\f3a2"; -} - -.ti-air-conditioning-disabled:before { - content: "\f542"; -} - -.ti-alarm:before { - content: "\ea04"; -} - -.ti-alarm-filled:before { - content: "\f709"; -} - -.ti-alarm-minus:before { - content: "\f630"; -} - -.ti-alarm-minus-filled:before { - content: "\f70a"; -} - -.ti-alarm-off:before { - content: "\f0a9"; -} - -.ti-alarm-plus:before { - content: "\f631"; -} - -.ti-alarm-plus-filled:before { - content: "\f70b"; -} - -.ti-alarm-snooze:before { - content: "\f632"; -} - -.ti-alarm-snooze-filled:before { - content: "\f70c"; -} - -.ti-album:before { - content: "\f022"; -} - -.ti-album-off:before { - content: "\f3b9"; -} - -.ti-alert-circle:before { - content: "\ea05"; -} - -.ti-alert-circle-filled:before { - content: "\f6ee"; -} - -.ti-alert-hexagon:before { - content: "\f80e"; -} - -.ti-alert-octagon:before { - content: "\ecc6"; -} - -.ti-alert-octagon-filled:before { - content: "\f6ef"; -} - -.ti-alert-small:before { - content: "\f80f"; -} - -.ti-alert-square:before { - content: "\f811"; -} - -.ti-alert-square-rounded:before { - content: "\f810"; -} - -.ti-alert-triangle:before { - content: "\ea06"; -} - -.ti-alert-triangle-filled:before { - content: "\f6f0"; -} - -.ti-alien:before { - content: "\ebde"; -} - -.ti-alien-filled:before { - content: "\f70d"; -} - -.ti-align-box-bottom-center:before { - content: "\f530"; -} - -.ti-align-box-bottom-center-filled:before { - content: "\f70e"; -} - -.ti-align-box-bottom-left:before { - content: "\f531"; -} - -.ti-align-box-bottom-left-filled:before { - content: "\f70f"; -} - -.ti-align-box-bottom-right:before { - content: "\f532"; -} - -.ti-align-box-bottom-right-filled:before { - content: "\f710"; -} - -.ti-align-box-center-middle:before { - content: "\f79f"; -} - -.ti-align-box-center-middle-filled:before { - content: "\f7d4"; -} - -.ti-align-box-left-bottom:before { - content: "\f533"; -} - -.ti-align-box-left-bottom-filled:before { - content: "\f711"; -} - -.ti-align-box-left-middle:before { - content: "\f534"; -} - -.ti-align-box-left-middle-filled:before { - content: "\f712"; -} - -.ti-align-box-left-top:before { - content: "\f535"; -} - -.ti-align-box-left-top-filled:before { - content: "\f713"; -} - -.ti-align-box-right-bottom:before { - content: "\f536"; -} - -.ti-align-box-right-bottom-filled:before { - content: "\f714"; -} - -.ti-align-box-right-middle:before { - content: "\f537"; -} - -.ti-align-box-right-middle-filled:before { - content: "\f7d5"; -} - -.ti-align-box-right-top:before { - content: "\f538"; -} - -.ti-align-box-right-top-filled:before { - content: "\f715"; -} - -.ti-align-box-top-center:before { - content: "\f539"; -} - -.ti-align-box-top-center-filled:before { - content: "\f716"; -} - -.ti-align-box-top-left:before { - content: "\f53a"; -} - -.ti-align-box-top-left-filled:before { - content: "\f717"; -} - -.ti-align-box-top-right:before { - content: "\f53b"; -} - -.ti-align-box-top-right-filled:before { - content: "\f718"; -} - -.ti-align-center:before { - content: "\ea07"; -} - -.ti-align-justified:before { - content: "\ea08"; -} - -.ti-align-left:before { - content: "\ea09"; -} - -.ti-align-right:before { - content: "\ea0a"; -} - -.ti-alpha:before { - content: "\f543"; -} - -.ti-alphabet-cyrillic:before { - content: "\f1df"; -} - -.ti-alphabet-greek:before { - content: "\f1e0"; -} - -.ti-alphabet-latin:before { - content: "\f1e1"; -} - -.ti-ambulance:before { - content: "\ebf5"; -} - -.ti-ampersand:before { - content: "\f229"; -} - -.ti-analyze:before { - content: "\f3a3"; -} - -.ti-analyze-filled:before { - content: "\f719"; -} - -.ti-analyze-off:before { - content: "\f3ba"; -} - -.ti-anchor:before { - content: "\eb76"; -} - -.ti-anchor-off:before { - content: "\f0f7"; -} - -.ti-angle:before { - content: "\ef20"; -} - -.ti-ankh:before { - content: "\f1cd"; -} - -.ti-antenna:before { - content: "\f094"; -} - -.ti-antenna-bars-1:before { - content: "\ecc7"; -} - -.ti-antenna-bars-2:before { - content: "\ecc8"; -} - -.ti-antenna-bars-3:before { - content: "\ecc9"; -} - -.ti-antenna-bars-4:before { - content: "\ecca"; -} - -.ti-antenna-bars-5:before { - content: "\eccb"; -} - -.ti-antenna-bars-off:before { - content: "\f0aa"; -} - -.ti-antenna-off:before { - content: "\f3bb"; -} - -.ti-aperture:before { - content: "\eb58"; -} - -.ti-aperture-off:before { - content: "\f3bc"; -} - -.ti-api:before { - content: "\effd"; -} - -.ti-api-app:before { - content: "\effc"; -} - -.ti-api-app-off:before { - content: "\f0ab"; -} - -.ti-api-off:before { - content: "\f0f8"; -} - -.ti-app-window:before { - content: "\efe6"; -} - -.ti-app-window-filled:before { - content: "\f71a"; -} - -.ti-apple:before { - content: "\ef21"; -} - -.ti-apps:before { - content: "\ebb6"; -} - -.ti-apps-filled:before { - content: "\f6f1"; -} - -.ti-apps-off:before { - content: "\f0ac"; -} - -.ti-archive:before { - content: "\ea0b"; -} - -.ti-archive-off:before { - content: "\f0ad"; -} - -.ti-armchair:before { - content: "\ef9e"; -} - -.ti-armchair-2:before { - content: "\efe7"; -} - -.ti-armchair-2-off:before { - content: "\f3bd"; -} - -.ti-armchair-off:before { - content: "\f3be"; -} - -.ti-arrow-autofit-content:before { - content: "\ef31"; -} - -.ti-arrow-autofit-content-filled:before { - content: "\f6f2"; -} - -.ti-arrow-autofit-down:before { - content: "\ef32"; -} - -.ti-arrow-autofit-height:before { - content: "\ef33"; -} - -.ti-arrow-autofit-left:before { - content: "\ef34"; -} - -.ti-arrow-autofit-right:before { - content: "\ef35"; -} - -.ti-arrow-autofit-up:before { - content: "\ef36"; -} - -.ti-arrow-autofit-width:before { - content: "\ef37"; -} - -.ti-arrow-back:before { - content: "\ea0c"; -} - -.ti-arrow-back-up:before { - content: "\eb77"; -} - -.ti-arrow-back-up-double:before { - content: "\f9ec"; -} - -.ti-arrow-badge-down:before { - content: "\f60b"; -} - -.ti-arrow-badge-down-filled:before { - content: "\f7d6"; -} - -.ti-arrow-badge-left:before { - content: "\f60c"; -} - -.ti-arrow-badge-left-filled:before { - content: "\f7d7"; -} - -.ti-arrow-badge-right:before { - content: "\f60d"; -} - -.ti-arrow-badge-right-filled:before { - content: "\f7d8"; -} - -.ti-arrow-badge-up:before { - content: "\f60e"; -} - -.ti-arrow-badge-up-filled:before { - content: "\f7d9"; -} - -.ti-arrow-bar-down:before { - content: "\ea0d"; -} - -.ti-arrow-bar-left:before { - content: "\ea0e"; -} - -.ti-arrow-bar-right:before { - content: "\ea0f"; -} - -.ti-arrow-bar-to-down:before { - content: "\ec88"; -} - -.ti-arrow-bar-to-left:before { - content: "\ec89"; -} - -.ti-arrow-bar-to-right:before { - content: "\ec8a"; -} - -.ti-arrow-bar-to-up:before { - content: "\ec8b"; -} - -.ti-arrow-bar-up:before { - content: "\ea10"; -} - -.ti-arrow-bear-left:before { - content: "\f045"; -} - -.ti-arrow-bear-left-2:before { - content: "\f044"; -} - -.ti-arrow-bear-right:before { - content: "\f047"; -} - -.ti-arrow-bear-right-2:before { - content: "\f046"; -} - -.ti-arrow-big-down:before { - content: "\edda"; -} - -.ti-arrow-big-down-filled:before { - content: "\f6c6"; -} - -.ti-arrow-big-down-line:before { - content: "\efe8"; -} - -.ti-arrow-big-down-line-filled:before { - content: "\f6c7"; -} - -.ti-arrow-big-down-lines:before { - content: "\efe9"; -} - -.ti-arrow-big-down-lines-filled:before { - content: "\f6c8"; -} - -.ti-arrow-big-left:before { - content: "\eddb"; -} - -.ti-arrow-big-left-filled:before { - content: "\f6c9"; -} - -.ti-arrow-big-left-line:before { - content: "\efea"; -} - -.ti-arrow-big-left-line-filled:before { - content: "\f6ca"; -} - -.ti-arrow-big-left-lines:before { - content: "\efeb"; -} - -.ti-arrow-big-left-lines-filled:before { - content: "\f6cb"; -} - -.ti-arrow-big-right:before { - content: "\eddc"; -} - -.ti-arrow-big-right-filled:before { - content: "\f6cc"; -} - -.ti-arrow-big-right-line:before { - content: "\efec"; -} - -.ti-arrow-big-right-line-filled:before { - content: "\f6cd"; -} - -.ti-arrow-big-right-lines:before { - content: "\efed"; -} - -.ti-arrow-big-right-lines-filled:before { - content: "\f6ce"; -} - -.ti-arrow-big-up:before { - content: "\eddd"; -} - -.ti-arrow-big-up-filled:before { - content: "\f6cf"; -} - -.ti-arrow-big-up-line:before { - content: "\efee"; -} - -.ti-arrow-big-up-line-filled:before { - content: "\f6d0"; -} - -.ti-arrow-big-up-lines:before { - content: "\efef"; -} - -.ti-arrow-big-up-lines-filled:before { - content: "\f6d1"; -} - -.ti-arrow-bounce:before { - content: "\f3a4"; -} - -.ti-arrow-curve-left:before { - content: "\f048"; -} - -.ti-arrow-curve-right:before { - content: "\f049"; -} - -.ti-arrow-down:before { - content: "\ea16"; -} - -.ti-arrow-down-bar:before { - content: "\ed98"; -} - -.ti-arrow-down-circle:before { - content: "\ea11"; -} - -.ti-arrow-down-left:before { - content: "\ea13"; -} - -.ti-arrow-down-left-circle:before { - content: "\ea12"; -} - -.ti-arrow-down-rhombus:before { - content: "\f61d"; -} - -.ti-arrow-down-right:before { - content: "\ea15"; -} - -.ti-arrow-down-right-circle:before { - content: "\ea14"; -} - -.ti-arrow-down-square:before { - content: "\ed9a"; -} - -.ti-arrow-down-tail:before { - content: "\ed9b"; -} - -.ti-arrow-elbow-left:before { - content: "\f9ed"; -} - -.ti-arrow-elbow-right:before { - content: "\f9ee"; -} - -.ti-arrow-fork:before { - content: "\f04a"; -} - -.ti-arrow-forward:before { - content: "\ea17"; -} - -.ti-arrow-forward-up:before { - content: "\eb78"; -} - -.ti-arrow-forward-up-double:before { - content: "\f9ef"; -} - -.ti-arrow-guide:before { - content: "\f22a"; -} - -.ti-arrow-iteration:before { - content: "\f578"; -} - -.ti-arrow-left:before { - content: "\ea19"; -} - -.ti-arrow-left-bar:before { - content: "\ed9c"; -} - -.ti-arrow-left-circle:before { - content: "\ea18"; -} - -.ti-arrow-left-rhombus:before { - content: "\f61e"; -} - -.ti-arrow-left-right:before { - content: "\f04b"; -} - -.ti-arrow-left-square:before { - content: "\ed9d"; -} - -.ti-arrow-left-tail:before { - content: "\ed9e"; -} - -.ti-arrow-loop-left:before { - content: "\ed9f"; -} - -.ti-arrow-loop-left-2:before { - content: "\f04c"; -} - -.ti-arrow-loop-right:before { - content: "\eda0"; -} - -.ti-arrow-loop-right-2:before { - content: "\f04d"; -} - -.ti-arrow-merge:before { - content: "\f04e"; -} - -.ti-arrow-merge-both:before { - content: "\f23b"; -} - -.ti-arrow-merge-left:before { - content: "\f23c"; -} - -.ti-arrow-merge-right:before { - content: "\f23d"; -} - -.ti-arrow-move-down:before { - content: "\f2ba"; -} - -.ti-arrow-move-left:before { - content: "\f2bb"; -} - -.ti-arrow-move-right:before { - content: "\f2bc"; -} - -.ti-arrow-move-up:before { - content: "\f2bd"; -} - -.ti-arrow-narrow-down:before { - content: "\ea1a"; -} - -.ti-arrow-narrow-left:before { - content: "\ea1b"; -} - -.ti-arrow-narrow-right:before { - content: "\ea1c"; -} - -.ti-arrow-narrow-up:before { - content: "\ea1d"; -} - -.ti-arrow-ramp-left:before { - content: "\ed3c"; -} - -.ti-arrow-ramp-left-2:before { - content: "\f04f"; -} - -.ti-arrow-ramp-left-3:before { - content: "\f050"; -} - -.ti-arrow-ramp-right:before { - content: "\ed3d"; -} - -.ti-arrow-ramp-right-2:before { - content: "\f051"; -} - -.ti-arrow-ramp-right-3:before { - content: "\f052"; -} - -.ti-arrow-right:before { - content: "\ea1f"; -} - -.ti-arrow-right-bar:before { - content: "\eda1"; -} - -.ti-arrow-right-circle:before { - content: "\ea1e"; -} - -.ti-arrow-right-rhombus:before { - content: "\f61f"; -} - -.ti-arrow-right-square:before { - content: "\eda2"; -} - -.ti-arrow-right-tail:before { - content: "\eda3"; -} - -.ti-arrow-rotary-first-left:before { - content: "\f053"; -} - -.ti-arrow-rotary-first-right:before { - content: "\f054"; -} - -.ti-arrow-rotary-last-left:before { - content: "\f055"; -} - -.ti-arrow-rotary-last-right:before { - content: "\f056"; -} - -.ti-arrow-rotary-left:before { - content: "\f057"; -} - -.ti-arrow-rotary-right:before { - content: "\f058"; -} - -.ti-arrow-rotary-straight:before { - content: "\f059"; -} - -.ti-arrow-roundabout-left:before { - content: "\f22b"; -} - -.ti-arrow-roundabout-right:before { - content: "\f22c"; -} - -.ti-arrow-sharp-turn-left:before { - content: "\f05a"; -} - -.ti-arrow-sharp-turn-right:before { - content: "\f05b"; -} - -.ti-arrow-up:before { - content: "\ea25"; -} - -.ti-arrow-up-bar:before { - content: "\eda4"; -} - -.ti-arrow-up-circle:before { - content: "\ea20"; -} - -.ti-arrow-up-left:before { - content: "\ea22"; -} - -.ti-arrow-up-left-circle:before { - content: "\ea21"; -} - -.ti-arrow-up-rhombus:before { - content: "\f620"; -} - -.ti-arrow-up-right:before { - content: "\ea24"; -} - -.ti-arrow-up-right-circle:before { - content: "\ea23"; -} - -.ti-arrow-up-square:before { - content: "\eda6"; -} - -.ti-arrow-up-tail:before { - content: "\eda7"; -} - -.ti-arrow-wave-left-down:before { - content: "\eda8"; -} - -.ti-arrow-wave-left-up:before { - content: "\eda9"; -} - -.ti-arrow-wave-right-down:before { - content: "\edaa"; -} - -.ti-arrow-wave-right-up:before { - content: "\edab"; -} - -.ti-arrow-zig-zag:before { - content: "\f4a7"; -} - -.ti-arrows-cross:before { - content: "\effe"; -} - -.ti-arrows-diagonal:before { - content: "\ea27"; -} - -.ti-arrows-diagonal-2:before { - content: "\ea26"; -} - -.ti-arrows-diagonal-minimize:before { - content: "\ef39"; -} - -.ti-arrows-diagonal-minimize-2:before { - content: "\ef38"; -} - -.ti-arrows-diff:before { - content: "\f296"; -} - -.ti-arrows-double-ne-sw:before { - content: "\edde"; -} - -.ti-arrows-double-nw-se:before { - content: "\eddf"; -} - -.ti-arrows-double-se-nw:before { - content: "\ede0"; -} - -.ti-arrows-double-sw-ne:before { - content: "\ede1"; -} - -.ti-arrows-down:before { - content: "\edad"; -} - -.ti-arrows-down-up:before { - content: "\edac"; -} - -.ti-arrows-exchange:before { - content: "\f1f4"; -} - -.ti-arrows-exchange-2:before { - content: "\f1f3"; -} - -.ti-arrows-horizontal:before { - content: "\eb59"; -} - -.ti-arrows-join:before { - content: "\edaf"; -} - -.ti-arrows-join-2:before { - content: "\edae"; -} - -.ti-arrows-left:before { - content: "\edb1"; -} - -.ti-arrows-left-down:before { - content: "\ee00"; -} - -.ti-arrows-left-right:before { - content: "\edb0"; -} - -.ti-arrows-maximize:before { - content: "\ea28"; -} - -.ti-arrows-minimize:before { - content: "\ea29"; -} - -.ti-arrows-move:before { - content: "\f22f"; -} - -.ti-arrows-move-horizontal:before { - content: "\f22d"; -} - -.ti-arrows-move-vertical:before { - content: "\f22e"; -} - -.ti-arrows-random:before { - content: "\f095"; -} - -.ti-arrows-right:before { - content: "\edb3"; -} - -.ti-arrows-right-down:before { - content: "\ee01"; -} - -.ti-arrows-right-left:before { - content: "\edb2"; -} - -.ti-arrows-shuffle:before { - content: "\f000"; -} - -.ti-arrows-shuffle-2:before { - content: "\efff"; -} - -.ti-arrows-sort:before { - content: "\eb5a"; -} - -.ti-arrows-split:before { - content: "\edb5"; -} - -.ti-arrows-split-2:before { - content: "\edb4"; -} - -.ti-arrows-transfer-down:before { - content: "\f2cc"; -} - -.ti-arrows-transfer-up:before { - content: "\f2cd"; -} - -.ti-arrows-up:before { - content: "\edb7"; -} - -.ti-arrows-up-down:before { - content: "\edb6"; -} - -.ti-arrows-up-left:before { - content: "\ee02"; -} - -.ti-arrows-up-right:before { - content: "\ee03"; -} - -.ti-arrows-vertical:before { - content: "\eb5b"; -} - -.ti-artboard:before { - content: "\ea2a"; -} - -.ti-artboard-off:before { - content: "\f0ae"; -} - -.ti-article:before { - content: "\f1e2"; -} - -.ti-article-filled-filled:before { - content: "\f7da"; -} - -.ti-article-off:before { - content: "\f3bf"; -} - -.ti-aspect-ratio:before { - content: "\ed30"; -} - -.ti-aspect-ratio-filled:before { - content: "\f7db"; -} - -.ti-aspect-ratio-off:before { - content: "\f0af"; -} - -.ti-assembly:before { - content: "\f24d"; -} - -.ti-assembly-off:before { - content: "\f3c0"; -} - -.ti-asset:before { - content: "\f1ce"; -} - -.ti-asterisk:before { - content: "\efd5"; -} - -.ti-asterisk-simple:before { - content: "\efd4"; -} - -.ti-at:before { - content: "\ea2b"; -} - -.ti-at-off:before { - content: "\f0b0"; -} - -.ti-atom:before { - content: "\eb79"; -} - -.ti-atom-2:before { - content: "\ebdf"; -} - -.ti-atom-2-filled:before { - content: "\f71b"; -} - -.ti-atom-off:before { - content: "\f0f9"; -} - -.ti-augmented-reality:before { - content: "\f023"; -} - -.ti-augmented-reality-2:before { - content: "\f37e"; -} - -.ti-augmented-reality-off:before { - content: "\f3c1"; -} - -.ti-award:before { - content: "\ea2c"; -} - -.ti-award-filled:before { - content: "\f71c"; -} - -.ti-award-off:before { - content: "\f0fa"; -} - -.ti-axe:before { - content: "\ef9f"; -} - -.ti-axis-x:before { - content: "\ef45"; -} - -.ti-axis-y:before { - content: "\ef46"; -} - -.ti-baby-bottle:before { - content: "\f5d2"; -} - -.ti-baby-carriage:before { - content: "\f05d"; -} - -.ti-backhoe:before { - content: "\ed86"; -} - -.ti-backpack:before { - content: "\ef47"; -} - -.ti-backpack-off:before { - content: "\f3c2"; -} - -.ti-backspace:before { - content: "\ea2d"; -} - -.ti-backspace-filled:before { - content: "\f7dc"; -} - -.ti-badge:before { - content: "\efc2"; -} - -.ti-badge-3d:before { - content: "\f555"; -} - -.ti-badge-4k:before { - content: "\f556"; -} - -.ti-badge-8k:before { - content: "\f557"; -} - -.ti-badge-ad:before { - content: "\f558"; -} - -.ti-badge-ar:before { - content: "\f559"; -} - -.ti-badge-cc:before { - content: "\f55a"; -} - -.ti-badge-filled:before { - content: "\f667"; -} - -.ti-badge-hd:before { - content: "\f55b"; -} - -.ti-badge-off:before { - content: "\f0fb"; -} - -.ti-badge-sd:before { - content: "\f55c"; -} - -.ti-badge-tm:before { - content: "\f55d"; -} - -.ti-badge-vo:before { - content: "\f55e"; -} - -.ti-badge-vr:before { - content: "\f55f"; -} - -.ti-badge-wc:before { - content: "\f560"; -} - -.ti-badges:before { - content: "\efc3"; -} - -.ti-badges-filled:before { - content: "\f7dd"; -} - -.ti-badges-off:before { - content: "\f0fc"; -} - -.ti-baguette:before { - content: "\f3a5"; -} - -.ti-ball-american-football:before { - content: "\ee04"; -} - -.ti-ball-american-football-off:before { - content: "\f3c3"; -} - -.ti-ball-baseball:before { - content: "\efa0"; -} - -.ti-ball-basketball:before { - content: "\ec28"; -} - -.ti-ball-bowling:before { - content: "\ec29"; -} - -.ti-ball-football:before { - content: "\ee06"; -} - -.ti-ball-football-off:before { - content: "\ee05"; -} - -.ti-ball-tennis:before { - content: "\ec2a"; -} - -.ti-ball-volleyball:before { - content: "\ec2b"; -} - -.ti-balloon:before { - content: "\ef3a"; -} - -.ti-balloon-off:before { - content: "\f0fd"; -} - -.ti-ballpen:before { - content: "\f06e"; -} - -.ti-ballpen-off:before { - content: "\f0b1"; -} - -.ti-ban:before { - content: "\ea2e"; -} - -.ti-bandage:before { - content: "\eb7a"; -} - -.ti-bandage-filled:before { - content: "\f7de"; -} - -.ti-bandage-off:before { - content: "\f3c4"; -} - -.ti-barbell:before { - content: "\eff0"; -} - -.ti-barbell-off:before { - content: "\f0b2"; -} - -.ti-barcode:before { - content: "\ebc6"; -} - -.ti-barcode-off:before { - content: "\f0b3"; -} - -.ti-barrel:before { - content: "\f0b4"; -} - -.ti-barrel-off:before { - content: "\f0fe"; -} - -.ti-barrier-block:before { - content: "\f00e"; -} - -.ti-barrier-block-off:before { - content: "\f0b5"; -} - -.ti-baseline:before { - content: "\f024"; -} - -.ti-baseline-density-large:before { - content: "\f9f0"; -} - -.ti-baseline-density-medium:before { - content: "\f9f1"; -} - -.ti-baseline-density-small:before { - content: "\f9f2"; -} - -.ti-basket:before { - content: "\ebe1"; -} - -.ti-basket-filled:before { - content: "\f7df"; -} - -.ti-basket-off:before { - content: "\f0b6"; -} - -.ti-bat:before { - content: "\f284"; -} - -.ti-bath:before { - content: "\ef48"; -} - -.ti-bath-filled:before { - content: "\f71d"; -} - -.ti-bath-off:before { - content: "\f0ff"; -} - -.ti-battery:before { - content: "\ea34"; -} - -.ti-battery-1:before { - content: "\ea2f"; -} - -.ti-battery-1-filled:before { - content: "\f71e"; -} - -.ti-battery-2:before { - content: "\ea30"; -} - -.ti-battery-2-filled:before { - content: "\f71f"; -} - -.ti-battery-3:before { - content: "\ea31"; -} - -.ti-battery-3-filled:before { - content: "\f720"; -} - -.ti-battery-4:before { - content: "\ea32"; -} - -.ti-battery-4-filled:before { - content: "\f721"; -} - -.ti-battery-automotive:before { - content: "\ee07"; -} - -.ti-battery-charging:before { - content: "\ea33"; -} - -.ti-battery-charging-2:before { - content: "\ef3b"; -} - -.ti-battery-eco:before { - content: "\ef3c"; -} - -.ti-battery-filled:before { - content: "\f668"; -} - -.ti-battery-off:before { - content: "\ed1c"; -} - -.ti-beach:before { - content: "\ef3d"; -} - -.ti-beach-off:before { - content: "\f0b7"; -} - -.ti-bed:before { - content: "\eb5c"; -} - -.ti-bed-filled:before { - content: "\f7e0"; -} - -.ti-bed-off:before { - content: "\f100"; -} - -.ti-beer:before { - content: "\efa1"; -} - -.ti-beer-filled:before { - content: "\f7e1"; -} - -.ti-beer-off:before { - content: "\f101"; -} - -.ti-bell:before { - content: "\ea35"; -} - -.ti-bell-bolt:before { - content: "\f812"; -} - -.ti-bell-cancel:before { - content: "\f813"; -} - -.ti-bell-check:before { - content: "\f814"; -} - -.ti-bell-code:before { - content: "\f815"; -} - -.ti-bell-cog:before { - content: "\f816"; -} - -.ti-bell-dollar:before { - content: "\f817"; -} - -.ti-bell-down:before { - content: "\f818"; -} - -.ti-bell-exclamation:before { - content: "\f819"; -} - -.ti-bell-filled:before { - content: "\f669"; -} - -.ti-bell-heart:before { - content: "\f81a"; -} - -.ti-bell-minus:before { - content: "\ede2"; -} - -.ti-bell-minus-filled:before { - content: "\f722"; -} - -.ti-bell-off:before { - content: "\ece9"; -} - -.ti-bell-pause:before { - content: "\f81b"; -} - -.ti-bell-pin:before { - content: "\f81c"; -} - -.ti-bell-plus:before { - content: "\ede3"; -} - -.ti-bell-plus-filled:before { - content: "\f723"; -} - -.ti-bell-question:before { - content: "\f81d"; -} - -.ti-bell-ringing:before { - content: "\ed07"; -} - -.ti-bell-ringing-2:before { - content: "\ede4"; -} - -.ti-bell-ringing-2-filled:before { - content: "\f724"; -} - -.ti-bell-ringing-filled:before { - content: "\f725"; -} - -.ti-bell-school:before { - content: "\f05e"; -} - -.ti-bell-search:before { - content: "\f81e"; -} - -.ti-bell-share:before { - content: "\f81f"; -} - -.ti-bell-star:before { - content: "\f820"; -} - -.ti-bell-up:before { - content: "\f821"; -} - -.ti-bell-x:before { - content: "\ede5"; -} - -.ti-bell-x-filled:before { - content: "\f726"; -} - -.ti-bell-z:before { - content: "\eff1"; -} - -.ti-bell-z-filled:before { - content: "\f727"; -} - -.ti-beta:before { - content: "\f544"; -} - -.ti-bible:before { - content: "\efc4"; -} - -.ti-bike:before { - content: "\ea36"; -} - -.ti-bike-off:before { - content: "\f0b8"; -} - -.ti-binary:before { - content: "\ee08"; -} - -.ti-binary-off:before { - content: "\f3c5"; -} - -.ti-binary-tree:before { - content: "\f5d4"; -} - -.ti-binary-tree-2:before { - content: "\f5d3"; -} - -.ti-biohazard:before { - content: "\ecb8"; -} - -.ti-biohazard-off:before { - content: "\f0b9"; -} - -.ti-blade:before { - content: "\f4bd"; -} - -.ti-blade-filled:before { - content: "\f7e2"; -} - -.ti-bleach:before { - content: "\f2f3"; -} - -.ti-bleach-chlorine:before { - content: "\f2f0"; -} - -.ti-bleach-no-chlorine:before { - content: "\f2f1"; -} - -.ti-bleach-off:before { - content: "\f2f2"; -} - -.ti-blockquote:before { - content: "\ee09"; -} - -.ti-bluetooth:before { - content: "\ea37"; -} - -.ti-bluetooth-connected:before { - content: "\ecea"; -} - -.ti-bluetooth-off:before { - content: "\eceb"; -} - -.ti-bluetooth-x:before { - content: "\f081"; -} - -.ti-blur:before { - content: "\ef8c"; -} - -.ti-blur-off:before { - content: "\f3c6"; -} - -.ti-bmp:before { - content: "\f3a6"; -} - -.ti-bold:before { - content: "\eb7b"; -} - -.ti-bold-off:before { - content: "\f0ba"; -} - -.ti-bolt:before { - content: "\ea38"; -} - -.ti-bolt-off:before { - content: "\ecec"; -} - -.ti-bomb:before { - content: "\f59c"; -} - -.ti-bone:before { - content: "\edb8"; -} - -.ti-bone-off:before { - content: "\f0bb"; -} - -.ti-bong:before { - content: "\f3a7"; -} - -.ti-bong-off:before { - content: "\f3c7"; -} - -.ti-book:before { - content: "\ea39"; -} - -.ti-book-2:before { - content: "\efc5"; -} - -.ti-book-download:before { - content: "\f070"; -} - -.ti-book-off:before { - content: "\f0bc"; -} - -.ti-book-upload:before { - content: "\f071"; -} - -.ti-bookmark:before { - content: "\ea3a"; -} - -.ti-bookmark-off:before { - content: "\eced"; -} - -.ti-bookmarks:before { - content: "\ed08"; -} - -.ti-bookmarks-off:before { - content: "\f0bd"; -} - -.ti-books:before { - content: "\eff2"; -} - -.ti-books-off:before { - content: "\f0be"; -} - -.ti-border-all:before { - content: "\ea3b"; -} - -.ti-border-bottom:before { - content: "\ea3c"; -} - -.ti-border-corners:before { - content: "\f7a0"; -} - -.ti-border-horizontal:before { - content: "\ea3d"; -} - -.ti-border-inner:before { - content: "\ea3e"; -} - -.ti-border-left:before { - content: "\ea3f"; -} - -.ti-border-none:before { - content: "\ea40"; -} - -.ti-border-outer:before { - content: "\ea41"; -} - -.ti-border-radius:before { - content: "\eb7c"; -} - -.ti-border-right:before { - content: "\ea42"; -} - -.ti-border-sides:before { - content: "\f7a1"; -} - -.ti-border-style:before { - content: "\ee0a"; -} - -.ti-border-style-2:before { - content: "\ef22"; -} - -.ti-border-top:before { - content: "\ea43"; -} - -.ti-border-vertical:before { - content: "\ea44"; -} - -.ti-bottle:before { - content: "\ef0b"; -} - -.ti-bottle-off:before { - content: "\f3c8"; -} - -.ti-bounce-left:before { - content: "\f59d"; -} - -.ti-bounce-right:before { - content: "\f59e"; -} - -.ti-bow:before { - content: "\f096"; -} - -.ti-bowl:before { - content: "\f4fa"; -} - -.ti-box:before { - content: "\ea45"; -} - -.ti-box-align-bottom:before { - content: "\f2a8"; -} - -.ti-box-align-bottom-left:before { - content: "\f2ce"; -} - -.ti-box-align-bottom-right:before { - content: "\f2cf"; -} - -.ti-box-align-left:before { - content: "\f2a9"; -} - -.ti-box-align-right:before { - content: "\f2aa"; -} - -.ti-box-align-top:before { - content: "\f2ab"; -} - -.ti-box-align-top-left:before { - content: "\f2d0"; -} - -.ti-box-align-top-right:before { - content: "\f2d1"; -} - -.ti-box-margin:before { - content: "\ee0b"; -} - -.ti-box-model:before { - content: "\ee0c"; -} - -.ti-box-model-2:before { - content: "\ef23"; -} - -.ti-box-model-2-off:before { - content: "\f3c9"; -} - -.ti-box-model-off:before { - content: "\f3ca"; -} - -.ti-box-multiple:before { - content: "\ee17"; -} - -.ti-box-multiple-0:before { - content: "\ee0d"; -} - -.ti-box-multiple-1:before { - content: "\ee0e"; -} - -.ti-box-multiple-2:before { - content: "\ee0f"; -} - -.ti-box-multiple-3:before { - content: "\ee10"; -} - -.ti-box-multiple-4:before { - content: "\ee11"; -} - -.ti-box-multiple-5:before { - content: "\ee12"; -} - -.ti-box-multiple-6:before { - content: "\ee13"; -} - -.ti-box-multiple-7:before { - content: "\ee14"; -} - -.ti-box-multiple-8:before { - content: "\ee15"; -} - -.ti-box-multiple-9:before { - content: "\ee16"; -} - -.ti-box-off:before { - content: "\f102"; -} - -.ti-box-padding:before { - content: "\ee18"; -} - -.ti-box-seam:before { - content: "\f561"; -} - -.ti-braces:before { - content: "\ebcc"; -} - -.ti-braces-off:before { - content: "\f0bf"; -} - -.ti-brackets:before { - content: "\ebcd"; -} - -.ti-brackets-contain:before { - content: "\f1e5"; -} - -.ti-brackets-contain-end:before { - content: "\f1e3"; -} - -.ti-brackets-contain-start:before { - content: "\f1e4"; -} - -.ti-brackets-off:before { - content: "\f0c0"; -} - -.ti-braille:before { - content: "\f545"; -} - -.ti-brain:before { - content: "\f59f"; -} - -.ti-brand-4chan:before { - content: "\f494"; -} - -.ti-brand-abstract:before { - content: "\f495"; -} - -.ti-brand-adobe:before { - content: "\f0dc"; -} - -.ti-brand-adonis-js:before { - content: "\f496"; -} - -.ti-brand-airbnb:before { - content: "\ed68"; -} - -.ti-brand-airtable:before { - content: "\ef6a"; -} - -.ti-brand-algolia:before { - content: "\f390"; -} - -.ti-brand-alipay:before { - content: "\f7a2"; -} - -.ti-brand-alpine-js:before { - content: "\f324"; -} - -.ti-brand-amazon:before { - content: "\f230"; -} - -.ti-brand-amd:before { - content: "\f653"; -} - -.ti-brand-amigo:before { - content: "\f5f9"; -} - -.ti-brand-among-us:before { - content: "\f205"; -} - -.ti-brand-android:before { - content: "\ec16"; -} - -.ti-brand-angular:before { - content: "\ef6b"; -} - -.ti-brand-ao3:before { - content: "\f5e8"; -} - -.ti-brand-appgallery:before { - content: "\f231"; -} - -.ti-brand-apple:before { - content: "\ec17"; -} - -.ti-brand-apple-arcade:before { - content: "\ed69"; -} - -.ti-brand-apple-podcast:before { - content: "\f1e6"; -} - -.ti-brand-appstore:before { - content: "\ed24"; -} - -.ti-brand-asana:before { - content: "\edc5"; -} - -.ti-brand-backbone:before { - content: "\f325"; -} - -.ti-brand-badoo:before { - content: "\f206"; -} - -.ti-brand-baidu:before { - content: "\f5e9"; -} - -.ti-brand-bandcamp:before { - content: "\f207"; -} - -.ti-brand-bandlab:before { - content: "\f5fa"; -} - -.ti-brand-beats:before { - content: "\f208"; -} - -.ti-brand-behance:before { - content: "\ec6e"; -} - -.ti-brand-bilibili:before { - content: "\f6d2"; -} - -.ti-brand-binance:before { - content: "\f5a0"; -} - -.ti-brand-bing:before { - content: "\edc6"; -} - -.ti-brand-bitbucket:before { - content: "\edc7"; -} - -.ti-brand-blackberry:before { - content: "\f568"; -} - -.ti-brand-blender:before { - content: "\f326"; -} - -.ti-brand-blogger:before { - content: "\f35a"; -} - -.ti-brand-booking:before { - content: "\edc8"; -} - -.ti-brand-bootstrap:before { - content: "\ef3e"; -} - -.ti-brand-bulma:before { - content: "\f327"; -} - -.ti-brand-bumble:before { - content: "\f5fb"; -} - -.ti-brand-bunpo:before { - content: "\f4cf"; -} - -.ti-brand-c-sharp:before { - content: "\f003"; -} - -.ti-brand-cake:before { - content: "\f7a3"; -} - -.ti-brand-cakephp:before { - content: "\f7af"; -} - -.ti-brand-campaignmonitor:before { - content: "\f328"; -} - -.ti-brand-carbon:before { - content: "\f348"; -} - -.ti-brand-cashapp:before { - content: "\f391"; -} - -.ti-brand-chrome:before { - content: "\ec18"; -} - -.ti-brand-citymapper:before { - content: "\f5fc"; -} - -.ti-brand-codecov:before { - content: "\f329"; -} - -.ti-brand-codepen:before { - content: "\ec6f"; -} - -.ti-brand-codesandbox:before { - content: "\ed6a"; -} - -.ti-brand-cohost:before { - content: "\f5d5"; -} - -.ti-brand-coinbase:before { - content: "\f209"; -} - -.ti-brand-comedy-central:before { - content: "\f217"; -} - -.ti-brand-coreos:before { - content: "\f5fd"; -} - -.ti-brand-couchdb:before { - content: "\f60f"; -} - -.ti-brand-couchsurfing:before { - content: "\f392"; -} - -.ti-brand-cpp:before { - content: "\f5fe"; -} - -.ti-brand-crunchbase:before { - content: "\f7e3"; -} - -.ti-brand-css3:before { - content: "\ed6b"; -} - -.ti-brand-ctemplar:before { - content: "\f4d0"; -} - -.ti-brand-cucumber:before { - content: "\ef6c"; -} - -.ti-brand-cupra:before { - content: "\f4d1"; -} - -.ti-brand-cypress:before { - content: "\f333"; -} - -.ti-brand-d3:before { - content: "\f24e"; -} - -.ti-brand-days-counter:before { - content: "\f4d2"; -} - -.ti-brand-dcos:before { - content: "\f32a"; -} - -.ti-brand-debian:before { - content: "\ef57"; -} - -.ti-brand-deezer:before { - content: "\f78b"; -} - -.ti-brand-deliveroo:before { - content: "\f4d3"; -} - -.ti-brand-deno:before { - content: "\f24f"; -} - -.ti-brand-denodo:before { - content: "\f610"; -} - -.ti-brand-deviantart:before { - content: "\ecfb"; -} - -.ti-brand-dingtalk:before { - content: "\f5ea"; -} - -.ti-brand-discord:before { - content: "\ece3"; -} - -.ti-brand-discord-filled:before { - content: "\f7e4"; -} - -.ti-brand-disney:before { - content: "\f20a"; -} - -.ti-brand-disqus:before { - content: "\edc9"; -} - -.ti-brand-django:before { - content: "\f349"; -} - -.ti-brand-docker:before { - content: "\edca"; -} - -.ti-brand-doctrine:before { - content: "\ef6d"; -} - -.ti-brand-dolby-digital:before { - content: "\f4d4"; -} - -.ti-brand-douban:before { - content: "\f5ff"; -} - -.ti-brand-dribbble:before { - content: "\ec19"; -} - -.ti-brand-dribbble-filled:before { - content: "\f7e5"; -} - -.ti-brand-drops:before { - content: "\f4d5"; -} - -.ti-brand-drupal:before { - content: "\f393"; -} - -.ti-brand-edge:before { - content: "\ecfc"; -} - -.ti-brand-elastic:before { - content: "\f611"; -} - -.ti-brand-ember:before { - content: "\f497"; -} - -.ti-brand-envato:before { - content: "\f394"; -} - -.ti-brand-etsy:before { - content: "\f654"; -} - -.ti-brand-evernote:before { - content: "\f600"; -} - -.ti-brand-facebook:before { - content: "\ec1a"; -} - -.ti-brand-facebook-filled:before { - content: "\f7e6"; -} - -.ti-brand-figma:before { - content: "\ec93"; -} - -.ti-brand-finder:before { - content: "\f218"; -} - -.ti-brand-firebase:before { - content: "\ef6e"; -} - -.ti-brand-firefox:before { - content: "\ecfd"; -} - -.ti-brand-fiverr:before { - content: "\f7a4"; -} - -.ti-brand-flickr:before { - content: "\ecfe"; -} - -.ti-brand-flightradar24:before { - content: "\f4d6"; -} - -.ti-brand-flipboard:before { - content: "\f20b"; -} - -.ti-brand-flutter:before { - content: "\f395"; -} - -.ti-brand-fortnite:before { - content: "\f260"; -} - -.ti-brand-foursquare:before { - content: "\ecff"; -} - -.ti-brand-framer:before { - content: "\ec1b"; -} - -.ti-brand-framer-motion:before { - content: "\f78c"; -} - -.ti-brand-funimation:before { - content: "\f655"; -} - -.ti-brand-gatsby:before { - content: "\f396"; -} - -.ti-brand-git:before { - content: "\ef6f"; -} - -.ti-brand-github:before { - content: "\ec1c"; -} - -.ti-brand-github-copilot:before { - content: "\f4a8"; -} - -.ti-brand-github-filled:before { - content: "\f7e7"; -} - -.ti-brand-gitlab:before { - content: "\ec1d"; -} - -.ti-brand-gmail:before { - content: "\efa2"; -} - -.ti-brand-golang:before { - content: "\f78d"; -} - -.ti-brand-google:before { - content: "\ec1f"; -} - -.ti-brand-google-analytics:before { - content: "\edcb"; -} - -.ti-brand-google-big-query:before { - content: "\f612"; -} - -.ti-brand-google-drive:before { - content: "\ec1e"; -} - -.ti-brand-google-fit:before { - content: "\f297"; -} - -.ti-brand-google-home:before { - content: "\f601"; -} - -.ti-brand-google-one:before { - content: "\f232"; -} - -.ti-brand-google-photos:before { - content: "\f20c"; -} - -.ti-brand-google-play:before { - content: "\ed25"; -} - -.ti-brand-google-podcasts:before { - content: "\f656"; -} - -.ti-brand-grammarly:before { - content: "\f32b"; -} - -.ti-brand-graphql:before { - content: "\f32c"; -} - -.ti-brand-gravatar:before { - content: "\edcc"; -} - -.ti-brand-grindr:before { - content: "\f20d"; -} - -.ti-brand-guardian:before { - content: "\f4fb"; -} - -.ti-brand-gumroad:before { - content: "\f5d6"; -} - -.ti-brand-hbo:before { - content: "\f657"; -} - -.ti-brand-headlessui:before { - content: "\f32d"; -} - -.ti-brand-hipchat:before { - content: "\edcd"; -} - -.ti-brand-html5:before { - content: "\ed6c"; -} - -.ti-brand-inertia:before { - content: "\f34a"; -} - -.ti-brand-instagram:before { - content: "\ec20"; -} - -.ti-brand-intercom:before { - content: "\f1cf"; -} - -.ti-brand-javascript:before { - content: "\ef0c"; -} - -.ti-brand-juejin:before { - content: "\f7b0"; -} - -.ti-brand-kickstarter:before { - content: "\edce"; -} - -.ti-brand-kotlin:before { - content: "\ed6d"; -} - -.ti-brand-laravel:before { - content: "\f34b"; -} - -.ti-brand-lastfm:before { - content: "\f001"; -} - -.ti-brand-line:before { - content: "\f7e8"; -} - -.ti-brand-linkedin:before { - content: "\ec8c"; -} - -.ti-brand-linktree:before { - content: "\f1e7"; -} - -.ti-brand-linqpad:before { - content: "\f562"; -} - -.ti-brand-loom:before { - content: "\ef70"; -} - -.ti-brand-mailgun:before { - content: "\f32e"; -} - -.ti-brand-mantine:before { - content: "\f32f"; -} - -.ti-brand-mastercard:before { - content: "\ef49"; -} - -.ti-brand-mastodon:before { - content: "\f250"; -} - -.ti-brand-matrix:before { - content: "\f5eb"; -} - -.ti-brand-mcdonalds:before { - content: "\f251"; -} - -.ti-brand-medium:before { - content: "\ec70"; -} - -.ti-brand-mercedes:before { - content: "\f072"; -} - -.ti-brand-messenger:before { - content: "\ec71"; -} - -.ti-brand-meta:before { - content: "\efb0"; -} - -.ti-brand-miniprogram:before { - content: "\f602"; -} - -.ti-brand-mixpanel:before { - content: "\f397"; -} - -.ti-brand-monday:before { - content: "\f219"; -} - -.ti-brand-mongodb:before { - content: "\f613"; -} - -.ti-brand-my-oppo:before { - content: "\f4d7"; -} - -.ti-brand-mysql:before { - content: "\f614"; -} - -.ti-brand-national-geographic:before { - content: "\f603"; -} - -.ti-brand-nem:before { - content: "\f5a1"; -} - -.ti-brand-netbeans:before { - content: "\ef71"; -} - -.ti-brand-netease-music:before { - content: "\f604"; -} - -.ti-brand-netflix:before { - content: "\edcf"; -} - -.ti-brand-nexo:before { - content: "\f5a2"; -} - -.ti-brand-nextcloud:before { - content: "\f4d8"; -} - -.ti-brand-nextjs:before { - content: "\f0dd"; -} - -.ti-brand-nord-vpn:before { - content: "\f37f"; -} - -.ti-brand-notion:before { - content: "\ef7b"; -} - -.ti-brand-npm:before { - content: "\f569"; -} - -.ti-brand-nuxt:before { - content: "\f0de"; -} - -.ti-brand-nytimes:before { - content: "\ef8d"; -} - -.ti-brand-office:before { - content: "\f398"; -} - -.ti-brand-ok-ru:before { - content: "\f399"; -} - -.ti-brand-onedrive:before { - content: "\f5d7"; -} - -.ti-brand-onlyfans:before { - content: "\f605"; -} - -.ti-brand-open-source:before { - content: "\edd0"; -} - -.ti-brand-openai:before { - content: "\f78e"; -} - -.ti-brand-openvpn:before { - content: "\f39a"; -} - -.ti-brand-opera:before { - content: "\ec21"; -} - -.ti-brand-pagekit:before { - content: "\edd1"; -} - -.ti-brand-patreon:before { - content: "\edd2"; -} - -.ti-brand-paypal:before { - content: "\ec22"; -} - -.ti-brand-paypal-filled:before { - content: "\f7e9"; -} - -.ti-brand-paypay:before { - content: "\f5ec"; -} - -.ti-brand-peanut:before { - content: "\f39b"; -} - -.ti-brand-pepsi:before { - content: "\f261"; -} - -.ti-brand-php:before { - content: "\ef72"; -} - -.ti-brand-picsart:before { - content: "\f4d9"; -} - -.ti-brand-pinterest:before { - content: "\ec8d"; -} - -.ti-brand-planetscale:before { - content: "\f78f"; -} - -.ti-brand-pocket:before { - content: "\ed00"; -} - -.ti-brand-polymer:before { - content: "\f498"; -} - -.ti-brand-powershell:before { - content: "\f5ed"; -} - -.ti-brand-prisma:before { - content: "\f499"; -} - -.ti-brand-producthunt:before { - content: "\edd3"; -} - -.ti-brand-pushbullet:before { - content: "\f330"; -} - -.ti-brand-pushover:before { - content: "\f20e"; -} - -.ti-brand-python:before { - content: "\ed01"; -} - -.ti-brand-qq:before { - content: "\f606"; -} - -.ti-brand-radix-ui:before { - content: "\f790"; -} - -.ti-brand-react:before { - content: "\f34c"; -} - -.ti-brand-react-native:before { - content: "\ef73"; -} - -.ti-brand-reason:before { - content: "\f49a"; -} - -.ti-brand-reddit:before { - content: "\ec8e"; -} - -.ti-brand-redhat:before { - content: "\f331"; -} - -.ti-brand-redux:before { - content: "\f3a8"; -} - -.ti-brand-revolut:before { - content: "\f4da"; -} - -.ti-brand-safari:before { - content: "\ec23"; -} - -.ti-brand-samsungpass:before { - content: "\f4db"; -} - -.ti-brand-sass:before { - content: "\edd4"; -} - -.ti-brand-sentry:before { - content: "\edd5"; -} - -.ti-brand-sharik:before { - content: "\f4dc"; -} - -.ti-brand-shazam:before { - content: "\edd6"; -} - -.ti-brand-shopee:before { - content: "\f252"; -} - -.ti-brand-sketch:before { - content: "\ec24"; -} - -.ti-brand-skype:before { - content: "\ed02"; -} - -.ti-brand-slack:before { - content: "\ec72"; -} - -.ti-brand-snapchat:before { - content: "\ec25"; -} - -.ti-brand-snapseed:before { - content: "\f253"; -} - -.ti-brand-snowflake:before { - content: "\f615"; -} - -.ti-brand-socket-io:before { - content: "\f49b"; -} - -.ti-brand-solidjs:before { - content: "\f5ee"; -} - -.ti-brand-soundcloud:before { - content: "\ed6e"; -} - -.ti-brand-spacehey:before { - content: "\f4fc"; -} - -.ti-brand-spotify:before { - content: "\ed03"; -} - -.ti-brand-stackoverflow:before { - content: "\ef58"; -} - -.ti-brand-stackshare:before { - content: "\f607"; -} - -.ti-brand-steam:before { - content: "\ed6f"; -} - -.ti-brand-storybook:before { - content: "\f332"; -} - -.ti-brand-storytel:before { - content: "\f608"; -} - -.ti-brand-strava:before { - content: "\f254"; -} - -.ti-brand-stripe:before { - content: "\edd7"; -} - -.ti-brand-sublime-text:before { - content: "\ef74"; -} - -.ti-brand-sugarizer:before { - content: "\f7a5"; -} - -.ti-brand-supabase:before { - content: "\f6d3"; -} - -.ti-brand-superhuman:before { - content: "\f50c"; -} - -.ti-brand-supernova:before { - content: "\f49c"; -} - -.ti-brand-surfshark:before { - content: "\f255"; -} - -.ti-brand-svelte:before { - content: "\f0df"; -} - -.ti-brand-symfony:before { - content: "\f616"; -} - -.ti-brand-tabler:before { - content: "\ec8f"; -} - -.ti-brand-tailwind:before { - content: "\eca1"; -} - -.ti-brand-taobao:before { - content: "\f5ef"; -} - -.ti-brand-ted:before { - content: "\f658"; -} - -.ti-brand-telegram:before { - content: "\ec26"; -} - -.ti-brand-tether:before { - content: "\f5a3"; -} - -.ti-brand-threejs:before { - content: "\f5f0"; -} - -.ti-brand-tidal:before { - content: "\ed70"; -} - -.ti-brand-tikto-filled:before { - content: "\f7ea"; -} - -.ti-brand-tiktok:before { - content: "\ec73"; -} - -.ti-brand-tinder:before { - content: "\ed71"; -} - -.ti-brand-topbuzz:before { - content: "\f50d"; -} - -.ti-brand-torchain:before { - content: "\f5a4"; -} - -.ti-brand-toyota:before { - content: "\f262"; -} - -.ti-brand-trello:before { - content: "\f39d"; -} - -.ti-brand-tripadvisor:before { - content: "\f002"; -} - -.ti-brand-tumblr:before { - content: "\ed04"; -} - -.ti-brand-twilio:before { - content: "\f617"; -} - -.ti-brand-twitch:before { - content: "\ed05"; -} - -.ti-brand-twitter:before { - content: "\ec27"; -} - -.ti-brand-twitter-filled:before { - content: "\f7eb"; -} - -.ti-brand-typescript:before { - content: "\f5f1"; -} - -.ti-brand-uber:before { - content: "\ef75"; -} - -.ti-brand-ubuntu:before { - content: "\ef59"; -} - -.ti-brand-unity:before { - content: "\f49d"; -} - -.ti-brand-unsplash:before { - content: "\edd8"; -} - -.ti-brand-upwork:before { - content: "\f39e"; -} - -.ti-brand-valorant:before { - content: "\f39f"; -} - -.ti-brand-vercel:before { - content: "\ef24"; -} - -.ti-brand-vimeo:before { - content: "\ed06"; -} - -.ti-brand-vinted:before { - content: "\f20f"; -} - -.ti-brand-visa:before { - content: "\f380"; -} - -.ti-brand-visual-studio:before { - content: "\ef76"; -} - -.ti-brand-vite:before { - content: "\f5f2"; -} - -.ti-brand-vivaldi:before { - content: "\f210"; -} - -.ti-brand-vk:before { - content: "\ed72"; -} - -.ti-brand-volkswagen:before { - content: "\f50e"; -} - -.ti-brand-vsco:before { - content: "\f334"; -} - -.ti-brand-vscode:before { - content: "\f3a0"; -} - -.ti-brand-vue:before { - content: "\f0e0"; -} - -.ti-brand-walmart:before { - content: "\f211"; -} - -.ti-brand-waze:before { - content: "\f5d8"; -} - -.ti-brand-webflow:before { - content: "\f2d2"; -} - -.ti-brand-wechat:before { - content: "\f5f3"; -} - -.ti-brand-weibo:before { - content: "\f609"; -} - -.ti-brand-whatsapp:before { - content: "\ec74"; -} - -.ti-brand-windows:before { - content: "\ecd8"; -} - -.ti-brand-windy:before { - content: "\f4dd"; -} - -.ti-brand-wish:before { - content: "\f212"; -} - -.ti-brand-wix:before { - content: "\f3a1"; -} - -.ti-brand-wordpress:before { - content: "\f2d3"; -} - -.ti-brand-xbox:before { - content: "\f298"; -} - -.ti-brand-xing:before { - content: "\f21a"; -} - -.ti-brand-yahoo:before { - content: "\ed73"; -} - -.ti-brand-yatse:before { - content: "\f213"; -} - -.ti-brand-ycombinator:before { - content: "\edd9"; -} - -.ti-brand-youtube:before { - content: "\ec90"; -} - -.ti-brand-youtube-kids:before { - content: "\f214"; -} - -.ti-brand-zalando:before { - content: "\f49e"; -} - -.ti-brand-zapier:before { - content: "\f49f"; -} - -.ti-brand-zeit:before { - content: "\f335"; -} - -.ti-brand-zhihu:before { - content: "\f60a"; -} - -.ti-brand-zoom:before { - content: "\f215"; -} - -.ti-brand-zulip:before { - content: "\f4de"; -} - -.ti-brand-zwift:before { - content: "\f216"; -} - -.ti-bread:before { - content: "\efa3"; -} - -.ti-bread-off:before { - content: "\f3cb"; -} - -.ti-briefcase:before { - content: "\ea46"; -} - -.ti-briefcase-off:before { - content: "\f3cc"; -} - -.ti-brightness:before { - content: "\eb7f"; -} - -.ti-brightness-2:before { - content: "\ee19"; -} - -.ti-brightness-down:before { - content: "\eb7d"; -} - -.ti-brightness-half:before { - content: "\ee1a"; -} - -.ti-brightness-off:before { - content: "\f3cd"; -} - -.ti-brightness-up:before { - content: "\eb7e"; -} - -.ti-broadcast:before { - content: "\f1e9"; -} - -.ti-broadcast-off:before { - content: "\f1e8"; -} - -.ti-browser:before { - content: "\ebb7"; -} - -.ti-browser-check:before { - content: "\efd6"; -} - -.ti-browser-off:before { - content: "\f0c1"; -} - -.ti-browser-plus:before { - content: "\efd7"; -} - -.ti-browser-x:before { - content: "\efd8"; -} - -.ti-brush:before { - content: "\ebb8"; -} - -.ti-brush-off:before { - content: "\f0c2"; -} - -.ti-bucket:before { - content: "\ea47"; -} - -.ti-bucket-droplet:before { - content: "\f56a"; -} - -.ti-bucket-off:before { - content: "\f103"; -} - -.ti-bug:before { - content: "\ea48"; -} - -.ti-bug-off:before { - content: "\f0c3"; -} - -.ti-building:before { - content: "\ea4f"; -} - -.ti-building-arch:before { - content: "\ea49"; -} - -.ti-building-bank:before { - content: "\ebe2"; -} - -.ti-building-bridge:before { - content: "\ea4b"; -} - -.ti-building-bridge-2:before { - content: "\ea4a"; -} - -.ti-building-broadcast-tower:before { - content: "\f4be"; -} - -.ti-building-carousel:before { - content: "\ed87"; -} - -.ti-building-castle:before { - content: "\ed88"; -} - -.ti-building-church:before { - content: "\ea4c"; -} - -.ti-building-circus:before { - content: "\f4bf"; -} - -.ti-building-community:before { - content: "\ebf6"; -} - -.ti-building-cottage:before { - content: "\ee1b"; -} - -.ti-building-estate:before { - content: "\f5a5"; -} - -.ti-building-factory:before { - content: "\ee1c"; -} - -.ti-building-factory-2:before { - content: "\f082"; -} - -.ti-building-fortress:before { - content: "\ed89"; -} - -.ti-building-hospital:before { - content: "\ea4d"; -} - -.ti-building-lighthouse:before { - content: "\ed8a"; -} - -.ti-building-monument:before { - content: "\ed26"; -} - -.ti-building-pavilion:before { - content: "\ebf7"; -} - -.ti-building-skyscraper:before { - content: "\ec39"; -} - -.ti-building-stadium:before { - content: "\f641"; -} - -.ti-building-store:before { - content: "\ea4e"; -} - -.ti-building-tunnel:before { - content: "\f5a6"; -} - -.ti-building-warehouse:before { - content: "\ebe3"; -} - -.ti-building-wind-turbine:before { - content: "\f4c0"; -} - -.ti-bulb:before { - content: "\ea51"; -} - -.ti-bulb-filled:before { - content: "\f66a"; -} - -.ti-bulb-off:before { - content: "\ea50"; -} - -.ti-bulldozer:before { - content: "\ee1d"; -} - -.ti-bus:before { - content: "\ebe4"; -} - -.ti-bus-off:before { - content: "\f3ce"; -} - -.ti-bus-stop:before { - content: "\f2d4"; -} - -.ti-businessplan:before { - content: "\ee1e"; -} - -.ti-butterfly:before { - content: "\efd9"; -} - -.ti-cactus:before { - content: "\f21b"; -} - -.ti-cactus-off:before { - content: "\f3cf"; -} - -.ti-cake:before { - content: "\f00f"; -} - -.ti-cake-off:before { - content: "\f104"; -} - -.ti-calculator:before { - content: "\eb80"; -} - -.ti-calculator-off:before { - content: "\f0c4"; -} - -.ti-calendar:before { - content: "\ea53"; -} - -.ti-calendar-bolt:before { - content: "\f822"; -} - -.ti-calendar-cancel:before { - content: "\f823"; -} - -.ti-calendar-check:before { - content: "\f824"; -} - -.ti-calendar-code:before { - content: "\f825"; -} - -.ti-calendar-cog:before { - content: "\f826"; -} - -.ti-calendar-dollar:before { - content: "\f827"; -} - -.ti-calendar-down:before { - content: "\f828"; -} - -.ti-calendar-due:before { - content: "\f621"; -} - -.ti-calendar-event:before { - content: "\ea52"; -} - -.ti-calendar-exclamation:before { - content: "\f829"; -} - -.ti-calendar-heart:before { - content: "\f82a"; -} - -.ti-calendar-minus:before { - content: "\ebb9"; -} - -.ti-calendar-off:before { - content: "\ee1f"; -} - -.ti-calendar-pause:before { - content: "\f82b"; -} - -.ti-calendar-pin:before { - content: "\f82c"; -} - -.ti-calendar-plus:before { - content: "\ebba"; -} - -.ti-calendar-question:before { - content: "\f82d"; -} - -.ti-calendar-search:before { - content: "\f82e"; -} - -.ti-calendar-share:before { - content: "\f82f"; -} - -.ti-calendar-star:before { - content: "\f830"; -} - -.ti-calendar-stats:before { - content: "\ee20"; -} - -.ti-calendar-time:before { - content: "\ee21"; -} - -.ti-calendar-up:before { - content: "\f831"; -} - -.ti-calendar-x:before { - content: "\f832"; -} - -.ti-camera:before { - content: "\ea54"; -} - -.ti-camera-bolt:before { - content: "\f833"; -} - -.ti-camera-cancel:before { - content: "\f834"; -} - -.ti-camera-check:before { - content: "\f835"; -} - -.ti-camera-code:before { - content: "\f836"; -} - -.ti-camera-cog:before { - content: "\f837"; -} - -.ti-camera-dollar:before { - content: "\f838"; -} - -.ti-camera-down:before { - content: "\f839"; -} - -.ti-camera-exclamation:before { - content: "\f83a"; -} - -.ti-camera-heart:before { - content: "\f83b"; -} - -.ti-camera-minus:before { - content: "\ec3a"; -} - -.ti-camera-off:before { - content: "\ecee"; -} - -.ti-camera-pause:before { - content: "\f83c"; -} - -.ti-camera-pin:before { - content: "\f83d"; -} - -.ti-camera-plus:before { - content: "\ec3b"; -} - -.ti-camera-question:before { - content: "\f83e"; -} - -.ti-camera-rotate:before { - content: "\ee22"; -} - -.ti-camera-search:before { - content: "\f83f"; -} - -.ti-camera-selfie:before { - content: "\ee23"; -} - -.ti-camera-share:before { - content: "\f840"; -} - -.ti-camera-star:before { - content: "\f841"; -} - -.ti-camera-up:before { - content: "\f842"; -} - -.ti-camera-x:before { - content: "\f843"; -} - -.ti-campfire:before { - content: "\f5a7"; -} - -.ti-candle:before { - content: "\efc6"; -} - -.ti-candy:before { - content: "\ef0d"; -} - -.ti-candy-off:before { - content: "\f0c5"; -} - -.ti-cane:before { - content: "\f50f"; -} - -.ti-cannabis:before { - content: "\f4c1"; -} - -.ti-capture:before { - content: "\ec3c"; -} - -.ti-capture-off:before { - content: "\f0c6"; -} - -.ti-car:before { - content: "\ebbb"; -} - -.ti-car-crane:before { - content: "\ef25"; -} - -.ti-car-crash:before { - content: "\efa4"; -} - -.ti-car-off:before { - content: "\f0c7"; -} - -.ti-car-turbine:before { - content: "\f4fd"; -} - -.ti-caravan:before { - content: "\ec7c"; -} - -.ti-cardboards:before { - content: "\ed74"; -} - -.ti-cardboards-off:before { - content: "\f0c8"; -} - -.ti-cards:before { - content: "\f510"; -} - -.ti-caret-down:before { - content: "\eb5d"; -} - -.ti-caret-left:before { - content: "\eb5e"; -} - -.ti-caret-right:before { - content: "\eb5f"; -} - -.ti-caret-up:before { - content: "\eb60"; -} - -.ti-carousel-horizontal:before { - content: "\f659"; -} - -.ti-carousel-vertical:before { - content: "\f65a"; -} - -.ti-carrot:before { - content: "\f21c"; -} - -.ti-carrot-off:before { - content: "\f3d0"; -} - -.ti-cash:before { - content: "\ea55"; -} - -.ti-cash-banknote:before { - content: "\ee25"; -} - -.ti-cash-banknote-off:before { - content: "\ee24"; -} - -.ti-cash-off:before { - content: "\f105"; -} - -.ti-cast:before { - content: "\ea56"; -} - -.ti-cast-off:before { - content: "\f0c9"; -} - -.ti-cat:before { - content: "\f65b"; -} - -.ti-category:before { - content: "\f1f6"; -} - -.ti-category-2:before { - content: "\f1f5"; -} - -.ti-ce:before { - content: "\ed75"; -} - -.ti-ce-off:before { - content: "\f0ca"; -} - -.ti-cell:before { - content: "\f05f"; -} - -.ti-cell-signal-1:before { - content: "\f083"; -} - -.ti-cell-signal-2:before { - content: "\f084"; -} - -.ti-cell-signal-3:before { - content: "\f085"; -} - -.ti-cell-signal-4:before { - content: "\f086"; -} - -.ti-cell-signal-5:before { - content: "\f087"; -} - -.ti-cell-signal-off:before { - content: "\f088"; -} - -.ti-certificate:before { - content: "\ed76"; -} - -.ti-certificate-2:before { - content: "\f073"; -} - -.ti-certificate-2-off:before { - content: "\f0cb"; -} - -.ti-certificate-off:before { - content: "\f0cc"; -} - -.ti-chair-director:before { - content: "\f2d5"; -} - -.ti-chalkboard:before { - content: "\f34d"; -} - -.ti-chalkboard-off:before { - content: "\f3d1"; -} - -.ti-charging-pile:before { - content: "\ee26"; -} - -.ti-chart-arcs:before { - content: "\ee28"; -} - -.ti-chart-arcs-3:before { - content: "\ee27"; -} - -.ti-chart-area:before { - content: "\ea58"; -} - -.ti-chart-area-filled:before { - content: "\f66b"; -} - -.ti-chart-area-line:before { - content: "\ea57"; -} - -.ti-chart-area-line-filled:before { - content: "\f66c"; -} - -.ti-chart-arrows:before { - content: "\ee2a"; -} - -.ti-chart-arrows-vertical:before { - content: "\ee29"; -} - -.ti-chart-bar:before { - content: "\ea59"; -} - -.ti-chart-bar-off:before { - content: "\f3d2"; -} - -.ti-chart-bubble:before { - content: "\ec75"; -} - -.ti-chart-bubble-filled:before { - content: "\f66d"; -} - -.ti-chart-candle:before { - content: "\ea5a"; -} - -.ti-chart-candle-filled:before { - content: "\f66e"; -} - -.ti-chart-circles:before { - content: "\ee2b"; -} - -.ti-chart-donut:before { - content: "\ea5b"; -} - -.ti-chart-donut-2:before { - content: "\ee2c"; -} - -.ti-chart-donut-3:before { - content: "\ee2d"; -} - -.ti-chart-donut-4:before { - content: "\ee2e"; -} - -.ti-chart-donut-filled:before { - content: "\f66f"; -} - -.ti-chart-dots:before { - content: "\ee2f"; -} - -.ti-chart-dots-2:before { - content: "\f097"; -} - -.ti-chart-dots-3:before { - content: "\f098"; -} - -.ti-chart-grid-dots:before { - content: "\f4c2"; -} - -.ti-chart-histogram:before { - content: "\f65c"; -} - -.ti-chart-infographic:before { - content: "\ee30"; -} - -.ti-chart-line:before { - content: "\ea5c"; -} - -.ti-chart-pie:before { - content: "\ea5d"; -} - -.ti-chart-pie-2:before { - content: "\ee31"; -} - -.ti-chart-pie-3:before { - content: "\ee32"; -} - -.ti-chart-pie-4:before { - content: "\ee33"; -} - -.ti-chart-pie-filled:before { - content: "\f670"; -} - -.ti-chart-pie-off:before { - content: "\f3d3"; -} - -.ti-chart-ppf:before { - content: "\f618"; -} - -.ti-chart-radar:before { - content: "\ed77"; -} - -.ti-chart-sankey:before { - content: "\f619"; -} - -.ti-chart-treemap:before { - content: "\f381"; -} - -.ti-check:before { - content: "\ea5e"; -} - -.ti-checkbox:before { - content: "\eba6"; -} - -.ti-checklist:before { - content: "\f074"; -} - -.ti-checks:before { - content: "\ebaa"; -} - -.ti-checkup-list:before { - content: "\ef5a"; -} - -.ti-cheese:before { - content: "\ef26"; -} - -.ti-chef-hat:before { - content: "\f21d"; -} - -.ti-chef-hat-off:before { - content: "\f3d4"; -} - -.ti-cherry:before { - content: "\f511"; -} - -.ti-cherry-filled:before { - content: "\f728"; -} - -.ti-chess:before { - content: "\f382"; -} - -.ti-chess-bishop:before { - content: "\f56b"; -} - -.ti-chess-bishop-filled:before { - content: "\f729"; -} - -.ti-chess-filled:before { - content: "\f72a"; -} - -.ti-chess-king:before { - content: "\f56c"; -} - -.ti-chess-king-filled:before { - content: "\f72b"; -} - -.ti-chess-knight:before { - content: "\f56d"; -} - -.ti-chess-knight-filled:before { - content: "\f72c"; -} - -.ti-chess-queen:before { - content: "\f56e"; -} - -.ti-chess-queen-filled:before { - content: "\f72d"; -} - -.ti-chess-rook:before { - content: "\f56f"; -} - -.ti-chess-rook-filled:before { - content: "\f72e"; -} - -.ti-chevron-down:before { - content: "\ea5f"; -} - -.ti-chevron-down-left:before { - content: "\ed09"; -} - -.ti-chevron-down-right:before { - content: "\ed0a"; -} - -.ti-chevron-left:before { - content: "\ea60"; -} - -.ti-chevron-right:before { - content: "\ea61"; -} - -.ti-chevron-up:before { - content: "\ea62"; -} - -.ti-chevron-up-left:before { - content: "\ed0b"; -} - -.ti-chevron-up-right:before { - content: "\ed0c"; -} - -.ti-chevrons-down:before { - content: "\ea63"; -} - -.ti-chevrons-down-left:before { - content: "\ed0d"; -} - -.ti-chevrons-down-right:before { - content: "\ed0e"; -} - -.ti-chevrons-left:before { - content: "\ea64"; -} - -.ti-chevrons-right:before { - content: "\ea65"; -} - -.ti-chevrons-up:before { - content: "\ea66"; -} - -.ti-chevrons-up-left:before { - content: "\ed0f"; -} - -.ti-chevrons-up-right:before { - content: "\ed10"; -} - -.ti-chisel:before { - content: "\f383"; -} - -.ti-christmas-tree:before { - content: "\ed78"; -} - -.ti-christmas-tree-off:before { - content: "\f3d5"; -} - -.ti-circle:before { - content: "\ea6b"; -} - -.ti-circle-0-filled:before { - content: "\f72f"; -} - -.ti-circle-1-filled:before { - content: "\f730"; -} - -.ti-circle-2-filled:before { - content: "\f731"; -} - -.ti-circle-3-filled:before { - content: "\f732"; -} - -.ti-circle-4-filled:before { - content: "\f733"; -} - -.ti-circle-5-filled:before { - content: "\f734"; -} - -.ti-circle-6-filled:before { - content: "\f735"; -} - -.ti-circle-7-filled:before { - content: "\f736"; -} - -.ti-circle-8-filled:before { - content: "\f737"; -} - -.ti-circle-9-filled:before { - content: "\f738"; -} - -.ti-circle-arrow-down:before { - content: "\f6f9"; -} - -.ti-circle-arrow-down-filled:before { - content: "\f6f4"; -} - -.ti-circle-arrow-down-left:before { - content: "\f6f6"; -} - -.ti-circle-arrow-down-left-filled:before { - content: "\f6f5"; -} - -.ti-circle-arrow-down-right:before { - content: "\f6f8"; -} - -.ti-circle-arrow-down-right-filled:before { - content: "\f6f7"; -} - -.ti-circle-arrow-left:before { - content: "\f6fb"; -} - -.ti-circle-arrow-left-filled:before { - content: "\f6fa"; -} - -.ti-circle-arrow-right:before { - content: "\f6fd"; -} - -.ti-circle-arrow-right-filled:before { - content: "\f6fc"; -} - -.ti-circle-arrow-up:before { - content: "\f703"; -} - -.ti-circle-arrow-up-filled:before { - content: "\f6fe"; -} - -.ti-circle-arrow-up-left:before { - content: "\f700"; -} - -.ti-circle-arrow-up-left-filled:before { - content: "\f6ff"; -} - -.ti-circle-arrow-up-right:before { - content: "\f702"; -} - -.ti-circle-arrow-up-right-filled:before { - content: "\f701"; -} - -.ti-circle-caret-down:before { - content: "\f4a9"; -} - -.ti-circle-caret-left:before { - content: "\f4aa"; -} - -.ti-circle-caret-right:before { - content: "\f4ab"; -} - -.ti-circle-caret-up:before { - content: "\f4ac"; -} - -.ti-circle-check:before { - content: "\ea67"; -} - -.ti-circle-check-filled:before { - content: "\f704"; -} - -.ti-circle-chevron-down:before { - content: "\f622"; -} - -.ti-circle-chevron-left:before { - content: "\f623"; -} - -.ti-circle-chevron-right:before { - content: "\f624"; -} - -.ti-circle-chevron-up:before { - content: "\f625"; -} - -.ti-circle-chevrons-down:before { - content: "\f642"; -} - -.ti-circle-chevrons-left:before { - content: "\f643"; -} - -.ti-circle-chevrons-right:before { - content: "\f644"; -} - -.ti-circle-chevrons-up:before { - content: "\f645"; -} - -.ti-circle-dashed:before { - content: "\ed27"; -} - -.ti-circle-dot:before { - content: "\efb1"; -} - -.ti-circle-dot-filled:before { - content: "\f705"; -} - -.ti-circle-dotted:before { - content: "\ed28"; -} - -.ti-circle-filled:before { - content: "\f671"; -} - -.ti-circle-half:before { - content: "\ee3f"; -} - -.ti-circle-half-2:before { - content: "\eff3"; -} - -.ti-circle-half-vertical:before { - content: "\ee3e"; -} - -.ti-circle-key:before { - content: "\f633"; -} - -.ti-circle-key-filled:before { - content: "\f706"; -} - -.ti-circle-letter-a:before { - content: "\f441"; -} - -.ti-circle-letter-b:before { - content: "\f442"; -} - -.ti-circle-letter-c:before { - content: "\f443"; -} - -.ti-circle-letter-d:before { - content: "\f444"; -} - -.ti-circle-letter-e:before { - content: "\f445"; -} - -.ti-circle-letter-f:before { - content: "\f446"; -} - -.ti-circle-letter-g:before { - content: "\f447"; -} - -.ti-circle-letter-h:before { - content: "\f448"; -} - -.ti-circle-letter-i:before { - content: "\f449"; -} - -.ti-circle-letter-j:before { - content: "\f44a"; -} - -.ti-circle-letter-k:before { - content: "\f44b"; -} - -.ti-circle-letter-l:before { - content: "\f44c"; -} - -.ti-circle-letter-m:before { - content: "\f44d"; -} - -.ti-circle-letter-n:before { - content: "\f44e"; -} - -.ti-circle-letter-o:before { - content: "\f44f"; -} - -.ti-circle-letter-p:before { - content: "\f450"; -} - -.ti-circle-letter-q:before { - content: "\f451"; -} - -.ti-circle-letter-r:before { - content: "\f452"; -} - -.ti-circle-letter-s:before { - content: "\f453"; -} - -.ti-circle-letter-t:before { - content: "\f454"; -} - -.ti-circle-letter-u:before { - content: "\f455"; -} - -.ti-circle-letter-v:before { - content: "\f4ad"; -} - -.ti-circle-letter-w:before { - content: "\f456"; -} - -.ti-circle-letter-x:before { - content: "\f4ae"; -} - -.ti-circle-letter-y:before { - content: "\f457"; -} - -.ti-circle-letter-z:before { - content: "\f458"; -} - -.ti-circle-minus:before { - content: "\ea68"; -} - -.ti-circle-number-0:before { - content: "\ee34"; -} - -.ti-circle-number-1:before { - content: "\ee35"; -} - -.ti-circle-number-2:before { - content: "\ee36"; -} - -.ti-circle-number-3:before { - content: "\ee37"; -} - -.ti-circle-number-4:before { - content: "\ee38"; -} - -.ti-circle-number-5:before { - content: "\ee39"; -} - -.ti-circle-number-6:before { - content: "\ee3a"; -} - -.ti-circle-number-7:before { - content: "\ee3b"; -} - -.ti-circle-number-8:before { - content: "\ee3c"; -} - -.ti-circle-number-9:before { - content: "\ee3d"; -} - -.ti-circle-off:before { - content: "\ee40"; -} - -.ti-circle-plus:before { - content: "\ea69"; -} - -.ti-circle-rectangle:before { - content: "\f010"; -} - -.ti-circle-rectangle-off:before { - content: "\f0cd"; -} - -.ti-circle-square:before { - content: "\ece4"; -} - -.ti-circle-triangle:before { - content: "\f011"; -} - -.ti-circle-x:before { - content: "\ea6a"; -} - -.ti-circle-x-filled:before { - content: "\f739"; -} - -.ti-circles:before { - content: "\ece5"; -} - -.ti-circles-filled:before { - content: "\f672"; -} - -.ti-circles-relation:before { - content: "\f4c3"; -} - -.ti-circuit-ammeter:before { - content: "\f271"; -} - -.ti-circuit-battery:before { - content: "\f272"; -} - -.ti-circuit-bulb:before { - content: "\f273"; -} - -.ti-circuit-capacitor:before { - content: "\f275"; -} - -.ti-circuit-capacitor-polarized:before { - content: "\f274"; -} - -.ti-circuit-cell:before { - content: "\f277"; -} - -.ti-circuit-cell-plus:before { - content: "\f276"; -} - -.ti-circuit-changeover:before { - content: "\f278"; -} - -.ti-circuit-diode:before { - content: "\f27a"; -} - -.ti-circuit-diode-zener:before { - content: "\f279"; -} - -.ti-circuit-ground:before { - content: "\f27c"; -} - -.ti-circuit-ground-digital:before { - content: "\f27b"; -} - -.ti-circuit-inductor:before { - content: "\f27d"; -} - -.ti-circuit-motor:before { - content: "\f27e"; -} - -.ti-circuit-pushbutton:before { - content: "\f27f"; -} - -.ti-circuit-resistor:before { - content: "\f280"; -} - -.ti-circuit-switch-closed:before { - content: "\f281"; -} - -.ti-circuit-switch-open:before { - content: "\f282"; -} - -.ti-circuit-voltmeter:before { - content: "\f283"; -} - -.ti-clear-all:before { - content: "\ee41"; -} - -.ti-clear-formatting:before { - content: "\ebe5"; -} - -.ti-click:before { - content: "\ebbc"; -} - -.ti-clipboard:before { - content: "\ea6f"; -} - -.ti-clipboard-check:before { - content: "\ea6c"; -} - -.ti-clipboard-copy:before { - content: "\f299"; -} - -.ti-clipboard-data:before { - content: "\f563"; -} - -.ti-clipboard-heart:before { - content: "\f34e"; -} - -.ti-clipboard-list:before { - content: "\ea6d"; -} - -.ti-clipboard-off:before { - content: "\f0ce"; -} - -.ti-clipboard-plus:before { - content: "\efb2"; -} - -.ti-clipboard-text:before { - content: "\f089"; -} - -.ti-clipboard-typography:before { - content: "\f34f"; -} - -.ti-clipboard-x:before { - content: "\ea6e"; -} - -.ti-clock:before { - content: "\ea70"; -} - -.ti-clock-2:before { - content: "\f099"; -} - -.ti-clock-bolt:before { - content: "\f844"; -} - -.ti-clock-cancel:before { - content: "\f546"; -} - -.ti-clock-check:before { - content: "\f7c1"; -} - -.ti-clock-code:before { - content: "\f845"; -} - -.ti-clock-cog:before { - content: "\f7c2"; -} - -.ti-clock-dollar:before { - content: "\f846"; -} - -.ti-clock-down:before { - content: "\f7c3"; -} - -.ti-clock-edit:before { - content: "\f547"; -} - -.ti-clock-exclamation:before { - content: "\f847"; -} - -.ti-clock-filled:before { - content: "\f73a"; -} - -.ti-clock-heart:before { - content: "\f7c4"; -} - -.ti-clock-hour-1:before { - content: "\f313"; -} - -.ti-clock-hour-10:before { - content: "\f314"; -} - -.ti-clock-hour-11:before { - content: "\f315"; -} - -.ti-clock-hour-12:before { - content: "\f316"; -} - -.ti-clock-hour-2:before { - content: "\f317"; -} - -.ti-clock-hour-3:before { - content: "\f318"; -} - -.ti-clock-hour-4:before { - content: "\f319"; -} - -.ti-clock-hour-5:before { - content: "\f31a"; -} - -.ti-clock-hour-6:before { - content: "\f31b"; -} - -.ti-clock-hour-7:before { - content: "\f31c"; -} - -.ti-clock-hour-8:before { - content: "\f31d"; -} - -.ti-clock-hour-9:before { - content: "\f31e"; -} - -.ti-clock-minus:before { - content: "\f848"; -} - -.ti-clock-off:before { - content: "\f0cf"; -} - -.ti-clock-pause:before { - content: "\f548"; -} - -.ti-clock-pin:before { - content: "\f849"; -} - -.ti-clock-play:before { - content: "\f549"; -} - -.ti-clock-plus:before { - content: "\f7c5"; -} - -.ti-clock-question:before { - content: "\f7c6"; -} - -.ti-clock-record:before { - content: "\f54a"; -} - -.ti-clock-search:before { - content: "\f7c7"; -} - -.ti-clock-share:before { - content: "\f84a"; -} - -.ti-clock-shield:before { - content: "\f7c8"; -} - -.ti-clock-star:before { - content: "\f7c9"; -} - -.ti-clock-stop:before { - content: "\f54b"; -} - -.ti-clock-up:before { - content: "\f7ca"; -} - -.ti-clock-x:before { - content: "\f7cb"; -} - -.ti-clothes-rack:before { - content: "\f285"; -} - -.ti-clothes-rack-off:before { - content: "\f3d6"; -} - -.ti-cloud:before { - content: "\ea76"; -} - -.ti-cloud-bolt:before { - content: "\f84b"; -} - -.ti-cloud-cancel:before { - content: "\f84c"; -} - -.ti-cloud-check:before { - content: "\f84d"; -} - -.ti-cloud-code:before { - content: "\f84e"; -} - -.ti-cloud-cog:before { - content: "\f84f"; -} - -.ti-cloud-computing:before { - content: "\f1d0"; -} - -.ti-cloud-data-connection:before { - content: "\f1d1"; -} - -.ti-cloud-dollar:before { - content: "\f850"; -} - -.ti-cloud-down:before { - content: "\f851"; -} - -.ti-cloud-download:before { - content: "\ea71"; -} - -.ti-cloud-exclamation:before { - content: "\f852"; -} - -.ti-cloud-filled:before { - content: "\f673"; -} - -.ti-cloud-fog:before { - content: "\ecd9"; -} - -.ti-cloud-heart:before { - content: "\f853"; -} - -.ti-cloud-lock:before { - content: "\efdb"; -} - -.ti-cloud-lock-open:before { - content: "\efda"; -} - -.ti-cloud-minus:before { - content: "\f854"; -} - -.ti-cloud-off:before { - content: "\ed3e"; -} - -.ti-cloud-pause:before { - content: "\f855"; -} - -.ti-cloud-pin:before { - content: "\f856"; -} - -.ti-cloud-plus:before { - content: "\f857"; -} - -.ti-cloud-question:before { - content: "\f858"; -} - -.ti-cloud-rain:before { - content: "\ea72"; -} - -.ti-cloud-search:before { - content: "\f859"; -} - -.ti-cloud-share:before { - content: "\f85a"; -} - -.ti-cloud-snow:before { - content: "\ea73"; -} - -.ti-cloud-star:before { - content: "\f85b"; -} - -.ti-cloud-storm:before { - content: "\ea74"; -} - -.ti-cloud-up:before { - content: "\f85c"; -} - -.ti-cloud-upload:before { - content: "\ea75"; -} - -.ti-cloud-x:before { - content: "\f85d"; -} - -.ti-clover:before { - content: "\f1ea"; -} - -.ti-clover-2:before { - content: "\f21e"; -} - -.ti-clubs:before { - content: "\eff4"; -} - -.ti-clubs-filled:before { - content: "\f674"; -} - -.ti-code:before { - content: "\ea77"; -} - -.ti-code-asterix:before { - content: "\f312"; -} - -.ti-code-circle:before { - content: "\f4ff"; -} - -.ti-code-circle-2:before { - content: "\f4fe"; -} - -.ti-code-dots:before { - content: "\f61a"; -} - -.ti-code-minus:before { - content: "\ee42"; -} - -.ti-code-off:before { - content: "\f0d0"; -} - -.ti-code-plus:before { - content: "\ee43"; -} - -.ti-coffee:before { - content: "\ef0e"; -} - -.ti-coffee-off:before { - content: "\f106"; -} - -.ti-coffin:before { - content: "\f579"; -} - -.ti-coin:before { - content: "\eb82"; -} - -.ti-coin-bitcoin:before { - content: "\f2be"; -} - -.ti-coin-euro:before { - content: "\f2bf"; -} - -.ti-coin-monero:before { - content: "\f4a0"; -} - -.ti-coin-off:before { - content: "\f0d1"; -} - -.ti-coin-pound:before { - content: "\f2c0"; -} - -.ti-coin-rupee:before { - content: "\f2c1"; -} - -.ti-coin-yen:before { - content: "\f2c2"; -} - -.ti-coin-yuan:before { - content: "\f2c3"; -} - -.ti-coins:before { - content: "\f65d"; -} - -.ti-color-filter:before { - content: "\f5a8"; -} - -.ti-color-picker:before { - content: "\ebe6"; -} - -.ti-color-picker-off:before { - content: "\f0d2"; -} - -.ti-color-swatch:before { - content: "\eb61"; -} - -.ti-color-swatch-off:before { - content: "\f0d3"; -} - -.ti-column-insert-left:before { - content: "\ee44"; -} - -.ti-column-insert-right:before { - content: "\ee45"; -} - -.ti-columns:before { - content: "\eb83"; -} - -.ti-columns-1:before { - content: "\f6d4"; -} - -.ti-columns-2:before { - content: "\f6d5"; -} - -.ti-columns-3:before { - content: "\f6d6"; -} - -.ti-columns-off:before { - content: "\f0d4"; -} - -.ti-comet:before { - content: "\ec76"; -} - -.ti-command:before { - content: "\ea78"; -} - -.ti-command-off:before { - content: "\f3d7"; -} - -.ti-compass:before { - content: "\ea79"; -} - -.ti-compass-off:before { - content: "\f0d5"; -} - -.ti-components:before { - content: "\efa5"; -} - -.ti-components-off:before { - content: "\f0d6"; -} - -.ti-cone:before { - content: "\efdd"; -} - -.ti-cone-2:before { - content: "\efdc"; -} - -.ti-cone-off:before { - content: "\f3d8"; -} - -.ti-confetti:before { - content: "\ee46"; -} - -.ti-confetti-off:before { - content: "\f3d9"; -} - -.ti-confucius:before { - content: "\f58a"; -} - -.ti-container:before { - content: "\ee47"; -} - -.ti-container-off:before { - content: "\f107"; -} - -.ti-contrast:before { - content: "\ec4e"; -} - -.ti-contrast-2:before { - content: "\efc7"; -} - -.ti-contrast-2-off:before { - content: "\f3da"; -} - -.ti-contrast-off:before { - content: "\f3db"; -} - -.ti-cooker:before { - content: "\f57a"; -} - -.ti-cookie:before { - content: "\ef0f"; -} - -.ti-cookie-man:before { - content: "\f4c4"; -} - -.ti-cookie-off:before { - content: "\f0d7"; -} - -.ti-copy:before { - content: "\ea7a"; -} - -.ti-copy-off:before { - content: "\f0d8"; -} - -.ti-copyleft:before { - content: "\ec3d"; -} - -.ti-copyleft-filled:before { - content: "\f73b"; -} - -.ti-copyleft-off:before { - content: "\f0d9"; -} - -.ti-copyright:before { - content: "\ea7b"; -} - -.ti-copyright-filled:before { - content: "\f73c"; -} - -.ti-copyright-off:before { - content: "\f0da"; -} - -.ti-corner-down-left:before { - content: "\ea7c"; -} - -.ti-corner-down-left-double:before { - content: "\ee48"; -} - -.ti-corner-down-right:before { - content: "\ea7d"; -} - -.ti-corner-down-right-double:before { - content: "\ee49"; -} - -.ti-corner-left-down:before { - content: "\ea7e"; -} - -.ti-corner-left-down-double:before { - content: "\ee4a"; -} - -.ti-corner-left-up:before { - content: "\ea7f"; -} - -.ti-corner-left-up-double:before { - content: "\ee4b"; -} - -.ti-corner-right-down:before { - content: "\ea80"; -} - -.ti-corner-right-down-double:before { - content: "\ee4c"; -} - -.ti-corner-right-up:before { - content: "\ea81"; -} - -.ti-corner-right-up-double:before { - content: "\ee4d"; -} - -.ti-corner-up-left:before { - content: "\ea82"; -} - -.ti-corner-up-left-double:before { - content: "\ee4e"; -} - -.ti-corner-up-right:before { - content: "\ea83"; -} - -.ti-corner-up-right-double:before { - content: "\ee4f"; -} - -.ti-cpu:before { - content: "\ef8e"; -} - -.ti-cpu-2:before { - content: "\f075"; -} - -.ti-cpu-off:before { - content: "\f108"; -} - -.ti-crane:before { - content: "\ef27"; -} - -.ti-crane-off:before { - content: "\f109"; -} - -.ti-creative-commons:before { - content: "\efb3"; -} - -.ti-creative-commons-by:before { - content: "\f21f"; -} - -.ti-creative-commons-nc:before { - content: "\f220"; -} - -.ti-creative-commons-nd:before { - content: "\f221"; -} - -.ti-creative-commons-off:before { - content: "\f10a"; -} - -.ti-creative-commons-sa:before { - content: "\f222"; -} - -.ti-creative-commons-zero:before { - content: "\f223"; -} - -.ti-credit-card:before { - content: "\ea84"; -} - -.ti-credit-card-off:before { - content: "\ed11"; -} - -.ti-cricket:before { - content: "\f09a"; -} - -.ti-crop:before { - content: "\ea85"; -} - -.ti-cross:before { - content: "\ef8f"; -} - -.ti-cross-filled:before { - content: "\f675"; -} - -.ti-cross-off:before { - content: "\f10b"; -} - -.ti-crosshair:before { - content: "\ec3e"; -} - -.ti-crown:before { - content: "\ed12"; -} - -.ti-crown-off:before { - content: "\ee50"; -} - -.ti-crutches:before { - content: "\ef5b"; -} - -.ti-crutches-off:before { - content: "\f10c"; -} - -.ti-crystal-ball:before { - content: "\f57b"; -} - -.ti-csv:before { - content: "\f791"; -} - -.ti-cube-send:before { - content: "\f61b"; -} - -.ti-cube-unfolded:before { - content: "\f61c"; -} - -.ti-cup:before { - content: "\ef28"; -} - -.ti-cup-off:before { - content: "\f10d"; -} - -.ti-curling:before { - content: "\efc8"; -} - -.ti-curly-loop:before { - content: "\ecda"; -} - -.ti-currency:before { - content: "\efa6"; -} - -.ti-currency-afghani:before { - content: "\f65e"; -} - -.ti-currency-bahraini:before { - content: "\ee51"; -} - -.ti-currency-baht:before { - content: "\f08a"; -} - -.ti-currency-bitcoin:before { - content: "\ebab"; -} - -.ti-currency-cent:before { - content: "\ee53"; -} - -.ti-currency-dinar:before { - content: "\ee54"; -} - -.ti-currency-dirham:before { - content: "\ee55"; -} - -.ti-currency-dogecoin:before { - content: "\ef4b"; -} - -.ti-currency-dollar:before { - content: "\eb84"; -} - -.ti-currency-dollar-australian:before { - content: "\ee56"; -} - -.ti-currency-dollar-brunei:before { - content: "\f36c"; -} - -.ti-currency-dollar-canadian:before { - content: "\ee57"; -} - -.ti-currency-dollar-guyanese:before { - content: "\f36d"; -} - -.ti-currency-dollar-off:before { - content: "\f3dc"; -} - -.ti-currency-dollar-singapore:before { - content: "\ee58"; -} - -.ti-currency-dollar-zimbabwean:before { - content: "\f36e"; -} - -.ti-currency-dong:before { - content: "\f36f"; -} - -.ti-currency-dram:before { - content: "\f370"; -} - -.ti-currency-ethereum:before { - content: "\ee59"; -} - -.ti-currency-euro:before { - content: "\eb85"; -} - -.ti-currency-euro-off:before { - content: "\f3dd"; -} - -.ti-currency-forint:before { - content: "\ee5a"; -} - -.ti-currency-frank:before { - content: "\ee5b"; -} - -.ti-currency-guarani:before { - content: "\f371"; -} - -.ti-currency-hryvnia:before { - content: "\f372"; -} - -.ti-currency-kip:before { - content: "\f373"; -} - -.ti-currency-krone-czech:before { - content: "\ee5c"; -} - -.ti-currency-krone-danish:before { - content: "\ee5d"; -} - -.ti-currency-krone-swedish:before { - content: "\ee5e"; -} - -.ti-currency-lari:before { - content: "\f374"; -} - -.ti-currency-leu:before { - content: "\ee5f"; -} - -.ti-currency-lira:before { - content: "\ee60"; -} - -.ti-currency-litecoin:before { - content: "\ee61"; -} - -.ti-currency-lyd:before { - content: "\f375"; -} - -.ti-currency-manat:before { - content: "\f376"; -} - -.ti-currency-monero:before { - content: "\f377"; -} - -.ti-currency-naira:before { - content: "\ee62"; -} - -.ti-currency-nano:before { - content: "\f7a6"; -} - -.ti-currency-off:before { - content: "\f3de"; -} - -.ti-currency-paanga:before { - content: "\f378"; -} - -.ti-currency-peso:before { - content: "\f65f"; -} - -.ti-currency-pound:before { - content: "\ebac"; -} - -.ti-currency-pound-off:before { - content: "\f3df"; -} - -.ti-currency-quetzal:before { - content: "\f379"; -} - -.ti-currency-real:before { - content: "\ee63"; -} - -.ti-currency-renminbi:before { - content: "\ee64"; -} - -.ti-currency-ripple:before { - content: "\ee65"; -} - -.ti-currency-riyal:before { - content: "\ee66"; -} - -.ti-currency-rubel:before { - content: "\ee67"; -} - -.ti-currency-rufiyaa:before { - content: "\f37a"; -} - -.ti-currency-rupee:before { - content: "\ebad"; -} - -.ti-currency-rupee-nepalese:before { - content: "\f37b"; -} - -.ti-currency-shekel:before { - content: "\ee68"; -} - -.ti-currency-solana:before { - content: "\f4a1"; -} - -.ti-currency-som:before { - content: "\f37c"; -} - -.ti-currency-taka:before { - content: "\ee69"; -} - -.ti-currency-tenge:before { - content: "\f37d"; -} - -.ti-currency-tugrik:before { - content: "\ee6a"; -} - -.ti-currency-won:before { - content: "\ee6b"; -} - -.ti-currency-yen:before { - content: "\ebae"; -} - -.ti-currency-yen-off:before { - content: "\f3e0"; -} - -.ti-currency-yuan:before { - content: "\f29a"; -} - -.ti-currency-zloty:before { - content: "\ee6c"; -} - -.ti-current-location:before { - content: "\ecef"; -} - -.ti-current-location-off:before { - content: "\f10e"; -} - -.ti-cursor-off:before { - content: "\f10f"; -} - -.ti-cursor-text:before { - content: "\ee6d"; -} - -.ti-cut:before { - content: "\ea86"; -} - -.ti-cylinder:before { - content: "\f54c"; -} - -.ti-dashboard:before { - content: "\ea87"; -} - -.ti-dashboard-off:before { - content: "\f3e1"; -} - -.ti-database:before { - content: "\ea88"; -} - -.ti-database-export:before { - content: "\ee6e"; -} - -.ti-database-import:before { - content: "\ee6f"; -} - -.ti-database-off:before { - content: "\ee70"; -} - -.ti-deer:before { - content: "\f4c5"; -} - -.ti-delta:before { - content: "\f53c"; -} - -.ti-dental:before { - content: "\f025"; -} - -.ti-dental-broken:before { - content: "\f286"; -} - -.ti-dental-off:before { - content: "\f110"; -} - -.ti-deselect:before { - content: "\f9f3"; -} - -.ti-details:before { - content: "\ee71"; -} - -.ti-details-off:before { - content: "\f3e2"; -} - -.ti-device-airpods:before { - content: "\f5a9"; -} - -.ti-device-airpods-case:before { - content: "\f646"; -} - -.ti-device-analytics:before { - content: "\ee72"; -} - -.ti-device-audio-tape:before { - content: "\ee73"; -} - -.ti-device-camera-phone:before { - content: "\f233"; -} - -.ti-device-cctv:before { - content: "\ee74"; -} - -.ti-device-cctv-off:before { - content: "\f3e3"; -} - -.ti-device-computer-camera:before { - content: "\ee76"; -} - -.ti-device-computer-camera-off:before { - content: "\ee75"; -} - -.ti-device-desktop:before { - content: "\ea89"; -} - -.ti-device-desktop-analytics:before { - content: "\ee77"; -} - -.ti-device-desktop-bolt:before { - content: "\f85e"; -} - -.ti-device-desktop-cancel:before { - content: "\f85f"; -} - -.ti-device-desktop-check:before { - content: "\f860"; -} - -.ti-device-desktop-code:before { - content: "\f861"; -} - -.ti-device-desktop-cog:before { - content: "\f862"; -} - -.ti-device-desktop-dollar:before { - content: "\f863"; -} - -.ti-device-desktop-down:before { - content: "\f864"; -} - -.ti-device-desktop-exclamation:before { - content: "\f865"; -} - -.ti-device-desktop-heart:before { - content: "\f866"; -} - -.ti-device-desktop-minus:before { - content: "\f867"; -} - -.ti-device-desktop-off:before { - content: "\ee78"; -} - -.ti-device-desktop-pause:before { - content: "\f868"; -} - -.ti-device-desktop-pin:before { - content: "\f869"; -} - -.ti-device-desktop-plus:before { - content: "\f86a"; -} - -.ti-device-desktop-question:before { - content: "\f86b"; -} - -.ti-device-desktop-search:before { - content: "\f86c"; -} - -.ti-device-desktop-share:before { - content: "\f86d"; -} - -.ti-device-desktop-star:before { - content: "\f86e"; -} - -.ti-device-desktop-up:before { - content: "\f86f"; -} - -.ti-device-desktop-x:before { - content: "\f870"; -} - -.ti-device-floppy:before { - content: "\eb62"; -} - -.ti-device-gamepad:before { - content: "\eb63"; -} - -.ti-device-gamepad-2:before { - content: "\f1d2"; -} - -.ti-device-heart-monitor:before { - content: "\f060"; -} - -.ti-device-imac:before { - content: "\f7a7"; -} - -.ti-device-imac-bolt:before { - content: "\f871"; -} - -.ti-device-imac-cancel:before { - content: "\f872"; -} - -.ti-device-imac-check:before { - content: "\f873"; -} - -.ti-device-imac-code:before { - content: "\f874"; -} - -.ti-device-imac-cog:before { - content: "\f875"; -} - -.ti-device-imac-dollar:before { - content: "\f876"; -} - -.ti-device-imac-down:before { - content: "\f877"; -} - -.ti-device-imac-exclamation:before { - content: "\f878"; -} - -.ti-device-imac-heart:before { - content: "\f879"; -} - -.ti-device-imac-minus:before { - content: "\f87a"; -} - -.ti-device-imac-off:before { - content: "\f87b"; -} - -.ti-device-imac-pause:before { - content: "\f87c"; -} - -.ti-device-imac-pin:before { - content: "\f87d"; -} - -.ti-device-imac-plus:before { - content: "\f87e"; -} - -.ti-device-imac-question:before { - content: "\f87f"; -} - -.ti-device-imac-search:before { - content: "\f880"; -} - -.ti-device-imac-share:before { - content: "\f881"; -} - -.ti-device-imac-star:before { - content: "\f882"; -} - -.ti-device-imac-up:before { - content: "\f883"; -} - -.ti-device-imac-x:before { - content: "\f884"; -} - -.ti-device-ipad:before { - content: "\f648"; -} - -.ti-device-ipad-bolt:before { - content: "\f885"; -} - -.ti-device-ipad-cancel:before { - content: "\f886"; -} - -.ti-device-ipad-check:before { - content: "\f887"; -} - -.ti-device-ipad-code:before { - content: "\f888"; -} - -.ti-device-ipad-cog:before { - content: "\f889"; -} - -.ti-device-ipad-dollar:before { - content: "\f88a"; -} - -.ti-device-ipad-down:before { - content: "\f88b"; -} - -.ti-device-ipad-exclamation:before { - content: "\f88c"; -} - -.ti-device-ipad-heart:before { - content: "\f88d"; -} - -.ti-device-ipad-horizontal:before { - content: "\f647"; -} - -.ti-device-ipad-horizontal-bolt:before { - content: "\f88e"; -} - -.ti-device-ipad-horizontal-cancel:before { - content: "\f88f"; -} - -.ti-device-ipad-horizontal-check:before { - content: "\f890"; -} - -.ti-device-ipad-horizontal-code:before { - content: "\f891"; -} - -.ti-device-ipad-horizontal-cog:before { - content: "\f892"; -} - -.ti-device-ipad-horizontal-dollar:before { - content: "\f893"; -} - -.ti-device-ipad-horizontal-down:before { - content: "\f894"; -} - -.ti-device-ipad-horizontal-exclamation:before { - content: "\f895"; -} - -.ti-device-ipad-horizontal-heart:before { - content: "\f896"; -} - -.ti-device-ipad-horizontal-minus:before { - content: "\f897"; -} - -.ti-device-ipad-horizontal-off:before { - content: "\f898"; -} - -.ti-device-ipad-horizontal-pause:before { - content: "\f899"; -} - -.ti-device-ipad-horizontal-pin:before { - content: "\f89a"; -} - -.ti-device-ipad-horizontal-plus:before { - content: "\f89b"; -} - -.ti-device-ipad-horizontal-question:before { - content: "\f89c"; -} - -.ti-device-ipad-horizontal-search:before { - content: "\f89d"; -} - -.ti-device-ipad-horizontal-share:before { - content: "\f89e"; -} - -.ti-device-ipad-horizontal-star:before { - content: "\f89f"; -} - -.ti-device-ipad-horizontal-up:before { - content: "\f8a0"; -} - -.ti-device-ipad-horizontal-x:before { - content: "\f8a1"; -} - -.ti-device-ipad-minus:before { - content: "\f8a2"; -} - -.ti-device-ipad-off:before { - content: "\f8a3"; -} - -.ti-device-ipad-pause:before { - content: "\f8a4"; -} - -.ti-device-ipad-pin:before { - content: "\f8a5"; -} - -.ti-device-ipad-plus:before { - content: "\f8a6"; -} - -.ti-device-ipad-question:before { - content: "\f8a7"; -} - -.ti-device-ipad-search:before { - content: "\f8a8"; -} - -.ti-device-ipad-share:before { - content: "\f8a9"; -} - -.ti-device-ipad-star:before { - content: "\f8aa"; -} - -.ti-device-ipad-up:before { - content: "\f8ab"; -} - -.ti-device-ipad-x:before { - content: "\f8ac"; -} - -.ti-device-landline-phone:before { - content: "\f649"; -} - -.ti-device-laptop:before { - content: "\eb64"; -} - -.ti-device-laptop-off:before { - content: "\f061"; -} - -.ti-device-mobile:before { - content: "\ea8a"; -} - -.ti-device-mobile-bolt:before { - content: "\f8ad"; -} - -.ti-device-mobile-cancel:before { - content: "\f8ae"; -} - -.ti-device-mobile-charging:before { - content: "\f224"; -} - -.ti-device-mobile-check:before { - content: "\f8af"; -} - -.ti-device-mobile-code:before { - content: "\f8b0"; -} - -.ti-device-mobile-cog:before { - content: "\f8b1"; -} - -.ti-device-mobile-dollar:before { - content: "\f8b2"; -} - -.ti-device-mobile-down:before { - content: "\f8b3"; -} - -.ti-device-mobile-exclamation:before { - content: "\f8b4"; -} - -.ti-device-mobile-heart:before { - content: "\f8b5"; -} - -.ti-device-mobile-message:before { - content: "\ee79"; -} - -.ti-device-mobile-minus:before { - content: "\f8b6"; -} - -.ti-device-mobile-off:before { - content: "\f062"; -} - -.ti-device-mobile-pause:before { - content: "\f8b7"; -} - -.ti-device-mobile-pin:before { - content: "\f8b8"; -} - -.ti-device-mobile-plus:before { - content: "\f8b9"; -} - -.ti-device-mobile-question:before { - content: "\f8ba"; -} - -.ti-device-mobile-rotated:before { - content: "\ecdb"; -} - -.ti-device-mobile-search:before { - content: "\f8bb"; -} - -.ti-device-mobile-share:before { - content: "\f8bc"; -} - -.ti-device-mobile-star:before { - content: "\f8bd"; -} - -.ti-device-mobile-up:before { - content: "\f8be"; -} - -.ti-device-mobile-vibration:before { - content: "\eb86"; -} - -.ti-device-mobile-x:before { - content: "\f8bf"; -} - -.ti-device-nintendo:before { - content: "\f026"; -} - -.ti-device-nintendo-off:before { - content: "\f111"; -} - -.ti-device-remote:before { - content: "\f792"; -} - -.ti-device-sd-card:before { - content: "\f384"; -} - -.ti-device-sim:before { - content: "\f4b2"; -} - -.ti-device-sim-1:before { - content: "\f4af"; -} - -.ti-device-sim-2:before { - content: "\f4b0"; -} - -.ti-device-sim-3:before { - content: "\f4b1"; -} - -.ti-device-speaker:before { - content: "\ea8b"; -} - -.ti-device-speaker-off:before { - content: "\f112"; -} - -.ti-device-tablet:before { - content: "\ea8c"; -} - -.ti-device-tablet-bolt:before { - content: "\f8c0"; -} - -.ti-device-tablet-cancel:before { - content: "\f8c1"; -} - -.ti-device-tablet-check:before { - content: "\f8c2"; -} - -.ti-device-tablet-code:before { - content: "\f8c3"; -} - -.ti-device-tablet-cog:before { - content: "\f8c4"; -} - -.ti-device-tablet-dollar:before { - content: "\f8c5"; -} - -.ti-device-tablet-down:before { - content: "\f8c6"; -} - -.ti-device-tablet-exclamation:before { - content: "\f8c7"; -} - -.ti-device-tablet-heart:before { - content: "\f8c8"; -} - -.ti-device-tablet-minus:before { - content: "\f8c9"; -} - -.ti-device-tablet-off:before { - content: "\f063"; -} - -.ti-device-tablet-pause:before { - content: "\f8ca"; -} - -.ti-device-tablet-pin:before { - content: "\f8cb"; -} - -.ti-device-tablet-plus:before { - content: "\f8cc"; -} - -.ti-device-tablet-question:before { - content: "\f8cd"; -} - -.ti-device-tablet-search:before { - content: "\f8ce"; -} - -.ti-device-tablet-share:before { - content: "\f8cf"; -} - -.ti-device-tablet-star:before { - content: "\f8d0"; -} - -.ti-device-tablet-up:before { - content: "\f8d1"; -} - -.ti-device-tablet-x:before { - content: "\f8d2"; -} - -.ti-device-tv:before { - content: "\ea8d"; -} - -.ti-device-tv-off:before { - content: "\f064"; -} - -.ti-device-tv-old:before { - content: "\f1d3"; -} - -.ti-device-watch:before { - content: "\ebf9"; -} - -.ti-device-watch-bolt:before { - content: "\f8d3"; -} - -.ti-device-watch-cancel:before { - content: "\f8d4"; -} - -.ti-device-watch-check:before { - content: "\f8d5"; -} - -.ti-device-watch-code:before { - content: "\f8d6"; -} - -.ti-device-watch-cog:before { - content: "\f8d7"; -} - -.ti-device-watch-dollar:before { - content: "\f8d8"; -} - -.ti-device-watch-down:before { - content: "\f8d9"; -} - -.ti-device-watch-exclamation:before { - content: "\f8da"; -} - -.ti-device-watch-heart:before { - content: "\f8db"; -} - -.ti-device-watch-minus:before { - content: "\f8dc"; -} - -.ti-device-watch-off:before { - content: "\f065"; -} - -.ti-device-watch-pause:before { - content: "\f8dd"; -} - -.ti-device-watch-pin:before { - content: "\f8de"; -} - -.ti-device-watch-plus:before { - content: "\f8df"; -} - -.ti-device-watch-question:before { - content: "\f8e0"; -} - -.ti-device-watch-search:before { - content: "\f8e1"; -} - -.ti-device-watch-share:before { - content: "\f8e2"; -} - -.ti-device-watch-star:before { - content: "\f8e3"; -} - -.ti-device-watch-stats:before { - content: "\ef7d"; -} - -.ti-device-watch-stats-2:before { - content: "\ef7c"; -} - -.ti-device-watch-up:before { - content: "\f8e4"; -} - -.ti-device-watch-x:before { - content: "\f8e5"; -} - -.ti-devices:before { - content: "\eb87"; -} - -.ti-devices-2:before { - content: "\ed29"; -} - -.ti-devices-bolt:before { - content: "\f8e6"; -} - -.ti-devices-cancel:before { - content: "\f8e7"; -} - -.ti-devices-check:before { - content: "\f8e8"; -} - -.ti-devices-code:before { - content: "\f8e9"; -} - -.ti-devices-cog:before { - content: "\f8ea"; -} - -.ti-devices-dollar:before { - content: "\f8eb"; -} - -.ti-devices-down:before { - content: "\f8ec"; -} - -.ti-devices-exclamation:before { - content: "\f8ed"; -} - -.ti-devices-heart:before { - content: "\f8ee"; -} - -.ti-devices-minus:before { - content: "\f8ef"; -} - -.ti-devices-off:before { - content: "\f3e4"; -} - -.ti-devices-pause:before { - content: "\f8f0"; -} - -.ti-devices-pc:before { - content: "\ee7a"; -} - -.ti-devices-pc-off:before { - content: "\f113"; -} - -.ti-devices-pin:before { - content: "\f8f1"; -} - -.ti-devices-plus:before { - content: "\f8f2"; -} - -.ti-devices-question:before { - content: "\f8f3"; -} - -.ti-devices-search:before { - content: "\f8f4"; -} - -.ti-devices-share:before { - content: "\f8f5"; -} - -.ti-devices-star:before { - content: "\f8f6"; -} - -.ti-devices-up:before { - content: "\f8f7"; -} - -.ti-devices-x:before { - content: "\f8f8"; -} - -.ti-dialpad:before { - content: "\f067"; -} - -.ti-dialpad-off:before { - content: "\f114"; -} - -.ti-diamond:before { - content: "\eb65"; -} - -.ti-diamond-filled:before { - content: "\f73d"; -} - -.ti-diamond-off:before { - content: "\f115"; -} - -.ti-diamonds:before { - content: "\eff5"; -} - -.ti-diamonds-filled:before { - content: "\f676"; -} - -.ti-dice:before { - content: "\eb66"; -} - -.ti-dice-1:before { - content: "\f08b"; -} - -.ti-dice-1-filled:before { - content: "\f73e"; -} - -.ti-dice-2:before { - content: "\f08c"; -} - -.ti-dice-2-filled:before { - content: "\f73f"; -} - -.ti-dice-3:before { - content: "\f08d"; -} - -.ti-dice-3-filled:before { - content: "\f740"; -} - -.ti-dice-4:before { - content: "\f08e"; -} - -.ti-dice-4-filled:before { - content: "\f741"; -} - -.ti-dice-5:before { - content: "\f08f"; -} - -.ti-dice-5-filled:before { - content: "\f742"; -} - -.ti-dice-6:before { - content: "\f090"; -} - -.ti-dice-6-filled:before { - content: "\f743"; -} - -.ti-dice-filled:before { - content: "\f744"; -} - -.ti-dimensions:before { - content: "\ee7b"; -} - -.ti-direction:before { - content: "\ebfb"; -} - -.ti-direction-horizontal:before { - content: "\ebfa"; -} - -.ti-direction-sign:before { - content: "\f1f7"; -} - -.ti-direction-sign-filled:before { - content: "\f745"; -} - -.ti-direction-sign-off:before { - content: "\f3e5"; -} - -.ti-directions:before { - content: "\ea8e"; -} - -.ti-directions-off:before { - content: "\f116"; -} - -.ti-disabled:before { - content: "\ea8f"; -} - -.ti-disabled-2:before { - content: "\ebaf"; -} - -.ti-disabled-off:before { - content: "\f117"; -} - -.ti-disc:before { - content: "\ea90"; -} - -.ti-disc-golf:before { - content: "\f385"; -} - -.ti-disc-off:before { - content: "\f118"; -} - -.ti-discount:before { - content: "\ebbd"; -} - -.ti-discount-2:before { - content: "\ee7c"; -} - -.ti-discount-2-off:before { - content: "\f3e6"; -} - -.ti-discount-check:before { - content: "\f1f8"; -} - -.ti-discount-check-filled:before { - content: "\f746"; -} - -.ti-discount-off:before { - content: "\f3e7"; -} - -.ti-divide:before { - content: "\ed5c"; -} - -.ti-dna:before { - content: "\ee7d"; -} - -.ti-dna-2:before { - content: "\ef5c"; -} - -.ti-dna-2-off:before { - content: "\f119"; -} - -.ti-dna-off:before { - content: "\f11a"; -} - -.ti-dog:before { - content: "\f660"; -} - -.ti-dog-bowl:before { - content: "\ef29"; -} - -.ti-door:before { - content: "\ef4e"; -} - -.ti-door-enter:before { - content: "\ef4c"; -} - -.ti-door-exit:before { - content: "\ef4d"; -} - -.ti-door-off:before { - content: "\f11b"; -} - -.ti-dots:before { - content: "\ea95"; -} - -.ti-dots-circle-horizontal:before { - content: "\ea91"; -} - -.ti-dots-diagonal:before { - content: "\ea93"; -} - -.ti-dots-diagonal-2:before { - content: "\ea92"; -} - -.ti-dots-vertical:before { - content: "\ea94"; -} - -.ti-download:before { - content: "\ea96"; -} - -.ti-download-off:before { - content: "\f11c"; -} - -.ti-drag-drop:before { - content: "\eb89"; -} - -.ti-drag-drop-2:before { - content: "\eb88"; -} - -.ti-drone:before { - content: "\ed79"; -} - -.ti-drone-off:before { - content: "\ee7e"; -} - -.ti-drop-circle:before { - content: "\efde"; -} - -.ti-droplet:before { - content: "\ea97"; -} - -.ti-droplet-bolt:before { - content: "\f8f9"; -} - -.ti-droplet-cancel:before { - content: "\f8fa"; -} - -.ti-droplet-check:before { - content: "\f8fb"; -} - -.ti-droplet-code:before { - content: "\f8fc"; -} - -.ti-droplet-cog:before { - content: "\f8fd"; -} - -.ti-droplet-dollar:before { - content: "\f8fe"; -} - -.ti-droplet-down:before { - content: "\f8ff"; -} - -.ti-droplet-exclamation:before { - content: "\f900"; -} - -.ti-droplet-filled:before { - content: "\ee80"; -} - -.ti-droplet-filled-2:before { - content: "\ee7f"; -} - -.ti-droplet-half:before { - content: "\ee82"; -} - -.ti-droplet-half-2:before { - content: "\ee81"; -} - -.ti-droplet-half-filled:before { - content: "\f6c5"; -} - -.ti-droplet-heart:before { - content: "\f901"; -} - -.ti-droplet-minus:before { - content: "\f902"; -} - -.ti-droplet-off:before { - content: "\ee83"; -} - -.ti-droplet-pause:before { - content: "\f903"; -} - -.ti-droplet-pin:before { - content: "\f904"; -} - -.ti-droplet-plus:before { - content: "\f905"; -} - -.ti-droplet-question:before { - content: "\f906"; -} - -.ti-droplet-search:before { - content: "\f907"; -} - -.ti-droplet-share:before { - content: "\f908"; -} - -.ti-droplet-star:before { - content: "\f909"; -} - -.ti-droplet-up:before { - content: "\f90a"; -} - -.ti-droplet-x:before { - content: "\f90b"; -} - -.ti-e-passport:before { - content: "\f4df"; -} - -.ti-ear:before { - content: "\ebce"; -} - -.ti-ear-off:before { - content: "\ee84"; -} - -.ti-ease-in:before { - content: "\f573"; -} - -.ti-ease-in-control-point:before { - content: "\f570"; -} - -.ti-ease-in-out:before { - content: "\f572"; -} - -.ti-ease-in-out-control-points:before { - content: "\f571"; -} - -.ti-ease-out:before { - content: "\f575"; -} - -.ti-ease-out-control-point:before { - content: "\f574"; -} - -.ti-edit:before { - content: "\ea98"; -} - -.ti-edit-circle:before { - content: "\ee85"; -} - -.ti-edit-circle-off:before { - content: "\f11d"; -} - -.ti-edit-off:before { - content: "\f11e"; -} - -.ti-egg:before { - content: "\eb8a"; -} - -.ti-egg-cracked:before { - content: "\f2d6"; -} - -.ti-egg-filled:before { - content: "\f678"; -} - -.ti-egg-fried:before { - content: "\f386"; -} - -.ti-egg-off:before { - content: "\f11f"; -} - -.ti-eggs:before { - content: "\f500"; -} - -.ti-elevator:before { - content: "\efdf"; -} - -.ti-elevator-off:before { - content: "\f3e8"; -} - -.ti-emergency-bed:before { - content: "\ef5d"; -} - -.ti-empathize:before { - content: "\f29b"; -} - -.ti-empathize-off:before { - content: "\f3e9"; -} - -.ti-emphasis:before { - content: "\ebcf"; -} - -.ti-engine:before { - content: "\ef7e"; -} - -.ti-engine-off:before { - content: "\f120"; -} - -.ti-equal:before { - content: "\ee87"; -} - -.ti-equal-double:before { - content: "\f4e1"; -} - -.ti-equal-not:before { - content: "\ee86"; -} - -.ti-eraser:before { - content: "\eb8b"; -} - -.ti-eraser-off:before { - content: "\f121"; -} - -.ti-error-404:before { - content: "\f027"; -} - -.ti-error-404-off:before { - content: "\f122"; -} - -.ti-exchange:before { - content: "\ebe7"; -} - -.ti-exchange-off:before { - content: "\f123"; -} - -.ti-exclamation-circle:before { - content: "\f634"; -} - -.ti-exclamation-mark:before { - content: "\efb4"; -} - -.ti-exclamation-mark-off:before { - content: "\f124"; -} - -.ti-explicit:before { - content: "\f256"; -} - -.ti-explicit-off:before { - content: "\f3ea"; -} - -.ti-exposure:before { - content: "\eb8c"; -} - -.ti-exposure-0:before { - content: "\f29c"; -} - -.ti-exposure-minus-1:before { - content: "\f29d"; -} - -.ti-exposure-minus-2:before { - content: "\f29e"; -} - -.ti-exposure-off:before { - content: "\f3eb"; -} - -.ti-exposure-plus-1:before { - content: "\f29f"; -} - -.ti-exposure-plus-2:before { - content: "\f2a0"; -} - -.ti-external-link:before { - content: "\ea99"; -} - -.ti-external-link-off:before { - content: "\f125"; -} - -.ti-eye:before { - content: "\ea9a"; -} - -.ti-eye-check:before { - content: "\ee88"; -} - -.ti-eye-closed:before { - content: "\f7ec"; -} - -.ti-eye-cog:before { - content: "\f7ed"; -} - -.ti-eye-edit:before { - content: "\f7ee"; -} - -.ti-eye-exclamation:before { - content: "\f7ef"; -} - -.ti-eye-filled:before { - content: "\f679"; -} - -.ti-eye-heart:before { - content: "\f7f0"; -} - -.ti-eye-off:before { - content: "\ecf0"; -} - -.ti-eye-table:before { - content: "\ef5e"; -} - -.ti-eye-x:before { - content: "\f7f1"; -} - -.ti-eyeglass:before { - content: "\ee8a"; -} - -.ti-eyeglass-2:before { - content: "\ee89"; -} - -.ti-eyeglass-off:before { - content: "\f126"; -} - -.ti-face-id:before { - content: "\ea9b"; -} - -.ti-face-id-error:before { - content: "\efa7"; -} - -.ti-face-mask:before { - content: "\efb5"; -} - -.ti-face-mask-off:before { - content: "\f127"; -} - -.ti-fall:before { - content: "\ecb9"; -} - -.ti-feather:before { - content: "\ee8b"; -} - -.ti-feather-off:before { - content: "\f128"; -} - -.ti-fence:before { - content: "\ef2a"; -} - -.ti-fence-off:before { - content: "\f129"; -} - -.ti-fidget-spinner:before { - content: "\f068"; -} - -.ti-file:before { - content: "\eaa4"; -} - -.ti-file-3d:before { - content: "\f032"; -} - -.ti-file-alert:before { - content: "\ede6"; -} - -.ti-file-analytics:before { - content: "\ede7"; -} - -.ti-file-arrow-left:before { - content: "\f033"; -} - -.ti-file-arrow-right:before { - content: "\f034"; -} - -.ti-file-barcode:before { - content: "\f035"; -} - -.ti-file-broken:before { - content: "\f501"; -} - -.ti-file-certificate:before { - content: "\ed4d"; -} - -.ti-file-chart:before { - content: "\f036"; -} - -.ti-file-check:before { - content: "\ea9c"; -} - -.ti-file-code:before { - content: "\ebd0"; -} - -.ti-file-code-2:before { - content: "\ede8"; -} - -.ti-file-database:before { - content: "\f037"; -} - -.ti-file-delta:before { - content: "\f53d"; -} - -.ti-file-description:before { - content: "\f028"; -} - -.ti-file-diff:before { - content: "\ecf1"; -} - -.ti-file-digit:before { - content: "\efa8"; -} - -.ti-file-dislike:before { - content: "\ed2a"; -} - -.ti-file-dollar:before { - content: "\efe0"; -} - -.ti-file-dots:before { - content: "\f038"; -} - -.ti-file-download:before { - content: "\ea9d"; -} - -.ti-file-euro:before { - content: "\efe1"; -} - -.ti-file-export:before { - content: "\ede9"; -} - -.ti-file-filled:before { - content: "\f747"; -} - -.ti-file-function:before { - content: "\f53e"; -} - -.ti-file-horizontal:before { - content: "\ebb0"; -} - -.ti-file-import:before { - content: "\edea"; -} - -.ti-file-infinity:before { - content: "\f502"; -} - -.ti-file-info:before { - content: "\edec"; -} - -.ti-file-invoice:before { - content: "\eb67"; -} - -.ti-file-lambda:before { - content: "\f53f"; -} - -.ti-file-like:before { - content: "\ed2b"; -} - -.ti-file-minus:before { - content: "\ea9e"; -} - -.ti-file-music:before { - content: "\ea9f"; -} - -.ti-file-off:before { - content: "\ecf2"; -} - -.ti-file-orientation:before { - content: "\f2a1"; -} - -.ti-file-pencil:before { - content: "\f039"; -} - -.ti-file-percent:before { - content: "\f540"; -} - -.ti-file-phone:before { - content: "\ecdc"; -} - -.ti-file-plus:before { - content: "\eaa0"; -} - -.ti-file-power:before { - content: "\f03a"; -} - -.ti-file-report:before { - content: "\eded"; -} - -.ti-file-rss:before { - content: "\f03b"; -} - -.ti-file-scissors:before { - content: "\f03c"; -} - -.ti-file-search:before { - content: "\ed5d"; -} - -.ti-file-settings:before { - content: "\f029"; -} - -.ti-file-shredder:before { - content: "\eaa1"; -} - -.ti-file-signal:before { - content: "\f03d"; -} - -.ti-file-spreadsheet:before { - content: "\f03e"; -} - -.ti-file-stack:before { - content: "\f503"; -} - -.ti-file-star:before { - content: "\f03f"; -} - -.ti-file-symlink:before { - content: "\ed53"; -} - -.ti-file-text:before { - content: "\eaa2"; -} - -.ti-file-time:before { - content: "\f040"; -} - -.ti-file-typography:before { - content: "\f041"; -} - -.ti-file-unknown:before { - content: "\f042"; -} - -.ti-file-upload:before { - content: "\ec91"; -} - -.ti-file-vector:before { - content: "\f043"; -} - -.ti-file-x:before { - content: "\eaa3"; -} - -.ti-file-x-filled:before { - content: "\f748"; -} - -.ti-file-zip:before { - content: "\ed4e"; -} - -.ti-files:before { - content: "\edef"; -} - -.ti-files-off:before { - content: "\edee"; -} - -.ti-filter:before { - content: "\eaa5"; -} - -.ti-filter-off:before { - content: "\ed2c"; -} - -.ti-filters:before { - content: "\f793"; -} - -.ti-fingerprint:before { - content: "\ebd1"; -} - -.ti-fingerprint-off:before { - content: "\f12a"; -} - -.ti-fire-hydrant:before { - content: "\f3a9"; -} - -.ti-fire-hydrant-off:before { - content: "\f3ec"; -} - -.ti-firetruck:before { - content: "\ebe8"; -} - -.ti-first-aid-kit:before { - content: "\ef5f"; -} - -.ti-first-aid-kit-off:before { - content: "\f3ed"; -} - -.ti-fish:before { - content: "\ef2b"; -} - -.ti-fish-bone:before { - content: "\f287"; -} - -.ti-fish-christianity:before { - content: "\f58b"; -} - -.ti-fish-hook:before { - content: "\f1f9"; -} - -.ti-fish-hook-off:before { - content: "\f3ee"; -} - -.ti-fish-off:before { - content: "\f12b"; -} - -.ti-flag:before { - content: "\eaa6"; -} - -.ti-flag-2:before { - content: "\ee8c"; -} - -.ti-flag-2-filled:before { - content: "\f707"; -} - -.ti-flag-2-off:before { - content: "\f12c"; -} - -.ti-flag-3:before { - content: "\ee8d"; -} - -.ti-flag-3-filled:before { - content: "\f708"; -} - -.ti-flag-filled:before { - content: "\f67a"; -} - -.ti-flag-off:before { - content: "\f12d"; -} - -.ti-flame:before { - content: "\ec2c"; -} - -.ti-flame-off:before { - content: "\f12e"; -} - -.ti-flare:before { - content: "\ee8e"; -} - -.ti-flask:before { - content: "\ebd2"; -} - -.ti-flask-2:before { - content: "\ef60"; -} - -.ti-flask-2-off:before { - content: "\f12f"; -} - -.ti-flask-off:before { - content: "\f130"; -} - -.ti-flip-flops:before { - content: "\f564"; -} - -.ti-flip-horizontal:before { - content: "\eaa7"; -} - -.ti-flip-vertical:before { - content: "\eaa8"; -} - -.ti-float-center:before { - content: "\ebb1"; -} - -.ti-float-left:before { - content: "\ebb2"; -} - -.ti-float-none:before { - content: "\ed13"; -} - -.ti-float-right:before { - content: "\ebb3"; -} - -.ti-flower:before { - content: "\eff6"; -} - -.ti-flower-off:before { - content: "\f131"; -} - -.ti-focus:before { - content: "\eb8d"; -} - -.ti-focus-2:before { - content: "\ebd3"; -} - -.ti-focus-centered:before { - content: "\f02a"; -} - -.ti-fold:before { - content: "\ed56"; -} - -.ti-fold-down:before { - content: "\ed54"; -} - -.ti-fold-up:before { - content: "\ed55"; -} - -.ti-folder:before { - content: "\eaad"; -} - -.ti-folder-bolt:before { - content: "\f90c"; -} - -.ti-folder-cancel:before { - content: "\f90d"; -} - -.ti-folder-check:before { - content: "\f90e"; -} - -.ti-folder-code:before { - content: "\f90f"; -} - -.ti-folder-cog:before { - content: "\f910"; -} - -.ti-folder-dollar:before { - content: "\f911"; -} - -.ti-folder-down:before { - content: "\f912"; -} - -.ti-folder-exclamation:before { - content: "\f913"; -} - -.ti-folder-filled:before { - content: "\f749"; -} - -.ti-folder-heart:before { - content: "\f914"; -} - -.ti-folder-minus:before { - content: "\eaaa"; -} - -.ti-folder-off:before { - content: "\ed14"; -} - -.ti-folder-pause:before { - content: "\f915"; -} - -.ti-folder-pin:before { - content: "\f916"; -} - -.ti-folder-plus:before { - content: "\eaab"; -} - -.ti-folder-question:before { - content: "\f917"; -} - -.ti-folder-search:before { - content: "\f918"; -} - -.ti-folder-share:before { - content: "\f919"; -} - -.ti-folder-star:before { - content: "\f91a"; -} - -.ti-folder-symlink:before { - content: "\f91b"; -} - -.ti-folder-up:before { - content: "\f91c"; -} - -.ti-folder-x:before { - content: "\eaac"; -} - -.ti-folders:before { - content: "\eaae"; -} - -.ti-folders-off:before { - content: "\f133"; -} - -.ti-forbid:before { - content: "\ebd5"; -} - -.ti-forbid-2:before { - content: "\ebd4"; -} - -.ti-forklift:before { - content: "\ebe9"; -} - -.ti-forms:before { - content: "\ee8f"; -} - -.ti-fountain:before { - content: "\f09b"; -} - -.ti-fountain-off:before { - content: "\f134"; -} - -.ti-frame:before { - content: "\eaaf"; -} - -.ti-frame-off:before { - content: "\f135"; -} - -.ti-free-rights:before { - content: "\efb6"; -} - -.ti-fridge:before { - content: "\f1fa"; -} - -.ti-fridge-off:before { - content: "\f3ef"; -} - -.ti-friends:before { - content: "\eab0"; -} - -.ti-friends-off:before { - content: "\f136"; -} - -.ti-function:before { - content: "\f225"; -} - -.ti-function-off:before { - content: "\f3f0"; -} - -.ti-garden-cart:before { - content: "\f23e"; -} - -.ti-garden-cart-off:before { - content: "\f3f1"; -} - -.ti-gas-station:before { - content: "\ec7d"; -} - -.ti-gas-station-off:before { - content: "\f137"; -} - -.ti-gauge:before { - content: "\eab1"; -} - -.ti-gauge-off:before { - content: "\f138"; -} - -.ti-gavel:before { - content: "\ef90"; -} - -.ti-gender-agender:before { - content: "\f0e1"; -} - -.ti-gender-androgyne:before { - content: "\f0e2"; -} - -.ti-gender-bigender:before { - content: "\f0e3"; -} - -.ti-gender-demiboy:before { - content: "\f0e4"; -} - -.ti-gender-demigirl:before { - content: "\f0e5"; -} - -.ti-gender-epicene:before { - content: "\f0e6"; -} - -.ti-gender-female:before { - content: "\f0e7"; -} - -.ti-gender-femme:before { - content: "\f0e8"; -} - -.ti-gender-genderfluid:before { - content: "\f0e9"; -} - -.ti-gender-genderless:before { - content: "\f0ea"; -} - -.ti-gender-genderqueer:before { - content: "\f0eb"; -} - -.ti-gender-hermaphrodite:before { - content: "\f0ec"; -} - -.ti-gender-intergender:before { - content: "\f0ed"; -} - -.ti-gender-male:before { - content: "\f0ee"; -} - -.ti-gender-neutrois:before { - content: "\f0ef"; -} - -.ti-gender-third:before { - content: "\f0f0"; -} - -.ti-gender-transgender:before { - content: "\f0f1"; -} - -.ti-gender-trasvesti:before { - content: "\f0f2"; -} - -.ti-geometry:before { - content: "\ee90"; -} - -.ti-ghost:before { - content: "\eb8e"; -} - -.ti-ghost-2:before { - content: "\f57c"; -} - -.ti-ghost-2-filled:before { - content: "\f74a"; -} - -.ti-ghost-filled:before { - content: "\f74b"; -} - -.ti-ghost-off:before { - content: "\f3f2"; -} - -.ti-gif:before { - content: "\f257"; -} - -.ti-gift:before { - content: "\eb68"; -} - -.ti-gift-card:before { - content: "\f3aa"; -} - -.ti-gift-off:before { - content: "\f3f3"; -} - -.ti-git-branch:before { - content: "\eab2"; -} - -.ti-git-branch-deleted:before { - content: "\f57d"; -} - -.ti-git-cherry-pick:before { - content: "\f57e"; -} - -.ti-git-commit:before { - content: "\eab3"; -} - -.ti-git-compare:before { - content: "\eab4"; -} - -.ti-git-fork:before { - content: "\eb8f"; -} - -.ti-git-merge:before { - content: "\eab5"; -} - -.ti-git-pull-request:before { - content: "\eab6"; -} - -.ti-git-pull-request-closed:before { - content: "\ef7f"; -} - -.ti-git-pull-request-draft:before { - content: "\efb7"; -} - -.ti-gizmo:before { - content: "\f02b"; -} - -.ti-glass:before { - content: "\eab8"; -} - -.ti-glass-full:before { - content: "\eab7"; -} - -.ti-glass-off:before { - content: "\ee91"; -} - -.ti-globe:before { - content: "\eab9"; -} - -.ti-globe-off:before { - content: "\f139"; -} - -.ti-go-game:before { - content: "\f512"; -} - -.ti-golf:before { - content: "\ed8c"; -} - -.ti-golf-off:before { - content: "\f13a"; -} - -.ti-gps:before { - content: "\ed7a"; -} - -.ti-gradienter:before { - content: "\f3ab"; -} - -.ti-grain:before { - content: "\ee92"; -} - -.ti-graph:before { - content: "\f288"; -} - -.ti-graph-off:before { - content: "\f3f4"; -} - -.ti-grave:before { - content: "\f580"; -} - -.ti-grave-2:before { - content: "\f57f"; -} - -.ti-grid-dots:before { - content: "\eaba"; -} - -.ti-grid-pattern:before { - content: "\efc9"; -} - -.ti-grill:before { - content: "\efa9"; -} - -.ti-grill-fork:before { - content: "\f35b"; -} - -.ti-grill-off:before { - content: "\f3f5"; -} - -.ti-grill-spatula:before { - content: "\f35c"; -} - -.ti-grip-horizontal:before { - content: "\ec00"; -} - -.ti-grip-vertical:before { - content: "\ec01"; -} - -.ti-growth:before { - content: "\ee93"; -} - -.ti-guitar-pick:before { - content: "\f4c6"; -} - -.ti-guitar-pick-filled:before { - content: "\f67b"; -} - -.ti-h-1:before { - content: "\ec94"; -} - -.ti-h-2:before { - content: "\ec95"; -} - -.ti-h-3:before { - content: "\ec96"; -} - -.ti-h-4:before { - content: "\ec97"; -} - -.ti-h-5:before { - content: "\ec98"; -} - -.ti-h-6:before { - content: "\ec99"; -} - -.ti-hammer:before { - content: "\ef91"; -} - -.ti-hammer-off:before { - content: "\f13c"; -} - -.ti-hand-click:before { - content: "\ef4f"; -} - -.ti-hand-finger:before { - content: "\ee94"; -} - -.ti-hand-finger-off:before { - content: "\f13d"; -} - -.ti-hand-grab:before { - content: "\f091"; -} - -.ti-hand-little-finger:before { - content: "\ee95"; -} - -.ti-hand-middle-finger:before { - content: "\ec2d"; -} - -.ti-hand-move:before { - content: "\ef50"; -} - -.ti-hand-off:before { - content: "\ed15"; -} - -.ti-hand-ring-finger:before { - content: "\ee96"; -} - -.ti-hand-rock:before { - content: "\ee97"; -} - -.ti-hand-sanitizer:before { - content: "\f5f4"; -} - -.ti-hand-stop:before { - content: "\ec2e"; -} - -.ti-hand-three-fingers:before { - content: "\ee98"; -} - -.ti-hand-two-fingers:before { - content: "\ee99"; -} - -.ti-hanger:before { - content: "\ee9a"; -} - -.ti-hanger-2:before { - content: "\f09c"; -} - -.ti-hanger-off:before { - content: "\f13e"; -} - -.ti-hash:before { - content: "\eabc"; -} - -.ti-haze:before { - content: "\efaa"; -} - -.ti-heading:before { - content: "\ee9b"; -} - -.ti-heading-off:before { - content: "\f13f"; -} - -.ti-headphones:before { - content: "\eabd"; -} - -.ti-headphones-off:before { - content: "\ed1d"; -} - -.ti-headset:before { - content: "\eb90"; -} - -.ti-headset-off:before { - content: "\f3f6"; -} - -.ti-health-recognition:before { - content: "\f1fb"; -} - -.ti-heart:before { - content: "\eabe"; -} - -.ti-heart-broken:before { - content: "\ecba"; -} - -.ti-heart-filled:before { - content: "\f67c"; -} - -.ti-heart-handshake:before { - content: "\f0f3"; -} - -.ti-heart-minus:before { - content: "\f140"; -} - -.ti-heart-off:before { - content: "\f141"; -} - -.ti-heart-plus:before { - content: "\f142"; -} - -.ti-heart-rate-monitor:before { - content: "\ef61"; -} - -.ti-heartbeat:before { - content: "\ef92"; -} - -.ti-hearts:before { - content: "\f387"; -} - -.ti-hearts-off:before { - content: "\f3f7"; -} - -.ti-helicopter:before { - content: "\ed8e"; -} - -.ti-helicopter-landing:before { - content: "\ed8d"; -} - -.ti-helmet:before { - content: "\efca"; -} - -.ti-helmet-off:before { - content: "\f143"; -} - -.ti-help:before { - content: "\eabf"; -} - -.ti-help-circle:before { - content: "\f91d"; -} - -.ti-help-hexagon:before { - content: "\f7a8"; -} - -.ti-help-octagon:before { - content: "\f7a9"; -} - -.ti-help-off:before { - content: "\f3f8"; -} - -.ti-help-small:before { - content: "\f91e"; -} - -.ti-help-square:before { - content: "\f920"; -} - -.ti-help-square-rounded:before { - content: "\f91f"; -} - -.ti-help-triangle:before { - content: "\f921"; -} - -.ti-hexagon:before { - content: "\ec02"; -} - -.ti-hexagon-0-filled:before { - content: "\f74c"; -} - -.ti-hexagon-1-filled:before { - content: "\f74d"; -} - -.ti-hexagon-2-filled:before { - content: "\f74e"; -} - -.ti-hexagon-3-filled:before { - content: "\f74f"; -} - -.ti-hexagon-3d:before { - content: "\f4c7"; -} - -.ti-hexagon-4-filled:before { - content: "\f750"; -} - -.ti-hexagon-5-filled:before { - content: "\f751"; -} - -.ti-hexagon-6-filled:before { - content: "\f752"; -} - -.ti-hexagon-7-filled:before { - content: "\f753"; -} - -.ti-hexagon-8-filled:before { - content: "\f754"; -} - -.ti-hexagon-9-filled:before { - content: "\f755"; -} - -.ti-hexagon-filled:before { - content: "\f67d"; -} - -.ti-hexagon-letter-a:before { - content: "\f463"; -} - -.ti-hexagon-letter-b:before { - content: "\f464"; -} - -.ti-hexagon-letter-c:before { - content: "\f465"; -} - -.ti-hexagon-letter-d:before { - content: "\f466"; -} - -.ti-hexagon-letter-e:before { - content: "\f467"; -} - -.ti-hexagon-letter-f:before { - content: "\f468"; -} - -.ti-hexagon-letter-g:before { - content: "\f469"; -} - -.ti-hexagon-letter-h:before { - content: "\f46a"; -} - -.ti-hexagon-letter-i:before { - content: "\f46b"; -} - -.ti-hexagon-letter-j:before { - content: "\f46c"; -} - -.ti-hexagon-letter-k:before { - content: "\f46d"; -} - -.ti-hexagon-letter-l:before { - content: "\f46e"; -} - -.ti-hexagon-letter-m:before { - content: "\f46f"; -} - -.ti-hexagon-letter-n:before { - content: "\f470"; -} - -.ti-hexagon-letter-o:before { - content: "\f471"; -} - -.ti-hexagon-letter-p:before { - content: "\f472"; -} - -.ti-hexagon-letter-q:before { - content: "\f473"; -} - -.ti-hexagon-letter-r:before { - content: "\f474"; -} - -.ti-hexagon-letter-s:before { - content: "\f475"; -} - -.ti-hexagon-letter-t:before { - content: "\f476"; -} - -.ti-hexagon-letter-u:before { - content: "\f477"; -} - -.ti-hexagon-letter-v:before { - content: "\f4b3"; -} - -.ti-hexagon-letter-w:before { - content: "\f478"; -} - -.ti-hexagon-letter-x:before { - content: "\f479"; -} - -.ti-hexagon-letter-y:before { - content: "\f47a"; -} - -.ti-hexagon-letter-z:before { - content: "\f47b"; -} - -.ti-hexagon-number-0:before { - content: "\f459"; -} - -.ti-hexagon-number-1:before { - content: "\f45a"; -} - -.ti-hexagon-number-2:before { - content: "\f45b"; -} - -.ti-hexagon-number-3:before { - content: "\f45c"; -} - -.ti-hexagon-number-4:before { - content: "\f45d"; -} - -.ti-hexagon-number-5:before { - content: "\f45e"; -} - -.ti-hexagon-number-6:before { - content: "\f45f"; -} - -.ti-hexagon-number-7:before { - content: "\f460"; -} - -.ti-hexagon-number-8:before { - content: "\f461"; -} - -.ti-hexagon-number-9:before { - content: "\f462"; -} - -.ti-hexagon-off:before { - content: "\ee9c"; -} - -.ti-hexagons:before { - content: "\f09d"; -} - -.ti-hexagons-off:before { - content: "\f3f9"; -} - -.ti-hierarchy:before { - content: "\ee9e"; -} - -.ti-hierarchy-2:before { - content: "\ee9d"; -} - -.ti-hierarchy-3:before { - content: "\f289"; -} - -.ti-hierarchy-off:before { - content: "\f3fa"; -} - -.ti-highlight:before { - content: "\ef3f"; -} - -.ti-highlight-off:before { - content: "\f144"; -} - -.ti-history:before { - content: "\ebea"; -} - -.ti-history-off:before { - content: "\f3fb"; -} - -.ti-history-toggle:before { - content: "\f1fc"; -} - -.ti-home:before { - content: "\eac1"; -} - -.ti-home-2:before { - content: "\eac0"; -} - -.ti-home-bolt:before { - content: "\f336"; -} - -.ti-home-cancel:before { - content: "\f350"; -} - -.ti-home-check:before { - content: "\f337"; -} - -.ti-home-cog:before { - content: "\f338"; -} - -.ti-home-dollar:before { - content: "\f339"; -} - -.ti-home-dot:before { - content: "\f33a"; -} - -.ti-home-down:before { - content: "\f33b"; -} - -.ti-home-eco:before { - content: "\f351"; -} - -.ti-home-edit:before { - content: "\f352"; -} - -.ti-home-exclamation:before { - content: "\f33c"; -} - -.ti-home-hand:before { - content: "\f504"; -} - -.ti-home-heart:before { - content: "\f353"; -} - -.ti-home-infinity:before { - content: "\f505"; -} - -.ti-home-link:before { - content: "\f354"; -} - -.ti-home-minus:before { - content: "\f33d"; -} - -.ti-home-move:before { - content: "\f33e"; -} - -.ti-home-off:before { - content: "\f145"; -} - -.ti-home-plus:before { - content: "\f33f"; -} - -.ti-home-question:before { - content: "\f340"; -} - -.ti-home-ribbon:before { - content: "\f355"; -} - -.ti-home-search:before { - content: "\f341"; -} - -.ti-home-share:before { - content: "\f342"; -} - -.ti-home-shield:before { - content: "\f343"; -} - -.ti-home-signal:before { - content: "\f356"; -} - -.ti-home-star:before { - content: "\f344"; -} - -.ti-home-stats:before { - content: "\f345"; -} - -.ti-home-up:before { - content: "\f346"; -} - -.ti-home-x:before { - content: "\f347"; -} - -.ti-horse-toy:before { - content: "\f28a"; -} - -.ti-hotel-service:before { - content: "\ef80"; -} - -.ti-hourglass:before { - content: "\ef93"; -} - -.ti-hourglass-empty:before { - content: "\f146"; -} - -.ti-hourglass-filled:before { - content: "\f756"; -} - -.ti-hourglass-high:before { - content: "\f092"; -} - -.ti-hourglass-low:before { - content: "\f093"; -} - -.ti-hourglass-off:before { - content: "\f147"; -} - -.ti-html:before { - content: "\f7b1"; -} - -.ti-ice-cream:before { - content: "\eac2"; -} - -.ti-ice-cream-2:before { - content: "\ee9f"; -} - -.ti-ice-cream-off:before { - content: "\f148"; -} - -.ti-ice-skating:before { - content: "\efcb"; -} - -.ti-icons:before { - content: "\f1d4"; -} - -.ti-icons-off:before { - content: "\f3fc"; -} - -.ti-id:before { - content: "\eac3"; -} - -.ti-id-badge:before { - content: "\eff7"; -} - -.ti-id-badge-2:before { - content: "\f076"; -} - -.ti-id-badge-off:before { - content: "\f3fd"; -} - -.ti-id-off:before { - content: "\f149"; -} - -.ti-inbox:before { - content: "\eac4"; -} - -.ti-inbox-off:before { - content: "\f14a"; -} - -.ti-indent-decrease:before { - content: "\eb91"; -} - -.ti-indent-increase:before { - content: "\eb92"; -} - -.ti-infinity:before { - content: "\eb69"; -} - -.ti-infinity-off:before { - content: "\f3fe"; -} - -.ti-info-circle:before { - content: "\eac5"; -} - -.ti-info-circle-filled:before { - content: "\f6d8"; -} - -.ti-info-hexagon:before { - content: "\f7aa"; -} - -.ti-info-octagon:before { - content: "\f7ab"; -} - -.ti-info-small:before { - content: "\f922"; -} - -.ti-info-square:before { - content: "\eac6"; -} - -.ti-info-square-rounded:before { - content: "\f635"; -} - -.ti-info-square-rounded-filled:before { - content: "\f6d9"; -} - -.ti-info-triangle:before { - content: "\f923"; -} - -.ti-inner-shadow-bottom:before { - content: "\f520"; -} - -.ti-inner-shadow-bottom-filled:before { - content: "\f757"; -} - -.ti-inner-shadow-bottom-left:before { - content: "\f51e"; -} - -.ti-inner-shadow-bottom-left-filled:before { - content: "\f758"; -} - -.ti-inner-shadow-bottom-right:before { - content: "\f51f"; -} - -.ti-inner-shadow-bottom-right-filled:before { - content: "\f759"; -} - -.ti-inner-shadow-left:before { - content: "\f521"; -} - -.ti-inner-shadow-left-filled:before { - content: "\f75a"; -} - -.ti-inner-shadow-right:before { - content: "\f522"; -} - -.ti-inner-shadow-right-filled:before { - content: "\f75b"; -} - -.ti-inner-shadow-top:before { - content: "\f525"; -} - -.ti-inner-shadow-top-filled:before { - content: "\f75c"; -} - -.ti-inner-shadow-top-left:before { - content: "\f523"; -} - -.ti-inner-shadow-top-left-filled:before { - content: "\f75d"; -} - -.ti-inner-shadow-top-right:before { - content: "\f524"; -} - -.ti-inner-shadow-top-right-filled:before { - content: "\f75e"; -} - -.ti-input-search:before { - content: "\f2a2"; -} - -.ti-ironing-1:before { - content: "\f2f4"; -} - -.ti-ironing-2:before { - content: "\f2f5"; -} - -.ti-ironing-3:before { - content: "\f2f6"; -} - -.ti-ironing-off:before { - content: "\f2f7"; -} - -.ti-ironing-steam:before { - content: "\f2f9"; -} - -.ti-ironing-steam-off:before { - content: "\f2f8"; -} - -.ti-italic:before { - content: "\eb93"; -} - -.ti-jacket:before { - content: "\f661"; -} - -.ti-jetpack:before { - content: "\f581"; -} - -.ti-jewish-star:before { - content: "\f3ff"; -} - -.ti-jewish-star-filled:before { - content: "\f67e"; -} - -.ti-jpg:before { - content: "\f3ac"; -} - -.ti-json:before { - content: "\f7b2"; -} - -.ti-jump-rope:before { - content: "\ed8f"; -} - -.ti-karate:before { - content: "\ed32"; -} - -.ti-kayak:before { - content: "\f1d6"; -} - -.ti-kering:before { - content: "\efb8"; -} - -.ti-key:before { - content: "\eac7"; -} - -.ti-key-off:before { - content: "\f14b"; -} - -.ti-keyboard:before { - content: "\ebd6"; -} - -.ti-keyboard-hide:before { - content: "\ec7e"; -} - -.ti-keyboard-off:before { - content: "\eea0"; -} - -.ti-keyboard-show:before { - content: "\ec7f"; -} - -.ti-keyframe:before { - content: "\f576"; -} - -.ti-keyframe-align-center:before { - content: "\f582"; -} - -.ti-keyframe-align-horizontal:before { - content: "\f583"; -} - -.ti-keyframe-align-vertical:before { - content: "\f584"; -} - -.ti-keyframes:before { - content: "\f585"; -} - -.ti-ladder:before { - content: "\efe2"; -} - -.ti-ladder-off:before { - content: "\f14c"; -} - -.ti-lambda:before { - content: "\f541"; -} - -.ti-lamp:before { - content: "\efab"; -} - -.ti-lamp-2:before { - content: "\f09e"; -} - -.ti-lamp-off:before { - content: "\f14d"; -} - -.ti-language:before { - content: "\ebbe"; -} - -.ti-language-hiragana:before { - content: "\ef77"; -} - -.ti-language-katakana:before { - content: "\ef78"; -} - -.ti-language-off:before { - content: "\f14e"; -} - -.ti-lasso:before { - content: "\efac"; -} - -.ti-lasso-off:before { - content: "\f14f"; -} - -.ti-lasso-polygon:before { - content: "\f388"; -} - -.ti-layers-difference:before { - content: "\eac8"; -} - -.ti-layers-intersect:before { - content: "\eac9"; -} - -.ti-layers-intersect-2:before { - content: "\eff8"; -} - -.ti-layers-linked:before { - content: "\eea1"; -} - -.ti-layers-off:before { - content: "\f150"; -} - -.ti-layers-subtract:before { - content: "\eaca"; -} - -.ti-layers-union:before { - content: "\eacb"; -} - -.ti-layout:before { - content: "\eadb"; -} - -.ti-layout-2:before { - content: "\eacc"; -} - -.ti-layout-align-bottom:before { - content: "\eacd"; -} - -.ti-layout-align-center:before { - content: "\eace"; -} - -.ti-layout-align-left:before { - content: "\eacf"; -} - -.ti-layout-align-middle:before { - content: "\ead0"; -} - -.ti-layout-align-right:before { - content: "\ead1"; -} - -.ti-layout-align-top:before { - content: "\ead2"; -} - -.ti-layout-board:before { - content: "\ef95"; -} - -.ti-layout-board-split:before { - content: "\ef94"; -} - -.ti-layout-bottombar:before { - content: "\ead3"; -} - -.ti-layout-bottombar-collapse:before { - content: "\f28b"; -} - -.ti-layout-bottombar-expand:before { - content: "\f28c"; -} - -.ti-layout-cards:before { - content: "\ec13"; -} - -.ti-layout-collage:before { - content: "\f389"; -} - -.ti-layout-columns:before { - content: "\ead4"; -} - -.ti-layout-dashboard:before { - content: "\f02c"; -} - -.ti-layout-distribute-horizontal:before { - content: "\ead5"; -} - -.ti-layout-distribute-vertical:before { - content: "\ead6"; -} - -.ti-layout-grid:before { - content: "\edba"; -} - -.ti-layout-grid-add:before { - content: "\edb9"; -} - -.ti-layout-kanban:before { - content: "\ec3f"; -} - -.ti-layout-list:before { - content: "\ec14"; -} - -.ti-layout-navbar:before { - content: "\ead7"; -} - -.ti-layout-navbar-collapse:before { - content: "\f28d"; -} - -.ti-layout-navbar-expand:before { - content: "\f28e"; -} - -.ti-layout-off:before { - content: "\f151"; -} - -.ti-layout-rows:before { - content: "\ead8"; -} - -.ti-layout-sidebar:before { - content: "\eada"; -} - -.ti-layout-sidebar-left-collapse:before { - content: "\f004"; -} - -.ti-layout-sidebar-left-expand:before { - content: "\f005"; -} - -.ti-layout-sidebar-right:before { - content: "\ead9"; -} - -.ti-layout-sidebar-right-collapse:before { - content: "\f006"; -} - -.ti-layout-sidebar-right-expand:before { - content: "\f007"; -} - -.ti-leaf:before { - content: "\ed4f"; -} - -.ti-leaf-off:before { - content: "\f400"; -} - -.ti-lego:before { - content: "\eadc"; -} - -.ti-lego-off:before { - content: "\f401"; -} - -.ti-lemon:before { - content: "\ef10"; -} - -.ti-lemon-2:before { - content: "\ef81"; -} - -.ti-letter-a:before { - content: "\ec50"; -} - -.ti-letter-b:before { - content: "\ec51"; -} - -.ti-letter-c:before { - content: "\ec52"; -} - -.ti-letter-case:before { - content: "\eea5"; -} - -.ti-letter-case-lower:before { - content: "\eea2"; -} - -.ti-letter-case-toggle:before { - content: "\eea3"; -} - -.ti-letter-case-upper:before { - content: "\eea4"; -} - -.ti-letter-d:before { - content: "\ec53"; -} - -.ti-letter-e:before { - content: "\ec54"; -} - -.ti-letter-f:before { - content: "\ec55"; -} - -.ti-letter-g:before { - content: "\ec56"; -} - -.ti-letter-h:before { - content: "\ec57"; -} - -.ti-letter-i:before { - content: "\ec58"; -} - -.ti-letter-j:before { - content: "\ec59"; -} - -.ti-letter-k:before { - content: "\ec5a"; -} - -.ti-letter-l:before { - content: "\ec5b"; -} - -.ti-letter-m:before { - content: "\ec5c"; -} - -.ti-letter-n:before { - content: "\ec5d"; -} - -.ti-letter-o:before { - content: "\ec5e"; -} - -.ti-letter-p:before { - content: "\ec5f"; -} - -.ti-letter-q:before { - content: "\ec60"; -} - -.ti-letter-r:before { - content: "\ec61"; -} - -.ti-letter-s:before { - content: "\ec62"; -} - -.ti-letter-spacing:before { - content: "\eea6"; -} - -.ti-letter-t:before { - content: "\ec63"; -} - -.ti-letter-u:before { - content: "\ec64"; -} - -.ti-letter-v:before { - content: "\ec65"; -} - -.ti-letter-w:before { - content: "\ec66"; -} - -.ti-letter-x:before { - content: "\ec67"; -} - -.ti-letter-y:before { - content: "\ec68"; -} - -.ti-letter-z:before { - content: "\ec69"; -} - -.ti-license:before { - content: "\ebc0"; -} - -.ti-license-off:before { - content: "\f153"; -} - -.ti-lifebuoy:before { - content: "\eadd"; -} - -.ti-lifebuoy-off:before { - content: "\f154"; -} - -.ti-lighter:before { - content: "\f794"; -} - -.ti-line:before { - content: "\ec40"; -} - -.ti-line-dashed:before { - content: "\eea7"; -} - -.ti-line-dotted:before { - content: "\eea8"; -} - -.ti-line-height:before { - content: "\eb94"; -} - -.ti-link:before { - content: "\eade"; -} - -.ti-link-off:before { - content: "\f402"; -} - -.ti-list:before { - content: "\eb6b"; -} - -.ti-list-check:before { - content: "\eb6a"; -} - -.ti-list-details:before { - content: "\ef40"; -} - -.ti-list-numbers:before { - content: "\ef11"; -} - -.ti-list-search:before { - content: "\eea9"; -} - -.ti-live-photo:before { - content: "\eadf"; -} - -.ti-live-photo-off:before { - content: "\f403"; -} - -.ti-live-view:before { - content: "\ec6b"; -} - -.ti-loader:before { - content: "\eca3"; -} - -.ti-loader-2:before { - content: "\f226"; -} - -.ti-loader-3:before { - content: "\f513"; -} - -.ti-loader-quarter:before { - content: "\eca2"; -} - -.ti-location:before { - content: "\eae0"; -} - -.ti-location-broken:before { - content: "\f2c4"; -} - -.ti-location-filled:before { - content: "\f67f"; -} - -.ti-location-off:before { - content: "\f155"; -} - -.ti-lock:before { - content: "\eae2"; -} - -.ti-lock-access:before { - content: "\eeaa"; -} - -.ti-lock-access-off:before { - content: "\f404"; -} - -.ti-lock-bolt:before { - content: "\f924"; -} - -.ti-lock-cancel:before { - content: "\f925"; -} - -.ti-lock-check:before { - content: "\f926"; -} - -.ti-lock-code:before { - content: "\f927"; -} - -.ti-lock-cog:before { - content: "\f928"; -} - -.ti-lock-dollar:before { - content: "\f929"; -} - -.ti-lock-down:before { - content: "\f92a"; -} - -.ti-lock-exclamation:before { - content: "\f92b"; -} - -.ti-lock-heart:before { - content: "\f92c"; -} - -.ti-lock-minus:before { - content: "\f92d"; -} - -.ti-lock-off:before { - content: "\ed1e"; -} - -.ti-lock-open:before { - content: "\eae1"; -} - -.ti-lock-open-off:before { - content: "\f156"; -} - -.ti-lock-pause:before { - content: "\f92e"; -} - -.ti-lock-pin:before { - content: "\f92f"; -} - -.ti-lock-plus:before { - content: "\f930"; -} - -.ti-lock-question:before { - content: "\f931"; -} - -.ti-lock-search:before { - content: "\f932"; -} - -.ti-lock-share:before { - content: "\f933"; -} - -.ti-lock-square:before { - content: "\ef51"; -} - -.ti-lock-square-rounded:before { - content: "\f636"; -} - -.ti-lock-square-rounded-filled:before { - content: "\f6da"; -} - -.ti-lock-star:before { - content: "\f934"; -} - -.ti-lock-up:before { - content: "\f935"; -} - -.ti-lock-x:before { - content: "\f936"; -} - -.ti-logic-and:before { - content: "\f240"; -} - -.ti-logic-buffer:before { - content: "\f241"; -} - -.ti-logic-nand:before { - content: "\f242"; -} - -.ti-logic-nor:before { - content: "\f243"; -} - -.ti-logic-not:before { - content: "\f244"; -} - -.ti-logic-or:before { - content: "\f245"; -} - -.ti-logic-xnor:before { - content: "\f246"; -} - -.ti-logic-xor:before { - content: "\f247"; -} - -.ti-login:before { - content: "\eba7"; -} - -.ti-logout:before { - content: "\eba8"; -} - -.ti-lollipop:before { - content: "\efcc"; -} - -.ti-lollipop-off:before { - content: "\f157"; -} - -.ti-luggage:before { - content: "\efad"; -} - -.ti-luggage-off:before { - content: "\f158"; -} - -.ti-lungs:before { - content: "\ef62"; -} - -.ti-lungs-off:before { - content: "\f405"; -} - -.ti-macro:before { - content: "\eeab"; -} - -.ti-macro-off:before { - content: "\f406"; -} - -.ti-magnet:before { - content: "\eae3"; -} - -.ti-magnet-off:before { - content: "\f159"; -} - -.ti-mail:before { - content: "\eae5"; -} - -.ti-mail-bolt:before { - content: "\f937"; -} - -.ti-mail-cancel:before { - content: "\f938"; -} - -.ti-mail-check:before { - content: "\f939"; -} - -.ti-mail-code:before { - content: "\f93a"; -} - -.ti-mail-cog:before { - content: "\f93b"; -} - -.ti-mail-dollar:before { - content: "\f93c"; -} - -.ti-mail-down:before { - content: "\f93d"; -} - -.ti-mail-exclamation:before { - content: "\f93e"; -} - -.ti-mail-fast:before { - content: "\f069"; -} - -.ti-mail-forward:before { - content: "\eeac"; -} - -.ti-mail-heart:before { - content: "\f93f"; -} - -.ti-mail-minus:before { - content: "\f940"; -} - -.ti-mail-off:before { - content: "\f15a"; -} - -.ti-mail-opened:before { - content: "\eae4"; -} - -.ti-mail-pause:before { - content: "\f941"; -} - -.ti-mail-pin:before { - content: "\f942"; -} - -.ti-mail-plus:before { - content: "\f943"; -} - -.ti-mail-question:before { - content: "\f944"; -} - -.ti-mail-search:before { - content: "\f945"; -} - -.ti-mail-share:before { - content: "\f946"; -} - -.ti-mail-star:before { - content: "\f947"; -} - -.ti-mail-up:before { - content: "\f948"; -} - -.ti-mail-x:before { - content: "\f949"; -} - -.ti-mailbox:before { - content: "\eead"; -} - -.ti-mailbox-off:before { - content: "\f15b"; -} - -.ti-man:before { - content: "\eae6"; -} - -.ti-manual-gearbox:before { - content: "\ed7b"; -} - -.ti-map:before { - content: "\eae9"; -} - -.ti-map-2:before { - content: "\eae7"; -} - -.ti-map-off:before { - content: "\f15c"; -} - -.ti-map-pin:before { - content: "\eae8"; -} - -.ti-map-pin-bolt:before { - content: "\f94a"; -} - -.ti-map-pin-cancel:before { - content: "\f94b"; -} - -.ti-map-pin-check:before { - content: "\f94c"; -} - -.ti-map-pin-code:before { - content: "\f94d"; -} - -.ti-map-pin-cog:before { - content: "\f94e"; -} - -.ti-map-pin-dollar:before { - content: "\f94f"; -} - -.ti-map-pin-down:before { - content: "\f950"; -} - -.ti-map-pin-exclamation:before { - content: "\f951"; -} - -.ti-map-pin-filled:before { - content: "\f680"; -} - -.ti-map-pin-heart:before { - content: "\f952"; -} - -.ti-map-pin-minus:before { - content: "\f953"; -} - -.ti-map-pin-off:before { - content: "\ecf3"; -} - -.ti-map-pin-pause:before { - content: "\f954"; -} - -.ti-map-pin-pin:before { - content: "\f955"; -} - -.ti-map-pin-plus:before { - content: "\f956"; -} - -.ti-map-pin-question:before { - content: "\f957"; -} - -.ti-map-pin-search:before { - content: "\f958"; -} - -.ti-map-pin-share:before { - content: "\f795"; -} - -.ti-map-pin-star:before { - content: "\f959"; -} - -.ti-map-pin-up:before { - content: "\f95a"; -} - -.ti-map-pin-x:before { - content: "\f95b"; -} - -.ti-map-pins:before { - content: "\ed5e"; -} - -.ti-map-search:before { - content: "\ef82"; -} - -.ti-markdown:before { - content: "\ec41"; -} - -.ti-markdown-off:before { - content: "\f407"; -} - -.ti-marquee:before { - content: "\ec77"; -} - -.ti-marquee-2:before { - content: "\eeae"; -} - -.ti-marquee-off:before { - content: "\f15d"; -} - -.ti-mars:before { - content: "\ec80"; -} - -.ti-mask:before { - content: "\eeb0"; -} - -.ti-mask-off:before { - content: "\eeaf"; -} - -.ti-masks-theater:before { - content: "\f263"; -} - -.ti-masks-theater-off:before { - content: "\f408"; -} - -.ti-massage:before { - content: "\eeb1"; -} - -.ti-matchstick:before { - content: "\f577"; -} - -.ti-math:before { - content: "\ebeb"; -} - -.ti-math-1-divide-2:before { - content: "\f4e2"; -} - -.ti-math-1-divide-3:before { - content: "\f4e3"; -} - -.ti-math-avg:before { - content: "\f0f4"; -} - -.ti-math-equal-greater:before { - content: "\f4e4"; -} - -.ti-math-equal-lower:before { - content: "\f4e5"; -} - -.ti-math-function:before { - content: "\eeb2"; -} - -.ti-math-function-off:before { - content: "\f15e"; -} - -.ti-math-function-y:before { - content: "\f4e6"; -} - -.ti-math-greater:before { - content: "\f4e7"; -} - -.ti-math-integral:before { - content: "\f4e9"; -} - -.ti-math-integral-x:before { - content: "\f4e8"; -} - -.ti-math-integrals:before { - content: "\f4ea"; -} - -.ti-math-lower:before { - content: "\f4eb"; -} - -.ti-math-max:before { - content: "\f0f5"; -} - -.ti-math-min:before { - content: "\f0f6"; -} - -.ti-math-not:before { - content: "\f4ec"; -} - -.ti-math-off:before { - content: "\f409"; -} - -.ti-math-pi:before { - content: "\f4ee"; -} - -.ti-math-pi-divide-2:before { - content: "\f4ed"; -} - -.ti-math-symbols:before { - content: "\eeb3"; -} - -.ti-math-x-divide-2:before { - content: "\f4ef"; -} - -.ti-math-x-divide-y:before { - content: "\f4f1"; -} - -.ti-math-x-divide-y-2:before { - content: "\f4f0"; -} - -.ti-math-x-minus-x:before { - content: "\f4f2"; -} - -.ti-math-x-minus-y:before { - content: "\f4f3"; -} - -.ti-math-x-plus-x:before { - content: "\f4f4"; -} - -.ti-math-x-plus-y:before { - content: "\f4f5"; -} - -.ti-math-xy:before { - content: "\f4f6"; -} - -.ti-math-y-minus-y:before { - content: "\f4f7"; -} - -.ti-math-y-plus-y:before { - content: "\f4f8"; -} - -.ti-maximize:before { - content: "\eaea"; -} - -.ti-maximize-off:before { - content: "\f15f"; -} - -.ti-meat:before { - content: "\ef12"; -} - -.ti-meat-off:before { - content: "\f40a"; -} - -.ti-medal:before { - content: "\ec78"; -} - -.ti-medal-2:before { - content: "\efcd"; -} - -.ti-medical-cross:before { - content: "\ec2f"; -} - -.ti-medical-cross-filled:before { - content: "\f681"; -} - -.ti-medical-cross-off:before { - content: "\f160"; -} - -.ti-medicine-syrup:before { - content: "\ef63"; -} - -.ti-meeple:before { - content: "\f514"; -} - -.ti-menorah:before { - content: "\f58c"; -} - -.ti-menu:before { - content: "\eaeb"; -} - -.ti-menu-2:before { - content: "\ec42"; -} - -.ti-menu-order:before { - content: "\f5f5"; -} - -.ti-message:before { - content: "\eaef"; -} - -.ti-message-2:before { - content: "\eaec"; -} - -.ti-message-2-bolt:before { - content: "\f95c"; -} - -.ti-message-2-cancel:before { - content: "\f95d"; -} - -.ti-message-2-check:before { - content: "\f95e"; -} - -.ti-message-2-code:before { - content: "\f012"; -} - -.ti-message-2-cog:before { - content: "\f95f"; -} - -.ti-message-2-dollar:before { - content: "\f960"; -} - -.ti-message-2-down:before { - content: "\f961"; -} - -.ti-message-2-exclamation:before { - content: "\f962"; -} - -.ti-message-2-heart:before { - content: "\f963"; -} - -.ti-message-2-minus:before { - content: "\f964"; -} - -.ti-message-2-off:before { - content: "\f40b"; -} - -.ti-message-2-pause:before { - content: "\f965"; -} - -.ti-message-2-pin:before { - content: "\f966"; -} - -.ti-message-2-plus:before { - content: "\f967"; -} - -.ti-message-2-question:before { - content: "\f968"; -} - -.ti-message-2-search:before { - content: "\f969"; -} - -.ti-message-2-share:before { - content: "\f077"; -} - -.ti-message-2-star:before { - content: "\f96a"; -} - -.ti-message-2-up:before { - content: "\f96b"; -} - -.ti-message-2-x:before { - content: "\f96c"; -} - -.ti-message-bolt:before { - content: "\f96d"; -} - -.ti-message-cancel:before { - content: "\f96e"; -} - -.ti-message-chatbot:before { - content: "\f38a"; -} - -.ti-message-check:before { - content: "\f96f"; -} - -.ti-message-circle:before { - content: "\eaed"; -} - -.ti-message-circle-2:before { - content: "\ed3f"; -} - -.ti-message-circle-2-filled:before { - content: "\f682"; -} - -.ti-message-circle-bolt:before { - content: "\f970"; -} - -.ti-message-circle-cancel:before { - content: "\f971"; -} - -.ti-message-circle-check:before { - content: "\f972"; -} - -.ti-message-circle-code:before { - content: "\f973"; -} - -.ti-message-circle-cog:before { - content: "\f974"; -} - -.ti-message-circle-dollar:before { - content: "\f975"; -} - -.ti-message-circle-down:before { - content: "\f976"; -} - -.ti-message-circle-exclamation:before { - content: "\f977"; -} - -.ti-message-circle-heart:before { - content: "\f978"; -} - -.ti-message-circle-minus:before { - content: "\f979"; -} - -.ti-message-circle-off:before { - content: "\ed40"; -} - -.ti-message-circle-pause:before { - content: "\f97a"; -} - -.ti-message-circle-pin:before { - content: "\f97b"; -} - -.ti-message-circle-plus:before { - content: "\f97c"; -} - -.ti-message-circle-question:before { - content: "\f97d"; -} - -.ti-message-circle-search:before { - content: "\f97e"; -} - -.ti-message-circle-share:before { - content: "\f97f"; -} - -.ti-message-circle-star:before { - content: "\f980"; -} - -.ti-message-circle-up:before { - content: "\f981"; -} - -.ti-message-circle-x:before { - content: "\f982"; -} - -.ti-message-code:before { - content: "\f013"; -} - -.ti-message-cog:before { - content: "\f983"; -} - -.ti-message-dollar:before { - content: "\f984"; -} - -.ti-message-dots:before { - content: "\eaee"; -} - -.ti-message-down:before { - content: "\f985"; -} - -.ti-message-exclamation:before { - content: "\f986"; -} - -.ti-message-forward:before { - content: "\f28f"; -} - -.ti-message-heart:before { - content: "\f987"; -} - -.ti-message-language:before { - content: "\efae"; -} - -.ti-message-minus:before { - content: "\f988"; -} - -.ti-message-off:before { - content: "\ed41"; -} - -.ti-message-pause:before { - content: "\f989"; -} - -.ti-message-pin:before { - content: "\f98a"; -} - -.ti-message-plus:before { - content: "\ec9a"; -} - -.ti-message-question:before { - content: "\f98b"; -} - -.ti-message-report:before { - content: "\ec9b"; -} - -.ti-message-search:before { - content: "\f98c"; -} - -.ti-message-share:before { - content: "\f078"; -} - -.ti-message-star:before { - content: "\f98d"; -} - -.ti-message-up:before { - content: "\f98e"; -} - -.ti-message-x:before { - content: "\f98f"; -} - -.ti-messages:before { - content: "\eb6c"; -} - -.ti-messages-off:before { - content: "\ed42"; -} - -.ti-meteor:before { - content: "\f1fd"; -} - -.ti-meteor-off:before { - content: "\f40c"; -} - -.ti-mickey:before { - content: "\f2a3"; -} - -.ti-mickey-filled:before { - content: "\f683"; -} - -.ti-microphone:before { - content: "\eaf0"; -} - -.ti-microphone-2:before { - content: "\ef2c"; -} - -.ti-microphone-2-off:before { - content: "\f40d"; -} - -.ti-microphone-off:before { - content: "\ed16"; -} - -.ti-microscope:before { - content: "\ef64"; -} - -.ti-microscope-off:before { - content: "\f40e"; -} - -.ti-microwave:before { - content: "\f248"; -} - -.ti-microwave-off:before { - content: "\f264"; -} - -.ti-military-award:before { - content: "\f079"; -} - -.ti-military-rank:before { - content: "\efcf"; -} - -.ti-milk:before { - content: "\ef13"; -} - -.ti-milk-off:before { - content: "\f40f"; -} - -.ti-milkshake:before { - content: "\f4c8"; -} - -.ti-minimize:before { - content: "\eaf1"; -} - -.ti-minus:before { - content: "\eaf2"; -} - -.ti-minus-vertical:before { - content: "\eeb4"; -} - -.ti-mist:before { - content: "\ec30"; -} - -.ti-mist-off:before { - content: "\f410"; -} - -.ti-mobiledata:before { - content: "\f9f5"; -} - -.ti-mobiledata-off:before { - content: "\f9f4"; -} - -.ti-moneybag:before { - content: "\f506"; -} - -.ti-mood-angry:before { - content: "\f2de"; -} - -.ti-mood-annoyed:before { - content: "\f2e0"; -} - -.ti-mood-annoyed-2:before { - content: "\f2df"; -} - -.ti-mood-boy:before { - content: "\ed2d"; -} - -.ti-mood-check:before { - content: "\f7b3"; -} - -.ti-mood-cog:before { - content: "\f7b4"; -} - -.ti-mood-confuzed:before { - content: "\eaf3"; -} - -.ti-mood-confuzed-filled:before { - content: "\f7f2"; -} - -.ti-mood-crazy-happy:before { - content: "\ed90"; -} - -.ti-mood-cry:before { - content: "\ecbb"; -} - -.ti-mood-dollar:before { - content: "\f7b5"; -} - -.ti-mood-empty:before { - content: "\eeb5"; -} - -.ti-mood-empty-filled:before { - content: "\f7f3"; -} - -.ti-mood-happy:before { - content: "\eaf4"; -} - -.ti-mood-happy-filled:before { - content: "\f7f4"; -} - -.ti-mood-heart:before { - content: "\f7b6"; -} - -.ti-mood-kid:before { - content: "\ec03"; -} - -.ti-mood-kid-filled:before { - content: "\f7f5"; -} - -.ti-mood-look-left:before { - content: "\f2c5"; -} - -.ti-mood-look-right:before { - content: "\f2c6"; -} - -.ti-mood-minus:before { - content: "\f7b7"; -} - -.ti-mood-nerd:before { - content: "\f2e1"; -} - -.ti-mood-nervous:before { - content: "\ef96"; -} - -.ti-mood-neutral:before { - content: "\eaf5"; -} - -.ti-mood-neutral-filled:before { - content: "\f7f6"; -} - -.ti-mood-off:before { - content: "\f161"; -} - -.ti-mood-pin:before { - content: "\f7b8"; -} - -.ti-mood-plus:before { - content: "\f7b9"; -} - -.ti-mood-sad:before { - content: "\eaf6"; -} - -.ti-mood-sad-2:before { - content: "\f2e2"; -} - -.ti-mood-sad-dizzy:before { - content: "\f2e3"; -} - -.ti-mood-sad-filled:before { - content: "\f7f7"; -} - -.ti-mood-sad-squint:before { - content: "\f2e4"; -} - -.ti-mood-search:before { - content: "\f7ba"; -} - -.ti-mood-sick:before { - content: "\f2e5"; -} - -.ti-mood-silence:before { - content: "\f2e6"; -} - -.ti-mood-sing:before { - content: "\f2c7"; -} - -.ti-mood-smile:before { - content: "\eaf7"; -} - -.ti-mood-smile-beam:before { - content: "\f2e7"; -} - -.ti-mood-smile-dizzy:before { - content: "\f2e8"; -} - -.ti-mood-smile-filled:before { - content: "\f7f8"; -} - -.ti-mood-suprised:before { - content: "\ec04"; -} - -.ti-mood-tongue:before { - content: "\eb95"; -} - -.ti-mood-tongue-wink:before { - content: "\f2ea"; -} - -.ti-mood-tongue-wink-2:before { - content: "\f2e9"; -} - -.ti-mood-unamused:before { - content: "\f2eb"; -} - -.ti-mood-up:before { - content: "\f7bb"; -} - -.ti-mood-wink:before { - content: "\f2ed"; -} - -.ti-mood-wink-2:before { - content: "\f2ec"; -} - -.ti-mood-wrrr:before { - content: "\f2ee"; -} - -.ti-mood-x:before { - content: "\f7bc"; -} - -.ti-mood-xd:before { - content: "\f2ef"; -} - -.ti-moon:before { - content: "\eaf8"; -} - -.ti-moon-2:before { - content: "\ece6"; -} - -.ti-moon-filled:before { - content: "\f684"; -} - -.ti-moon-off:before { - content: "\f162"; -} - -.ti-moon-stars:before { - content: "\ece7"; -} - -.ti-moped:before { - content: "\ecbc"; -} - -.ti-motorbike:before { - content: "\eeb6"; -} - -.ti-mountain:before { - content: "\ef97"; -} - -.ti-mountain-off:before { - content: "\f411"; -} - -.ti-mouse:before { - content: "\eaf9"; -} - -.ti-mouse-2:before { - content: "\f1d7"; -} - -.ti-mouse-off:before { - content: "\f163"; -} - -.ti-moustache:before { - content: "\f4c9"; -} - -.ti-movie:before { - content: "\eafa"; -} - -.ti-movie-off:before { - content: "\f164"; -} - -.ti-mug:before { - content: "\eafb"; -} - -.ti-mug-off:before { - content: "\f165"; -} - -.ti-multiplier-0-5x:before { - content: "\ef41"; -} - -.ti-multiplier-1-5x:before { - content: "\ef42"; -} - -.ti-multiplier-1x:before { - content: "\ef43"; -} - -.ti-multiplier-2x:before { - content: "\ef44"; -} - -.ti-mushroom:before { - content: "\ef14"; -} - -.ti-mushroom-filled:before { - content: "\f7f9"; -} - -.ti-mushroom-off:before { - content: "\f412"; -} - -.ti-music:before { - content: "\eafc"; -} - -.ti-music-off:before { - content: "\f166"; -} - -.ti-navigation:before { - content: "\f2c8"; -} - -.ti-navigation-filled:before { - content: "\f685"; -} - -.ti-navigation-off:before { - content: "\f413"; -} - -.ti-needle:before { - content: "\f508"; -} - -.ti-needle-thread:before { - content: "\f507"; -} - -.ti-network:before { - content: "\f09f"; -} - -.ti-network-off:before { - content: "\f414"; -} - -.ti-new-section:before { - content: "\ebc1"; -} - -.ti-news:before { - content: "\eafd"; -} - -.ti-news-off:before { - content: "\f167"; -} - -.ti-nfc:before { - content: "\eeb7"; -} - -.ti-nfc-off:before { - content: "\f168"; -} - -.ti-no-copyright:before { - content: "\efb9"; -} - -.ti-no-creative-commons:before { - content: "\efba"; -} - -.ti-no-derivatives:before { - content: "\efbb"; -} - -.ti-north-star:before { - content: "\f014"; -} - -.ti-note:before { - content: "\eb6d"; -} - -.ti-note-off:before { - content: "\f169"; -} - -.ti-notebook:before { - content: "\eb96"; -} - -.ti-notebook-off:before { - content: "\f415"; -} - -.ti-notes:before { - content: "\eb6e"; -} - -.ti-notes-off:before { - content: "\f16a"; -} - -.ti-notification:before { - content: "\eafe"; -} - -.ti-notification-off:before { - content: "\f16b"; -} - -.ti-number:before { - content: "\f1fe"; -} - -.ti-number-0:before { - content: "\edf0"; -} - -.ti-number-1:before { - content: "\edf1"; -} - -.ti-number-2:before { - content: "\edf2"; -} - -.ti-number-3:before { - content: "\edf3"; -} - -.ti-number-4:before { - content: "\edf4"; -} - -.ti-number-5:before { - content: "\edf5"; -} - -.ti-number-6:before { - content: "\edf6"; -} - -.ti-number-7:before { - content: "\edf7"; -} - -.ti-number-8:before { - content: "\edf8"; -} - -.ti-number-9:before { - content: "\edf9"; -} - -.ti-numbers:before { - content: "\f015"; -} - -.ti-nurse:before { - content: "\ef65"; -} - -.ti-octagon:before { - content: "\ecbd"; -} - -.ti-octagon-filled:before { - content: "\f686"; -} - -.ti-octagon-off:before { - content: "\eeb8"; -} - -.ti-old:before { - content: "\eeb9"; -} - -.ti-olympics:before { - content: "\eeba"; -} - -.ti-olympics-off:before { - content: "\f416"; -} - -.ti-om:before { - content: "\f58d"; -} - -.ti-omega:before { - content: "\eb97"; -} - -.ti-outbound:before { - content: "\f249"; -} - -.ti-outlet:before { - content: "\ebd7"; -} - -.ti-oval:before { - content: "\f02e"; -} - -.ti-oval-filled:before { - content: "\f687"; -} - -.ti-oval-vertical:before { - content: "\f02d"; -} - -.ti-oval-vertical-filled:before { - content: "\f688"; -} - -.ti-overline:before { - content: "\eebb"; -} - -.ti-package:before { - content: "\eaff"; -} - -.ti-package-export:before { - content: "\f07a"; -} - -.ti-package-import:before { - content: "\f07b"; -} - -.ti-package-off:before { - content: "\f16c"; -} - -.ti-packages:before { - content: "\f2c9"; -} - -.ti-pacman:before { - content: "\eebc"; -} - -.ti-page-break:before { - content: "\ec81"; -} - -.ti-paint:before { - content: "\eb00"; -} - -.ti-paint-filled:before { - content: "\f75f"; -} - -.ti-paint-off:before { - content: "\f16d"; -} - -.ti-palette:before { - content: "\eb01"; -} - -.ti-palette-off:before { - content: "\f16e"; -} - -.ti-panorama-horizontal:before { - content: "\ed33"; -} - -.ti-panorama-horizontal-off:before { - content: "\f417"; -} - -.ti-panorama-vertical:before { - content: "\ed34"; -} - -.ti-panorama-vertical-off:before { - content: "\f418"; -} - -.ti-paper-bag:before { - content: "\f02f"; -} - -.ti-paper-bag-off:before { - content: "\f16f"; -} - -.ti-paperclip:before { - content: "\eb02"; -} - -.ti-parachute:before { - content: "\ed7c"; -} - -.ti-parachute-off:before { - content: "\f170"; -} - -.ti-parentheses:before { - content: "\ebd8"; -} - -.ti-parentheses-off:before { - content: "\f171"; -} - -.ti-parking:before { - content: "\eb03"; -} - -.ti-parking-off:before { - content: "\f172"; -} - -.ti-password:before { - content: "\f4ca"; -} - -.ti-paw:before { - content: "\eff9"; -} - -.ti-paw-filled:before { - content: "\f689"; -} - -.ti-paw-off:before { - content: "\f419"; -} - -.ti-pdf:before { - content: "\f7ac"; -} - -.ti-peace:before { - content: "\ecbe"; -} - -.ti-pencil:before { - content: "\eb04"; -} - -.ti-pencil-minus:before { - content: "\f1eb"; -} - -.ti-pencil-off:before { - content: "\f173"; -} - -.ti-pencil-plus:before { - content: "\f1ec"; -} - -.ti-pennant:before { - content: "\ed7d"; -} - -.ti-pennant-2:before { - content: "\f06a"; -} - -.ti-pennant-2-filled:before { - content: "\f68a"; -} - -.ti-pennant-filled:before { - content: "\f68b"; -} - -.ti-pennant-off:before { - content: "\f174"; -} - -.ti-pentagon:before { - content: "\efe3"; -} - -.ti-pentagon-filled:before { - content: "\f68c"; -} - -.ti-pentagon-off:before { - content: "\f41a"; -} - -.ti-pentagram:before { - content: "\f586"; -} - -.ti-pepper:before { - content: "\ef15"; -} - -.ti-pepper-off:before { - content: "\f175"; -} - -.ti-percentage:before { - content: "\ecf4"; -} - -.ti-perfume:before { - content: "\f509"; -} - -.ti-perspective:before { - content: "\eebd"; -} - -.ti-perspective-off:before { - content: "\f176"; -} - -.ti-phone:before { - content: "\eb09"; -} - -.ti-phone-call:before { - content: "\eb05"; -} - -.ti-phone-calling:before { - content: "\ec43"; -} - -.ti-phone-check:before { - content: "\ec05"; -} - -.ti-phone-incoming:before { - content: "\eb06"; -} - -.ti-phone-off:before { - content: "\ecf5"; -} - -.ti-phone-outgoing:before { - content: "\eb07"; -} - -.ti-phone-pause:before { - content: "\eb08"; -} - -.ti-phone-plus:before { - content: "\ec06"; -} - -.ti-phone-x:before { - content: "\ec07"; -} - -.ti-photo:before { - content: "\eb0a"; -} - -.ti-photo-bolt:before { - content: "\f990"; -} - -.ti-photo-cancel:before { - content: "\f35d"; -} - -.ti-photo-check:before { - content: "\f35e"; -} - -.ti-photo-code:before { - content: "\f991"; -} - -.ti-photo-cog:before { - content: "\f992"; -} - -.ti-photo-dollar:before { - content: "\f993"; -} - -.ti-photo-down:before { - content: "\f35f"; -} - -.ti-photo-edit:before { - content: "\f360"; -} - -.ti-photo-exclamation:before { - content: "\f994"; -} - -.ti-photo-heart:before { - content: "\f361"; -} - -.ti-photo-minus:before { - content: "\f362"; -} - -.ti-photo-off:before { - content: "\ecf6"; -} - -.ti-photo-pause:before { - content: "\f995"; -} - -.ti-photo-pin:before { - content: "\f996"; -} - -.ti-photo-plus:before { - content: "\f363"; -} - -.ti-photo-question:before { - content: "\f997"; -} - -.ti-photo-search:before { - content: "\f364"; -} - -.ti-photo-sensor:before { - content: "\f798"; -} - -.ti-photo-sensor-2:before { - content: "\f796"; -} - -.ti-photo-sensor-3:before { - content: "\f797"; -} - -.ti-photo-share:before { - content: "\f998"; -} - -.ti-photo-shield:before { - content: "\f365"; -} - -.ti-photo-star:before { - content: "\f366"; -} - -.ti-photo-up:before { - content: "\f38b"; -} - -.ti-photo-x:before { - content: "\f367"; -} - -.ti-physotherapist:before { - content: "\eebe"; -} - -.ti-picture-in-picture:before { - content: "\ed35"; -} - -.ti-picture-in-picture-off:before { - content: "\ed43"; -} - -.ti-picture-in-picture-on:before { - content: "\ed44"; -} - -.ti-picture-in-picture-top:before { - content: "\efe4"; -} - -.ti-pig:before { - content: "\ef52"; -} - -.ti-pig-money:before { - content: "\f38c"; -} - -.ti-pig-off:before { - content: "\f177"; -} - -.ti-pilcrow:before { - content: "\f5f6"; -} - -.ti-pill:before { - content: "\ec44"; -} - -.ti-pill-off:before { - content: "\f178"; -} - -.ti-pills:before { - content: "\ef66"; -} - -.ti-pin:before { - content: "\ec9c"; -} - -.ti-pin-filled:before { - content: "\f68d"; -} - -.ti-ping-pong:before { - content: "\f38d"; -} - -.ti-pinned:before { - content: "\ed60"; -} - -.ti-pinned-filled:before { - content: "\f68e"; -} - -.ti-pinned-off:before { - content: "\ed5f"; -} - -.ti-pizza:before { - content: "\edbb"; -} - -.ti-pizza-off:before { - content: "\f179"; -} - -.ti-placeholder:before { - content: "\f626"; -} - -.ti-plane:before { - content: "\eb6f"; -} - -.ti-plane-arrival:before { - content: "\eb99"; -} - -.ti-plane-departure:before { - content: "\eb9a"; -} - -.ti-plane-inflight:before { - content: "\ef98"; -} - -.ti-plane-off:before { - content: "\f17a"; -} - -.ti-plane-tilt:before { - content: "\f1ed"; -} - -.ti-planet:before { - content: "\ec08"; -} - -.ti-planet-off:before { - content: "\f17b"; -} - -.ti-plant:before { - content: "\ed50"; -} - -.ti-plant-2:before { - content: "\ed7e"; -} - -.ti-plant-2-off:before { - content: "\f17c"; -} - -.ti-plant-off:before { - content: "\f17d"; -} - -.ti-play-card:before { - content: "\eebf"; -} - -.ti-play-card-off:before { - content: "\f17e"; -} - -.ti-player-eject:before { - content: "\efbc"; -} - -.ti-player-eject-filled:before { - content: "\f68f"; -} - -.ti-player-pause:before { - content: "\ed45"; -} - -.ti-player-pause-filled:before { - content: "\f690"; -} - -.ti-player-play:before { - content: "\ed46"; -} - -.ti-player-play-filled:before { - content: "\f691"; -} - -.ti-player-record:before { - content: "\ed47"; -} - -.ti-player-record-filled:before { - content: "\f692"; -} - -.ti-player-skip-back:before { - content: "\ed48"; -} - -.ti-player-skip-back-filled:before { - content: "\f693"; -} - -.ti-player-skip-forward:before { - content: "\ed49"; -} - -.ti-player-skip-forward-filled:before { - content: "\f694"; -} - -.ti-player-stop:before { - content: "\ed4a"; -} - -.ti-player-stop-filled:before { - content: "\f695"; -} - -.ti-player-track-next:before { - content: "\ed4b"; -} - -.ti-player-track-next-filled:before { - content: "\f696"; -} - -.ti-player-track-prev:before { - content: "\ed4c"; -} - -.ti-player-track-prev-filled:before { - content: "\f697"; -} - -.ti-playlist:before { - content: "\eec0"; -} - -.ti-playlist-add:before { - content: "\f008"; -} - -.ti-playlist-off:before { - content: "\f17f"; -} - -.ti-playlist-x:before { - content: "\f009"; -} - -.ti-playstation-circle:before { - content: "\f2ad"; -} - -.ti-playstation-square:before { - content: "\f2ae"; -} - -.ti-playstation-triangle:before { - content: "\f2af"; -} - -.ti-playstation-x:before { - content: "\f2b0"; -} - -.ti-plug:before { - content: "\ebd9"; -} - -.ti-plug-connected:before { - content: "\f00a"; -} - -.ti-plug-connected-x:before { - content: "\f0a0"; -} - -.ti-plug-off:before { - content: "\f180"; -} - -.ti-plug-x:before { - content: "\f0a1"; -} - -.ti-plus:before { - content: "\eb0b"; -} - -.ti-plus-equal:before { - content: "\f7ad"; -} - -.ti-plus-minus:before { - content: "\f7ae"; -} - -.ti-png:before { - content: "\f3ad"; -} - -.ti-podium:before { - content: "\f1d8"; -} - -.ti-podium-off:before { - content: "\f41b"; -} - -.ti-point:before { - content: "\eb0c"; -} - -.ti-point-filled:before { - content: "\f698"; -} - -.ti-point-off:before { - content: "\f181"; -} - -.ti-pointer:before { - content: "\f265"; -} - -.ti-pointer-bolt:before { - content: "\f999"; -} - -.ti-pointer-cancel:before { - content: "\f99a"; -} - -.ti-pointer-check:before { - content: "\f99b"; -} - -.ti-pointer-code:before { - content: "\f99c"; -} - -.ti-pointer-cog:before { - content: "\f99d"; -} - -.ti-pointer-dollar:before { - content: "\f99e"; -} - -.ti-pointer-down:before { - content: "\f99f"; -} - -.ti-pointer-exclamation:before { - content: "\f9a0"; -} - -.ti-pointer-heart:before { - content: "\f9a1"; -} - -.ti-pointer-minus:before { - content: "\f9a2"; -} - -.ti-pointer-off:before { - content: "\f9a3"; -} - -.ti-pointer-pause:before { - content: "\f9a4"; -} - -.ti-pointer-pin:before { - content: "\f9a5"; -} - -.ti-pointer-plus:before { - content: "\f9a6"; -} - -.ti-pointer-question:before { - content: "\f9a7"; -} - -.ti-pointer-search:before { - content: "\f9a8"; -} - -.ti-pointer-share:before { - content: "\f9a9"; -} - -.ti-pointer-star:before { - content: "\f9aa"; -} - -.ti-pointer-up:before { - content: "\f9ab"; -} - -.ti-pointer-x:before { - content: "\f9ac"; -} - -.ti-pokeball:before { - content: "\eec1"; -} - -.ti-pokeball-off:before { - content: "\f41c"; -} - -.ti-poker-chip:before { - content: "\f515"; -} - -.ti-polaroid:before { - content: "\eec2"; -} - -.ti-polygon:before { - content: "\efd0"; -} - -.ti-polygon-off:before { - content: "\f182"; -} - -.ti-poo:before { - content: "\f258"; -} - -.ti-pool:before { - content: "\ed91"; -} - -.ti-pool-off:before { - content: "\f41d"; -} - -.ti-power:before { - content: "\eb0d"; -} - -.ti-pray:before { - content: "\ecbf"; -} - -.ti-premium-rights:before { - content: "\efbd"; -} - -.ti-prescription:before { - content: "\ef99"; -} - -.ti-presentation:before { - content: "\eb70"; -} - -.ti-presentation-analytics:before { - content: "\eec3"; -} - -.ti-presentation-off:before { - content: "\f183"; -} - -.ti-printer:before { - content: "\eb0e"; -} - -.ti-printer-off:before { - content: "\f184"; -} - -.ti-prison:before { - content: "\ef79"; -} - -.ti-prompt:before { - content: "\eb0f"; -} - -.ti-propeller:before { - content: "\eec4"; -} - -.ti-propeller-off:before { - content: "\f185"; -} - -.ti-pumpkin-scary:before { - content: "\f587"; -} - -.ti-puzzle:before { - content: "\eb10"; -} - -.ti-puzzle-2:before { - content: "\ef83"; -} - -.ti-puzzle-filled:before { - content: "\f699"; -} - -.ti-puzzle-off:before { - content: "\f186"; -} - -.ti-pyramid:before { - content: "\eec5"; -} - -.ti-pyramid-off:before { - content: "\f187"; -} - -.ti-qrcode:before { - content: "\eb11"; -} - -.ti-qrcode-off:before { - content: "\f41e"; -} - -.ti-question-mark:before { - content: "\ec9d"; -} - -.ti-quote:before { - content: "\efbe"; -} - -.ti-quote-off:before { - content: "\f188"; -} - -.ti-radar:before { - content: "\f017"; -} - -.ti-radar-2:before { - content: "\f016"; -} - -.ti-radar-off:before { - content: "\f41f"; -} - -.ti-radio:before { - content: "\ef2d"; -} - -.ti-radio-off:before { - content: "\f420"; -} - -.ti-radioactive:before { - content: "\ecc0"; -} - -.ti-radioactive-filled:before { - content: "\f760"; -} - -.ti-radioactive-off:before { - content: "\f189"; -} - -.ti-radius-bottom-left:before { - content: "\eec6"; -} - -.ti-radius-bottom-right:before { - content: "\eec7"; -} - -.ti-radius-top-left:before { - content: "\eec8"; -} - -.ti-radius-top-right:before { - content: "\eec9"; -} - -.ti-rainbow:before { - content: "\edbc"; -} - -.ti-rainbow-off:before { - content: "\f18a"; -} - -.ti-rating-12-plus:before { - content: "\f266"; -} - -.ti-rating-14-plus:before { - content: "\f267"; -} - -.ti-rating-16-plus:before { - content: "\f268"; -} - -.ti-rating-18-plus:before { - content: "\f269"; -} - -.ti-rating-21-plus:before { - content: "\f26a"; -} - -.ti-razor:before { - content: "\f4b5"; -} - -.ti-razor-electric:before { - content: "\f4b4"; -} - -.ti-receipt:before { - content: "\edfd"; -} - -.ti-receipt-2:before { - content: "\edfa"; -} - -.ti-receipt-off:before { - content: "\edfb"; -} - -.ti-receipt-refund:before { - content: "\edfc"; -} - -.ti-receipt-tax:before { - content: "\edbd"; -} - -.ti-recharging:before { - content: "\eeca"; -} - -.ti-record-mail:before { - content: "\eb12"; -} - -.ti-record-mail-off:before { - content: "\f18b"; -} - -.ti-rectangle:before { - content: "\ed37"; -} - -.ti-rectangle-filled:before { - content: "\f69a"; -} - -.ti-rectangle-vertical:before { - content: "\ed36"; -} - -.ti-rectangle-vertical-filled:before { - content: "\f69b"; -} - -.ti-recycle:before { - content: "\eb9b"; -} - -.ti-recycle-off:before { - content: "\f18c"; -} - -.ti-refresh:before { - content: "\eb13"; -} - -.ti-refresh-alert:before { - content: "\ed57"; -} - -.ti-refresh-dot:before { - content: "\efbf"; -} - -.ti-refresh-off:before { - content: "\f18d"; -} - -.ti-regex:before { - content: "\f31f"; -} - -.ti-regex-off:before { - content: "\f421"; -} - -.ti-registered:before { - content: "\eb14"; -} - -.ti-relation-many-to-many:before { - content: "\ed7f"; -} - -.ti-relation-one-to-many:before { - content: "\ed80"; -} - -.ti-relation-one-to-one:before { - content: "\ed81"; -} - -.ti-reload:before { - content: "\f3ae"; -} - -.ti-repeat:before { - content: "\eb72"; -} - -.ti-repeat-off:before { - content: "\f18e"; -} - -.ti-repeat-once:before { - content: "\eb71"; -} - -.ti-replace:before { - content: "\ebc7"; -} - -.ti-replace-filled:before { - content: "\f69c"; -} - -.ti-replace-off:before { - content: "\f422"; -} - -.ti-report:before { - content: "\eece"; -} - -.ti-report-analytics:before { - content: "\eecb"; -} - -.ti-report-medical:before { - content: "\eecc"; -} - -.ti-report-money:before { - content: "\eecd"; -} - -.ti-report-off:before { - content: "\f18f"; -} - -.ti-report-search:before { - content: "\ef84"; -} - -.ti-reserved-line:before { - content: "\f9f6"; -} - -.ti-resize:before { - content: "\eecf"; -} - -.ti-ribbon-health:before { - content: "\f58e"; -} - -.ti-ripple:before { - content: "\ed82"; -} - -.ti-ripple-off:before { - content: "\f190"; -} - -.ti-road:before { - content: "\f018"; -} - -.ti-road-off:before { - content: "\f191"; -} - -.ti-road-sign:before { - content: "\ecdd"; -} - -.ti-robot:before { - content: "\f00b"; -} - -.ti-robot-off:before { - content: "\f192"; -} - -.ti-rocket:before { - content: "\ec45"; -} - -.ti-rocket-off:before { - content: "\f193"; -} - -.ti-roller-skating:before { - content: "\efd1"; -} - -.ti-rollercoaster:before { - content: "\f0a2"; -} - -.ti-rollercoaster-off:before { - content: "\f423"; -} - -.ti-rosette:before { - content: "\f599"; -} - -.ti-rosette-filled:before { - content: "\f69d"; -} - -.ti-rosette-number-0:before { - content: "\f58f"; -} - -.ti-rosette-number-1:before { - content: "\f590"; -} - -.ti-rosette-number-2:before { - content: "\f591"; -} - -.ti-rosette-number-3:before { - content: "\f592"; -} - -.ti-rosette-number-4:before { - content: "\f593"; -} - -.ti-rosette-number-5:before { - content: "\f594"; -} - -.ti-rosette-number-6:before { - content: "\f595"; -} - -.ti-rosette-number-7:before { - content: "\f596"; -} - -.ti-rosette-number-8:before { - content: "\f597"; -} - -.ti-rosette-number-9:before { - content: "\f598"; -} - -.ti-rotate:before { - content: "\eb16"; -} - -.ti-rotate-2:before { - content: "\ebb4"; -} - -.ti-rotate-360:before { - content: "\ef85"; -} - -.ti-rotate-clockwise:before { - content: "\eb15"; -} - -.ti-rotate-clockwise-2:before { - content: "\ebb5"; -} - -.ti-rotate-dot:before { - content: "\efe5"; -} - -.ti-rotate-rectangle:before { - content: "\ec15"; -} - -.ti-route:before { - content: "\eb17"; -} - -.ti-route-2:before { - content: "\f4b6"; -} - -.ti-route-off:before { - content: "\f194"; -} - -.ti-router:before { - content: "\eb18"; -} - -.ti-router-off:before { - content: "\f424"; -} - -.ti-row-insert-bottom:before { - content: "\eed0"; -} - -.ti-row-insert-top:before { - content: "\eed1"; -} - -.ti-rss:before { - content: "\eb19"; -} - -.ti-rubber-stamp:before { - content: "\f5ab"; -} - -.ti-rubber-stamp-off:before { - content: "\f5aa"; -} - -.ti-ruler:before { - content: "\eb1a"; -} - -.ti-ruler-2:before { - content: "\eed2"; -} - -.ti-ruler-2-off:before { - content: "\f195"; -} - -.ti-ruler-3:before { - content: "\f290"; -} - -.ti-ruler-measure:before { - content: "\f291"; -} - -.ti-ruler-off:before { - content: "\f196"; -} - -.ti-run:before { - content: "\ec82"; -} - -.ti-s-turn-down:before { - content: "\f516"; -} - -.ti-s-turn-left:before { - content: "\f517"; -} - -.ti-s-turn-right:before { - content: "\f518"; -} - -.ti-s-turn-up:before { - content: "\f519"; -} - -.ti-sailboat:before { - content: "\ec83"; -} - -.ti-sailboat-2:before { - content: "\f5f7"; -} - -.ti-sailboat-off:before { - content: "\f425"; -} - -.ti-salad:before { - content: "\f50a"; -} - -.ti-salt:before { - content: "\ef16"; -} - -.ti-satellite:before { - content: "\eed3"; -} - -.ti-satellite-off:before { - content: "\f197"; -} - -.ti-sausage:before { - content: "\ef17"; -} - -.ti-scale:before { - content: "\ebc2"; -} - -.ti-scale-off:before { - content: "\f198"; -} - -.ti-scale-outline:before { - content: "\ef53"; -} - -.ti-scale-outline-off:before { - content: "\f199"; -} - -.ti-scan:before { - content: "\ebc8"; -} - -.ti-scan-eye:before { - content: "\f1ff"; -} - -.ti-schema:before { - content: "\f200"; -} - -.ti-schema-off:before { - content: "\f426"; -} - -.ti-school:before { - content: "\ecf7"; -} - -.ti-school-bell:before { - content: "\f64a"; -} - -.ti-school-off:before { - content: "\f19a"; -} - -.ti-scissors:before { - content: "\eb1b"; -} - -.ti-scissors-off:before { - content: "\f19b"; -} - -.ti-scooter:before { - content: "\ec6c"; -} - -.ti-scooter-electric:before { - content: "\ecc1"; -} - -.ti-screen-share:before { - content: "\ed18"; -} - -.ti-screen-share-off:before { - content: "\ed17"; -} - -.ti-screenshot:before { - content: "\f201"; -} - -.ti-scribble:before { - content: "\f0a3"; -} - -.ti-scribble-off:before { - content: "\f427"; -} - -.ti-script:before { - content: "\f2da"; -} - -.ti-script-minus:before { - content: "\f2d7"; -} - -.ti-script-plus:before { - content: "\f2d8"; -} - -.ti-script-x:before { - content: "\f2d9"; -} - -.ti-scuba-mask:before { - content: "\eed4"; -} - -.ti-scuba-mask-off:before { - content: "\f428"; -} - -.ti-sdk:before { - content: "\f3af"; -} - -.ti-search:before { - content: "\eb1c"; -} - -.ti-search-off:before { - content: "\f19c"; -} - -.ti-section:before { - content: "\eed5"; -} - -.ti-section-sign:before { - content: "\f019"; -} - -.ti-seeding:before { - content: "\ed51"; -} - -.ti-seeding-off:before { - content: "\f19d"; -} - -.ti-select:before { - content: "\ec9e"; -} - -.ti-select-all:before { - content: "\f9f7"; -} - -.ti-selector:before { - content: "\eb1d"; -} - -.ti-send:before { - content: "\eb1e"; -} - -.ti-send-off:before { - content: "\f429"; -} - -.ti-seo:before { - content: "\f26b"; -} - -.ti-separator:before { - content: "\ebda"; -} - -.ti-separator-horizontal:before { - content: "\ec79"; -} - -.ti-separator-vertical:before { - content: "\ec7a"; -} - -.ti-server:before { - content: "\eb1f"; -} - -.ti-server-2:before { - content: "\f07c"; -} - -.ti-server-bolt:before { - content: "\f320"; -} - -.ti-server-cog:before { - content: "\f321"; -} - -.ti-server-off:before { - content: "\f19e"; -} - -.ti-servicemark:before { - content: "\ec09"; -} - -.ti-settings:before { - content: "\eb20"; -} - -.ti-settings-2:before { - content: "\f5ac"; -} - -.ti-settings-automation:before { - content: "\eed6"; -} - -.ti-settings-bolt:before { - content: "\f9ad"; -} - -.ti-settings-cancel:before { - content: "\f9ae"; -} - -.ti-settings-check:before { - content: "\f9af"; -} - -.ti-settings-code:before { - content: "\f9b0"; -} - -.ti-settings-cog:before { - content: "\f9b1"; -} - -.ti-settings-dollar:before { - content: "\f9b2"; -} - -.ti-settings-down:before { - content: "\f9b3"; -} - -.ti-settings-exclamation:before { - content: "\f9b4"; -} - -.ti-settings-filled:before { - content: "\f69e"; -} - -.ti-settings-heart:before { - content: "\f9b5"; -} - -.ti-settings-minus:before { - content: "\f9b6"; -} - -.ti-settings-off:before { - content: "\f19f"; -} - -.ti-settings-pause:before { - content: "\f9b7"; -} - -.ti-settings-pin:before { - content: "\f9b8"; -} - -.ti-settings-plus:before { - content: "\f9b9"; -} - -.ti-settings-question:before { - content: "\f9ba"; -} - -.ti-settings-search:before { - content: "\f9bb"; -} - -.ti-settings-share:before { - content: "\f9bc"; -} - -.ti-settings-star:before { - content: "\f9bd"; -} - -.ti-settings-up:before { - content: "\f9be"; -} - -.ti-settings-x:before { - content: "\f9bf"; -} - -.ti-shadow:before { - content: "\eed8"; -} - -.ti-shadow-off:before { - content: "\eed7"; -} - -.ti-shape:before { - content: "\eb9c"; -} - -.ti-shape-2:before { - content: "\eed9"; -} - -.ti-shape-3:before { - content: "\eeda"; -} - -.ti-shape-off:before { - content: "\f1a0"; -} - -.ti-share:before { - content: "\eb21"; -} - -.ti-share-2:before { - content: "\f799"; -} - -.ti-share-3:before { - content: "\f7bd"; -} - -.ti-share-off:before { - content: "\f1a1"; -} - -.ti-shield:before { - content: "\eb24"; -} - -.ti-shield-bolt:before { - content: "\f9c0"; -} - -.ti-shield-cancel:before { - content: "\f9c1"; -} - -.ti-shield-check:before { - content: "\eb22"; -} - -.ti-shield-check-filled:before { - content: "\f761"; -} - -.ti-shield-checkered:before { - content: "\ef9a"; -} - -.ti-shield-checkered-filled:before { - content: "\f762"; -} - -.ti-shield-chevron:before { - content: "\ef9b"; -} - -.ti-shield-code:before { - content: "\f9c2"; -} - -.ti-shield-cog:before { - content: "\f9c3"; -} - -.ti-shield-dollar:before { - content: "\f9c4"; -} - -.ti-shield-down:before { - content: "\f9c5"; -} - -.ti-shield-exclamation:before { - content: "\f9c6"; -} - -.ti-shield-filled:before { - content: "\f69f"; -} - -.ti-shield-half:before { - content: "\f358"; -} - -.ti-shield-half-filled:before { - content: "\f357"; -} - -.ti-shield-heart:before { - content: "\f9c7"; -} - -.ti-shield-lock:before { - content: "\ed58"; -} - -.ti-shield-lock-filled:before { - content: "\f763"; -} - -.ti-shield-minus:before { - content: "\f9c8"; -} - -.ti-shield-off:before { - content: "\ecf8"; -} - -.ti-shield-pause:before { - content: "\f9c9"; -} - -.ti-shield-pin:before { - content: "\f9ca"; -} - -.ti-shield-plus:before { - content: "\f9cb"; -} - -.ti-shield-question:before { - content: "\f9cc"; -} - -.ti-shield-search:before { - content: "\f9cd"; -} - -.ti-shield-share:before { - content: "\f9ce"; -} - -.ti-shield-star:before { - content: "\f9cf"; -} - -.ti-shield-up:before { - content: "\f9d0"; -} - -.ti-shield-x:before { - content: "\eb23"; -} - -.ti-ship:before { - content: "\ec84"; -} - -.ti-ship-off:before { - content: "\f42a"; -} - -.ti-shirt:before { - content: "\ec0a"; -} - -.ti-shirt-filled:before { - content: "\f6a0"; -} - -.ti-shirt-off:before { - content: "\f1a2"; -} - -.ti-shirt-sport:before { - content: "\f26c"; -} - -.ti-shoe:before { - content: "\efd2"; -} - -.ti-shoe-off:before { - content: "\f1a4"; -} - -.ti-shopping-bag:before { - content: "\f5f8"; -} - -.ti-shopping-cart:before { - content: "\eb25"; -} - -.ti-shopping-cart-discount:before { - content: "\eedb"; -} - -.ti-shopping-cart-off:before { - content: "\eedc"; -} - -.ti-shopping-cart-plus:before { - content: "\eedd"; -} - -.ti-shopping-cart-x:before { - content: "\eede"; -} - -.ti-shovel:before { - content: "\f1d9"; -} - -.ti-shredder:before { - content: "\eedf"; -} - -.ti-sign-left:before { - content: "\f06b"; -} - -.ti-sign-left-filled:before { - content: "\f6a1"; -} - -.ti-sign-right:before { - content: "\f06c"; -} - -.ti-sign-right-filled:before { - content: "\f6a2"; -} - -.ti-signal-2g:before { - content: "\f79a"; -} - -.ti-signal-3g:before { - content: "\f1ee"; -} - -.ti-signal-4g:before { - content: "\f1ef"; -} - -.ti-signal-4g-plus:before { - content: "\f259"; -} - -.ti-signal-5g:before { - content: "\f1f0"; -} - -.ti-signal-6g:before { - content: "\f9f8"; -} - -.ti-signal-e:before { - content: "\f9f9"; -} - -.ti-signal-g:before { - content: "\f9fa"; -} - -.ti-signal-h:before { - content: "\f9fc"; -} - -.ti-signal-h-plus:before { - content: "\f9fb"; -} - -.ti-signal-lte:before { - content: "\f9fd"; -} - -.ti-signature:before { - content: "\eee0"; -} - -.ti-signature-off:before { - content: "\f1a5"; -} - -.ti-sitemap:before { - content: "\eb9d"; -} - -.ti-sitemap-off:before { - content: "\f1a6"; -} - -.ti-skateboard:before { - content: "\ecc2"; -} - -.ti-skateboard-off:before { - content: "\f42b"; -} - -.ti-skull:before { - content: "\f292"; -} - -.ti-slash:before { - content: "\f4f9"; -} - -.ti-slashes:before { - content: "\f588"; -} - -.ti-sleigh:before { - content: "\ef9c"; -} - -.ti-slice:before { - content: "\ebdb"; -} - -.ti-slideshow:before { - content: "\ebc9"; -} - -.ti-smart-home:before { - content: "\ecde"; -} - -.ti-smart-home-off:before { - content: "\f1a7"; -} - -.ti-smoking:before { - content: "\ecc4"; -} - -.ti-smoking-no:before { - content: "\ecc3"; -} - -.ti-snowflake:before { - content: "\ec0b"; -} - -.ti-snowflake-off:before { - content: "\f1a8"; -} - -.ti-snowman:before { - content: "\f26d"; -} - -.ti-soccer-field:before { - content: "\ed92"; -} - -.ti-social:before { - content: "\ebec"; -} - -.ti-social-off:before { - content: "\f1a9"; -} - -.ti-sock:before { - content: "\eee1"; -} - -.ti-sofa:before { - content: "\efaf"; -} - -.ti-sofa-off:before { - content: "\f42c"; -} - -.ti-solar-panel:before { - content: "\f7bf"; -} - -.ti-solar-panel-2:before { - content: "\f7be"; -} - -.ti-sort-0-9:before { - content: "\f54d"; -} - -.ti-sort-9-0:before { - content: "\f54e"; -} - -.ti-sort-a-z:before { - content: "\f54f"; -} - -.ti-sort-ascending:before { - content: "\eb26"; -} - -.ti-sort-ascending-2:before { - content: "\eee2"; -} - -.ti-sort-ascending-letters:before { - content: "\ef18"; -} - -.ti-sort-ascending-numbers:before { - content: "\ef19"; -} - -.ti-sort-descending:before { - content: "\eb27"; -} - -.ti-sort-descending-2:before { - content: "\eee3"; -} - -.ti-sort-descending-letters:before { - content: "\ef1a"; -} - -.ti-sort-descending-numbers:before { - content: "\ef1b"; -} - -.ti-sort-z-a:before { - content: "\f550"; -} - -.ti-sos:before { - content: "\f24a"; -} - -.ti-soup:before { - content: "\ef2e"; -} - -.ti-soup-off:before { - content: "\f42d"; -} - -.ti-source-code:before { - content: "\f4a2"; -} - -.ti-space:before { - content: "\ec0c"; -} - -.ti-space-off:before { - content: "\f1aa"; -} - -.ti-spacing-horizontal:before { - content: "\ef54"; -} - -.ti-spacing-vertical:before { - content: "\ef55"; -} - -.ti-spade:before { - content: "\effa"; -} - -.ti-spade-filled:before { - content: "\f6a3"; -} - -.ti-sparkles:before { - content: "\f6d7"; -} - -.ti-speakerphone:before { - content: "\ed61"; -} - -.ti-speedboat:before { - content: "\ed93"; -} - -.ti-spider:before { - content: "\f293"; -} - -.ti-spiral:before { - content: "\f294"; -} - -.ti-spiral-off:before { - content: "\f42e"; -} - -.ti-sport-billard:before { - content: "\eee4"; -} - -.ti-spray:before { - content: "\f50b"; -} - -.ti-spy:before { - content: "\f227"; -} - -.ti-spy-off:before { - content: "\f42f"; -} - -.ti-sql:before { - content: "\f7c0"; -} - -.ti-square:before { - content: "\eb2c"; -} - -.ti-square-0-filled:before { - content: "\f764"; -} - -.ti-square-1-filled:before { - content: "\f765"; -} - -.ti-square-2-filled:before { - content: "\f7fa"; -} - -.ti-square-3-filled:before { - content: "\f766"; -} - -.ti-square-4-filled:before { - content: "\f767"; -} - -.ti-square-5-filled:before { - content: "\f768"; -} - -.ti-square-6-filled:before { - content: "\f769"; -} - -.ti-square-7-filled:before { - content: "\f76a"; -} - -.ti-square-8-filled:before { - content: "\f76b"; -} - -.ti-square-9-filled:before { - content: "\f76c"; -} - -.ti-square-arrow-down:before { - content: "\f4b7"; -} - -.ti-square-arrow-left:before { - content: "\f4b8"; -} - -.ti-square-arrow-right:before { - content: "\f4b9"; -} - -.ti-square-arrow-up:before { - content: "\f4ba"; -} - -.ti-square-asterisk:before { - content: "\f01a"; -} - -.ti-square-check:before { - content: "\eb28"; -} - -.ti-square-check-filled:before { - content: "\f76d"; -} - -.ti-square-chevron-down:before { - content: "\f627"; -} - -.ti-square-chevron-left:before { - content: "\f628"; -} - -.ti-square-chevron-right:before { - content: "\f629"; -} - -.ti-square-chevron-up:before { - content: "\f62a"; -} - -.ti-square-chevrons-down:before { - content: "\f64b"; -} - -.ti-square-chevrons-left:before { - content: "\f64c"; -} - -.ti-square-chevrons-right:before { - content: "\f64d"; -} - -.ti-square-chevrons-up:before { - content: "\f64e"; -} - -.ti-square-dot:before { - content: "\ed59"; -} - -.ti-square-f0:before { - content: "\f526"; -} - -.ti-square-f0-filled:before { - content: "\f76e"; -} - -.ti-square-f1:before { - content: "\f527"; -} - -.ti-square-f1-filled:before { - content: "\f76f"; -} - -.ti-square-f2:before { - content: "\f528"; -} - -.ti-square-f2-filled:before { - content: "\f770"; -} - -.ti-square-f3:before { - content: "\f529"; -} - -.ti-square-f3-filled:before { - content: "\f771"; -} - -.ti-square-f4:before { - content: "\f52a"; -} - -.ti-square-f4-filled:before { - content: "\f772"; -} - -.ti-square-f5:before { - content: "\f52b"; -} - -.ti-square-f5-filled:before { - content: "\f773"; -} - -.ti-square-f6:before { - content: "\f52c"; -} - -.ti-square-f6-filled:before { - content: "\f774"; -} - -.ti-square-f7:before { - content: "\f52d"; -} - -.ti-square-f7-filled:before { - content: "\f775"; -} - -.ti-square-f8:before { - content: "\f52e"; -} - -.ti-square-f8-filled:before { - content: "\f776"; -} - -.ti-square-f9:before { - content: "\f52f"; -} - -.ti-square-f9-filled:before { - content: "\f777"; -} - -.ti-square-forbid:before { - content: "\ed5b"; -} - -.ti-square-forbid-2:before { - content: "\ed5a"; -} - -.ti-square-half:before { - content: "\effb"; -} - -.ti-square-key:before { - content: "\f638"; -} - -.ti-square-letter-a:before { - content: "\f47c"; -} - -.ti-square-letter-b:before { - content: "\f47d"; -} - -.ti-square-letter-c:before { - content: "\f47e"; -} - -.ti-square-letter-d:before { - content: "\f47f"; -} - -.ti-square-letter-e:before { - content: "\f480"; -} - -.ti-square-letter-f:before { - content: "\f481"; -} - -.ti-square-letter-g:before { - content: "\f482"; -} - -.ti-square-letter-h:before { - content: "\f483"; -} - -.ti-square-letter-i:before { - content: "\f484"; -} - -.ti-square-letter-j:before { - content: "\f485"; -} - -.ti-square-letter-k:before { - content: "\f486"; -} - -.ti-square-letter-l:before { - content: "\f487"; -} - -.ti-square-letter-m:before { - content: "\f488"; -} - -.ti-square-letter-n:before { - content: "\f489"; -} - -.ti-square-letter-o:before { - content: "\f48a"; -} - -.ti-square-letter-p:before { - content: "\f48b"; -} - -.ti-square-letter-q:before { - content: "\f48c"; -} - -.ti-square-letter-r:before { - content: "\f48d"; -} - -.ti-square-letter-s:before { - content: "\f48e"; -} - -.ti-square-letter-t:before { - content: "\f48f"; -} - -.ti-square-letter-u:before { - content: "\f490"; -} - -.ti-square-letter-v:before { - content: "\f4bb"; -} - -.ti-square-letter-w:before { - content: "\f491"; -} - -.ti-square-letter-x:before { - content: "\f4bc"; -} - -.ti-square-letter-y:before { - content: "\f492"; -} - -.ti-square-letter-z:before { - content: "\f493"; -} - -.ti-square-minus:before { - content: "\eb29"; -} - -.ti-square-number-0:before { - content: "\eee5"; -} - -.ti-square-number-1:before { - content: "\eee6"; -} - -.ti-square-number-2:before { - content: "\eee7"; -} - -.ti-square-number-3:before { - content: "\eee8"; -} - -.ti-square-number-4:before { - content: "\eee9"; -} - -.ti-square-number-5:before { - content: "\eeea"; -} - -.ti-square-number-6:before { - content: "\eeeb"; -} - -.ti-square-number-7:before { - content: "\eeec"; -} - -.ti-square-number-8:before { - content: "\eeed"; -} - -.ti-square-number-9:before { - content: "\eeee"; -} - -.ti-square-off:before { - content: "\eeef"; -} - -.ti-square-plus:before { - content: "\eb2a"; -} - -.ti-square-root:before { - content: "\eef1"; -} - -.ti-square-root-2:before { - content: "\eef0"; -} - -.ti-square-rotated:before { - content: "\ecdf"; -} - -.ti-square-rotated-filled:before { - content: "\f6a4"; -} - -.ti-square-rotated-forbid:before { - content: "\f01c"; -} - -.ti-square-rotated-forbid-2:before { - content: "\f01b"; -} - -.ti-square-rotated-off:before { - content: "\eef2"; -} - -.ti-square-rounded:before { - content: "\f59a"; -} - -.ti-square-rounded-arrow-down:before { - content: "\f639"; -} - -.ti-square-rounded-arrow-down-filled:before { - content: "\f6db"; -} - -.ti-square-rounded-arrow-left:before { - content: "\f63a"; -} - -.ti-square-rounded-arrow-left-filled:before { - content: "\f6dc"; -} - -.ti-square-rounded-arrow-right:before { - content: "\f63b"; -} - -.ti-square-rounded-arrow-right-filled:before { - content: "\f6dd"; -} - -.ti-square-rounded-arrow-up:before { - content: "\f63c"; -} - -.ti-square-rounded-arrow-up-filled:before { - content: "\f6de"; -} - -.ti-square-rounded-check:before { - content: "\f63d"; -} - -.ti-square-rounded-check-filled:before { - content: "\f6df"; -} - -.ti-square-rounded-chevron-down:before { - content: "\f62b"; -} - -.ti-square-rounded-chevron-down-filled:before { - content: "\f6e0"; -} - -.ti-square-rounded-chevron-left:before { - content: "\f62c"; -} - -.ti-square-rounded-chevron-left-filled:before { - content: "\f6e1"; -} - -.ti-square-rounded-chevron-right:before { - content: "\f62d"; -} - -.ti-square-rounded-chevron-right-filled:before { - content: "\f6e2"; -} - -.ti-square-rounded-chevron-up:before { - content: "\f62e"; -} - -.ti-square-rounded-chevron-up-filled:before { - content: "\f6e3"; -} - -.ti-square-rounded-chevrons-down:before { - content: "\f64f"; -} - -.ti-square-rounded-chevrons-down-filled:before { - content: "\f6e4"; -} - -.ti-square-rounded-chevrons-left:before { - content: "\f650"; -} - -.ti-square-rounded-chevrons-left-filled:before { - content: "\f6e5"; -} - -.ti-square-rounded-chevrons-right:before { - content: "\f651"; -} - -.ti-square-rounded-chevrons-right-filled:before { - content: "\f6e6"; -} - -.ti-square-rounded-chevrons-up:before { - content: "\f652"; -} - -.ti-square-rounded-chevrons-up-filled:before { - content: "\f6e7"; -} - -.ti-square-rounded-filled:before { - content: "\f6a5"; -} - -.ti-square-rounded-letter-a:before { - content: "\f5ae"; -} - -.ti-square-rounded-letter-b:before { - content: "\f5af"; -} - -.ti-square-rounded-letter-c:before { - content: "\f5b0"; -} - -.ti-square-rounded-letter-d:before { - content: "\f5b1"; -} - -.ti-square-rounded-letter-e:before { - content: "\f5b2"; -} - -.ti-square-rounded-letter-f:before { - content: "\f5b3"; -} - -.ti-square-rounded-letter-g:before { - content: "\f5b4"; -} - -.ti-square-rounded-letter-h:before { - content: "\f5b5"; -} - -.ti-square-rounded-letter-i:before { - content: "\f5b6"; -} - -.ti-square-rounded-letter-j:before { - content: "\f5b7"; -} - -.ti-square-rounded-letter-k:before { - content: "\f5b8"; -} - -.ti-square-rounded-letter-l:before { - content: "\f5b9"; -} - -.ti-square-rounded-letter-m:before { - content: "\f5ba"; -} - -.ti-square-rounded-letter-n:before { - content: "\f5bb"; -} - -.ti-square-rounded-letter-o:before { - content: "\f5bc"; -} - -.ti-square-rounded-letter-p:before { - content: "\f5bd"; -} - -.ti-square-rounded-letter-q:before { - content: "\f5be"; -} - -.ti-square-rounded-letter-r:before { - content: "\f5bf"; -} - -.ti-square-rounded-letter-s:before { - content: "\f5c0"; -} - -.ti-square-rounded-letter-t:before { - content: "\f5c1"; -} - -.ti-square-rounded-letter-u:before { - content: "\f5c2"; -} - -.ti-square-rounded-letter-v:before { - content: "\f5c3"; -} - -.ti-square-rounded-letter-w:before { - content: "\f5c4"; -} - -.ti-square-rounded-letter-x:before { - content: "\f5c5"; -} - -.ti-square-rounded-letter-y:before { - content: "\f5c6"; -} - -.ti-square-rounded-letter-z:before { - content: "\f5c7"; -} - -.ti-square-rounded-minus:before { - content: "\f63e"; -} - -.ti-square-rounded-number-0:before { - content: "\f5c8"; -} - -.ti-square-rounded-number-0-filled:before { - content: "\f778"; -} - -.ti-square-rounded-number-1:before { - content: "\f5c9"; -} - -.ti-square-rounded-number-1-filled:before { - content: "\f779"; -} - -.ti-square-rounded-number-2:before { - content: "\f5ca"; -} - -.ti-square-rounded-number-2-filled:before { - content: "\f77a"; -} - -.ti-square-rounded-number-3:before { - content: "\f5cb"; -} - -.ti-square-rounded-number-3-filled:before { - content: "\f77b"; -} - -.ti-square-rounded-number-4:before { - content: "\f5cc"; -} - -.ti-square-rounded-number-4-filled:before { - content: "\f77c"; -} - -.ti-square-rounded-number-5:before { - content: "\f5cd"; -} - -.ti-square-rounded-number-5-filled:before { - content: "\f77d"; -} - -.ti-square-rounded-number-6:before { - content: "\f5ce"; -} - -.ti-square-rounded-number-6-filled:before { - content: "\f77e"; -} - -.ti-square-rounded-number-7:before { - content: "\f5cf"; -} - -.ti-square-rounded-number-7-filled:before { - content: "\f77f"; -} - -.ti-square-rounded-number-8:before { - content: "\f5d0"; -} - -.ti-square-rounded-number-8-filled:before { - content: "\f780"; -} - -.ti-square-rounded-number-9:before { - content: "\f5d1"; -} - -.ti-square-rounded-number-9-filled:before { - content: "\f781"; -} - -.ti-square-rounded-plus:before { - content: "\f63f"; -} - -.ti-square-rounded-plus-filled:before { - content: "\f6e8"; -} - -.ti-square-rounded-x:before { - content: "\f640"; -} - -.ti-square-rounded-x-filled:before { - content: "\f6e9"; -} - -.ti-square-toggle:before { - content: "\eef4"; -} - -.ti-square-toggle-horizontal:before { - content: "\eef3"; -} - -.ti-square-x:before { - content: "\eb2b"; -} - -.ti-squares-diagonal:before { - content: "\eef5"; -} - -.ti-squares-filled:before { - content: "\eef6"; -} - -.ti-stack:before { - content: "\eb2d"; -} - -.ti-stack-2:before { - content: "\eef7"; -} - -.ti-stack-3:before { - content: "\ef9d"; -} - -.ti-stack-pop:before { - content: "\f234"; -} - -.ti-stack-push:before { - content: "\f235"; -} - -.ti-stairs:before { - content: "\eca6"; -} - -.ti-stairs-down:before { - content: "\eca4"; -} - -.ti-stairs-up:before { - content: "\eca5"; -} - -.ti-star:before { - content: "\eb2e"; -} - -.ti-star-filled:before { - content: "\f6a6"; -} - -.ti-star-half:before { - content: "\ed19"; -} - -.ti-star-half-filled:before { - content: "\f6a7"; -} - -.ti-star-off:before { - content: "\ed62"; -} - -.ti-stars:before { - content: "\ed38"; -} - -.ti-stars-filled:before { - content: "\f6a8"; -} - -.ti-stars-off:before { - content: "\f430"; -} - -.ti-status-change:before { - content: "\f3b0"; -} - -.ti-steam:before { - content: "\f24b"; -} - -.ti-steering-wheel:before { - content: "\ec7b"; -} - -.ti-steering-wheel-off:before { - content: "\f431"; -} - -.ti-step-into:before { - content: "\ece0"; -} - -.ti-step-out:before { - content: "\ece1"; -} - -.ti-stereo-glasses:before { - content: "\f4cb"; -} - -.ti-stethoscope:before { - content: "\edbe"; -} - -.ti-stethoscope-off:before { - content: "\f432"; -} - -.ti-sticker:before { - content: "\eb2f"; -} - -.ti-storm:before { - content: "\f24c"; -} - -.ti-storm-off:before { - content: "\f433"; -} - -.ti-stretching:before { - content: "\f2db"; -} - -.ti-strikethrough:before { - content: "\eb9e"; -} - -.ti-submarine:before { - content: "\ed94"; -} - -.ti-subscript:before { - content: "\eb9f"; -} - -.ti-subtask:before { - content: "\ec9f"; -} - -.ti-sum:before { - content: "\eb73"; -} - -.ti-sum-off:before { - content: "\f1ab"; -} - -.ti-sun:before { - content: "\eb30"; -} - -.ti-sun-filled:before { - content: "\f6a9"; -} - -.ti-sun-high:before { - content: "\f236"; -} - -.ti-sun-low:before { - content: "\f237"; -} - -.ti-sun-moon:before { - content: "\f4a3"; -} - -.ti-sun-off:before { - content: "\ed63"; -} - -.ti-sun-wind:before { - content: "\f238"; -} - -.ti-sunglasses:before { - content: "\f239"; -} - -.ti-sunrise:before { - content: "\ef1c"; -} - -.ti-sunset:before { - content: "\ec31"; -} - -.ti-sunset-2:before { - content: "\f23a"; -} - -.ti-superscript:before { - content: "\eba0"; -} - -.ti-svg:before { - content: "\f25a"; -} - -.ti-swimming:before { - content: "\ec92"; -} - -.ti-swipe:before { - content: "\f551"; -} - -.ti-switch:before { - content: "\eb33"; -} - -.ti-switch-2:before { - content: "\edbf"; -} - -.ti-switch-3:before { - content: "\edc0"; -} - -.ti-switch-horizontal:before { - content: "\eb31"; -} - -.ti-switch-vertical:before { - content: "\eb32"; -} - -.ti-sword:before { - content: "\f030"; -} - -.ti-sword-off:before { - content: "\f434"; -} - -.ti-swords:before { - content: "\f132"; -} - -.ti-table:before { - content: "\eba1"; -} - -.ti-table-alias:before { - content: "\f25b"; -} - -.ti-table-export:before { - content: "\eef8"; -} - -.ti-table-filled:before { - content: "\f782"; -} - -.ti-table-import:before { - content: "\eef9"; -} - -.ti-table-off:before { - content: "\eefa"; -} - -.ti-table-options:before { - content: "\f25c"; -} - -.ti-table-shortcut:before { - content: "\f25d"; -} - -.ti-tag:before { - content: "\eb34"; -} - -.ti-tag-off:before { - content: "\efc0"; -} - -.ti-tags:before { - content: "\ef86"; -} - -.ti-tags-off:before { - content: "\efc1"; -} - -.ti-tallymark-1:before { - content: "\ec46"; -} - -.ti-tallymark-2:before { - content: "\ec47"; -} - -.ti-tallymark-3:before { - content: "\ec48"; -} - -.ti-tallymark-4:before { - content: "\ec49"; -} - -.ti-tallymarks:before { - content: "\ec4a"; -} - -.ti-tank:before { - content: "\ed95"; -} - -.ti-target:before { - content: "\eb35"; -} - -.ti-target-arrow:before { - content: "\f51a"; -} - -.ti-target-off:before { - content: "\f1ad"; -} - -.ti-teapot:before { - content: "\f552"; -} - -.ti-telescope:before { - content: "\f07d"; -} - -.ti-telescope-off:before { - content: "\f1ae"; -} - -.ti-temperature:before { - content: "\eb38"; -} - -.ti-temperature-celsius:before { - content: "\eb36"; -} - -.ti-temperature-fahrenheit:before { - content: "\eb37"; -} - -.ti-temperature-minus:before { - content: "\ebed"; -} - -.ti-temperature-off:before { - content: "\f1af"; -} - -.ti-temperature-plus:before { - content: "\ebee"; -} - -.ti-template:before { - content: "\eb39"; -} - -.ti-template-off:before { - content: "\f1b0"; -} - -.ti-tent:before { - content: "\eefb"; -} - -.ti-tent-off:before { - content: "\f435"; -} - -.ti-terminal:before { - content: "\ebdc"; -} - -.ti-terminal-2:before { - content: "\ebef"; -} - -.ti-test-pipe:before { - content: "\eb3a"; -} - -.ti-test-pipe-2:before { - content: "\f0a4"; -} - -.ti-test-pipe-off:before { - content: "\f1b1"; -} - -.ti-tex:before { - content: "\f4e0"; -} - -.ti-text-caption:before { - content: "\f4a4"; -} - -.ti-text-color:before { - content: "\f2dc"; -} - -.ti-text-decrease:before { - content: "\f202"; -} - -.ti-text-direction-ltr:before { - content: "\eefc"; -} - -.ti-text-direction-rtl:before { - content: "\eefd"; -} - -.ti-text-increase:before { - content: "\f203"; -} - -.ti-text-orientation:before { - content: "\f2a4"; -} - -.ti-text-plus:before { - content: "\f2a5"; -} - -.ti-text-recognition:before { - content: "\f204"; -} - -.ti-text-resize:before { - content: "\ef87"; -} - -.ti-text-size:before { - content: "\f2b1"; -} - -.ti-text-spellcheck:before { - content: "\f2a6"; -} - -.ti-text-wrap:before { - content: "\ebdd"; -} - -.ti-text-wrap-disabled:before { - content: "\eca7"; -} - -.ti-texture:before { - content: "\f51b"; -} - -.ti-theater:before { - content: "\f79b"; -} - -.ti-thermometer:before { - content: "\ef67"; -} - -.ti-thumb-down:before { - content: "\eb3b"; -} - -.ti-thumb-down-filled:before { - content: "\f6aa"; -} - -.ti-thumb-down-off:before { - content: "\f436"; -} - -.ti-thumb-up:before { - content: "\eb3c"; -} - -.ti-thumb-up-filled:before { - content: "\f6ab"; -} - -.ti-thumb-up-off:before { - content: "\f437"; -} - -.ti-tic-tac:before { - content: "\f51c"; -} - -.ti-ticket:before { - content: "\eb3d"; -} - -.ti-ticket-off:before { - content: "\f1b2"; -} - -.ti-tie:before { - content: "\f07e"; -} - -.ti-tilde:before { - content: "\f4a5"; -} - -.ti-tilt-shift:before { - content: "\eefe"; -} - -.ti-tilt-shift-off:before { - content: "\f1b3"; -} - -.ti-timeline:before { - content: "\f031"; -} - -.ti-timeline-event:before { - content: "\f553"; -} - -.ti-timeline-event-exclamation:before { - content: "\f662"; -} - -.ti-timeline-event-minus:before { - content: "\f663"; -} - -.ti-timeline-event-plus:before { - content: "\f664"; -} - -.ti-timeline-event-text:before { - content: "\f665"; -} - -.ti-timeline-event-x:before { - content: "\f666"; -} - -.ti-tir:before { - content: "\ebf0"; -} - -.ti-toggle-left:before { - content: "\eb3e"; -} - -.ti-toggle-right:before { - content: "\eb3f"; -} - -.ti-toilet-paper:before { - content: "\efd3"; -} - -.ti-toilet-paper-off:before { - content: "\f1b4"; -} - -.ti-tool:before { - content: "\eb40"; -} - -.ti-tools:before { - content: "\ebca"; -} - -.ti-tools-kitchen:before { - content: "\ed64"; -} - -.ti-tools-kitchen-2:before { - content: "\eeff"; -} - -.ti-tools-kitchen-2-off:before { - content: "\f1b5"; -} - -.ti-tools-kitchen-off:before { - content: "\f1b6"; -} - -.ti-tools-off:before { - content: "\f1b7"; -} - -.ti-tooltip:before { - content: "\f2dd"; -} - -.ti-topology-bus:before { - content: "\f5d9"; -} - -.ti-topology-complex:before { - content: "\f5da"; -} - -.ti-topology-full:before { - content: "\f5dc"; -} - -.ti-topology-full-hierarchy:before { - content: "\f5db"; -} - -.ti-topology-ring:before { - content: "\f5df"; -} - -.ti-topology-ring-2:before { - content: "\f5dd"; -} - -.ti-topology-ring-3:before { - content: "\f5de"; -} - -.ti-topology-star:before { - content: "\f5e5"; -} - -.ti-topology-star-2:before { - content: "\f5e0"; -} - -.ti-topology-star-3:before { - content: "\f5e1"; -} - -.ti-topology-star-ring:before { - content: "\f5e4"; -} - -.ti-topology-star-ring-2:before { - content: "\f5e2"; -} - -.ti-topology-star-ring-3:before { - content: "\f5e3"; -} - -.ti-torii:before { - content: "\f59b"; -} - -.ti-tornado:before { - content: "\ece2"; -} - -.ti-tournament:before { - content: "\ecd0"; -} - -.ti-tower:before { - content: "\f2cb"; -} - -.ti-tower-off:before { - content: "\f2ca"; -} - -.ti-track:before { - content: "\ef00"; -} - -.ti-tractor:before { - content: "\ec0d"; -} - -.ti-trademark:before { - content: "\ec0e"; -} - -.ti-traffic-cone:before { - content: "\ec0f"; -} - -.ti-traffic-cone-off:before { - content: "\f1b8"; -} - -.ti-traffic-lights:before { - content: "\ed39"; -} - -.ti-traffic-lights-off:before { - content: "\f1b9"; -} - -.ti-train:before { - content: "\ed96"; -} - -.ti-transfer-in:before { - content: "\ef2f"; -} - -.ti-transfer-out:before { - content: "\ef30"; -} - -.ti-transform:before { - content: "\f38e"; -} - -.ti-transform-filled:before { - content: "\f6ac"; -} - -.ti-transition-bottom:before { - content: "\f2b2"; -} - -.ti-transition-left:before { - content: "\f2b3"; -} - -.ti-transition-right:before { - content: "\f2b4"; -} - -.ti-transition-top:before { - content: "\f2b5"; -} - -.ti-trash:before { - content: "\eb41"; -} - -.ti-trash-filled:before { - content: "\f783"; -} - -.ti-trash-off:before { - content: "\ed65"; -} - -.ti-trash-x:before { - content: "\ef88"; -} - -.ti-trash-x-filled:before { - content: "\f784"; -} - -.ti-tree:before { - content: "\ef01"; -} - -.ti-trees:before { - content: "\ec10"; -} - -.ti-trekking:before { - content: "\f5ad"; -} - -.ti-trending-down:before { - content: "\eb42"; -} - -.ti-trending-down-2:before { - content: "\edc1"; -} - -.ti-trending-down-3:before { - content: "\edc2"; -} - -.ti-trending-up:before { - content: "\eb43"; -} - -.ti-trending-up-2:before { - content: "\edc3"; -} - -.ti-trending-up-3:before { - content: "\edc4"; -} - -.ti-triangle:before { - content: "\eb44"; -} - -.ti-triangle-filled:before { - content: "\f6ad"; -} - -.ti-triangle-inverted:before { - content: "\f01d"; -} - -.ti-triangle-inverted-filled:before { - content: "\f6ae"; -} - -.ti-triangle-off:before { - content: "\ef02"; -} - -.ti-triangle-square-circle:before { - content: "\ece8"; -} - -.ti-triangles:before { - content: "\f0a5"; -} - -.ti-trident:before { - content: "\ecc5"; -} - -.ti-trolley:before { - content: "\f4cc"; -} - -.ti-trophy:before { - content: "\eb45"; -} - -.ti-trophy-filled:before { - content: "\f6af"; -} - -.ti-trophy-off:before { - content: "\f438"; -} - -.ti-trowel:before { - content: "\f368"; -} - -.ti-truck:before { - content: "\ebc4"; -} - -.ti-truck-delivery:before { - content: "\ec4b"; -} - -.ti-truck-loading:before { - content: "\f1da"; -} - -.ti-truck-off:before { - content: "\ef03"; -} - -.ti-truck-return:before { - content: "\ec4c"; -} - -.ti-txt:before { - content: "\f3b1"; -} - -.ti-typography:before { - content: "\ebc5"; -} - -.ti-typography-off:before { - content: "\f1ba"; -} - -.ti-ufo:before { - content: "\f26f"; -} - -.ti-ufo-off:before { - content: "\f26e"; -} - -.ti-umbrella:before { - content: "\ebf1"; -} - -.ti-umbrella-filled:before { - content: "\f6b0"; -} - -.ti-umbrella-off:before { - content: "\f1bb"; -} - -.ti-underline:before { - content: "\eba2"; -} - -.ti-unlink:before { - content: "\eb46"; -} - -.ti-upload:before { - content: "\eb47"; -} - -.ti-urgent:before { - content: "\eb48"; -} - -.ti-usb:before { - content: "\f00c"; -} - -.ti-user:before { - content: "\eb4d"; -} - -.ti-user-bolt:before { - content: "\f9d1"; -} - -.ti-user-cancel:before { - content: "\f9d2"; -} - -.ti-user-check:before { - content: "\eb49"; -} - -.ti-user-circle:before { - content: "\ef68"; -} - -.ti-user-code:before { - content: "\f9d3"; -} - -.ti-user-cog:before { - content: "\f9d4"; -} - -.ti-user-dollar:before { - content: "\f9d5"; -} - -.ti-user-down:before { - content: "\f9d6"; -} - -.ti-user-edit:before { - content: "\f7cc"; -} - -.ti-user-exclamation:before { - content: "\ec12"; -} - -.ti-user-heart:before { - content: "\f7cd"; -} - -.ti-user-minus:before { - content: "\eb4a"; -} - -.ti-user-off:before { - content: "\ecf9"; -} - -.ti-user-pause:before { - content: "\f9d7"; -} - -.ti-user-pin:before { - content: "\f7ce"; -} - -.ti-user-plus:before { - content: "\eb4b"; -} - -.ti-user-question:before { - content: "\f7cf"; -} - -.ti-user-search:before { - content: "\ef89"; -} - -.ti-user-share:before { - content: "\f9d8"; -} - -.ti-user-shield:before { - content: "\f7d0"; -} - -.ti-user-star:before { - content: "\f7d1"; -} - -.ti-user-up:before { - content: "\f7d2"; -} - -.ti-user-x:before { - content: "\eb4c"; -} - -.ti-users:before { - content: "\ebf2"; -} - -.ti-uv-index:before { - content: "\f3b2"; -} - -.ti-ux-circle:before { - content: "\f369"; -} - -.ti-vaccine:before { - content: "\ef04"; -} - -.ti-vaccine-bottle:before { - content: "\ef69"; -} - -.ti-vaccine-bottle-off:before { - content: "\f439"; -} - -.ti-vaccine-off:before { - content: "\f1bc"; -} - -.ti-vacuum-cleaner:before { - content: "\f5e6"; -} - -.ti-variable:before { - content: "\ef05"; -} - -.ti-variable-minus:before { - content: "\f36a"; -} - -.ti-variable-off:before { - content: "\f1bd"; -} - -.ti-variable-plus:before { - content: "\f36b"; -} - -.ti-vector:before { - content: "\eca9"; -} - -.ti-vector-bezier:before { - content: "\ef1d"; -} - -.ti-vector-bezier-2:before { - content: "\f1a3"; -} - -.ti-vector-bezier-arc:before { - content: "\f4cd"; -} - -.ti-vector-bezier-circle:before { - content: "\f4ce"; -} - -.ti-vector-off:before { - content: "\f1be"; -} - -.ti-vector-spline:before { - content: "\f565"; -} - -.ti-vector-triangle:before { - content: "\eca8"; -} - -.ti-vector-triangle-off:before { - content: "\f1bf"; -} - -.ti-venus:before { - content: "\ec86"; -} - -.ti-versions:before { - content: "\ed52"; -} - -.ti-versions-filled:before { - content: "\f6b1"; -} - -.ti-versions-off:before { - content: "\f1c0"; -} - -.ti-video:before { - content: "\ed22"; -} - -.ti-video-minus:before { - content: "\ed1f"; -} - -.ti-video-off:before { - content: "\ed20"; -} - -.ti-video-plus:before { - content: "\ed21"; -} - -.ti-view-360:before { - content: "\ed84"; -} - -.ti-view-360-off:before { - content: "\f1c1"; -} - -.ti-viewfinder:before { - content: "\eb4e"; -} - -.ti-viewfinder-off:before { - content: "\f1c2"; -} - -.ti-viewport-narrow:before { - content: "\ebf3"; -} - -.ti-viewport-wide:before { - content: "\ebf4"; -} - -.ti-vinyl:before { - content: "\f00d"; -} - -.ti-vip:before { - content: "\f3b3"; -} - -.ti-vip-off:before { - content: "\f43a"; -} - -.ti-virus:before { - content: "\eb74"; -} - -.ti-virus-off:before { - content: "\ed66"; -} - -.ti-virus-search:before { - content: "\ed67"; -} - -.ti-vocabulary:before { - content: "\ef1e"; -} - -.ti-vocabulary-off:before { - content: "\f43b"; -} - -.ti-volcano:before { - content: "\f79c"; -} - -.ti-volume:before { - content: "\eb51"; -} - -.ti-volume-2:before { - content: "\eb4f"; -} - -.ti-volume-3:before { - content: "\eb50"; -} - -.ti-volume-off:before { - content: "\f1c3"; -} - -.ti-walk:before { - content: "\ec87"; -} - -.ti-wall:before { - content: "\ef7a"; -} - -.ti-wall-off:before { - content: "\f43c"; -} - -.ti-wallet:before { - content: "\eb75"; -} - -.ti-wallet-off:before { - content: "\f1c4"; -} - -.ti-wallpaper:before { - content: "\ef56"; -} - -.ti-wallpaper-off:before { - content: "\f1c5"; -} - -.ti-wand:before { - content: "\ebcb"; -} - -.ti-wand-off:before { - content: "\f1c6"; -} - -.ti-wash:before { - content: "\f311"; -} - -.ti-wash-dry:before { - content: "\f304"; -} - -.ti-wash-dry-1:before { - content: "\f2fa"; -} - -.ti-wash-dry-2:before { - content: "\f2fb"; -} - -.ti-wash-dry-3:before { - content: "\f2fc"; -} - -.ti-wash-dry-a:before { - content: "\f2fd"; -} - -.ti-wash-dry-dip:before { - content: "\f2fe"; -} - -.ti-wash-dry-f:before { - content: "\f2ff"; -} - -.ti-wash-dry-hang:before { - content: "\f300"; -} - -.ti-wash-dry-off:before { - content: "\f301"; -} - -.ti-wash-dry-p:before { - content: "\f302"; -} - -.ti-wash-dry-shade:before { - content: "\f303"; -} - -.ti-wash-dry-w:before { - content: "\f322"; -} - -.ti-wash-dryclean:before { - content: "\f305"; -} - -.ti-wash-dryclean-off:before { - content: "\f323"; -} - -.ti-wash-gentle:before { - content: "\f306"; -} - -.ti-wash-machine:before { - content: "\f25e"; -} - -.ti-wash-off:before { - content: "\f307"; -} - -.ti-wash-press:before { - content: "\f308"; -} - -.ti-wash-temperature-1:before { - content: "\f309"; -} - -.ti-wash-temperature-2:before { - content: "\f30a"; -} - -.ti-wash-temperature-3:before { - content: "\f30b"; -} - -.ti-wash-temperature-4:before { - content: "\f30c"; -} - -.ti-wash-temperature-5:before { - content: "\f30d"; -} - -.ti-wash-temperature-6:before { - content: "\f30e"; -} - -.ti-wash-tumble-dry:before { - content: "\f30f"; -} - -.ti-wash-tumble-off:before { - content: "\f310"; -} - -.ti-wave-saw-tool:before { - content: "\ecd3"; -} - -.ti-wave-sine:before { - content: "\ecd4"; -} - -.ti-wave-square:before { - content: "\ecd5"; -} - -.ti-webhook:before { - content: "\f01e"; -} - -.ti-webhook-off:before { - content: "\f43d"; -} - -.ti-weight:before { - content: "\f589"; -} - -.ti-wheelchair:before { - content: "\f1db"; -} - -.ti-wheelchair-off:before { - content: "\f43e"; -} - -.ti-whirl:before { - content: "\f51d"; -} - -.ti-wifi:before { - content: "\eb52"; -} - -.ti-wifi-0:before { - content: "\eba3"; -} - -.ti-wifi-1:before { - content: "\eba4"; -} - -.ti-wifi-2:before { - content: "\eba5"; -} - -.ti-wifi-off:before { - content: "\ecfa"; -} - -.ti-wind:before { - content: "\ec34"; -} - -.ti-wind-off:before { - content: "\f1c7"; -} - -.ti-windmill:before { - content: "\ed85"; -} - -.ti-windmill-filled:before { - content: "\f6b2"; -} - -.ti-windmill-off:before { - content: "\f1c8"; -} - -.ti-window:before { - content: "\ef06"; -} - -.ti-window-maximize:before { - content: "\f1f1"; -} - -.ti-window-minimize:before { - content: "\f1f2"; -} - -.ti-window-off:before { - content: "\f1c9"; -} - -.ti-windsock:before { - content: "\f06d"; -} - -.ti-wiper:before { - content: "\ecab"; -} - -.ti-wiper-wash:before { - content: "\ecaa"; -} - -.ti-woman:before { - content: "\eb53"; -} - -.ti-wood:before { - content: "\f359"; -} - -.ti-world:before { - content: "\eb54"; -} - -.ti-world-bolt:before { - content: "\f9d9"; -} - -.ti-world-cancel:before { - content: "\f9da"; -} - -.ti-world-check:before { - content: "\f9db"; -} - -.ti-world-code:before { - content: "\f9dc"; -} - -.ti-world-cog:before { - content: "\f9dd"; -} - -.ti-world-dollar:before { - content: "\f9de"; -} - -.ti-world-down:before { - content: "\f9df"; -} - -.ti-world-download:before { - content: "\ef8a"; -} - -.ti-world-exclamation:before { - content: "\f9e0"; -} - -.ti-world-heart:before { - content: "\f9e1"; -} - -.ti-world-latitude:before { - content: "\ed2e"; -} - -.ti-world-longitude:before { - content: "\ed2f"; -} - -.ti-world-minus:before { - content: "\f9e2"; -} - -.ti-world-off:before { - content: "\f1ca"; -} - -.ti-world-pause:before { - content: "\f9e3"; -} - -.ti-world-pin:before { - content: "\f9e4"; -} - -.ti-world-plus:before { - content: "\f9e5"; -} - -.ti-world-question:before { - content: "\f9e6"; -} - -.ti-world-search:before { - content: "\f9e7"; -} - -.ti-world-share:before { - content: "\f9e8"; -} - -.ti-world-star:before { - content: "\f9e9"; -} - -.ti-world-up:before { - content: "\f9ea"; -} - -.ti-world-upload:before { - content: "\ef8b"; -} - -.ti-world-www:before { - content: "\f38f"; -} - -.ti-world-x:before { - content: "\f9eb"; -} - -.ti-wrecking-ball:before { - content: "\ed97"; -} - -.ti-writing:before { - content: "\ef08"; -} - -.ti-writing-off:before { - content: "\f1cb"; -} - -.ti-writing-sign:before { - content: "\ef07"; -} - -.ti-writing-sign-off:before { - content: "\f1cc"; -} - -.ti-x:before { - content: "\eb55"; -} - -.ti-xbox-a:before { - content: "\f2b6"; -} - -.ti-xbox-b:before { - content: "\f2b7"; -} - -.ti-xbox-x:before { - content: "\f2b8"; -} - -.ti-xbox-y:before { - content: "\f2b9"; -} - -.ti-yin-yang:before { - content: "\ec35"; -} - -.ti-yin-yang-filled:before { - content: "\f785"; -} - -.ti-yoga:before { - content: "\f01f"; -} - -.ti-zeppelin:before { - content: "\f270"; -} - -.ti-zeppelin-off:before { - content: "\f43f"; -} - -.ti-zip:before { - content: "\f3b4"; -} - -.ti-zodiac-aquarius:before { - content: "\ecac"; -} - -.ti-zodiac-aries:before { - content: "\ecad"; -} - -.ti-zodiac-cancer:before { - content: "\ecae"; -} - -.ti-zodiac-capricorn:before { - content: "\ecaf"; -} - -.ti-zodiac-gemini:before { - content: "\ecb0"; -} - -.ti-zodiac-leo:before { - content: "\ecb1"; -} - -.ti-zodiac-libra:before { - content: "\ecb2"; -} - -.ti-zodiac-pisces:before { - content: "\ecb3"; -} - -.ti-zodiac-sagittarius:before { - content: "\ecb4"; -} - -.ti-zodiac-scorpio:before { - content: "\ecb5"; -} - -.ti-zodiac-taurus:before { - content: "\ecb6"; -} - -.ti-zodiac-virgo:before { - content: "\ecb7"; -} - -.ti-zoom-cancel:before { - content: "\ec4d"; -} - -.ti-zoom-check:before { - content: "\ef09"; -} - -.ti-zoom-check-filled:before { - content: "\f786"; -} - -.ti-zoom-code:before { - content: "\f07f"; -} - -.ti-zoom-exclamation:before { - content: "\f080"; -} - -.ti-zoom-filled:before { - content: "\f787"; -} - -.ti-zoom-in:before { - content: "\eb56"; -} - -.ti-zoom-in-area:before { - content: "\f1dc"; -} - -.ti-zoom-in-area-filled:before { - content: "\f788"; -} - -.ti-zoom-in-filled:before { - content: "\f789"; -} - -.ti-zoom-money:before { - content: "\ef0a"; -} - -.ti-zoom-out:before { - content: "\eb57"; -} - -.ti-zoom-out-area:before { - content: "\f1dd"; -} - -.ti-zoom-out-filled:before { - content: "\f78a"; -} - -.ti-zoom-pan:before { - content: "\f1de"; -} - -.ti-zoom-question:before { - content: "\edeb"; -} - -.ti-zoom-replace:before { - content: "\f2a7"; -} - -.ti-zoom-reset:before { - content: "\f295"; -} - -.ti-zzz:before { - content: "\f228"; -} - -.ti-zzz-off:before { - content: "\f440"; -} - -/*# sourceMappingURL=tabler-icons.css.map */ diff --git a/playground/fonts/tabler-icons/tabler-icons.html b/playground/fonts/tabler-icons/tabler-icons.html deleted file mode 100644 index e704d6099fea0b..00000000000000 --- a/playground/fonts/tabler-icons/tabler-icons.html +++ /dev/null @@ -1,36390 +0,0 @@ - - - - - - - Tabler Icons - version 2.11.0 - - - - - - - - - -
-
-

- Tabler Icons -

-

version 2.11.0

-
- - - -
-
- -
- - 123 -
- ti ti-123
- \f554 -
-
- -
- - 24-hours -
- ti ti-24-hours
- \f5e7 -
-
- -
- - 2fa -
- ti ti-2fa
- \eca0 -
-
- -
- - 360 -
- ti ti-360
- \f62f -
-
- -
- - 360-view -
- ti ti-360-view
- \f566 -
-
- -
- - 3d-cube-sphere -
- ti ti-3d-cube-sphere
- \ecd7 -
-
- -
- - 3d-cube-sphere-off -
- ti ti-3d-cube-sphere-off
- \f3b5 -
-
- -
- - 3d-rotate -
- ti ti-3d-rotate
- \f020 -
-
- -
- - a-b -
- ti ti-a-b
- \ec36 -
-
- -
- - a-b-2 -
- ti ti-a-b-2
- \f25f -
-
- -
- - a-b-off -
- ti ti-a-b-off
- \f0a6 -
-
- -
- - abacus -
- ti ti-abacus
- \f05c -
-
- -
- - abacus-off -
- ti ti-abacus-off
- \f3b6 -
-
- -
- - abc -
- ti ti-abc
- \f567 -
-
- -
- - access-point -
- ti ti-access-point
- \ed1b -
-
- -
- - access-point-off -
- ti ti-access-point-off
- \ed1a -
-
- -
- - accessible -
- ti ti-accessible
- \eba9 -
-
- -
- - accessible-off -
- ti ti-accessible-off
- \f0a7 -
-
- -
- - accessible-off-filled -
- ti ti-accessible-off-filled
- \f6ea -
-
- -
- - activity -
- ti ti-activity
- \ed23 -
-
- -
- - activity-heartbeat -
- ti ti-activity-heartbeat
- \f0db -
-
- -
- - ad -
- ti ti-ad
- \ea02 -
-
- -
- - ad-2 -
- ti ti-ad-2
- \ef1f -
-
- -
- - ad-circle -
- ti ti-ad-circle
- \f79e -
-
- -
- - ad-circle-filled -
- ti ti-ad-circle-filled
- \f7d3 -
-
- -
- - ad-circle-off -
- ti ti-ad-circle-off
- \f79d -
-
- -
- - ad-filled -
- ti ti-ad-filled
- \f6eb -
-
- -
- - ad-off -
- ti ti-ad-off
- \f3b7 -
-
- -
- - address-book -
- ti ti-address-book
- \f021 -
-
- -
- - address-book-off -
- ti ti-address-book-off
- \f3b8 -
-
- -
- - adjustments -
- ti ti-adjustments
- \ea03 -
-
- -
- - adjustments-alt -
- ti ti-adjustments-alt
- \ec37 -
-
- -
- - adjustments-bolt -
- ti ti-adjustments-bolt
- \f7fb -
-
- -
- - adjustments-cancel -
- ti ti-adjustments-cancel
- \f7fc -
-
- -
- - adjustments-check -
- ti ti-adjustments-check
- \f7fd -
-
- -
- - adjustments-code -
- ti ti-adjustments-code
- \f7fe -
-
- -
- - adjustments-cog -
- ti ti-adjustments-cog
- \f7ff -
-
- -
- - adjustments-dollar -
- ti ti-adjustments-dollar
- \f800 -
-
- -
- - adjustments-down -
- ti ti-adjustments-down
- \f801 -
-
- -
- - adjustments-exclamation -
- ti ti-adjustments-exclamation
- \f802 -
-
- -
- - adjustments-filled -
- ti ti-adjustments-filled
- \f6ec -
-
- -
- - adjustments-heart -
- ti ti-adjustments-heart
- \f803 -
-
- -
- - adjustments-horizontal -
- ti ti-adjustments-horizontal
- \ec38 -
-
- -
- - adjustments-minus -
- ti ti-adjustments-minus
- \f804 -
-
- -
- - adjustments-off -
- ti ti-adjustments-off
- \f0a8 -
-
- -
- - adjustments-pause -
- ti ti-adjustments-pause
- \f805 -
-
- -
- - adjustments-pin -
- ti ti-adjustments-pin
- \f806 -
-
- -
- - adjustments-plus -
- ti ti-adjustments-plus
- \f807 -
-
- -
- - adjustments-question -
- ti ti-adjustments-question
- \f808 -
-
- -
- - adjustments-search -
- ti ti-adjustments-search
- \f809 -
-
- -
- - adjustments-share -
- ti ti-adjustments-share
- \f80a -
-
- -
- - adjustments-star -
- ti ti-adjustments-star
- \f80b -
-
- -
- - adjustments-up -
- ti ti-adjustments-up
- \f80c -
-
- -
- - adjustments-x -
- ti ti-adjustments-x
- \f80d -
-
- -
- - aerial-lift -
- ti ti-aerial-lift
- \edfe -
-
- -
- - affiliate -
- ti ti-affiliate
- \edff -
-
- -
- - affiliate-filled -
- ti ti-affiliate-filled
- \f6ed -
-
- -
- - air-balloon -
- ti ti-air-balloon
- \f4a6 -
-
- -
- - air-conditioning -
- ti ti-air-conditioning
- \f3a2 -
-
- -
- - air-conditioning-disabled -
- ti ti-air-conditioning-disabled
- \f542 -
-
- -
- - alarm -
- ti ti-alarm
- \ea04 -
-
- -
- - alarm-filled -
- ti ti-alarm-filled
- \f709 -
-
- -
- - alarm-minus -
- ti ti-alarm-minus
- \f630 -
-
- -
- - alarm-minus-filled -
- ti ti-alarm-minus-filled
- \f70a -
-
- -
- - alarm-off -
- ti ti-alarm-off
- \f0a9 -
-
- -
- - alarm-plus -
- ti ti-alarm-plus
- \f631 -
-
- -
- - alarm-plus-filled -
- ti ti-alarm-plus-filled
- \f70b -
-
- -
- - alarm-snooze -
- ti ti-alarm-snooze
- \f632 -
-
- -
- - alarm-snooze-filled -
- ti ti-alarm-snooze-filled
- \f70c -
-
- -
- - album -
- ti ti-album
- \f022 -
-
- -
- - album-off -
- ti ti-album-off
- \f3b9 -
-
- -
- - alert-circle -
- ti ti-alert-circle
- \ea05 -
-
- -
- - alert-circle-filled -
- ti ti-alert-circle-filled
- \f6ee -
-
- -
- - alert-hexagon -
- ti ti-alert-hexagon
- \f80e -
-
- -
- - alert-octagon -
- ti ti-alert-octagon
- \ecc6 -
-
- -
- - alert-octagon-filled -
- ti ti-alert-octagon-filled
- \f6ef -
-
- -
- - alert-small -
- ti ti-alert-small
- \f80f -
-
- -
- - alert-square -
- ti ti-alert-square
- \f811 -
-
- -
- - alert-square-rounded -
- ti ti-alert-square-rounded
- \f810 -
-
- -
- - alert-triangle -
- ti ti-alert-triangle
- \ea06 -
-
- -
- - alert-triangle-filled -
- ti ti-alert-triangle-filled
- \f6f0 -
-
- -
- - alien -
- ti ti-alien
- \ebde -
-
- -
- - alien-filled -
- ti ti-alien-filled
- \f70d -
-
- -
- - align-box-bottom-center -
- ti ti-align-box-bottom-center
- \f530 -
-
- -
- - align-box-bottom-center-filled -
- ti ti-align-box-bottom-center-filled
- \f70e -
-
- -
- - align-box-bottom-left -
- ti ti-align-box-bottom-left
- \f531 -
-
- -
- - align-box-bottom-left-filled -
- ti ti-align-box-bottom-left-filled
- \f70f -
-
- -
- - align-box-bottom-right -
- ti ti-align-box-bottom-right
- \f532 -
-
- -
- - align-box-bottom-right-filled -
- ti ti-align-box-bottom-right-filled
- \f710 -
-
- -
- - align-box-center-middle -
- ti ti-align-box-center-middle
- \f79f -
-
- -
- - align-box-center-middle-filled -
- ti ti-align-box-center-middle-filled
- \f7d4 -
-
- -
- - align-box-left-bottom -
- ti ti-align-box-left-bottom
- \f533 -
-
- -
- - align-box-left-bottom-filled -
- ti ti-align-box-left-bottom-filled
- \f711 -
-
- -
- - align-box-left-middle -
- ti ti-align-box-left-middle
- \f534 -
-
- -
- - align-box-left-middle-filled -
- ti ti-align-box-left-middle-filled
- \f712 -
-
- -
- - align-box-left-top -
- ti ti-align-box-left-top
- \f535 -
-
- -
- - align-box-left-top-filled -
- ti ti-align-box-left-top-filled
- \f713 -
-
- -
- - align-box-right-bottom -
- ti ti-align-box-right-bottom
- \f536 -
-
- -
- - align-box-right-bottom-filled -
- ti ti-align-box-right-bottom-filled
- \f714 -
-
- -
- - align-box-right-middle -
- ti ti-align-box-right-middle
- \f537 -
-
- -
- - align-box-right-middle-filled -
- ti ti-align-box-right-middle-filled
- \f7d5 -
-
- -
- - align-box-right-top -
- ti ti-align-box-right-top
- \f538 -
-
- -
- - align-box-right-top-filled -
- ti ti-align-box-right-top-filled
- \f715 -
-
- -
- - align-box-top-center -
- ti ti-align-box-top-center
- \f539 -
-
- -
- - align-box-top-center-filled -
- ti ti-align-box-top-center-filled
- \f716 -
-
- -
- - align-box-top-left -
- ti ti-align-box-top-left
- \f53a -
-
- -
- - align-box-top-left-filled -
- ti ti-align-box-top-left-filled
- \f717 -
-
- -
- - align-box-top-right -
- ti ti-align-box-top-right
- \f53b -
-
- -
- - align-box-top-right-filled -
- ti ti-align-box-top-right-filled
- \f718 -
-
- -
- - align-center -
- ti ti-align-center
- \ea07 -
-
- -
- - align-justified -
- ti ti-align-justified
- \ea08 -
-
- -
- - align-left -
- ti ti-align-left
- \ea09 -
-
- -
- - align-right -
- ti ti-align-right
- \ea0a -
-
- -
- - alpha -
- ti ti-alpha
- \f543 -
-
- -
- - alphabet-cyrillic -
- ti ti-alphabet-cyrillic
- \f1df -
-
- -
- - alphabet-greek -
- ti ti-alphabet-greek
- \f1e0 -
-
- -
- - alphabet-latin -
- ti ti-alphabet-latin
- \f1e1 -
-
- -
- - ambulance -
- ti ti-ambulance
- \ebf5 -
-
- -
- - ampersand -
- ti ti-ampersand
- \f229 -
-
- -
- - analyze -
- ti ti-analyze
- \f3a3 -
-
- -
- - analyze-filled -
- ti ti-analyze-filled
- \f719 -
-
- -
- - analyze-off -
- ti ti-analyze-off
- \f3ba -
-
- -
- - anchor -
- ti ti-anchor
- \eb76 -
-
- -
- - anchor-off -
- ti ti-anchor-off
- \f0f7 -
-
- -
- - angle -
- ti ti-angle
- \ef20 -
-
- -
- - ankh -
- ti ti-ankh
- \f1cd -
-
- -
- - antenna -
- ti ti-antenna
- \f094 -
-
- -
- - antenna-bars-1 -
- ti ti-antenna-bars-1
- \ecc7 -
-
- -
- - antenna-bars-2 -
- ti ti-antenna-bars-2
- \ecc8 -
-
- -
- - antenna-bars-3 -
- ti ti-antenna-bars-3
- \ecc9 -
-
- -
- - antenna-bars-4 -
- ti ti-antenna-bars-4
- \ecca -
-
- -
- - antenna-bars-5 -
- ti ti-antenna-bars-5
- \eccb -
-
- -
- - antenna-bars-off -
- ti ti-antenna-bars-off
- \f0aa -
-
- -
- - antenna-off -
- ti ti-antenna-off
- \f3bb -
-
- -
- - aperture -
- ti ti-aperture
- \eb58 -
-
- -
- - aperture-off -
- ti ti-aperture-off
- \f3bc -
-
- -
- - api -
- ti ti-api
- \effd -
-
- -
- - api-app -
- ti ti-api-app
- \effc -
-
- -
- - api-app-off -
- ti ti-api-app-off
- \f0ab -
-
- -
- - api-off -
- ti ti-api-off
- \f0f8 -
-
- -
- - app-window -
- ti ti-app-window
- \efe6 -
-
- -
- - app-window-filled -
- ti ti-app-window-filled
- \f71a -
-
- -
- - apple -
- ti ti-apple
- \ef21 -
-
- -
- - apps -
- ti ti-apps
- \ebb6 -
-
- -
- - apps-filled -
- ti ti-apps-filled
- \f6f1 -
-
- -
- - apps-off -
- ti ti-apps-off
- \f0ac -
-
- -
- - archive -
- ti ti-archive
- \ea0b -
-
- -
- - archive-off -
- ti ti-archive-off
- \f0ad -
-
- -
- - armchair -
- ti ti-armchair
- \ef9e -
-
- -
- - armchair-2 -
- ti ti-armchair-2
- \efe7 -
-
- -
- - armchair-2-off -
- ti ti-armchair-2-off
- \f3bd -
-
- -
- - armchair-off -
- ti ti-armchair-off
- \f3be -
-
- -
- - arrow-autofit-content -
- ti ti-arrow-autofit-content
- \ef31 -
-
- -
- - arrow-autofit-content-filled -
- ti ti-arrow-autofit-content-filled
- \f6f2 -
-
- -
- - arrow-autofit-down -
- ti ti-arrow-autofit-down
- \ef32 -
-
- -
- - arrow-autofit-height -
- ti ti-arrow-autofit-height
- \ef33 -
-
- -
- - arrow-autofit-left -
- ti ti-arrow-autofit-left
- \ef34 -
-
- -
- - arrow-autofit-right -
- ti ti-arrow-autofit-right
- \ef35 -
-
- -
- - arrow-autofit-up -
- ti ti-arrow-autofit-up
- \ef36 -
-
- -
- - arrow-autofit-width -
- ti ti-arrow-autofit-width
- \ef37 -
-
- -
- - arrow-back -
- ti ti-arrow-back
- \ea0c -
-
- -
- - arrow-back-up -
- ti ti-arrow-back-up
- \eb77 -
-
- -
- - arrow-back-up-double -
- ti ti-arrow-back-up-double
- \f9ec -
-
- -
- - arrow-badge-down -
- ti ti-arrow-badge-down
- \f60b -
-
- -
- - arrow-badge-down-filled -
- ti ti-arrow-badge-down-filled
- \f7d6 -
-
- -
- - arrow-badge-left -
- ti ti-arrow-badge-left
- \f60c -
-
- -
- - arrow-badge-left-filled -
- ti ti-arrow-badge-left-filled
- \f7d7 -
-
- -
- - arrow-badge-right -
- ti ti-arrow-badge-right
- \f60d -
-
- -
- - arrow-badge-right-filled -
- ti ti-arrow-badge-right-filled
- \f7d8 -
-
- -
- - arrow-badge-up -
- ti ti-arrow-badge-up
- \f60e -
-
- -
- - arrow-badge-up-filled -
- ti ti-arrow-badge-up-filled
- \f7d9 -
-
- -
- - arrow-bar-down -
- ti ti-arrow-bar-down
- \ea0d -
-
- -
- - arrow-bar-left -
- ti ti-arrow-bar-left
- \ea0e -
-
- -
- - arrow-bar-right -
- ti ti-arrow-bar-right
- \ea0f -
-
- -
- - arrow-bar-to-down -
- ti ti-arrow-bar-to-down
- \ec88 -
-
- -
- - arrow-bar-to-left -
- ti ti-arrow-bar-to-left
- \ec89 -
-
- -
- - arrow-bar-to-right -
- ti ti-arrow-bar-to-right
- \ec8a -
-
- -
- - arrow-bar-to-up -
- ti ti-arrow-bar-to-up
- \ec8b -
-
- -
- - arrow-bar-up -
- ti ti-arrow-bar-up
- \ea10 -
-
- -
- - arrow-bear-left -
- ti ti-arrow-bear-left
- \f045 -
-
- -
- - arrow-bear-left-2 -
- ti ti-arrow-bear-left-2
- \f044 -
-
- -
- - arrow-bear-right -
- ti ti-arrow-bear-right
- \f047 -
-
- -
- - arrow-bear-right-2 -
- ti ti-arrow-bear-right-2
- \f046 -
-
- -
- - arrow-big-down -
- ti ti-arrow-big-down
- \edda -
-
- -
- - arrow-big-down-filled -
- ti ti-arrow-big-down-filled
- \f6c6 -
-
- -
- - arrow-big-down-line -
- ti ti-arrow-big-down-line
- \efe8 -
-
- -
- - arrow-big-down-line-filled -
- ti ti-arrow-big-down-line-filled
- \f6c7 -
-
- -
- - arrow-big-down-lines -
- ti ti-arrow-big-down-lines
- \efe9 -
-
- -
- - arrow-big-down-lines-filled -
- ti ti-arrow-big-down-lines-filled
- \f6c8 -
-
- -
- - arrow-big-left -
- ti ti-arrow-big-left
- \eddb -
-
- -
- - arrow-big-left-filled -
- ti ti-arrow-big-left-filled
- \f6c9 -
-
- -
- - arrow-big-left-line -
- ti ti-arrow-big-left-line
- \efea -
-
- -
- - arrow-big-left-line-filled -
- ti ti-arrow-big-left-line-filled
- \f6ca -
-
- -
- - arrow-big-left-lines -
- ti ti-arrow-big-left-lines
- \efeb -
-
- -
- - arrow-big-left-lines-filled -
- ti ti-arrow-big-left-lines-filled
- \f6cb -
-
- -
- - arrow-big-right -
- ti ti-arrow-big-right
- \eddc -
-
- -
- - arrow-big-right-filled -
- ti ti-arrow-big-right-filled
- \f6cc -
-
- -
- - arrow-big-right-line -
- ti ti-arrow-big-right-line
- \efec -
-
- -
- - arrow-big-right-line-filled -
- ti ti-arrow-big-right-line-filled
- \f6cd -
-
- -
- - arrow-big-right-lines -
- ti ti-arrow-big-right-lines
- \efed -
-
- -
- - arrow-big-right-lines-filled -
- ti ti-arrow-big-right-lines-filled
- \f6ce -
-
- -
- - arrow-big-up -
- ti ti-arrow-big-up
- \eddd -
-
- -
- - arrow-big-up-filled -
- ti ti-arrow-big-up-filled
- \f6cf -
-
- -
- - arrow-big-up-line -
- ti ti-arrow-big-up-line
- \efee -
-
- -
- - arrow-big-up-line-filled -
- ti ti-arrow-big-up-line-filled
- \f6d0 -
-
- -
- - arrow-big-up-lines -
- ti ti-arrow-big-up-lines
- \efef -
-
- -
- - arrow-big-up-lines-filled -
- ti ti-arrow-big-up-lines-filled
- \f6d1 -
-
- -
- - arrow-bounce -
- ti ti-arrow-bounce
- \f3a4 -
-
- -
- - arrow-curve-left -
- ti ti-arrow-curve-left
- \f048 -
-
- -
- - arrow-curve-right -
- ti ti-arrow-curve-right
- \f049 -
-
- -
- - arrow-down -
- ti ti-arrow-down
- \ea16 -
-
- -
- - arrow-down-bar -
- ti ti-arrow-down-bar
- \ed98 -
-
- -
- - arrow-down-circle -
- ti ti-arrow-down-circle
- \ea11 -
-
- -
- - arrow-down-left -
- ti ti-arrow-down-left
- \ea13 -
-
- -
- - arrow-down-left-circle -
- ti ti-arrow-down-left-circle
- \ea12 -
-
- -
- - arrow-down-rhombus -
- ti ti-arrow-down-rhombus
- \f61d -
-
- -
- - arrow-down-right -
- ti ti-arrow-down-right
- \ea15 -
-
- -
- - arrow-down-right-circle -
- ti ti-arrow-down-right-circle
- \ea14 -
-
- -
- - arrow-down-square -
- ti ti-arrow-down-square
- \ed9a -
-
- -
- - arrow-down-tail -
- ti ti-arrow-down-tail
- \ed9b -
-
- -
- - arrow-elbow-left -
- ti ti-arrow-elbow-left
- \f9ed -
-
- -
- - arrow-elbow-right -
- ti ti-arrow-elbow-right
- \f9ee -
-
- -
- - arrow-fork -
- ti ti-arrow-fork
- \f04a -
-
- -
- - arrow-forward -
- ti ti-arrow-forward
- \ea17 -
-
- -
- - arrow-forward-up -
- ti ti-arrow-forward-up
- \eb78 -
-
- -
- - arrow-forward-up-double -
- ti ti-arrow-forward-up-double
- \f9ef -
-
- -
- - arrow-guide -
- ti ti-arrow-guide
- \f22a -
-
- -
- - arrow-iteration -
- ti ti-arrow-iteration
- \f578 -
-
- -
- - arrow-left -
- ti ti-arrow-left
- \ea19 -
-
- -
- - arrow-left-bar -
- ti ti-arrow-left-bar
- \ed9c -
-
- -
- - arrow-left-circle -
- ti ti-arrow-left-circle
- \ea18 -
-
- -
- - arrow-left-rhombus -
- ti ti-arrow-left-rhombus
- \f61e -
-
- -
- - arrow-left-right -
- ti ti-arrow-left-right
- \f04b -
-
- -
- - arrow-left-square -
- ti ti-arrow-left-square
- \ed9d -
-
- -
- - arrow-left-tail -
- ti ti-arrow-left-tail
- \ed9e -
-
- -
- - arrow-loop-left -
- ti ti-arrow-loop-left
- \ed9f -
-
- -
- - arrow-loop-left-2 -
- ti ti-arrow-loop-left-2
- \f04c -
-
- -
- - arrow-loop-right -
- ti ti-arrow-loop-right
- \eda0 -
-
- -
- - arrow-loop-right-2 -
- ti ti-arrow-loop-right-2
- \f04d -
-
- -
- - arrow-merge -
- ti ti-arrow-merge
- \f04e -
-
- -
- - arrow-merge-both -
- ti ti-arrow-merge-both
- \f23b -
-
- -
- - arrow-merge-left -
- ti ti-arrow-merge-left
- \f23c -
-
- -
- - arrow-merge-right -
- ti ti-arrow-merge-right
- \f23d -
-
- -
- - arrow-move-down -
- ti ti-arrow-move-down
- \f2ba -
-
- -
- - arrow-move-left -
- ti ti-arrow-move-left
- \f2bb -
-
- -
- - arrow-move-right -
- ti ti-arrow-move-right
- \f2bc -
-
- -
- - arrow-move-up -
- ti ti-arrow-move-up
- \f2bd -
-
- -
- - arrow-narrow-down -
- ti ti-arrow-narrow-down
- \ea1a -
-
- -
- - arrow-narrow-left -
- ti ti-arrow-narrow-left
- \ea1b -
-
- -
- - arrow-narrow-right -
- ti ti-arrow-narrow-right
- \ea1c -
-
- -
- - arrow-narrow-up -
- ti ti-arrow-narrow-up
- \ea1d -
-
- -
- - arrow-ramp-left -
- ti ti-arrow-ramp-left
- \ed3c -
-
- -
- - arrow-ramp-left-2 -
- ti ti-arrow-ramp-left-2
- \f04f -
-
- -
- - arrow-ramp-left-3 -
- ti ti-arrow-ramp-left-3
- \f050 -
-
- -
- - arrow-ramp-right -
- ti ti-arrow-ramp-right
- \ed3d -
-
- -
- - arrow-ramp-right-2 -
- ti ti-arrow-ramp-right-2
- \f051 -
-
- -
- - arrow-ramp-right-3 -
- ti ti-arrow-ramp-right-3
- \f052 -
-
- -
- - arrow-right -
- ti ti-arrow-right
- \ea1f -
-
- -
- - arrow-right-bar -
- ti ti-arrow-right-bar
- \eda1 -
-
- -
- - arrow-right-circle -
- ti ti-arrow-right-circle
- \ea1e -
-
- -
- - arrow-right-rhombus -
- ti ti-arrow-right-rhombus
- \f61f -
-
- -
- - arrow-right-square -
- ti ti-arrow-right-square
- \eda2 -
-
- -
- - arrow-right-tail -
- ti ti-arrow-right-tail
- \eda3 -
-
- -
- - arrow-rotary-first-left -
- ti ti-arrow-rotary-first-left
- \f053 -
-
- -
- - arrow-rotary-first-right -
- ti ti-arrow-rotary-first-right
- \f054 -
-
- -
- - arrow-rotary-last-left -
- ti ti-arrow-rotary-last-left
- \f055 -
-
- -
- - arrow-rotary-last-right -
- ti ti-arrow-rotary-last-right
- \f056 -
-
- -
- - arrow-rotary-left -
- ti ti-arrow-rotary-left
- \f057 -
-
- -
- - arrow-rotary-right -
- ti ti-arrow-rotary-right
- \f058 -
-
- -
- - arrow-rotary-straight -
- ti ti-arrow-rotary-straight
- \f059 -
-
- -
- - arrow-roundabout-left -
- ti ti-arrow-roundabout-left
- \f22b -
-
- -
- - arrow-roundabout-right -
- ti ti-arrow-roundabout-right
- \f22c -
-
- -
- - arrow-sharp-turn-left -
- ti ti-arrow-sharp-turn-left
- \f05a -
-
- -
- - arrow-sharp-turn-right -
- ti ti-arrow-sharp-turn-right
- \f05b -
-
- -
- - arrow-up -
- ti ti-arrow-up
- \ea25 -
-
- -
- - arrow-up-bar -
- ti ti-arrow-up-bar
- \eda4 -
-
- -
- - arrow-up-circle -
- ti ti-arrow-up-circle
- \ea20 -
-
- -
- - arrow-up-left -
- ti ti-arrow-up-left
- \ea22 -
-
- -
- - arrow-up-left-circle -
- ti ti-arrow-up-left-circle
- \ea21 -
-
- -
- - arrow-up-rhombus -
- ti ti-arrow-up-rhombus
- \f620 -
-
- -
- - arrow-up-right -
- ti ti-arrow-up-right
- \ea24 -
-
- -
- - arrow-up-right-circle -
- ti ti-arrow-up-right-circle
- \ea23 -
-
- -
- - arrow-up-square -
- ti ti-arrow-up-square
- \eda6 -
-
- -
- - arrow-up-tail -
- ti ti-arrow-up-tail
- \eda7 -
-
- -
- - arrow-wave-left-down -
- ti ti-arrow-wave-left-down
- \eda8 -
-
- -
- - arrow-wave-left-up -
- ti ti-arrow-wave-left-up
- \eda9 -
-
- -
- - arrow-wave-right-down -
- ti ti-arrow-wave-right-down
- \edaa -
-
- -
- - arrow-wave-right-up -
- ti ti-arrow-wave-right-up
- \edab -
-
- -
- - arrow-zig-zag -
- ti ti-arrow-zig-zag
- \f4a7 -
-
- -
- - arrows-cross -
- ti ti-arrows-cross
- \effe -
-
- -
- - arrows-diagonal -
- ti ti-arrows-diagonal
- \ea27 -
-
- -
- - arrows-diagonal-2 -
- ti ti-arrows-diagonal-2
- \ea26 -
-
- -
- - arrows-diagonal-minimize -
- ti ti-arrows-diagonal-minimize
- \ef39 -
-
- -
- - arrows-diagonal-minimize-2 -
- ti ti-arrows-diagonal-minimize-2
- \ef38 -
-
- -
- - arrows-diff -
- ti ti-arrows-diff
- \f296 -
-
- -
- - arrows-double-ne-sw -
- ti ti-arrows-double-ne-sw
- \edde -
-
- -
- - arrows-double-nw-se -
- ti ti-arrows-double-nw-se
- \eddf -
-
- -
- - arrows-double-se-nw -
- ti ti-arrows-double-se-nw
- \ede0 -
-
- -
- - arrows-double-sw-ne -
- ti ti-arrows-double-sw-ne
- \ede1 -
-
- -
- - arrows-down -
- ti ti-arrows-down
- \edad -
-
- -
- - arrows-down-up -
- ti ti-arrows-down-up
- \edac -
-
- -
- - arrows-exchange -
- ti ti-arrows-exchange
- \f1f4 -
-
- -
- - arrows-exchange-2 -
- ti ti-arrows-exchange-2
- \f1f3 -
-
- -
- - arrows-horizontal -
- ti ti-arrows-horizontal
- \eb59 -
-
- -
- - arrows-join -
- ti ti-arrows-join
- \edaf -
-
- -
- - arrows-join-2 -
- ti ti-arrows-join-2
- \edae -
-
- -
- - arrows-left -
- ti ti-arrows-left
- \edb1 -
-
- -
- - arrows-left-down -
- ti ti-arrows-left-down
- \ee00 -
-
- -
- - arrows-left-right -
- ti ti-arrows-left-right
- \edb0 -
-
- -
- - arrows-maximize -
- ti ti-arrows-maximize
- \ea28 -
-
- -
- - arrows-minimize -
- ti ti-arrows-minimize
- \ea29 -
-
- -
- - arrows-move -
- ti ti-arrows-move
- \f22f -
-
- -
- - arrows-move-horizontal -
- ti ti-arrows-move-horizontal
- \f22d -
-
- -
- - arrows-move-vertical -
- ti ti-arrows-move-vertical
- \f22e -
-
- -
- - arrows-random -
- ti ti-arrows-random
- \f095 -
-
- -
- - arrows-right -
- ti ti-arrows-right
- \edb3 -
-
- -
- - arrows-right-down -
- ti ti-arrows-right-down
- \ee01 -
-
- -
- - arrows-right-left -
- ti ti-arrows-right-left
- \edb2 -
-
- -
- - arrows-shuffle -
- ti ti-arrows-shuffle
- \f000 -
-
- -
- - arrows-shuffle-2 -
- ti ti-arrows-shuffle-2
- \efff -
-
- -
- - arrows-sort -
- ti ti-arrows-sort
- \eb5a -
-
- -
- - arrows-split -
- ti ti-arrows-split
- \edb5 -
-
- -
- - arrows-split-2 -
- ti ti-arrows-split-2
- \edb4 -
-
- -
- - arrows-transfer-down -
- ti ti-arrows-transfer-down
- \f2cc -
-
- -
- - arrows-transfer-up -
- ti ti-arrows-transfer-up
- \f2cd -
-
- -
- - arrows-up -
- ti ti-arrows-up
- \edb7 -
-
- -
- - arrows-up-down -
- ti ti-arrows-up-down
- \edb6 -
-
- -
- - arrows-up-left -
- ti ti-arrows-up-left
- \ee02 -
-
- -
- - arrows-up-right -
- ti ti-arrows-up-right
- \ee03 -
-
- -
- - arrows-vertical -
- ti ti-arrows-vertical
- \eb5b -
-
- -
- - artboard -
- ti ti-artboard
- \ea2a -
-
- -
- - artboard-off -
- ti ti-artboard-off
- \f0ae -
-
- -
- - article -
- ti ti-article
- \f1e2 -
-
- -
- - article-filled-filled -
- ti ti-article-filled-filled
- \f7da -
-
- -
- - article-off -
- ti ti-article-off
- \f3bf -
-
- -
- - aspect-ratio -
- ti ti-aspect-ratio
- \ed30 -
-
- -
- - aspect-ratio-filled -
- ti ti-aspect-ratio-filled
- \f7db -
-
- -
- - aspect-ratio-off -
- ti ti-aspect-ratio-off
- \f0af -
-
- -
- - assembly -
- ti ti-assembly
- \f24d -
-
- -
- - assembly-off -
- ti ti-assembly-off
- \f3c0 -
-
- -
- - asset -
- ti ti-asset
- \f1ce -
-
- -
- - asterisk -
- ti ti-asterisk
- \efd5 -
-
- -
- - asterisk-simple -
- ti ti-asterisk-simple
- \efd4 -
-
- -
- - at -
- ti ti-at
- \ea2b -
-
- -
- - at-off -
- ti ti-at-off
- \f0b0 -
-
- -
- - atom -
- ti ti-atom
- \eb79 -
-
- -
- - atom-2 -
- ti ti-atom-2
- \ebdf -
-
- -
- - atom-2-filled -
- ti ti-atom-2-filled
- \f71b -
-
- -
- - atom-off -
- ti ti-atom-off
- \f0f9 -
-
- -
- - augmented-reality -
- ti ti-augmented-reality
- \f023 -
-
- -
- - augmented-reality-2 -
- ti ti-augmented-reality-2
- \f37e -
-
- -
- - augmented-reality-off -
- ti ti-augmented-reality-off
- \f3c1 -
-
- -
- - award -
- ti ti-award
- \ea2c -
-
- -
- - award-filled -
- ti ti-award-filled
- \f71c -
-
- -
- - award-off -
- ti ti-award-off
- \f0fa -
-
- -
- - axe -
- ti ti-axe
- \ef9f -
-
- -
- - axis-x -
- ti ti-axis-x
- \ef45 -
-
- -
- - axis-y -
- ti ti-axis-y
- \ef46 -
-
- -
- - baby-bottle -
- ti ti-baby-bottle
- \f5d2 -
-
- -
- - baby-carriage -
- ti ti-baby-carriage
- \f05d -
-
- -
- - backhoe -
- ti ti-backhoe
- \ed86 -
-
- -
- - backpack -
- ti ti-backpack
- \ef47 -
-
- -
- - backpack-off -
- ti ti-backpack-off
- \f3c2 -
-
- -
- - backspace -
- ti ti-backspace
- \ea2d -
-
- -
- - backspace-filled -
- ti ti-backspace-filled
- \f7dc -
-
- -
- - badge -
- ti ti-badge
- \efc2 -
-
- -
- - badge-3d -
- ti ti-badge-3d
- \f555 -
-
- -
- - badge-4k -
- ti ti-badge-4k
- \f556 -
-
- -
- - badge-8k -
- ti ti-badge-8k
- \f557 -
-
- -
- - badge-ad -
- ti ti-badge-ad
- \f558 -
-
- -
- - badge-ar -
- ti ti-badge-ar
- \f559 -
-
- -
- - badge-cc -
- ti ti-badge-cc
- \f55a -
-
- -
- - badge-filled -
- ti ti-badge-filled
- \f667 -
-
- -
- - badge-hd -
- ti ti-badge-hd
- \f55b -
-
- -
- - badge-off -
- ti ti-badge-off
- \f0fb -
-
- -
- - badge-sd -
- ti ti-badge-sd
- \f55c -
-
- -
- - badge-tm -
- ti ti-badge-tm
- \f55d -
-
- -
- - badge-vo -
- ti ti-badge-vo
- \f55e -
-
- -
- - badge-vr -
- ti ti-badge-vr
- \f55f -
-
- -
- - badge-wc -
- ti ti-badge-wc
- \f560 -
-
- -
- - badges -
- ti ti-badges
- \efc3 -
-
- -
- - badges-filled -
- ti ti-badges-filled
- \f7dd -
-
- -
- - badges-off -
- ti ti-badges-off
- \f0fc -
-
- -
- - baguette -
- ti ti-baguette
- \f3a5 -
-
- -
- - ball-american-football -
- ti ti-ball-american-football
- \ee04 -
-
- -
- - ball-american-football-off -
- ti ti-ball-american-football-off
- \f3c3 -
-
- -
- - ball-baseball -
- ti ti-ball-baseball
- \efa0 -
-
- -
- - ball-basketball -
- ti ti-ball-basketball
- \ec28 -
-
- -
- - ball-bowling -
- ti ti-ball-bowling
- \ec29 -
-
- -
- - ball-football -
- ti ti-ball-football
- \ee06 -
-
- -
- - ball-football-off -
- ti ti-ball-football-off
- \ee05 -
-
- -
- - ball-tennis -
- ti ti-ball-tennis
- \ec2a -
-
- -
- - ball-volleyball -
- ti ti-ball-volleyball
- \ec2b -
-
- -
- - balloon -
- ti ti-balloon
- \ef3a -
-
- -
- - balloon-off -
- ti ti-balloon-off
- \f0fd -
-
- -
- - ballpen -
- ti ti-ballpen
- \f06e -
-
- -
- - ballpen-off -
- ti ti-ballpen-off
- \f0b1 -
-
- -
- - ban -
- ti ti-ban
- \ea2e -
-
- -
- - bandage -
- ti ti-bandage
- \eb7a -
-
- -
- - bandage-filled -
- ti ti-bandage-filled
- \f7de -
-
- -
- - bandage-off -
- ti ti-bandage-off
- \f3c4 -
-
- -
- - barbell -
- ti ti-barbell
- \eff0 -
-
- -
- - barbell-off -
- ti ti-barbell-off
- \f0b2 -
-
- -
- - barcode -
- ti ti-barcode
- \ebc6 -
-
- -
- - barcode-off -
- ti ti-barcode-off
- \f0b3 -
-
- -
- - barrel -
- ti ti-barrel
- \f0b4 -
-
- -
- - barrel-off -
- ti ti-barrel-off
- \f0fe -
-
- -
- - barrier-block -
- ti ti-barrier-block
- \f00e -
-
- -
- - barrier-block-off -
- ti ti-barrier-block-off
- \f0b5 -
-
- -
- - baseline -
- ti ti-baseline
- \f024 -
-
- -
- - baseline-density-large -
- ti ti-baseline-density-large
- \f9f0 -
-
- -
- - baseline-density-medium -
- ti ti-baseline-density-medium
- \f9f1 -
-
- -
- - baseline-density-small -
- ti ti-baseline-density-small
- \f9f2 -
-
- -
- - basket -
- ti ti-basket
- \ebe1 -
-
- -
- - basket-filled -
- ti ti-basket-filled
- \f7df -
-
- -
- - basket-off -
- ti ti-basket-off
- \f0b6 -
-
- -
- - bat -
- ti ti-bat
- \f284 -
-
- -
- - bath -
- ti ti-bath
- \ef48 -
-
- -
- - bath-filled -
- ti ti-bath-filled
- \f71d -
-
- -
- - bath-off -
- ti ti-bath-off
- \f0ff -
-
- -
- - battery -
- ti ti-battery
- \ea34 -
-
- -
- - battery-1 -
- ti ti-battery-1
- \ea2f -
-
- -
- - battery-1-filled -
- ti ti-battery-1-filled
- \f71e -
-
- -
- - battery-2 -
- ti ti-battery-2
- \ea30 -
-
- -
- - battery-2-filled -
- ti ti-battery-2-filled
- \f71f -
-
- -
- - battery-3 -
- ti ti-battery-3
- \ea31 -
-
- -
- - battery-3-filled -
- ti ti-battery-3-filled
- \f720 -
-
- -
- - battery-4 -
- ti ti-battery-4
- \ea32 -
-
- -
- - battery-4-filled -
- ti ti-battery-4-filled
- \f721 -
-
- -
- - battery-automotive -
- ti ti-battery-automotive
- \ee07 -
-
- -
- - battery-charging -
- ti ti-battery-charging
- \ea33 -
-
- -
- - battery-charging-2 -
- ti ti-battery-charging-2
- \ef3b -
-
- -
- - battery-eco -
- ti ti-battery-eco
- \ef3c -
-
- -
- - battery-filled -
- ti ti-battery-filled
- \f668 -
-
- -
- - battery-off -
- ti ti-battery-off
- \ed1c -
-
- -
- - beach -
- ti ti-beach
- \ef3d -
-
- -
- - beach-off -
- ti ti-beach-off
- \f0b7 -
-
- -
- - bed -
- ti ti-bed
- \eb5c -
-
- -
- - bed-filled -
- ti ti-bed-filled
- \f7e0 -
-
- -
- - bed-off -
- ti ti-bed-off
- \f100 -
-
- -
- - beer -
- ti ti-beer
- \efa1 -
-
- -
- - beer-filled -
- ti ti-beer-filled
- \f7e1 -
-
- -
- - beer-off -
- ti ti-beer-off
- \f101 -
-
- -
- - bell -
- ti ti-bell
- \ea35 -
-
- -
- - bell-bolt -
- ti ti-bell-bolt
- \f812 -
-
- -
- - bell-cancel -
- ti ti-bell-cancel
- \f813 -
-
- -
- - bell-check -
- ti ti-bell-check
- \f814 -
-
- -
- - bell-code -
- ti ti-bell-code
- \f815 -
-
- -
- - bell-cog -
- ti ti-bell-cog
- \f816 -
-
- -
- - bell-dollar -
- ti ti-bell-dollar
- \f817 -
-
- -
- - bell-down -
- ti ti-bell-down
- \f818 -
-
- -
- - bell-exclamation -
- ti ti-bell-exclamation
- \f819 -
-
- -
- - bell-filled -
- ti ti-bell-filled
- \f669 -
-
- -
- - bell-heart -
- ti ti-bell-heart
- \f81a -
-
- -
- - bell-minus -
- ti ti-bell-minus
- \ede2 -
-
- -
- - bell-minus-filled -
- ti ti-bell-minus-filled
- \f722 -
-
- -
- - bell-off -
- ti ti-bell-off
- \ece9 -
-
- -
- - bell-pause -
- ti ti-bell-pause
- \f81b -
-
- -
- - bell-pin -
- ti ti-bell-pin
- \f81c -
-
- -
- - bell-plus -
- ti ti-bell-plus
- \ede3 -
-
- -
- - bell-plus-filled -
- ti ti-bell-plus-filled
- \f723 -
-
- -
- - bell-question -
- ti ti-bell-question
- \f81d -
-
- -
- - bell-ringing -
- ti ti-bell-ringing
- \ed07 -
-
- -
- - bell-ringing-2 -
- ti ti-bell-ringing-2
- \ede4 -
-
- -
- - bell-ringing-2-filled -
- ti ti-bell-ringing-2-filled
- \f724 -
-
- -
- - bell-ringing-filled -
- ti ti-bell-ringing-filled
- \f725 -
-
- -
- - bell-school -
- ti ti-bell-school
- \f05e -
-
- -
- - bell-search -
- ti ti-bell-search
- \f81e -
-
- -
- - bell-share -
- ti ti-bell-share
- \f81f -
-
- -
- - bell-star -
- ti ti-bell-star
- \f820 -
-
- -
- - bell-up -
- ti ti-bell-up
- \f821 -
-
- -
- - bell-x -
- ti ti-bell-x
- \ede5 -
-
- -
- - bell-x-filled -
- ti ti-bell-x-filled
- \f726 -
-
- -
- - bell-z -
- ti ti-bell-z
- \eff1 -
-
- -
- - bell-z-filled -
- ti ti-bell-z-filled
- \f727 -
-
- -
- - beta -
- ti ti-beta
- \f544 -
-
- -
- - bible -
- ti ti-bible
- \efc4 -
-
- -
- - bike -
- ti ti-bike
- \ea36 -
-
- -
- - bike-off -
- ti ti-bike-off
- \f0b8 -
-
- -
- - binary -
- ti ti-binary
- \ee08 -
-
- -
- - binary-off -
- ti ti-binary-off
- \f3c5 -
-
- -
- - binary-tree -
- ti ti-binary-tree
- \f5d4 -
-
- -
- - binary-tree-2 -
- ti ti-binary-tree-2
- \f5d3 -
-
- -
- - biohazard -
- ti ti-biohazard
- \ecb8 -
-
- -
- - biohazard-off -
- ti ti-biohazard-off
- \f0b9 -
-
- -
- - blade -
- ti ti-blade
- \f4bd -
-
- -
- - blade-filled -
- ti ti-blade-filled
- \f7e2 -
-
- -
- - bleach -
- ti ti-bleach
- \f2f3 -
-
- -
- - bleach-chlorine -
- ti ti-bleach-chlorine
- \f2f0 -
-
- -
- - bleach-no-chlorine -
- ti ti-bleach-no-chlorine
- \f2f1 -
-
- -
- - bleach-off -
- ti ti-bleach-off
- \f2f2 -
-
- -
- - blockquote -
- ti ti-blockquote
- \ee09 -
-
- -
- - bluetooth -
- ti ti-bluetooth
- \ea37 -
-
- -
- - bluetooth-connected -
- ti ti-bluetooth-connected
- \ecea -
-
- -
- - bluetooth-off -
- ti ti-bluetooth-off
- \eceb -
-
- -
- - bluetooth-x -
- ti ti-bluetooth-x
- \f081 -
-
- -
- - blur -
- ti ti-blur
- \ef8c -
-
- -
- - blur-off -
- ti ti-blur-off
- \f3c6 -
-
- -
- - bmp -
- ti ti-bmp
- \f3a6 -
-
- -
- - bold -
- ti ti-bold
- \eb7b -
-
- -
- - bold-off -
- ti ti-bold-off
- \f0ba -
-
- -
- - bolt -
- ti ti-bolt
- \ea38 -
-
- -
- - bolt-off -
- ti ti-bolt-off
- \ecec -
-
- -
- - bomb -
- ti ti-bomb
- \f59c -
-
- -
- - bone -
- ti ti-bone
- \edb8 -
-
- -
- - bone-off -
- ti ti-bone-off
- \f0bb -
-
- -
- - bong -
- ti ti-bong
- \f3a7 -
-
- -
- - bong-off -
- ti ti-bong-off
- \f3c7 -
-
- -
- - book -
- ti ti-book
- \ea39 -
-
- -
- - book-2 -
- ti ti-book-2
- \efc5 -
-
- -
- - book-download -
- ti ti-book-download
- \f070 -
-
- -
- - book-off -
- ti ti-book-off
- \f0bc -
-
- -
- - book-upload -
- ti ti-book-upload
- \f071 -
-
- -
- - bookmark -
- ti ti-bookmark
- \ea3a -
-
- -
- - bookmark-off -
- ti ti-bookmark-off
- \eced -
-
- -
- - bookmarks -
- ti ti-bookmarks
- \ed08 -
-
- -
- - bookmarks-off -
- ti ti-bookmarks-off
- \f0bd -
-
- -
- - books -
- ti ti-books
- \eff2 -
-
- -
- - books-off -
- ti ti-books-off
- \f0be -
-
- -
- - border-all -
- ti ti-border-all
- \ea3b -
-
- -
- - border-bottom -
- ti ti-border-bottom
- \ea3c -
-
- -
- - border-corners -
- ti ti-border-corners
- \f7a0 -
-
- -
- - border-horizontal -
- ti ti-border-horizontal
- \ea3d -
-
- -
- - border-inner -
- ti ti-border-inner
- \ea3e -
-
- -
- - border-left -
- ti ti-border-left
- \ea3f -
-
- -
- - border-none -
- ti ti-border-none
- \ea40 -
-
- -
- - border-outer -
- ti ti-border-outer
- \ea41 -
-
- -
- - border-radius -
- ti ti-border-radius
- \eb7c -
-
- -
- - border-right -
- ti ti-border-right
- \ea42 -
-
- -
- - border-sides -
- ti ti-border-sides
- \f7a1 -
-
- -
- - border-style -
- ti ti-border-style
- \ee0a -
-
- -
- - border-style-2 -
- ti ti-border-style-2
- \ef22 -
-
- -
- - border-top -
- ti ti-border-top
- \ea43 -
-
- -
- - border-vertical -
- ti ti-border-vertical
- \ea44 -
-
- -
- - bottle -
- ti ti-bottle
- \ef0b -
-
- -
- - bottle-off -
- ti ti-bottle-off
- \f3c8 -
-
- -
- - bounce-left -
- ti ti-bounce-left
- \f59d -
-
- -
- - bounce-right -
- ti ti-bounce-right
- \f59e -
-
- -
- - bow -
- ti ti-bow
- \f096 -
-
- -
- - bowl -
- ti ti-bowl
- \f4fa -
-
- -
- - box -
- ti ti-box
- \ea45 -
-
- -
- - box-align-bottom -
- ti ti-box-align-bottom
- \f2a8 -
-
- -
- - box-align-bottom-left -
- ti ti-box-align-bottom-left
- \f2ce -
-
- -
- - box-align-bottom-right -
- ti ti-box-align-bottom-right
- \f2cf -
-
- -
- - box-align-left -
- ti ti-box-align-left
- \f2a9 -
-
- -
- - box-align-right -
- ti ti-box-align-right
- \f2aa -
-
- -
- - box-align-top -
- ti ti-box-align-top
- \f2ab -
-
- -
- - box-align-top-left -
- ti ti-box-align-top-left
- \f2d0 -
-
- -
- - box-align-top-right -
- ti ti-box-align-top-right
- \f2d1 -
-
- -
- - box-margin -
- ti ti-box-margin
- \ee0b -
-
- -
- - box-model -
- ti ti-box-model
- \ee0c -
-
- -
- - box-model-2 -
- ti ti-box-model-2
- \ef23 -
-
- -
- - box-model-2-off -
- ti ti-box-model-2-off
- \f3c9 -
-
- -
- - box-model-off -
- ti ti-box-model-off
- \f3ca -
-
- -
- - box-multiple -
- ti ti-box-multiple
- \ee17 -
-
- -
- - box-multiple-0 -
- ti ti-box-multiple-0
- \ee0d -
-
- -
- - box-multiple-1 -
- ti ti-box-multiple-1
- \ee0e -
-
- -
- - box-multiple-2 -
- ti ti-box-multiple-2
- \ee0f -
-
- -
- - box-multiple-3 -
- ti ti-box-multiple-3
- \ee10 -
-
- -
- - box-multiple-4 -
- ti ti-box-multiple-4
- \ee11 -
-
- -
- - box-multiple-5 -
- ti ti-box-multiple-5
- \ee12 -
-
- -
- - box-multiple-6 -
- ti ti-box-multiple-6
- \ee13 -
-
- -
- - box-multiple-7 -
- ti ti-box-multiple-7
- \ee14 -
-
- -
- - box-multiple-8 -
- ti ti-box-multiple-8
- \ee15 -
-
- -
- - box-multiple-9 -
- ti ti-box-multiple-9
- \ee16 -
-
- -
- - box-off -
- ti ti-box-off
- \f102 -
-
- -
- - box-padding -
- ti ti-box-padding
- \ee18 -
-
- -
- - box-seam -
- ti ti-box-seam
- \f561 -
-
- -
- - braces -
- ti ti-braces
- \ebcc -
-
- -
- - braces-off -
- ti ti-braces-off
- \f0bf -
-
- -
- - brackets -
- ti ti-brackets
- \ebcd -
-
- -
- - brackets-contain -
- ti ti-brackets-contain
- \f1e5 -
-
- -
- - brackets-contain-end -
- ti ti-brackets-contain-end
- \f1e3 -
-
- -
- - brackets-contain-start -
- ti ti-brackets-contain-start
- \f1e4 -
-
- -
- - brackets-off -
- ti ti-brackets-off
- \f0c0 -
-
- -
- - braille -
- ti ti-braille
- \f545 -
-
- -
- - brain -
- ti ti-brain
- \f59f -
-
- -
- - brand-4chan -
- ti ti-brand-4chan
- \f494 -
-
- -
- - brand-abstract -
- ti ti-brand-abstract
- \f495 -
-
- -
- - brand-adobe -
- ti ti-brand-adobe
- \f0dc -
-
- -
- - brand-adonis-js -
- ti ti-brand-adonis-js
- \f496 -
-
- -
- - brand-airbnb -
- ti ti-brand-airbnb
- \ed68 -
-
- -
- - brand-airtable -
- ti ti-brand-airtable
- \ef6a -
-
- -
- - brand-algolia -
- ti ti-brand-algolia
- \f390 -
-
- -
- - brand-alipay -
- ti ti-brand-alipay
- \f7a2 -
-
- -
- - brand-alpine-js -
- ti ti-brand-alpine-js
- \f324 -
-
- -
- - brand-amazon -
- ti ti-brand-amazon
- \f230 -
-
- -
- - brand-amd -
- ti ti-brand-amd
- \f653 -
-
- -
- - brand-amigo -
- ti ti-brand-amigo
- \f5f9 -
-
- -
- - brand-among-us -
- ti ti-brand-among-us
- \f205 -
-
- -
- - brand-android -
- ti ti-brand-android
- \ec16 -
-
- -
- - brand-angular -
- ti ti-brand-angular
- \ef6b -
-
- -
- - brand-ao3 -
- ti ti-brand-ao3
- \f5e8 -
-
- -
- - brand-appgallery -
- ti ti-brand-appgallery
- \f231 -
-
- -
- - brand-apple -
- ti ti-brand-apple
- \ec17 -
-
- -
- - brand-apple-arcade -
- ti ti-brand-apple-arcade
- \ed69 -
-
- -
- - brand-apple-podcast -
- ti ti-brand-apple-podcast
- \f1e6 -
-
- -
- - brand-appstore -
- ti ti-brand-appstore
- \ed24 -
-
- -
- - brand-asana -
- ti ti-brand-asana
- \edc5 -
-
- -
- - brand-backbone -
- ti ti-brand-backbone
- \f325 -
-
- -
- - brand-badoo -
- ti ti-brand-badoo
- \f206 -
-
- -
- - brand-baidu -
- ti ti-brand-baidu
- \f5e9 -
-
- -
- - brand-bandcamp -
- ti ti-brand-bandcamp
- \f207 -
-
- -
- - brand-bandlab -
- ti ti-brand-bandlab
- \f5fa -
-
- -
- - brand-beats -
- ti ti-brand-beats
- \f208 -
-
- -
- - brand-behance -
- ti ti-brand-behance
- \ec6e -
-
- -
- - brand-bilibili -
- ti ti-brand-bilibili
- \f6d2 -
-
- -
- - brand-binance -
- ti ti-brand-binance
- \f5a0 -
-
- -
- - brand-bing -
- ti ti-brand-bing
- \edc6 -
-
- -
- - brand-bitbucket -
- ti ti-brand-bitbucket
- \edc7 -
-
- -
- - brand-blackberry -
- ti ti-brand-blackberry
- \f568 -
-
- -
- - brand-blender -
- ti ti-brand-blender
- \f326 -
-
- -
- - brand-blogger -
- ti ti-brand-blogger
- \f35a -
-
- -
- - brand-booking -
- ti ti-brand-booking
- \edc8 -
-
- -
- - brand-bootstrap -
- ti ti-brand-bootstrap
- \ef3e -
-
- -
- - brand-bulma -
- ti ti-brand-bulma
- \f327 -
-
- -
- - brand-bumble -
- ti ti-brand-bumble
- \f5fb -
-
- -
- - brand-bunpo -
- ti ti-brand-bunpo
- \f4cf -
-
- -
- - brand-c-sharp -
- ti ti-brand-c-sharp
- \f003 -
-
- -
- - brand-cake -
- ti ti-brand-cake
- \f7a3 -
-
- -
- - brand-cakephp -
- ti ti-brand-cakephp
- \f7af -
-
- -
- - brand-campaignmonitor -
- ti ti-brand-campaignmonitor
- \f328 -
-
- -
- - brand-carbon -
- ti ti-brand-carbon
- \f348 -
-
- -
- - brand-cashapp -
- ti ti-brand-cashapp
- \f391 -
-
- -
- - brand-chrome -
- ti ti-brand-chrome
- \ec18 -
-
- -
- - brand-citymapper -
- ti ti-brand-citymapper
- \f5fc -
-
- -
- - brand-codecov -
- ti ti-brand-codecov
- \f329 -
-
- -
- - brand-codepen -
- ti ti-brand-codepen
- \ec6f -
-
- -
- - brand-codesandbox -
- ti ti-brand-codesandbox
- \ed6a -
-
- -
- - brand-cohost -
- ti ti-brand-cohost
- \f5d5 -
-
- -
- - brand-coinbase -
- ti ti-brand-coinbase
- \f209 -
-
- -
- - brand-comedy-central -
- ti ti-brand-comedy-central
- \f217 -
-
- -
- - brand-coreos -
- ti ti-brand-coreos
- \f5fd -
-
- -
- - brand-couchdb -
- ti ti-brand-couchdb
- \f60f -
-
- -
- - brand-couchsurfing -
- ti ti-brand-couchsurfing
- \f392 -
-
- -
- - brand-cpp -
- ti ti-brand-cpp
- \f5fe -
-
- -
- - brand-crunchbase -
- ti ti-brand-crunchbase
- \f7e3 -
-
- -
- - brand-css3 -
- ti ti-brand-css3
- \ed6b -
-
- -
- - brand-ctemplar -
- ti ti-brand-ctemplar
- \f4d0 -
-
- -
- - brand-cucumber -
- ti ti-brand-cucumber
- \ef6c -
-
- -
- - brand-cupra -
- ti ti-brand-cupra
- \f4d1 -
-
- -
- - brand-cypress -
- ti ti-brand-cypress
- \f333 -
-
- -
- - brand-d3 -
- ti ti-brand-d3
- \f24e -
-
- -
- - brand-days-counter -
- ti ti-brand-days-counter
- \f4d2 -
-
- -
- - brand-dcos -
- ti ti-brand-dcos
- \f32a -
-
- -
- - brand-debian -
- ti ti-brand-debian
- \ef57 -
-
- -
- - brand-deezer -
- ti ti-brand-deezer
- \f78b -
-
- -
- - brand-deliveroo -
- ti ti-brand-deliveroo
- \f4d3 -
-
- -
- - brand-deno -
- ti ti-brand-deno
- \f24f -
-
- -
- - brand-denodo -
- ti ti-brand-denodo
- \f610 -
-
- -
- - brand-deviantart -
- ti ti-brand-deviantart
- \ecfb -
-
- -
- - brand-dingtalk -
- ti ti-brand-dingtalk
- \f5ea -
-
- -
- - brand-discord -
- ti ti-brand-discord
- \ece3 -
-
- -
- - brand-discord-filled -
- ti ti-brand-discord-filled
- \f7e4 -
-
- -
- - brand-disney -
- ti ti-brand-disney
- \f20a -
-
- -
- - brand-disqus -
- ti ti-brand-disqus
- \edc9 -
-
- -
- - brand-django -
- ti ti-brand-django
- \f349 -
-
- -
- - brand-docker -
- ti ti-brand-docker
- \edca -
-
- -
- - brand-doctrine -
- ti ti-brand-doctrine
- \ef6d -
-
- -
- - brand-dolby-digital -
- ti ti-brand-dolby-digital
- \f4d4 -
-
- -
- - brand-douban -
- ti ti-brand-douban
- \f5ff -
-
- -
- - brand-dribbble -
- ti ti-brand-dribbble
- \ec19 -
-
- -
- - brand-dribbble-filled -
- ti ti-brand-dribbble-filled
- \f7e5 -
-
- -
- - brand-drops -
- ti ti-brand-drops
- \f4d5 -
-
- -
- - brand-drupal -
- ti ti-brand-drupal
- \f393 -
-
- -
- - brand-edge -
- ti ti-brand-edge
- \ecfc -
-
- -
- - brand-elastic -
- ti ti-brand-elastic
- \f611 -
-
- -
- - brand-ember -
- ti ti-brand-ember
- \f497 -
-
- -
- - brand-envato -
- ti ti-brand-envato
- \f394 -
-
- -
- - brand-etsy -
- ti ti-brand-etsy
- \f654 -
-
- -
- - brand-evernote -
- ti ti-brand-evernote
- \f600 -
-
- -
- - brand-facebook -
- ti ti-brand-facebook
- \ec1a -
-
- -
- - brand-facebook-filled -
- ti ti-brand-facebook-filled
- \f7e6 -
-
- -
- - brand-figma -
- ti ti-brand-figma
- \ec93 -
-
- -
- - brand-finder -
- ti ti-brand-finder
- \f218 -
-
- -
- - brand-firebase -
- ti ti-brand-firebase
- \ef6e -
-
- -
- - brand-firefox -
- ti ti-brand-firefox
- \ecfd -
-
- -
- - brand-fiverr -
- ti ti-brand-fiverr
- \f7a4 -
-
- -
- - brand-flickr -
- ti ti-brand-flickr
- \ecfe -
-
- -
- - brand-flightradar24 -
- ti ti-brand-flightradar24
- \f4d6 -
-
- -
- - brand-flipboard -
- ti ti-brand-flipboard
- \f20b -
-
- -
- - brand-flutter -
- ti ti-brand-flutter
- \f395 -
-
- -
- - brand-fortnite -
- ti ti-brand-fortnite
- \f260 -
-
- -
- - brand-foursquare -
- ti ti-brand-foursquare
- \ecff -
-
- -
- - brand-framer -
- ti ti-brand-framer
- \ec1b -
-
- -
- - brand-framer-motion -
- ti ti-brand-framer-motion
- \f78c -
-
- -
- - brand-funimation -
- ti ti-brand-funimation
- \f655 -
-
- -
- - brand-gatsby -
- ti ti-brand-gatsby
- \f396 -
-
- -
- - brand-git -
- ti ti-brand-git
- \ef6f -
-
- -
- - brand-github -
- ti ti-brand-github
- \ec1c -
-
- -
- - brand-github-copilot -
- ti ti-brand-github-copilot
- \f4a8 -
-
- -
- - brand-github-filled -
- ti ti-brand-github-filled
- \f7e7 -
-
- -
- - brand-gitlab -
- ti ti-brand-gitlab
- \ec1d -
-
- -
- - brand-gmail -
- ti ti-brand-gmail
- \efa2 -
-
- -
- - brand-golang -
- ti ti-brand-golang
- \f78d -
-
- -
- - brand-google -
- ti ti-brand-google
- \ec1f -
-
- -
- - brand-google-analytics -
- ti ti-brand-google-analytics
- \edcb -
-
- -
- - brand-google-big-query -
- ti ti-brand-google-big-query
- \f612 -
-
- -
- - brand-google-drive -
- ti ti-brand-google-drive
- \ec1e -
-
- -
- - brand-google-fit -
- ti ti-brand-google-fit
- \f297 -
-
- -
- - brand-google-home -
- ti ti-brand-google-home
- \f601 -
-
- -
- - brand-google-one -
- ti ti-brand-google-one
- \f232 -
-
- -
- - brand-google-photos -
- ti ti-brand-google-photos
- \f20c -
-
- -
- - brand-google-play -
- ti ti-brand-google-play
- \ed25 -
-
- -
- - brand-google-podcasts -
- ti ti-brand-google-podcasts
- \f656 -
-
- -
- - brand-grammarly -
- ti ti-brand-grammarly
- \f32b -
-
- -
- - brand-graphql -
- ti ti-brand-graphql
- \f32c -
-
- -
- - brand-gravatar -
- ti ti-brand-gravatar
- \edcc -
-
- -
- - brand-grindr -
- ti ti-brand-grindr
- \f20d -
-
- -
- - brand-guardian -
- ti ti-brand-guardian
- \f4fb -
-
- -
- - brand-gumroad -
- ti ti-brand-gumroad
- \f5d6 -
-
- -
- - brand-hbo -
- ti ti-brand-hbo
- \f657 -
-
- -
- - brand-headlessui -
- ti ti-brand-headlessui
- \f32d -
-
- -
- - brand-hipchat -
- ti ti-brand-hipchat
- \edcd -
-
- -
- - brand-html5 -
- ti ti-brand-html5
- \ed6c -
-
- -
- - brand-inertia -
- ti ti-brand-inertia
- \f34a -
-
- -
- - brand-instagram -
- ti ti-brand-instagram
- \ec20 -
-
- -
- - brand-intercom -
- ti ti-brand-intercom
- \f1cf -
-
- -
- - brand-javascript -
- ti ti-brand-javascript
- \ef0c -
-
- -
- - brand-juejin -
- ti ti-brand-juejin
- \f7b0 -
-
- -
- - brand-kickstarter -
- ti ti-brand-kickstarter
- \edce -
-
- -
- - brand-kotlin -
- ti ti-brand-kotlin
- \ed6d -
-
- -
- - brand-laravel -
- ti ti-brand-laravel
- \f34b -
-
- -
- - brand-lastfm -
- ti ti-brand-lastfm
- \f001 -
-
- -
- - brand-line -
- ti ti-brand-line
- \f7e8 -
-
- -
- - brand-linkedin -
- ti ti-brand-linkedin
- \ec8c -
-
- -
- - brand-linktree -
- ti ti-brand-linktree
- \f1e7 -
-
- -
- - brand-linqpad -
- ti ti-brand-linqpad
- \f562 -
-
- -
- - brand-loom -
- ti ti-brand-loom
- \ef70 -
-
- -
- - brand-mailgun -
- ti ti-brand-mailgun
- \f32e -
-
- -
- - brand-mantine -
- ti ti-brand-mantine
- \f32f -
-
- -
- - brand-mastercard -
- ti ti-brand-mastercard
- \ef49 -
-
- -
- - brand-mastodon -
- ti ti-brand-mastodon
- \f250 -
-
- -
- - brand-matrix -
- ti ti-brand-matrix
- \f5eb -
-
- -
- - brand-mcdonalds -
- ti ti-brand-mcdonalds
- \f251 -
-
- -
- - brand-medium -
- ti ti-brand-medium
- \ec70 -
-
- -
- - brand-mercedes -
- ti ti-brand-mercedes
- \f072 -
-
- -
- - brand-messenger -
- ti ti-brand-messenger
- \ec71 -
-
- -
- - brand-meta -
- ti ti-brand-meta
- \efb0 -
-
- -
- - brand-miniprogram -
- ti ti-brand-miniprogram
- \f602 -
-
- -
- - brand-mixpanel -
- ti ti-brand-mixpanel
- \f397 -
-
- -
- - brand-monday -
- ti ti-brand-monday
- \f219 -
-
- -
- - brand-mongodb -
- ti ti-brand-mongodb
- \f613 -
-
- -
- - brand-my-oppo -
- ti ti-brand-my-oppo
- \f4d7 -
-
- -
- - brand-mysql -
- ti ti-brand-mysql
- \f614 -
-
- -
- - brand-national-geographic -
- ti ti-brand-national-geographic
- \f603 -
-
- -
- - brand-nem -
- ti ti-brand-nem
- \f5a1 -
-
- -
- - brand-netbeans -
- ti ti-brand-netbeans
- \ef71 -
-
- -
- - brand-netease-music -
- ti ti-brand-netease-music
- \f604 -
-
- -
- - brand-netflix -
- ti ti-brand-netflix
- \edcf -
-
- -
- - brand-nexo -
- ti ti-brand-nexo
- \f5a2 -
-
- -
- - brand-nextcloud -
- ti ti-brand-nextcloud
- \f4d8 -
-
- -
- - brand-nextjs -
- ti ti-brand-nextjs
- \f0dd -
-
- -
- - brand-nord-vpn -
- ti ti-brand-nord-vpn
- \f37f -
-
- -
- - brand-notion -
- ti ti-brand-notion
- \ef7b -
-
- -
- - brand-npm -
- ti ti-brand-npm
- \f569 -
-
- -
- - brand-nuxt -
- ti ti-brand-nuxt
- \f0de -
-
- -
- - brand-nytimes -
- ti ti-brand-nytimes
- \ef8d -
-
- -
- - brand-office -
- ti ti-brand-office
- \f398 -
-
- -
- - brand-ok-ru -
- ti ti-brand-ok-ru
- \f399 -
-
- -
- - brand-onedrive -
- ti ti-brand-onedrive
- \f5d7 -
-
- -
- - brand-onlyfans -
- ti ti-brand-onlyfans
- \f605 -
-
- -
- - brand-open-source -
- ti ti-brand-open-source
- \edd0 -
-
- -
- - brand-openai -
- ti ti-brand-openai
- \f78e -
-
- -
- - brand-openvpn -
- ti ti-brand-openvpn
- \f39a -
-
- -
- - brand-opera -
- ti ti-brand-opera
- \ec21 -
-
- -
- - brand-pagekit -
- ti ti-brand-pagekit
- \edd1 -
-
- -
- - brand-patreon -
- ti ti-brand-patreon
- \edd2 -
-
- -
- - brand-paypal -
- ti ti-brand-paypal
- \ec22 -
-
- -
- - brand-paypal-filled -
- ti ti-brand-paypal-filled
- \f7e9 -
-
- -
- - brand-paypay -
- ti ti-brand-paypay
- \f5ec -
-
- -
- - brand-peanut -
- ti ti-brand-peanut
- \f39b -
-
- -
- - brand-pepsi -
- ti ti-brand-pepsi
- \f261 -
-
- -
- - brand-php -
- ti ti-brand-php
- \ef72 -
-
- -
- - brand-picsart -
- ti ti-brand-picsart
- \f4d9 -
-
- -
- - brand-pinterest -
- ti ti-brand-pinterest
- \ec8d -
-
- -
- - brand-planetscale -
- ti ti-brand-planetscale
- \f78f -
-
- -
- - brand-pocket -
- ti ti-brand-pocket
- \ed00 -
-
- -
- - brand-polymer -
- ti ti-brand-polymer
- \f498 -
-
- -
- - brand-powershell -
- ti ti-brand-powershell
- \f5ed -
-
- -
- - brand-prisma -
- ti ti-brand-prisma
- \f499 -
-
- -
- - brand-producthunt -
- ti ti-brand-producthunt
- \edd3 -
-
- -
- - brand-pushbullet -
- ti ti-brand-pushbullet
- \f330 -
-
- -
- - brand-pushover -
- ti ti-brand-pushover
- \f20e -
-
- -
- - brand-python -
- ti ti-brand-python
- \ed01 -
-
- -
- - brand-qq -
- ti ti-brand-qq
- \f606 -
-
- -
- - brand-radix-ui -
- ti ti-brand-radix-ui
- \f790 -
-
- -
- - brand-react -
- ti ti-brand-react
- \f34c -
-
- -
- - brand-react-native -
- ti ti-brand-react-native
- \ef73 -
-
- -
- - brand-reason -
- ti ti-brand-reason
- \f49a -
-
- -
- - brand-reddit -
- ti ti-brand-reddit
- \ec8e -
-
- -
- - brand-redhat -
- ti ti-brand-redhat
- \f331 -
-
- -
- - brand-redux -
- ti ti-brand-redux
- \f3a8 -
-
- -
- - brand-revolut -
- ti ti-brand-revolut
- \f4da -
-
- -
- - brand-safari -
- ti ti-brand-safari
- \ec23 -
-
- -
- - brand-samsungpass -
- ti ti-brand-samsungpass
- \f4db -
-
- -
- - brand-sass -
- ti ti-brand-sass
- \edd4 -
-
- -
- - brand-sentry -
- ti ti-brand-sentry
- \edd5 -
-
- -
- - brand-sharik -
- ti ti-brand-sharik
- \f4dc -
-
- -
- - brand-shazam -
- ti ti-brand-shazam
- \edd6 -
-
- -
- - brand-shopee -
- ti ti-brand-shopee
- \f252 -
-
- -
- - brand-sketch -
- ti ti-brand-sketch
- \ec24 -
-
- -
- - brand-skype -
- ti ti-brand-skype
- \ed02 -
-
- -
- - brand-slack -
- ti ti-brand-slack
- \ec72 -
-
- -
- - brand-snapchat -
- ti ti-brand-snapchat
- \ec25 -
-
- -
- - brand-snapseed -
- ti ti-brand-snapseed
- \f253 -
-
- -
- - brand-snowflake -
- ti ti-brand-snowflake
- \f615 -
-
- -
- - brand-socket-io -
- ti ti-brand-socket-io
- \f49b -
-
- -
- - brand-solidjs -
- ti ti-brand-solidjs
- \f5ee -
-
- -
- - brand-soundcloud -
- ti ti-brand-soundcloud
- \ed6e -
-
- -
- - brand-spacehey -
- ti ti-brand-spacehey
- \f4fc -
-
- -
- - brand-spotify -
- ti ti-brand-spotify
- \ed03 -
-
- -
- - brand-stackoverflow -
- ti ti-brand-stackoverflow
- \ef58 -
-
- -
- - brand-stackshare -
- ti ti-brand-stackshare
- \f607 -
-
- -
- - brand-steam -
- ti ti-brand-steam
- \ed6f -
-
- -
- - brand-storybook -
- ti ti-brand-storybook
- \f332 -
-
- -
- - brand-storytel -
- ti ti-brand-storytel
- \f608 -
-
- -
- - brand-strava -
- ti ti-brand-strava
- \f254 -
-
- -
- - brand-stripe -
- ti ti-brand-stripe
- \edd7 -
-
- -
- - brand-sublime-text -
- ti ti-brand-sublime-text
- \ef74 -
-
- -
- - brand-sugarizer -
- ti ti-brand-sugarizer
- \f7a5 -
-
- -
- - brand-supabase -
- ti ti-brand-supabase
- \f6d3 -
-
- -
- - brand-superhuman -
- ti ti-brand-superhuman
- \f50c -
-
- -
- - brand-supernova -
- ti ti-brand-supernova
- \f49c -
-
- -
- - brand-surfshark -
- ti ti-brand-surfshark
- \f255 -
-
- -
- - brand-svelte -
- ti ti-brand-svelte
- \f0df -
-
- -
- - brand-symfony -
- ti ti-brand-symfony
- \f616 -
-
- -
- - brand-tabler -
- ti ti-brand-tabler
- \ec8f -
-
- -
- - brand-tailwind -
- ti ti-brand-tailwind
- \eca1 -
-
- -
- - brand-taobao -
- ti ti-brand-taobao
- \f5ef -
-
- -
- - brand-ted -
- ti ti-brand-ted
- \f658 -
-
- -
- - brand-telegram -
- ti ti-brand-telegram
- \ec26 -
-
- -
- - brand-tether -
- ti ti-brand-tether
- \f5a3 -
-
- -
- - brand-threejs -
- ti ti-brand-threejs
- \f5f0 -
-
- -
- - brand-tidal -
- ti ti-brand-tidal
- \ed70 -
-
- -
- - brand-tikto-filled -
- ti ti-brand-tikto-filled
- \f7ea -
-
- -
- - brand-tiktok -
- ti ti-brand-tiktok
- \ec73 -
-
- -
- - brand-tinder -
- ti ti-brand-tinder
- \ed71 -
-
- -
- - brand-topbuzz -
- ti ti-brand-topbuzz
- \f50d -
-
- -
- - brand-torchain -
- ti ti-brand-torchain
- \f5a4 -
-
- -
- - brand-toyota -
- ti ti-brand-toyota
- \f262 -
-
- -
- - brand-trello -
- ti ti-brand-trello
- \f39d -
-
- -
- - brand-tripadvisor -
- ti ti-brand-tripadvisor
- \f002 -
-
- -
- - brand-tumblr -
- ti ti-brand-tumblr
- \ed04 -
-
- -
- - brand-twilio -
- ti ti-brand-twilio
- \f617 -
-
- -
- - brand-twitch -
- ti ti-brand-twitch
- \ed05 -
-
- -
- - brand-twitter -
- ti ti-brand-twitter
- \ec27 -
-
- -
- - brand-twitter-filled -
- ti ti-brand-twitter-filled
- \f7eb -
-
- -
- - brand-typescript -
- ti ti-brand-typescript
- \f5f1 -
-
- -
- - brand-uber -
- ti ti-brand-uber
- \ef75 -
-
- -
- - brand-ubuntu -
- ti ti-brand-ubuntu
- \ef59 -
-
- -
- - brand-unity -
- ti ti-brand-unity
- \f49d -
-
- -
- - brand-unsplash -
- ti ti-brand-unsplash
- \edd8 -
-
- -
- - brand-upwork -
- ti ti-brand-upwork
- \f39e -
-
- -
- - brand-valorant -
- ti ti-brand-valorant
- \f39f -
-
- -
- - brand-vercel -
- ti ti-brand-vercel
- \ef24 -
-
- -
- - brand-vimeo -
- ti ti-brand-vimeo
- \ed06 -
-
- -
- - brand-vinted -
- ti ti-brand-vinted
- \f20f -
-
- -
- - brand-visa -
- ti ti-brand-visa
- \f380 -
-
- -
- - brand-visual-studio -
- ti ti-brand-visual-studio
- \ef76 -
-
- -
- - brand-vite -
- ti ti-brand-vite
- \f5f2 -
-
- -
- - brand-vivaldi -
- ti ti-brand-vivaldi
- \f210 -
-
- -
- - brand-vk -
- ti ti-brand-vk
- \ed72 -
-
- -
- - brand-volkswagen -
- ti ti-brand-volkswagen
- \f50e -
-
- -
- - brand-vsco -
- ti ti-brand-vsco
- \f334 -
-
- -
- - brand-vscode -
- ti ti-brand-vscode
- \f3a0 -
-
- -
- - brand-vue -
- ti ti-brand-vue
- \f0e0 -
-
- -
- - brand-walmart -
- ti ti-brand-walmart
- \f211 -
-
- -
- - brand-waze -
- ti ti-brand-waze
- \f5d8 -
-
- -
- - brand-webflow -
- ti ti-brand-webflow
- \f2d2 -
-
- -
- - brand-wechat -
- ti ti-brand-wechat
- \f5f3 -
-
- -
- - brand-weibo -
- ti ti-brand-weibo
- \f609 -
-
- -
- - brand-whatsapp -
- ti ti-brand-whatsapp
- \ec74 -
-
- -
- - brand-windows -
- ti ti-brand-windows
- \ecd8 -
-
- -
- - brand-windy -
- ti ti-brand-windy
- \f4dd -
-
- -
- - brand-wish -
- ti ti-brand-wish
- \f212 -
-
- -
- - brand-wix -
- ti ti-brand-wix
- \f3a1 -
-
- -
- - brand-wordpress -
- ti ti-brand-wordpress
- \f2d3 -
-
- -
- - brand-xbox -
- ti ti-brand-xbox
- \f298 -
-
- -
- - brand-xing -
- ti ti-brand-xing
- \f21a -
-
- -
- - brand-yahoo -
- ti ti-brand-yahoo
- \ed73 -
-
- -
- - brand-yatse -
- ti ti-brand-yatse
- \f213 -
-
- -
- - brand-ycombinator -
- ti ti-brand-ycombinator
- \edd9 -
-
- -
- - brand-youtube -
- ti ti-brand-youtube
- \ec90 -
-
- -
- - brand-youtube-kids -
- ti ti-brand-youtube-kids
- \f214 -
-
- -
- - brand-zalando -
- ti ti-brand-zalando
- \f49e -
-
- -
- - brand-zapier -
- ti ti-brand-zapier
- \f49f -
-
- -
- - brand-zeit -
- ti ti-brand-zeit
- \f335 -
-
- -
- - brand-zhihu -
- ti ti-brand-zhihu
- \f60a -
-
- -
- - brand-zoom -
- ti ti-brand-zoom
- \f215 -
-
- -
- - brand-zulip -
- ti ti-brand-zulip
- \f4de -
-
- -
- - brand-zwift -
- ti ti-brand-zwift
- \f216 -
-
- -
- - bread -
- ti ti-bread
- \efa3 -
-
- -
- - bread-off -
- ti ti-bread-off
- \f3cb -
-
- -
- - briefcase -
- ti ti-briefcase
- \ea46 -
-
- -
- - briefcase-off -
- ti ti-briefcase-off
- \f3cc -
-
- -
- - brightness -
- ti ti-brightness
- \eb7f -
-
- -
- - brightness-2 -
- ti ti-brightness-2
- \ee19 -
-
- -
- - brightness-down -
- ti ti-brightness-down
- \eb7d -
-
- -
- - brightness-half -
- ti ti-brightness-half
- \ee1a -
-
- -
- - brightness-off -
- ti ti-brightness-off
- \f3cd -
-
- -
- - brightness-up -
- ti ti-brightness-up
- \eb7e -
-
- -
- - broadcast -
- ti ti-broadcast
- \f1e9 -
-
- -
- - broadcast-off -
- ti ti-broadcast-off
- \f1e8 -
-
- -
- - browser -
- ti ti-browser
- \ebb7 -
-
- -
- - browser-check -
- ti ti-browser-check
- \efd6 -
-
- -
- - browser-off -
- ti ti-browser-off
- \f0c1 -
-
- -
- - browser-plus -
- ti ti-browser-plus
- \efd7 -
-
- -
- - browser-x -
- ti ti-browser-x
- \efd8 -
-
- -
- - brush -
- ti ti-brush
- \ebb8 -
-
- -
- - brush-off -
- ti ti-brush-off
- \f0c2 -
-
- -
- - bucket -
- ti ti-bucket
- \ea47 -
-
- -
- - bucket-droplet -
- ti ti-bucket-droplet
- \f56a -
-
- -
- - bucket-off -
- ti ti-bucket-off
- \f103 -
-
- -
- - bug -
- ti ti-bug
- \ea48 -
-
- -
- - bug-off -
- ti ti-bug-off
- \f0c3 -
-
- -
- - building -
- ti ti-building
- \ea4f -
-
- -
- - building-arch -
- ti ti-building-arch
- \ea49 -
-
- -
- - building-bank -
- ti ti-building-bank
- \ebe2 -
-
- -
- - building-bridge -
- ti ti-building-bridge
- \ea4b -
-
- -
- - building-bridge-2 -
- ti ti-building-bridge-2
- \ea4a -
-
- -
- - building-broadcast-tower -
- ti ti-building-broadcast-tower
- \f4be -
-
- -
- - building-carousel -
- ti ti-building-carousel
- \ed87 -
-
- -
- - building-castle -
- ti ti-building-castle
- \ed88 -
-
- -
- - building-church -
- ti ti-building-church
- \ea4c -
-
- -
- - building-circus -
- ti ti-building-circus
- \f4bf -
-
- -
- - building-community -
- ti ti-building-community
- \ebf6 -
-
- -
- - building-cottage -
- ti ti-building-cottage
- \ee1b -
-
- -
- - building-estate -
- ti ti-building-estate
- \f5a5 -
-
- -
- - building-factory -
- ti ti-building-factory
- \ee1c -
-
- -
- - building-factory-2 -
- ti ti-building-factory-2
- \f082 -
-
- -
- - building-fortress -
- ti ti-building-fortress
- \ed89 -
-
- -
- - building-hospital -
- ti ti-building-hospital
- \ea4d -
-
- -
- - building-lighthouse -
- ti ti-building-lighthouse
- \ed8a -
-
- -
- - building-monument -
- ti ti-building-monument
- \ed26 -
-
- -
- - building-pavilion -
- ti ti-building-pavilion
- \ebf7 -
-
- -
- - building-skyscraper -
- ti ti-building-skyscraper
- \ec39 -
-
- -
- - building-stadium -
- ti ti-building-stadium
- \f641 -
-
- -
- - building-store -
- ti ti-building-store
- \ea4e -
-
- -
- - building-tunnel -
- ti ti-building-tunnel
- \f5a6 -
-
- -
- - building-warehouse -
- ti ti-building-warehouse
- \ebe3 -
-
- -
- - building-wind-turbine -
- ti ti-building-wind-turbine
- \f4c0 -
-
- -
- - bulb -
- ti ti-bulb
- \ea51 -
-
- -
- - bulb-filled -
- ti ti-bulb-filled
- \f66a -
-
- -
- - bulb-off -
- ti ti-bulb-off
- \ea50 -
-
- -
- - bulldozer -
- ti ti-bulldozer
- \ee1d -
-
- -
- - bus -
- ti ti-bus
- \ebe4 -
-
- -
- - bus-off -
- ti ti-bus-off
- \f3ce -
-
- -
- - bus-stop -
- ti ti-bus-stop
- \f2d4 -
-
- -
- - businessplan -
- ti ti-businessplan
- \ee1e -
-
- -
- - butterfly -
- ti ti-butterfly
- \efd9 -
-
- -
- - cactus -
- ti ti-cactus
- \f21b -
-
- -
- - cactus-off -
- ti ti-cactus-off
- \f3cf -
-
- -
- - cake -
- ti ti-cake
- \f00f -
-
- -
- - cake-off -
- ti ti-cake-off
- \f104 -
-
- -
- - calculator -
- ti ti-calculator
- \eb80 -
-
- -
- - calculator-off -
- ti ti-calculator-off
- \f0c4 -
-
- -
- - calendar -
- ti ti-calendar
- \ea53 -
-
- -
- - calendar-bolt -
- ti ti-calendar-bolt
- \f822 -
-
- -
- - calendar-cancel -
- ti ti-calendar-cancel
- \f823 -
-
- -
- - calendar-check -
- ti ti-calendar-check
- \f824 -
-
- -
- - calendar-code -
- ti ti-calendar-code
- \f825 -
-
- -
- - calendar-cog -
- ti ti-calendar-cog
- \f826 -
-
- -
- - calendar-dollar -
- ti ti-calendar-dollar
- \f827 -
-
- -
- - calendar-down -
- ti ti-calendar-down
- \f828 -
-
- -
- - calendar-due -
- ti ti-calendar-due
- \f621 -
-
- -
- - calendar-event -
- ti ti-calendar-event
- \ea52 -
-
- -
- - calendar-exclamation -
- ti ti-calendar-exclamation
- \f829 -
-
- -
- - calendar-heart -
- ti ti-calendar-heart
- \f82a -
-
- -
- - calendar-minus -
- ti ti-calendar-minus
- \ebb9 -
-
- -
- - calendar-off -
- ti ti-calendar-off
- \ee1f -
-
- -
- - calendar-pause -
- ti ti-calendar-pause
- \f82b -
-
- -
- - calendar-pin -
- ti ti-calendar-pin
- \f82c -
-
- -
- - calendar-plus -
- ti ti-calendar-plus
- \ebba -
-
- -
- - calendar-question -
- ti ti-calendar-question
- \f82d -
-
- -
- - calendar-search -
- ti ti-calendar-search
- \f82e -
-
- -
- - calendar-share -
- ti ti-calendar-share
- \f82f -
-
- -
- - calendar-star -
- ti ti-calendar-star
- \f830 -
-
- -
- - calendar-stats -
- ti ti-calendar-stats
- \ee20 -
-
- -
- - calendar-time -
- ti ti-calendar-time
- \ee21 -
-
- -
- - calendar-up -
- ti ti-calendar-up
- \f831 -
-
- -
- - calendar-x -
- ti ti-calendar-x
- \f832 -
-
- -
- - camera -
- ti ti-camera
- \ea54 -
-
- -
- - camera-bolt -
- ti ti-camera-bolt
- \f833 -
-
- -
- - camera-cancel -
- ti ti-camera-cancel
- \f834 -
-
- -
- - camera-check -
- ti ti-camera-check
- \f835 -
-
- -
- - camera-code -
- ti ti-camera-code
- \f836 -
-
- -
- - camera-cog -
- ti ti-camera-cog
- \f837 -
-
- -
- - camera-dollar -
- ti ti-camera-dollar
- \f838 -
-
- -
- - camera-down -
- ti ti-camera-down
- \f839 -
-
- -
- - camera-exclamation -
- ti ti-camera-exclamation
- \f83a -
-
- -
- - camera-heart -
- ti ti-camera-heart
- \f83b -
-
- -
- - camera-minus -
- ti ti-camera-minus
- \ec3a -
-
- -
- - camera-off -
- ti ti-camera-off
- \ecee -
-
- -
- - camera-pause -
- ti ti-camera-pause
- \f83c -
-
- -
- - camera-pin -
- ti ti-camera-pin
- \f83d -
-
- -
- - camera-plus -
- ti ti-camera-plus
- \ec3b -
-
- -
- - camera-question -
- ti ti-camera-question
- \f83e -
-
- -
- - camera-rotate -
- ti ti-camera-rotate
- \ee22 -
-
- -
- - camera-search -
- ti ti-camera-search
- \f83f -
-
- -
- - camera-selfie -
- ti ti-camera-selfie
- \ee23 -
-
- -
- - camera-share -
- ti ti-camera-share
- \f840 -
-
- -
- - camera-star -
- ti ti-camera-star
- \f841 -
-
- -
- - camera-up -
- ti ti-camera-up
- \f842 -
-
- -
- - camera-x -
- ti ti-camera-x
- \f843 -
-
- -
- - campfire -
- ti ti-campfire
- \f5a7 -
-
- -
- - candle -
- ti ti-candle
- \efc6 -
-
- -
- - candy -
- ti ti-candy
- \ef0d -
-
- -
- - candy-off -
- ti ti-candy-off
- \f0c5 -
-
- -
- - cane -
- ti ti-cane
- \f50f -
-
- -
- - cannabis -
- ti ti-cannabis
- \f4c1 -
-
- -
- - capture -
- ti ti-capture
- \ec3c -
-
- -
- - capture-off -
- ti ti-capture-off
- \f0c6 -
-
- -
- - car -
- ti ti-car
- \ebbb -
-
- -
- - car-crane -
- ti ti-car-crane
- \ef25 -
-
- -
- - car-crash -
- ti ti-car-crash
- \efa4 -
-
- -
- - car-off -
- ti ti-car-off
- \f0c7 -
-
- -
- - car-turbine -
- ti ti-car-turbine
- \f4fd -
-
- -
- - caravan -
- ti ti-caravan
- \ec7c -
-
- -
- - cardboards -
- ti ti-cardboards
- \ed74 -
-
- -
- - cardboards-off -
- ti ti-cardboards-off
- \f0c8 -
-
- -
- - cards -
- ti ti-cards
- \f510 -
-
- -
- - caret-down -
- ti ti-caret-down
- \eb5d -
-
- -
- - caret-left -
- ti ti-caret-left
- \eb5e -
-
- -
- - caret-right -
- ti ti-caret-right
- \eb5f -
-
- -
- - caret-up -
- ti ti-caret-up
- \eb60 -
-
- -
- - carousel-horizontal -
- ti ti-carousel-horizontal
- \f659 -
-
- -
- - carousel-vertical -
- ti ti-carousel-vertical
- \f65a -
-
- -
- - carrot -
- ti ti-carrot
- \f21c -
-
- -
- - carrot-off -
- ti ti-carrot-off
- \f3d0 -
-
- -
- - cash -
- ti ti-cash
- \ea55 -
-
- -
- - cash-banknote -
- ti ti-cash-banknote
- \ee25 -
-
- -
- - cash-banknote-off -
- ti ti-cash-banknote-off
- \ee24 -
-
- -
- - cash-off -
- ti ti-cash-off
- \f105 -
-
- -
- - cast -
- ti ti-cast
- \ea56 -
-
- -
- - cast-off -
- ti ti-cast-off
- \f0c9 -
-
- -
- - cat -
- ti ti-cat
- \f65b -
-
- -
- - category -
- ti ti-category
- \f1f6 -
-
- -
- - category-2 -
- ti ti-category-2
- \f1f5 -
-
- -
- - ce -
- ti ti-ce
- \ed75 -
-
- -
- - ce-off -
- ti ti-ce-off
- \f0ca -
-
- -
- - cell -
- ti ti-cell
- \f05f -
-
- -
- - cell-signal-1 -
- ti ti-cell-signal-1
- \f083 -
-
- -
- - cell-signal-2 -
- ti ti-cell-signal-2
- \f084 -
-
- -
- - cell-signal-3 -
- ti ti-cell-signal-3
- \f085 -
-
- -
- - cell-signal-4 -
- ti ti-cell-signal-4
- \f086 -
-
- -
- - cell-signal-5 -
- ti ti-cell-signal-5
- \f087 -
-
- -
- - cell-signal-off -
- ti ti-cell-signal-off
- \f088 -
-
- -
- - certificate -
- ti ti-certificate
- \ed76 -
-
- -
- - certificate-2 -
- ti ti-certificate-2
- \f073 -
-
- -
- - certificate-2-off -
- ti ti-certificate-2-off
- \f0cb -
-
- -
- - certificate-off -
- ti ti-certificate-off
- \f0cc -
-
- -
- - chair-director -
- ti ti-chair-director
- \f2d5 -
-
- -
- - chalkboard -
- ti ti-chalkboard
- \f34d -
-
- -
- - chalkboard-off -
- ti ti-chalkboard-off
- \f3d1 -
-
- -
- - charging-pile -
- ti ti-charging-pile
- \ee26 -
-
- -
- - chart-arcs -
- ti ti-chart-arcs
- \ee28 -
-
- -
- - chart-arcs-3 -
- ti ti-chart-arcs-3
- \ee27 -
-
- -
- - chart-area -
- ti ti-chart-area
- \ea58 -
-
- -
- - chart-area-filled -
- ti ti-chart-area-filled
- \f66b -
-
- -
- - chart-area-line -
- ti ti-chart-area-line
- \ea57 -
-
- -
- - chart-area-line-filled -
- ti ti-chart-area-line-filled
- \f66c -
-
- -
- - chart-arrows -
- ti ti-chart-arrows
- \ee2a -
-
- -
- - chart-arrows-vertical -
- ti ti-chart-arrows-vertical
- \ee29 -
-
- -
- - chart-bar -
- ti ti-chart-bar
- \ea59 -
-
- -
- - chart-bar-off -
- ti ti-chart-bar-off
- \f3d2 -
-
- -
- - chart-bubble -
- ti ti-chart-bubble
- \ec75 -
-
- -
- - chart-bubble-filled -
- ti ti-chart-bubble-filled
- \f66d -
-
- -
- - chart-candle -
- ti ti-chart-candle
- \ea5a -
-
- -
- - chart-candle-filled -
- ti ti-chart-candle-filled
- \f66e -
-
- -
- - chart-circles -
- ti ti-chart-circles
- \ee2b -
-
- -
- - chart-donut -
- ti ti-chart-donut
- \ea5b -
-
- -
- - chart-donut-2 -
- ti ti-chart-donut-2
- \ee2c -
-
- -
- - chart-donut-3 -
- ti ti-chart-donut-3
- \ee2d -
-
- -
- - chart-donut-4 -
- ti ti-chart-donut-4
- \ee2e -
-
- -
- - chart-donut-filled -
- ti ti-chart-donut-filled
- \f66f -
-
- -
- - chart-dots -
- ti ti-chart-dots
- \ee2f -
-
- -
- - chart-dots-2 -
- ti ti-chart-dots-2
- \f097 -
-
- -
- - chart-dots-3 -
- ti ti-chart-dots-3
- \f098 -
-
- -
- - chart-grid-dots -
- ti ti-chart-grid-dots
- \f4c2 -
-
- -
- - chart-histogram -
- ti ti-chart-histogram
- \f65c -
-
- -
- - chart-infographic -
- ti ti-chart-infographic
- \ee30 -
-
- -
- - chart-line -
- ti ti-chart-line
- \ea5c -
-
- -
- - chart-pie -
- ti ti-chart-pie
- \ea5d -
-
- -
- - chart-pie-2 -
- ti ti-chart-pie-2
- \ee31 -
-
- -
- - chart-pie-3 -
- ti ti-chart-pie-3
- \ee32 -
-
- -
- - chart-pie-4 -
- ti ti-chart-pie-4
- \ee33 -
-
- -
- - chart-pie-filled -
- ti ti-chart-pie-filled
- \f670 -
-
- -
- - chart-pie-off -
- ti ti-chart-pie-off
- \f3d3 -
-
- -
- - chart-ppf -
- ti ti-chart-ppf
- \f618 -
-
- -
- - chart-radar -
- ti ti-chart-radar
- \ed77 -
-
- -
- - chart-sankey -
- ti ti-chart-sankey
- \f619 -
-
- -
- - chart-treemap -
- ti ti-chart-treemap
- \f381 -
-
- -
- - check -
- ti ti-check
- \ea5e -
-
- -
- - checkbox -
- ti ti-checkbox
- \eba6 -
-
- -
- - checklist -
- ti ti-checklist
- \f074 -
-
- -
- - checks -
- ti ti-checks
- \ebaa -
-
- -
- - checkup-list -
- ti ti-checkup-list
- \ef5a -
-
- -
- - cheese -
- ti ti-cheese
- \ef26 -
-
- -
- - chef-hat -
- ti ti-chef-hat
- \f21d -
-
- -
- - chef-hat-off -
- ti ti-chef-hat-off
- \f3d4 -
-
- -
- - cherry -
- ti ti-cherry
- \f511 -
-
- -
- - cherry-filled -
- ti ti-cherry-filled
- \f728 -
-
- -
- - chess -
- ti ti-chess
- \f382 -
-
- -
- - chess-bishop -
- ti ti-chess-bishop
- \f56b -
-
- -
- - chess-bishop-filled -
- ti ti-chess-bishop-filled
- \f729 -
-
- -
- - chess-filled -
- ti ti-chess-filled
- \f72a -
-
- -
- - chess-king -
- ti ti-chess-king
- \f56c -
-
- -
- - chess-king-filled -
- ti ti-chess-king-filled
- \f72b -
-
- -
- - chess-knight -
- ti ti-chess-knight
- \f56d -
-
- -
- - chess-knight-filled -
- ti ti-chess-knight-filled
- \f72c -
-
- -
- - chess-queen -
- ti ti-chess-queen
- \f56e -
-
- -
- - chess-queen-filled -
- ti ti-chess-queen-filled
- \f72d -
-
- -
- - chess-rook -
- ti ti-chess-rook
- \f56f -
-
- -
- - chess-rook-filled -
- ti ti-chess-rook-filled
- \f72e -
-
- -
- - chevron-down -
- ti ti-chevron-down
- \ea5f -
-
- -
- - chevron-down-left -
- ti ti-chevron-down-left
- \ed09 -
-
- -
- - chevron-down-right -
- ti ti-chevron-down-right
- \ed0a -
-
- -
- - chevron-left -
- ti ti-chevron-left
- \ea60 -
-
- -
- - chevron-right -
- ti ti-chevron-right
- \ea61 -
-
- -
- - chevron-up -
- ti ti-chevron-up
- \ea62 -
-
- -
- - chevron-up-left -
- ti ti-chevron-up-left
- \ed0b -
-
- -
- - chevron-up-right -
- ti ti-chevron-up-right
- \ed0c -
-
- -
- - chevrons-down -
- ti ti-chevrons-down
- \ea63 -
-
- -
- - chevrons-down-left -
- ti ti-chevrons-down-left
- \ed0d -
-
- -
- - chevrons-down-right -
- ti ti-chevrons-down-right
- \ed0e -
-
- -
- - chevrons-left -
- ti ti-chevrons-left
- \ea64 -
-
- -
- - chevrons-right -
- ti ti-chevrons-right
- \ea65 -
-
- -
- - chevrons-up -
- ti ti-chevrons-up
- \ea66 -
-
- -
- - chevrons-up-left -
- ti ti-chevrons-up-left
- \ed0f -
-
- -
- - chevrons-up-right -
- ti ti-chevrons-up-right
- \ed10 -
-
- -
- - chisel -
- ti ti-chisel
- \f383 -
-
- -
- - christmas-tree -
- ti ti-christmas-tree
- \ed78 -
-
- -
- - christmas-tree-off -
- ti ti-christmas-tree-off
- \f3d5 -
-
- -
- - circle -
- ti ti-circle
- \ea6b -
-
- -
- - circle-0-filled -
- ti ti-circle-0-filled
- \f72f -
-
- -
- - circle-1-filled -
- ti ti-circle-1-filled
- \f730 -
-
- -
- - circle-2-filled -
- ti ti-circle-2-filled
- \f731 -
-
- -
- - circle-3-filled -
- ti ti-circle-3-filled
- \f732 -
-
- -
- - circle-4-filled -
- ti ti-circle-4-filled
- \f733 -
-
- -
- - circle-5-filled -
- ti ti-circle-5-filled
- \f734 -
-
- -
- - circle-6-filled -
- ti ti-circle-6-filled
- \f735 -
-
- -
- - circle-7-filled -
- ti ti-circle-7-filled
- \f736 -
-
- -
- - circle-8-filled -
- ti ti-circle-8-filled
- \f737 -
-
- -
- - circle-9-filled -
- ti ti-circle-9-filled
- \f738 -
-
- -
- - circle-arrow-down -
- ti ti-circle-arrow-down
- \f6f9 -
-
- -
- - circle-arrow-down-filled -
- ti ti-circle-arrow-down-filled
- \f6f4 -
-
- -
- - circle-arrow-down-left -
- ti ti-circle-arrow-down-left
- \f6f6 -
-
- -
- - circle-arrow-down-left-filled -
- ti ti-circle-arrow-down-left-filled
- \f6f5 -
-
- -
- - circle-arrow-down-right -
- ti ti-circle-arrow-down-right
- \f6f8 -
-
- -
- - circle-arrow-down-right-filled -
- ti ti-circle-arrow-down-right-filled
- \f6f7 -
-
- -
- - circle-arrow-left -
- ti ti-circle-arrow-left
- \f6fb -
-
- -
- - circle-arrow-left-filled -
- ti ti-circle-arrow-left-filled
- \f6fa -
-
- -
- - circle-arrow-right -
- ti ti-circle-arrow-right
- \f6fd -
-
- -
- - circle-arrow-right-filled -
- ti ti-circle-arrow-right-filled
- \f6fc -
-
- -
- - circle-arrow-up -
- ti ti-circle-arrow-up
- \f703 -
-
- -
- - circle-arrow-up-filled -
- ti ti-circle-arrow-up-filled
- \f6fe -
-
- -
- - circle-arrow-up-left -
- ti ti-circle-arrow-up-left
- \f700 -
-
- -
- - circle-arrow-up-left-filled -
- ti ti-circle-arrow-up-left-filled
- \f6ff -
-
- -
- - circle-arrow-up-right -
- ti ti-circle-arrow-up-right
- \f702 -
-
- -
- - circle-arrow-up-right-filled -
- ti ti-circle-arrow-up-right-filled
- \f701 -
-
- -
- - circle-caret-down -
- ti ti-circle-caret-down
- \f4a9 -
-
- -
- - circle-caret-left -
- ti ti-circle-caret-left
- \f4aa -
-
- -
- - circle-caret-right -
- ti ti-circle-caret-right
- \f4ab -
-
- -
- - circle-caret-up -
- ti ti-circle-caret-up
- \f4ac -
-
- -
- - circle-check -
- ti ti-circle-check
- \ea67 -
-
- -
- - circle-check-filled -
- ti ti-circle-check-filled
- \f704 -
-
- -
- - circle-chevron-down -
- ti ti-circle-chevron-down
- \f622 -
-
- -
- - circle-chevron-left -
- ti ti-circle-chevron-left
- \f623 -
-
- -
- - circle-chevron-right -
- ti ti-circle-chevron-right
- \f624 -
-
- -
- - circle-chevron-up -
- ti ti-circle-chevron-up
- \f625 -
-
- -
- - circle-chevrons-down -
- ti ti-circle-chevrons-down
- \f642 -
-
- -
- - circle-chevrons-left -
- ti ti-circle-chevrons-left
- \f643 -
-
- -
- - circle-chevrons-right -
- ti ti-circle-chevrons-right
- \f644 -
-
- -
- - circle-chevrons-up -
- ti ti-circle-chevrons-up
- \f645 -
-
- -
- - circle-dashed -
- ti ti-circle-dashed
- \ed27 -
-
- -
- - circle-dot -
- ti ti-circle-dot
- \efb1 -
-
- -
- - circle-dot-filled -
- ti ti-circle-dot-filled
- \f705 -
-
- -
- - circle-dotted -
- ti ti-circle-dotted
- \ed28 -
-
- -
- - circle-filled -
- ti ti-circle-filled
- \f671 -
-
- -
- - circle-half -
- ti ti-circle-half
- \ee3f -
-
- -
- - circle-half-2 -
- ti ti-circle-half-2
- \eff3 -
-
- -
- - circle-half-vertical -
- ti ti-circle-half-vertical
- \ee3e -
-
- -
- - circle-key -
- ti ti-circle-key
- \f633 -
-
- -
- - circle-key-filled -
- ti ti-circle-key-filled
- \f706 -
-
- -
- - circle-letter-a -
- ti ti-circle-letter-a
- \f441 -
-
- -
- - circle-letter-b -
- ti ti-circle-letter-b
- \f442 -
-
- -
- - circle-letter-c -
- ti ti-circle-letter-c
- \f443 -
-
- -
- - circle-letter-d -
- ti ti-circle-letter-d
- \f444 -
-
- -
- - circle-letter-e -
- ti ti-circle-letter-e
- \f445 -
-
- -
- - circle-letter-f -
- ti ti-circle-letter-f
- \f446 -
-
- -
- - circle-letter-g -
- ti ti-circle-letter-g
- \f447 -
-
- -
- - circle-letter-h -
- ti ti-circle-letter-h
- \f448 -
-
- -
- - circle-letter-i -
- ti ti-circle-letter-i
- \f449 -
-
- -
- - circle-letter-j -
- ti ti-circle-letter-j
- \f44a -
-
- -
- - circle-letter-k -
- ti ti-circle-letter-k
- \f44b -
-
- -
- - circle-letter-l -
- ti ti-circle-letter-l
- \f44c -
-
- -
- - circle-letter-m -
- ti ti-circle-letter-m
- \f44d -
-
- -
- - circle-letter-n -
- ti ti-circle-letter-n
- \f44e -
-
- -
- - circle-letter-o -
- ti ti-circle-letter-o
- \f44f -
-
- -
- - circle-letter-p -
- ti ti-circle-letter-p
- \f450 -
-
- -
- - circle-letter-q -
- ti ti-circle-letter-q
- \f451 -
-
- -
- - circle-letter-r -
- ti ti-circle-letter-r
- \f452 -
-
- -
- - circle-letter-s -
- ti ti-circle-letter-s
- \f453 -
-
- -
- - circle-letter-t -
- ti ti-circle-letter-t
- \f454 -
-
- -
- - circle-letter-u -
- ti ti-circle-letter-u
- \f455 -
-
- -
- - circle-letter-v -
- ti ti-circle-letter-v
- \f4ad -
-
- -
- - circle-letter-w -
- ti ti-circle-letter-w
- \f456 -
-
- -
- - circle-letter-x -
- ti ti-circle-letter-x
- \f4ae -
-
- -
- - circle-letter-y -
- ti ti-circle-letter-y
- \f457 -
-
- -
- - circle-letter-z -
- ti ti-circle-letter-z
- \f458 -
-
- -
- - circle-minus -
- ti ti-circle-minus
- \ea68 -
-
- -
- - circle-number-0 -
- ti ti-circle-number-0
- \ee34 -
-
- -
- - circle-number-1 -
- ti ti-circle-number-1
- \ee35 -
-
- -
- - circle-number-2 -
- ti ti-circle-number-2
- \ee36 -
-
- -
- - circle-number-3 -
- ti ti-circle-number-3
- \ee37 -
-
- -
- - circle-number-4 -
- ti ti-circle-number-4
- \ee38 -
-
- -
- - circle-number-5 -
- ti ti-circle-number-5
- \ee39 -
-
- -
- - circle-number-6 -
- ti ti-circle-number-6
- \ee3a -
-
- -
- - circle-number-7 -
- ti ti-circle-number-7
- \ee3b -
-
- -
- - circle-number-8 -
- ti ti-circle-number-8
- \ee3c -
-
- -
- - circle-number-9 -
- ti ti-circle-number-9
- \ee3d -
-
- -
- - circle-off -
- ti ti-circle-off
- \ee40 -
-
- -
- - circle-plus -
- ti ti-circle-plus
- \ea69 -
-
- -
- - circle-rectangle -
- ti ti-circle-rectangle
- \f010 -
-
- -
- - circle-rectangle-off -
- ti ti-circle-rectangle-off
- \f0cd -
-
- -
- - circle-square -
- ti ti-circle-square
- \ece4 -
-
- -
- - circle-triangle -
- ti ti-circle-triangle
- \f011 -
-
- -
- - circle-x -
- ti ti-circle-x
- \ea6a -
-
- -
- - circle-x-filled -
- ti ti-circle-x-filled
- \f739 -
-
- -
- - circles -
- ti ti-circles
- \ece5 -
-
- -
- - circles-filled -
- ti ti-circles-filled
- \f672 -
-
- -
- - circles-relation -
- ti ti-circles-relation
- \f4c3 -
-
- -
- - circuit-ammeter -
- ti ti-circuit-ammeter
- \f271 -
-
- -
- - circuit-battery -
- ti ti-circuit-battery
- \f272 -
-
- -
- - circuit-bulb -
- ti ti-circuit-bulb
- \f273 -
-
- -
- - circuit-capacitor -
- ti ti-circuit-capacitor
- \f275 -
-
- -
- - circuit-capacitor-polarized -
- ti ti-circuit-capacitor-polarized
- \f274 -
-
- -
- - circuit-cell -
- ti ti-circuit-cell
- \f277 -
-
- -
- - circuit-cell-plus -
- ti ti-circuit-cell-plus
- \f276 -
-
- -
- - circuit-changeover -
- ti ti-circuit-changeover
- \f278 -
-
- -
- - circuit-diode -
- ti ti-circuit-diode
- \f27a -
-
- -
- - circuit-diode-zener -
- ti ti-circuit-diode-zener
- \f279 -
-
- -
- - circuit-ground -
- ti ti-circuit-ground
- \f27c -
-
- -
- - circuit-ground-digital -
- ti ti-circuit-ground-digital
- \f27b -
-
- -
- - circuit-inductor -
- ti ti-circuit-inductor
- \f27d -
-
- -
- - circuit-motor -
- ti ti-circuit-motor
- \f27e -
-
- -
- - circuit-pushbutton -
- ti ti-circuit-pushbutton
- \f27f -
-
- -
- - circuit-resistor -
- ti ti-circuit-resistor
- \f280 -
-
- -
- - circuit-switch-closed -
- ti ti-circuit-switch-closed
- \f281 -
-
- -
- - circuit-switch-open -
- ti ti-circuit-switch-open
- \f282 -
-
- -
- - circuit-voltmeter -
- ti ti-circuit-voltmeter
- \f283 -
-
- -
- - clear-all -
- ti ti-clear-all
- \ee41 -
-
- -
- - clear-formatting -
- ti ti-clear-formatting
- \ebe5 -
-
- -
- - click -
- ti ti-click
- \ebbc -
-
- -
- - clipboard -
- ti ti-clipboard
- \ea6f -
-
- -
- - clipboard-check -
- ti ti-clipboard-check
- \ea6c -
-
- -
- - clipboard-copy -
- ti ti-clipboard-copy
- \f299 -
-
- -
- - clipboard-data -
- ti ti-clipboard-data
- \f563 -
-
- -
- - clipboard-heart -
- ti ti-clipboard-heart
- \f34e -
-
- -
- - clipboard-list -
- ti ti-clipboard-list
- \ea6d -
-
- -
- - clipboard-off -
- ti ti-clipboard-off
- \f0ce -
-
- -
- - clipboard-plus -
- ti ti-clipboard-plus
- \efb2 -
-
- -
- - clipboard-text -
- ti ti-clipboard-text
- \f089 -
-
- -
- - clipboard-typography -
- ti ti-clipboard-typography
- \f34f -
-
- -
- - clipboard-x -
- ti ti-clipboard-x
- \ea6e -
-
- -
- - clock -
- ti ti-clock
- \ea70 -
-
- -
- - clock-2 -
- ti ti-clock-2
- \f099 -
-
- -
- - clock-bolt -
- ti ti-clock-bolt
- \f844 -
-
- -
- - clock-cancel -
- ti ti-clock-cancel
- \f546 -
-
- -
- - clock-check -
- ti ti-clock-check
- \f7c1 -
-
- -
- - clock-code -
- ti ti-clock-code
- \f845 -
-
- -
- - clock-cog -
- ti ti-clock-cog
- \f7c2 -
-
- -
- - clock-dollar -
- ti ti-clock-dollar
- \f846 -
-
- -
- - clock-down -
- ti ti-clock-down
- \f7c3 -
-
- -
- - clock-edit -
- ti ti-clock-edit
- \f547 -
-
- -
- - clock-exclamation -
- ti ti-clock-exclamation
- \f847 -
-
- -
- - clock-filled -
- ti ti-clock-filled
- \f73a -
-
- -
- - clock-heart -
- ti ti-clock-heart
- \f7c4 -
-
- -
- - clock-hour-1 -
- ti ti-clock-hour-1
- \f313 -
-
- -
- - clock-hour-10 -
- ti ti-clock-hour-10
- \f314 -
-
- -
- - clock-hour-11 -
- ti ti-clock-hour-11
- \f315 -
-
- -
- - clock-hour-12 -
- ti ti-clock-hour-12
- \f316 -
-
- -
- - clock-hour-2 -
- ti ti-clock-hour-2
- \f317 -
-
- -
- - clock-hour-3 -
- ti ti-clock-hour-3
- \f318 -
-
- -
- - clock-hour-4 -
- ti ti-clock-hour-4
- \f319 -
-
- -
- - clock-hour-5 -
- ti ti-clock-hour-5
- \f31a -
-
- -
- - clock-hour-6 -
- ti ti-clock-hour-6
- \f31b -
-
- -
- - clock-hour-7 -
- ti ti-clock-hour-7
- \f31c -
-
- -
- - clock-hour-8 -
- ti ti-clock-hour-8
- \f31d -
-
- -
- - clock-hour-9 -
- ti ti-clock-hour-9
- \f31e -
-
- -
- - clock-minus -
- ti ti-clock-minus
- \f848 -
-
- -
- - clock-off -
- ti ti-clock-off
- \f0cf -
-
- -
- - clock-pause -
- ti ti-clock-pause
- \f548 -
-
- -
- - clock-pin -
- ti ti-clock-pin
- \f849 -
-
- -
- - clock-play -
- ti ti-clock-play
- \f549 -
-
- -
- - clock-plus -
- ti ti-clock-plus
- \f7c5 -
-
- -
- - clock-question -
- ti ti-clock-question
- \f7c6 -
-
- -
- - clock-record -
- ti ti-clock-record
- \f54a -
-
- -
- - clock-search -
- ti ti-clock-search
- \f7c7 -
-
- -
- - clock-share -
- ti ti-clock-share
- \f84a -
-
- -
- - clock-shield -
- ti ti-clock-shield
- \f7c8 -
-
- -
- - clock-star -
- ti ti-clock-star
- \f7c9 -
-
- -
- - clock-stop -
- ti ti-clock-stop
- \f54b -
-
- -
- - clock-up -
- ti ti-clock-up
- \f7ca -
-
- -
- - clock-x -
- ti ti-clock-x
- \f7cb -
-
- -
- - clothes-rack -
- ti ti-clothes-rack
- \f285 -
-
- -
- - clothes-rack-off -
- ti ti-clothes-rack-off
- \f3d6 -
-
- -
- - cloud -
- ti ti-cloud
- \ea76 -
-
- -
- - cloud-bolt -
- ti ti-cloud-bolt
- \f84b -
-
- -
- - cloud-cancel -
- ti ti-cloud-cancel
- \f84c -
-
- -
- - cloud-check -
- ti ti-cloud-check
- \f84d -
-
- -
- - cloud-code -
- ti ti-cloud-code
- \f84e -
-
- -
- - cloud-cog -
- ti ti-cloud-cog
- \f84f -
-
- -
- - cloud-computing -
- ti ti-cloud-computing
- \f1d0 -
-
- -
- - cloud-data-connection -
- ti ti-cloud-data-connection
- \f1d1 -
-
- -
- - cloud-dollar -
- ti ti-cloud-dollar
- \f850 -
-
- -
- - cloud-down -
- ti ti-cloud-down
- \f851 -
-
- -
- - cloud-download -
- ti ti-cloud-download
- \ea71 -
-
- -
- - cloud-exclamation -
- ti ti-cloud-exclamation
- \f852 -
-
- -
- - cloud-filled -
- ti ti-cloud-filled
- \f673 -
-
- -
- - cloud-fog -
- ti ti-cloud-fog
- \ecd9 -
-
- -
- - cloud-heart -
- ti ti-cloud-heart
- \f853 -
-
- -
- - cloud-lock -
- ti ti-cloud-lock
- \efdb -
-
- -
- - cloud-lock-open -
- ti ti-cloud-lock-open
- \efda -
-
- -
- - cloud-minus -
- ti ti-cloud-minus
- \f854 -
-
- -
- - cloud-off -
- ti ti-cloud-off
- \ed3e -
-
- -
- - cloud-pause -
- ti ti-cloud-pause
- \f855 -
-
- -
- - cloud-pin -
- ti ti-cloud-pin
- \f856 -
-
- -
- - cloud-plus -
- ti ti-cloud-plus
- \f857 -
-
- -
- - cloud-question -
- ti ti-cloud-question
- \f858 -
-
- -
- - cloud-rain -
- ti ti-cloud-rain
- \ea72 -
-
- -
- - cloud-search -
- ti ti-cloud-search
- \f859 -
-
- -
- - cloud-share -
- ti ti-cloud-share
- \f85a -
-
- -
- - cloud-snow -
- ti ti-cloud-snow
- \ea73 -
-
- -
- - cloud-star -
- ti ti-cloud-star
- \f85b -
-
- -
- - cloud-storm -
- ti ti-cloud-storm
- \ea74 -
-
- -
- - cloud-up -
- ti ti-cloud-up
- \f85c -
-
- -
- - cloud-upload -
- ti ti-cloud-upload
- \ea75 -
-
- -
- - cloud-x -
- ti ti-cloud-x
- \f85d -
-
- -
- - clover -
- ti ti-clover
- \f1ea -
-
- -
- - clover-2 -
- ti ti-clover-2
- \f21e -
-
- -
- - clubs -
- ti ti-clubs
- \eff4 -
-
- -
- - clubs-filled -
- ti ti-clubs-filled
- \f674 -
-
- -
- - code -
- ti ti-code
- \ea77 -
-
- -
- - code-asterix -
- ti ti-code-asterix
- \f312 -
-
- -
- - code-circle -
- ti ti-code-circle
- \f4ff -
-
- -
- - code-circle-2 -
- ti ti-code-circle-2
- \f4fe -
-
- -
- - code-dots -
- ti ti-code-dots
- \f61a -
-
- -
- - code-minus -
- ti ti-code-minus
- \ee42 -
-
- -
- - code-off -
- ti ti-code-off
- \f0d0 -
-
- -
- - code-plus -
- ti ti-code-plus
- \ee43 -
-
- -
- - coffee -
- ti ti-coffee
- \ef0e -
-
- -
- - coffee-off -
- ti ti-coffee-off
- \f106 -
-
- -
- - coffin -
- ti ti-coffin
- \f579 -
-
- -
- - coin -
- ti ti-coin
- \eb82 -
-
- -
- - coin-bitcoin -
- ti ti-coin-bitcoin
- \f2be -
-
- -
- - coin-euro -
- ti ti-coin-euro
- \f2bf -
-
- -
- - coin-monero -
- ti ti-coin-monero
- \f4a0 -
-
- -
- - coin-off -
- ti ti-coin-off
- \f0d1 -
-
- -
- - coin-pound -
- ti ti-coin-pound
- \f2c0 -
-
- -
- - coin-rupee -
- ti ti-coin-rupee
- \f2c1 -
-
- -
- - coin-yen -
- ti ti-coin-yen
- \f2c2 -
-
- -
- - coin-yuan -
- ti ti-coin-yuan
- \f2c3 -
-
- -
- - coins -
- ti ti-coins
- \f65d -
-
- -
- - color-filter -
- ti ti-color-filter
- \f5a8 -
-
- -
- - color-picker -
- ti ti-color-picker
- \ebe6 -
-
- -
- - color-picker-off -
- ti ti-color-picker-off
- \f0d2 -
-
- -
- - color-swatch -
- ti ti-color-swatch
- \eb61 -
-
- -
- - color-swatch-off -
- ti ti-color-swatch-off
- \f0d3 -
-
- -
- - column-insert-left -
- ti ti-column-insert-left
- \ee44 -
-
- -
- - column-insert-right -
- ti ti-column-insert-right
- \ee45 -
-
- -
- - columns -
- ti ti-columns
- \eb83 -
-
- -
- - columns-1 -
- ti ti-columns-1
- \f6d4 -
-
- -
- - columns-2 -
- ti ti-columns-2
- \f6d5 -
-
- -
- - columns-3 -
- ti ti-columns-3
- \f6d6 -
-
- -
- - columns-off -
- ti ti-columns-off
- \f0d4 -
-
- -
- - comet -
- ti ti-comet
- \ec76 -
-
- -
- - command -
- ti ti-command
- \ea78 -
-
- -
- - command-off -
- ti ti-command-off
- \f3d7 -
-
- -
- - compass -
- ti ti-compass
- \ea79 -
-
- -
- - compass-off -
- ti ti-compass-off
- \f0d5 -
-
- -
- - components -
- ti ti-components
- \efa5 -
-
- -
- - components-off -
- ti ti-components-off
- \f0d6 -
-
- -
- - cone -
- ti ti-cone
- \efdd -
-
- -
- - cone-2 -
- ti ti-cone-2
- \efdc -
-
- -
- - cone-off -
- ti ti-cone-off
- \f3d8 -
-
- -
- - confetti -
- ti ti-confetti
- \ee46 -
-
- -
- - confetti-off -
- ti ti-confetti-off
- \f3d9 -
-
- -
- - confucius -
- ti ti-confucius
- \f58a -
-
- -
- - container -
- ti ti-container
- \ee47 -
-
- -
- - container-off -
- ti ti-container-off
- \f107 -
-
- -
- - contrast -
- ti ti-contrast
- \ec4e -
-
- -
- - contrast-2 -
- ti ti-contrast-2
- \efc7 -
-
- -
- - contrast-2-off -
- ti ti-contrast-2-off
- \f3da -
-
- -
- - contrast-off -
- ti ti-contrast-off
- \f3db -
-
- -
- - cooker -
- ti ti-cooker
- \f57a -
-
- -
- - cookie -
- ti ti-cookie
- \ef0f -
-
- -
- - cookie-man -
- ti ti-cookie-man
- \f4c4 -
-
- -
- - cookie-off -
- ti ti-cookie-off
- \f0d7 -
-
- -
- - copy -
- ti ti-copy
- \ea7a -
-
- -
- - copy-off -
- ti ti-copy-off
- \f0d8 -
-
- -
- - copyleft -
- ti ti-copyleft
- \ec3d -
-
- -
- - copyleft-filled -
- ti ti-copyleft-filled
- \f73b -
-
- -
- - copyleft-off -
- ti ti-copyleft-off
- \f0d9 -
-
- -
- - copyright -
- ti ti-copyright
- \ea7b -
-
- -
- - copyright-filled -
- ti ti-copyright-filled
- \f73c -
-
- -
- - copyright-off -
- ti ti-copyright-off
- \f0da -
-
- -
- - corner-down-left -
- ti ti-corner-down-left
- \ea7c -
-
- -
- - corner-down-left-double -
- ti ti-corner-down-left-double
- \ee48 -
-
- -
- - corner-down-right -
- ti ti-corner-down-right
- \ea7d -
-
- -
- - corner-down-right-double -
- ti ti-corner-down-right-double
- \ee49 -
-
- -
- - corner-left-down -
- ti ti-corner-left-down
- \ea7e -
-
- -
- - corner-left-down-double -
- ti ti-corner-left-down-double
- \ee4a -
-
- -
- - corner-left-up -
- ti ti-corner-left-up
- \ea7f -
-
- -
- - corner-left-up-double -
- ti ti-corner-left-up-double
- \ee4b -
-
- -
- - corner-right-down -
- ti ti-corner-right-down
- \ea80 -
-
- -
- - corner-right-down-double -
- ti ti-corner-right-down-double
- \ee4c -
-
- -
- - corner-right-up -
- ti ti-corner-right-up
- \ea81 -
-
- -
- - corner-right-up-double -
- ti ti-corner-right-up-double
- \ee4d -
-
- -
- - corner-up-left -
- ti ti-corner-up-left
- \ea82 -
-
- -
- - corner-up-left-double -
- ti ti-corner-up-left-double
- \ee4e -
-
- -
- - corner-up-right -
- ti ti-corner-up-right
- \ea83 -
-
- -
- - corner-up-right-double -
- ti ti-corner-up-right-double
- \ee4f -
-
- -
- - cpu -
- ti ti-cpu
- \ef8e -
-
- -
- - cpu-2 -
- ti ti-cpu-2
- \f075 -
-
- -
- - cpu-off -
- ti ti-cpu-off
- \f108 -
-
- -
- - crane -
- ti ti-crane
- \ef27 -
-
- -
- - crane-off -
- ti ti-crane-off
- \f109 -
-
- -
- - creative-commons -
- ti ti-creative-commons
- \efb3 -
-
- -
- - creative-commons-by -
- ti ti-creative-commons-by
- \f21f -
-
- -
- - creative-commons-nc -
- ti ti-creative-commons-nc
- \f220 -
-
- -
- - creative-commons-nd -
- ti ti-creative-commons-nd
- \f221 -
-
- -
- - creative-commons-off -
- ti ti-creative-commons-off
- \f10a -
-
- -
- - creative-commons-sa -
- ti ti-creative-commons-sa
- \f222 -
-
- -
- - creative-commons-zero -
- ti ti-creative-commons-zero
- \f223 -
-
- -
- - credit-card -
- ti ti-credit-card
- \ea84 -
-
- -
- - credit-card-off -
- ti ti-credit-card-off
- \ed11 -
-
- -
- - cricket -
- ti ti-cricket
- \f09a -
-
- -
- - crop -
- ti ti-crop
- \ea85 -
-
- -
- - cross -
- ti ti-cross
- \ef8f -
-
- -
- - cross-filled -
- ti ti-cross-filled
- \f675 -
-
- -
- - cross-off -
- ti ti-cross-off
- \f10b -
-
- -
- - crosshair -
- ti ti-crosshair
- \ec3e -
-
- -
- - crown -
- ti ti-crown
- \ed12 -
-
- -
- - crown-off -
- ti ti-crown-off
- \ee50 -
-
- -
- - crutches -
- ti ti-crutches
- \ef5b -
-
- -
- - crutches-off -
- ti ti-crutches-off
- \f10c -
-
- -
- - crystal-ball -
- ti ti-crystal-ball
- \f57b -
-
- -
- - csv -
- ti ti-csv
- \f791 -
-
- -
- - cube-send -
- ti ti-cube-send
- \f61b -
-
- -
- - cube-unfolded -
- ti ti-cube-unfolded
- \f61c -
-
- -
- - cup -
- ti ti-cup
- \ef28 -
-
- -
- - cup-off -
- ti ti-cup-off
- \f10d -
-
- -
- - curling -
- ti ti-curling
- \efc8 -
-
- -
- - curly-loop -
- ti ti-curly-loop
- \ecda -
-
- -
- - currency -
- ti ti-currency
- \efa6 -
-
- -
- - currency-afghani -
- ti ti-currency-afghani
- \f65e -
-
- -
- - currency-bahraini -
- ti ti-currency-bahraini
- \ee51 -
-
- -
- - currency-baht -
- ti ti-currency-baht
- \f08a -
-
- -
- - currency-bitcoin -
- ti ti-currency-bitcoin
- \ebab -
-
- -
- - currency-cent -
- ti ti-currency-cent
- \ee53 -
-
- -
- - currency-dinar -
- ti ti-currency-dinar
- \ee54 -
-
- -
- - currency-dirham -
- ti ti-currency-dirham
- \ee55 -
-
- -
- - currency-dogecoin -
- ti ti-currency-dogecoin
- \ef4b -
-
- -
- - currency-dollar -
- ti ti-currency-dollar
- \eb84 -
-
- -
- - currency-dollar-australian -
- ti ti-currency-dollar-australian
- \ee56 -
-
- -
- - currency-dollar-brunei -
- ti ti-currency-dollar-brunei
- \f36c -
-
- -
- - currency-dollar-canadian -
- ti ti-currency-dollar-canadian
- \ee57 -
-
- -
- - currency-dollar-guyanese -
- ti ti-currency-dollar-guyanese
- \f36d -
-
- -
- - currency-dollar-off -
- ti ti-currency-dollar-off
- \f3dc -
-
- -
- - currency-dollar-singapore -
- ti ti-currency-dollar-singapore
- \ee58 -
-
- -
- - currency-dollar-zimbabwean -
- ti ti-currency-dollar-zimbabwean
- \f36e -
-
- -
- - currency-dong -
- ti ti-currency-dong
- \f36f -
-
- -
- - currency-dram -
- ti ti-currency-dram
- \f370 -
-
- -
- - currency-ethereum -
- ti ti-currency-ethereum
- \ee59 -
-
- -
- - currency-euro -
- ti ti-currency-euro
- \eb85 -
-
- -
- - currency-euro-off -
- ti ti-currency-euro-off
- \f3dd -
-
- -
- - currency-forint -
- ti ti-currency-forint
- \ee5a -
-
- -
- - currency-frank -
- ti ti-currency-frank
- \ee5b -
-
- -
- - currency-guarani -
- ti ti-currency-guarani
- \f371 -
-
- -
- - currency-hryvnia -
- ti ti-currency-hryvnia
- \f372 -
-
- -
- - currency-kip -
- ti ti-currency-kip
- \f373 -
-
- -
- - currency-krone-czech -
- ti ti-currency-krone-czech
- \ee5c -
-
- -
- - currency-krone-danish -
- ti ti-currency-krone-danish
- \ee5d -
-
- -
- - currency-krone-swedish -
- ti ti-currency-krone-swedish
- \ee5e -
-
- -
- - currency-lari -
- ti ti-currency-lari
- \f374 -
-
- -
- - currency-leu -
- ti ti-currency-leu
- \ee5f -
-
- -
- - currency-lira -
- ti ti-currency-lira
- \ee60 -
-
- -
- - currency-litecoin -
- ti ti-currency-litecoin
- \ee61 -
-
- -
- - currency-lyd -
- ti ti-currency-lyd
- \f375 -
-
- -
- - currency-manat -
- ti ti-currency-manat
- \f376 -
-
- -
- - currency-monero -
- ti ti-currency-monero
- \f377 -
-
- -
- - currency-naira -
- ti ti-currency-naira
- \ee62 -
-
- -
- - currency-nano -
- ti ti-currency-nano
- \f7a6 -
-
- -
- - currency-off -
- ti ti-currency-off
- \f3de -
-
- -
- - currency-paanga -
- ti ti-currency-paanga
- \f378 -
-
- -
- - currency-peso -
- ti ti-currency-peso
- \f65f -
-
- -
- - currency-pound -
- ti ti-currency-pound
- \ebac -
-
- -
- - currency-pound-off -
- ti ti-currency-pound-off
- \f3df -
-
- -
- - currency-quetzal -
- ti ti-currency-quetzal
- \f379 -
-
- -
- - currency-real -
- ti ti-currency-real
- \ee63 -
-
- -
- - currency-renminbi -
- ti ti-currency-renminbi
- \ee64 -
-
- -
- - currency-ripple -
- ti ti-currency-ripple
- \ee65 -
-
- -
- - currency-riyal -
- ti ti-currency-riyal
- \ee66 -
-
- -
- - currency-rubel -
- ti ti-currency-rubel
- \ee67 -
-
- -
- - currency-rufiyaa -
- ti ti-currency-rufiyaa
- \f37a -
-
- -
- - currency-rupee -
- ti ti-currency-rupee
- \ebad -
-
- -
- - currency-rupee-nepalese -
- ti ti-currency-rupee-nepalese
- \f37b -
-
- -
- - currency-shekel -
- ti ti-currency-shekel
- \ee68 -
-
- -
- - currency-solana -
- ti ti-currency-solana
- \f4a1 -
-
- -
- - currency-som -
- ti ti-currency-som
- \f37c -
-
- -
- - currency-taka -
- ti ti-currency-taka
- \ee69 -
-
- -
- - currency-tenge -
- ti ti-currency-tenge
- \f37d -
-
- -
- - currency-tugrik -
- ti ti-currency-tugrik
- \ee6a -
-
- -
- - currency-won -
- ti ti-currency-won
- \ee6b -
-
- -
- - currency-yen -
- ti ti-currency-yen
- \ebae -
-
- -
- - currency-yen-off -
- ti ti-currency-yen-off
- \f3e0 -
-
- -
- - currency-yuan -
- ti ti-currency-yuan
- \f29a -
-
- -
- - currency-zloty -
- ti ti-currency-zloty
- \ee6c -
-
- -
- - current-location -
- ti ti-current-location
- \ecef -
-
- -
- - current-location-off -
- ti ti-current-location-off
- \f10e -
-
- -
- - cursor-off -
- ti ti-cursor-off
- \f10f -
-
- -
- - cursor-text -
- ti ti-cursor-text
- \ee6d -
-
- -
- - cut -
- ti ti-cut
- \ea86 -
-
- -
- - cylinder -
- ti ti-cylinder
- \f54c -
-
- -
- - dashboard -
- ti ti-dashboard
- \ea87 -
-
- -
- - dashboard-off -
- ti ti-dashboard-off
- \f3e1 -
-
- -
- - database -
- ti ti-database
- \ea88 -
-
- -
- - database-export -
- ti ti-database-export
- \ee6e -
-
- -
- - database-import -
- ti ti-database-import
- \ee6f -
-
- -
- - database-off -
- ti ti-database-off
- \ee70 -
-
- -
- - deer -
- ti ti-deer
- \f4c5 -
-
- -
- - delta -
- ti ti-delta
- \f53c -
-
- -
- - dental -
- ti ti-dental
- \f025 -
-
- -
- - dental-broken -
- ti ti-dental-broken
- \f286 -
-
- -
- - dental-off -
- ti ti-dental-off
- \f110 -
-
- -
- - deselect -
- ti ti-deselect
- \f9f3 -
-
- -
- - details -
- ti ti-details
- \ee71 -
-
- -
- - details-off -
- ti ti-details-off
- \f3e2 -
-
- -
- - device-airpods -
- ti ti-device-airpods
- \f5a9 -
-
- -
- - device-airpods-case -
- ti ti-device-airpods-case
- \f646 -
-
- -
- - device-analytics -
- ti ti-device-analytics
- \ee72 -
-
- -
- - device-audio-tape -
- ti ti-device-audio-tape
- \ee73 -
-
- -
- - device-camera-phone -
- ti ti-device-camera-phone
- \f233 -
-
- -
- - device-cctv -
- ti ti-device-cctv
- \ee74 -
-
- -
- - device-cctv-off -
- ti ti-device-cctv-off
- \f3e3 -
-
- -
- - device-computer-camera -
- ti ti-device-computer-camera
- \ee76 -
-
- -
- - device-computer-camera-off -
- ti ti-device-computer-camera-off
- \ee75 -
-
- -
- - device-desktop -
- ti ti-device-desktop
- \ea89 -
-
- -
- - device-desktop-analytics -
- ti ti-device-desktop-analytics
- \ee77 -
-
- -
- - device-desktop-bolt -
- ti ti-device-desktop-bolt
- \f85e -
-
- -
- - device-desktop-cancel -
- ti ti-device-desktop-cancel
- \f85f -
-
- -
- - device-desktop-check -
- ti ti-device-desktop-check
- \f860 -
-
- -
- - device-desktop-code -
- ti ti-device-desktop-code
- \f861 -
-
- -
- - device-desktop-cog -
- ti ti-device-desktop-cog
- \f862 -
-
- -
- - device-desktop-dollar -
- ti ti-device-desktop-dollar
- \f863 -
-
- -
- - device-desktop-down -
- ti ti-device-desktop-down
- \f864 -
-
- -
- - device-desktop-exclamation -
- ti ti-device-desktop-exclamation
- \f865 -
-
- -
- - device-desktop-heart -
- ti ti-device-desktop-heart
- \f866 -
-
- -
- - device-desktop-minus -
- ti ti-device-desktop-minus
- \f867 -
-
- -
- - device-desktop-off -
- ti ti-device-desktop-off
- \ee78 -
-
- -
- - device-desktop-pause -
- ti ti-device-desktop-pause
- \f868 -
-
- -
- - device-desktop-pin -
- ti ti-device-desktop-pin
- \f869 -
-
- -
- - device-desktop-plus -
- ti ti-device-desktop-plus
- \f86a -
-
- -
- - device-desktop-question -
- ti ti-device-desktop-question
- \f86b -
-
- -
- - device-desktop-search -
- ti ti-device-desktop-search
- \f86c -
-
- -
- - device-desktop-share -
- ti ti-device-desktop-share
- \f86d -
-
- -
- - device-desktop-star -
- ti ti-device-desktop-star
- \f86e -
-
- -
- - device-desktop-up -
- ti ti-device-desktop-up
- \f86f -
-
- -
- - device-desktop-x -
- ti ti-device-desktop-x
- \f870 -
-
- -
- - device-floppy -
- ti ti-device-floppy
- \eb62 -
-
- -
- - device-gamepad -
- ti ti-device-gamepad
- \eb63 -
-
- -
- - device-gamepad-2 -
- ti ti-device-gamepad-2
- \f1d2 -
-
- -
- - device-heart-monitor -
- ti ti-device-heart-monitor
- \f060 -
-
- -
- - device-imac -
- ti ti-device-imac
- \f7a7 -
-
- -
- - device-imac-bolt -
- ti ti-device-imac-bolt
- \f871 -
-
- -
- - device-imac-cancel -
- ti ti-device-imac-cancel
- \f872 -
-
- -
- - device-imac-check -
- ti ti-device-imac-check
- \f873 -
-
- -
- - device-imac-code -
- ti ti-device-imac-code
- \f874 -
-
- -
- - device-imac-cog -
- ti ti-device-imac-cog
- \f875 -
-
- -
- - device-imac-dollar -
- ti ti-device-imac-dollar
- \f876 -
-
- -
- - device-imac-down -
- ti ti-device-imac-down
- \f877 -
-
- -
- - device-imac-exclamation -
- ti ti-device-imac-exclamation
- \f878 -
-
- -
- - device-imac-heart -
- ti ti-device-imac-heart
- \f879 -
-
- -
- - device-imac-minus -
- ti ti-device-imac-minus
- \f87a -
-
- -
- - device-imac-off -
- ti ti-device-imac-off
- \f87b -
-
- -
- - device-imac-pause -
- ti ti-device-imac-pause
- \f87c -
-
- -
- - device-imac-pin -
- ti ti-device-imac-pin
- \f87d -
-
- -
- - device-imac-plus -
- ti ti-device-imac-plus
- \f87e -
-
- -
- - device-imac-question -
- ti ti-device-imac-question
- \f87f -
-
- -
- - device-imac-search -
- ti ti-device-imac-search
- \f880 -
-
- -
- - device-imac-share -
- ti ti-device-imac-share
- \f881 -
-
- -
- - device-imac-star -
- ti ti-device-imac-star
- \f882 -
-
- -
- - device-imac-up -
- ti ti-device-imac-up
- \f883 -
-
- -
- - device-imac-x -
- ti ti-device-imac-x
- \f884 -
-
- -
- - device-ipad -
- ti ti-device-ipad
- \f648 -
-
- -
- - device-ipad-bolt -
- ti ti-device-ipad-bolt
- \f885 -
-
- -
- - device-ipad-cancel -
- ti ti-device-ipad-cancel
- \f886 -
-
- -
- - device-ipad-check -
- ti ti-device-ipad-check
- \f887 -
-
- -
- - device-ipad-code -
- ti ti-device-ipad-code
- \f888 -
-
- -
- - device-ipad-cog -
- ti ti-device-ipad-cog
- \f889 -
-
- -
- - device-ipad-dollar -
- ti ti-device-ipad-dollar
- \f88a -
-
- -
- - device-ipad-down -
- ti ti-device-ipad-down
- \f88b -
-
- -
- - device-ipad-exclamation -
- ti ti-device-ipad-exclamation
- \f88c -
-
- -
- - device-ipad-heart -
- ti ti-device-ipad-heart
- \f88d -
-
- -
- - device-ipad-horizontal -
- ti ti-device-ipad-horizontal
- \f647 -
-
- -
- - device-ipad-horizontal-bolt -
- ti ti-device-ipad-horizontal-bolt
- \f88e -
-
- -
- - device-ipad-horizontal-cancel -
- ti ti-device-ipad-horizontal-cancel
- \f88f -
-
- -
- - device-ipad-horizontal-check -
- ti ti-device-ipad-horizontal-check
- \f890 -
-
- -
- - device-ipad-horizontal-code -
- ti ti-device-ipad-horizontal-code
- \f891 -
-
- -
- - device-ipad-horizontal-cog -
- ti ti-device-ipad-horizontal-cog
- \f892 -
-
- -
- - device-ipad-horizontal-dollar -
- ti ti-device-ipad-horizontal-dollar
- \f893 -
-
- -
- - device-ipad-horizontal-down -
- ti ti-device-ipad-horizontal-down
- \f894 -
-
- -
- - device-ipad-horizontal-exclamation -
- ti ti-device-ipad-horizontal-exclamation
- \f895 -
-
- -
- - device-ipad-horizontal-heart -
- ti ti-device-ipad-horizontal-heart
- \f896 -
-
- -
- - device-ipad-horizontal-minus -
- ti ti-device-ipad-horizontal-minus
- \f897 -
-
- -
- - device-ipad-horizontal-off -
- ti ti-device-ipad-horizontal-off
- \f898 -
-
- -
- - device-ipad-horizontal-pause -
- ti ti-device-ipad-horizontal-pause
- \f899 -
-
- -
- - device-ipad-horizontal-pin -
- ti ti-device-ipad-horizontal-pin
- \f89a -
-
- -
- - device-ipad-horizontal-plus -
- ti ti-device-ipad-horizontal-plus
- \f89b -
-
- -
- - device-ipad-horizontal-question -
- ti ti-device-ipad-horizontal-question
- \f89c -
-
- -
- - device-ipad-horizontal-search -
- ti ti-device-ipad-horizontal-search
- \f89d -
-
- -
- - device-ipad-horizontal-share -
- ti ti-device-ipad-horizontal-share
- \f89e -
-
- -
- - device-ipad-horizontal-star -
- ti ti-device-ipad-horizontal-star
- \f89f -
-
- -
- - device-ipad-horizontal-up -
- ti ti-device-ipad-horizontal-up
- \f8a0 -
-
- -
- - device-ipad-horizontal-x -
- ti ti-device-ipad-horizontal-x
- \f8a1 -
-
- -
- - device-ipad-minus -
- ti ti-device-ipad-minus
- \f8a2 -
-
- -
- - device-ipad-off -
- ti ti-device-ipad-off
- \f8a3 -
-
- -
- - device-ipad-pause -
- ti ti-device-ipad-pause
- \f8a4 -
-
- -
- - device-ipad-pin -
- ti ti-device-ipad-pin
- \f8a5 -
-
- -
- - device-ipad-plus -
- ti ti-device-ipad-plus
- \f8a6 -
-
- -
- - device-ipad-question -
- ti ti-device-ipad-question
- \f8a7 -
-
- -
- - device-ipad-search -
- ti ti-device-ipad-search
- \f8a8 -
-
- -
- - device-ipad-share -
- ti ti-device-ipad-share
- \f8a9 -
-
- -
- - device-ipad-star -
- ti ti-device-ipad-star
- \f8aa -
-
- -
- - device-ipad-up -
- ti ti-device-ipad-up
- \f8ab -
-
- -
- - device-ipad-x -
- ti ti-device-ipad-x
- \f8ac -
-
- -
- - device-landline-phone -
- ti ti-device-landline-phone
- \f649 -
-
- -
- - device-laptop -
- ti ti-device-laptop
- \eb64 -
-
- -
- - device-laptop-off -
- ti ti-device-laptop-off
- \f061 -
-
- -
- - device-mobile -
- ti ti-device-mobile
- \ea8a -
-
- -
- - device-mobile-bolt -
- ti ti-device-mobile-bolt
- \f8ad -
-
- -
- - device-mobile-cancel -
- ti ti-device-mobile-cancel
- \f8ae -
-
- -
- - device-mobile-charging -
- ti ti-device-mobile-charging
- \f224 -
-
- -
- - device-mobile-check -
- ti ti-device-mobile-check
- \f8af -
-
- -
- - device-mobile-code -
- ti ti-device-mobile-code
- \f8b0 -
-
- -
- - device-mobile-cog -
- ti ti-device-mobile-cog
- \f8b1 -
-
- -
- - device-mobile-dollar -
- ti ti-device-mobile-dollar
- \f8b2 -
-
- -
- - device-mobile-down -
- ti ti-device-mobile-down
- \f8b3 -
-
- -
- - device-mobile-exclamation -
- ti ti-device-mobile-exclamation
- \f8b4 -
-
- -
- - device-mobile-heart -
- ti ti-device-mobile-heart
- \f8b5 -
-
- -
- - device-mobile-message -
- ti ti-device-mobile-message
- \ee79 -
-
- -
- - device-mobile-minus -
- ti ti-device-mobile-minus
- \f8b6 -
-
- -
- - device-mobile-off -
- ti ti-device-mobile-off
- \f062 -
-
- -
- - device-mobile-pause -
- ti ti-device-mobile-pause
- \f8b7 -
-
- -
- - device-mobile-pin -
- ti ti-device-mobile-pin
- \f8b8 -
-
- -
- - device-mobile-plus -
- ti ti-device-mobile-plus
- \f8b9 -
-
- -
- - device-mobile-question -
- ti ti-device-mobile-question
- \f8ba -
-
- -
- - device-mobile-rotated -
- ti ti-device-mobile-rotated
- \ecdb -
-
- -
- - device-mobile-search -
- ti ti-device-mobile-search
- \f8bb -
-
- -
- - device-mobile-share -
- ti ti-device-mobile-share
- \f8bc -
-
- -
- - device-mobile-star -
- ti ti-device-mobile-star
- \f8bd -
-
- -
- - device-mobile-up -
- ti ti-device-mobile-up
- \f8be -
-
- -
- - device-mobile-vibration -
- ti ti-device-mobile-vibration
- \eb86 -
-
- -
- - device-mobile-x -
- ti ti-device-mobile-x
- \f8bf -
-
- -
- - device-nintendo -
- ti ti-device-nintendo
- \f026 -
-
- -
- - device-nintendo-off -
- ti ti-device-nintendo-off
- \f111 -
-
- -
- - device-remote -
- ti ti-device-remote
- \f792 -
-
- -
- - device-sd-card -
- ti ti-device-sd-card
- \f384 -
-
- -
- - device-sim -
- ti ti-device-sim
- \f4b2 -
-
- -
- - device-sim-1 -
- ti ti-device-sim-1
- \f4af -
-
- -
- - device-sim-2 -
- ti ti-device-sim-2
- \f4b0 -
-
- -
- - device-sim-3 -
- ti ti-device-sim-3
- \f4b1 -
-
- -
- - device-speaker -
- ti ti-device-speaker
- \ea8b -
-
- -
- - device-speaker-off -
- ti ti-device-speaker-off
- \f112 -
-
- -
- - device-tablet -
- ti ti-device-tablet
- \ea8c -
-
- -
- - device-tablet-bolt -
- ti ti-device-tablet-bolt
- \f8c0 -
-
- -
- - device-tablet-cancel -
- ti ti-device-tablet-cancel
- \f8c1 -
-
- -
- - device-tablet-check -
- ti ti-device-tablet-check
- \f8c2 -
-
- -
- - device-tablet-code -
- ti ti-device-tablet-code
- \f8c3 -
-
- -
- - device-tablet-cog -
- ti ti-device-tablet-cog
- \f8c4 -
-
- -
- - device-tablet-dollar -
- ti ti-device-tablet-dollar
- \f8c5 -
-
- -
- - device-tablet-down -
- ti ti-device-tablet-down
- \f8c6 -
-
- -
- - device-tablet-exclamation -
- ti ti-device-tablet-exclamation
- \f8c7 -
-
- -
- - device-tablet-heart -
- ti ti-device-tablet-heart
- \f8c8 -
-
- -
- - device-tablet-minus -
- ti ti-device-tablet-minus
- \f8c9 -
-
- -
- - device-tablet-off -
- ti ti-device-tablet-off
- \f063 -
-
- -
- - device-tablet-pause -
- ti ti-device-tablet-pause
- \f8ca -
-
- -
- - device-tablet-pin -
- ti ti-device-tablet-pin
- \f8cb -
-
- -
- - device-tablet-plus -
- ti ti-device-tablet-plus
- \f8cc -
-
- -
- - device-tablet-question -
- ti ti-device-tablet-question
- \f8cd -
-
- -
- - device-tablet-search -
- ti ti-device-tablet-search
- \f8ce -
-
- -
- - device-tablet-share -
- ti ti-device-tablet-share
- \f8cf -
-
- -
- - device-tablet-star -
- ti ti-device-tablet-star
- \f8d0 -
-
- -
- - device-tablet-up -
- ti ti-device-tablet-up
- \f8d1 -
-
- -
- - device-tablet-x -
- ti ti-device-tablet-x
- \f8d2 -
-
- -
- - device-tv -
- ti ti-device-tv
- \ea8d -
-
- -
- - device-tv-off -
- ti ti-device-tv-off
- \f064 -
-
- -
- - device-tv-old -
- ti ti-device-tv-old
- \f1d3 -
-
- -
- - device-watch -
- ti ti-device-watch
- \ebf9 -
-
- -
- - device-watch-bolt -
- ti ti-device-watch-bolt
- \f8d3 -
-
- -
- - device-watch-cancel -
- ti ti-device-watch-cancel
- \f8d4 -
-
- -
- - device-watch-check -
- ti ti-device-watch-check
- \f8d5 -
-
- -
- - device-watch-code -
- ti ti-device-watch-code
- \f8d6 -
-
- -
- - device-watch-cog -
- ti ti-device-watch-cog
- \f8d7 -
-
- -
- - device-watch-dollar -
- ti ti-device-watch-dollar
- \f8d8 -
-
- -
- - device-watch-down -
- ti ti-device-watch-down
- \f8d9 -
-
- -
- - device-watch-exclamation -
- ti ti-device-watch-exclamation
- \f8da -
-
- -
- - device-watch-heart -
- ti ti-device-watch-heart
- \f8db -
-
- -
- - device-watch-minus -
- ti ti-device-watch-minus
- \f8dc -
-
- -
- - device-watch-off -
- ti ti-device-watch-off
- \f065 -
-
- -
- - device-watch-pause -
- ti ti-device-watch-pause
- \f8dd -
-
- -
- - device-watch-pin -
- ti ti-device-watch-pin
- \f8de -
-
- -
- - device-watch-plus -
- ti ti-device-watch-plus
- \f8df -
-
- -
- - device-watch-question -
- ti ti-device-watch-question
- \f8e0 -
-
- -
- - device-watch-search -
- ti ti-device-watch-search
- \f8e1 -
-
- -
- - device-watch-share -
- ti ti-device-watch-share
- \f8e2 -
-
- -
- - device-watch-star -
- ti ti-device-watch-star
- \f8e3 -
-
- -
- - device-watch-stats -
- ti ti-device-watch-stats
- \ef7d -
-
- -
- - device-watch-stats-2 -
- ti ti-device-watch-stats-2
- \ef7c -
-
- -
- - device-watch-up -
- ti ti-device-watch-up
- \f8e4 -
-
- -
- - device-watch-x -
- ti ti-device-watch-x
- \f8e5 -
-
- -
- - devices -
- ti ti-devices
- \eb87 -
-
- -
- - devices-2 -
- ti ti-devices-2
- \ed29 -
-
- -
- - devices-bolt -
- ti ti-devices-bolt
- \f8e6 -
-
- -
- - devices-cancel -
- ti ti-devices-cancel
- \f8e7 -
-
- -
- - devices-check -
- ti ti-devices-check
- \f8e8 -
-
- -
- - devices-code -
- ti ti-devices-code
- \f8e9 -
-
- -
- - devices-cog -
- ti ti-devices-cog
- \f8ea -
-
- -
- - devices-dollar -
- ti ti-devices-dollar
- \f8eb -
-
- -
- - devices-down -
- ti ti-devices-down
- \f8ec -
-
- -
- - devices-exclamation -
- ti ti-devices-exclamation
- \f8ed -
-
- -
- - devices-heart -
- ti ti-devices-heart
- \f8ee -
-
- -
- - devices-minus -
- ti ti-devices-minus
- \f8ef -
-
- -
- - devices-off -
- ti ti-devices-off
- \f3e4 -
-
- -
- - devices-pause -
- ti ti-devices-pause
- \f8f0 -
-
- -
- - devices-pc -
- ti ti-devices-pc
- \ee7a -
-
- -
- - devices-pc-off -
- ti ti-devices-pc-off
- \f113 -
-
- -
- - devices-pin -
- ti ti-devices-pin
- \f8f1 -
-
- -
- - devices-plus -
- ti ti-devices-plus
- \f8f2 -
-
- -
- - devices-question -
- ti ti-devices-question
- \f8f3 -
-
- -
- - devices-search -
- ti ti-devices-search
- \f8f4 -
-
- -
- - devices-share -
- ti ti-devices-share
- \f8f5 -
-
- -
- - devices-star -
- ti ti-devices-star
- \f8f6 -
-
- -
- - devices-up -
- ti ti-devices-up
- \f8f7 -
-
- -
- - devices-x -
- ti ti-devices-x
- \f8f8 -
-
- -
- - dialpad -
- ti ti-dialpad
- \f067 -
-
- -
- - dialpad-off -
- ti ti-dialpad-off
- \f114 -
-
- -
- - diamond -
- ti ti-diamond
- \eb65 -
-
- -
- - diamond-filled -
- ti ti-diamond-filled
- \f73d -
-
- -
- - diamond-off -
- ti ti-diamond-off
- \f115 -
-
- -
- - diamonds -
- ti ti-diamonds
- \eff5 -
-
- -
- - diamonds-filled -
- ti ti-diamonds-filled
- \f676 -
-
- -
- - dice -
- ti ti-dice
- \eb66 -
-
- -
- - dice-1 -
- ti ti-dice-1
- \f08b -
-
- -
- - dice-1-filled -
- ti ti-dice-1-filled
- \f73e -
-
- -
- - dice-2 -
- ti ti-dice-2
- \f08c -
-
- -
- - dice-2-filled -
- ti ti-dice-2-filled
- \f73f -
-
- -
- - dice-3 -
- ti ti-dice-3
- \f08d -
-
- -
- - dice-3-filled -
- ti ti-dice-3-filled
- \f740 -
-
- -
- - dice-4 -
- ti ti-dice-4
- \f08e -
-
- -
- - dice-4-filled -
- ti ti-dice-4-filled
- \f741 -
-
- -
- - dice-5 -
- ti ti-dice-5
- \f08f -
-
- -
- - dice-5-filled -
- ti ti-dice-5-filled
- \f742 -
-
- -
- - dice-6 -
- ti ti-dice-6
- \f090 -
-
- -
- - dice-6-filled -
- ti ti-dice-6-filled
- \f743 -
-
- -
- - dice-filled -
- ti ti-dice-filled
- \f744 -
-
- -
- - dimensions -
- ti ti-dimensions
- \ee7b -
-
- -
- - direction -
- ti ti-direction
- \ebfb -
-
- -
- - direction-horizontal -
- ti ti-direction-horizontal
- \ebfa -
-
- -
- - direction-sign -
- ti ti-direction-sign
- \f1f7 -
-
- -
- - direction-sign-filled -
- ti ti-direction-sign-filled
- \f745 -
-
- -
- - direction-sign-off -
- ti ti-direction-sign-off
- \f3e5 -
-
- -
- - directions -
- ti ti-directions
- \ea8e -
-
- -
- - directions-off -
- ti ti-directions-off
- \f116 -
-
- -
- - disabled -
- ti ti-disabled
- \ea8f -
-
- -
- - disabled-2 -
- ti ti-disabled-2
- \ebaf -
-
- -
- - disabled-off -
- ti ti-disabled-off
- \f117 -
-
- -
- - disc -
- ti ti-disc
- \ea90 -
-
- -
- - disc-golf -
- ti ti-disc-golf
- \f385 -
-
- -
- - disc-off -
- ti ti-disc-off
- \f118 -
-
- -
- - discount -
- ti ti-discount
- \ebbd -
-
- -
- - discount-2 -
- ti ti-discount-2
- \ee7c -
-
- -
- - discount-2-off -
- ti ti-discount-2-off
- \f3e6 -
-
- -
- - discount-check -
- ti ti-discount-check
- \f1f8 -
-
- -
- - discount-check-filled -
- ti ti-discount-check-filled
- \f746 -
-
- -
- - discount-off -
- ti ti-discount-off
- \f3e7 -
-
- -
- - divide -
- ti ti-divide
- \ed5c -
-
- -
- - dna -
- ti ti-dna
- \ee7d -
-
- -
- - dna-2 -
- ti ti-dna-2
- \ef5c -
-
- -
- - dna-2-off -
- ti ti-dna-2-off
- \f119 -
-
- -
- - dna-off -
- ti ti-dna-off
- \f11a -
-
- -
- - dog -
- ti ti-dog
- \f660 -
-
- -
- - dog-bowl -
- ti ti-dog-bowl
- \ef29 -
-
- -
- - door -
- ti ti-door
- \ef4e -
-
- -
- - door-enter -
- ti ti-door-enter
- \ef4c -
-
- -
- - door-exit -
- ti ti-door-exit
- \ef4d -
-
- -
- - door-off -
- ti ti-door-off
- \f11b -
-
- -
- - dots -
- ti ti-dots
- \ea95 -
-
- -
- - dots-circle-horizontal -
- ti ti-dots-circle-horizontal
- \ea91 -
-
- -
- - dots-diagonal -
- ti ti-dots-diagonal
- \ea93 -
-
- -
- - dots-diagonal-2 -
- ti ti-dots-diagonal-2
- \ea92 -
-
- -
- - dots-vertical -
- ti ti-dots-vertical
- \ea94 -
-
- -
- - download -
- ti ti-download
- \ea96 -
-
- -
- - download-off -
- ti ti-download-off
- \f11c -
-
- -
- - drag-drop -
- ti ti-drag-drop
- \eb89 -
-
- -
- - drag-drop-2 -
- ti ti-drag-drop-2
- \eb88 -
-
- -
- - drone -
- ti ti-drone
- \ed79 -
-
- -
- - drone-off -
- ti ti-drone-off
- \ee7e -
-
- -
- - drop-circle -
- ti ti-drop-circle
- \efde -
-
- -
- - droplet -
- ti ti-droplet
- \ea97 -
-
- -
- - droplet-bolt -
- ti ti-droplet-bolt
- \f8f9 -
-
- -
- - droplet-cancel -
- ti ti-droplet-cancel
- \f8fa -
-
- -
- - droplet-check -
- ti ti-droplet-check
- \f8fb -
-
- -
- - droplet-code -
- ti ti-droplet-code
- \f8fc -
-
- -
- - droplet-cog -
- ti ti-droplet-cog
- \f8fd -
-
- -
- - droplet-dollar -
- ti ti-droplet-dollar
- \f8fe -
-
- -
- - droplet-down -
- ti ti-droplet-down
- \f8ff -
-
- -
- - droplet-exclamation -
- ti ti-droplet-exclamation
- \f900 -
-
- -
- - droplet-filled -
- ti ti-droplet-filled
- \ee80 -
-
- -
- - droplet-filled-2 -
- ti ti-droplet-filled-2
- \ee7f -
-
- -
- - droplet-half -
- ti ti-droplet-half
- \ee82 -
-
- -
- - droplet-half-2 -
- ti ti-droplet-half-2
- \ee81 -
-
- -
- - droplet-half-filled -
- ti ti-droplet-half-filled
- \f6c5 -
-
- -
- - droplet-heart -
- ti ti-droplet-heart
- \f901 -
-
- -
- - droplet-minus -
- ti ti-droplet-minus
- \f902 -
-
- -
- - droplet-off -
- ti ti-droplet-off
- \ee83 -
-
- -
- - droplet-pause -
- ti ti-droplet-pause
- \f903 -
-
- -
- - droplet-pin -
- ti ti-droplet-pin
- \f904 -
-
- -
- - droplet-plus -
- ti ti-droplet-plus
- \f905 -
-
- -
- - droplet-question -
- ti ti-droplet-question
- \f906 -
-
- -
- - droplet-search -
- ti ti-droplet-search
- \f907 -
-
- -
- - droplet-share -
- ti ti-droplet-share
- \f908 -
-
- -
- - droplet-star -
- ti ti-droplet-star
- \f909 -
-
- -
- - droplet-up -
- ti ti-droplet-up
- \f90a -
-
- -
- - droplet-x -
- ti ti-droplet-x
- \f90b -
-
- -
- - e-passport -
- ti ti-e-passport
- \f4df -
-
- -
- - ear -
- ti ti-ear
- \ebce -
-
- -
- - ear-off -
- ti ti-ear-off
- \ee84 -
-
- -
- - ease-in -
- ti ti-ease-in
- \f573 -
-
- -
- - ease-in-control-point -
- ti ti-ease-in-control-point
- \f570 -
-
- -
- - ease-in-out -
- ti ti-ease-in-out
- \f572 -
-
- -
- - ease-in-out-control-points -
- ti ti-ease-in-out-control-points
- \f571 -
-
- -
- - ease-out -
- ti ti-ease-out
- \f575 -
-
- -
- - ease-out-control-point -
- ti ti-ease-out-control-point
- \f574 -
-
- -
- - edit -
- ti ti-edit
- \ea98 -
-
- -
- - edit-circle -
- ti ti-edit-circle
- \ee85 -
-
- -
- - edit-circle-off -
- ti ti-edit-circle-off
- \f11d -
-
- -
- - edit-off -
- ti ti-edit-off
- \f11e -
-
- -
- - egg -
- ti ti-egg
- \eb8a -
-
- -
- - egg-cracked -
- ti ti-egg-cracked
- \f2d6 -
-
- -
- - egg-filled -
- ti ti-egg-filled
- \f678 -
-
- -
- - egg-fried -
- ti ti-egg-fried
- \f386 -
-
- -
- - egg-off -
- ti ti-egg-off
- \f11f -
-
- -
- - eggs -
- ti ti-eggs
- \f500 -
-
- -
- - elevator -
- ti ti-elevator
- \efdf -
-
- -
- - elevator-off -
- ti ti-elevator-off
- \f3e8 -
-
- -
- - emergency-bed -
- ti ti-emergency-bed
- \ef5d -
-
- -
- - empathize -
- ti ti-empathize
- \f29b -
-
- -
- - empathize-off -
- ti ti-empathize-off
- \f3e9 -
-
- -
- - emphasis -
- ti ti-emphasis
- \ebcf -
-
- -
- - engine -
- ti ti-engine
- \ef7e -
-
- -
- - engine-off -
- ti ti-engine-off
- \f120 -
-
- -
- - equal -
- ti ti-equal
- \ee87 -
-
- -
- - equal-double -
- ti ti-equal-double
- \f4e1 -
-
- -
- - equal-not -
- ti ti-equal-not
- \ee86 -
-
- -
- - eraser -
- ti ti-eraser
- \eb8b -
-
- -
- - eraser-off -
- ti ti-eraser-off
- \f121 -
-
- -
- - error-404 -
- ti ti-error-404
- \f027 -
-
- -
- - error-404-off -
- ti ti-error-404-off
- \f122 -
-
- -
- - exchange -
- ti ti-exchange
- \ebe7 -
-
- -
- - exchange-off -
- ti ti-exchange-off
- \f123 -
-
- -
- - exclamation-circle -
- ti ti-exclamation-circle
- \f634 -
-
- -
- - exclamation-mark -
- ti ti-exclamation-mark
- \efb4 -
-
- -
- - exclamation-mark-off -
- ti ti-exclamation-mark-off
- \f124 -
-
- -
- - explicit -
- ti ti-explicit
- \f256 -
-
- -
- - explicit-off -
- ti ti-explicit-off
- \f3ea -
-
- -
- - exposure -
- ti ti-exposure
- \eb8c -
-
- -
- - exposure-0 -
- ti ti-exposure-0
- \f29c -
-
- -
- - exposure-minus-1 -
- ti ti-exposure-minus-1
- \f29d -
-
- -
- - exposure-minus-2 -
- ti ti-exposure-minus-2
- \f29e -
-
- -
- - exposure-off -
- ti ti-exposure-off
- \f3eb -
-
- -
- - exposure-plus-1 -
- ti ti-exposure-plus-1
- \f29f -
-
- -
- - exposure-plus-2 -
- ti ti-exposure-plus-2
- \f2a0 -
-
- -
- - external-link -
- ti ti-external-link
- \ea99 -
-
- -
- - external-link-off -
- ti ti-external-link-off
- \f125 -
-
- -
- - eye -
- ti ti-eye
- \ea9a -
-
- -
- - eye-check -
- ti ti-eye-check
- \ee88 -
-
- -
- - eye-closed -
- ti ti-eye-closed
- \f7ec -
-
- -
- - eye-cog -
- ti ti-eye-cog
- \f7ed -
-
- -
- - eye-edit -
- ti ti-eye-edit
- \f7ee -
-
- -
- - eye-exclamation -
- ti ti-eye-exclamation
- \f7ef -
-
- -
- - eye-filled -
- ti ti-eye-filled
- \f679 -
-
- -
- - eye-heart -
- ti ti-eye-heart
- \f7f0 -
-
- -
- - eye-off -
- ti ti-eye-off
- \ecf0 -
-
- -
- - eye-table -
- ti ti-eye-table
- \ef5e -
-
- -
- - eye-x -
- ti ti-eye-x
- \f7f1 -
-
- -
- - eyeglass -
- ti ti-eyeglass
- \ee8a -
-
- -
- - eyeglass-2 -
- ti ti-eyeglass-2
- \ee89 -
-
- -
- - eyeglass-off -
- ti ti-eyeglass-off
- \f126 -
-
- -
- - face-id -
- ti ti-face-id
- \ea9b -
-
- -
- - face-id-error -
- ti ti-face-id-error
- \efa7 -
-
- -
- - face-mask -
- ti ti-face-mask
- \efb5 -
-
- -
- - face-mask-off -
- ti ti-face-mask-off
- \f127 -
-
- -
- - fall -
- ti ti-fall
- \ecb9 -
-
- -
- - feather -
- ti ti-feather
- \ee8b -
-
- -
- - feather-off -
- ti ti-feather-off
- \f128 -
-
- -
- - fence -
- ti ti-fence
- \ef2a -
-
- -
- - fence-off -
- ti ti-fence-off
- \f129 -
-
- -
- - fidget-spinner -
- ti ti-fidget-spinner
- \f068 -
-
- -
- - file -
- ti ti-file
- \eaa4 -
-
- -
- - file-3d -
- ti ti-file-3d
- \f032 -
-
- -
- - file-alert -
- ti ti-file-alert
- \ede6 -
-
- -
- - file-analytics -
- ti ti-file-analytics
- \ede7 -
-
- -
- - file-arrow-left -
- ti ti-file-arrow-left
- \f033 -
-
- -
- - file-arrow-right -
- ti ti-file-arrow-right
- \f034 -
-
- -
- - file-barcode -
- ti ti-file-barcode
- \f035 -
-
- -
- - file-broken -
- ti ti-file-broken
- \f501 -
-
- -
- - file-certificate -
- ti ti-file-certificate
- \ed4d -
-
- -
- - file-chart -
- ti ti-file-chart
- \f036 -
-
- -
- - file-check -
- ti ti-file-check
- \ea9c -
-
- -
- - file-code -
- ti ti-file-code
- \ebd0 -
-
- -
- - file-code-2 -
- ti ti-file-code-2
- \ede8 -
-
- -
- - file-database -
- ti ti-file-database
- \f037 -
-
- -
- - file-delta -
- ti ti-file-delta
- \f53d -
-
- -
- - file-description -
- ti ti-file-description
- \f028 -
-
- -
- - file-diff -
- ti ti-file-diff
- \ecf1 -
-
- -
- - file-digit -
- ti ti-file-digit
- \efa8 -
-
- -
- - file-dislike -
- ti ti-file-dislike
- \ed2a -
-
- -
- - file-dollar -
- ti ti-file-dollar
- \efe0 -
-
- -
- - file-dots -
- ti ti-file-dots
- \f038 -
-
- -
- - file-download -
- ti ti-file-download
- \ea9d -
-
- -
- - file-euro -
- ti ti-file-euro
- \efe1 -
-
- -
- - file-export -
- ti ti-file-export
- \ede9 -
-
- -
- - file-filled -
- ti ti-file-filled
- \f747 -
-
- -
- - file-function -
- ti ti-file-function
- \f53e -
-
- -
- - file-horizontal -
- ti ti-file-horizontal
- \ebb0 -
-
- -
- - file-import -
- ti ti-file-import
- \edea -
-
- -
- - file-infinity -
- ti ti-file-infinity
- \f502 -
-
- -
- - file-info -
- ti ti-file-info
- \edec -
-
- -
- - file-invoice -
- ti ti-file-invoice
- \eb67 -
-
- -
- - file-lambda -
- ti ti-file-lambda
- \f53f -
-
- -
- - file-like -
- ti ti-file-like
- \ed2b -
-
- -
- - file-minus -
- ti ti-file-minus
- \ea9e -
-
- -
- - file-music -
- ti ti-file-music
- \ea9f -
-
- -
- - file-off -
- ti ti-file-off
- \ecf2 -
-
- -
- - file-orientation -
- ti ti-file-orientation
- \f2a1 -
-
- -
- - file-pencil -
- ti ti-file-pencil
- \f039 -
-
- -
- - file-percent -
- ti ti-file-percent
- \f540 -
-
- -
- - file-phone -
- ti ti-file-phone
- \ecdc -
-
- -
- - file-plus -
- ti ti-file-plus
- \eaa0 -
-
- -
- - file-power -
- ti ti-file-power
- \f03a -
-
- -
- - file-report -
- ti ti-file-report
- \eded -
-
- -
- - file-rss -
- ti ti-file-rss
- \f03b -
-
- -
- - file-scissors -
- ti ti-file-scissors
- \f03c -
-
- -
- - file-search -
- ti ti-file-search
- \ed5d -
-
- -
- - file-settings -
- ti ti-file-settings
- \f029 -
-
- -
- - file-shredder -
- ti ti-file-shredder
- \eaa1 -
-
- -
- - file-signal -
- ti ti-file-signal
- \f03d -
-
- -
- - file-spreadsheet -
- ti ti-file-spreadsheet
- \f03e -
-
- -
- - file-stack -
- ti ti-file-stack
- \f503 -
-
- -
- - file-star -
- ti ti-file-star
- \f03f -
-
- -
- - file-symlink -
- ti ti-file-symlink
- \ed53 -
-
- -
- - file-text -
- ti ti-file-text
- \eaa2 -
-
- -
- - file-time -
- ti ti-file-time
- \f040 -
-
- -
- - file-typography -
- ti ti-file-typography
- \f041 -
-
- -
- - file-unknown -
- ti ti-file-unknown
- \f042 -
-
- -
- - file-upload -
- ti ti-file-upload
- \ec91 -
-
- -
- - file-vector -
- ti ti-file-vector
- \f043 -
-
- -
- - file-x -
- ti ti-file-x
- \eaa3 -
-
- -
- - file-x-filled -
- ti ti-file-x-filled
- \f748 -
-
- -
- - file-zip -
- ti ti-file-zip
- \ed4e -
-
- -
- - files -
- ti ti-files
- \edef -
-
- -
- - files-off -
- ti ti-files-off
- \edee -
-
- -
- - filter -
- ti ti-filter
- \eaa5 -
-
- -
- - filter-off -
- ti ti-filter-off
- \ed2c -
-
- -
- - filters -
- ti ti-filters
- \f793 -
-
- -
- - fingerprint -
- ti ti-fingerprint
- \ebd1 -
-
- -
- - fingerprint-off -
- ti ti-fingerprint-off
- \f12a -
-
- -
- - fire-hydrant -
- ti ti-fire-hydrant
- \f3a9 -
-
- -
- - fire-hydrant-off -
- ti ti-fire-hydrant-off
- \f3ec -
-
- -
- - firetruck -
- ti ti-firetruck
- \ebe8 -
-
- -
- - first-aid-kit -
- ti ti-first-aid-kit
- \ef5f -
-
- -
- - first-aid-kit-off -
- ti ti-first-aid-kit-off
- \f3ed -
-
- -
- - fish -
- ti ti-fish
- \ef2b -
-
- -
- - fish-bone -
- ti ti-fish-bone
- \f287 -
-
- -
- - fish-christianity -
- ti ti-fish-christianity
- \f58b -
-
- -
- - fish-hook -
- ti ti-fish-hook
- \f1f9 -
-
- -
- - fish-hook-off -
- ti ti-fish-hook-off
- \f3ee -
-
- -
- - fish-off -
- ti ti-fish-off
- \f12b -
-
- -
- - flag -
- ti ti-flag
- \eaa6 -
-
- -
- - flag-2 -
- ti ti-flag-2
- \ee8c -
-
- -
- - flag-2-filled -
- ti ti-flag-2-filled
- \f707 -
-
- -
- - flag-2-off -
- ti ti-flag-2-off
- \f12c -
-
- -
- - flag-3 -
- ti ti-flag-3
- \ee8d -
-
- -
- - flag-3-filled -
- ti ti-flag-3-filled
- \f708 -
-
- -
- - flag-filled -
- ti ti-flag-filled
- \f67a -
-
- -
- - flag-off -
- ti ti-flag-off
- \f12d -
-
- -
- - flame -
- ti ti-flame
- \ec2c -
-
- -
- - flame-off -
- ti ti-flame-off
- \f12e -
-
- -
- - flare -
- ti ti-flare
- \ee8e -
-
- -
- - flask -
- ti ti-flask
- \ebd2 -
-
- -
- - flask-2 -
- ti ti-flask-2
- \ef60 -
-
- -
- - flask-2-off -
- ti ti-flask-2-off
- \f12f -
-
- -
- - flask-off -
- ti ti-flask-off
- \f130 -
-
- -
- - flip-flops -
- ti ti-flip-flops
- \f564 -
-
- -
- - flip-horizontal -
- ti ti-flip-horizontal
- \eaa7 -
-
- -
- - flip-vertical -
- ti ti-flip-vertical
- \eaa8 -
-
- -
- - float-center -
- ti ti-float-center
- \ebb1 -
-
- -
- - float-left -
- ti ti-float-left
- \ebb2 -
-
- -
- - float-none -
- ti ti-float-none
- \ed13 -
-
- -
- - float-right -
- ti ti-float-right
- \ebb3 -
-
- -
- - flower -
- ti ti-flower
- \eff6 -
-
- -
- - flower-off -
- ti ti-flower-off
- \f131 -
-
- -
- - focus -
- ti ti-focus
- \eb8d -
-
- -
- - focus-2 -
- ti ti-focus-2
- \ebd3 -
-
- -
- - focus-centered -
- ti ti-focus-centered
- \f02a -
-
- -
- - fold -
- ti ti-fold
- \ed56 -
-
- -
- - fold-down -
- ti ti-fold-down
- \ed54 -
-
- -
- - fold-up -
- ti ti-fold-up
- \ed55 -
-
- -
- - folder -
- ti ti-folder
- \eaad -
-
- -
- - folder-bolt -
- ti ti-folder-bolt
- \f90c -
-
- -
- - folder-cancel -
- ti ti-folder-cancel
- \f90d -
-
- -
- - folder-check -
- ti ti-folder-check
- \f90e -
-
- -
- - folder-code -
- ti ti-folder-code
- \f90f -
-
- -
- - folder-cog -
- ti ti-folder-cog
- \f910 -
-
- -
- - folder-dollar -
- ti ti-folder-dollar
- \f911 -
-
- -
- - folder-down -
- ti ti-folder-down
- \f912 -
-
- -
- - folder-exclamation -
- ti ti-folder-exclamation
- \f913 -
-
- -
- - folder-filled -
- ti ti-folder-filled
- \f749 -
-
- -
- - folder-heart -
- ti ti-folder-heart
- \f914 -
-
- -
- - folder-minus -
- ti ti-folder-minus
- \eaaa -
-
- -
- - folder-off -
- ti ti-folder-off
- \ed14 -
-
- -
- - folder-pause -
- ti ti-folder-pause
- \f915 -
-
- -
- - folder-pin -
- ti ti-folder-pin
- \f916 -
-
- -
- - folder-plus -
- ti ti-folder-plus
- \eaab -
-
- -
- - folder-question -
- ti ti-folder-question
- \f917 -
-
- -
- - folder-search -
- ti ti-folder-search
- \f918 -
-
- -
- - folder-share -
- ti ti-folder-share
- \f919 -
-
- -
- - folder-star -
- ti ti-folder-star
- \f91a -
-
- -
- - folder-symlink -
- ti ti-folder-symlink
- \f91b -
-
- -
- - folder-up -
- ti ti-folder-up
- \f91c -
-
- -
- - folder-x -
- ti ti-folder-x
- \eaac -
-
- -
- - folders -
- ti ti-folders
- \eaae -
-
- -
- - folders-off -
- ti ti-folders-off
- \f133 -
-
- -
- - forbid -
- ti ti-forbid
- \ebd5 -
-
- -
- - forbid-2 -
- ti ti-forbid-2
- \ebd4 -
-
- -
- - forklift -
- ti ti-forklift
- \ebe9 -
-
- -
- - forms -
- ti ti-forms
- \ee8f -
-
- -
- - fountain -
- ti ti-fountain
- \f09b -
-
- -
- - fountain-off -
- ti ti-fountain-off
- \f134 -
-
- -
- - frame -
- ti ti-frame
- \eaaf -
-
- -
- - frame-off -
- ti ti-frame-off
- \f135 -
-
- -
- - free-rights -
- ti ti-free-rights
- \efb6 -
-
- -
- - fridge -
- ti ti-fridge
- \f1fa -
-
- -
- - fridge-off -
- ti ti-fridge-off
- \f3ef -
-
- -
- - friends -
- ti ti-friends
- \eab0 -
-
- -
- - friends-off -
- ti ti-friends-off
- \f136 -
-
- -
- - function -
- ti ti-function
- \f225 -
-
- -
- - function-off -
- ti ti-function-off
- \f3f0 -
-
- -
- - garden-cart -
- ti ti-garden-cart
- \f23e -
-
- -
- - garden-cart-off -
- ti ti-garden-cart-off
- \f3f1 -
-
- -
- - gas-station -
- ti ti-gas-station
- \ec7d -
-
- -
- - gas-station-off -
- ti ti-gas-station-off
- \f137 -
-
- -
- - gauge -
- ti ti-gauge
- \eab1 -
-
- -
- - gauge-off -
- ti ti-gauge-off
- \f138 -
-
- -
- - gavel -
- ti ti-gavel
- \ef90 -
-
- -
- - gender-agender -
- ti ti-gender-agender
- \f0e1 -
-
- -
- - gender-androgyne -
- ti ti-gender-androgyne
- \f0e2 -
-
- -
- - gender-bigender -
- ti ti-gender-bigender
- \f0e3 -
-
- -
- - gender-demiboy -
- ti ti-gender-demiboy
- \f0e4 -
-
- -
- - gender-demigirl -
- ti ti-gender-demigirl
- \f0e5 -
-
- -
- - gender-epicene -
- ti ti-gender-epicene
- \f0e6 -
-
- -
- - gender-female -
- ti ti-gender-female
- \f0e7 -
-
- -
- - gender-femme -
- ti ti-gender-femme
- \f0e8 -
-
- -
- - gender-genderfluid -
- ti ti-gender-genderfluid
- \f0e9 -
-
- -
- - gender-genderless -
- ti ti-gender-genderless
- \f0ea -
-
- -
- - gender-genderqueer -
- ti ti-gender-genderqueer
- \f0eb -
-
- -
- - gender-hermaphrodite -
- ti ti-gender-hermaphrodite
- \f0ec -
-
- -
- - gender-intergender -
- ti ti-gender-intergender
- \f0ed -
-
- -
- - gender-male -
- ti ti-gender-male
- \f0ee -
-
- -
- - gender-neutrois -
- ti ti-gender-neutrois
- \f0ef -
-
- -
- - gender-third -
- ti ti-gender-third
- \f0f0 -
-
- -
- - gender-transgender -
- ti ti-gender-transgender
- \f0f1 -
-
- -
- - gender-trasvesti -
- ti ti-gender-trasvesti
- \f0f2 -
-
- -
- - geometry -
- ti ti-geometry
- \ee90 -
-
- -
- - ghost -
- ti ti-ghost
- \eb8e -
-
- -
- - ghost-2 -
- ti ti-ghost-2
- \f57c -
-
- -
- - ghost-2-filled -
- ti ti-ghost-2-filled
- \f74a -
-
- -
- - ghost-filled -
- ti ti-ghost-filled
- \f74b -
-
- -
- - ghost-off -
- ti ti-ghost-off
- \f3f2 -
-
- -
- - gif -
- ti ti-gif
- \f257 -
-
- -
- - gift -
- ti ti-gift
- \eb68 -
-
- -
- - gift-card -
- ti ti-gift-card
- \f3aa -
-
- -
- - gift-off -
- ti ti-gift-off
- \f3f3 -
-
- -
- - git-branch -
- ti ti-git-branch
- \eab2 -
-
- -
- - git-branch-deleted -
- ti ti-git-branch-deleted
- \f57d -
-
- -
- - git-cherry-pick -
- ti ti-git-cherry-pick
- \f57e -
-
- -
- - git-commit -
- ti ti-git-commit
- \eab3 -
-
- -
- - git-compare -
- ti ti-git-compare
- \eab4 -
-
- -
- - git-fork -
- ti ti-git-fork
- \eb8f -
-
- -
- - git-merge -
- ti ti-git-merge
- \eab5 -
-
- -
- - git-pull-request -
- ti ti-git-pull-request
- \eab6 -
-
- -
- - git-pull-request-closed -
- ti ti-git-pull-request-closed
- \ef7f -
-
- -
- - git-pull-request-draft -
- ti ti-git-pull-request-draft
- \efb7 -
-
- -
- - gizmo -
- ti ti-gizmo
- \f02b -
-
- -
- - glass -
- ti ti-glass
- \eab8 -
-
- -
- - glass-full -
- ti ti-glass-full
- \eab7 -
-
- -
- - glass-off -
- ti ti-glass-off
- \ee91 -
-
- -
- - globe -
- ti ti-globe
- \eab9 -
-
- -
- - globe-off -
- ti ti-globe-off
- \f139 -
-
- -
- - go-game -
- ti ti-go-game
- \f512 -
-
- -
- - golf -
- ti ti-golf
- \ed8c -
-
- -
- - golf-off -
- ti ti-golf-off
- \f13a -
-
- -
- - gps -
- ti ti-gps
- \ed7a -
-
- -
- - gradienter -
- ti ti-gradienter
- \f3ab -
-
- -
- - grain -
- ti ti-grain
- \ee92 -
-
- -
- - graph -
- ti ti-graph
- \f288 -
-
- -
- - graph-off -
- ti ti-graph-off
- \f3f4 -
-
- -
- - grave -
- ti ti-grave
- \f580 -
-
- -
- - grave-2 -
- ti ti-grave-2
- \f57f -
-
- -
- - grid-dots -
- ti ti-grid-dots
- \eaba -
-
- -
- - grid-pattern -
- ti ti-grid-pattern
- \efc9 -
-
- -
- - grill -
- ti ti-grill
- \efa9 -
-
- -
- - grill-fork -
- ti ti-grill-fork
- \f35b -
-
- -
- - grill-off -
- ti ti-grill-off
- \f3f5 -
-
- -
- - grill-spatula -
- ti ti-grill-spatula
- \f35c -
-
- -
- - grip-horizontal -
- ti ti-grip-horizontal
- \ec00 -
-
- -
- - grip-vertical -
- ti ti-grip-vertical
- \ec01 -
-
- -
- - growth -
- ti ti-growth
- \ee93 -
-
- -
- - guitar-pick -
- ti ti-guitar-pick
- \f4c6 -
-
- -
- - guitar-pick-filled -
- ti ti-guitar-pick-filled
- \f67b -
-
- -
- - h-1 -
- ti ti-h-1
- \ec94 -
-
- -
- - h-2 -
- ti ti-h-2
- \ec95 -
-
- -
- - h-3 -
- ti ti-h-3
- \ec96 -
-
- -
- - h-4 -
- ti ti-h-4
- \ec97 -
-
- -
- - h-5 -
- ti ti-h-5
- \ec98 -
-
- -
- - h-6 -
- ti ti-h-6
- \ec99 -
-
- -
- - hammer -
- ti ti-hammer
- \ef91 -
-
- -
- - hammer-off -
- ti ti-hammer-off
- \f13c -
-
- -
- - hand-click -
- ti ti-hand-click
- \ef4f -
-
- -
- - hand-finger -
- ti ti-hand-finger
- \ee94 -
-
- -
- - hand-finger-off -
- ti ti-hand-finger-off
- \f13d -
-
- -
- - hand-grab -
- ti ti-hand-grab
- \f091 -
-
- -
- - hand-little-finger -
- ti ti-hand-little-finger
- \ee95 -
-
- -
- - hand-middle-finger -
- ti ti-hand-middle-finger
- \ec2d -
-
- -
- - hand-move -
- ti ti-hand-move
- \ef50 -
-
- -
- - hand-off -
- ti ti-hand-off
- \ed15 -
-
- -
- - hand-ring-finger -
- ti ti-hand-ring-finger
- \ee96 -
-
- -
- - hand-rock -
- ti ti-hand-rock
- \ee97 -
-
- -
- - hand-sanitizer -
- ti ti-hand-sanitizer
- \f5f4 -
-
- -
- - hand-stop -
- ti ti-hand-stop
- \ec2e -
-
- -
- - hand-three-fingers -
- ti ti-hand-three-fingers
- \ee98 -
-
- -
- - hand-two-fingers -
- ti ti-hand-two-fingers
- \ee99 -
-
- -
- - hanger -
- ti ti-hanger
- \ee9a -
-
- -
- - hanger-2 -
- ti ti-hanger-2
- \f09c -
-
- -
- - hanger-off -
- ti ti-hanger-off
- \f13e -
-
- -
- - hash -
- ti ti-hash
- \eabc -
-
- -
- - haze -
- ti ti-haze
- \efaa -
-
- -
- - heading -
- ti ti-heading
- \ee9b -
-
- -
- - heading-off -
- ti ti-heading-off
- \f13f -
-
- -
- - headphones -
- ti ti-headphones
- \eabd -
-
- -
- - headphones-off -
- ti ti-headphones-off
- \ed1d -
-
- -
- - headset -
- ti ti-headset
- \eb90 -
-
- -
- - headset-off -
- ti ti-headset-off
- \f3f6 -
-
- -
- - health-recognition -
- ti ti-health-recognition
- \f1fb -
-
- -
- - heart -
- ti ti-heart
- \eabe -
-
- -
- - heart-broken -
- ti ti-heart-broken
- \ecba -
-
- -
- - heart-filled -
- ti ti-heart-filled
- \f67c -
-
- -
- - heart-handshake -
- ti ti-heart-handshake
- \f0f3 -
-
- -
- - heart-minus -
- ti ti-heart-minus
- \f140 -
-
- -
- - heart-off -
- ti ti-heart-off
- \f141 -
-
- -
- - heart-plus -
- ti ti-heart-plus
- \f142 -
-
- -
- - heart-rate-monitor -
- ti ti-heart-rate-monitor
- \ef61 -
-
- -
- - heartbeat -
- ti ti-heartbeat
- \ef92 -
-
- -
- - hearts -
- ti ti-hearts
- \f387 -
-
- -
- - hearts-off -
- ti ti-hearts-off
- \f3f7 -
-
- -
- - helicopter -
- ti ti-helicopter
- \ed8e -
-
- -
- - helicopter-landing -
- ti ti-helicopter-landing
- \ed8d -
-
- -
- - helmet -
- ti ti-helmet
- \efca -
-
- -
- - helmet-off -
- ti ti-helmet-off
- \f143 -
-
- -
- - help -
- ti ti-help
- \eabf -
-
- -
- - help-circle -
- ti ti-help-circle
- \f91d -
-
- -
- - help-hexagon -
- ti ti-help-hexagon
- \f7a8 -
-
- -
- - help-octagon -
- ti ti-help-octagon
- \f7a9 -
-
- -
- - help-off -
- ti ti-help-off
- \f3f8 -
-
- -
- - help-small -
- ti ti-help-small
- \f91e -
-
- -
- - help-square -
- ti ti-help-square
- \f920 -
-
- -
- - help-square-rounded -
- ti ti-help-square-rounded
- \f91f -
-
- -
- - help-triangle -
- ti ti-help-triangle
- \f921 -
-
- -
- - hexagon -
- ti ti-hexagon
- \ec02 -
-
- -
- - hexagon-0-filled -
- ti ti-hexagon-0-filled
- \f74c -
-
- -
- - hexagon-1-filled -
- ti ti-hexagon-1-filled
- \f74d -
-
- -
- - hexagon-2-filled -
- ti ti-hexagon-2-filled
- \f74e -
-
- -
- - hexagon-3-filled -
- ti ti-hexagon-3-filled
- \f74f -
-
- -
- - hexagon-3d -
- ti ti-hexagon-3d
- \f4c7 -
-
- -
- - hexagon-4-filled -
- ti ti-hexagon-4-filled
- \f750 -
-
- -
- - hexagon-5-filled -
- ti ti-hexagon-5-filled
- \f751 -
-
- -
- - hexagon-6-filled -
- ti ti-hexagon-6-filled
- \f752 -
-
- -
- - hexagon-7-filled -
- ti ti-hexagon-7-filled
- \f753 -
-
- -
- - hexagon-8-filled -
- ti ti-hexagon-8-filled
- \f754 -
-
- -
- - hexagon-9-filled -
- ti ti-hexagon-9-filled
- \f755 -
-
- -
- - hexagon-filled -
- ti ti-hexagon-filled
- \f67d -
-
- -
- - hexagon-letter-a -
- ti ti-hexagon-letter-a
- \f463 -
-
- -
- - hexagon-letter-b -
- ti ti-hexagon-letter-b
- \f464 -
-
- -
- - hexagon-letter-c -
- ti ti-hexagon-letter-c
- \f465 -
-
- -
- - hexagon-letter-d -
- ti ti-hexagon-letter-d
- \f466 -
-
- -
- - hexagon-letter-e -
- ti ti-hexagon-letter-e
- \f467 -
-
- -
- - hexagon-letter-f -
- ti ti-hexagon-letter-f
- \f468 -
-
- -
- - hexagon-letter-g -
- ti ti-hexagon-letter-g
- \f469 -
-
- -
- - hexagon-letter-h -
- ti ti-hexagon-letter-h
- \f46a -
-
- -
- - hexagon-letter-i -
- ti ti-hexagon-letter-i
- \f46b -
-
- -
- - hexagon-letter-j -
- ti ti-hexagon-letter-j
- \f46c -
-
- -
- - hexagon-letter-k -
- ti ti-hexagon-letter-k
- \f46d -
-
- -
- - hexagon-letter-l -
- ti ti-hexagon-letter-l
- \f46e -
-
- -
- - hexagon-letter-m -
- ti ti-hexagon-letter-m
- \f46f -
-
- -
- - hexagon-letter-n -
- ti ti-hexagon-letter-n
- \f470 -
-
- -
- - hexagon-letter-o -
- ti ti-hexagon-letter-o
- \f471 -
-
- -
- - hexagon-letter-p -
- ti ti-hexagon-letter-p
- \f472 -
-
- -
- - hexagon-letter-q -
- ti ti-hexagon-letter-q
- \f473 -
-
- -
- - hexagon-letter-r -
- ti ti-hexagon-letter-r
- \f474 -
-
- -
- - hexagon-letter-s -
- ti ti-hexagon-letter-s
- \f475 -
-
- -
- - hexagon-letter-t -
- ti ti-hexagon-letter-t
- \f476 -
-
- -
- - hexagon-letter-u -
- ti ti-hexagon-letter-u
- \f477 -
-
- -
- - hexagon-letter-v -
- ti ti-hexagon-letter-v
- \f4b3 -
-
- -
- - hexagon-letter-w -
- ti ti-hexagon-letter-w
- \f478 -
-
- -
- - hexagon-letter-x -
- ti ti-hexagon-letter-x
- \f479 -
-
- -
- - hexagon-letter-y -
- ti ti-hexagon-letter-y
- \f47a -
-
- -
- - hexagon-letter-z -
- ti ti-hexagon-letter-z
- \f47b -
-
- -
- - hexagon-number-0 -
- ti ti-hexagon-number-0
- \f459 -
-
- -
- - hexagon-number-1 -
- ti ti-hexagon-number-1
- \f45a -
-
- -
- - hexagon-number-2 -
- ti ti-hexagon-number-2
- \f45b -
-
- -
- - hexagon-number-3 -
- ti ti-hexagon-number-3
- \f45c -
-
- -
- - hexagon-number-4 -
- ti ti-hexagon-number-4
- \f45d -
-
- -
- - hexagon-number-5 -
- ti ti-hexagon-number-5
- \f45e -
-
- -
- - hexagon-number-6 -
- ti ti-hexagon-number-6
- \f45f -
-
- -
- - hexagon-number-7 -
- ti ti-hexagon-number-7
- \f460 -
-
- -
- - hexagon-number-8 -
- ti ti-hexagon-number-8
- \f461 -
-
- -
- - hexagon-number-9 -
- ti ti-hexagon-number-9
- \f462 -
-
- -
- - hexagon-off -
- ti ti-hexagon-off
- \ee9c -
-
- -
- - hexagons -
- ti ti-hexagons
- \f09d -
-
- -
- - hexagons-off -
- ti ti-hexagons-off
- \f3f9 -
-
- -
- - hierarchy -
- ti ti-hierarchy
- \ee9e -
-
- -
- - hierarchy-2 -
- ti ti-hierarchy-2
- \ee9d -
-
- -
- - hierarchy-3 -
- ti ti-hierarchy-3
- \f289 -
-
- -
- - hierarchy-off -
- ti ti-hierarchy-off
- \f3fa -
-
- -
- - highlight -
- ti ti-highlight
- \ef3f -
-
- -
- - highlight-off -
- ti ti-highlight-off
- \f144 -
-
- -
- - history -
- ti ti-history
- \ebea -
-
- -
- - history-off -
- ti ti-history-off
- \f3fb -
-
- -
- - history-toggle -
- ti ti-history-toggle
- \f1fc -
-
- -
- - home -
- ti ti-home
- \eac1 -
-
- -
- - home-2 -
- ti ti-home-2
- \eac0 -
-
- -
- - home-bolt -
- ti ti-home-bolt
- \f336 -
-
- -
- - home-cancel -
- ti ti-home-cancel
- \f350 -
-
- -
- - home-check -
- ti ti-home-check
- \f337 -
-
- -
- - home-cog -
- ti ti-home-cog
- \f338 -
-
- -
- - home-dollar -
- ti ti-home-dollar
- \f339 -
-
- -
- - home-dot -
- ti ti-home-dot
- \f33a -
-
- -
- - home-down -
- ti ti-home-down
- \f33b -
-
- -
- - home-eco -
- ti ti-home-eco
- \f351 -
-
- -
- - home-edit -
- ti ti-home-edit
- \f352 -
-
- -
- - home-exclamation -
- ti ti-home-exclamation
- \f33c -
-
- -
- - home-hand -
- ti ti-home-hand
- \f504 -
-
- -
- - home-heart -
- ti ti-home-heart
- \f353 -
-
- -
- - home-infinity -
- ti ti-home-infinity
- \f505 -
-
- -
- - home-link -
- ti ti-home-link
- \f354 -
-
- -
- - home-minus -
- ti ti-home-minus
- \f33d -
-
- -
- - home-move -
- ti ti-home-move
- \f33e -
-
- -
- - home-off -
- ti ti-home-off
- \f145 -
-
- -
- - home-plus -
- ti ti-home-plus
- \f33f -
-
- -
- - home-question -
- ti ti-home-question
- \f340 -
-
- -
- - home-ribbon -
- ti ti-home-ribbon
- \f355 -
-
- -
- - home-search -
- ti ti-home-search
- \f341 -
-
- -
- - home-share -
- ti ti-home-share
- \f342 -
-
- -
- - home-shield -
- ti ti-home-shield
- \f343 -
-
- -
- - home-signal -
- ti ti-home-signal
- \f356 -
-
- -
- - home-star -
- ti ti-home-star
- \f344 -
-
- -
- - home-stats -
- ti ti-home-stats
- \f345 -
-
- -
- - home-up -
- ti ti-home-up
- \f346 -
-
- -
- - home-x -
- ti ti-home-x
- \f347 -
-
- -
- - horse-toy -
- ti ti-horse-toy
- \f28a -
-
- -
- - hotel-service -
- ti ti-hotel-service
- \ef80 -
-
- -
- - hourglass -
- ti ti-hourglass
- \ef93 -
-
- -
- - hourglass-empty -
- ti ti-hourglass-empty
- \f146 -
-
- -
- - hourglass-filled -
- ti ti-hourglass-filled
- \f756 -
-
- -
- - hourglass-high -
- ti ti-hourglass-high
- \f092 -
-
- -
- - hourglass-low -
- ti ti-hourglass-low
- \f093 -
-
- -
- - hourglass-off -
- ti ti-hourglass-off
- \f147 -
-
- -
- - html -
- ti ti-html
- \f7b1 -
-
- -
- - ice-cream -
- ti ti-ice-cream
- \eac2 -
-
- -
- - ice-cream-2 -
- ti ti-ice-cream-2
- \ee9f -
-
- -
- - ice-cream-off -
- ti ti-ice-cream-off
- \f148 -
-
- -
- - ice-skating -
- ti ti-ice-skating
- \efcb -
-
- -
- - icons -
- ti ti-icons
- \f1d4 -
-
- -
- - icons-off -
- ti ti-icons-off
- \f3fc -
-
- -
- - id -
- ti ti-id
- \eac3 -
-
- -
- - id-badge -
- ti ti-id-badge
- \eff7 -
-
- -
- - id-badge-2 -
- ti ti-id-badge-2
- \f076 -
-
- -
- - id-badge-off -
- ti ti-id-badge-off
- \f3fd -
-
- -
- - id-off -
- ti ti-id-off
- \f149 -
-
- -
- - inbox -
- ti ti-inbox
- \eac4 -
-
- -
- - inbox-off -
- ti ti-inbox-off
- \f14a -
-
- -
- - indent-decrease -
- ti ti-indent-decrease
- \eb91 -
-
- -
- - indent-increase -
- ti ti-indent-increase
- \eb92 -
-
- -
- - infinity -
- ti ti-infinity
- \eb69 -
-
- -
- - infinity-off -
- ti ti-infinity-off
- \f3fe -
-
- -
- - info-circle -
- ti ti-info-circle
- \eac5 -
-
- -
- - info-circle-filled -
- ti ti-info-circle-filled
- \f6d8 -
-
- -
- - info-hexagon -
- ti ti-info-hexagon
- \f7aa -
-
- -
- - info-octagon -
- ti ti-info-octagon
- \f7ab -
-
- -
- - info-small -
- ti ti-info-small
- \f922 -
-
- -
- - info-square -
- ti ti-info-square
- \eac6 -
-
- -
- - info-square-rounded -
- ti ti-info-square-rounded
- \f635 -
-
- -
- - info-square-rounded-filled -
- ti ti-info-square-rounded-filled
- \f6d9 -
-
- -
- - info-triangle -
- ti ti-info-triangle
- \f923 -
-
- -
- - inner-shadow-bottom -
- ti ti-inner-shadow-bottom
- \f520 -
-
- -
- - inner-shadow-bottom-filled -
- ti ti-inner-shadow-bottom-filled
- \f757 -
-
- -
- - inner-shadow-bottom-left -
- ti ti-inner-shadow-bottom-left
- \f51e -
-
- -
- - inner-shadow-bottom-left-filled -
- ti ti-inner-shadow-bottom-left-filled
- \f758 -
-
- -
- - inner-shadow-bottom-right -
- ti ti-inner-shadow-bottom-right
- \f51f -
-
- -
- - inner-shadow-bottom-right-filled -
- ti ti-inner-shadow-bottom-right-filled
- \f759 -
-
- -
- - inner-shadow-left -
- ti ti-inner-shadow-left
- \f521 -
-
- -
- - inner-shadow-left-filled -
- ti ti-inner-shadow-left-filled
- \f75a -
-
- -
- - inner-shadow-right -
- ti ti-inner-shadow-right
- \f522 -
-
- -
- - inner-shadow-right-filled -
- ti ti-inner-shadow-right-filled
- \f75b -
-
- -
- - inner-shadow-top -
- ti ti-inner-shadow-top
- \f525 -
-
- -
- - inner-shadow-top-filled -
- ti ti-inner-shadow-top-filled
- \f75c -
-
- -
- - inner-shadow-top-left -
- ti ti-inner-shadow-top-left
- \f523 -
-
- -
- - inner-shadow-top-left-filled -
- ti ti-inner-shadow-top-left-filled
- \f75d -
-
- -
- - inner-shadow-top-right -
- ti ti-inner-shadow-top-right
- \f524 -
-
- -
- - inner-shadow-top-right-filled -
- ti ti-inner-shadow-top-right-filled
- \f75e -
-
- -
- - input-search -
- ti ti-input-search
- \f2a2 -
-
- -
- - ironing-1 -
- ti ti-ironing-1
- \f2f4 -
-
- -
- - ironing-2 -
- ti ti-ironing-2
- \f2f5 -
-
- -
- - ironing-3 -
- ti ti-ironing-3
- \f2f6 -
-
- -
- - ironing-off -
- ti ti-ironing-off
- \f2f7 -
-
- -
- - ironing-steam -
- ti ti-ironing-steam
- \f2f9 -
-
- -
- - ironing-steam-off -
- ti ti-ironing-steam-off
- \f2f8 -
-
- -
- - italic -
- ti ti-italic
- \eb93 -
-
- -
- - jacket -
- ti ti-jacket
- \f661 -
-
- -
- - jetpack -
- ti ti-jetpack
- \f581 -
-
- -
- - jewish-star -
- ti ti-jewish-star
- \f3ff -
-
- -
- - jewish-star-filled -
- ti ti-jewish-star-filled
- \f67e -
-
- -
- - jpg -
- ti ti-jpg
- \f3ac -
-
- -
- - json -
- ti ti-json
- \f7b2 -
-
- -
- - jump-rope -
- ti ti-jump-rope
- \ed8f -
-
- -
- - karate -
- ti ti-karate
- \ed32 -
-
- -
- - kayak -
- ti ti-kayak
- \f1d6 -
-
- -
- - kering -
- ti ti-kering
- \efb8 -
-
- -
- - key -
- ti ti-key
- \eac7 -
-
- -
- - key-off -
- ti ti-key-off
- \f14b -
-
- -
- - keyboard -
- ti ti-keyboard
- \ebd6 -
-
- -
- - keyboard-hide -
- ti ti-keyboard-hide
- \ec7e -
-
- -
- - keyboard-off -
- ti ti-keyboard-off
- \eea0 -
-
- -
- - keyboard-show -
- ti ti-keyboard-show
- \ec7f -
-
- -
- - keyframe -
- ti ti-keyframe
- \f576 -
-
- -
- - keyframe-align-center -
- ti ti-keyframe-align-center
- \f582 -
-
- -
- - keyframe-align-horizontal -
- ti ti-keyframe-align-horizontal
- \f583 -
-
- -
- - keyframe-align-vertical -
- ti ti-keyframe-align-vertical
- \f584 -
-
- -
- - keyframes -
- ti ti-keyframes
- \f585 -
-
- -
- - ladder -
- ti ti-ladder
- \efe2 -
-
- -
- - ladder-off -
- ti ti-ladder-off
- \f14c -
-
- -
- - lambda -
- ti ti-lambda
- \f541 -
-
- -
- - lamp -
- ti ti-lamp
- \efab -
-
- -
- - lamp-2 -
- ti ti-lamp-2
- \f09e -
-
- -
- - lamp-off -
- ti ti-lamp-off
- \f14d -
-
- -
- - language -
- ti ti-language
- \ebbe -
-
- -
- - language-hiragana -
- ti ti-language-hiragana
- \ef77 -
-
- -
- - language-katakana -
- ti ti-language-katakana
- \ef78 -
-
- -
- - language-off -
- ti ti-language-off
- \f14e -
-
- -
- - lasso -
- ti ti-lasso
- \efac -
-
- -
- - lasso-off -
- ti ti-lasso-off
- \f14f -
-
- -
- - lasso-polygon -
- ti ti-lasso-polygon
- \f388 -
-
- -
- - layers-difference -
- ti ti-layers-difference
- \eac8 -
-
- -
- - layers-intersect -
- ti ti-layers-intersect
- \eac9 -
-
- -
- - layers-intersect-2 -
- ti ti-layers-intersect-2
- \eff8 -
-
- -
- - layers-linked -
- ti ti-layers-linked
- \eea1 -
-
- -
- - layers-off -
- ti ti-layers-off
- \f150 -
-
- -
- - layers-subtract -
- ti ti-layers-subtract
- \eaca -
-
- -
- - layers-union -
- ti ti-layers-union
- \eacb -
-
- -
- - layout -
- ti ti-layout
- \eadb -
-
- -
- - layout-2 -
- ti ti-layout-2
- \eacc -
-
- -
- - layout-align-bottom -
- ti ti-layout-align-bottom
- \eacd -
-
- -
- - layout-align-center -
- ti ti-layout-align-center
- \eace -
-
- -
- - layout-align-left -
- ti ti-layout-align-left
- \eacf -
-
- -
- - layout-align-middle -
- ti ti-layout-align-middle
- \ead0 -
-
- -
- - layout-align-right -
- ti ti-layout-align-right
- \ead1 -
-
- -
- - layout-align-top -
- ti ti-layout-align-top
- \ead2 -
-
- -
- - layout-board -
- ti ti-layout-board
- \ef95 -
-
- -
- - layout-board-split -
- ti ti-layout-board-split
- \ef94 -
-
- -
- - layout-bottombar -
- ti ti-layout-bottombar
- \ead3 -
-
- -
- - layout-bottombar-collapse -
- ti ti-layout-bottombar-collapse
- \f28b -
-
- -
- - layout-bottombar-expand -
- ti ti-layout-bottombar-expand
- \f28c -
-
- -
- - layout-cards -
- ti ti-layout-cards
- \ec13 -
-
- -
- - layout-collage -
- ti ti-layout-collage
- \f389 -
-
- -
- - layout-columns -
- ti ti-layout-columns
- \ead4 -
-
- -
- - layout-dashboard -
- ti ti-layout-dashboard
- \f02c -
-
- -
- - layout-distribute-horizontal -
- ti ti-layout-distribute-horizontal
- \ead5 -
-
- -
- - layout-distribute-vertical -
- ti ti-layout-distribute-vertical
- \ead6 -
-
- -
- - layout-grid -
- ti ti-layout-grid
- \edba -
-
- -
- - layout-grid-add -
- ti ti-layout-grid-add
- \edb9 -
-
- -
- - layout-kanban -
- ti ti-layout-kanban
- \ec3f -
-
- -
- - layout-list -
- ti ti-layout-list
- \ec14 -
-
- -
- - layout-navbar -
- ti ti-layout-navbar
- \ead7 -
-
- -
- - layout-navbar-collapse -
- ti ti-layout-navbar-collapse
- \f28d -
-
- -
- - layout-navbar-expand -
- ti ti-layout-navbar-expand
- \f28e -
-
- -
- - layout-off -
- ti ti-layout-off
- \f151 -
-
- -
- - layout-rows -
- ti ti-layout-rows
- \ead8 -
-
- -
- - layout-sidebar -
- ti ti-layout-sidebar
- \eada -
-
- -
- - layout-sidebar-left-collapse -
- ti ti-layout-sidebar-left-collapse
- \f004 -
-
- -
- - layout-sidebar-left-expand -
- ti ti-layout-sidebar-left-expand
- \f005 -
-
- -
- - layout-sidebar-right -
- ti ti-layout-sidebar-right
- \ead9 -
-
- -
- - layout-sidebar-right-collapse -
- ti ti-layout-sidebar-right-collapse
- \f006 -
-
- -
- - layout-sidebar-right-expand -
- ti ti-layout-sidebar-right-expand
- \f007 -
-
- -
- - leaf -
- ti ti-leaf
- \ed4f -
-
- -
- - leaf-off -
- ti ti-leaf-off
- \f400 -
-
- -
- - lego -
- ti ti-lego
- \eadc -
-
- -
- - lego-off -
- ti ti-lego-off
- \f401 -
-
- -
- - lemon -
- ti ti-lemon
- \ef10 -
-
- -
- - lemon-2 -
- ti ti-lemon-2
- \ef81 -
-
- -
- - letter-a -
- ti ti-letter-a
- \ec50 -
-
- -
- - letter-b -
- ti ti-letter-b
- \ec51 -
-
- -
- - letter-c -
- ti ti-letter-c
- \ec52 -
-
- -
- - letter-case -
- ti ti-letter-case
- \eea5 -
-
- -
- - letter-case-lower -
- ti ti-letter-case-lower
- \eea2 -
-
- -
- - letter-case-toggle -
- ti ti-letter-case-toggle
- \eea3 -
-
- -
- - letter-case-upper -
- ti ti-letter-case-upper
- \eea4 -
-
- -
- - letter-d -
- ti ti-letter-d
- \ec53 -
-
- -
- - letter-e -
- ti ti-letter-e
- \ec54 -
-
- -
- - letter-f -
- ti ti-letter-f
- \ec55 -
-
- -
- - letter-g -
- ti ti-letter-g
- \ec56 -
-
- -
- - letter-h -
- ti ti-letter-h
- \ec57 -
-
- -
- - letter-i -
- ti ti-letter-i
- \ec58 -
-
- -
- - letter-j -
- ti ti-letter-j
- \ec59 -
-
- -
- - letter-k -
- ti ti-letter-k
- \ec5a -
-
- -
- - letter-l -
- ti ti-letter-l
- \ec5b -
-
- -
- - letter-m -
- ti ti-letter-m
- \ec5c -
-
- -
- - letter-n -
- ti ti-letter-n
- \ec5d -
-
- -
- - letter-o -
- ti ti-letter-o
- \ec5e -
-
- -
- - letter-p -
- ti ti-letter-p
- \ec5f -
-
- -
- - letter-q -
- ti ti-letter-q
- \ec60 -
-
- -
- - letter-r -
- ti ti-letter-r
- \ec61 -
-
- -
- - letter-s -
- ti ti-letter-s
- \ec62 -
-
- -
- - letter-spacing -
- ti ti-letter-spacing
- \eea6 -
-
- -
- - letter-t -
- ti ti-letter-t
- \ec63 -
-
- -
- - letter-u -
- ti ti-letter-u
- \ec64 -
-
- -
- - letter-v -
- ti ti-letter-v
- \ec65 -
-
- -
- - letter-w -
- ti ti-letter-w
- \ec66 -
-
- -
- - letter-x -
- ti ti-letter-x
- \ec67 -
-
- -
- - letter-y -
- ti ti-letter-y
- \ec68 -
-
- -
- - letter-z -
- ti ti-letter-z
- \ec69 -
-
- -
- - license -
- ti ti-license
- \ebc0 -
-
- -
- - license-off -
- ti ti-license-off
- \f153 -
-
- -
- - lifebuoy -
- ti ti-lifebuoy
- \eadd -
-
- -
- - lifebuoy-off -
- ti ti-lifebuoy-off
- \f154 -
-
- -
- - lighter -
- ti ti-lighter
- \f794 -
-
- -
- - line -
- ti ti-line
- \ec40 -
-
- -
- - line-dashed -
- ti ti-line-dashed
- \eea7 -
-
- -
- - line-dotted -
- ti ti-line-dotted
- \eea8 -
-
- -
- - line-height -
- ti ti-line-height
- \eb94 -
-
- -
- - link -
- ti ti-link
- \eade -
-
- -
- - link-off -
- ti ti-link-off
- \f402 -
-
- -
- - list -
- ti ti-list
- \eb6b -
-
- -
- - list-check -
- ti ti-list-check
- \eb6a -
-
- -
- - list-details -
- ti ti-list-details
- \ef40 -
-
- -
- - list-numbers -
- ti ti-list-numbers
- \ef11 -
-
- -
- - list-search -
- ti ti-list-search
- \eea9 -
-
- -
- - live-photo -
- ti ti-live-photo
- \eadf -
-
- -
- - live-photo-off -
- ti ti-live-photo-off
- \f403 -
-
- -
- - live-view -
- ti ti-live-view
- \ec6b -
-
- -
- - loader -
- ti ti-loader
- \eca3 -
-
- -
- - loader-2 -
- ti ti-loader-2
- \f226 -
-
- -
- - loader-3 -
- ti ti-loader-3
- \f513 -
-
- -
- - loader-quarter -
- ti ti-loader-quarter
- \eca2 -
-
- -
- - location -
- ti ti-location
- \eae0 -
-
- -
- - location-broken -
- ti ti-location-broken
- \f2c4 -
-
- -
- - location-filled -
- ti ti-location-filled
- \f67f -
-
- -
- - location-off -
- ti ti-location-off
- \f155 -
-
- -
- - lock -
- ti ti-lock
- \eae2 -
-
- -
- - lock-access -
- ti ti-lock-access
- \eeaa -
-
- -
- - lock-access-off -
- ti ti-lock-access-off
- \f404 -
-
- -
- - lock-bolt -
- ti ti-lock-bolt
- \f924 -
-
- -
- - lock-cancel -
- ti ti-lock-cancel
- \f925 -
-
- -
- - lock-check -
- ti ti-lock-check
- \f926 -
-
- -
- - lock-code -
- ti ti-lock-code
- \f927 -
-
- -
- - lock-cog -
- ti ti-lock-cog
- \f928 -
-
- -
- - lock-dollar -
- ti ti-lock-dollar
- \f929 -
-
- -
- - lock-down -
- ti ti-lock-down
- \f92a -
-
- -
- - lock-exclamation -
- ti ti-lock-exclamation
- \f92b -
-
- -
- - lock-heart -
- ti ti-lock-heart
- \f92c -
-
- -
- - lock-minus -
- ti ti-lock-minus
- \f92d -
-
- -
- - lock-off -
- ti ti-lock-off
- \ed1e -
-
- -
- - lock-open -
- ti ti-lock-open
- \eae1 -
-
- -
- - lock-open-off -
- ti ti-lock-open-off
- \f156 -
-
- -
- - lock-pause -
- ti ti-lock-pause
- \f92e -
-
- -
- - lock-pin -
- ti ti-lock-pin
- \f92f -
-
- -
- - lock-plus -
- ti ti-lock-plus
- \f930 -
-
- -
- - lock-question -
- ti ti-lock-question
- \f931 -
-
- -
- - lock-search -
- ti ti-lock-search
- \f932 -
-
- -
- - lock-share -
- ti ti-lock-share
- \f933 -
-
- -
- - lock-square -
- ti ti-lock-square
- \ef51 -
-
- -
- - lock-square-rounded -
- ti ti-lock-square-rounded
- \f636 -
-
- -
- - lock-square-rounded-filled -
- ti ti-lock-square-rounded-filled
- \f6da -
-
- -
- - lock-star -
- ti ti-lock-star
- \f934 -
-
- -
- - lock-up -
- ti ti-lock-up
- \f935 -
-
- -
- - lock-x -
- ti ti-lock-x
- \f936 -
-
- -
- - logic-and -
- ti ti-logic-and
- \f240 -
-
- -
- - logic-buffer -
- ti ti-logic-buffer
- \f241 -
-
- -
- - logic-nand -
- ti ti-logic-nand
- \f242 -
-
- -
- - logic-nor -
- ti ti-logic-nor
- \f243 -
-
- -
- - logic-not -
- ti ti-logic-not
- \f244 -
-
- -
- - logic-or -
- ti ti-logic-or
- \f245 -
-
- -
- - logic-xnor -
- ti ti-logic-xnor
- \f246 -
-
- -
- - logic-xor -
- ti ti-logic-xor
- \f247 -
-
- -
- - login -
- ti ti-login
- \eba7 -
-
- -
- - logout -
- ti ti-logout
- \eba8 -
-
- -
- - lollipop -
- ti ti-lollipop
- \efcc -
-
- -
- - lollipop-off -
- ti ti-lollipop-off
- \f157 -
-
- -
- - luggage -
- ti ti-luggage
- \efad -
-
- -
- - luggage-off -
- ti ti-luggage-off
- \f158 -
-
- -
- - lungs -
- ti ti-lungs
- \ef62 -
-
- -
- - lungs-off -
- ti ti-lungs-off
- \f405 -
-
- -
- - macro -
- ti ti-macro
- \eeab -
-
- -
- - macro-off -
- ti ti-macro-off
- \f406 -
-
- -
- - magnet -
- ti ti-magnet
- \eae3 -
-
- -
- - magnet-off -
- ti ti-magnet-off
- \f159 -
-
- -
- - mail -
- ti ti-mail
- \eae5 -
-
- -
- - mail-bolt -
- ti ti-mail-bolt
- \f937 -
-
- -
- - mail-cancel -
- ti ti-mail-cancel
- \f938 -
-
- -
- - mail-check -
- ti ti-mail-check
- \f939 -
-
- -
- - mail-code -
- ti ti-mail-code
- \f93a -
-
- -
- - mail-cog -
- ti ti-mail-cog
- \f93b -
-
- -
- - mail-dollar -
- ti ti-mail-dollar
- \f93c -
-
- -
- - mail-down -
- ti ti-mail-down
- \f93d -
-
- -
- - mail-exclamation -
- ti ti-mail-exclamation
- \f93e -
-
- -
- - mail-fast -
- ti ti-mail-fast
- \f069 -
-
- -
- - mail-forward -
- ti ti-mail-forward
- \eeac -
-
- -
- - mail-heart -
- ti ti-mail-heart
- \f93f -
-
- -
- - mail-minus -
- ti ti-mail-minus
- \f940 -
-
- -
- - mail-off -
- ti ti-mail-off
- \f15a -
-
- -
- - mail-opened -
- ti ti-mail-opened
- \eae4 -
-
- -
- - mail-pause -
- ti ti-mail-pause
- \f941 -
-
- -
- - mail-pin -
- ti ti-mail-pin
- \f942 -
-
- -
- - mail-plus -
- ti ti-mail-plus
- \f943 -
-
- -
- - mail-question -
- ti ti-mail-question
- \f944 -
-
- -
- - mail-search -
- ti ti-mail-search
- \f945 -
-
- -
- - mail-share -
- ti ti-mail-share
- \f946 -
-
- -
- - mail-star -
- ti ti-mail-star
- \f947 -
-
- -
- - mail-up -
- ti ti-mail-up
- \f948 -
-
- -
- - mail-x -
- ti ti-mail-x
- \f949 -
-
- -
- - mailbox -
- ti ti-mailbox
- \eead -
-
- -
- - mailbox-off -
- ti ti-mailbox-off
- \f15b -
-
- -
- - man -
- ti ti-man
- \eae6 -
-
- -
- - manual-gearbox -
- ti ti-manual-gearbox
- \ed7b -
-
- -
- - map -
- ti ti-map
- \eae9 -
-
- -
- - map-2 -
- ti ti-map-2
- \eae7 -
-
- -
- - map-off -
- ti ti-map-off
- \f15c -
-
- -
- - map-pin -
- ti ti-map-pin
- \eae8 -
-
- -
- - map-pin-bolt -
- ti ti-map-pin-bolt
- \f94a -
-
- -
- - map-pin-cancel -
- ti ti-map-pin-cancel
- \f94b -
-
- -
- - map-pin-check -
- ti ti-map-pin-check
- \f94c -
-
- -
- - map-pin-code -
- ti ti-map-pin-code
- \f94d -
-
- -
- - map-pin-cog -
- ti ti-map-pin-cog
- \f94e -
-
- -
- - map-pin-dollar -
- ti ti-map-pin-dollar
- \f94f -
-
- -
- - map-pin-down -
- ti ti-map-pin-down
- \f950 -
-
- -
- - map-pin-exclamation -
- ti ti-map-pin-exclamation
- \f951 -
-
- -
- - map-pin-filled -
- ti ti-map-pin-filled
- \f680 -
-
- -
- - map-pin-heart -
- ti ti-map-pin-heart
- \f952 -
-
- -
- - map-pin-minus -
- ti ti-map-pin-minus
- \f953 -
-
- -
- - map-pin-off -
- ti ti-map-pin-off
- \ecf3 -
-
- -
- - map-pin-pause -
- ti ti-map-pin-pause
- \f954 -
-
- -
- - map-pin-pin -
- ti ti-map-pin-pin
- \f955 -
-
- -
- - map-pin-plus -
- ti ti-map-pin-plus
- \f956 -
-
- -
- - map-pin-question -
- ti ti-map-pin-question
- \f957 -
-
- -
- - map-pin-search -
- ti ti-map-pin-search
- \f958 -
-
- -
- - map-pin-share -
- ti ti-map-pin-share
- \f795 -
-
- -
- - map-pin-star -
- ti ti-map-pin-star
- \f959 -
-
- -
- - map-pin-up -
- ti ti-map-pin-up
- \f95a -
-
- -
- - map-pin-x -
- ti ti-map-pin-x
- \f95b -
-
- -
- - map-pins -
- ti ti-map-pins
- \ed5e -
-
- -
- - map-search -
- ti ti-map-search
- \ef82 -
-
- -
- - markdown -
- ti ti-markdown
- \ec41 -
-
- -
- - markdown-off -
- ti ti-markdown-off
- \f407 -
-
- -
- - marquee -
- ti ti-marquee
- \ec77 -
-
- -
- - marquee-2 -
- ti ti-marquee-2
- \eeae -
-
- -
- - marquee-off -
- ti ti-marquee-off
- \f15d -
-
- -
- - mars -
- ti ti-mars
- \ec80 -
-
- -
- - mask -
- ti ti-mask
- \eeb0 -
-
- -
- - mask-off -
- ti ti-mask-off
- \eeaf -
-
- -
- - masks-theater -
- ti ti-masks-theater
- \f263 -
-
- -
- - masks-theater-off -
- ti ti-masks-theater-off
- \f408 -
-
- -
- - massage -
- ti ti-massage
- \eeb1 -
-
- -
- - matchstick -
- ti ti-matchstick
- \f577 -
-
- -
- - math -
- ti ti-math
- \ebeb -
-
- -
- - math-1-divide-2 -
- ti ti-math-1-divide-2
- \f4e2 -
-
- -
- - math-1-divide-3 -
- ti ti-math-1-divide-3
- \f4e3 -
-
- -
- - math-avg -
- ti ti-math-avg
- \f0f4 -
-
- -
- - math-equal-greater -
- ti ti-math-equal-greater
- \f4e4 -
-
- -
- - math-equal-lower -
- ti ti-math-equal-lower
- \f4e5 -
-
- -
- - math-function -
- ti ti-math-function
- \eeb2 -
-
- -
- - math-function-off -
- ti ti-math-function-off
- \f15e -
-
- -
- - math-function-y -
- ti ti-math-function-y
- \f4e6 -
-
- -
- - math-greater -
- ti ti-math-greater
- \f4e7 -
-
- -
- - math-integral -
- ti ti-math-integral
- \f4e9 -
-
- -
- - math-integral-x -
- ti ti-math-integral-x
- \f4e8 -
-
- -
- - math-integrals -
- ti ti-math-integrals
- \f4ea -
-
- -
- - math-lower -
- ti ti-math-lower
- \f4eb -
-
- -
- - math-max -
- ti ti-math-max
- \f0f5 -
-
- -
- - math-min -
- ti ti-math-min
- \f0f6 -
-
- -
- - math-not -
- ti ti-math-not
- \f4ec -
-
- -
- - math-off -
- ti ti-math-off
- \f409 -
-
- -
- - math-pi -
- ti ti-math-pi
- \f4ee -
-
- -
- - math-pi-divide-2 -
- ti ti-math-pi-divide-2
- \f4ed -
-
- -
- - math-symbols -
- ti ti-math-symbols
- \eeb3 -
-
- -
- - math-x-divide-2 -
- ti ti-math-x-divide-2
- \f4ef -
-
- -
- - math-x-divide-y -
- ti ti-math-x-divide-y
- \f4f1 -
-
- -
- - math-x-divide-y-2 -
- ti ti-math-x-divide-y-2
- \f4f0 -
-
- -
- - math-x-minus-x -
- ti ti-math-x-minus-x
- \f4f2 -
-
- -
- - math-x-minus-y -
- ti ti-math-x-minus-y
- \f4f3 -
-
- -
- - math-x-plus-x -
- ti ti-math-x-plus-x
- \f4f4 -
-
- -
- - math-x-plus-y -
- ti ti-math-x-plus-y
- \f4f5 -
-
- -
- - math-xy -
- ti ti-math-xy
- \f4f6 -
-
- -
- - math-y-minus-y -
- ti ti-math-y-minus-y
- \f4f7 -
-
- -
- - math-y-plus-y -
- ti ti-math-y-plus-y
- \f4f8 -
-
- -
- - maximize -
- ti ti-maximize
- \eaea -
-
- -
- - maximize-off -
- ti ti-maximize-off
- \f15f -
-
- -
- - meat -
- ti ti-meat
- \ef12 -
-
- -
- - meat-off -
- ti ti-meat-off
- \f40a -
-
- -
- - medal -
- ti ti-medal
- \ec78 -
-
- -
- - medal-2 -
- ti ti-medal-2
- \efcd -
-
- -
- - medical-cross -
- ti ti-medical-cross
- \ec2f -
-
- -
- - medical-cross-filled -
- ti ti-medical-cross-filled
- \f681 -
-
- -
- - medical-cross-off -
- ti ti-medical-cross-off
- \f160 -
-
- -
- - medicine-syrup -
- ti ti-medicine-syrup
- \ef63 -
-
- -
- - meeple -
- ti ti-meeple
- \f514 -
-
- -
- - menorah -
- ti ti-menorah
- \f58c -
-
- -
- - menu -
- ti ti-menu
- \eaeb -
-
- -
- - menu-2 -
- ti ti-menu-2
- \ec42 -
-
- -
- - menu-order -
- ti ti-menu-order
- \f5f5 -
-
- -
- - message -
- ti ti-message
- \eaef -
-
- -
- - message-2 -
- ti ti-message-2
- \eaec -
-
- -
- - message-2-bolt -
- ti ti-message-2-bolt
- \f95c -
-
- -
- - message-2-cancel -
- ti ti-message-2-cancel
- \f95d -
-
- -
- - message-2-check -
- ti ti-message-2-check
- \f95e -
-
- -
- - message-2-code -
- ti ti-message-2-code
- \f012 -
-
- -
- - message-2-cog -
- ti ti-message-2-cog
- \f95f -
-
- -
- - message-2-dollar -
- ti ti-message-2-dollar
- \f960 -
-
- -
- - message-2-down -
- ti ti-message-2-down
- \f961 -
-
- -
- - message-2-exclamation -
- ti ti-message-2-exclamation
- \f962 -
-
- -
- - message-2-heart -
- ti ti-message-2-heart
- \f963 -
-
- -
- - message-2-minus -
- ti ti-message-2-minus
- \f964 -
-
- -
- - message-2-off -
- ti ti-message-2-off
- \f40b -
-
- -
- - message-2-pause -
- ti ti-message-2-pause
- \f965 -
-
- -
- - message-2-pin -
- ti ti-message-2-pin
- \f966 -
-
- -
- - message-2-plus -
- ti ti-message-2-plus
- \f967 -
-
- -
- - message-2-question -
- ti ti-message-2-question
- \f968 -
-
- -
- - message-2-search -
- ti ti-message-2-search
- \f969 -
-
- -
- - message-2-share -
- ti ti-message-2-share
- \f077 -
-
- -
- - message-2-star -
- ti ti-message-2-star
- \f96a -
-
- -
- - message-2-up -
- ti ti-message-2-up
- \f96b -
-
- -
- - message-2-x -
- ti ti-message-2-x
- \f96c -
-
- -
- - message-bolt -
- ti ti-message-bolt
- \f96d -
-
- -
- - message-cancel -
- ti ti-message-cancel
- \f96e -
-
- -
- - message-chatbot -
- ti ti-message-chatbot
- \f38a -
-
- -
- - message-check -
- ti ti-message-check
- \f96f -
-
- -
- - message-circle -
- ti ti-message-circle
- \eaed -
-
- -
- - message-circle-2 -
- ti ti-message-circle-2
- \ed3f -
-
- -
- - message-circle-2-filled -
- ti ti-message-circle-2-filled
- \f682 -
-
- -
- - message-circle-bolt -
- ti ti-message-circle-bolt
- \f970 -
-
- -
- - message-circle-cancel -
- ti ti-message-circle-cancel
- \f971 -
-
- -
- - message-circle-check -
- ti ti-message-circle-check
- \f972 -
-
- -
- - message-circle-code -
- ti ti-message-circle-code
- \f973 -
-
- -
- - message-circle-cog -
- ti ti-message-circle-cog
- \f974 -
-
- -
- - message-circle-dollar -
- ti ti-message-circle-dollar
- \f975 -
-
- -
- - message-circle-down -
- ti ti-message-circle-down
- \f976 -
-
- -
- - message-circle-exclamation -
- ti ti-message-circle-exclamation
- \f977 -
-
- -
- - message-circle-heart -
- ti ti-message-circle-heart
- \f978 -
-
- -
- - message-circle-minus -
- ti ti-message-circle-minus
- \f979 -
-
- -
- - message-circle-off -
- ti ti-message-circle-off
- \ed40 -
-
- -
- - message-circle-pause -
- ti ti-message-circle-pause
- \f97a -
-
- -
- - message-circle-pin -
- ti ti-message-circle-pin
- \f97b -
-
- -
- - message-circle-plus -
- ti ti-message-circle-plus
- \f97c -
-
- -
- - message-circle-question -
- ti ti-message-circle-question
- \f97d -
-
- -
- - message-circle-search -
- ti ti-message-circle-search
- \f97e -
-
- -
- - message-circle-share -
- ti ti-message-circle-share
- \f97f -
-
- -
- - message-circle-star -
- ti ti-message-circle-star
- \f980 -
-
- -
- - message-circle-up -
- ti ti-message-circle-up
- \f981 -
-
- -
- - message-circle-x -
- ti ti-message-circle-x
- \f982 -
-
- -
- - message-code -
- ti ti-message-code
- \f013 -
-
- -
- - message-cog -
- ti ti-message-cog
- \f983 -
-
- -
- - message-dollar -
- ti ti-message-dollar
- \f984 -
-
- -
- - message-dots -
- ti ti-message-dots
- \eaee -
-
- -
- - message-down -
- ti ti-message-down
- \f985 -
-
- -
- - message-exclamation -
- ti ti-message-exclamation
- \f986 -
-
- -
- - message-forward -
- ti ti-message-forward
- \f28f -
-
- -
- - message-heart -
- ti ti-message-heart
- \f987 -
-
- -
- - message-language -
- ti ti-message-language
- \efae -
-
- -
- - message-minus -
- ti ti-message-minus
- \f988 -
-
- -
- - message-off -
- ti ti-message-off
- \ed41 -
-
- -
- - message-pause -
- ti ti-message-pause
- \f989 -
-
- -
- - message-pin -
- ti ti-message-pin
- \f98a -
-
- -
- - message-plus -
- ti ti-message-plus
- \ec9a -
-
- -
- - message-question -
- ti ti-message-question
- \f98b -
-
- -
- - message-report -
- ti ti-message-report
- \ec9b -
-
- -
- - message-search -
- ti ti-message-search
- \f98c -
-
- -
- - message-share -
- ti ti-message-share
- \f078 -
-
- -
- - message-star -
- ti ti-message-star
- \f98d -
-
- -
- - message-up -
- ti ti-message-up
- \f98e -
-
- -
- - message-x -
- ti ti-message-x
- \f98f -
-
- -
- - messages -
- ti ti-messages
- \eb6c -
-
- -
- - messages-off -
- ti ti-messages-off
- \ed42 -
-
- -
- - meteor -
- ti ti-meteor
- \f1fd -
-
- -
- - meteor-off -
- ti ti-meteor-off
- \f40c -
-
- -
- - mickey -
- ti ti-mickey
- \f2a3 -
-
- -
- - mickey-filled -
- ti ti-mickey-filled
- \f683 -
-
- -
- - microphone -
- ti ti-microphone
- \eaf0 -
-
- -
- - microphone-2 -
- ti ti-microphone-2
- \ef2c -
-
- -
- - microphone-2-off -
- ti ti-microphone-2-off
- \f40d -
-
- -
- - microphone-off -
- ti ti-microphone-off
- \ed16 -
-
- -
- - microscope -
- ti ti-microscope
- \ef64 -
-
- -
- - microscope-off -
- ti ti-microscope-off
- \f40e -
-
- -
- - microwave -
- ti ti-microwave
- \f248 -
-
- -
- - microwave-off -
- ti ti-microwave-off
- \f264 -
-
- -
- - military-award -
- ti ti-military-award
- \f079 -
-
- -
- - military-rank -
- ti ti-military-rank
- \efcf -
-
- -
- - milk -
- ti ti-milk
- \ef13 -
-
- -
- - milk-off -
- ti ti-milk-off
- \f40f -
-
- -
- - milkshake -
- ti ti-milkshake
- \f4c8 -
-
- -
- - minimize -
- ti ti-minimize
- \eaf1 -
-
- -
- - minus -
- ti ti-minus
- \eaf2 -
-
- -
- - minus-vertical -
- ti ti-minus-vertical
- \eeb4 -
-
- -
- - mist -
- ti ti-mist
- \ec30 -
-
- -
- - mist-off -
- ti ti-mist-off
- \f410 -
-
- -
- - mobiledata -
- ti ti-mobiledata
- \f9f5 -
-
- -
- - mobiledata-off -
- ti ti-mobiledata-off
- \f9f4 -
-
- -
- - moneybag -
- ti ti-moneybag
- \f506 -
-
- -
- - mood-angry -
- ti ti-mood-angry
- \f2de -
-
- -
- - mood-annoyed -
- ti ti-mood-annoyed
- \f2e0 -
-
- -
- - mood-annoyed-2 -
- ti ti-mood-annoyed-2
- \f2df -
-
- -
- - mood-boy -
- ti ti-mood-boy
- \ed2d -
-
- -
- - mood-check -
- ti ti-mood-check
- \f7b3 -
-
- -
- - mood-cog -
- ti ti-mood-cog
- \f7b4 -
-
- -
- - mood-confuzed -
- ti ti-mood-confuzed
- \eaf3 -
-
- -
- - mood-confuzed-filled -
- ti ti-mood-confuzed-filled
- \f7f2 -
-
- -
- - mood-crazy-happy -
- ti ti-mood-crazy-happy
- \ed90 -
-
- -
- - mood-cry -
- ti ti-mood-cry
- \ecbb -
-
- -
- - mood-dollar -
- ti ti-mood-dollar
- \f7b5 -
-
- -
- - mood-empty -
- ti ti-mood-empty
- \eeb5 -
-
- -
- - mood-empty-filled -
- ti ti-mood-empty-filled
- \f7f3 -
-
- -
- - mood-happy -
- ti ti-mood-happy
- \eaf4 -
-
- -
- - mood-happy-filled -
- ti ti-mood-happy-filled
- \f7f4 -
-
- -
- - mood-heart -
- ti ti-mood-heart
- \f7b6 -
-
- -
- - mood-kid -
- ti ti-mood-kid
- \ec03 -
-
- -
- - mood-kid-filled -
- ti ti-mood-kid-filled
- \f7f5 -
-
- -
- - mood-look-left -
- ti ti-mood-look-left
- \f2c5 -
-
- -
- - mood-look-right -
- ti ti-mood-look-right
- \f2c6 -
-
- -
- - mood-minus -
- ti ti-mood-minus
- \f7b7 -
-
- -
- - mood-nerd -
- ti ti-mood-nerd
- \f2e1 -
-
- -
- - mood-nervous -
- ti ti-mood-nervous
- \ef96 -
-
- -
- - mood-neutral -
- ti ti-mood-neutral
- \eaf5 -
-
- -
- - mood-neutral-filled -
- ti ti-mood-neutral-filled
- \f7f6 -
-
- -
- - mood-off -
- ti ti-mood-off
- \f161 -
-
- -
- - mood-pin -
- ti ti-mood-pin
- \f7b8 -
-
- -
- - mood-plus -
- ti ti-mood-plus
- \f7b9 -
-
- -
- - mood-sad -
- ti ti-mood-sad
- \eaf6 -
-
- -
- - mood-sad-2 -
- ti ti-mood-sad-2
- \f2e2 -
-
- -
- - mood-sad-dizzy -
- ti ti-mood-sad-dizzy
- \f2e3 -
-
- -
- - mood-sad-filled -
- ti ti-mood-sad-filled
- \f7f7 -
-
- -
- - mood-sad-squint -
- ti ti-mood-sad-squint
- \f2e4 -
-
- -
- - mood-search -
- ti ti-mood-search
- \f7ba -
-
- -
- - mood-sick -
- ti ti-mood-sick
- \f2e5 -
-
- -
- - mood-silence -
- ti ti-mood-silence
- \f2e6 -
-
- -
- - mood-sing -
- ti ti-mood-sing
- \f2c7 -
-
- -
- - mood-smile -
- ti ti-mood-smile
- \eaf7 -
-
- -
- - mood-smile-beam -
- ti ti-mood-smile-beam
- \f2e7 -
-
- -
- - mood-smile-dizzy -
- ti ti-mood-smile-dizzy
- \f2e8 -
-
- -
- - mood-smile-filled -
- ti ti-mood-smile-filled
- \f7f8 -
-
- -
- - mood-suprised -
- ti ti-mood-suprised
- \ec04 -
-
- -
- - mood-tongue -
- ti ti-mood-tongue
- \eb95 -
-
- -
- - mood-tongue-wink -
- ti ti-mood-tongue-wink
- \f2ea -
-
- -
- - mood-tongue-wink-2 -
- ti ti-mood-tongue-wink-2
- \f2e9 -
-
- -
- - mood-unamused -
- ti ti-mood-unamused
- \f2eb -
-
- -
- - mood-up -
- ti ti-mood-up
- \f7bb -
-
- -
- - mood-wink -
- ti ti-mood-wink
- \f2ed -
-
- -
- - mood-wink-2 -
- ti ti-mood-wink-2
- \f2ec -
-
- -
- - mood-wrrr -
- ti ti-mood-wrrr
- \f2ee -
-
- -
- - mood-x -
- ti ti-mood-x
- \f7bc -
-
- -
- - mood-xd -
- ti ti-mood-xd
- \f2ef -
-
- -
- - moon -
- ti ti-moon
- \eaf8 -
-
- -
- - moon-2 -
- ti ti-moon-2
- \ece6 -
-
- -
- - moon-filled -
- ti ti-moon-filled
- \f684 -
-
- -
- - moon-off -
- ti ti-moon-off
- \f162 -
-
- -
- - moon-stars -
- ti ti-moon-stars
- \ece7 -
-
- -
- - moped -
- ti ti-moped
- \ecbc -
-
- -
- - motorbike -
- ti ti-motorbike
- \eeb6 -
-
- -
- - mountain -
- ti ti-mountain
- \ef97 -
-
- -
- - mountain-off -
- ti ti-mountain-off
- \f411 -
-
- -
- - mouse -
- ti ti-mouse
- \eaf9 -
-
- -
- - mouse-2 -
- ti ti-mouse-2
- \f1d7 -
-
- -
- - mouse-off -
- ti ti-mouse-off
- \f163 -
-
- -
- - moustache -
- ti ti-moustache
- \f4c9 -
-
- -
- - movie -
- ti ti-movie
- \eafa -
-
- -
- - movie-off -
- ti ti-movie-off
- \f164 -
-
- -
- - mug -
- ti ti-mug
- \eafb -
-
- -
- - mug-off -
- ti ti-mug-off
- \f165 -
-
- -
- - multiplier-0-5x -
- ti ti-multiplier-0-5x
- \ef41 -
-
- -
- - multiplier-1-5x -
- ti ti-multiplier-1-5x
- \ef42 -
-
- -
- - multiplier-1x -
- ti ti-multiplier-1x
- \ef43 -
-
- -
- - multiplier-2x -
- ti ti-multiplier-2x
- \ef44 -
-
- -
- - mushroom -
- ti ti-mushroom
- \ef14 -
-
- -
- - mushroom-filled -
- ti ti-mushroom-filled
- \f7f9 -
-
- -
- - mushroom-off -
- ti ti-mushroom-off
- \f412 -
-
- -
- - music -
- ti ti-music
- \eafc -
-
- -
- - music-off -
- ti ti-music-off
- \f166 -
-
- -
- - navigation -
- ti ti-navigation
- \f2c8 -
-
- -
- - navigation-filled -
- ti ti-navigation-filled
- \f685 -
-
- -
- - navigation-off -
- ti ti-navigation-off
- \f413 -
-
- -
- - needle -
- ti ti-needle
- \f508 -
-
- -
- - needle-thread -
- ti ti-needle-thread
- \f507 -
-
- -
- - network -
- ti ti-network
- \f09f -
-
- -
- - network-off -
- ti ti-network-off
- \f414 -
-
- -
- - new-section -
- ti ti-new-section
- \ebc1 -
-
- -
- - news -
- ti ti-news
- \eafd -
-
- -
- - news-off -
- ti ti-news-off
- \f167 -
-
- -
- - nfc -
- ti ti-nfc
- \eeb7 -
-
- -
- - nfc-off -
- ti ti-nfc-off
- \f168 -
-
- -
- - no-copyright -
- ti ti-no-copyright
- \efb9 -
-
- -
- - no-creative-commons -
- ti ti-no-creative-commons
- \efba -
-
- -
- - no-derivatives -
- ti ti-no-derivatives
- \efbb -
-
- -
- - north-star -
- ti ti-north-star
- \f014 -
-
- -
- - note -
- ti ti-note
- \eb6d -
-
- -
- - note-off -
- ti ti-note-off
- \f169 -
-
- -
- - notebook -
- ti ti-notebook
- \eb96 -
-
- -
- - notebook-off -
- ti ti-notebook-off
- \f415 -
-
- -
- - notes -
- ti ti-notes
- \eb6e -
-
- -
- - notes-off -
- ti ti-notes-off
- \f16a -
-
- -
- - notification -
- ti ti-notification
- \eafe -
-
- -
- - notification-off -
- ti ti-notification-off
- \f16b -
-
- -
- - number -
- ti ti-number
- \f1fe -
-
- -
- - number-0 -
- ti ti-number-0
- \edf0 -
-
- -
- - number-1 -
- ti ti-number-1
- \edf1 -
-
- -
- - number-2 -
- ti ti-number-2
- \edf2 -
-
- -
- - number-3 -
- ti ti-number-3
- \edf3 -
-
- -
- - number-4 -
- ti ti-number-4
- \edf4 -
-
- -
- - number-5 -
- ti ti-number-5
- \edf5 -
-
- -
- - number-6 -
- ti ti-number-6
- \edf6 -
-
- -
- - number-7 -
- ti ti-number-7
- \edf7 -
-
- -
- - number-8 -
- ti ti-number-8
- \edf8 -
-
- -
- - number-9 -
- ti ti-number-9
- \edf9 -
-
- -
- - numbers -
- ti ti-numbers
- \f015 -
-
- -
- - nurse -
- ti ti-nurse
- \ef65 -
-
- -
- - octagon -
- ti ti-octagon
- \ecbd -
-
- -
- - octagon-filled -
- ti ti-octagon-filled
- \f686 -
-
- -
- - octagon-off -
- ti ti-octagon-off
- \eeb8 -
-
- -
- - old -
- ti ti-old
- \eeb9 -
-
- -
- - olympics -
- ti ti-olympics
- \eeba -
-
- -
- - olympics-off -
- ti ti-olympics-off
- \f416 -
-
- -
- - om -
- ti ti-om
- \f58d -
-
- -
- - omega -
- ti ti-omega
- \eb97 -
-
- -
- - outbound -
- ti ti-outbound
- \f249 -
-
- -
- - outlet -
- ti ti-outlet
- \ebd7 -
-
- -
- - oval -
- ti ti-oval
- \f02e -
-
- -
- - oval-filled -
- ti ti-oval-filled
- \f687 -
-
- -
- - oval-vertical -
- ti ti-oval-vertical
- \f02d -
-
- -
- - oval-vertical-filled -
- ti ti-oval-vertical-filled
- \f688 -
-
- -
- - overline -
- ti ti-overline
- \eebb -
-
- -
- - package -
- ti ti-package
- \eaff -
-
- -
- - package-export -
- ti ti-package-export
- \f07a -
-
- -
- - package-import -
- ti ti-package-import
- \f07b -
-
- -
- - package-off -
- ti ti-package-off
- \f16c -
-
- -
- - packages -
- ti ti-packages
- \f2c9 -
-
- -
- - pacman -
- ti ti-pacman
- \eebc -
-
- -
- - page-break -
- ti ti-page-break
- \ec81 -
-
- -
- - paint -
- ti ti-paint
- \eb00 -
-
- -
- - paint-filled -
- ti ti-paint-filled
- \f75f -
-
- -
- - paint-off -
- ti ti-paint-off
- \f16d -
-
- -
- - palette -
- ti ti-palette
- \eb01 -
-
- -
- - palette-off -
- ti ti-palette-off
- \f16e -
-
- -
- - panorama-horizontal -
- ti ti-panorama-horizontal
- \ed33 -
-
- -
- - panorama-horizontal-off -
- ti ti-panorama-horizontal-off
- \f417 -
-
- -
- - panorama-vertical -
- ti ti-panorama-vertical
- \ed34 -
-
- -
- - panorama-vertical-off -
- ti ti-panorama-vertical-off
- \f418 -
-
- -
- - paper-bag -
- ti ti-paper-bag
- \f02f -
-
- -
- - paper-bag-off -
- ti ti-paper-bag-off
- \f16f -
-
- -
- - paperclip -
- ti ti-paperclip
- \eb02 -
-
- -
- - parachute -
- ti ti-parachute
- \ed7c -
-
- -
- - parachute-off -
- ti ti-parachute-off
- \f170 -
-
- -
- - parentheses -
- ti ti-parentheses
- \ebd8 -
-
- -
- - parentheses-off -
- ti ti-parentheses-off
- \f171 -
-
- -
- - parking -
- ti ti-parking
- \eb03 -
-
- -
- - parking-off -
- ti ti-parking-off
- \f172 -
-
- -
- - password -
- ti ti-password
- \f4ca -
-
- -
- - paw -
- ti ti-paw
- \eff9 -
-
- -
- - paw-filled -
- ti ti-paw-filled
- \f689 -
-
- -
- - paw-off -
- ti ti-paw-off
- \f419 -
-
- -
- - pdf -
- ti ti-pdf
- \f7ac -
-
- -
- - peace -
- ti ti-peace
- \ecbe -
-
- -
- - pencil -
- ti ti-pencil
- \eb04 -
-
- -
- - pencil-minus -
- ti ti-pencil-minus
- \f1eb -
-
- -
- - pencil-off -
- ti ti-pencil-off
- \f173 -
-
- -
- - pencil-plus -
- ti ti-pencil-plus
- \f1ec -
-
- -
- - pennant -
- ti ti-pennant
- \ed7d -
-
- -
- - pennant-2 -
- ti ti-pennant-2
- \f06a -
-
- -
- - pennant-2-filled -
- ti ti-pennant-2-filled
- \f68a -
-
- -
- - pennant-filled -
- ti ti-pennant-filled
- \f68b -
-
- -
- - pennant-off -
- ti ti-pennant-off
- \f174 -
-
- -
- - pentagon -
- ti ti-pentagon
- \efe3 -
-
- -
- - pentagon-filled -
- ti ti-pentagon-filled
- \f68c -
-
- -
- - pentagon-off -
- ti ti-pentagon-off
- \f41a -
-
- -
- - pentagram -
- ti ti-pentagram
- \f586 -
-
- -
- - pepper -
- ti ti-pepper
- \ef15 -
-
- -
- - pepper-off -
- ti ti-pepper-off
- \f175 -
-
- -
- - percentage -
- ti ti-percentage
- \ecf4 -
-
- -
- - perfume -
- ti ti-perfume
- \f509 -
-
- -
- - perspective -
- ti ti-perspective
- \eebd -
-
- -
- - perspective-off -
- ti ti-perspective-off
- \f176 -
-
- -
- - phone -
- ti ti-phone
- \eb09 -
-
- -
- - phone-call -
- ti ti-phone-call
- \eb05 -
-
- -
- - phone-calling -
- ti ti-phone-calling
- \ec43 -
-
- -
- - phone-check -
- ti ti-phone-check
- \ec05 -
-
- -
- - phone-incoming -
- ti ti-phone-incoming
- \eb06 -
-
- -
- - phone-off -
- ti ti-phone-off
- \ecf5 -
-
- -
- - phone-outgoing -
- ti ti-phone-outgoing
- \eb07 -
-
- -
- - phone-pause -
- ti ti-phone-pause
- \eb08 -
-
- -
- - phone-plus -
- ti ti-phone-plus
- \ec06 -
-
- -
- - phone-x -
- ti ti-phone-x
- \ec07 -
-
- -
- - photo -
- ti ti-photo
- \eb0a -
-
- -
- - photo-bolt -
- ti ti-photo-bolt
- \f990 -
-
- -
- - photo-cancel -
- ti ti-photo-cancel
- \f35d -
-
- -
- - photo-check -
- ti ti-photo-check
- \f35e -
-
- -
- - photo-code -
- ti ti-photo-code
- \f991 -
-
- -
- - photo-cog -
- ti ti-photo-cog
- \f992 -
-
- -
- - photo-dollar -
- ti ti-photo-dollar
- \f993 -
-
- -
- - photo-down -
- ti ti-photo-down
- \f35f -
-
- -
- - photo-edit -
- ti ti-photo-edit
- \f360 -
-
- -
- - photo-exclamation -
- ti ti-photo-exclamation
- \f994 -
-
- -
- - photo-heart -
- ti ti-photo-heart
- \f361 -
-
- -
- - photo-minus -
- ti ti-photo-minus
- \f362 -
-
- -
- - photo-off -
- ti ti-photo-off
- \ecf6 -
-
- -
- - photo-pause -
- ti ti-photo-pause
- \f995 -
-
- -
- - photo-pin -
- ti ti-photo-pin
- \f996 -
-
- -
- - photo-plus -
- ti ti-photo-plus
- \f363 -
-
- -
- - photo-question -
- ti ti-photo-question
- \f997 -
-
- -
- - photo-search -
- ti ti-photo-search
- \f364 -
-
- -
- - photo-sensor -
- ti ti-photo-sensor
- \f798 -
-
- -
- - photo-sensor-2 -
- ti ti-photo-sensor-2
- \f796 -
-
- -
- - photo-sensor-3 -
- ti ti-photo-sensor-3
- \f797 -
-
- -
- - photo-share -
- ti ti-photo-share
- \f998 -
-
- -
- - photo-shield -
- ti ti-photo-shield
- \f365 -
-
- -
- - photo-star -
- ti ti-photo-star
- \f366 -
-
- -
- - photo-up -
- ti ti-photo-up
- \f38b -
-
- -
- - photo-x -
- ti ti-photo-x
- \f367 -
-
- -
- - physotherapist -
- ti ti-physotherapist
- \eebe -
-
- -
- - picture-in-picture -
- ti ti-picture-in-picture
- \ed35 -
-
- -
- - picture-in-picture-off -
- ti ti-picture-in-picture-off
- \ed43 -
-
- -
- - picture-in-picture-on -
- ti ti-picture-in-picture-on
- \ed44 -
-
- -
- - picture-in-picture-top -
- ti ti-picture-in-picture-top
- \efe4 -
-
- -
- - pig -
- ti ti-pig
- \ef52 -
-
- -
- - pig-money -
- ti ti-pig-money
- \f38c -
-
- -
- - pig-off -
- ti ti-pig-off
- \f177 -
-
- -
- - pilcrow -
- ti ti-pilcrow
- \f5f6 -
-
- -
- - pill -
- ti ti-pill
- \ec44 -
-
- -
- - pill-off -
- ti ti-pill-off
- \f178 -
-
- -
- - pills -
- ti ti-pills
- \ef66 -
-
- -
- - pin -
- ti ti-pin
- \ec9c -
-
- -
- - pin-filled -
- ti ti-pin-filled
- \f68d -
-
- -
- - ping-pong -
- ti ti-ping-pong
- \f38d -
-
- -
- - pinned -
- ti ti-pinned
- \ed60 -
-
- -
- - pinned-filled -
- ti ti-pinned-filled
- \f68e -
-
- -
- - pinned-off -
- ti ti-pinned-off
- \ed5f -
-
- -
- - pizza -
- ti ti-pizza
- \edbb -
-
- -
- - pizza-off -
- ti ti-pizza-off
- \f179 -
-
- -
- - placeholder -
- ti ti-placeholder
- \f626 -
-
- -
- - plane -
- ti ti-plane
- \eb6f -
-
- -
- - plane-arrival -
- ti ti-plane-arrival
- \eb99 -
-
- -
- - plane-departure -
- ti ti-plane-departure
- \eb9a -
-
- -
- - plane-inflight -
- ti ti-plane-inflight
- \ef98 -
-
- -
- - plane-off -
- ti ti-plane-off
- \f17a -
-
- -
- - plane-tilt -
- ti ti-plane-tilt
- \f1ed -
-
- -
- - planet -
- ti ti-planet
- \ec08 -
-
- -
- - planet-off -
- ti ti-planet-off
- \f17b -
-
- -
- - plant -
- ti ti-plant
- \ed50 -
-
- -
- - plant-2 -
- ti ti-plant-2
- \ed7e -
-
- -
- - plant-2-off -
- ti ti-plant-2-off
- \f17c -
-
- -
- - plant-off -
- ti ti-plant-off
- \f17d -
-
- -
- - play-card -
- ti ti-play-card
- \eebf -
-
- -
- - play-card-off -
- ti ti-play-card-off
- \f17e -
-
- -
- - player-eject -
- ti ti-player-eject
- \efbc -
-
- -
- - player-eject-filled -
- ti ti-player-eject-filled
- \f68f -
-
- -
- - player-pause -
- ti ti-player-pause
- \ed45 -
-
- -
- - player-pause-filled -
- ti ti-player-pause-filled
- \f690 -
-
- -
- - player-play -
- ti ti-player-play
- \ed46 -
-
- -
- - player-play-filled -
- ti ti-player-play-filled
- \f691 -
-
- -
- - player-record -
- ti ti-player-record
- \ed47 -
-
- -
- - player-record-filled -
- ti ti-player-record-filled
- \f692 -
-
- -
- - player-skip-back -
- ti ti-player-skip-back
- \ed48 -
-
- -
- - player-skip-back-filled -
- ti ti-player-skip-back-filled
- \f693 -
-
- -
- - player-skip-forward -
- ti ti-player-skip-forward
- \ed49 -
-
- -
- - player-skip-forward-filled -
- ti ti-player-skip-forward-filled
- \f694 -
-
- -
- - player-stop -
- ti ti-player-stop
- \ed4a -
-
- -
- - player-stop-filled -
- ti ti-player-stop-filled
- \f695 -
-
- -
- - player-track-next -
- ti ti-player-track-next
- \ed4b -
-
- -
- - player-track-next-filled -
- ti ti-player-track-next-filled
- \f696 -
-
- -
- - player-track-prev -
- ti ti-player-track-prev
- \ed4c -
-
- -
- - player-track-prev-filled -
- ti ti-player-track-prev-filled
- \f697 -
-
- -
- - playlist -
- ti ti-playlist
- \eec0 -
-
- -
- - playlist-add -
- ti ti-playlist-add
- \f008 -
-
- -
- - playlist-off -
- ti ti-playlist-off
- \f17f -
-
- -
- - playlist-x -
- ti ti-playlist-x
- \f009 -
-
- -
- - playstation-circle -
- ti ti-playstation-circle
- \f2ad -
-
- -
- - playstation-square -
- ti ti-playstation-square
- \f2ae -
-
- -
- - playstation-triangle -
- ti ti-playstation-triangle
- \f2af -
-
- -
- - playstation-x -
- ti ti-playstation-x
- \f2b0 -
-
- -
- - plug -
- ti ti-plug
- \ebd9 -
-
- -
- - plug-connected -
- ti ti-plug-connected
- \f00a -
-
- -
- - plug-connected-x -
- ti ti-plug-connected-x
- \f0a0 -
-
- -
- - plug-off -
- ti ti-plug-off
- \f180 -
-
- -
- - plug-x -
- ti ti-plug-x
- \f0a1 -
-
- -
- - plus -
- ti ti-plus
- \eb0b -
-
- -
- - plus-equal -
- ti ti-plus-equal
- \f7ad -
-
- -
- - plus-minus -
- ti ti-plus-minus
- \f7ae -
-
- -
- - png -
- ti ti-png
- \f3ad -
-
- -
- - podium -
- ti ti-podium
- \f1d8 -
-
- -
- - podium-off -
- ti ti-podium-off
- \f41b -
-
- -
- - point -
- ti ti-point
- \eb0c -
-
- -
- - point-filled -
- ti ti-point-filled
- \f698 -
-
- -
- - point-off -
- ti ti-point-off
- \f181 -
-
- -
- - pointer -
- ti ti-pointer
- \f265 -
-
- -
- - pointer-bolt -
- ti ti-pointer-bolt
- \f999 -
-
- -
- - pointer-cancel -
- ti ti-pointer-cancel
- \f99a -
-
- -
- - pointer-check -
- ti ti-pointer-check
- \f99b -
-
- -
- - pointer-code -
- ti ti-pointer-code
- \f99c -
-
- -
- - pointer-cog -
- ti ti-pointer-cog
- \f99d -
-
- -
- - pointer-dollar -
- ti ti-pointer-dollar
- \f99e -
-
- -
- - pointer-down -
- ti ti-pointer-down
- \f99f -
-
- -
- - pointer-exclamation -
- ti ti-pointer-exclamation
- \f9a0 -
-
- -
- - pointer-heart -
- ti ti-pointer-heart
- \f9a1 -
-
- -
- - pointer-minus -
- ti ti-pointer-minus
- \f9a2 -
-
- -
- - pointer-off -
- ti ti-pointer-off
- \f9a3 -
-
- -
- - pointer-pause -
- ti ti-pointer-pause
- \f9a4 -
-
- -
- - pointer-pin -
- ti ti-pointer-pin
- \f9a5 -
-
- -
- - pointer-plus -
- ti ti-pointer-plus
- \f9a6 -
-
- -
- - pointer-question -
- ti ti-pointer-question
- \f9a7 -
-
- -
- - pointer-search -
- ti ti-pointer-search
- \f9a8 -
-
- -
- - pointer-share -
- ti ti-pointer-share
- \f9a9 -
-
- -
- - pointer-star -
- ti ti-pointer-star
- \f9aa -
-
- -
- - pointer-up -
- ti ti-pointer-up
- \f9ab -
-
- -
- - pointer-x -
- ti ti-pointer-x
- \f9ac -
-
- -
- - pokeball -
- ti ti-pokeball
- \eec1 -
-
- -
- - pokeball-off -
- ti ti-pokeball-off
- \f41c -
-
- -
- - poker-chip -
- ti ti-poker-chip
- \f515 -
-
- -
- - polaroid -
- ti ti-polaroid
- \eec2 -
-
- -
- - polygon -
- ti ti-polygon
- \efd0 -
-
- -
- - polygon-off -
- ti ti-polygon-off
- \f182 -
-
- -
- - poo -
- ti ti-poo
- \f258 -
-
- -
- - pool -
- ti ti-pool
- \ed91 -
-
- -
- - pool-off -
- ti ti-pool-off
- \f41d -
-
- -
- - power -
- ti ti-power
- \eb0d -
-
- -
- - pray -
- ti ti-pray
- \ecbf -
-
- -
- - premium-rights -
- ti ti-premium-rights
- \efbd -
-
- -
- - prescription -
- ti ti-prescription
- \ef99 -
-
- -
- - presentation -
- ti ti-presentation
- \eb70 -
-
- -
- - presentation-analytics -
- ti ti-presentation-analytics
- \eec3 -
-
- -
- - presentation-off -
- ti ti-presentation-off
- \f183 -
-
- -
- - printer -
- ti ti-printer
- \eb0e -
-
- -
- - printer-off -
- ti ti-printer-off
- \f184 -
-
- -
- - prison -
- ti ti-prison
- \ef79 -
-
- -
- - prompt -
- ti ti-prompt
- \eb0f -
-
- -
- - propeller -
- ti ti-propeller
- \eec4 -
-
- -
- - propeller-off -
- ti ti-propeller-off
- \f185 -
-
- -
- - pumpkin-scary -
- ti ti-pumpkin-scary
- \f587 -
-
- -
- - puzzle -
- ti ti-puzzle
- \eb10 -
-
- -
- - puzzle-2 -
- ti ti-puzzle-2
- \ef83 -
-
- -
- - puzzle-filled -
- ti ti-puzzle-filled
- \f699 -
-
- -
- - puzzle-off -
- ti ti-puzzle-off
- \f186 -
-
- -
- - pyramid -
- ti ti-pyramid
- \eec5 -
-
- -
- - pyramid-off -
- ti ti-pyramid-off
- \f187 -
-
- -
- - qrcode -
- ti ti-qrcode
- \eb11 -
-
- -
- - qrcode-off -
- ti ti-qrcode-off
- \f41e -
-
- -
- - question-mark -
- ti ti-question-mark
- \ec9d -
-
- -
- - quote -
- ti ti-quote
- \efbe -
-
- -
- - quote-off -
- ti ti-quote-off
- \f188 -
-
- -
- - radar -
- ti ti-radar
- \f017 -
-
- -
- - radar-2 -
- ti ti-radar-2
- \f016 -
-
- -
- - radar-off -
- ti ti-radar-off
- \f41f -
-
- -
- - radio -
- ti ti-radio
- \ef2d -
-
- -
- - radio-off -
- ti ti-radio-off
- \f420 -
-
- -
- - radioactive -
- ti ti-radioactive
- \ecc0 -
-
- -
- - radioactive-filled -
- ti ti-radioactive-filled
- \f760 -
-
- -
- - radioactive-off -
- ti ti-radioactive-off
- \f189 -
-
- -
- - radius-bottom-left -
- ti ti-radius-bottom-left
- \eec6 -
-
- -
- - radius-bottom-right -
- ti ti-radius-bottom-right
- \eec7 -
-
- -
- - radius-top-left -
- ti ti-radius-top-left
- \eec8 -
-
- -
- - radius-top-right -
- ti ti-radius-top-right
- \eec9 -
-
- -
- - rainbow -
- ti ti-rainbow
- \edbc -
-
- -
- - rainbow-off -
- ti ti-rainbow-off
- \f18a -
-
- -
- - rating-12-plus -
- ti ti-rating-12-plus
- \f266 -
-
- -
- - rating-14-plus -
- ti ti-rating-14-plus
- \f267 -
-
- -
- - rating-16-plus -
- ti ti-rating-16-plus
- \f268 -
-
- -
- - rating-18-plus -
- ti ti-rating-18-plus
- \f269 -
-
- -
- - rating-21-plus -
- ti ti-rating-21-plus
- \f26a -
-
- -
- - razor -
- ti ti-razor
- \f4b5 -
-
- -
- - razor-electric -
- ti ti-razor-electric
- \f4b4 -
-
- -
- - receipt -
- ti ti-receipt
- \edfd -
-
- -
- - receipt-2 -
- ti ti-receipt-2
- \edfa -
-
- -
- - receipt-off -
- ti ti-receipt-off
- \edfb -
-
- -
- - receipt-refund -
- ti ti-receipt-refund
- \edfc -
-
- -
- - receipt-tax -
- ti ti-receipt-tax
- \edbd -
-
- -
- - recharging -
- ti ti-recharging
- \eeca -
-
- -
- - record-mail -
- ti ti-record-mail
- \eb12 -
-
- -
- - record-mail-off -
- ti ti-record-mail-off
- \f18b -
-
- -
- - rectangle -
- ti ti-rectangle
- \ed37 -
-
- -
- - rectangle-filled -
- ti ti-rectangle-filled
- \f69a -
-
- -
- - rectangle-vertical -
- ti ti-rectangle-vertical
- \ed36 -
-
- -
- - rectangle-vertical-filled -
- ti ti-rectangle-vertical-filled
- \f69b -
-
- -
- - recycle -
- ti ti-recycle
- \eb9b -
-
- -
- - recycle-off -
- ti ti-recycle-off
- \f18c -
-
- -
- - refresh -
- ti ti-refresh
- \eb13 -
-
- -
- - refresh-alert -
- ti ti-refresh-alert
- \ed57 -
-
- -
- - refresh-dot -
- ti ti-refresh-dot
- \efbf -
-
- -
- - refresh-off -
- ti ti-refresh-off
- \f18d -
-
- -
- - regex -
- ti ti-regex
- \f31f -
-
- -
- - regex-off -
- ti ti-regex-off
- \f421 -
-
- -
- - registered -
- ti ti-registered
- \eb14 -
-
- -
- - relation-many-to-many -
- ti ti-relation-many-to-many
- \ed7f -
-
- -
- - relation-one-to-many -
- ti ti-relation-one-to-many
- \ed80 -
-
- -
- - relation-one-to-one -
- ti ti-relation-one-to-one
- \ed81 -
-
- -
- - reload -
- ti ti-reload
- \f3ae -
-
- -
- - repeat -
- ti ti-repeat
- \eb72 -
-
- -
- - repeat-off -
- ti ti-repeat-off
- \f18e -
-
- -
- - repeat-once -
- ti ti-repeat-once
- \eb71 -
-
- -
- - replace -
- ti ti-replace
- \ebc7 -
-
- -
- - replace-filled -
- ti ti-replace-filled
- \f69c -
-
- -
- - replace-off -
- ti ti-replace-off
- \f422 -
-
- -
- - report -
- ti ti-report
- \eece -
-
- -
- - report-analytics -
- ti ti-report-analytics
- \eecb -
-
- -
- - report-medical -
- ti ti-report-medical
- \eecc -
-
- -
- - report-money -
- ti ti-report-money
- \eecd -
-
- -
- - report-off -
- ti ti-report-off
- \f18f -
-
- -
- - report-search -
- ti ti-report-search
- \ef84 -
-
- -
- - reserved-line -
- ti ti-reserved-line
- \f9f6 -
-
- -
- - resize -
- ti ti-resize
- \eecf -
-
- -
- - ribbon-health -
- ti ti-ribbon-health
- \f58e -
-
- -
- - ripple -
- ti ti-ripple
- \ed82 -
-
- -
- - ripple-off -
- ti ti-ripple-off
- \f190 -
-
- -
- - road -
- ti ti-road
- \f018 -
-
- -
- - road-off -
- ti ti-road-off
- \f191 -
-
- -
- - road-sign -
- ti ti-road-sign
- \ecdd -
-
- -
- - robot -
- ti ti-robot
- \f00b -
-
- -
- - robot-off -
- ti ti-robot-off
- \f192 -
-
- -
- - rocket -
- ti ti-rocket
- \ec45 -
-
- -
- - rocket-off -
- ti ti-rocket-off
- \f193 -
-
- -
- - roller-skating -
- ti ti-roller-skating
- \efd1 -
-
- -
- - rollercoaster -
- ti ti-rollercoaster
- \f0a2 -
-
- -
- - rollercoaster-off -
- ti ti-rollercoaster-off
- \f423 -
-
- -
- - rosette -
- ti ti-rosette
- \f599 -
-
- -
- - rosette-filled -
- ti ti-rosette-filled
- \f69d -
-
- -
- - rosette-number-0 -
- ti ti-rosette-number-0
- \f58f -
-
- -
- - rosette-number-1 -
- ti ti-rosette-number-1
- \f590 -
-
- -
- - rosette-number-2 -
- ti ti-rosette-number-2
- \f591 -
-
- -
- - rosette-number-3 -
- ti ti-rosette-number-3
- \f592 -
-
- -
- - rosette-number-4 -
- ti ti-rosette-number-4
- \f593 -
-
- -
- - rosette-number-5 -
- ti ti-rosette-number-5
- \f594 -
-
- -
- - rosette-number-6 -
- ti ti-rosette-number-6
- \f595 -
-
- -
- - rosette-number-7 -
- ti ti-rosette-number-7
- \f596 -
-
- -
- - rosette-number-8 -
- ti ti-rosette-number-8
- \f597 -
-
- -
- - rosette-number-9 -
- ti ti-rosette-number-9
- \f598 -
-
- -
- - rotate -
- ti ti-rotate
- \eb16 -
-
- -
- - rotate-2 -
- ti ti-rotate-2
- \ebb4 -
-
- -
- - rotate-360 -
- ti ti-rotate-360
- \ef85 -
-
- -
- - rotate-clockwise -
- ti ti-rotate-clockwise
- \eb15 -
-
- -
- - rotate-clockwise-2 -
- ti ti-rotate-clockwise-2
- \ebb5 -
-
- -
- - rotate-dot -
- ti ti-rotate-dot
- \efe5 -
-
- -
- - rotate-rectangle -
- ti ti-rotate-rectangle
- \ec15 -
-
- -
- - route -
- ti ti-route
- \eb17 -
-
- -
- - route-2 -
- ti ti-route-2
- \f4b6 -
-
- -
- - route-off -
- ti ti-route-off
- \f194 -
-
- -
- - router -
- ti ti-router
- \eb18 -
-
- -
- - router-off -
- ti ti-router-off
- \f424 -
-
- -
- - row-insert-bottom -
- ti ti-row-insert-bottom
- \eed0 -
-
- -
- - row-insert-top -
- ti ti-row-insert-top
- \eed1 -
-
- -
- - rss -
- ti ti-rss
- \eb19 -
-
- -
- - rubber-stamp -
- ti ti-rubber-stamp
- \f5ab -
-
- -
- - rubber-stamp-off -
- ti ti-rubber-stamp-off
- \f5aa -
-
- -
- - ruler -
- ti ti-ruler
- \eb1a -
-
- -
- - ruler-2 -
- ti ti-ruler-2
- \eed2 -
-
- -
- - ruler-2-off -
- ti ti-ruler-2-off
- \f195 -
-
- -
- - ruler-3 -
- ti ti-ruler-3
- \f290 -
-
- -
- - ruler-measure -
- ti ti-ruler-measure
- \f291 -
-
- -
- - ruler-off -
- ti ti-ruler-off
- \f196 -
-
- -
- - run -
- ti ti-run
- \ec82 -
-
- -
- - s-turn-down -
- ti ti-s-turn-down
- \f516 -
-
- -
- - s-turn-left -
- ti ti-s-turn-left
- \f517 -
-
- -
- - s-turn-right -
- ti ti-s-turn-right
- \f518 -
-
- -
- - s-turn-up -
- ti ti-s-turn-up
- \f519 -
-
- -
- - sailboat -
- ti ti-sailboat
- \ec83 -
-
- -
- - sailboat-2 -
- ti ti-sailboat-2
- \f5f7 -
-
- -
- - sailboat-off -
- ti ti-sailboat-off
- \f425 -
-
- -
- - salad -
- ti ti-salad
- \f50a -
-
- -
- - salt -
- ti ti-salt
- \ef16 -
-
- -
- - satellite -
- ti ti-satellite
- \eed3 -
-
- -
- - satellite-off -
- ti ti-satellite-off
- \f197 -
-
- -
- - sausage -
- ti ti-sausage
- \ef17 -
-
- -
- - scale -
- ti ti-scale
- \ebc2 -
-
- -
- - scale-off -
- ti ti-scale-off
- \f198 -
-
- -
- - scale-outline -
- ti ti-scale-outline
- \ef53 -
-
- -
- - scale-outline-off -
- ti ti-scale-outline-off
- \f199 -
-
- -
- - scan -
- ti ti-scan
- \ebc8 -
-
- -
- - scan-eye -
- ti ti-scan-eye
- \f1ff -
-
- -
- - schema -
- ti ti-schema
- \f200 -
-
- -
- - schema-off -
- ti ti-schema-off
- \f426 -
-
- -
- - school -
- ti ti-school
- \ecf7 -
-
- -
- - school-bell -
- ti ti-school-bell
- \f64a -
-
- -
- - school-off -
- ti ti-school-off
- \f19a -
-
- -
- - scissors -
- ti ti-scissors
- \eb1b -
-
- -
- - scissors-off -
- ti ti-scissors-off
- \f19b -
-
- -
- - scooter -
- ti ti-scooter
- \ec6c -
-
- -
- - scooter-electric -
- ti ti-scooter-electric
- \ecc1 -
-
- -
- - screen-share -
- ti ti-screen-share
- \ed18 -
-
- -
- - screen-share-off -
- ti ti-screen-share-off
- \ed17 -
-
- -
- - screenshot -
- ti ti-screenshot
- \f201 -
-
- -
- - scribble -
- ti ti-scribble
- \f0a3 -
-
- -
- - scribble-off -
- ti ti-scribble-off
- \f427 -
-
- -
- - script -
- ti ti-script
- \f2da -
-
- -
- - script-minus -
- ti ti-script-minus
- \f2d7 -
-
- -
- - script-plus -
- ti ti-script-plus
- \f2d8 -
-
- -
- - script-x -
- ti ti-script-x
- \f2d9 -
-
- -
- - scuba-mask -
- ti ti-scuba-mask
- \eed4 -
-
- -
- - scuba-mask-off -
- ti ti-scuba-mask-off
- \f428 -
-
- -
- - sdk -
- ti ti-sdk
- \f3af -
-
- -
- - search -
- ti ti-search
- \eb1c -
-
- -
- - search-off -
- ti ti-search-off
- \f19c -
-
- -
- - section -
- ti ti-section
- \eed5 -
-
- -
- - section-sign -
- ti ti-section-sign
- \f019 -
-
- -
- - seeding -
- ti ti-seeding
- \ed51 -
-
- -
- - seeding-off -
- ti ti-seeding-off
- \f19d -
-
- -
- - select -
- ti ti-select
- \ec9e -
-
- -
- - select-all -
- ti ti-select-all
- \f9f7 -
-
- -
- - selector -
- ti ti-selector
- \eb1d -
-
- -
- - send -
- ti ti-send
- \eb1e -
-
- -
- - send-off -
- ti ti-send-off
- \f429 -
-
- -
- - seo -
- ti ti-seo
- \f26b -
-
- -
- - separator -
- ti ti-separator
- \ebda -
-
- -
- - separator-horizontal -
- ti ti-separator-horizontal
- \ec79 -
-
- -
- - separator-vertical -
- ti ti-separator-vertical
- \ec7a -
-
- -
- - server -
- ti ti-server
- \eb1f -
-
- -
- - server-2 -
- ti ti-server-2
- \f07c -
-
- -
- - server-bolt -
- ti ti-server-bolt
- \f320 -
-
- -
- - server-cog -
- ti ti-server-cog
- \f321 -
-
- -
- - server-off -
- ti ti-server-off
- \f19e -
-
- -
- - servicemark -
- ti ti-servicemark
- \ec09 -
-
- -
- - settings -
- ti ti-settings
- \eb20 -
-
- -
- - settings-2 -
- ti ti-settings-2
- \f5ac -
-
- -
- - settings-automation -
- ti ti-settings-automation
- \eed6 -
-
- -
- - settings-bolt -
- ti ti-settings-bolt
- \f9ad -
-
- -
- - settings-cancel -
- ti ti-settings-cancel
- \f9ae -
-
- -
- - settings-check -
- ti ti-settings-check
- \f9af -
-
- -
- - settings-code -
- ti ti-settings-code
- \f9b0 -
-
- -
- - settings-cog -
- ti ti-settings-cog
- \f9b1 -
-
- -
- - settings-dollar -
- ti ti-settings-dollar
- \f9b2 -
-
- -
- - settings-down -
- ti ti-settings-down
- \f9b3 -
-
- -
- - settings-exclamation -
- ti ti-settings-exclamation
- \f9b4 -
-
- -
- - settings-filled -
- ti ti-settings-filled
- \f69e -
-
- -
- - settings-heart -
- ti ti-settings-heart
- \f9b5 -
-
- -
- - settings-minus -
- ti ti-settings-minus
- \f9b6 -
-
- -
- - settings-off -
- ti ti-settings-off
- \f19f -
-
- -
- - settings-pause -
- ti ti-settings-pause
- \f9b7 -
-
- -
- - settings-pin -
- ti ti-settings-pin
- \f9b8 -
-
- -
- - settings-plus -
- ti ti-settings-plus
- \f9b9 -
-
- -
- - settings-question -
- ti ti-settings-question
- \f9ba -
-
- -
- - settings-search -
- ti ti-settings-search
- \f9bb -
-
- -
- - settings-share -
- ti ti-settings-share
- \f9bc -
-
- -
- - settings-star -
- ti ti-settings-star
- \f9bd -
-
- -
- - settings-up -
- ti ti-settings-up
- \f9be -
-
- -
- - settings-x -
- ti ti-settings-x
- \f9bf -
-
- -
- - shadow -
- ti ti-shadow
- \eed8 -
-
- -
- - shadow-off -
- ti ti-shadow-off
- \eed7 -
-
- -
- - shape -
- ti ti-shape
- \eb9c -
-
- -
- - shape-2 -
- ti ti-shape-2
- \eed9 -
-
- -
- - shape-3 -
- ti ti-shape-3
- \eeda -
-
- -
- - shape-off -
- ti ti-shape-off
- \f1a0 -
-
- -
- - share -
- ti ti-share
- \eb21 -
-
- -
- - share-2 -
- ti ti-share-2
- \f799 -
-
- -
- - share-3 -
- ti ti-share-3
- \f7bd -
-
- -
- - share-off -
- ti ti-share-off
- \f1a1 -
-
- -
- - shield -
- ti ti-shield
- \eb24 -
-
- -
- - shield-bolt -
- ti ti-shield-bolt
- \f9c0 -
-
- -
- - shield-cancel -
- ti ti-shield-cancel
- \f9c1 -
-
- -
- - shield-check -
- ti ti-shield-check
- \eb22 -
-
- -
- - shield-check-filled -
- ti ti-shield-check-filled
- \f761 -
-
- -
- - shield-checkered -
- ti ti-shield-checkered
- \ef9a -
-
- -
- - shield-checkered-filled -
- ti ti-shield-checkered-filled
- \f762 -
-
- -
- - shield-chevron -
- ti ti-shield-chevron
- \ef9b -
-
- -
- - shield-code -
- ti ti-shield-code
- \f9c2 -
-
- -
- - shield-cog -
- ti ti-shield-cog
- \f9c3 -
-
- -
- - shield-dollar -
- ti ti-shield-dollar
- \f9c4 -
-
- -
- - shield-down -
- ti ti-shield-down
- \f9c5 -
-
- -
- - shield-exclamation -
- ti ti-shield-exclamation
- \f9c6 -
-
- -
- - shield-filled -
- ti ti-shield-filled
- \f69f -
-
- -
- - shield-half -
- ti ti-shield-half
- \f358 -
-
- -
- - shield-half-filled -
- ti ti-shield-half-filled
- \f357 -
-
- -
- - shield-heart -
- ti ti-shield-heart
- \f9c7 -
-
- -
- - shield-lock -
- ti ti-shield-lock
- \ed58 -
-
- -
- - shield-lock-filled -
- ti ti-shield-lock-filled
- \f763 -
-
- -
- - shield-minus -
- ti ti-shield-minus
- \f9c8 -
-
- -
- - shield-off -
- ti ti-shield-off
- \ecf8 -
-
- -
- - shield-pause -
- ti ti-shield-pause
- \f9c9 -
-
- -
- - shield-pin -
- ti ti-shield-pin
- \f9ca -
-
- -
- - shield-plus -
- ti ti-shield-plus
- \f9cb -
-
- -
- - shield-question -
- ti ti-shield-question
- \f9cc -
-
- -
- - shield-search -
- ti ti-shield-search
- \f9cd -
-
- -
- - shield-share -
- ti ti-shield-share
- \f9ce -
-
- -
- - shield-star -
- ti ti-shield-star
- \f9cf -
-
- -
- - shield-up -
- ti ti-shield-up
- \f9d0 -
-
- -
- - shield-x -
- ti ti-shield-x
- \eb23 -
-
- -
- - ship -
- ti ti-ship
- \ec84 -
-
- -
- - ship-off -
- ti ti-ship-off
- \f42a -
-
- -
- - shirt -
- ti ti-shirt
- \ec0a -
-
- -
- - shirt-filled -
- ti ti-shirt-filled
- \f6a0 -
-
- -
- - shirt-off -
- ti ti-shirt-off
- \f1a2 -
-
- -
- - shirt-sport -
- ti ti-shirt-sport
- \f26c -
-
- -
- - shoe -
- ti ti-shoe
- \efd2 -
-
- -
- - shoe-off -
- ti ti-shoe-off
- \f1a4 -
-
- -
- - shopping-bag -
- ti ti-shopping-bag
- \f5f8 -
-
- -
- - shopping-cart -
- ti ti-shopping-cart
- \eb25 -
-
- -
- - shopping-cart-discount -
- ti ti-shopping-cart-discount
- \eedb -
-
- -
- - shopping-cart-off -
- ti ti-shopping-cart-off
- \eedc -
-
- -
- - shopping-cart-plus -
- ti ti-shopping-cart-plus
- \eedd -
-
- -
- - shopping-cart-x -
- ti ti-shopping-cart-x
- \eede -
-
- -
- - shovel -
- ti ti-shovel
- \f1d9 -
-
- -
- - shredder -
- ti ti-shredder
- \eedf -
-
- -
- - sign-left -
- ti ti-sign-left
- \f06b -
-
- -
- - sign-left-filled -
- ti ti-sign-left-filled
- \f6a1 -
-
- -
- - sign-right -
- ti ti-sign-right
- \f06c -
-
- -
- - sign-right-filled -
- ti ti-sign-right-filled
- \f6a2 -
-
- -
- - signal-2g -
- ti ti-signal-2g
- \f79a -
-
- -
- - signal-3g -
- ti ti-signal-3g
- \f1ee -
-
- -
- - signal-4g -
- ti ti-signal-4g
- \f1ef -
-
- -
- - signal-4g-plus -
- ti ti-signal-4g-plus
- \f259 -
-
- -
- - signal-5g -
- ti ti-signal-5g
- \f1f0 -
-
- -
- - signal-6g -
- ti ti-signal-6g
- \f9f8 -
-
- -
- - signal-e -
- ti ti-signal-e
- \f9f9 -
-
- -
- - signal-g -
- ti ti-signal-g
- \f9fa -
-
- -
- - signal-h -
- ti ti-signal-h
- \f9fc -
-
- -
- - signal-h-plus -
- ti ti-signal-h-plus
- \f9fb -
-
- -
- - signal-lte -
- ti ti-signal-lte
- \f9fd -
-
- -
- - signature -
- ti ti-signature
- \eee0 -
-
- -
- - signature-off -
- ti ti-signature-off
- \f1a5 -
-
- -
- - sitemap -
- ti ti-sitemap
- \eb9d -
-
- -
- - sitemap-off -
- ti ti-sitemap-off
- \f1a6 -
-
- -
- - skateboard -
- ti ti-skateboard
- \ecc2 -
-
- -
- - skateboard-off -
- ti ti-skateboard-off
- \f42b -
-
- -
- - skull -
- ti ti-skull
- \f292 -
-
- -
- - slash -
- ti ti-slash
- \f4f9 -
-
- -
- - slashes -
- ti ti-slashes
- \f588 -
-
- -
- - sleigh -
- ti ti-sleigh
- \ef9c -
-
- -
- - slice -
- ti ti-slice
- \ebdb -
-
- -
- - slideshow -
- ti ti-slideshow
- \ebc9 -
-
- -
- - smart-home -
- ti ti-smart-home
- \ecde -
-
- -
- - smart-home-off -
- ti ti-smart-home-off
- \f1a7 -
-
- -
- - smoking -
- ti ti-smoking
- \ecc4 -
-
- -
- - smoking-no -
- ti ti-smoking-no
- \ecc3 -
-
- -
- - snowflake -
- ti ti-snowflake
- \ec0b -
-
- -
- - snowflake-off -
- ti ti-snowflake-off
- \f1a8 -
-
- -
- - snowman -
- ti ti-snowman
- \f26d -
-
- -
- - soccer-field -
- ti ti-soccer-field
- \ed92 -
-
- -
- - social -
- ti ti-social
- \ebec -
-
- -
- - social-off -
- ti ti-social-off
- \f1a9 -
-
- -
- - sock -
- ti ti-sock
- \eee1 -
-
- -
- - sofa -
- ti ti-sofa
- \efaf -
-
- -
- - sofa-off -
- ti ti-sofa-off
- \f42c -
-
- -
- - solar-panel -
- ti ti-solar-panel
- \f7bf -
-
- -
- - solar-panel-2 -
- ti ti-solar-panel-2
- \f7be -
-
- -
- - sort-0-9 -
- ti ti-sort-0-9
- \f54d -
-
- -
- - sort-9-0 -
- ti ti-sort-9-0
- \f54e -
-
- -
- - sort-a-z -
- ti ti-sort-a-z
- \f54f -
-
- -
- - sort-ascending -
- ti ti-sort-ascending
- \eb26 -
-
- -
- - sort-ascending-2 -
- ti ti-sort-ascending-2
- \eee2 -
-
- -
- - sort-ascending-letters -
- ti ti-sort-ascending-letters
- \ef18 -
-
- -
- - sort-ascending-numbers -
- ti ti-sort-ascending-numbers
- \ef19 -
-
- -
- - sort-descending -
- ti ti-sort-descending
- \eb27 -
-
- -
- - sort-descending-2 -
- ti ti-sort-descending-2
- \eee3 -
-
- -
- - sort-descending-letters -
- ti ti-sort-descending-letters
- \ef1a -
-
- -
- - sort-descending-numbers -
- ti ti-sort-descending-numbers
- \ef1b -
-
- -
- - sort-z-a -
- ti ti-sort-z-a
- \f550 -
-
- -
- - sos -
- ti ti-sos
- \f24a -
-
- -
- - soup -
- ti ti-soup
- \ef2e -
-
- -
- - soup-off -
- ti ti-soup-off
- \f42d -
-
- -
- - source-code -
- ti ti-source-code
- \f4a2 -
-
- -
- - space -
- ti ti-space
- \ec0c -
-
- -
- - space-off -
- ti ti-space-off
- \f1aa -
-
- -
- - spacing-horizontal -
- ti ti-spacing-horizontal
- \ef54 -
-
- -
- - spacing-vertical -
- ti ti-spacing-vertical
- \ef55 -
-
- -
- - spade -
- ti ti-spade
- \effa -
-
- -
- - spade-filled -
- ti ti-spade-filled
- \f6a3 -
-
- -
- - sparkles -
- ti ti-sparkles
- \f6d7 -
-
- -
- - speakerphone -
- ti ti-speakerphone
- \ed61 -
-
- -
- - speedboat -
- ti ti-speedboat
- \ed93 -
-
- -
- - spider -
- ti ti-spider
- \f293 -
-
- -
- - spiral -
- ti ti-spiral
- \f294 -
-
- -
- - spiral-off -
- ti ti-spiral-off
- \f42e -
-
- -
- - sport-billard -
- ti ti-sport-billard
- \eee4 -
-
- -
- - spray -
- ti ti-spray
- \f50b -
-
- -
- - spy -
- ti ti-spy
- \f227 -
-
- -
- - spy-off -
- ti ti-spy-off
- \f42f -
-
- -
- - sql -
- ti ti-sql
- \f7c0 -
-
- -
- - square -
- ti ti-square
- \eb2c -
-
- -
- - square-0-filled -
- ti ti-square-0-filled
- \f764 -
-
- -
- - square-1-filled -
- ti ti-square-1-filled
- \f765 -
-
- -
- - square-2-filled -
- ti ti-square-2-filled
- \f7fa -
-
- -
- - square-3-filled -
- ti ti-square-3-filled
- \f766 -
-
- -
- - square-4-filled -
- ti ti-square-4-filled
- \f767 -
-
- -
- - square-5-filled -
- ti ti-square-5-filled
- \f768 -
-
- -
- - square-6-filled -
- ti ti-square-6-filled
- \f769 -
-
- -
- - square-7-filled -
- ti ti-square-7-filled
- \f76a -
-
- -
- - square-8-filled -
- ti ti-square-8-filled
- \f76b -
-
- -
- - square-9-filled -
- ti ti-square-9-filled
- \f76c -
-
- -
- - square-arrow-down -
- ti ti-square-arrow-down
- \f4b7 -
-
- -
- - square-arrow-left -
- ti ti-square-arrow-left
- \f4b8 -
-
- -
- - square-arrow-right -
- ti ti-square-arrow-right
- \f4b9 -
-
- -
- - square-arrow-up -
- ti ti-square-arrow-up
- \f4ba -
-
- -
- - square-asterisk -
- ti ti-square-asterisk
- \f01a -
-
- -
- - square-check -
- ti ti-square-check
- \eb28 -
-
- -
- - square-check-filled -
- ti ti-square-check-filled
- \f76d -
-
- -
- - square-chevron-down -
- ti ti-square-chevron-down
- \f627 -
-
- -
- - square-chevron-left -
- ti ti-square-chevron-left
- \f628 -
-
- -
- - square-chevron-right -
- ti ti-square-chevron-right
- \f629 -
-
- -
- - square-chevron-up -
- ti ti-square-chevron-up
- \f62a -
-
- -
- - square-chevrons-down -
- ti ti-square-chevrons-down
- \f64b -
-
- -
- - square-chevrons-left -
- ti ti-square-chevrons-left
- \f64c -
-
- -
- - square-chevrons-right -
- ti ti-square-chevrons-right
- \f64d -
-
- -
- - square-chevrons-up -
- ti ti-square-chevrons-up
- \f64e -
-
- -
- - square-dot -
- ti ti-square-dot
- \ed59 -
-
- -
- - square-f0 -
- ti ti-square-f0
- \f526 -
-
- -
- - square-f0-filled -
- ti ti-square-f0-filled
- \f76e -
-
- -
- - square-f1 -
- ti ti-square-f1
- \f527 -
-
- -
- - square-f1-filled -
- ti ti-square-f1-filled
- \f76f -
-
- -
- - square-f2 -
- ti ti-square-f2
- \f528 -
-
- -
- - square-f2-filled -
- ti ti-square-f2-filled
- \f770 -
-
- -
- - square-f3 -
- ti ti-square-f3
- \f529 -
-
- -
- - square-f3-filled -
- ti ti-square-f3-filled
- \f771 -
-
- -
- - square-f4 -
- ti ti-square-f4
- \f52a -
-
- -
- - square-f4-filled -
- ti ti-square-f4-filled
- \f772 -
-
- -
- - square-f5 -
- ti ti-square-f5
- \f52b -
-
- -
- - square-f5-filled -
- ti ti-square-f5-filled
- \f773 -
-
- -
- - square-f6 -
- ti ti-square-f6
- \f52c -
-
- -
- - square-f6-filled -
- ti ti-square-f6-filled
- \f774 -
-
- -
- - square-f7 -
- ti ti-square-f7
- \f52d -
-
- -
- - square-f7-filled -
- ti ti-square-f7-filled
- \f775 -
-
- -
- - square-f8 -
- ti ti-square-f8
- \f52e -
-
- -
- - square-f8-filled -
- ti ti-square-f8-filled
- \f776 -
-
- -
- - square-f9 -
- ti ti-square-f9
- \f52f -
-
- -
- - square-f9-filled -
- ti ti-square-f9-filled
- \f777 -
-
- -
- - square-forbid -
- ti ti-square-forbid
- \ed5b -
-
- -
- - square-forbid-2 -
- ti ti-square-forbid-2
- \ed5a -
-
- -
- - square-half -
- ti ti-square-half
- \effb -
-
- -
- - square-key -
- ti ti-square-key
- \f638 -
-
- -
- - square-letter-a -
- ti ti-square-letter-a
- \f47c -
-
- -
- - square-letter-b -
- ti ti-square-letter-b
- \f47d -
-
- -
- - square-letter-c -
- ti ti-square-letter-c
- \f47e -
-
- -
- - square-letter-d -
- ti ti-square-letter-d
- \f47f -
-
- -
- - square-letter-e -
- ti ti-square-letter-e
- \f480 -
-
- -
- - square-letter-f -
- ti ti-square-letter-f
- \f481 -
-
- -
- - square-letter-g -
- ti ti-square-letter-g
- \f482 -
-
- -
- - square-letter-h -
- ti ti-square-letter-h
- \f483 -
-
- -
- - square-letter-i -
- ti ti-square-letter-i
- \f484 -
-
- -
- - square-letter-j -
- ti ti-square-letter-j
- \f485 -
-
- -
- - square-letter-k -
- ti ti-square-letter-k
- \f486 -
-
- -
- - square-letter-l -
- ti ti-square-letter-l
- \f487 -
-
- -
- - square-letter-m -
- ti ti-square-letter-m
- \f488 -
-
- -
- - square-letter-n -
- ti ti-square-letter-n
- \f489 -
-
- -
- - square-letter-o -
- ti ti-square-letter-o
- \f48a -
-
- -
- - square-letter-p -
- ti ti-square-letter-p
- \f48b -
-
- -
- - square-letter-q -
- ti ti-square-letter-q
- \f48c -
-
- -
- - square-letter-r -
- ti ti-square-letter-r
- \f48d -
-
- -
- - square-letter-s -
- ti ti-square-letter-s
- \f48e -
-
- -
- - square-letter-t -
- ti ti-square-letter-t
- \f48f -
-
- -
- - square-letter-u -
- ti ti-square-letter-u
- \f490 -
-
- -
- - square-letter-v -
- ti ti-square-letter-v
- \f4bb -
-
- -
- - square-letter-w -
- ti ti-square-letter-w
- \f491 -
-
- -
- - square-letter-x -
- ti ti-square-letter-x
- \f4bc -
-
- -
- - square-letter-y -
- ti ti-square-letter-y
- \f492 -
-
- -
- - square-letter-z -
- ti ti-square-letter-z
- \f493 -
-
- -
- - square-minus -
- ti ti-square-minus
- \eb29 -
-
- -
- - square-number-0 -
- ti ti-square-number-0
- \eee5 -
-
- -
- - square-number-1 -
- ti ti-square-number-1
- \eee6 -
-
- -
- - square-number-2 -
- ti ti-square-number-2
- \eee7 -
-
- -
- - square-number-3 -
- ti ti-square-number-3
- \eee8 -
-
- -
- - square-number-4 -
- ti ti-square-number-4
- \eee9 -
-
- -
- - square-number-5 -
- ti ti-square-number-5
- \eeea -
-
- -
- - square-number-6 -
- ti ti-square-number-6
- \eeeb -
-
- -
- - square-number-7 -
- ti ti-square-number-7
- \eeec -
-
- -
- - square-number-8 -
- ti ti-square-number-8
- \eeed -
-
- -
- - square-number-9 -
- ti ti-square-number-9
- \eeee -
-
- -
- - square-off -
- ti ti-square-off
- \eeef -
-
- -
- - square-plus -
- ti ti-square-plus
- \eb2a -
-
- -
- - square-root -
- ti ti-square-root
- \eef1 -
-
- -
- - square-root-2 -
- ti ti-square-root-2
- \eef0 -
-
- -
- - square-rotated -
- ti ti-square-rotated
- \ecdf -
-
- -
- - square-rotated-filled -
- ti ti-square-rotated-filled
- \f6a4 -
-
- -
- - square-rotated-forbid -
- ti ti-square-rotated-forbid
- \f01c -
-
- -
- - square-rotated-forbid-2 -
- ti ti-square-rotated-forbid-2
- \f01b -
-
- -
- - square-rotated-off -
- ti ti-square-rotated-off
- \eef2 -
-
- -
- - square-rounded -
- ti ti-square-rounded
- \f59a -
-
- -
- - square-rounded-arrow-down -
- ti ti-square-rounded-arrow-down
- \f639 -
-
- -
- - square-rounded-arrow-down-filled -
- ti ti-square-rounded-arrow-down-filled
- \f6db -
-
- -
- - square-rounded-arrow-left -
- ti ti-square-rounded-arrow-left
- \f63a -
-
- -
- - square-rounded-arrow-left-filled -
- ti ti-square-rounded-arrow-left-filled
- \f6dc -
-
- -
- - square-rounded-arrow-right -
- ti ti-square-rounded-arrow-right
- \f63b -
-
- -
- - square-rounded-arrow-right-filled -
- ti ti-square-rounded-arrow-right-filled
- \f6dd -
-
- -
- - square-rounded-arrow-up -
- ti ti-square-rounded-arrow-up
- \f63c -
-
- -
- - square-rounded-arrow-up-filled -
- ti ti-square-rounded-arrow-up-filled
- \f6de -
-
- -
- - square-rounded-check -
- ti ti-square-rounded-check
- \f63d -
-
- -
- - square-rounded-check-filled -
- ti ti-square-rounded-check-filled
- \f6df -
-
- -
- - square-rounded-chevron-down -
- ti ti-square-rounded-chevron-down
- \f62b -
-
- -
- - square-rounded-chevron-down-filled -
- ti ti-square-rounded-chevron-down-filled
- \f6e0 -
-
- -
- - square-rounded-chevron-left -
- ti ti-square-rounded-chevron-left
- \f62c -
-
- -
- - square-rounded-chevron-left-filled -
- ti ti-square-rounded-chevron-left-filled
- \f6e1 -
-
- -
- - square-rounded-chevron-right -
- ti ti-square-rounded-chevron-right
- \f62d -
-
- -
- - square-rounded-chevron-right-filled -
- ti ti-square-rounded-chevron-right-filled
- \f6e2 -
-
- -
- - square-rounded-chevron-up -
- ti ti-square-rounded-chevron-up
- \f62e -
-
- -
- - square-rounded-chevron-up-filled -
- ti ti-square-rounded-chevron-up-filled
- \f6e3 -
-
- -
- - square-rounded-chevrons-down -
- ti ti-square-rounded-chevrons-down
- \f64f -
-
- -
- - square-rounded-chevrons-down-filled -
- ti ti-square-rounded-chevrons-down-filled
- \f6e4 -
-
- -
- - square-rounded-chevrons-left -
- ti ti-square-rounded-chevrons-left
- \f650 -
-
- -
- - square-rounded-chevrons-left-filled -
- ti ti-square-rounded-chevrons-left-filled
- \f6e5 -
-
- -
- - square-rounded-chevrons-right -
- ti ti-square-rounded-chevrons-right
- \f651 -
-
- -
- - square-rounded-chevrons-right-filled -
- ti ti-square-rounded-chevrons-right-filled
- \f6e6 -
-
- -
- - square-rounded-chevrons-up -
- ti ti-square-rounded-chevrons-up
- \f652 -
-
- -
- - square-rounded-chevrons-up-filled -
- ti ti-square-rounded-chevrons-up-filled
- \f6e7 -
-
- -
- - square-rounded-filled -
- ti ti-square-rounded-filled
- \f6a5 -
-
- -
- - square-rounded-letter-a -
- ti ti-square-rounded-letter-a
- \f5ae -
-
- -
- - square-rounded-letter-b -
- ti ti-square-rounded-letter-b
- \f5af -
-
- -
- - square-rounded-letter-c -
- ti ti-square-rounded-letter-c
- \f5b0 -
-
- -
- - square-rounded-letter-d -
- ti ti-square-rounded-letter-d
- \f5b1 -
-
- -
- - square-rounded-letter-e -
- ti ti-square-rounded-letter-e
- \f5b2 -
-
- -
- - square-rounded-letter-f -
- ti ti-square-rounded-letter-f
- \f5b3 -
-
- -
- - square-rounded-letter-g -
- ti ti-square-rounded-letter-g
- \f5b4 -
-
- -
- - square-rounded-letter-h -
- ti ti-square-rounded-letter-h
- \f5b5 -
-
- -
- - square-rounded-letter-i -
- ti ti-square-rounded-letter-i
- \f5b6 -
-
- -
- - square-rounded-letter-j -
- ti ti-square-rounded-letter-j
- \f5b7 -
-
- -
- - square-rounded-letter-k -
- ti ti-square-rounded-letter-k
- \f5b8 -
-
- -
- - square-rounded-letter-l -
- ti ti-square-rounded-letter-l
- \f5b9 -
-
- -
- - square-rounded-letter-m -
- ti ti-square-rounded-letter-m
- \f5ba -
-
- -
- - square-rounded-letter-n -
- ti ti-square-rounded-letter-n
- \f5bb -
-
- -
- - square-rounded-letter-o -
- ti ti-square-rounded-letter-o
- \f5bc -
-
- -
- - square-rounded-letter-p -
- ti ti-square-rounded-letter-p
- \f5bd -
-
- -
- - square-rounded-letter-q -
- ti ti-square-rounded-letter-q
- \f5be -
-
- -
- - square-rounded-letter-r -
- ti ti-square-rounded-letter-r
- \f5bf -
-
- -
- - square-rounded-letter-s -
- ti ti-square-rounded-letter-s
- \f5c0 -
-
- -
- - square-rounded-letter-t -
- ti ti-square-rounded-letter-t
- \f5c1 -
-
- -
- - square-rounded-letter-u -
- ti ti-square-rounded-letter-u
- \f5c2 -
-
- -
- - square-rounded-letter-v -
- ti ti-square-rounded-letter-v
- \f5c3 -
-
- -
- - square-rounded-letter-w -
- ti ti-square-rounded-letter-w
- \f5c4 -
-
- -
- - square-rounded-letter-x -
- ti ti-square-rounded-letter-x
- \f5c5 -
-
- -
- - square-rounded-letter-y -
- ti ti-square-rounded-letter-y
- \f5c6 -
-
- -
- - square-rounded-letter-z -
- ti ti-square-rounded-letter-z
- \f5c7 -
-
- -
- - square-rounded-minus -
- ti ti-square-rounded-minus
- \f63e -
-
- -
- - square-rounded-number-0 -
- ti ti-square-rounded-number-0
- \f5c8 -
-
- -
- - square-rounded-number-0-filled -
- ti ti-square-rounded-number-0-filled
- \f778 -
-
- -
- - square-rounded-number-1 -
- ti ti-square-rounded-number-1
- \f5c9 -
-
- -
- - square-rounded-number-1-filled -
- ti ti-square-rounded-number-1-filled
- \f779 -
-
- -
- - square-rounded-number-2 -
- ti ti-square-rounded-number-2
- \f5ca -
-
- -
- - square-rounded-number-2-filled -
- ti ti-square-rounded-number-2-filled
- \f77a -
-
- -
- - square-rounded-number-3 -
- ti ti-square-rounded-number-3
- \f5cb -
-
- -
- - square-rounded-number-3-filled -
- ti ti-square-rounded-number-3-filled
- \f77b -
-
- -
- - square-rounded-number-4 -
- ti ti-square-rounded-number-4
- \f5cc -
-
- -
- - square-rounded-number-4-filled -
- ti ti-square-rounded-number-4-filled
- \f77c -
-
- -
- - square-rounded-number-5 -
- ti ti-square-rounded-number-5
- \f5cd -
-
- -
- - square-rounded-number-5-filled -
- ti ti-square-rounded-number-5-filled
- \f77d -
-
- -
- - square-rounded-number-6 -
- ti ti-square-rounded-number-6
- \f5ce -
-
- -
- - square-rounded-number-6-filled -
- ti ti-square-rounded-number-6-filled
- \f77e -
-
- -
- - square-rounded-number-7 -
- ti ti-square-rounded-number-7
- \f5cf -
-
- -
- - square-rounded-number-7-filled -
- ti ti-square-rounded-number-7-filled
- \f77f -
-
- -
- - square-rounded-number-8 -
- ti ti-square-rounded-number-8
- \f5d0 -
-
- -
- - square-rounded-number-8-filled -
- ti ti-square-rounded-number-8-filled
- \f780 -
-
- -
- - square-rounded-number-9 -
- ti ti-square-rounded-number-9
- \f5d1 -
-
- -
- - square-rounded-number-9-filled -
- ti ti-square-rounded-number-9-filled
- \f781 -
-
- -
- - square-rounded-plus -
- ti ti-square-rounded-plus
- \f63f -
-
- -
- - square-rounded-plus-filled -
- ti ti-square-rounded-plus-filled
- \f6e8 -
-
- -
- - square-rounded-x -
- ti ti-square-rounded-x
- \f640 -
-
- -
- - square-rounded-x-filled -
- ti ti-square-rounded-x-filled
- \f6e9 -
-
- -
- - square-toggle -
- ti ti-square-toggle
- \eef4 -
-
- -
- - square-toggle-horizontal -
- ti ti-square-toggle-horizontal
- \eef3 -
-
- -
- - square-x -
- ti ti-square-x
- \eb2b -
-
- -
- - squares-diagonal -
- ti ti-squares-diagonal
- \eef5 -
-
- -
- - squares-filled -
- ti ti-squares-filled
- \eef6 -
-
- -
- - stack -
- ti ti-stack
- \eb2d -
-
- -
- - stack-2 -
- ti ti-stack-2
- \eef7 -
-
- -
- - stack-3 -
- ti ti-stack-3
- \ef9d -
-
- -
- - stack-pop -
- ti ti-stack-pop
- \f234 -
-
- -
- - stack-push -
- ti ti-stack-push
- \f235 -
-
- -
- - stairs -
- ti ti-stairs
- \eca6 -
-
- -
- - stairs-down -
- ti ti-stairs-down
- \eca4 -
-
- -
- - stairs-up -
- ti ti-stairs-up
- \eca5 -
-
- -
- - star -
- ti ti-star
- \eb2e -
-
- -
- - star-filled -
- ti ti-star-filled
- \f6a6 -
-
- -
- - star-half -
- ti ti-star-half
- \ed19 -
-
- -
- - star-half-filled -
- ti ti-star-half-filled
- \f6a7 -
-
- -
- - star-off -
- ti ti-star-off
- \ed62 -
-
- -
- - stars -
- ti ti-stars
- \ed38 -
-
- -
- - stars-filled -
- ti ti-stars-filled
- \f6a8 -
-
- -
- - stars-off -
- ti ti-stars-off
- \f430 -
-
- -
- - status-change -
- ti ti-status-change
- \f3b0 -
-
- -
- - steam -
- ti ti-steam
- \f24b -
-
- -
- - steering-wheel -
- ti ti-steering-wheel
- \ec7b -
-
- -
- - steering-wheel-off -
- ti ti-steering-wheel-off
- \f431 -
-
- -
- - step-into -
- ti ti-step-into
- \ece0 -
-
- -
- - step-out -
- ti ti-step-out
- \ece1 -
-
- -
- - stereo-glasses -
- ti ti-stereo-glasses
- \f4cb -
-
- -
- - stethoscope -
- ti ti-stethoscope
- \edbe -
-
- -
- - stethoscope-off -
- ti ti-stethoscope-off
- \f432 -
-
- -
- - sticker -
- ti ti-sticker
- \eb2f -
-
- -
- - storm -
- ti ti-storm
- \f24c -
-
- -
- - storm-off -
- ti ti-storm-off
- \f433 -
-
- -
- - stretching -
- ti ti-stretching
- \f2db -
-
- -
- - strikethrough -
- ti ti-strikethrough
- \eb9e -
-
- -
- - submarine -
- ti ti-submarine
- \ed94 -
-
- -
- - subscript -
- ti ti-subscript
- \eb9f -
-
- -
- - subtask -
- ti ti-subtask
- \ec9f -
-
- -
- - sum -
- ti ti-sum
- \eb73 -
-
- -
- - sum-off -
- ti ti-sum-off
- \f1ab -
-
- -
- - sun -
- ti ti-sun
- \eb30 -
-
- -
- - sun-filled -
- ti ti-sun-filled
- \f6a9 -
-
- -
- - sun-high -
- ti ti-sun-high
- \f236 -
-
- -
- - sun-low -
- ti ti-sun-low
- \f237 -
-
- -
- - sun-moon -
- ti ti-sun-moon
- \f4a3 -
-
- -
- - sun-off -
- ti ti-sun-off
- \ed63 -
-
- -
- - sun-wind -
- ti ti-sun-wind
- \f238 -
-
- -
- - sunglasses -
- ti ti-sunglasses
- \f239 -
-
- -
- - sunrise -
- ti ti-sunrise
- \ef1c -
-
- -
- - sunset -
- ti ti-sunset
- \ec31 -
-
- -
- - sunset-2 -
- ti ti-sunset-2
- \f23a -
-
- -
- - superscript -
- ti ti-superscript
- \eba0 -
-
- -
- - svg -
- ti ti-svg
- \f25a -
-
- -
- - swimming -
- ti ti-swimming
- \ec92 -
-
- -
- - swipe -
- ti ti-swipe
- \f551 -
-
- -
- - switch -
- ti ti-switch
- \eb33 -
-
- -
- - switch-2 -
- ti ti-switch-2
- \edbf -
-
- -
- - switch-3 -
- ti ti-switch-3
- \edc0 -
-
- -
- - switch-horizontal -
- ti ti-switch-horizontal
- \eb31 -
-
- -
- - switch-vertical -
- ti ti-switch-vertical
- \eb32 -
-
- -
- - sword -
- ti ti-sword
- \f030 -
-
- -
- - sword-off -
- ti ti-sword-off
- \f434 -
-
- -
- - swords -
- ti ti-swords
- \f132 -
-
- -
- - table -
- ti ti-table
- \eba1 -
-
- -
- - table-alias -
- ti ti-table-alias
- \f25b -
-
- -
- - table-export -
- ti ti-table-export
- \eef8 -
-
- -
- - table-filled -
- ti ti-table-filled
- \f782 -
-
- -
- - table-import -
- ti ti-table-import
- \eef9 -
-
- -
- - table-off -
- ti ti-table-off
- \eefa -
-
- -
- - table-options -
- ti ti-table-options
- \f25c -
-
- -
- - table-shortcut -
- ti ti-table-shortcut
- \f25d -
-
- -
- - tag -
- ti ti-tag
- \eb34 -
-
- -
- - tag-off -
- ti ti-tag-off
- \efc0 -
-
- -
- - tags -
- ti ti-tags
- \ef86 -
-
- -
- - tags-off -
- ti ti-tags-off
- \efc1 -
-
- -
- - tallymark-1 -
- ti ti-tallymark-1
- \ec46 -
-
- -
- - tallymark-2 -
- ti ti-tallymark-2
- \ec47 -
-
- -
- - tallymark-3 -
- ti ti-tallymark-3
- \ec48 -
-
- -
- - tallymark-4 -
- ti ti-tallymark-4
- \ec49 -
-
- -
- - tallymarks -
- ti ti-tallymarks
- \ec4a -
-
- -
- - tank -
- ti ti-tank
- \ed95 -
-
- -
- - target -
- ti ti-target
- \eb35 -
-
- -
- - target-arrow -
- ti ti-target-arrow
- \f51a -
-
- -
- - target-off -
- ti ti-target-off
- \f1ad -
-
- -
- - teapot -
- ti ti-teapot
- \f552 -
-
- -
- - telescope -
- ti ti-telescope
- \f07d -
-
- -
- - telescope-off -
- ti ti-telescope-off
- \f1ae -
-
- -
- - temperature -
- ti ti-temperature
- \eb38 -
-
- -
- - temperature-celsius -
- ti ti-temperature-celsius
- \eb36 -
-
- -
- - temperature-fahrenheit -
- ti ti-temperature-fahrenheit
- \eb37 -
-
- -
- - temperature-minus -
- ti ti-temperature-minus
- \ebed -
-
- -
- - temperature-off -
- ti ti-temperature-off
- \f1af -
-
- -
- - temperature-plus -
- ti ti-temperature-plus
- \ebee -
-
- -
- - template -
- ti ti-template
- \eb39 -
-
- -
- - template-off -
- ti ti-template-off
- \f1b0 -
-
- -
- - tent -
- ti ti-tent
- \eefb -
-
- -
- - tent-off -
- ti ti-tent-off
- \f435 -
-
- -
- - terminal -
- ti ti-terminal
- \ebdc -
-
- -
- - terminal-2 -
- ti ti-terminal-2
- \ebef -
-
- -
- - test-pipe -
- ti ti-test-pipe
- \eb3a -
-
- -
- - test-pipe-2 -
- ti ti-test-pipe-2
- \f0a4 -
-
- -
- - test-pipe-off -
- ti ti-test-pipe-off
- \f1b1 -
-
- -
- - tex -
- ti ti-tex
- \f4e0 -
-
- -
- - text-caption -
- ti ti-text-caption
- \f4a4 -
-
- -
- - text-color -
- ti ti-text-color
- \f2dc -
-
- -
- - text-decrease -
- ti ti-text-decrease
- \f202 -
-
- -
- - text-direction-ltr -
- ti ti-text-direction-ltr
- \eefc -
-
- -
- - text-direction-rtl -
- ti ti-text-direction-rtl
- \eefd -
-
- -
- - text-increase -
- ti ti-text-increase
- \f203 -
-
- -
- - text-orientation -
- ti ti-text-orientation
- \f2a4 -
-
- -
- - text-plus -
- ti ti-text-plus
- \f2a5 -
-
- -
- - text-recognition -
- ti ti-text-recognition
- \f204 -
-
- -
- - text-resize -
- ti ti-text-resize
- \ef87 -
-
- -
- - text-size -
- ti ti-text-size
- \f2b1 -
-
- -
- - text-spellcheck -
- ti ti-text-spellcheck
- \f2a6 -
-
- -
- - text-wrap -
- ti ti-text-wrap
- \ebdd -
-
- -
- - text-wrap-disabled -
- ti ti-text-wrap-disabled
- \eca7 -
-
- -
- - texture -
- ti ti-texture
- \f51b -
-
- -
- - theater -
- ti ti-theater
- \f79b -
-
- -
- - thermometer -
- ti ti-thermometer
- \ef67 -
-
- -
- - thumb-down -
- ti ti-thumb-down
- \eb3b -
-
- -
- - thumb-down-filled -
- ti ti-thumb-down-filled
- \f6aa -
-
- -
- - thumb-down-off -
- ti ti-thumb-down-off
- \f436 -
-
- -
- - thumb-up -
- ti ti-thumb-up
- \eb3c -
-
- -
- - thumb-up-filled -
- ti ti-thumb-up-filled
- \f6ab -
-
- -
- - thumb-up-off -
- ti ti-thumb-up-off
- \f437 -
-
- -
- - tic-tac -
- ti ti-tic-tac
- \f51c -
-
- -
- - ticket -
- ti ti-ticket
- \eb3d -
-
- -
- - ticket-off -
- ti ti-ticket-off
- \f1b2 -
-
- -
- - tie -
- ti ti-tie
- \f07e -
-
- -
- - tilde -
- ti ti-tilde
- \f4a5 -
-
- -
- - tilt-shift -
- ti ti-tilt-shift
- \eefe -
-
- -
- - tilt-shift-off -
- ti ti-tilt-shift-off
- \f1b3 -
-
- -
- - timeline -
- ti ti-timeline
- \f031 -
-
- -
- - timeline-event -
- ti ti-timeline-event
- \f553 -
-
- -
- - timeline-event-exclamation -
- ti ti-timeline-event-exclamation
- \f662 -
-
- -
- - timeline-event-minus -
- ti ti-timeline-event-minus
- \f663 -
-
- -
- - timeline-event-plus -
- ti ti-timeline-event-plus
- \f664 -
-
- -
- - timeline-event-text -
- ti ti-timeline-event-text
- \f665 -
-
- -
- - timeline-event-x -
- ti ti-timeline-event-x
- \f666 -
-
- -
- - tir -
- ti ti-tir
- \ebf0 -
-
- -
- - toggle-left -
- ti ti-toggle-left
- \eb3e -
-
- -
- - toggle-right -
- ti ti-toggle-right
- \eb3f -
-
- -
- - toilet-paper -
- ti ti-toilet-paper
- \efd3 -
-
- -
- - toilet-paper-off -
- ti ti-toilet-paper-off
- \f1b4 -
-
- -
- - tool -
- ti ti-tool
- \eb40 -
-
- -
- - tools -
- ti ti-tools
- \ebca -
-
- -
- - tools-kitchen -
- ti ti-tools-kitchen
- \ed64 -
-
- -
- - tools-kitchen-2 -
- ti ti-tools-kitchen-2
- \eeff -
-
- -
- - tools-kitchen-2-off -
- ti ti-tools-kitchen-2-off
- \f1b5 -
-
- -
- - tools-kitchen-off -
- ti ti-tools-kitchen-off
- \f1b6 -
-
- -
- - tools-off -
- ti ti-tools-off
- \f1b7 -
-
- -
- - tooltip -
- ti ti-tooltip
- \f2dd -
-
- -
- - topology-bus -
- ti ti-topology-bus
- \f5d9 -
-
- -
- - topology-complex -
- ti ti-topology-complex
- \f5da -
-
- -
- - topology-full -
- ti ti-topology-full
- \f5dc -
-
- -
- - topology-full-hierarchy -
- ti ti-topology-full-hierarchy
- \f5db -
-
- -
- - topology-ring -
- ti ti-topology-ring
- \f5df -
-
- -
- - topology-ring-2 -
- ti ti-topology-ring-2
- \f5dd -
-
- -
- - topology-ring-3 -
- ti ti-topology-ring-3
- \f5de -
-
- -
- - topology-star -
- ti ti-topology-star
- \f5e5 -
-
- -
- - topology-star-2 -
- ti ti-topology-star-2
- \f5e0 -
-
- -
- - topology-star-3 -
- ti ti-topology-star-3
- \f5e1 -
-
- -
- - topology-star-ring -
- ti ti-topology-star-ring
- \f5e4 -
-
- -
- - topology-star-ring-2 -
- ti ti-topology-star-ring-2
- \f5e2 -
-
- -
- - topology-star-ring-3 -
- ti ti-topology-star-ring-3
- \f5e3 -
-
- -
- - torii -
- ti ti-torii
- \f59b -
-
- -
- - tornado -
- ti ti-tornado
- \ece2 -
-
- -
- - tournament -
- ti ti-tournament
- \ecd0 -
-
- -
- - tower -
- ti ti-tower
- \f2cb -
-
- -
- - tower-off -
- ti ti-tower-off
- \f2ca -
-
- -
- - track -
- ti ti-track
- \ef00 -
-
- -
- - tractor -
- ti ti-tractor
- \ec0d -
-
- -
- - trademark -
- ti ti-trademark
- \ec0e -
-
- -
- - traffic-cone -
- ti ti-traffic-cone
- \ec0f -
-
- -
- - traffic-cone-off -
- ti ti-traffic-cone-off
- \f1b8 -
-
- -
- - traffic-lights -
- ti ti-traffic-lights
- \ed39 -
-
- -
- - traffic-lights-off -
- ti ti-traffic-lights-off
- \f1b9 -
-
- -
- - train -
- ti ti-train
- \ed96 -
-
- -
- - transfer-in -
- ti ti-transfer-in
- \ef2f -
-
- -
- - transfer-out -
- ti ti-transfer-out
- \ef30 -
-
- -
- - transform -
- ti ti-transform
- \f38e -
-
- -
- - transform-filled -
- ti ti-transform-filled
- \f6ac -
-
- -
- - transition-bottom -
- ti ti-transition-bottom
- \f2b2 -
-
- -
- - transition-left -
- ti ti-transition-left
- \f2b3 -
-
- -
- - transition-right -
- ti ti-transition-right
- \f2b4 -
-
- -
- - transition-top -
- ti ti-transition-top
- \f2b5 -
-
- -
- - trash -
- ti ti-trash
- \eb41 -
-
- -
- - trash-filled -
- ti ti-trash-filled
- \f783 -
-
- -
- - trash-off -
- ti ti-trash-off
- \ed65 -
-
- -
- - trash-x -
- ti ti-trash-x
- \ef88 -
-
- -
- - trash-x-filled -
- ti ti-trash-x-filled
- \f784 -
-
- -
- - tree -
- ti ti-tree
- \ef01 -
-
- -
- - trees -
- ti ti-trees
- \ec10 -
-
- -
- - trekking -
- ti ti-trekking
- \f5ad -
-
- -
- - trending-down -
- ti ti-trending-down
- \eb42 -
-
- -
- - trending-down-2 -
- ti ti-trending-down-2
- \edc1 -
-
- -
- - trending-down-3 -
- ti ti-trending-down-3
- \edc2 -
-
- -
- - trending-up -
- ti ti-trending-up
- \eb43 -
-
- -
- - trending-up-2 -
- ti ti-trending-up-2
- \edc3 -
-
- -
- - trending-up-3 -
- ti ti-trending-up-3
- \edc4 -
-
- -
- - triangle -
- ti ti-triangle
- \eb44 -
-
- -
- - triangle-filled -
- ti ti-triangle-filled
- \f6ad -
-
- -
- - triangle-inverted -
- ti ti-triangle-inverted
- \f01d -
-
- -
- - triangle-inverted-filled -
- ti ti-triangle-inverted-filled
- \f6ae -
-
- -
- - triangle-off -
- ti ti-triangle-off
- \ef02 -
-
- -
- - triangle-square-circle -
- ti ti-triangle-square-circle
- \ece8 -
-
- -
- - triangles -
- ti ti-triangles
- \f0a5 -
-
- -
- - trident -
- ti ti-trident
- \ecc5 -
-
- -
- - trolley -
- ti ti-trolley
- \f4cc -
-
- -
- - trophy -
- ti ti-trophy
- \eb45 -
-
- -
- - trophy-filled -
- ti ti-trophy-filled
- \f6af -
-
- -
- - trophy-off -
- ti ti-trophy-off
- \f438 -
-
- -
- - trowel -
- ti ti-trowel
- \f368 -
-
- -
- - truck -
- ti ti-truck
- \ebc4 -
-
- -
- - truck-delivery -
- ti ti-truck-delivery
- \ec4b -
-
- -
- - truck-loading -
- ti ti-truck-loading
- \f1da -
-
- -
- - truck-off -
- ti ti-truck-off
- \ef03 -
-
- -
- - truck-return -
- ti ti-truck-return
- \ec4c -
-
- -
- - txt -
- ti ti-txt
- \f3b1 -
-
- -
- - typography -
- ti ti-typography
- \ebc5 -
-
- -
- - typography-off -
- ti ti-typography-off
- \f1ba -
-
- -
- - ufo -
- ti ti-ufo
- \f26f -
-
- -
- - ufo-off -
- ti ti-ufo-off
- \f26e -
-
- -
- - umbrella -
- ti ti-umbrella
- \ebf1 -
-
- -
- - umbrella-filled -
- ti ti-umbrella-filled
- \f6b0 -
-
- -
- - umbrella-off -
- ti ti-umbrella-off
- \f1bb -
-
- -
- - underline -
- ti ti-underline
- \eba2 -
-
- -
- - unlink -
- ti ti-unlink
- \eb46 -
-
- -
- - upload -
- ti ti-upload
- \eb47 -
-
- -
- - urgent -
- ti ti-urgent
- \eb48 -
-
- -
- - usb -
- ti ti-usb
- \f00c -
-
- -
- - user -
- ti ti-user
- \eb4d -
-
- -
- - user-bolt -
- ti ti-user-bolt
- \f9d1 -
-
- -
- - user-cancel -
- ti ti-user-cancel
- \f9d2 -
-
- -
- - user-check -
- ti ti-user-check
- \eb49 -
-
- -
- - user-circle -
- ti ti-user-circle
- \ef68 -
-
- -
- - user-code -
- ti ti-user-code
- \f9d3 -
-
- -
- - user-cog -
- ti ti-user-cog
- \f9d4 -
-
- -
- - user-dollar -
- ti ti-user-dollar
- \f9d5 -
-
- -
- - user-down -
- ti ti-user-down
- \f9d6 -
-
- -
- - user-edit -
- ti ti-user-edit
- \f7cc -
-
- -
- - user-exclamation -
- ti ti-user-exclamation
- \ec12 -
-
- -
- - user-heart -
- ti ti-user-heart
- \f7cd -
-
- -
- - user-minus -
- ti ti-user-minus
- \eb4a -
-
- -
- - user-off -
- ti ti-user-off
- \ecf9 -
-
- -
- - user-pause -
- ti ti-user-pause
- \f9d7 -
-
- -
- - user-pin -
- ti ti-user-pin
- \f7ce -
-
- -
- - user-plus -
- ti ti-user-plus
- \eb4b -
-
- -
- - user-question -
- ti ti-user-question
- \f7cf -
-
- -
- - user-search -
- ti ti-user-search
- \ef89 -
-
- -
- - user-share -
- ti ti-user-share
- \f9d8 -
-
- -
- - user-shield -
- ti ti-user-shield
- \f7d0 -
-
- -
- - user-star -
- ti ti-user-star
- \f7d1 -
-
- -
- - user-up -
- ti ti-user-up
- \f7d2 -
-
- -
- - user-x -
- ti ti-user-x
- \eb4c -
-
- -
- - users -
- ti ti-users
- \ebf2 -
-
- -
- - uv-index -
- ti ti-uv-index
- \f3b2 -
-
- -
- - ux-circle -
- ti ti-ux-circle
- \f369 -
-
- -
- - vaccine -
- ti ti-vaccine
- \ef04 -
-
- -
- - vaccine-bottle -
- ti ti-vaccine-bottle
- \ef69 -
-
- -
- - vaccine-bottle-off -
- ti ti-vaccine-bottle-off
- \f439 -
-
- -
- - vaccine-off -
- ti ti-vaccine-off
- \f1bc -
-
- -
- - vacuum-cleaner -
- ti ti-vacuum-cleaner
- \f5e6 -
-
- -
- - variable -
- ti ti-variable
- \ef05 -
-
- -
- - variable-minus -
- ti ti-variable-minus
- \f36a -
-
- -
- - variable-off -
- ti ti-variable-off
- \f1bd -
-
- -
- - variable-plus -
- ti ti-variable-plus
- \f36b -
-
- -
- - vector -
- ti ti-vector
- \eca9 -
-
- -
- - vector-bezier -
- ti ti-vector-bezier
- \ef1d -
-
- -
- - vector-bezier-2 -
- ti ti-vector-bezier-2
- \f1a3 -
-
- -
- - vector-bezier-arc -
- ti ti-vector-bezier-arc
- \f4cd -
-
- -
- - vector-bezier-circle -
- ti ti-vector-bezier-circle
- \f4ce -
-
- -
- - vector-off -
- ti ti-vector-off
- \f1be -
-
- -
- - vector-spline -
- ti ti-vector-spline
- \f565 -
-
- -
- - vector-triangle -
- ti ti-vector-triangle
- \eca8 -
-
- -
- - vector-triangle-off -
- ti ti-vector-triangle-off
- \f1bf -
-
- -
- - venus -
- ti ti-venus
- \ec86 -
-
- -
- - versions -
- ti ti-versions
- \ed52 -
-
- -
- - versions-filled -
- ti ti-versions-filled
- \f6b1 -
-
- -
- - versions-off -
- ti ti-versions-off
- \f1c0 -
-
- -
- - video -
- ti ti-video
- \ed22 -
-
- -
- - video-minus -
- ti ti-video-minus
- \ed1f -
-
- -
- - video-off -
- ti ti-video-off
- \ed20 -
-
- -
- - video-plus -
- ti ti-video-plus
- \ed21 -
-
- -
- - view-360 -
- ti ti-view-360
- \ed84 -
-
- -
- - view-360-off -
- ti ti-view-360-off
- \f1c1 -
-
- -
- - viewfinder -
- ti ti-viewfinder
- \eb4e -
-
- -
- - viewfinder-off -
- ti ti-viewfinder-off
- \f1c2 -
-
- -
- - viewport-narrow -
- ti ti-viewport-narrow
- \ebf3 -
-
- -
- - viewport-wide -
- ti ti-viewport-wide
- \ebf4 -
-
- -
- - vinyl -
- ti ti-vinyl
- \f00d -
-
- -
- - vip -
- ti ti-vip
- \f3b3 -
-
- -
- - vip-off -
- ti ti-vip-off
- \f43a -
-
- -
- - virus -
- ti ti-virus
- \eb74 -
-
- -
- - virus-off -
- ti ti-virus-off
- \ed66 -
-
- -
- - virus-search -
- ti ti-virus-search
- \ed67 -
-
- -
- - vocabulary -
- ti ti-vocabulary
- \ef1e -
-
- -
- - vocabulary-off -
- ti ti-vocabulary-off
- \f43b -
-
- -
- - volcano -
- ti ti-volcano
- \f79c -
-
- -
- - volume -
- ti ti-volume
- \eb51 -
-
- -
- - volume-2 -
- ti ti-volume-2
- \eb4f -
-
- -
- - volume-3 -
- ti ti-volume-3
- \eb50 -
-
- -
- - volume-off -
- ti ti-volume-off
- \f1c3 -
-
- -
- - walk -
- ti ti-walk
- \ec87 -
-
- -
- - wall -
- ti ti-wall
- \ef7a -
-
- -
- - wall-off -
- ti ti-wall-off
- \f43c -
-
- -
- - wallet -
- ti ti-wallet
- \eb75 -
-
- -
- - wallet-off -
- ti ti-wallet-off
- \f1c4 -
-
- -
- - wallpaper -
- ti ti-wallpaper
- \ef56 -
-
- -
- - wallpaper-off -
- ti ti-wallpaper-off
- \f1c5 -
-
- -
- - wand -
- ti ti-wand
- \ebcb -
-
- -
- - wand-off -
- ti ti-wand-off
- \f1c6 -
-
- -
- - wash -
- ti ti-wash
- \f311 -
-
- -
- - wash-dry -
- ti ti-wash-dry
- \f304 -
-
- -
- - wash-dry-1 -
- ti ti-wash-dry-1
- \f2fa -
-
- -
- - wash-dry-2 -
- ti ti-wash-dry-2
- \f2fb -
-
- -
- - wash-dry-3 -
- ti ti-wash-dry-3
- \f2fc -
-
- -
- - wash-dry-a -
- ti ti-wash-dry-a
- \f2fd -
-
- -
- - wash-dry-dip -
- ti ti-wash-dry-dip
- \f2fe -
-
- -
- - wash-dry-f -
- ti ti-wash-dry-f
- \f2ff -
-
- -
- - wash-dry-hang -
- ti ti-wash-dry-hang
- \f300 -
-
- -
- - wash-dry-off -
- ti ti-wash-dry-off
- \f301 -
-
- -
- - wash-dry-p -
- ti ti-wash-dry-p
- \f302 -
-
- -
- - wash-dry-shade -
- ti ti-wash-dry-shade
- \f303 -
-
- -
- - wash-dry-w -
- ti ti-wash-dry-w
- \f322 -
-
- -
- - wash-dryclean -
- ti ti-wash-dryclean
- \f305 -
-
- -
- - wash-dryclean-off -
- ti ti-wash-dryclean-off
- \f323 -
-
- -
- - wash-gentle -
- ti ti-wash-gentle
- \f306 -
-
- -
- - wash-machine -
- ti ti-wash-machine
- \f25e -
-
- -
- - wash-off -
- ti ti-wash-off
- \f307 -
-
- -
- - wash-press -
- ti ti-wash-press
- \f308 -
-
- -
- - wash-temperature-1 -
- ti ti-wash-temperature-1
- \f309 -
-
- -
- - wash-temperature-2 -
- ti ti-wash-temperature-2
- \f30a -
-
- -
- - wash-temperature-3 -
- ti ti-wash-temperature-3
- \f30b -
-
- -
- - wash-temperature-4 -
- ti ti-wash-temperature-4
- \f30c -
-
- -
- - wash-temperature-5 -
- ti ti-wash-temperature-5
- \f30d -
-
- -
- - wash-temperature-6 -
- ti ti-wash-temperature-6
- \f30e -
-
- -
- - wash-tumble-dry -
- ti ti-wash-tumble-dry
- \f30f -
-
- -
- - wash-tumble-off -
- ti ti-wash-tumble-off
- \f310 -
-
- -
- - wave-saw-tool -
- ti ti-wave-saw-tool
- \ecd3 -
-
- -
- - wave-sine -
- ti ti-wave-sine
- \ecd4 -
-
- -
- - wave-square -
- ti ti-wave-square
- \ecd5 -
-
- -
- - webhook -
- ti ti-webhook
- \f01e -
-
- -
- - webhook-off -
- ti ti-webhook-off
- \f43d -
-
- -
- - weight -
- ti ti-weight
- \f589 -
-
- -
- - wheelchair -
- ti ti-wheelchair
- \f1db -
-
- -
- - wheelchair-off -
- ti ti-wheelchair-off
- \f43e -
-
- -
- - whirl -
- ti ti-whirl
- \f51d -
-
- -
- - wifi -
- ti ti-wifi
- \eb52 -
-
- -
- - wifi-0 -
- ti ti-wifi-0
- \eba3 -
-
- -
- - wifi-1 -
- ti ti-wifi-1
- \eba4 -
-
- -
- - wifi-2 -
- ti ti-wifi-2
- \eba5 -
-
- -
- - wifi-off -
- ti ti-wifi-off
- \ecfa -
-
- -
- - wind -
- ti ti-wind
- \ec34 -
-
- -
- - wind-off -
- ti ti-wind-off
- \f1c7 -
-
- -
- - windmill -
- ti ti-windmill
- \ed85 -
-
- -
- - windmill-filled -
- ti ti-windmill-filled
- \f6b2 -
-
- -
- - windmill-off -
- ti ti-windmill-off
- \f1c8 -
-
- -
- - window -
- ti ti-window
- \ef06 -
-
- -
- - window-maximize -
- ti ti-window-maximize
- \f1f1 -
-
- -
- - window-minimize -
- ti ti-window-minimize
- \f1f2 -
-
- -
- - window-off -
- ti ti-window-off
- \f1c9 -
-
- -
- - windsock -
- ti ti-windsock
- \f06d -
-
- -
- - wiper -
- ti ti-wiper
- \ecab -
-
- -
- - wiper-wash -
- ti ti-wiper-wash
- \ecaa -
-
- -
- - woman -
- ti ti-woman
- \eb53 -
-
- -
- - wood -
- ti ti-wood
- \f359 -
-
- -
- - world -
- ti ti-world
- \eb54 -
-
- -
- - world-bolt -
- ti ti-world-bolt
- \f9d9 -
-
- -
- - world-cancel -
- ti ti-world-cancel
- \f9da -
-
- -
- - world-check -
- ti ti-world-check
- \f9db -
-
- -
- - world-code -
- ti ti-world-code
- \f9dc -
-
- -
- - world-cog -
- ti ti-world-cog
- \f9dd -
-
- -
- - world-dollar -
- ti ti-world-dollar
- \f9de -
-
- -
- - world-down -
- ti ti-world-down
- \f9df -
-
- -
- - world-download -
- ti ti-world-download
- \ef8a -
-
- -
- - world-exclamation -
- ti ti-world-exclamation
- \f9e0 -
-
- -
- - world-heart -
- ti ti-world-heart
- \f9e1 -
-
- -
- - world-latitude -
- ti ti-world-latitude
- \ed2e -
-
- -
- - world-longitude -
- ti ti-world-longitude
- \ed2f -
-
- -
- - world-minus -
- ti ti-world-minus
- \f9e2 -
-
- -
- - world-off -
- ti ti-world-off
- \f1ca -
-
- -
- - world-pause -
- ti ti-world-pause
- \f9e3 -
-
- -
- - world-pin -
- ti ti-world-pin
- \f9e4 -
-
- -
- - world-plus -
- ti ti-world-plus
- \f9e5 -
-
- -
- - world-question -
- ti ti-world-question
- \f9e6 -
-
- -
- - world-search -
- ti ti-world-search
- \f9e7 -
-
- -
- - world-share -
- ti ti-world-share
- \f9e8 -
-
- -
- - world-star -
- ti ti-world-star
- \f9e9 -
-
- -
- - world-up -
- ti ti-world-up
- \f9ea -
-
- -
- - world-upload -
- ti ti-world-upload
- \ef8b -
-
- -
- - world-www -
- ti ti-world-www
- \f38f -
-
- -
- - world-x -
- ti ti-world-x
- \f9eb -
-
- -
- - wrecking-ball -
- ti ti-wrecking-ball
- \ed97 -
-
- -
- - writing -
- ti ti-writing
- \ef08 -
-
- -
- - writing-off -
- ti ti-writing-off
- \f1cb -
-
- -
- - writing-sign -
- ti ti-writing-sign
- \ef07 -
-
- -
- - writing-sign-off -
- ti ti-writing-sign-off
- \f1cc -
-
- -
- - x -
- ti ti-x
- \eb55 -
-
- -
- - xbox-a -
- ti ti-xbox-a
- \f2b6 -
-
- -
- - xbox-b -
- ti ti-xbox-b
- \f2b7 -
-
- -
- - xbox-x -
- ti ti-xbox-x
- \f2b8 -
-
- -
- - xbox-y -
- ti ti-xbox-y
- \f2b9 -
-
- -
- - yin-yang -
- ti ti-yin-yang
- \ec35 -
-
- -
- - yin-yang-filled -
- ti ti-yin-yang-filled
- \f785 -
-
- -
- - yoga -
- ti ti-yoga
- \f01f -
-
- -
- - zeppelin -
- ti ti-zeppelin
- \f270 -
-
- -
- - zeppelin-off -
- ti ti-zeppelin-off
- \f43f -
-
- -
- - zip -
- ti ti-zip
- \f3b4 -
-
- -
- - zodiac-aquarius -
- ti ti-zodiac-aquarius
- \ecac -
-
- -
- - zodiac-aries -
- ti ti-zodiac-aries
- \ecad -
-
- -
- - zodiac-cancer -
- ti ti-zodiac-cancer
- \ecae -
-
- -
- - zodiac-capricorn -
- ti ti-zodiac-capricorn
- \ecaf -
-
- -
- - zodiac-gemini -
- ti ti-zodiac-gemini
- \ecb0 -
-
- -
- - zodiac-leo -
- ti ti-zodiac-leo
- \ecb1 -
-
- -
- - zodiac-libra -
- ti ti-zodiac-libra
- \ecb2 -
-
- -
- - zodiac-pisces -
- ti ti-zodiac-pisces
- \ecb3 -
-
- -
- - zodiac-sagittarius -
- ti ti-zodiac-sagittarius
- \ecb4 -
-
- -
- - zodiac-scorpio -
- ti ti-zodiac-scorpio
- \ecb5 -
-
- -
- - zodiac-taurus -
- ti ti-zodiac-taurus
- \ecb6 -
-
- -
- - zodiac-virgo -
- ti ti-zodiac-virgo
- \ecb7 -
-
- -
- - zoom-cancel -
- ti ti-zoom-cancel
- \ec4d -
-
- -
- - zoom-check -
- ti ti-zoom-check
- \ef09 -
-
- -
- - zoom-check-filled -
- ti ti-zoom-check-filled
- \f786 -
-
- -
- - zoom-code -
- ti ti-zoom-code
- \f07f -
-
- -
- - zoom-exclamation -
- ti ti-zoom-exclamation
- \f080 -
-
- -
- - zoom-filled -
- ti ti-zoom-filled
- \f787 -
-
- -
- - zoom-in -
- ti ti-zoom-in
- \eb56 -
-
- -
- - zoom-in-area -
- ti ti-zoom-in-area
- \f1dc -
-
- -
- - zoom-in-area-filled -
- ti ti-zoom-in-area-filled
- \f788 -
-
- -
- - zoom-in-filled -
- ti ti-zoom-in-filled
- \f789 -
-
- -
- - zoom-money -
- ti ti-zoom-money
- \ef0a -
-
- -
- - zoom-out -
- ti ti-zoom-out
- \eb57 -
-
- -
- - zoom-out-area -
- ti ti-zoom-out-area
- \f1dd -
-
- -
- - zoom-out-filled -
- ti ti-zoom-out-filled
- \f78a -
-
- -
- - zoom-pan -
- ti ti-zoom-pan
- \f1de -
-
- -
- - zoom-question -
- ti ti-zoom-question
- \edeb -
-
- -
- - zoom-replace -
- ti ti-zoom-replace
- \f2a7 -
-
- -
- - zoom-reset -
- ti ti-zoom-reset
- \f295 -
-
- -
- - zzz -
- ti ti-zzz
- \f228 -
-
- -
- - zzz-off -
- ti ti-zzz-off
- \f440 -
-
- -
-
-
- - - - - diff --git a/playground/fonts/tabler-icons/tabler-icons.min.css b/playground/fonts/tabler-icons/tabler-icons.min.css deleted file mode 100644 index 9afc0bc97916c4..00000000000000 --- a/playground/fonts/tabler-icons/tabler-icons.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Tabler Icons 2.11.0 by tabler - https://tabler.io - * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE - */@font-face{font-family:"tabler-icons";font-style:normal;font-weight:400;src:url("./fonts/tabler-icons.eot?v2.11.0");src:url("./fonts/tabler-icons.eot?#iefix-v2.11.0") format("embedded-opentype"),url("./fonts/tabler-icons.woff2?v2.11.0") format("woff2"),url("./fonts/tabler-icons.woff?") format("woff"),url("./fonts/tabler-icons.ttf?v2.11.0") format("truetype")}.ti{font-family:"tabler-icons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ti-123:before{content:"\f554"}.ti-24-hours:before{content:"\f5e7"}.ti-2fa:before{content:"\eca0"}.ti-360:before{content:"\f62f"}.ti-360-view:before{content:"\f566"}.ti-3d-cube-sphere:before{content:"\ecd7"}.ti-3d-cube-sphere-off:before{content:"\f3b5"}.ti-3d-rotate:before{content:"\f020"}.ti-a-b:before{content:"\ec36"}.ti-a-b-2:before{content:"\f25f"}.ti-a-b-off:before{content:"\f0a6"}.ti-abacus:before{content:"\f05c"}.ti-abacus-off:before{content:"\f3b6"}.ti-abc:before{content:"\f567"}.ti-access-point:before{content:"\ed1b"}.ti-access-point-off:before{content:"\ed1a"}.ti-accessible:before{content:"\eba9"}.ti-accessible-off:before{content:"\f0a7"}.ti-accessible-off-filled:before{content:"\f6ea"}.ti-activity:before{content:"\ed23"}.ti-activity-heartbeat:before{content:"\f0db"}.ti-ad:before{content:"\ea02"}.ti-ad-2:before{content:"\ef1f"}.ti-ad-circle:before{content:"\f79e"}.ti-ad-circle-filled:before{content:"\f7d3"}.ti-ad-circle-off:before{content:"\f79d"}.ti-ad-filled:before{content:"\f6eb"}.ti-ad-off:before{content:"\f3b7"}.ti-address-book:before{content:"\f021"}.ti-address-book-off:before{content:"\f3b8"}.ti-adjustments:before{content:"\ea03"}.ti-adjustments-alt:before{content:"\ec37"}.ti-adjustments-bolt:before{content:"\f7fb"}.ti-adjustments-cancel:before{content:"\f7fc"}.ti-adjustments-check:before{content:"\f7fd"}.ti-adjustments-code:before{content:"\f7fe"}.ti-adjustments-cog:before{content:"\f7ff"}.ti-adjustments-dollar:before{content:"\f800"}.ti-adjustments-down:before{content:"\f801"}.ti-adjustments-exclamation:before{content:"\f802"}.ti-adjustments-filled:before{content:"\f6ec"}.ti-adjustments-heart:before{content:"\f803"}.ti-adjustments-horizontal:before{content:"\ec38"}.ti-adjustments-minus:before{content:"\f804"}.ti-adjustments-off:before{content:"\f0a8"}.ti-adjustments-pause:before{content:"\f805"}.ti-adjustments-pin:before{content:"\f806"}.ti-adjustments-plus:before{content:"\f807"}.ti-adjustments-question:before{content:"\f808"}.ti-adjustments-search:before{content:"\f809"}.ti-adjustments-share:before{content:"\f80a"}.ti-adjustments-star:before{content:"\f80b"}.ti-adjustments-up:before{content:"\f80c"}.ti-adjustments-x:before{content:"\f80d"}.ti-aerial-lift:before{content:"\edfe"}.ti-affiliate:before{content:"\edff"}.ti-affiliate-filled:before{content:"\f6ed"}.ti-air-balloon:before{content:"\f4a6"}.ti-air-conditioning:before{content:"\f3a2"}.ti-air-conditioning-disabled:before{content:"\f542"}.ti-alarm:before{content:"\ea04"}.ti-alarm-filled:before{content:"\f709"}.ti-alarm-minus:before{content:"\f630"}.ti-alarm-minus-filled:before{content:"\f70a"}.ti-alarm-off:before{content:"\f0a9"}.ti-alarm-plus:before{content:"\f631"}.ti-alarm-plus-filled:before{content:"\f70b"}.ti-alarm-snooze:before{content:"\f632"}.ti-alarm-snooze-filled:before{content:"\f70c"}.ti-album:before{content:"\f022"}.ti-album-off:before{content:"\f3b9"}.ti-alert-circle:before{content:"\ea05"}.ti-alert-circle-filled:before{content:"\f6ee"}.ti-alert-hexagon:before{content:"\f80e"}.ti-alert-octagon:before{content:"\ecc6"}.ti-alert-octagon-filled:before{content:"\f6ef"}.ti-alert-small:before{content:"\f80f"}.ti-alert-square:before{content:"\f811"}.ti-alert-square-rounded:before{content:"\f810"}.ti-alert-triangle:before{content:"\ea06"}.ti-alert-triangle-filled:before{content:"\f6f0"}.ti-alien:before{content:"\ebde"}.ti-alien-filled:before{content:"\f70d"}.ti-align-box-bottom-center:before{content:"\f530"}.ti-align-box-bottom-center-filled:before{content:"\f70e"}.ti-align-box-bottom-left:before{content:"\f531"}.ti-align-box-bottom-left-filled:before{content:"\f70f"}.ti-align-box-bottom-right:before{content:"\f532"}.ti-align-box-bottom-right-filled:before{content:"\f710"}.ti-align-box-center-middle:before{content:"\f79f"}.ti-align-box-center-middle-filled:before{content:"\f7d4"}.ti-align-box-left-bottom:before{content:"\f533"}.ti-align-box-left-bottom-filled:before{content:"\f711"}.ti-align-box-left-middle:before{content:"\f534"}.ti-align-box-left-middle-filled:before{content:"\f712"}.ti-align-box-left-top:before{content:"\f535"}.ti-align-box-left-top-filled:before{content:"\f713"}.ti-align-box-right-bottom:before{content:"\f536"}.ti-align-box-right-bottom-filled:before{content:"\f714"}.ti-align-box-right-middle:before{content:"\f537"}.ti-align-box-right-middle-filled:before{content:"\f7d5"}.ti-align-box-right-top:before{content:"\f538"}.ti-align-box-right-top-filled:before{content:"\f715"}.ti-align-box-top-center:before{content:"\f539"}.ti-align-box-top-center-filled:before{content:"\f716"}.ti-align-box-top-left:before{content:"\f53a"}.ti-align-box-top-left-filled:before{content:"\f717"}.ti-align-box-top-right:before{content:"\f53b"}.ti-align-box-top-right-filled:before{content:"\f718"}.ti-align-center:before{content:"\ea07"}.ti-align-justified:before{content:"\ea08"}.ti-align-left:before{content:"\ea09"}.ti-align-right:before{content:"\ea0a"}.ti-alpha:before{content:"\f543"}.ti-alphabet-cyrillic:before{content:"\f1df"}.ti-alphabet-greek:before{content:"\f1e0"}.ti-alphabet-latin:before{content:"\f1e1"}.ti-ambulance:before{content:"\ebf5"}.ti-ampersand:before{content:"\f229"}.ti-analyze:before{content:"\f3a3"}.ti-analyze-filled:before{content:"\f719"}.ti-analyze-off:before{content:"\f3ba"}.ti-anchor:before{content:"\eb76"}.ti-anchor-off:before{content:"\f0f7"}.ti-angle:before{content:"\ef20"}.ti-ankh:before{content:"\f1cd"}.ti-antenna:before{content:"\f094"}.ti-antenna-bars-1:before{content:"\ecc7"}.ti-antenna-bars-2:before{content:"\ecc8"}.ti-antenna-bars-3:before{content:"\ecc9"}.ti-antenna-bars-4:before{content:"\ecca"}.ti-antenna-bars-5:before{content:"\eccb"}.ti-antenna-bars-off:before{content:"\f0aa"}.ti-antenna-off:before{content:"\f3bb"}.ti-aperture:before{content:"\eb58"}.ti-aperture-off:before{content:"\f3bc"}.ti-api:before{content:"\effd"}.ti-api-app:before{content:"\effc"}.ti-api-app-off:before{content:"\f0ab"}.ti-api-off:before{content:"\f0f8"}.ti-app-window:before{content:"\efe6"}.ti-app-window-filled:before{content:"\f71a"}.ti-apple:before{content:"\ef21"}.ti-apps:before{content:"\ebb6"}.ti-apps-filled:before{content:"\f6f1"}.ti-apps-off:before{content:"\f0ac"}.ti-archive:before{content:"\ea0b"}.ti-archive-off:before{content:"\f0ad"}.ti-armchair:before{content:"\ef9e"}.ti-armchair-2:before{content:"\efe7"}.ti-armchair-2-off:before{content:"\f3bd"}.ti-armchair-off:before{content:"\f3be"}.ti-arrow-autofit-content:before{content:"\ef31"}.ti-arrow-autofit-content-filled:before{content:"\f6f2"}.ti-arrow-autofit-down:before{content:"\ef32"}.ti-arrow-autofit-height:before{content:"\ef33"}.ti-arrow-autofit-left:before{content:"\ef34"}.ti-arrow-autofit-right:before{content:"\ef35"}.ti-arrow-autofit-up:before{content:"\ef36"}.ti-arrow-autofit-width:before{content:"\ef37"}.ti-arrow-back:before{content:"\ea0c"}.ti-arrow-back-up:before{content:"\eb77"}.ti-arrow-back-up-double:before{content:"\f9ec"}.ti-arrow-badge-down:before{content:"\f60b"}.ti-arrow-badge-down-filled:before{content:"\f7d6"}.ti-arrow-badge-left:before{content:"\f60c"}.ti-arrow-badge-left-filled:before{content:"\f7d7"}.ti-arrow-badge-right:before{content:"\f60d"}.ti-arrow-badge-right-filled:before{content:"\f7d8"}.ti-arrow-badge-up:before{content:"\f60e"}.ti-arrow-badge-up-filled:before{content:"\f7d9"}.ti-arrow-bar-down:before{content:"\ea0d"}.ti-arrow-bar-left:before{content:"\ea0e"}.ti-arrow-bar-right:before{content:"\ea0f"}.ti-arrow-bar-to-down:before{content:"\ec88"}.ti-arrow-bar-to-left:before{content:"\ec89"}.ti-arrow-bar-to-right:before{content:"\ec8a"}.ti-arrow-bar-to-up:before{content:"\ec8b"}.ti-arrow-bar-up:before{content:"\ea10"}.ti-arrow-bear-left:before{content:"\f045"}.ti-arrow-bear-left-2:before{content:"\f044"}.ti-arrow-bear-right:before{content:"\f047"}.ti-arrow-bear-right-2:before{content:"\f046"}.ti-arrow-big-down:before{content:"\edda"}.ti-arrow-big-down-filled:before{content:"\f6c6"}.ti-arrow-big-down-line:before{content:"\efe8"}.ti-arrow-big-down-line-filled:before{content:"\f6c7"}.ti-arrow-big-down-lines:before{content:"\efe9"}.ti-arrow-big-down-lines-filled:before{content:"\f6c8"}.ti-arrow-big-left:before{content:"\eddb"}.ti-arrow-big-left-filled:before{content:"\f6c9"}.ti-arrow-big-left-line:before{content:"\efea"}.ti-arrow-big-left-line-filled:before{content:"\f6ca"}.ti-arrow-big-left-lines:before{content:"\efeb"}.ti-arrow-big-left-lines-filled:before{content:"\f6cb"}.ti-arrow-big-right:before{content:"\eddc"}.ti-arrow-big-right-filled:before{content:"\f6cc"}.ti-arrow-big-right-line:before{content:"\efec"}.ti-arrow-big-right-line-filled:before{content:"\f6cd"}.ti-arrow-big-right-lines:before{content:"\efed"}.ti-arrow-big-right-lines-filled:before{content:"\f6ce"}.ti-arrow-big-up:before{content:"\eddd"}.ti-arrow-big-up-filled:before{content:"\f6cf"}.ti-arrow-big-up-line:before{content:"\efee"}.ti-arrow-big-up-line-filled:before{content:"\f6d0"}.ti-arrow-big-up-lines:before{content:"\efef"}.ti-arrow-big-up-lines-filled:before{content:"\f6d1"}.ti-arrow-bounce:before{content:"\f3a4"}.ti-arrow-curve-left:before{content:"\f048"}.ti-arrow-curve-right:before{content:"\f049"}.ti-arrow-down:before{content:"\ea16"}.ti-arrow-down-bar:before{content:"\ed98"}.ti-arrow-down-circle:before{content:"\ea11"}.ti-arrow-down-left:before{content:"\ea13"}.ti-arrow-down-left-circle:before{content:"\ea12"}.ti-arrow-down-rhombus:before{content:"\f61d"}.ti-arrow-down-right:before{content:"\ea15"}.ti-arrow-down-right-circle:before{content:"\ea14"}.ti-arrow-down-square:before{content:"\ed9a"}.ti-arrow-down-tail:before{content:"\ed9b"}.ti-arrow-elbow-left:before{content:"\f9ed"}.ti-arrow-elbow-right:before{content:"\f9ee"}.ti-arrow-fork:before{content:"\f04a"}.ti-arrow-forward:before{content:"\ea17"}.ti-arrow-forward-up:before{content:"\eb78"}.ti-arrow-forward-up-double:before{content:"\f9ef"}.ti-arrow-guide:before{content:"\f22a"}.ti-arrow-iteration:before{content:"\f578"}.ti-arrow-left:before{content:"\ea19"}.ti-arrow-left-bar:before{content:"\ed9c"}.ti-arrow-left-circle:before{content:"\ea18"}.ti-arrow-left-rhombus:before{content:"\f61e"}.ti-arrow-left-right:before{content:"\f04b"}.ti-arrow-left-square:before{content:"\ed9d"}.ti-arrow-left-tail:before{content:"\ed9e"}.ti-arrow-loop-left:before{content:"\ed9f"}.ti-arrow-loop-left-2:before{content:"\f04c"}.ti-arrow-loop-right:before{content:"\eda0"}.ti-arrow-loop-right-2:before{content:"\f04d"}.ti-arrow-merge:before{content:"\f04e"}.ti-arrow-merge-both:before{content:"\f23b"}.ti-arrow-merge-left:before{content:"\f23c"}.ti-arrow-merge-right:before{content:"\f23d"}.ti-arrow-move-down:before{content:"\f2ba"}.ti-arrow-move-left:before{content:"\f2bb"}.ti-arrow-move-right:before{content:"\f2bc"}.ti-arrow-move-up:before{content:"\f2bd"}.ti-arrow-narrow-down:before{content:"\ea1a"}.ti-arrow-narrow-left:before{content:"\ea1b"}.ti-arrow-narrow-right:before{content:"\ea1c"}.ti-arrow-narrow-up:before{content:"\ea1d"}.ti-arrow-ramp-left:before{content:"\ed3c"}.ti-arrow-ramp-left-2:before{content:"\f04f"}.ti-arrow-ramp-left-3:before{content:"\f050"}.ti-arrow-ramp-right:before{content:"\ed3d"}.ti-arrow-ramp-right-2:before{content:"\f051"}.ti-arrow-ramp-right-3:before{content:"\f052"}.ti-arrow-right:before{content:"\ea1f"}.ti-arrow-right-bar:before{content:"\eda1"}.ti-arrow-right-circle:before{content:"\ea1e"}.ti-arrow-right-rhombus:before{content:"\f61f"}.ti-arrow-right-square:before{content:"\eda2"}.ti-arrow-right-tail:before{content:"\eda3"}.ti-arrow-rotary-first-left:before{content:"\f053"}.ti-arrow-rotary-first-right:before{content:"\f054"}.ti-arrow-rotary-last-left:before{content:"\f055"}.ti-arrow-rotary-last-right:before{content:"\f056"}.ti-arrow-rotary-left:before{content:"\f057"}.ti-arrow-rotary-right:before{content:"\f058"}.ti-arrow-rotary-straight:before{content:"\f059"}.ti-arrow-roundabout-left:before{content:"\f22b"}.ti-arrow-roundabout-right:before{content:"\f22c"}.ti-arrow-sharp-turn-left:before{content:"\f05a"}.ti-arrow-sharp-turn-right:before{content:"\f05b"}.ti-arrow-up:before{content:"\ea25"}.ti-arrow-up-bar:before{content:"\eda4"}.ti-arrow-up-circle:before{content:"\ea20"}.ti-arrow-up-left:before{content:"\ea22"}.ti-arrow-up-left-circle:before{content:"\ea21"}.ti-arrow-up-rhombus:before{content:"\f620"}.ti-arrow-up-right:before{content:"\ea24"}.ti-arrow-up-right-circle:before{content:"\ea23"}.ti-arrow-up-square:before{content:"\eda6"}.ti-arrow-up-tail:before{content:"\eda7"}.ti-arrow-wave-left-down:before{content:"\eda8"}.ti-arrow-wave-left-up:before{content:"\eda9"}.ti-arrow-wave-right-down:before{content:"\edaa"}.ti-arrow-wave-right-up:before{content:"\edab"}.ti-arrow-zig-zag:before{content:"\f4a7"}.ti-arrows-cross:before{content:"\effe"}.ti-arrows-diagonal:before{content:"\ea27"}.ti-arrows-diagonal-2:before{content:"\ea26"}.ti-arrows-diagonal-minimize:before{content:"\ef39"}.ti-arrows-diagonal-minimize-2:before{content:"\ef38"}.ti-arrows-diff:before{content:"\f296"}.ti-arrows-double-ne-sw:before{content:"\edde"}.ti-arrows-double-nw-se:before{content:"\eddf"}.ti-arrows-double-se-nw:before{content:"\ede0"}.ti-arrows-double-sw-ne:before{content:"\ede1"}.ti-arrows-down:before{content:"\edad"}.ti-arrows-down-up:before{content:"\edac"}.ti-arrows-exchange:before{content:"\f1f4"}.ti-arrows-exchange-2:before{content:"\f1f3"}.ti-arrows-horizontal:before{content:"\eb59"}.ti-arrows-join:before{content:"\edaf"}.ti-arrows-join-2:before{content:"\edae"}.ti-arrows-left:before{content:"\edb1"}.ti-arrows-left-down:before{content:"\ee00"}.ti-arrows-left-right:before{content:"\edb0"}.ti-arrows-maximize:before{content:"\ea28"}.ti-arrows-minimize:before{content:"\ea29"}.ti-arrows-move:before{content:"\f22f"}.ti-arrows-move-horizontal:before{content:"\f22d"}.ti-arrows-move-vertical:before{content:"\f22e"}.ti-arrows-random:before{content:"\f095"}.ti-arrows-right:before{content:"\edb3"}.ti-arrows-right-down:before{content:"\ee01"}.ti-arrows-right-left:before{content:"\edb2"}.ti-arrows-shuffle:before{content:"\f000"}.ti-arrows-shuffle-2:before{content:"\efff"}.ti-arrows-sort:before{content:"\eb5a"}.ti-arrows-split:before{content:"\edb5"}.ti-arrows-split-2:before{content:"\edb4"}.ti-arrows-transfer-down:before{content:"\f2cc"}.ti-arrows-transfer-up:before{content:"\f2cd"}.ti-arrows-up:before{content:"\edb7"}.ti-arrows-up-down:before{content:"\edb6"}.ti-arrows-up-left:before{content:"\ee02"}.ti-arrows-up-right:before{content:"\ee03"}.ti-arrows-vertical:before{content:"\eb5b"}.ti-artboard:before{content:"\ea2a"}.ti-artboard-off:before{content:"\f0ae"}.ti-article:before{content:"\f1e2"}.ti-article-filled-filled:before{content:"\f7da"}.ti-article-off:before{content:"\f3bf"}.ti-aspect-ratio:before{content:"\ed30"}.ti-aspect-ratio-filled:before{content:"\f7db"}.ti-aspect-ratio-off:before{content:"\f0af"}.ti-assembly:before{content:"\f24d"}.ti-assembly-off:before{content:"\f3c0"}.ti-asset:before{content:"\f1ce"}.ti-asterisk:before{content:"\efd5"}.ti-asterisk-simple:before{content:"\efd4"}.ti-at:before{content:"\ea2b"}.ti-at-off:before{content:"\f0b0"}.ti-atom:before{content:"\eb79"}.ti-atom-2:before{content:"\ebdf"}.ti-atom-2-filled:before{content:"\f71b"}.ti-atom-off:before{content:"\f0f9"}.ti-augmented-reality:before{content:"\f023"}.ti-augmented-reality-2:before{content:"\f37e"}.ti-augmented-reality-off:before{content:"\f3c1"}.ti-award:before{content:"\ea2c"}.ti-award-filled:before{content:"\f71c"}.ti-award-off:before{content:"\f0fa"}.ti-axe:before{content:"\ef9f"}.ti-axis-x:before{content:"\ef45"}.ti-axis-y:before{content:"\ef46"}.ti-baby-bottle:before{content:"\f5d2"}.ti-baby-carriage:before{content:"\f05d"}.ti-backhoe:before{content:"\ed86"}.ti-backpack:before{content:"\ef47"}.ti-backpack-off:before{content:"\f3c2"}.ti-backspace:before{content:"\ea2d"}.ti-backspace-filled:before{content:"\f7dc"}.ti-badge:before{content:"\efc2"}.ti-badge-3d:before{content:"\f555"}.ti-badge-4k:before{content:"\f556"}.ti-badge-8k:before{content:"\f557"}.ti-badge-ad:before{content:"\f558"}.ti-badge-ar:before{content:"\f559"}.ti-badge-cc:before{content:"\f55a"}.ti-badge-filled:before{content:"\f667"}.ti-badge-hd:before{content:"\f55b"}.ti-badge-off:before{content:"\f0fb"}.ti-badge-sd:before{content:"\f55c"}.ti-badge-tm:before{content:"\f55d"}.ti-badge-vo:before{content:"\f55e"}.ti-badge-vr:before{content:"\f55f"}.ti-badge-wc:before{content:"\f560"}.ti-badges:before{content:"\efc3"}.ti-badges-filled:before{content:"\f7dd"}.ti-badges-off:before{content:"\f0fc"}.ti-baguette:before{content:"\f3a5"}.ti-ball-american-football:before{content:"\ee04"}.ti-ball-american-football-off:before{content:"\f3c3"}.ti-ball-baseball:before{content:"\efa0"}.ti-ball-basketball:before{content:"\ec28"}.ti-ball-bowling:before{content:"\ec29"}.ti-ball-football:before{content:"\ee06"}.ti-ball-football-off:before{content:"\ee05"}.ti-ball-tennis:before{content:"\ec2a"}.ti-ball-volleyball:before{content:"\ec2b"}.ti-balloon:before{content:"\ef3a"}.ti-balloon-off:before{content:"\f0fd"}.ti-ballpen:before{content:"\f06e"}.ti-ballpen-off:before{content:"\f0b1"}.ti-ban:before{content:"\ea2e"}.ti-bandage:before{content:"\eb7a"}.ti-bandage-filled:before{content:"\f7de"}.ti-bandage-off:before{content:"\f3c4"}.ti-barbell:before{content:"\eff0"}.ti-barbell-off:before{content:"\f0b2"}.ti-barcode:before{content:"\ebc6"}.ti-barcode-off:before{content:"\f0b3"}.ti-barrel:before{content:"\f0b4"}.ti-barrel-off:before{content:"\f0fe"}.ti-barrier-block:before{content:"\f00e"}.ti-barrier-block-off:before{content:"\f0b5"}.ti-baseline:before{content:"\f024"}.ti-baseline-density-large:before{content:"\f9f0"}.ti-baseline-density-medium:before{content:"\f9f1"}.ti-baseline-density-small:before{content:"\f9f2"}.ti-basket:before{content:"\ebe1"}.ti-basket-filled:before{content:"\f7df"}.ti-basket-off:before{content:"\f0b6"}.ti-bat:before{content:"\f284"}.ti-bath:before{content:"\ef48"}.ti-bath-filled:before{content:"\f71d"}.ti-bath-off:before{content:"\f0ff"}.ti-battery:before{content:"\ea34"}.ti-battery-1:before{content:"\ea2f"}.ti-battery-1-filled:before{content:"\f71e"}.ti-battery-2:before{content:"\ea30"}.ti-battery-2-filled:before{content:"\f71f"}.ti-battery-3:before{content:"\ea31"}.ti-battery-3-filled:before{content:"\f720"}.ti-battery-4:before{content:"\ea32"}.ti-battery-4-filled:before{content:"\f721"}.ti-battery-automotive:before{content:"\ee07"}.ti-battery-charging:before{content:"\ea33"}.ti-battery-charging-2:before{content:"\ef3b"}.ti-battery-eco:before{content:"\ef3c"}.ti-battery-filled:before{content:"\f668"}.ti-battery-off:before{content:"\ed1c"}.ti-beach:before{content:"\ef3d"}.ti-beach-off:before{content:"\f0b7"}.ti-bed:before{content:"\eb5c"}.ti-bed-filled:before{content:"\f7e0"}.ti-bed-off:before{content:"\f100"}.ti-beer:before{content:"\efa1"}.ti-beer-filled:before{content:"\f7e1"}.ti-beer-off:before{content:"\f101"}.ti-bell:before{content:"\ea35"}.ti-bell-bolt:before{content:"\f812"}.ti-bell-cancel:before{content:"\f813"}.ti-bell-check:before{content:"\f814"}.ti-bell-code:before{content:"\f815"}.ti-bell-cog:before{content:"\f816"}.ti-bell-dollar:before{content:"\f817"}.ti-bell-down:before{content:"\f818"}.ti-bell-exclamation:before{content:"\f819"}.ti-bell-filled:before{content:"\f669"}.ti-bell-heart:before{content:"\f81a"}.ti-bell-minus:before{content:"\ede2"}.ti-bell-minus-filled:before{content:"\f722"}.ti-bell-off:before{content:"\ece9"}.ti-bell-pause:before{content:"\f81b"}.ti-bell-pin:before{content:"\f81c"}.ti-bell-plus:before{content:"\ede3"}.ti-bell-plus-filled:before{content:"\f723"}.ti-bell-question:before{content:"\f81d"}.ti-bell-ringing:before{content:"\ed07"}.ti-bell-ringing-2:before{content:"\ede4"}.ti-bell-ringing-2-filled:before{content:"\f724"}.ti-bell-ringing-filled:before{content:"\f725"}.ti-bell-school:before{content:"\f05e"}.ti-bell-search:before{content:"\f81e"}.ti-bell-share:before{content:"\f81f"}.ti-bell-star:before{content:"\f820"}.ti-bell-up:before{content:"\f821"}.ti-bell-x:before{content:"\ede5"}.ti-bell-x-filled:before{content:"\f726"}.ti-bell-z:before{content:"\eff1"}.ti-bell-z-filled:before{content:"\f727"}.ti-beta:before{content:"\f544"}.ti-bible:before{content:"\efc4"}.ti-bike:before{content:"\ea36"}.ti-bike-off:before{content:"\f0b8"}.ti-binary:before{content:"\ee08"}.ti-binary-off:before{content:"\f3c5"}.ti-binary-tree:before{content:"\f5d4"}.ti-binary-tree-2:before{content:"\f5d3"}.ti-biohazard:before{content:"\ecb8"}.ti-biohazard-off:before{content:"\f0b9"}.ti-blade:before{content:"\f4bd"}.ti-blade-filled:before{content:"\f7e2"}.ti-bleach:before{content:"\f2f3"}.ti-bleach-chlorine:before{content:"\f2f0"}.ti-bleach-no-chlorine:before{content:"\f2f1"}.ti-bleach-off:before{content:"\f2f2"}.ti-blockquote:before{content:"\ee09"}.ti-bluetooth:before{content:"\ea37"}.ti-bluetooth-connected:before{content:"\ecea"}.ti-bluetooth-off:before{content:"\eceb"}.ti-bluetooth-x:before{content:"\f081"}.ti-blur:before{content:"\ef8c"}.ti-blur-off:before{content:"\f3c6"}.ti-bmp:before{content:"\f3a6"}.ti-bold:before{content:"\eb7b"}.ti-bold-off:before{content:"\f0ba"}.ti-bolt:before{content:"\ea38"}.ti-bolt-off:before{content:"\ecec"}.ti-bomb:before{content:"\f59c"}.ti-bone:before{content:"\edb8"}.ti-bone-off:before{content:"\f0bb"}.ti-bong:before{content:"\f3a7"}.ti-bong-off:before{content:"\f3c7"}.ti-book:before{content:"\ea39"}.ti-book-2:before{content:"\efc5"}.ti-book-download:before{content:"\f070"}.ti-book-off:before{content:"\f0bc"}.ti-book-upload:before{content:"\f071"}.ti-bookmark:before{content:"\ea3a"}.ti-bookmark-off:before{content:"\eced"}.ti-bookmarks:before{content:"\ed08"}.ti-bookmarks-off:before{content:"\f0bd"}.ti-books:before{content:"\eff2"}.ti-books-off:before{content:"\f0be"}.ti-border-all:before{content:"\ea3b"}.ti-border-bottom:before{content:"\ea3c"}.ti-border-corners:before{content:"\f7a0"}.ti-border-horizontal:before{content:"\ea3d"}.ti-border-inner:before{content:"\ea3e"}.ti-border-left:before{content:"\ea3f"}.ti-border-none:before{content:"\ea40"}.ti-border-outer:before{content:"\ea41"}.ti-border-radius:before{content:"\eb7c"}.ti-border-right:before{content:"\ea42"}.ti-border-sides:before{content:"\f7a1"}.ti-border-style:before{content:"\ee0a"}.ti-border-style-2:before{content:"\ef22"}.ti-border-top:before{content:"\ea43"}.ti-border-vertical:before{content:"\ea44"}.ti-bottle:before{content:"\ef0b"}.ti-bottle-off:before{content:"\f3c8"}.ti-bounce-left:before{content:"\f59d"}.ti-bounce-right:before{content:"\f59e"}.ti-bow:before{content:"\f096"}.ti-bowl:before{content:"\f4fa"}.ti-box:before{content:"\ea45"}.ti-box-align-bottom:before{content:"\f2a8"}.ti-box-align-bottom-left:before{content:"\f2ce"}.ti-box-align-bottom-right:before{content:"\f2cf"}.ti-box-align-left:before{content:"\f2a9"}.ti-box-align-right:before{content:"\f2aa"}.ti-box-align-top:before{content:"\f2ab"}.ti-box-align-top-left:before{content:"\f2d0"}.ti-box-align-top-right:before{content:"\f2d1"}.ti-box-margin:before{content:"\ee0b"}.ti-box-model:before{content:"\ee0c"}.ti-box-model-2:before{content:"\ef23"}.ti-box-model-2-off:before{content:"\f3c9"}.ti-box-model-off:before{content:"\f3ca"}.ti-box-multiple:before{content:"\ee17"}.ti-box-multiple-0:before{content:"\ee0d"}.ti-box-multiple-1:before{content:"\ee0e"}.ti-box-multiple-2:before{content:"\ee0f"}.ti-box-multiple-3:before{content:"\ee10"}.ti-box-multiple-4:before{content:"\ee11"}.ti-box-multiple-5:before{content:"\ee12"}.ti-box-multiple-6:before{content:"\ee13"}.ti-box-multiple-7:before{content:"\ee14"}.ti-box-multiple-8:before{content:"\ee15"}.ti-box-multiple-9:before{content:"\ee16"}.ti-box-off:before{content:"\f102"}.ti-box-padding:before{content:"\ee18"}.ti-box-seam:before{content:"\f561"}.ti-braces:before{content:"\ebcc"}.ti-braces-off:before{content:"\f0bf"}.ti-brackets:before{content:"\ebcd"}.ti-brackets-contain:before{content:"\f1e5"}.ti-brackets-contain-end:before{content:"\f1e3"}.ti-brackets-contain-start:before{content:"\f1e4"}.ti-brackets-off:before{content:"\f0c0"}.ti-braille:before{content:"\f545"}.ti-brain:before{content:"\f59f"}.ti-brand-4chan:before{content:"\f494"}.ti-brand-abstract:before{content:"\f495"}.ti-brand-adobe:before{content:"\f0dc"}.ti-brand-adonis-js:before{content:"\f496"}.ti-brand-airbnb:before{content:"\ed68"}.ti-brand-airtable:before{content:"\ef6a"}.ti-brand-algolia:before{content:"\f390"}.ti-brand-alipay:before{content:"\f7a2"}.ti-brand-alpine-js:before{content:"\f324"}.ti-brand-amazon:before{content:"\f230"}.ti-brand-amd:before{content:"\f653"}.ti-brand-amigo:before{content:"\f5f9"}.ti-brand-among-us:before{content:"\f205"}.ti-brand-android:before{content:"\ec16"}.ti-brand-angular:before{content:"\ef6b"}.ti-brand-ao3:before{content:"\f5e8"}.ti-brand-appgallery:before{content:"\f231"}.ti-brand-apple:before{content:"\ec17"}.ti-brand-apple-arcade:before{content:"\ed69"}.ti-brand-apple-podcast:before{content:"\f1e6"}.ti-brand-appstore:before{content:"\ed24"}.ti-brand-asana:before{content:"\edc5"}.ti-brand-backbone:before{content:"\f325"}.ti-brand-badoo:before{content:"\f206"}.ti-brand-baidu:before{content:"\f5e9"}.ti-brand-bandcamp:before{content:"\f207"}.ti-brand-bandlab:before{content:"\f5fa"}.ti-brand-beats:before{content:"\f208"}.ti-brand-behance:before{content:"\ec6e"}.ti-brand-bilibili:before{content:"\f6d2"}.ti-brand-binance:before{content:"\f5a0"}.ti-brand-bing:before{content:"\edc6"}.ti-brand-bitbucket:before{content:"\edc7"}.ti-brand-blackberry:before{content:"\f568"}.ti-brand-blender:before{content:"\f326"}.ti-brand-blogger:before{content:"\f35a"}.ti-brand-booking:before{content:"\edc8"}.ti-brand-bootstrap:before{content:"\ef3e"}.ti-brand-bulma:before{content:"\f327"}.ti-brand-bumble:before{content:"\f5fb"}.ti-brand-bunpo:before{content:"\f4cf"}.ti-brand-c-sharp:before{content:"\f003"}.ti-brand-cake:before{content:"\f7a3"}.ti-brand-cakephp:before{content:"\f7af"}.ti-brand-campaignmonitor:before{content:"\f328"}.ti-brand-carbon:before{content:"\f348"}.ti-brand-cashapp:before{content:"\f391"}.ti-brand-chrome:before{content:"\ec18"}.ti-brand-citymapper:before{content:"\f5fc"}.ti-brand-codecov:before{content:"\f329"}.ti-brand-codepen:before{content:"\ec6f"}.ti-brand-codesandbox:before{content:"\ed6a"}.ti-brand-cohost:before{content:"\f5d5"}.ti-brand-coinbase:before{content:"\f209"}.ti-brand-comedy-central:before{content:"\f217"}.ti-brand-coreos:before{content:"\f5fd"}.ti-brand-couchdb:before{content:"\f60f"}.ti-brand-couchsurfing:before{content:"\f392"}.ti-brand-cpp:before{content:"\f5fe"}.ti-brand-crunchbase:before{content:"\f7e3"}.ti-brand-css3:before{content:"\ed6b"}.ti-brand-ctemplar:before{content:"\f4d0"}.ti-brand-cucumber:before{content:"\ef6c"}.ti-brand-cupra:before{content:"\f4d1"}.ti-brand-cypress:before{content:"\f333"}.ti-brand-d3:before{content:"\f24e"}.ti-brand-days-counter:before{content:"\f4d2"}.ti-brand-dcos:before{content:"\f32a"}.ti-brand-debian:before{content:"\ef57"}.ti-brand-deezer:before{content:"\f78b"}.ti-brand-deliveroo:before{content:"\f4d3"}.ti-brand-deno:before{content:"\f24f"}.ti-brand-denodo:before{content:"\f610"}.ti-brand-deviantart:before{content:"\ecfb"}.ti-brand-dingtalk:before{content:"\f5ea"}.ti-brand-discord:before{content:"\ece3"}.ti-brand-discord-filled:before{content:"\f7e4"}.ti-brand-disney:before{content:"\f20a"}.ti-brand-disqus:before{content:"\edc9"}.ti-brand-django:before{content:"\f349"}.ti-brand-docker:before{content:"\edca"}.ti-brand-doctrine:before{content:"\ef6d"}.ti-brand-dolby-digital:before{content:"\f4d4"}.ti-brand-douban:before{content:"\f5ff"}.ti-brand-dribbble:before{content:"\ec19"}.ti-brand-dribbble-filled:before{content:"\f7e5"}.ti-brand-drops:before{content:"\f4d5"}.ti-brand-drupal:before{content:"\f393"}.ti-brand-edge:before{content:"\ecfc"}.ti-brand-elastic:before{content:"\f611"}.ti-brand-ember:before{content:"\f497"}.ti-brand-envato:before{content:"\f394"}.ti-brand-etsy:before{content:"\f654"}.ti-brand-evernote:before{content:"\f600"}.ti-brand-facebook:before{content:"\ec1a"}.ti-brand-facebook-filled:before{content:"\f7e6"}.ti-brand-figma:before{content:"\ec93"}.ti-brand-finder:before{content:"\f218"}.ti-brand-firebase:before{content:"\ef6e"}.ti-brand-firefox:before{content:"\ecfd"}.ti-brand-fiverr:before{content:"\f7a4"}.ti-brand-flickr:before{content:"\ecfe"}.ti-brand-flightradar24:before{content:"\f4d6"}.ti-brand-flipboard:before{content:"\f20b"}.ti-brand-flutter:before{content:"\f395"}.ti-brand-fortnite:before{content:"\f260"}.ti-brand-foursquare:before{content:"\ecff"}.ti-brand-framer:before{content:"\ec1b"}.ti-brand-framer-motion:before{content:"\f78c"}.ti-brand-funimation:before{content:"\f655"}.ti-brand-gatsby:before{content:"\f396"}.ti-brand-git:before{content:"\ef6f"}.ti-brand-github:before{content:"\ec1c"}.ti-brand-github-copilot:before{content:"\f4a8"}.ti-brand-github-filled:before{content:"\f7e7"}.ti-brand-gitlab:before{content:"\ec1d"}.ti-brand-gmail:before{content:"\efa2"}.ti-brand-golang:before{content:"\f78d"}.ti-brand-google:before{content:"\ec1f"}.ti-brand-google-analytics:before{content:"\edcb"}.ti-brand-google-big-query:before{content:"\f612"}.ti-brand-google-drive:before{content:"\ec1e"}.ti-brand-google-fit:before{content:"\f297"}.ti-brand-google-home:before{content:"\f601"}.ti-brand-google-one:before{content:"\f232"}.ti-brand-google-photos:before{content:"\f20c"}.ti-brand-google-play:before{content:"\ed25"}.ti-brand-google-podcasts:before{content:"\f656"}.ti-brand-grammarly:before{content:"\f32b"}.ti-brand-graphql:before{content:"\f32c"}.ti-brand-gravatar:before{content:"\edcc"}.ti-brand-grindr:before{content:"\f20d"}.ti-brand-guardian:before{content:"\f4fb"}.ti-brand-gumroad:before{content:"\f5d6"}.ti-brand-hbo:before{content:"\f657"}.ti-brand-headlessui:before{content:"\f32d"}.ti-brand-hipchat:before{content:"\edcd"}.ti-brand-html5:before{content:"\ed6c"}.ti-brand-inertia:before{content:"\f34a"}.ti-brand-instagram:before{content:"\ec20"}.ti-brand-intercom:before{content:"\f1cf"}.ti-brand-javascript:before{content:"\ef0c"}.ti-brand-juejin:before{content:"\f7b0"}.ti-brand-kickstarter:before{content:"\edce"}.ti-brand-kotlin:before{content:"\ed6d"}.ti-brand-laravel:before{content:"\f34b"}.ti-brand-lastfm:before{content:"\f001"}.ti-brand-line:before{content:"\f7e8"}.ti-brand-linkedin:before{content:"\ec8c"}.ti-brand-linktree:before{content:"\f1e7"}.ti-brand-linqpad:before{content:"\f562"}.ti-brand-loom:before{content:"\ef70"}.ti-brand-mailgun:before{content:"\f32e"}.ti-brand-mantine:before{content:"\f32f"}.ti-brand-mastercard:before{content:"\ef49"}.ti-brand-mastodon:before{content:"\f250"}.ti-brand-matrix:before{content:"\f5eb"}.ti-brand-mcdonalds:before{content:"\f251"}.ti-brand-medium:before{content:"\ec70"}.ti-brand-mercedes:before{content:"\f072"}.ti-brand-messenger:before{content:"\ec71"}.ti-brand-meta:before{content:"\efb0"}.ti-brand-miniprogram:before{content:"\f602"}.ti-brand-mixpanel:before{content:"\f397"}.ti-brand-monday:before{content:"\f219"}.ti-brand-mongodb:before{content:"\f613"}.ti-brand-my-oppo:before{content:"\f4d7"}.ti-brand-mysql:before{content:"\f614"}.ti-brand-national-geographic:before{content:"\f603"}.ti-brand-nem:before{content:"\f5a1"}.ti-brand-netbeans:before{content:"\ef71"}.ti-brand-netease-music:before{content:"\f604"}.ti-brand-netflix:before{content:"\edcf"}.ti-brand-nexo:before{content:"\f5a2"}.ti-brand-nextcloud:before{content:"\f4d8"}.ti-brand-nextjs:before{content:"\f0dd"}.ti-brand-nord-vpn:before{content:"\f37f"}.ti-brand-notion:before{content:"\ef7b"}.ti-brand-npm:before{content:"\f569"}.ti-brand-nuxt:before{content:"\f0de"}.ti-brand-nytimes:before{content:"\ef8d"}.ti-brand-office:before{content:"\f398"}.ti-brand-ok-ru:before{content:"\f399"}.ti-brand-onedrive:before{content:"\f5d7"}.ti-brand-onlyfans:before{content:"\f605"}.ti-brand-open-source:before{content:"\edd0"}.ti-brand-openai:before{content:"\f78e"}.ti-brand-openvpn:before{content:"\f39a"}.ti-brand-opera:before{content:"\ec21"}.ti-brand-pagekit:before{content:"\edd1"}.ti-brand-patreon:before{content:"\edd2"}.ti-brand-paypal:before{content:"\ec22"}.ti-brand-paypal-filled:before{content:"\f7e9"}.ti-brand-paypay:before{content:"\f5ec"}.ti-brand-peanut:before{content:"\f39b"}.ti-brand-pepsi:before{content:"\f261"}.ti-brand-php:before{content:"\ef72"}.ti-brand-picsart:before{content:"\f4d9"}.ti-brand-pinterest:before{content:"\ec8d"}.ti-brand-planetscale:before{content:"\f78f"}.ti-brand-pocket:before{content:"\ed00"}.ti-brand-polymer:before{content:"\f498"}.ti-brand-powershell:before{content:"\f5ed"}.ti-brand-prisma:before{content:"\f499"}.ti-brand-producthunt:before{content:"\edd3"}.ti-brand-pushbullet:before{content:"\f330"}.ti-brand-pushover:before{content:"\f20e"}.ti-brand-python:before{content:"\ed01"}.ti-brand-qq:before{content:"\f606"}.ti-brand-radix-ui:before{content:"\f790"}.ti-brand-react:before{content:"\f34c"}.ti-brand-react-native:before{content:"\ef73"}.ti-brand-reason:before{content:"\f49a"}.ti-brand-reddit:before{content:"\ec8e"}.ti-brand-redhat:before{content:"\f331"}.ti-brand-redux:before{content:"\f3a8"}.ti-brand-revolut:before{content:"\f4da"}.ti-brand-safari:before{content:"\ec23"}.ti-brand-samsungpass:before{content:"\f4db"}.ti-brand-sass:before{content:"\edd4"}.ti-brand-sentry:before{content:"\edd5"}.ti-brand-sharik:before{content:"\f4dc"}.ti-brand-shazam:before{content:"\edd6"}.ti-brand-shopee:before{content:"\f252"}.ti-brand-sketch:before{content:"\ec24"}.ti-brand-skype:before{content:"\ed02"}.ti-brand-slack:before{content:"\ec72"}.ti-brand-snapchat:before{content:"\ec25"}.ti-brand-snapseed:before{content:"\f253"}.ti-brand-snowflake:before{content:"\f615"}.ti-brand-socket-io:before{content:"\f49b"}.ti-brand-solidjs:before{content:"\f5ee"}.ti-brand-soundcloud:before{content:"\ed6e"}.ti-brand-spacehey:before{content:"\f4fc"}.ti-brand-spotify:before{content:"\ed03"}.ti-brand-stackoverflow:before{content:"\ef58"}.ti-brand-stackshare:before{content:"\f607"}.ti-brand-steam:before{content:"\ed6f"}.ti-brand-storybook:before{content:"\f332"}.ti-brand-storytel:before{content:"\f608"}.ti-brand-strava:before{content:"\f254"}.ti-brand-stripe:before{content:"\edd7"}.ti-brand-sublime-text:before{content:"\ef74"}.ti-brand-sugarizer:before{content:"\f7a5"}.ti-brand-supabase:before{content:"\f6d3"}.ti-brand-superhuman:before{content:"\f50c"}.ti-brand-supernova:before{content:"\f49c"}.ti-brand-surfshark:before{content:"\f255"}.ti-brand-svelte:before{content:"\f0df"}.ti-brand-symfony:before{content:"\f616"}.ti-brand-tabler:before{content:"\ec8f"}.ti-brand-tailwind:before{content:"\eca1"}.ti-brand-taobao:before{content:"\f5ef"}.ti-brand-ted:before{content:"\f658"}.ti-brand-telegram:before{content:"\ec26"}.ti-brand-tether:before{content:"\f5a3"}.ti-brand-threejs:before{content:"\f5f0"}.ti-brand-tidal:before{content:"\ed70"}.ti-brand-tikto-filled:before{content:"\f7ea"}.ti-brand-tiktok:before{content:"\ec73"}.ti-brand-tinder:before{content:"\ed71"}.ti-brand-topbuzz:before{content:"\f50d"}.ti-brand-torchain:before{content:"\f5a4"}.ti-brand-toyota:before{content:"\f262"}.ti-brand-trello:before{content:"\f39d"}.ti-brand-tripadvisor:before{content:"\f002"}.ti-brand-tumblr:before{content:"\ed04"}.ti-brand-twilio:before{content:"\f617"}.ti-brand-twitch:before{content:"\ed05"}.ti-brand-twitter:before{content:"\ec27"}.ti-brand-twitter-filled:before{content:"\f7eb"}.ti-brand-typescript:before{content:"\f5f1"}.ti-brand-uber:before{content:"\ef75"}.ti-brand-ubuntu:before{content:"\ef59"}.ti-brand-unity:before{content:"\f49d"}.ti-brand-unsplash:before{content:"\edd8"}.ti-brand-upwork:before{content:"\f39e"}.ti-brand-valorant:before{content:"\f39f"}.ti-brand-vercel:before{content:"\ef24"}.ti-brand-vimeo:before{content:"\ed06"}.ti-brand-vinted:before{content:"\f20f"}.ti-brand-visa:before{content:"\f380"}.ti-brand-visual-studio:before{content:"\ef76"}.ti-brand-vite:before{content:"\f5f2"}.ti-brand-vivaldi:before{content:"\f210"}.ti-brand-vk:before{content:"\ed72"}.ti-brand-volkswagen:before{content:"\f50e"}.ti-brand-vsco:before{content:"\f334"}.ti-brand-vscode:before{content:"\f3a0"}.ti-brand-vue:before{content:"\f0e0"}.ti-brand-walmart:before{content:"\f211"}.ti-brand-waze:before{content:"\f5d8"}.ti-brand-webflow:before{content:"\f2d2"}.ti-brand-wechat:before{content:"\f5f3"}.ti-brand-weibo:before{content:"\f609"}.ti-brand-whatsapp:before{content:"\ec74"}.ti-brand-windows:before{content:"\ecd8"}.ti-brand-windy:before{content:"\f4dd"}.ti-brand-wish:before{content:"\f212"}.ti-brand-wix:before{content:"\f3a1"}.ti-brand-wordpress:before{content:"\f2d3"}.ti-brand-xbox:before{content:"\f298"}.ti-brand-xing:before{content:"\f21a"}.ti-brand-yahoo:before{content:"\ed73"}.ti-brand-yatse:before{content:"\f213"}.ti-brand-ycombinator:before{content:"\edd9"}.ti-brand-youtube:before{content:"\ec90"}.ti-brand-youtube-kids:before{content:"\f214"}.ti-brand-zalando:before{content:"\f49e"}.ti-brand-zapier:before{content:"\f49f"}.ti-brand-zeit:before{content:"\f335"}.ti-brand-zhihu:before{content:"\f60a"}.ti-brand-zoom:before{content:"\f215"}.ti-brand-zulip:before{content:"\f4de"}.ti-brand-zwift:before{content:"\f216"}.ti-bread:before{content:"\efa3"}.ti-bread-off:before{content:"\f3cb"}.ti-briefcase:before{content:"\ea46"}.ti-briefcase-off:before{content:"\f3cc"}.ti-brightness:before{content:"\eb7f"}.ti-brightness-2:before{content:"\ee19"}.ti-brightness-down:before{content:"\eb7d"}.ti-brightness-half:before{content:"\ee1a"}.ti-brightness-off:before{content:"\f3cd"}.ti-brightness-up:before{content:"\eb7e"}.ti-broadcast:before{content:"\f1e9"}.ti-broadcast-off:before{content:"\f1e8"}.ti-browser:before{content:"\ebb7"}.ti-browser-check:before{content:"\efd6"}.ti-browser-off:before{content:"\f0c1"}.ti-browser-plus:before{content:"\efd7"}.ti-browser-x:before{content:"\efd8"}.ti-brush:before{content:"\ebb8"}.ti-brush-off:before{content:"\f0c2"}.ti-bucket:before{content:"\ea47"}.ti-bucket-droplet:before{content:"\f56a"}.ti-bucket-off:before{content:"\f103"}.ti-bug:before{content:"\ea48"}.ti-bug-off:before{content:"\f0c3"}.ti-building:before{content:"\ea4f"}.ti-building-arch:before{content:"\ea49"}.ti-building-bank:before{content:"\ebe2"}.ti-building-bridge:before{content:"\ea4b"}.ti-building-bridge-2:before{content:"\ea4a"}.ti-building-broadcast-tower:before{content:"\f4be"}.ti-building-carousel:before{content:"\ed87"}.ti-building-castle:before{content:"\ed88"}.ti-building-church:before{content:"\ea4c"}.ti-building-circus:before{content:"\f4bf"}.ti-building-community:before{content:"\ebf6"}.ti-building-cottage:before{content:"\ee1b"}.ti-building-estate:before{content:"\f5a5"}.ti-building-factory:before{content:"\ee1c"}.ti-building-factory-2:before{content:"\f082"}.ti-building-fortress:before{content:"\ed89"}.ti-building-hospital:before{content:"\ea4d"}.ti-building-lighthouse:before{content:"\ed8a"}.ti-building-monument:before{content:"\ed26"}.ti-building-pavilion:before{content:"\ebf7"}.ti-building-skyscraper:before{content:"\ec39"}.ti-building-stadium:before{content:"\f641"}.ti-building-store:before{content:"\ea4e"}.ti-building-tunnel:before{content:"\f5a6"}.ti-building-warehouse:before{content:"\ebe3"}.ti-building-wind-turbine:before{content:"\f4c0"}.ti-bulb:before{content:"\ea51"}.ti-bulb-filled:before{content:"\f66a"}.ti-bulb-off:before{content:"\ea50"}.ti-bulldozer:before{content:"\ee1d"}.ti-bus:before{content:"\ebe4"}.ti-bus-off:before{content:"\f3ce"}.ti-bus-stop:before{content:"\f2d4"}.ti-businessplan:before{content:"\ee1e"}.ti-butterfly:before{content:"\efd9"}.ti-cactus:before{content:"\f21b"}.ti-cactus-off:before{content:"\f3cf"}.ti-cake:before{content:"\f00f"}.ti-cake-off:before{content:"\f104"}.ti-calculator:before{content:"\eb80"}.ti-calculator-off:before{content:"\f0c4"}.ti-calendar:before{content:"\ea53"}.ti-calendar-bolt:before{content:"\f822"}.ti-calendar-cancel:before{content:"\f823"}.ti-calendar-check:before{content:"\f824"}.ti-calendar-code:before{content:"\f825"}.ti-calendar-cog:before{content:"\f826"}.ti-calendar-dollar:before{content:"\f827"}.ti-calendar-down:before{content:"\f828"}.ti-calendar-due:before{content:"\f621"}.ti-calendar-event:before{content:"\ea52"}.ti-calendar-exclamation:before{content:"\f829"}.ti-calendar-heart:before{content:"\f82a"}.ti-calendar-minus:before{content:"\ebb9"}.ti-calendar-off:before{content:"\ee1f"}.ti-calendar-pause:before{content:"\f82b"}.ti-calendar-pin:before{content:"\f82c"}.ti-calendar-plus:before{content:"\ebba"}.ti-calendar-question:before{content:"\f82d"}.ti-calendar-search:before{content:"\f82e"}.ti-calendar-share:before{content:"\f82f"}.ti-calendar-star:before{content:"\f830"}.ti-calendar-stats:before{content:"\ee20"}.ti-calendar-time:before{content:"\ee21"}.ti-calendar-up:before{content:"\f831"}.ti-calendar-x:before{content:"\f832"}.ti-camera:before{content:"\ea54"}.ti-camera-bolt:before{content:"\f833"}.ti-camera-cancel:before{content:"\f834"}.ti-camera-check:before{content:"\f835"}.ti-camera-code:before{content:"\f836"}.ti-camera-cog:before{content:"\f837"}.ti-camera-dollar:before{content:"\f838"}.ti-camera-down:before{content:"\f839"}.ti-camera-exclamation:before{content:"\f83a"}.ti-camera-heart:before{content:"\f83b"}.ti-camera-minus:before{content:"\ec3a"}.ti-camera-off:before{content:"\ecee"}.ti-camera-pause:before{content:"\f83c"}.ti-camera-pin:before{content:"\f83d"}.ti-camera-plus:before{content:"\ec3b"}.ti-camera-question:before{content:"\f83e"}.ti-camera-rotate:before{content:"\ee22"}.ti-camera-search:before{content:"\f83f"}.ti-camera-selfie:before{content:"\ee23"}.ti-camera-share:before{content:"\f840"}.ti-camera-star:before{content:"\f841"}.ti-camera-up:before{content:"\f842"}.ti-camera-x:before{content:"\f843"}.ti-campfire:before{content:"\f5a7"}.ti-candle:before{content:"\efc6"}.ti-candy:before{content:"\ef0d"}.ti-candy-off:before{content:"\f0c5"}.ti-cane:before{content:"\f50f"}.ti-cannabis:before{content:"\f4c1"}.ti-capture:before{content:"\ec3c"}.ti-capture-off:before{content:"\f0c6"}.ti-car:before{content:"\ebbb"}.ti-car-crane:before{content:"\ef25"}.ti-car-crash:before{content:"\efa4"}.ti-car-off:before{content:"\f0c7"}.ti-car-turbine:before{content:"\f4fd"}.ti-caravan:before{content:"\ec7c"}.ti-cardboards:before{content:"\ed74"}.ti-cardboards-off:before{content:"\f0c8"}.ti-cards:before{content:"\f510"}.ti-caret-down:before{content:"\eb5d"}.ti-caret-left:before{content:"\eb5e"}.ti-caret-right:before{content:"\eb5f"}.ti-caret-up:before{content:"\eb60"}.ti-carousel-horizontal:before{content:"\f659"}.ti-carousel-vertical:before{content:"\f65a"}.ti-carrot:before{content:"\f21c"}.ti-carrot-off:before{content:"\f3d0"}.ti-cash:before{content:"\ea55"}.ti-cash-banknote:before{content:"\ee25"}.ti-cash-banknote-off:before{content:"\ee24"}.ti-cash-off:before{content:"\f105"}.ti-cast:before{content:"\ea56"}.ti-cast-off:before{content:"\f0c9"}.ti-cat:before{content:"\f65b"}.ti-category:before{content:"\f1f6"}.ti-category-2:before{content:"\f1f5"}.ti-ce:before{content:"\ed75"}.ti-ce-off:before{content:"\f0ca"}.ti-cell:before{content:"\f05f"}.ti-cell-signal-1:before{content:"\f083"}.ti-cell-signal-2:before{content:"\f084"}.ti-cell-signal-3:before{content:"\f085"}.ti-cell-signal-4:before{content:"\f086"}.ti-cell-signal-5:before{content:"\f087"}.ti-cell-signal-off:before{content:"\f088"}.ti-certificate:before{content:"\ed76"}.ti-certificate-2:before{content:"\f073"}.ti-certificate-2-off:before{content:"\f0cb"}.ti-certificate-off:before{content:"\f0cc"}.ti-chair-director:before{content:"\f2d5"}.ti-chalkboard:before{content:"\f34d"}.ti-chalkboard-off:before{content:"\f3d1"}.ti-charging-pile:before{content:"\ee26"}.ti-chart-arcs:before{content:"\ee28"}.ti-chart-arcs-3:before{content:"\ee27"}.ti-chart-area:before{content:"\ea58"}.ti-chart-area-filled:before{content:"\f66b"}.ti-chart-area-line:before{content:"\ea57"}.ti-chart-area-line-filled:before{content:"\f66c"}.ti-chart-arrows:before{content:"\ee2a"}.ti-chart-arrows-vertical:before{content:"\ee29"}.ti-chart-bar:before{content:"\ea59"}.ti-chart-bar-off:before{content:"\f3d2"}.ti-chart-bubble:before{content:"\ec75"}.ti-chart-bubble-filled:before{content:"\f66d"}.ti-chart-candle:before{content:"\ea5a"}.ti-chart-candle-filled:before{content:"\f66e"}.ti-chart-circles:before{content:"\ee2b"}.ti-chart-donut:before{content:"\ea5b"}.ti-chart-donut-2:before{content:"\ee2c"}.ti-chart-donut-3:before{content:"\ee2d"}.ti-chart-donut-4:before{content:"\ee2e"}.ti-chart-donut-filled:before{content:"\f66f"}.ti-chart-dots:before{content:"\ee2f"}.ti-chart-dots-2:before{content:"\f097"}.ti-chart-dots-3:before{content:"\f098"}.ti-chart-grid-dots:before{content:"\f4c2"}.ti-chart-histogram:before{content:"\f65c"}.ti-chart-infographic:before{content:"\ee30"}.ti-chart-line:before{content:"\ea5c"}.ti-chart-pie:before{content:"\ea5d"}.ti-chart-pie-2:before{content:"\ee31"}.ti-chart-pie-3:before{content:"\ee32"}.ti-chart-pie-4:before{content:"\ee33"}.ti-chart-pie-filled:before{content:"\f670"}.ti-chart-pie-off:before{content:"\f3d3"}.ti-chart-ppf:before{content:"\f618"}.ti-chart-radar:before{content:"\ed77"}.ti-chart-sankey:before{content:"\f619"}.ti-chart-treemap:before{content:"\f381"}.ti-check:before{content:"\ea5e"}.ti-checkbox:before{content:"\eba6"}.ti-checklist:before{content:"\f074"}.ti-checks:before{content:"\ebaa"}.ti-checkup-list:before{content:"\ef5a"}.ti-cheese:before{content:"\ef26"}.ti-chef-hat:before{content:"\f21d"}.ti-chef-hat-off:before{content:"\f3d4"}.ti-cherry:before{content:"\f511"}.ti-cherry-filled:before{content:"\f728"}.ti-chess:before{content:"\f382"}.ti-chess-bishop:before{content:"\f56b"}.ti-chess-bishop-filled:before{content:"\f729"}.ti-chess-filled:before{content:"\f72a"}.ti-chess-king:before{content:"\f56c"}.ti-chess-king-filled:before{content:"\f72b"}.ti-chess-knight:before{content:"\f56d"}.ti-chess-knight-filled:before{content:"\f72c"}.ti-chess-queen:before{content:"\f56e"}.ti-chess-queen-filled:before{content:"\f72d"}.ti-chess-rook:before{content:"\f56f"}.ti-chess-rook-filled:before{content:"\f72e"}.ti-chevron-down:before{content:"\ea5f"}.ti-chevron-down-left:before{content:"\ed09"}.ti-chevron-down-right:before{content:"\ed0a"}.ti-chevron-left:before{content:"\ea60"}.ti-chevron-right:before{content:"\ea61"}.ti-chevron-up:before{content:"\ea62"}.ti-chevron-up-left:before{content:"\ed0b"}.ti-chevron-up-right:before{content:"\ed0c"}.ti-chevrons-down:before{content:"\ea63"}.ti-chevrons-down-left:before{content:"\ed0d"}.ti-chevrons-down-right:before{content:"\ed0e"}.ti-chevrons-left:before{content:"\ea64"}.ti-chevrons-right:before{content:"\ea65"}.ti-chevrons-up:before{content:"\ea66"}.ti-chevrons-up-left:before{content:"\ed0f"}.ti-chevrons-up-right:before{content:"\ed10"}.ti-chisel:before{content:"\f383"}.ti-christmas-tree:before{content:"\ed78"}.ti-christmas-tree-off:before{content:"\f3d5"}.ti-circle:before{content:"\ea6b"}.ti-circle-0-filled:before{content:"\f72f"}.ti-circle-1-filled:before{content:"\f730"}.ti-circle-2-filled:before{content:"\f731"}.ti-circle-3-filled:before{content:"\f732"}.ti-circle-4-filled:before{content:"\f733"}.ti-circle-5-filled:before{content:"\f734"}.ti-circle-6-filled:before{content:"\f735"}.ti-circle-7-filled:before{content:"\f736"}.ti-circle-8-filled:before{content:"\f737"}.ti-circle-9-filled:before{content:"\f738"}.ti-circle-arrow-down:before{content:"\f6f9"}.ti-circle-arrow-down-filled:before{content:"\f6f4"}.ti-circle-arrow-down-left:before{content:"\f6f6"}.ti-circle-arrow-down-left-filled:before{content:"\f6f5"}.ti-circle-arrow-down-right:before{content:"\f6f8"}.ti-circle-arrow-down-right-filled:before{content:"\f6f7"}.ti-circle-arrow-left:before{content:"\f6fb"}.ti-circle-arrow-left-filled:before{content:"\f6fa"}.ti-circle-arrow-right:before{content:"\f6fd"}.ti-circle-arrow-right-filled:before{content:"\f6fc"}.ti-circle-arrow-up:before{content:"\f703"}.ti-circle-arrow-up-filled:before{content:"\f6fe"}.ti-circle-arrow-up-left:before{content:"\f700"}.ti-circle-arrow-up-left-filled:before{content:"\f6ff"}.ti-circle-arrow-up-right:before{content:"\f702"}.ti-circle-arrow-up-right-filled:before{content:"\f701"}.ti-circle-caret-down:before{content:"\f4a9"}.ti-circle-caret-left:before{content:"\f4aa"}.ti-circle-caret-right:before{content:"\f4ab"}.ti-circle-caret-up:before{content:"\f4ac"}.ti-circle-check:before{content:"\ea67"}.ti-circle-check-filled:before{content:"\f704"}.ti-circle-chevron-down:before{content:"\f622"}.ti-circle-chevron-left:before{content:"\f623"}.ti-circle-chevron-right:before{content:"\f624"}.ti-circle-chevron-up:before{content:"\f625"}.ti-circle-chevrons-down:before{content:"\f642"}.ti-circle-chevrons-left:before{content:"\f643"}.ti-circle-chevrons-right:before{content:"\f644"}.ti-circle-chevrons-up:before{content:"\f645"}.ti-circle-dashed:before{content:"\ed27"}.ti-circle-dot:before{content:"\efb1"}.ti-circle-dot-filled:before{content:"\f705"}.ti-circle-dotted:before{content:"\ed28"}.ti-circle-filled:before{content:"\f671"}.ti-circle-half:before{content:"\ee3f"}.ti-circle-half-2:before{content:"\eff3"}.ti-circle-half-vertical:before{content:"\ee3e"}.ti-circle-key:before{content:"\f633"}.ti-circle-key-filled:before{content:"\f706"}.ti-circle-letter-a:before{content:"\f441"}.ti-circle-letter-b:before{content:"\f442"}.ti-circle-letter-c:before{content:"\f443"}.ti-circle-letter-d:before{content:"\f444"}.ti-circle-letter-e:before{content:"\f445"}.ti-circle-letter-f:before{content:"\f446"}.ti-circle-letter-g:before{content:"\f447"}.ti-circle-letter-h:before{content:"\f448"}.ti-circle-letter-i:before{content:"\f449"}.ti-circle-letter-j:before{content:"\f44a"}.ti-circle-letter-k:before{content:"\f44b"}.ti-circle-letter-l:before{content:"\f44c"}.ti-circle-letter-m:before{content:"\f44d"}.ti-circle-letter-n:before{content:"\f44e"}.ti-circle-letter-o:before{content:"\f44f"}.ti-circle-letter-p:before{content:"\f450"}.ti-circle-letter-q:before{content:"\f451"}.ti-circle-letter-r:before{content:"\f452"}.ti-circle-letter-s:before{content:"\f453"}.ti-circle-letter-t:before{content:"\f454"}.ti-circle-letter-u:before{content:"\f455"}.ti-circle-letter-v:before{content:"\f4ad"}.ti-circle-letter-w:before{content:"\f456"}.ti-circle-letter-x:before{content:"\f4ae"}.ti-circle-letter-y:before{content:"\f457"}.ti-circle-letter-z:before{content:"\f458"}.ti-circle-minus:before{content:"\ea68"}.ti-circle-number-0:before{content:"\ee34"}.ti-circle-number-1:before{content:"\ee35"}.ti-circle-number-2:before{content:"\ee36"}.ti-circle-number-3:before{content:"\ee37"}.ti-circle-number-4:before{content:"\ee38"}.ti-circle-number-5:before{content:"\ee39"}.ti-circle-number-6:before{content:"\ee3a"}.ti-circle-number-7:before{content:"\ee3b"}.ti-circle-number-8:before{content:"\ee3c"}.ti-circle-number-9:before{content:"\ee3d"}.ti-circle-off:before{content:"\ee40"}.ti-circle-plus:before{content:"\ea69"}.ti-circle-rectangle:before{content:"\f010"}.ti-circle-rectangle-off:before{content:"\f0cd"}.ti-circle-square:before{content:"\ece4"}.ti-circle-triangle:before{content:"\f011"}.ti-circle-x:before{content:"\ea6a"}.ti-circle-x-filled:before{content:"\f739"}.ti-circles:before{content:"\ece5"}.ti-circles-filled:before{content:"\f672"}.ti-circles-relation:before{content:"\f4c3"}.ti-circuit-ammeter:before{content:"\f271"}.ti-circuit-battery:before{content:"\f272"}.ti-circuit-bulb:before{content:"\f273"}.ti-circuit-capacitor:before{content:"\f275"}.ti-circuit-capacitor-polarized:before{content:"\f274"}.ti-circuit-cell:before{content:"\f277"}.ti-circuit-cell-plus:before{content:"\f276"}.ti-circuit-changeover:before{content:"\f278"}.ti-circuit-diode:before{content:"\f27a"}.ti-circuit-diode-zener:before{content:"\f279"}.ti-circuit-ground:before{content:"\f27c"}.ti-circuit-ground-digital:before{content:"\f27b"}.ti-circuit-inductor:before{content:"\f27d"}.ti-circuit-motor:before{content:"\f27e"}.ti-circuit-pushbutton:before{content:"\f27f"}.ti-circuit-resistor:before{content:"\f280"}.ti-circuit-switch-closed:before{content:"\f281"}.ti-circuit-switch-open:before{content:"\f282"}.ti-circuit-voltmeter:before{content:"\f283"}.ti-clear-all:before{content:"\ee41"}.ti-clear-formatting:before{content:"\ebe5"}.ti-click:before{content:"\ebbc"}.ti-clipboard:before{content:"\ea6f"}.ti-clipboard-check:before{content:"\ea6c"}.ti-clipboard-copy:before{content:"\f299"}.ti-clipboard-data:before{content:"\f563"}.ti-clipboard-heart:before{content:"\f34e"}.ti-clipboard-list:before{content:"\ea6d"}.ti-clipboard-off:before{content:"\f0ce"}.ti-clipboard-plus:before{content:"\efb2"}.ti-clipboard-text:before{content:"\f089"}.ti-clipboard-typography:before{content:"\f34f"}.ti-clipboard-x:before{content:"\ea6e"}.ti-clock:before{content:"\ea70"}.ti-clock-2:before{content:"\f099"}.ti-clock-bolt:before{content:"\f844"}.ti-clock-cancel:before{content:"\f546"}.ti-clock-check:before{content:"\f7c1"}.ti-clock-code:before{content:"\f845"}.ti-clock-cog:before{content:"\f7c2"}.ti-clock-dollar:before{content:"\f846"}.ti-clock-down:before{content:"\f7c3"}.ti-clock-edit:before{content:"\f547"}.ti-clock-exclamation:before{content:"\f847"}.ti-clock-filled:before{content:"\f73a"}.ti-clock-heart:before{content:"\f7c4"}.ti-clock-hour-1:before{content:"\f313"}.ti-clock-hour-10:before{content:"\f314"}.ti-clock-hour-11:before{content:"\f315"}.ti-clock-hour-12:before{content:"\f316"}.ti-clock-hour-2:before{content:"\f317"}.ti-clock-hour-3:before{content:"\f318"}.ti-clock-hour-4:before{content:"\f319"}.ti-clock-hour-5:before{content:"\f31a"}.ti-clock-hour-6:before{content:"\f31b"}.ti-clock-hour-7:before{content:"\f31c"}.ti-clock-hour-8:before{content:"\f31d"}.ti-clock-hour-9:before{content:"\f31e"}.ti-clock-minus:before{content:"\f848"}.ti-clock-off:before{content:"\f0cf"}.ti-clock-pause:before{content:"\f548"}.ti-clock-pin:before{content:"\f849"}.ti-clock-play:before{content:"\f549"}.ti-clock-plus:before{content:"\f7c5"}.ti-clock-question:before{content:"\f7c6"}.ti-clock-record:before{content:"\f54a"}.ti-clock-search:before{content:"\f7c7"}.ti-clock-share:before{content:"\f84a"}.ti-clock-shield:before{content:"\f7c8"}.ti-clock-star:before{content:"\f7c9"}.ti-clock-stop:before{content:"\f54b"}.ti-clock-up:before{content:"\f7ca"}.ti-clock-x:before{content:"\f7cb"}.ti-clothes-rack:before{content:"\f285"}.ti-clothes-rack-off:before{content:"\f3d6"}.ti-cloud:before{content:"\ea76"}.ti-cloud-bolt:before{content:"\f84b"}.ti-cloud-cancel:before{content:"\f84c"}.ti-cloud-check:before{content:"\f84d"}.ti-cloud-code:before{content:"\f84e"}.ti-cloud-cog:before{content:"\f84f"}.ti-cloud-computing:before{content:"\f1d0"}.ti-cloud-data-connection:before{content:"\f1d1"}.ti-cloud-dollar:before{content:"\f850"}.ti-cloud-down:before{content:"\f851"}.ti-cloud-download:before{content:"\ea71"}.ti-cloud-exclamation:before{content:"\f852"}.ti-cloud-filled:before{content:"\f673"}.ti-cloud-fog:before{content:"\ecd9"}.ti-cloud-heart:before{content:"\f853"}.ti-cloud-lock:before{content:"\efdb"}.ti-cloud-lock-open:before{content:"\efda"}.ti-cloud-minus:before{content:"\f854"}.ti-cloud-off:before{content:"\ed3e"}.ti-cloud-pause:before{content:"\f855"}.ti-cloud-pin:before{content:"\f856"}.ti-cloud-plus:before{content:"\f857"}.ti-cloud-question:before{content:"\f858"}.ti-cloud-rain:before{content:"\ea72"}.ti-cloud-search:before{content:"\f859"}.ti-cloud-share:before{content:"\f85a"}.ti-cloud-snow:before{content:"\ea73"}.ti-cloud-star:before{content:"\f85b"}.ti-cloud-storm:before{content:"\ea74"}.ti-cloud-up:before{content:"\f85c"}.ti-cloud-upload:before{content:"\ea75"}.ti-cloud-x:before{content:"\f85d"}.ti-clover:before{content:"\f1ea"}.ti-clover-2:before{content:"\f21e"}.ti-clubs:before{content:"\eff4"}.ti-clubs-filled:before{content:"\f674"}.ti-code:before{content:"\ea77"}.ti-code-asterix:before{content:"\f312"}.ti-code-circle:before{content:"\f4ff"}.ti-code-circle-2:before{content:"\f4fe"}.ti-code-dots:before{content:"\f61a"}.ti-code-minus:before{content:"\ee42"}.ti-code-off:before{content:"\f0d0"}.ti-code-plus:before{content:"\ee43"}.ti-coffee:before{content:"\ef0e"}.ti-coffee-off:before{content:"\f106"}.ti-coffin:before{content:"\f579"}.ti-coin:before{content:"\eb82"}.ti-coin-bitcoin:before{content:"\f2be"}.ti-coin-euro:before{content:"\f2bf"}.ti-coin-monero:before{content:"\f4a0"}.ti-coin-off:before{content:"\f0d1"}.ti-coin-pound:before{content:"\f2c0"}.ti-coin-rupee:before{content:"\f2c1"}.ti-coin-yen:before{content:"\f2c2"}.ti-coin-yuan:before{content:"\f2c3"}.ti-coins:before{content:"\f65d"}.ti-color-filter:before{content:"\f5a8"}.ti-color-picker:before{content:"\ebe6"}.ti-color-picker-off:before{content:"\f0d2"}.ti-color-swatch:before{content:"\eb61"}.ti-color-swatch-off:before{content:"\f0d3"}.ti-column-insert-left:before{content:"\ee44"}.ti-column-insert-right:before{content:"\ee45"}.ti-columns:before{content:"\eb83"}.ti-columns-1:before{content:"\f6d4"}.ti-columns-2:before{content:"\f6d5"}.ti-columns-3:before{content:"\f6d6"}.ti-columns-off:before{content:"\f0d4"}.ti-comet:before{content:"\ec76"}.ti-command:before{content:"\ea78"}.ti-command-off:before{content:"\f3d7"}.ti-compass:before{content:"\ea79"}.ti-compass-off:before{content:"\f0d5"}.ti-components:before{content:"\efa5"}.ti-components-off:before{content:"\f0d6"}.ti-cone:before{content:"\efdd"}.ti-cone-2:before{content:"\efdc"}.ti-cone-off:before{content:"\f3d8"}.ti-confetti:before{content:"\ee46"}.ti-confetti-off:before{content:"\f3d9"}.ti-confucius:before{content:"\f58a"}.ti-container:before{content:"\ee47"}.ti-container-off:before{content:"\f107"}.ti-contrast:before{content:"\ec4e"}.ti-contrast-2:before{content:"\efc7"}.ti-contrast-2-off:before{content:"\f3da"}.ti-contrast-off:before{content:"\f3db"}.ti-cooker:before{content:"\f57a"}.ti-cookie:before{content:"\ef0f"}.ti-cookie-man:before{content:"\f4c4"}.ti-cookie-off:before{content:"\f0d7"}.ti-copy:before{content:"\ea7a"}.ti-copy-off:before{content:"\f0d8"}.ti-copyleft:before{content:"\ec3d"}.ti-copyleft-filled:before{content:"\f73b"}.ti-copyleft-off:before{content:"\f0d9"}.ti-copyright:before{content:"\ea7b"}.ti-copyright-filled:before{content:"\f73c"}.ti-copyright-off:before{content:"\f0da"}.ti-corner-down-left:before{content:"\ea7c"}.ti-corner-down-left-double:before{content:"\ee48"}.ti-corner-down-right:before{content:"\ea7d"}.ti-corner-down-right-double:before{content:"\ee49"}.ti-corner-left-down:before{content:"\ea7e"}.ti-corner-left-down-double:before{content:"\ee4a"}.ti-corner-left-up:before{content:"\ea7f"}.ti-corner-left-up-double:before{content:"\ee4b"}.ti-corner-right-down:before{content:"\ea80"}.ti-corner-right-down-double:before{content:"\ee4c"}.ti-corner-right-up:before{content:"\ea81"}.ti-corner-right-up-double:before{content:"\ee4d"}.ti-corner-up-left:before{content:"\ea82"}.ti-corner-up-left-double:before{content:"\ee4e"}.ti-corner-up-right:before{content:"\ea83"}.ti-corner-up-right-double:before{content:"\ee4f"}.ti-cpu:before{content:"\ef8e"}.ti-cpu-2:before{content:"\f075"}.ti-cpu-off:before{content:"\f108"}.ti-crane:before{content:"\ef27"}.ti-crane-off:before{content:"\f109"}.ti-creative-commons:before{content:"\efb3"}.ti-creative-commons-by:before{content:"\f21f"}.ti-creative-commons-nc:before{content:"\f220"}.ti-creative-commons-nd:before{content:"\f221"}.ti-creative-commons-off:before{content:"\f10a"}.ti-creative-commons-sa:before{content:"\f222"}.ti-creative-commons-zero:before{content:"\f223"}.ti-credit-card:before{content:"\ea84"}.ti-credit-card-off:before{content:"\ed11"}.ti-cricket:before{content:"\f09a"}.ti-crop:before{content:"\ea85"}.ti-cross:before{content:"\ef8f"}.ti-cross-filled:before{content:"\f675"}.ti-cross-off:before{content:"\f10b"}.ti-crosshair:before{content:"\ec3e"}.ti-crown:before{content:"\ed12"}.ti-crown-off:before{content:"\ee50"}.ti-crutches:before{content:"\ef5b"}.ti-crutches-off:before{content:"\f10c"}.ti-crystal-ball:before{content:"\f57b"}.ti-csv:before{content:"\f791"}.ti-cube-send:before{content:"\f61b"}.ti-cube-unfolded:before{content:"\f61c"}.ti-cup:before{content:"\ef28"}.ti-cup-off:before{content:"\f10d"}.ti-curling:before{content:"\efc8"}.ti-curly-loop:before{content:"\ecda"}.ti-currency:before{content:"\efa6"}.ti-currency-afghani:before{content:"\f65e"}.ti-currency-bahraini:before{content:"\ee51"}.ti-currency-baht:before{content:"\f08a"}.ti-currency-bitcoin:before{content:"\ebab"}.ti-currency-cent:before{content:"\ee53"}.ti-currency-dinar:before{content:"\ee54"}.ti-currency-dirham:before{content:"\ee55"}.ti-currency-dogecoin:before{content:"\ef4b"}.ti-currency-dollar:before{content:"\eb84"}.ti-currency-dollar-australian:before{content:"\ee56"}.ti-currency-dollar-brunei:before{content:"\f36c"}.ti-currency-dollar-canadian:before{content:"\ee57"}.ti-currency-dollar-guyanese:before{content:"\f36d"}.ti-currency-dollar-off:before{content:"\f3dc"}.ti-currency-dollar-singapore:before{content:"\ee58"}.ti-currency-dollar-zimbabwean:before{content:"\f36e"}.ti-currency-dong:before{content:"\f36f"}.ti-currency-dram:before{content:"\f370"}.ti-currency-ethereum:before{content:"\ee59"}.ti-currency-euro:before{content:"\eb85"}.ti-currency-euro-off:before{content:"\f3dd"}.ti-currency-forint:before{content:"\ee5a"}.ti-currency-frank:before{content:"\ee5b"}.ti-currency-guarani:before{content:"\f371"}.ti-currency-hryvnia:before{content:"\f372"}.ti-currency-kip:before{content:"\f373"}.ti-currency-krone-czech:before{content:"\ee5c"}.ti-currency-krone-danish:before{content:"\ee5d"}.ti-currency-krone-swedish:before{content:"\ee5e"}.ti-currency-lari:before{content:"\f374"}.ti-currency-leu:before{content:"\ee5f"}.ti-currency-lira:before{content:"\ee60"}.ti-currency-litecoin:before{content:"\ee61"}.ti-currency-lyd:before{content:"\f375"}.ti-currency-manat:before{content:"\f376"}.ti-currency-monero:before{content:"\f377"}.ti-currency-naira:before{content:"\ee62"}.ti-currency-nano:before{content:"\f7a6"}.ti-currency-off:before{content:"\f3de"}.ti-currency-paanga:before{content:"\f378"}.ti-currency-peso:before{content:"\f65f"}.ti-currency-pound:before{content:"\ebac"}.ti-currency-pound-off:before{content:"\f3df"}.ti-currency-quetzal:before{content:"\f379"}.ti-currency-real:before{content:"\ee63"}.ti-currency-renminbi:before{content:"\ee64"}.ti-currency-ripple:before{content:"\ee65"}.ti-currency-riyal:before{content:"\ee66"}.ti-currency-rubel:before{content:"\ee67"}.ti-currency-rufiyaa:before{content:"\f37a"}.ti-currency-rupee:before{content:"\ebad"}.ti-currency-rupee-nepalese:before{content:"\f37b"}.ti-currency-shekel:before{content:"\ee68"}.ti-currency-solana:before{content:"\f4a1"}.ti-currency-som:before{content:"\f37c"}.ti-currency-taka:before{content:"\ee69"}.ti-currency-tenge:before{content:"\f37d"}.ti-currency-tugrik:before{content:"\ee6a"}.ti-currency-won:before{content:"\ee6b"}.ti-currency-yen:before{content:"\ebae"}.ti-currency-yen-off:before{content:"\f3e0"}.ti-currency-yuan:before{content:"\f29a"}.ti-currency-zloty:before{content:"\ee6c"}.ti-current-location:before{content:"\ecef"}.ti-current-location-off:before{content:"\f10e"}.ti-cursor-off:before{content:"\f10f"}.ti-cursor-text:before{content:"\ee6d"}.ti-cut:before{content:"\ea86"}.ti-cylinder:before{content:"\f54c"}.ti-dashboard:before{content:"\ea87"}.ti-dashboard-off:before{content:"\f3e1"}.ti-database:before{content:"\ea88"}.ti-database-export:before{content:"\ee6e"}.ti-database-import:before{content:"\ee6f"}.ti-database-off:before{content:"\ee70"}.ti-deer:before{content:"\f4c5"}.ti-delta:before{content:"\f53c"}.ti-dental:before{content:"\f025"}.ti-dental-broken:before{content:"\f286"}.ti-dental-off:before{content:"\f110"}.ti-deselect:before{content:"\f9f3"}.ti-details:before{content:"\ee71"}.ti-details-off:before{content:"\f3e2"}.ti-device-airpods:before{content:"\f5a9"}.ti-device-airpods-case:before{content:"\f646"}.ti-device-analytics:before{content:"\ee72"}.ti-device-audio-tape:before{content:"\ee73"}.ti-device-camera-phone:before{content:"\f233"}.ti-device-cctv:before{content:"\ee74"}.ti-device-cctv-off:before{content:"\f3e3"}.ti-device-computer-camera:before{content:"\ee76"}.ti-device-computer-camera-off:before{content:"\ee75"}.ti-device-desktop:before{content:"\ea89"}.ti-device-desktop-analytics:before{content:"\ee77"}.ti-device-desktop-bolt:before{content:"\f85e"}.ti-device-desktop-cancel:before{content:"\f85f"}.ti-device-desktop-check:before{content:"\f860"}.ti-device-desktop-code:before{content:"\f861"}.ti-device-desktop-cog:before{content:"\f862"}.ti-device-desktop-dollar:before{content:"\f863"}.ti-device-desktop-down:before{content:"\f864"}.ti-device-desktop-exclamation:before{content:"\f865"}.ti-device-desktop-heart:before{content:"\f866"}.ti-device-desktop-minus:before{content:"\f867"}.ti-device-desktop-off:before{content:"\ee78"}.ti-device-desktop-pause:before{content:"\f868"}.ti-device-desktop-pin:before{content:"\f869"}.ti-device-desktop-plus:before{content:"\f86a"}.ti-device-desktop-question:before{content:"\f86b"}.ti-device-desktop-search:before{content:"\f86c"}.ti-device-desktop-share:before{content:"\f86d"}.ti-device-desktop-star:before{content:"\f86e"}.ti-device-desktop-up:before{content:"\f86f"}.ti-device-desktop-x:before{content:"\f870"}.ti-device-floppy:before{content:"\eb62"}.ti-device-gamepad:before{content:"\eb63"}.ti-device-gamepad-2:before{content:"\f1d2"}.ti-device-heart-monitor:before{content:"\f060"}.ti-device-imac:before{content:"\f7a7"}.ti-device-imac-bolt:before{content:"\f871"}.ti-device-imac-cancel:before{content:"\f872"}.ti-device-imac-check:before{content:"\f873"}.ti-device-imac-code:before{content:"\f874"}.ti-device-imac-cog:before{content:"\f875"}.ti-device-imac-dollar:before{content:"\f876"}.ti-device-imac-down:before{content:"\f877"}.ti-device-imac-exclamation:before{content:"\f878"}.ti-device-imac-heart:before{content:"\f879"}.ti-device-imac-minus:before{content:"\f87a"}.ti-device-imac-off:before{content:"\f87b"}.ti-device-imac-pause:before{content:"\f87c"}.ti-device-imac-pin:before{content:"\f87d"}.ti-device-imac-plus:before{content:"\f87e"}.ti-device-imac-question:before{content:"\f87f"}.ti-device-imac-search:before{content:"\f880"}.ti-device-imac-share:before{content:"\f881"}.ti-device-imac-star:before{content:"\f882"}.ti-device-imac-up:before{content:"\f883"}.ti-device-imac-x:before{content:"\f884"}.ti-device-ipad:before{content:"\f648"}.ti-device-ipad-bolt:before{content:"\f885"}.ti-device-ipad-cancel:before{content:"\f886"}.ti-device-ipad-check:before{content:"\f887"}.ti-device-ipad-code:before{content:"\f888"}.ti-device-ipad-cog:before{content:"\f889"}.ti-device-ipad-dollar:before{content:"\f88a"}.ti-device-ipad-down:before{content:"\f88b"}.ti-device-ipad-exclamation:before{content:"\f88c"}.ti-device-ipad-heart:before{content:"\f88d"}.ti-device-ipad-horizontal:before{content:"\f647"}.ti-device-ipad-horizontal-bolt:before{content:"\f88e"}.ti-device-ipad-horizontal-cancel:before{content:"\f88f"}.ti-device-ipad-horizontal-check:before{content:"\f890"}.ti-device-ipad-horizontal-code:before{content:"\f891"}.ti-device-ipad-horizontal-cog:before{content:"\f892"}.ti-device-ipad-horizontal-dollar:before{content:"\f893"}.ti-device-ipad-horizontal-down:before{content:"\f894"}.ti-device-ipad-horizontal-exclamation:before{content:"\f895"}.ti-device-ipad-horizontal-heart:before{content:"\f896"}.ti-device-ipad-horizontal-minus:before{content:"\f897"}.ti-device-ipad-horizontal-off:before{content:"\f898"}.ti-device-ipad-horizontal-pause:before{content:"\f899"}.ti-device-ipad-horizontal-pin:before{content:"\f89a"}.ti-device-ipad-horizontal-plus:before{content:"\f89b"}.ti-device-ipad-horizontal-question:before{content:"\f89c"}.ti-device-ipad-horizontal-search:before{content:"\f89d"}.ti-device-ipad-horizontal-share:before{content:"\f89e"}.ti-device-ipad-horizontal-star:before{content:"\f89f"}.ti-device-ipad-horizontal-up:before{content:"\f8a0"}.ti-device-ipad-horizontal-x:before{content:"\f8a1"}.ti-device-ipad-minus:before{content:"\f8a2"}.ti-device-ipad-off:before{content:"\f8a3"}.ti-device-ipad-pause:before{content:"\f8a4"}.ti-device-ipad-pin:before{content:"\f8a5"}.ti-device-ipad-plus:before{content:"\f8a6"}.ti-device-ipad-question:before{content:"\f8a7"}.ti-device-ipad-search:before{content:"\f8a8"}.ti-device-ipad-share:before{content:"\f8a9"}.ti-device-ipad-star:before{content:"\f8aa"}.ti-device-ipad-up:before{content:"\f8ab"}.ti-device-ipad-x:before{content:"\f8ac"}.ti-device-landline-phone:before{content:"\f649"}.ti-device-laptop:before{content:"\eb64"}.ti-device-laptop-off:before{content:"\f061"}.ti-device-mobile:before{content:"\ea8a"}.ti-device-mobile-bolt:before{content:"\f8ad"}.ti-device-mobile-cancel:before{content:"\f8ae"}.ti-device-mobile-charging:before{content:"\f224"}.ti-device-mobile-check:before{content:"\f8af"}.ti-device-mobile-code:before{content:"\f8b0"}.ti-device-mobile-cog:before{content:"\f8b1"}.ti-device-mobile-dollar:before{content:"\f8b2"}.ti-device-mobile-down:before{content:"\f8b3"}.ti-device-mobile-exclamation:before{content:"\f8b4"}.ti-device-mobile-heart:before{content:"\f8b5"}.ti-device-mobile-message:before{content:"\ee79"}.ti-device-mobile-minus:before{content:"\f8b6"}.ti-device-mobile-off:before{content:"\f062"}.ti-device-mobile-pause:before{content:"\f8b7"}.ti-device-mobile-pin:before{content:"\f8b8"}.ti-device-mobile-plus:before{content:"\f8b9"}.ti-device-mobile-question:before{content:"\f8ba"}.ti-device-mobile-rotated:before{content:"\ecdb"}.ti-device-mobile-search:before{content:"\f8bb"}.ti-device-mobile-share:before{content:"\f8bc"}.ti-device-mobile-star:before{content:"\f8bd"}.ti-device-mobile-up:before{content:"\f8be"}.ti-device-mobile-vibration:before{content:"\eb86"}.ti-device-mobile-x:before{content:"\f8bf"}.ti-device-nintendo:before{content:"\f026"}.ti-device-nintendo-off:before{content:"\f111"}.ti-device-remote:before{content:"\f792"}.ti-device-sd-card:before{content:"\f384"}.ti-device-sim:before{content:"\f4b2"}.ti-device-sim-1:before{content:"\f4af"}.ti-device-sim-2:before{content:"\f4b0"}.ti-device-sim-3:before{content:"\f4b1"}.ti-device-speaker:before{content:"\ea8b"}.ti-device-speaker-off:before{content:"\f112"}.ti-device-tablet:before{content:"\ea8c"}.ti-device-tablet-bolt:before{content:"\f8c0"}.ti-device-tablet-cancel:before{content:"\f8c1"}.ti-device-tablet-check:before{content:"\f8c2"}.ti-device-tablet-code:before{content:"\f8c3"}.ti-device-tablet-cog:before{content:"\f8c4"}.ti-device-tablet-dollar:before{content:"\f8c5"}.ti-device-tablet-down:before{content:"\f8c6"}.ti-device-tablet-exclamation:before{content:"\f8c7"}.ti-device-tablet-heart:before{content:"\f8c8"}.ti-device-tablet-minus:before{content:"\f8c9"}.ti-device-tablet-off:before{content:"\f063"}.ti-device-tablet-pause:before{content:"\f8ca"}.ti-device-tablet-pin:before{content:"\f8cb"}.ti-device-tablet-plus:before{content:"\f8cc"}.ti-device-tablet-question:before{content:"\f8cd"}.ti-device-tablet-search:before{content:"\f8ce"}.ti-device-tablet-share:before{content:"\f8cf"}.ti-device-tablet-star:before{content:"\f8d0"}.ti-device-tablet-up:before{content:"\f8d1"}.ti-device-tablet-x:before{content:"\f8d2"}.ti-device-tv:before{content:"\ea8d"}.ti-device-tv-off:before{content:"\f064"}.ti-device-tv-old:before{content:"\f1d3"}.ti-device-watch:before{content:"\ebf9"}.ti-device-watch-bolt:before{content:"\f8d3"}.ti-device-watch-cancel:before{content:"\f8d4"}.ti-device-watch-check:before{content:"\f8d5"}.ti-device-watch-code:before{content:"\f8d6"}.ti-device-watch-cog:before{content:"\f8d7"}.ti-device-watch-dollar:before{content:"\f8d8"}.ti-device-watch-down:before{content:"\f8d9"}.ti-device-watch-exclamation:before{content:"\f8da"}.ti-device-watch-heart:before{content:"\f8db"}.ti-device-watch-minus:before{content:"\f8dc"}.ti-device-watch-off:before{content:"\f065"}.ti-device-watch-pause:before{content:"\f8dd"}.ti-device-watch-pin:before{content:"\f8de"}.ti-device-watch-plus:before{content:"\f8df"}.ti-device-watch-question:before{content:"\f8e0"}.ti-device-watch-search:before{content:"\f8e1"}.ti-device-watch-share:before{content:"\f8e2"}.ti-device-watch-star:before{content:"\f8e3"}.ti-device-watch-stats:before{content:"\ef7d"}.ti-device-watch-stats-2:before{content:"\ef7c"}.ti-device-watch-up:before{content:"\f8e4"}.ti-device-watch-x:before{content:"\f8e5"}.ti-devices:before{content:"\eb87"}.ti-devices-2:before{content:"\ed29"}.ti-devices-bolt:before{content:"\f8e6"}.ti-devices-cancel:before{content:"\f8e7"}.ti-devices-check:before{content:"\f8e8"}.ti-devices-code:before{content:"\f8e9"}.ti-devices-cog:before{content:"\f8ea"}.ti-devices-dollar:before{content:"\f8eb"}.ti-devices-down:before{content:"\f8ec"}.ti-devices-exclamation:before{content:"\f8ed"}.ti-devices-heart:before{content:"\f8ee"}.ti-devices-minus:before{content:"\f8ef"}.ti-devices-off:before{content:"\f3e4"}.ti-devices-pause:before{content:"\f8f0"}.ti-devices-pc:before{content:"\ee7a"}.ti-devices-pc-off:before{content:"\f113"}.ti-devices-pin:before{content:"\f8f1"}.ti-devices-plus:before{content:"\f8f2"}.ti-devices-question:before{content:"\f8f3"}.ti-devices-search:before{content:"\f8f4"}.ti-devices-share:before{content:"\f8f5"}.ti-devices-star:before{content:"\f8f6"}.ti-devices-up:before{content:"\f8f7"}.ti-devices-x:before{content:"\f8f8"}.ti-dialpad:before{content:"\f067"}.ti-dialpad-off:before{content:"\f114"}.ti-diamond:before{content:"\eb65"}.ti-diamond-filled:before{content:"\f73d"}.ti-diamond-off:before{content:"\f115"}.ti-diamonds:before{content:"\eff5"}.ti-diamonds-filled:before{content:"\f676"}.ti-dice:before{content:"\eb66"}.ti-dice-1:before{content:"\f08b"}.ti-dice-1-filled:before{content:"\f73e"}.ti-dice-2:before{content:"\f08c"}.ti-dice-2-filled:before{content:"\f73f"}.ti-dice-3:before{content:"\f08d"}.ti-dice-3-filled:before{content:"\f740"}.ti-dice-4:before{content:"\f08e"}.ti-dice-4-filled:before{content:"\f741"}.ti-dice-5:before{content:"\f08f"}.ti-dice-5-filled:before{content:"\f742"}.ti-dice-6:before{content:"\f090"}.ti-dice-6-filled:before{content:"\f743"}.ti-dice-filled:before{content:"\f744"}.ti-dimensions:before{content:"\ee7b"}.ti-direction:before{content:"\ebfb"}.ti-direction-horizontal:before{content:"\ebfa"}.ti-direction-sign:before{content:"\f1f7"}.ti-direction-sign-filled:before{content:"\f745"}.ti-direction-sign-off:before{content:"\f3e5"}.ti-directions:before{content:"\ea8e"}.ti-directions-off:before{content:"\f116"}.ti-disabled:before{content:"\ea8f"}.ti-disabled-2:before{content:"\ebaf"}.ti-disabled-off:before{content:"\f117"}.ti-disc:before{content:"\ea90"}.ti-disc-golf:before{content:"\f385"}.ti-disc-off:before{content:"\f118"}.ti-discount:before{content:"\ebbd"}.ti-discount-2:before{content:"\ee7c"}.ti-discount-2-off:before{content:"\f3e6"}.ti-discount-check:before{content:"\f1f8"}.ti-discount-check-filled:before{content:"\f746"}.ti-discount-off:before{content:"\f3e7"}.ti-divide:before{content:"\ed5c"}.ti-dna:before{content:"\ee7d"}.ti-dna-2:before{content:"\ef5c"}.ti-dna-2-off:before{content:"\f119"}.ti-dna-off:before{content:"\f11a"}.ti-dog:before{content:"\f660"}.ti-dog-bowl:before{content:"\ef29"}.ti-door:before{content:"\ef4e"}.ti-door-enter:before{content:"\ef4c"}.ti-door-exit:before{content:"\ef4d"}.ti-door-off:before{content:"\f11b"}.ti-dots:before{content:"\ea95"}.ti-dots-circle-horizontal:before{content:"\ea91"}.ti-dots-diagonal:before{content:"\ea93"}.ti-dots-diagonal-2:before{content:"\ea92"}.ti-dots-vertical:before{content:"\ea94"}.ti-download:before{content:"\ea96"}.ti-download-off:before{content:"\f11c"}.ti-drag-drop:before{content:"\eb89"}.ti-drag-drop-2:before{content:"\eb88"}.ti-drone:before{content:"\ed79"}.ti-drone-off:before{content:"\ee7e"}.ti-drop-circle:before{content:"\efde"}.ti-droplet:before{content:"\ea97"}.ti-droplet-bolt:before{content:"\f8f9"}.ti-droplet-cancel:before{content:"\f8fa"}.ti-droplet-check:before{content:"\f8fb"}.ti-droplet-code:before{content:"\f8fc"}.ti-droplet-cog:before{content:"\f8fd"}.ti-droplet-dollar:before{content:"\f8fe"}.ti-droplet-down:before{content:"\f8ff"}.ti-droplet-exclamation:before{content:"\f900"}.ti-droplet-filled:before{content:"\ee80"}.ti-droplet-filled-2:before{content:"\ee7f"}.ti-droplet-half:before{content:"\ee82"}.ti-droplet-half-2:before{content:"\ee81"}.ti-droplet-half-filled:before{content:"\f6c5"}.ti-droplet-heart:before{content:"\f901"}.ti-droplet-minus:before{content:"\f902"}.ti-droplet-off:before{content:"\ee83"}.ti-droplet-pause:before{content:"\f903"}.ti-droplet-pin:before{content:"\f904"}.ti-droplet-plus:before{content:"\f905"}.ti-droplet-question:before{content:"\f906"}.ti-droplet-search:before{content:"\f907"}.ti-droplet-share:before{content:"\f908"}.ti-droplet-star:before{content:"\f909"}.ti-droplet-up:before{content:"\f90a"}.ti-droplet-x:before{content:"\f90b"}.ti-e-passport:before{content:"\f4df"}.ti-ear:before{content:"\ebce"}.ti-ear-off:before{content:"\ee84"}.ti-ease-in:before{content:"\f573"}.ti-ease-in-control-point:before{content:"\f570"}.ti-ease-in-out:before{content:"\f572"}.ti-ease-in-out-control-points:before{content:"\f571"}.ti-ease-out:before{content:"\f575"}.ti-ease-out-control-point:before{content:"\f574"}.ti-edit:before{content:"\ea98"}.ti-edit-circle:before{content:"\ee85"}.ti-edit-circle-off:before{content:"\f11d"}.ti-edit-off:before{content:"\f11e"}.ti-egg:before{content:"\eb8a"}.ti-egg-cracked:before{content:"\f2d6"}.ti-egg-filled:before{content:"\f678"}.ti-egg-fried:before{content:"\f386"}.ti-egg-off:before{content:"\f11f"}.ti-eggs:before{content:"\f500"}.ti-elevator:before{content:"\efdf"}.ti-elevator-off:before{content:"\f3e8"}.ti-emergency-bed:before{content:"\ef5d"}.ti-empathize:before{content:"\f29b"}.ti-empathize-off:before{content:"\f3e9"}.ti-emphasis:before{content:"\ebcf"}.ti-engine:before{content:"\ef7e"}.ti-engine-off:before{content:"\f120"}.ti-equal:before{content:"\ee87"}.ti-equal-double:before{content:"\f4e1"}.ti-equal-not:before{content:"\ee86"}.ti-eraser:before{content:"\eb8b"}.ti-eraser-off:before{content:"\f121"}.ti-error-404:before{content:"\f027"}.ti-error-404-off:before{content:"\f122"}.ti-exchange:before{content:"\ebe7"}.ti-exchange-off:before{content:"\f123"}.ti-exclamation-circle:before{content:"\f634"}.ti-exclamation-mark:before{content:"\efb4"}.ti-exclamation-mark-off:before{content:"\f124"}.ti-explicit:before{content:"\f256"}.ti-explicit-off:before{content:"\f3ea"}.ti-exposure:before{content:"\eb8c"}.ti-exposure-0:before{content:"\f29c"}.ti-exposure-minus-1:before{content:"\f29d"}.ti-exposure-minus-2:before{content:"\f29e"}.ti-exposure-off:before{content:"\f3eb"}.ti-exposure-plus-1:before{content:"\f29f"}.ti-exposure-plus-2:before{content:"\f2a0"}.ti-external-link:before{content:"\ea99"}.ti-external-link-off:before{content:"\f125"}.ti-eye:before{content:"\ea9a"}.ti-eye-check:before{content:"\ee88"}.ti-eye-closed:before{content:"\f7ec"}.ti-eye-cog:before{content:"\f7ed"}.ti-eye-edit:before{content:"\f7ee"}.ti-eye-exclamation:before{content:"\f7ef"}.ti-eye-filled:before{content:"\f679"}.ti-eye-heart:before{content:"\f7f0"}.ti-eye-off:before{content:"\ecf0"}.ti-eye-table:before{content:"\ef5e"}.ti-eye-x:before{content:"\f7f1"}.ti-eyeglass:before{content:"\ee8a"}.ti-eyeglass-2:before{content:"\ee89"}.ti-eyeglass-off:before{content:"\f126"}.ti-face-id:before{content:"\ea9b"}.ti-face-id-error:before{content:"\efa7"}.ti-face-mask:before{content:"\efb5"}.ti-face-mask-off:before{content:"\f127"}.ti-fall:before{content:"\ecb9"}.ti-feather:before{content:"\ee8b"}.ti-feather-off:before{content:"\f128"}.ti-fence:before{content:"\ef2a"}.ti-fence-off:before{content:"\f129"}.ti-fidget-spinner:before{content:"\f068"}.ti-file:before{content:"\eaa4"}.ti-file-3d:before{content:"\f032"}.ti-file-alert:before{content:"\ede6"}.ti-file-analytics:before{content:"\ede7"}.ti-file-arrow-left:before{content:"\f033"}.ti-file-arrow-right:before{content:"\f034"}.ti-file-barcode:before{content:"\f035"}.ti-file-broken:before{content:"\f501"}.ti-file-certificate:before{content:"\ed4d"}.ti-file-chart:before{content:"\f036"}.ti-file-check:before{content:"\ea9c"}.ti-file-code:before{content:"\ebd0"}.ti-file-code-2:before{content:"\ede8"}.ti-file-database:before{content:"\f037"}.ti-file-delta:before{content:"\f53d"}.ti-file-description:before{content:"\f028"}.ti-file-diff:before{content:"\ecf1"}.ti-file-digit:before{content:"\efa8"}.ti-file-dislike:before{content:"\ed2a"}.ti-file-dollar:before{content:"\efe0"}.ti-file-dots:before{content:"\f038"}.ti-file-download:before{content:"\ea9d"}.ti-file-euro:before{content:"\efe1"}.ti-file-export:before{content:"\ede9"}.ti-file-filled:before{content:"\f747"}.ti-file-function:before{content:"\f53e"}.ti-file-horizontal:before{content:"\ebb0"}.ti-file-import:before{content:"\edea"}.ti-file-infinity:before{content:"\f502"}.ti-file-info:before{content:"\edec"}.ti-file-invoice:before{content:"\eb67"}.ti-file-lambda:before{content:"\f53f"}.ti-file-like:before{content:"\ed2b"}.ti-file-minus:before{content:"\ea9e"}.ti-file-music:before{content:"\ea9f"}.ti-file-off:before{content:"\ecf2"}.ti-file-orientation:before{content:"\f2a1"}.ti-file-pencil:before{content:"\f039"}.ti-file-percent:before{content:"\f540"}.ti-file-phone:before{content:"\ecdc"}.ti-file-plus:before{content:"\eaa0"}.ti-file-power:before{content:"\f03a"}.ti-file-report:before{content:"\eded"}.ti-file-rss:before{content:"\f03b"}.ti-file-scissors:before{content:"\f03c"}.ti-file-search:before{content:"\ed5d"}.ti-file-settings:before{content:"\f029"}.ti-file-shredder:before{content:"\eaa1"}.ti-file-signal:before{content:"\f03d"}.ti-file-spreadsheet:before{content:"\f03e"}.ti-file-stack:before{content:"\f503"}.ti-file-star:before{content:"\f03f"}.ti-file-symlink:before{content:"\ed53"}.ti-file-text:before{content:"\eaa2"}.ti-file-time:before{content:"\f040"}.ti-file-typography:before{content:"\f041"}.ti-file-unknown:before{content:"\f042"}.ti-file-upload:before{content:"\ec91"}.ti-file-vector:before{content:"\f043"}.ti-file-x:before{content:"\eaa3"}.ti-file-x-filled:before{content:"\f748"}.ti-file-zip:before{content:"\ed4e"}.ti-files:before{content:"\edef"}.ti-files-off:before{content:"\edee"}.ti-filter:before{content:"\eaa5"}.ti-filter-off:before{content:"\ed2c"}.ti-filters:before{content:"\f793"}.ti-fingerprint:before{content:"\ebd1"}.ti-fingerprint-off:before{content:"\f12a"}.ti-fire-hydrant:before{content:"\f3a9"}.ti-fire-hydrant-off:before{content:"\f3ec"}.ti-firetruck:before{content:"\ebe8"}.ti-first-aid-kit:before{content:"\ef5f"}.ti-first-aid-kit-off:before{content:"\f3ed"}.ti-fish:before{content:"\ef2b"}.ti-fish-bone:before{content:"\f287"}.ti-fish-christianity:before{content:"\f58b"}.ti-fish-hook:before{content:"\f1f9"}.ti-fish-hook-off:before{content:"\f3ee"}.ti-fish-off:before{content:"\f12b"}.ti-flag:before{content:"\eaa6"}.ti-flag-2:before{content:"\ee8c"}.ti-flag-2-filled:before{content:"\f707"}.ti-flag-2-off:before{content:"\f12c"}.ti-flag-3:before{content:"\ee8d"}.ti-flag-3-filled:before{content:"\f708"}.ti-flag-filled:before{content:"\f67a"}.ti-flag-off:before{content:"\f12d"}.ti-flame:before{content:"\ec2c"}.ti-flame-off:before{content:"\f12e"}.ti-flare:before{content:"\ee8e"}.ti-flask:before{content:"\ebd2"}.ti-flask-2:before{content:"\ef60"}.ti-flask-2-off:before{content:"\f12f"}.ti-flask-off:before{content:"\f130"}.ti-flip-flops:before{content:"\f564"}.ti-flip-horizontal:before{content:"\eaa7"}.ti-flip-vertical:before{content:"\eaa8"}.ti-float-center:before{content:"\ebb1"}.ti-float-left:before{content:"\ebb2"}.ti-float-none:before{content:"\ed13"}.ti-float-right:before{content:"\ebb3"}.ti-flower:before{content:"\eff6"}.ti-flower-off:before{content:"\f131"}.ti-focus:before{content:"\eb8d"}.ti-focus-2:before{content:"\ebd3"}.ti-focus-centered:before{content:"\f02a"}.ti-fold:before{content:"\ed56"}.ti-fold-down:before{content:"\ed54"}.ti-fold-up:before{content:"\ed55"}.ti-folder:before{content:"\eaad"}.ti-folder-bolt:before{content:"\f90c"}.ti-folder-cancel:before{content:"\f90d"}.ti-folder-check:before{content:"\f90e"}.ti-folder-code:before{content:"\f90f"}.ti-folder-cog:before{content:"\f910"}.ti-folder-dollar:before{content:"\f911"}.ti-folder-down:before{content:"\f912"}.ti-folder-exclamation:before{content:"\f913"}.ti-folder-filled:before{content:"\f749"}.ti-folder-heart:before{content:"\f914"}.ti-folder-minus:before{content:"\eaaa"}.ti-folder-off:before{content:"\ed14"}.ti-folder-pause:before{content:"\f915"}.ti-folder-pin:before{content:"\f916"}.ti-folder-plus:before{content:"\eaab"}.ti-folder-question:before{content:"\f917"}.ti-folder-search:before{content:"\f918"}.ti-folder-share:before{content:"\f919"}.ti-folder-star:before{content:"\f91a"}.ti-folder-symlink:before{content:"\f91b"}.ti-folder-up:before{content:"\f91c"}.ti-folder-x:before{content:"\eaac"}.ti-folders:before{content:"\eaae"}.ti-folders-off:before{content:"\f133"}.ti-forbid:before{content:"\ebd5"}.ti-forbid-2:before{content:"\ebd4"}.ti-forklift:before{content:"\ebe9"}.ti-forms:before{content:"\ee8f"}.ti-fountain:before{content:"\f09b"}.ti-fountain-off:before{content:"\f134"}.ti-frame:before{content:"\eaaf"}.ti-frame-off:before{content:"\f135"}.ti-free-rights:before{content:"\efb6"}.ti-fridge:before{content:"\f1fa"}.ti-fridge-off:before{content:"\f3ef"}.ti-friends:before{content:"\eab0"}.ti-friends-off:before{content:"\f136"}.ti-function:before{content:"\f225"}.ti-function-off:before{content:"\f3f0"}.ti-garden-cart:before{content:"\f23e"}.ti-garden-cart-off:before{content:"\f3f1"}.ti-gas-station:before{content:"\ec7d"}.ti-gas-station-off:before{content:"\f137"}.ti-gauge:before{content:"\eab1"}.ti-gauge-off:before{content:"\f138"}.ti-gavel:before{content:"\ef90"}.ti-gender-agender:before{content:"\f0e1"}.ti-gender-androgyne:before{content:"\f0e2"}.ti-gender-bigender:before{content:"\f0e3"}.ti-gender-demiboy:before{content:"\f0e4"}.ti-gender-demigirl:before{content:"\f0e5"}.ti-gender-epicene:before{content:"\f0e6"}.ti-gender-female:before{content:"\f0e7"}.ti-gender-femme:before{content:"\f0e8"}.ti-gender-genderfluid:before{content:"\f0e9"}.ti-gender-genderless:before{content:"\f0ea"}.ti-gender-genderqueer:before{content:"\f0eb"}.ti-gender-hermaphrodite:before{content:"\f0ec"}.ti-gender-intergender:before{content:"\f0ed"}.ti-gender-male:before{content:"\f0ee"}.ti-gender-neutrois:before{content:"\f0ef"}.ti-gender-third:before{content:"\f0f0"}.ti-gender-transgender:before{content:"\f0f1"}.ti-gender-trasvesti:before{content:"\f0f2"}.ti-geometry:before{content:"\ee90"}.ti-ghost:before{content:"\eb8e"}.ti-ghost-2:before{content:"\f57c"}.ti-ghost-2-filled:before{content:"\f74a"}.ti-ghost-filled:before{content:"\f74b"}.ti-ghost-off:before{content:"\f3f2"}.ti-gif:before{content:"\f257"}.ti-gift:before{content:"\eb68"}.ti-gift-card:before{content:"\f3aa"}.ti-gift-off:before{content:"\f3f3"}.ti-git-branch:before{content:"\eab2"}.ti-git-branch-deleted:before{content:"\f57d"}.ti-git-cherry-pick:before{content:"\f57e"}.ti-git-commit:before{content:"\eab3"}.ti-git-compare:before{content:"\eab4"}.ti-git-fork:before{content:"\eb8f"}.ti-git-merge:before{content:"\eab5"}.ti-git-pull-request:before{content:"\eab6"}.ti-git-pull-request-closed:before{content:"\ef7f"}.ti-git-pull-request-draft:before{content:"\efb7"}.ti-gizmo:before{content:"\f02b"}.ti-glass:before{content:"\eab8"}.ti-glass-full:before{content:"\eab7"}.ti-glass-off:before{content:"\ee91"}.ti-globe:before{content:"\eab9"}.ti-globe-off:before{content:"\f139"}.ti-go-game:before{content:"\f512"}.ti-golf:before{content:"\ed8c"}.ti-golf-off:before{content:"\f13a"}.ti-gps:before{content:"\ed7a"}.ti-gradienter:before{content:"\f3ab"}.ti-grain:before{content:"\ee92"}.ti-graph:before{content:"\f288"}.ti-graph-off:before{content:"\f3f4"}.ti-grave:before{content:"\f580"}.ti-grave-2:before{content:"\f57f"}.ti-grid-dots:before{content:"\eaba"}.ti-grid-pattern:before{content:"\efc9"}.ti-grill:before{content:"\efa9"}.ti-grill-fork:before{content:"\f35b"}.ti-grill-off:before{content:"\f3f5"}.ti-grill-spatula:before{content:"\f35c"}.ti-grip-horizontal:before{content:"\ec00"}.ti-grip-vertical:before{content:"\ec01"}.ti-growth:before{content:"\ee93"}.ti-guitar-pick:before{content:"\f4c6"}.ti-guitar-pick-filled:before{content:"\f67b"}.ti-h-1:before{content:"\ec94"}.ti-h-2:before{content:"\ec95"}.ti-h-3:before{content:"\ec96"}.ti-h-4:before{content:"\ec97"}.ti-h-5:before{content:"\ec98"}.ti-h-6:before{content:"\ec99"}.ti-hammer:before{content:"\ef91"}.ti-hammer-off:before{content:"\f13c"}.ti-hand-click:before{content:"\ef4f"}.ti-hand-finger:before{content:"\ee94"}.ti-hand-finger-off:before{content:"\f13d"}.ti-hand-grab:before{content:"\f091"}.ti-hand-little-finger:before{content:"\ee95"}.ti-hand-middle-finger:before{content:"\ec2d"}.ti-hand-move:before{content:"\ef50"}.ti-hand-off:before{content:"\ed15"}.ti-hand-ring-finger:before{content:"\ee96"}.ti-hand-rock:before{content:"\ee97"}.ti-hand-sanitizer:before{content:"\f5f4"}.ti-hand-stop:before{content:"\ec2e"}.ti-hand-three-fingers:before{content:"\ee98"}.ti-hand-two-fingers:before{content:"\ee99"}.ti-hanger:before{content:"\ee9a"}.ti-hanger-2:before{content:"\f09c"}.ti-hanger-off:before{content:"\f13e"}.ti-hash:before{content:"\eabc"}.ti-haze:before{content:"\efaa"}.ti-heading:before{content:"\ee9b"}.ti-heading-off:before{content:"\f13f"}.ti-headphones:before{content:"\eabd"}.ti-headphones-off:before{content:"\ed1d"}.ti-headset:before{content:"\eb90"}.ti-headset-off:before{content:"\f3f6"}.ti-health-recognition:before{content:"\f1fb"}.ti-heart:before{content:"\eabe"}.ti-heart-broken:before{content:"\ecba"}.ti-heart-filled:before{content:"\f67c"}.ti-heart-handshake:before{content:"\f0f3"}.ti-heart-minus:before{content:"\f140"}.ti-heart-off:before{content:"\f141"}.ti-heart-plus:before{content:"\f142"}.ti-heart-rate-monitor:before{content:"\ef61"}.ti-heartbeat:before{content:"\ef92"}.ti-hearts:before{content:"\f387"}.ti-hearts-off:before{content:"\f3f7"}.ti-helicopter:before{content:"\ed8e"}.ti-helicopter-landing:before{content:"\ed8d"}.ti-helmet:before{content:"\efca"}.ti-helmet-off:before{content:"\f143"}.ti-help:before{content:"\eabf"}.ti-help-circle:before{content:"\f91d"}.ti-help-hexagon:before{content:"\f7a8"}.ti-help-octagon:before{content:"\f7a9"}.ti-help-off:before{content:"\f3f8"}.ti-help-small:before{content:"\f91e"}.ti-help-square:before{content:"\f920"}.ti-help-square-rounded:before{content:"\f91f"}.ti-help-triangle:before{content:"\f921"}.ti-hexagon:before{content:"\ec02"}.ti-hexagon-0-filled:before{content:"\f74c"}.ti-hexagon-1-filled:before{content:"\f74d"}.ti-hexagon-2-filled:before{content:"\f74e"}.ti-hexagon-3-filled:before{content:"\f74f"}.ti-hexagon-3d:before{content:"\f4c7"}.ti-hexagon-4-filled:before{content:"\f750"}.ti-hexagon-5-filled:before{content:"\f751"}.ti-hexagon-6-filled:before{content:"\f752"}.ti-hexagon-7-filled:before{content:"\f753"}.ti-hexagon-8-filled:before{content:"\f754"}.ti-hexagon-9-filled:before{content:"\f755"}.ti-hexagon-filled:before{content:"\f67d"}.ti-hexagon-letter-a:before{content:"\f463"}.ti-hexagon-letter-b:before{content:"\f464"}.ti-hexagon-letter-c:before{content:"\f465"}.ti-hexagon-letter-d:before{content:"\f466"}.ti-hexagon-letter-e:before{content:"\f467"}.ti-hexagon-letter-f:before{content:"\f468"}.ti-hexagon-letter-g:before{content:"\f469"}.ti-hexagon-letter-h:before{content:"\f46a"}.ti-hexagon-letter-i:before{content:"\f46b"}.ti-hexagon-letter-j:before{content:"\f46c"}.ti-hexagon-letter-k:before{content:"\f46d"}.ti-hexagon-letter-l:before{content:"\f46e"}.ti-hexagon-letter-m:before{content:"\f46f"}.ti-hexagon-letter-n:before{content:"\f470"}.ti-hexagon-letter-o:before{content:"\f471"}.ti-hexagon-letter-p:before{content:"\f472"}.ti-hexagon-letter-q:before{content:"\f473"}.ti-hexagon-letter-r:before{content:"\f474"}.ti-hexagon-letter-s:before{content:"\f475"}.ti-hexagon-letter-t:before{content:"\f476"}.ti-hexagon-letter-u:before{content:"\f477"}.ti-hexagon-letter-v:before{content:"\f4b3"}.ti-hexagon-letter-w:before{content:"\f478"}.ti-hexagon-letter-x:before{content:"\f479"}.ti-hexagon-letter-y:before{content:"\f47a"}.ti-hexagon-letter-z:before{content:"\f47b"}.ti-hexagon-number-0:before{content:"\f459"}.ti-hexagon-number-1:before{content:"\f45a"}.ti-hexagon-number-2:before{content:"\f45b"}.ti-hexagon-number-3:before{content:"\f45c"}.ti-hexagon-number-4:before{content:"\f45d"}.ti-hexagon-number-5:before{content:"\f45e"}.ti-hexagon-number-6:before{content:"\f45f"}.ti-hexagon-number-7:before{content:"\f460"}.ti-hexagon-number-8:before{content:"\f461"}.ti-hexagon-number-9:before{content:"\f462"}.ti-hexagon-off:before{content:"\ee9c"}.ti-hexagons:before{content:"\f09d"}.ti-hexagons-off:before{content:"\f3f9"}.ti-hierarchy:before{content:"\ee9e"}.ti-hierarchy-2:before{content:"\ee9d"}.ti-hierarchy-3:before{content:"\f289"}.ti-hierarchy-off:before{content:"\f3fa"}.ti-highlight:before{content:"\ef3f"}.ti-highlight-off:before{content:"\f144"}.ti-history:before{content:"\ebea"}.ti-history-off:before{content:"\f3fb"}.ti-history-toggle:before{content:"\f1fc"}.ti-home:before{content:"\eac1"}.ti-home-2:before{content:"\eac0"}.ti-home-bolt:before{content:"\f336"}.ti-home-cancel:before{content:"\f350"}.ti-home-check:before{content:"\f337"}.ti-home-cog:before{content:"\f338"}.ti-home-dollar:before{content:"\f339"}.ti-home-dot:before{content:"\f33a"}.ti-home-down:before{content:"\f33b"}.ti-home-eco:before{content:"\f351"}.ti-home-edit:before{content:"\f352"}.ti-home-exclamation:before{content:"\f33c"}.ti-home-hand:before{content:"\f504"}.ti-home-heart:before{content:"\f353"}.ti-home-infinity:before{content:"\f505"}.ti-home-link:before{content:"\f354"}.ti-home-minus:before{content:"\f33d"}.ti-home-move:before{content:"\f33e"}.ti-home-off:before{content:"\f145"}.ti-home-plus:before{content:"\f33f"}.ti-home-question:before{content:"\f340"}.ti-home-ribbon:before{content:"\f355"}.ti-home-search:before{content:"\f341"}.ti-home-share:before{content:"\f342"}.ti-home-shield:before{content:"\f343"}.ti-home-signal:before{content:"\f356"}.ti-home-star:before{content:"\f344"}.ti-home-stats:before{content:"\f345"}.ti-home-up:before{content:"\f346"}.ti-home-x:before{content:"\f347"}.ti-horse-toy:before{content:"\f28a"}.ti-hotel-service:before{content:"\ef80"}.ti-hourglass:before{content:"\ef93"}.ti-hourglass-empty:before{content:"\f146"}.ti-hourglass-filled:before{content:"\f756"}.ti-hourglass-high:before{content:"\f092"}.ti-hourglass-low:before{content:"\f093"}.ti-hourglass-off:before{content:"\f147"}.ti-html:before{content:"\f7b1"}.ti-ice-cream:before{content:"\eac2"}.ti-ice-cream-2:before{content:"\ee9f"}.ti-ice-cream-off:before{content:"\f148"}.ti-ice-skating:before{content:"\efcb"}.ti-icons:before{content:"\f1d4"}.ti-icons-off:before{content:"\f3fc"}.ti-id:before{content:"\eac3"}.ti-id-badge:before{content:"\eff7"}.ti-id-badge-2:before{content:"\f076"}.ti-id-badge-off:before{content:"\f3fd"}.ti-id-off:before{content:"\f149"}.ti-inbox:before{content:"\eac4"}.ti-inbox-off:before{content:"\f14a"}.ti-indent-decrease:before{content:"\eb91"}.ti-indent-increase:before{content:"\eb92"}.ti-infinity:before{content:"\eb69"}.ti-infinity-off:before{content:"\f3fe"}.ti-info-circle:before{content:"\eac5"}.ti-info-circle-filled:before{content:"\f6d8"}.ti-info-hexagon:before{content:"\f7aa"}.ti-info-octagon:before{content:"\f7ab"}.ti-info-small:before{content:"\f922"}.ti-info-square:before{content:"\eac6"}.ti-info-square-rounded:before{content:"\f635"}.ti-info-square-rounded-filled:before{content:"\f6d9"}.ti-info-triangle:before{content:"\f923"}.ti-inner-shadow-bottom:before{content:"\f520"}.ti-inner-shadow-bottom-filled:before{content:"\f757"}.ti-inner-shadow-bottom-left:before{content:"\f51e"}.ti-inner-shadow-bottom-left-filled:before{content:"\f758"}.ti-inner-shadow-bottom-right:before{content:"\f51f"}.ti-inner-shadow-bottom-right-filled:before{content:"\f759"}.ti-inner-shadow-left:before{content:"\f521"}.ti-inner-shadow-left-filled:before{content:"\f75a"}.ti-inner-shadow-right:before{content:"\f522"}.ti-inner-shadow-right-filled:before{content:"\f75b"}.ti-inner-shadow-top:before{content:"\f525"}.ti-inner-shadow-top-filled:before{content:"\f75c"}.ti-inner-shadow-top-left:before{content:"\f523"}.ti-inner-shadow-top-left-filled:before{content:"\f75d"}.ti-inner-shadow-top-right:before{content:"\f524"}.ti-inner-shadow-top-right-filled:before{content:"\f75e"}.ti-input-search:before{content:"\f2a2"}.ti-ironing-1:before{content:"\f2f4"}.ti-ironing-2:before{content:"\f2f5"}.ti-ironing-3:before{content:"\f2f6"}.ti-ironing-off:before{content:"\f2f7"}.ti-ironing-steam:before{content:"\f2f9"}.ti-ironing-steam-off:before{content:"\f2f8"}.ti-italic:before{content:"\eb93"}.ti-jacket:before{content:"\f661"}.ti-jetpack:before{content:"\f581"}.ti-jewish-star:before{content:"\f3ff"}.ti-jewish-star-filled:before{content:"\f67e"}.ti-jpg:before{content:"\f3ac"}.ti-json:before{content:"\f7b2"}.ti-jump-rope:before{content:"\ed8f"}.ti-karate:before{content:"\ed32"}.ti-kayak:before{content:"\f1d6"}.ti-kering:before{content:"\efb8"}.ti-key:before{content:"\eac7"}.ti-key-off:before{content:"\f14b"}.ti-keyboard:before{content:"\ebd6"}.ti-keyboard-hide:before{content:"\ec7e"}.ti-keyboard-off:before{content:"\eea0"}.ti-keyboard-show:before{content:"\ec7f"}.ti-keyframe:before{content:"\f576"}.ti-keyframe-align-center:before{content:"\f582"}.ti-keyframe-align-horizontal:before{content:"\f583"}.ti-keyframe-align-vertical:before{content:"\f584"}.ti-keyframes:before{content:"\f585"}.ti-ladder:before{content:"\efe2"}.ti-ladder-off:before{content:"\f14c"}.ti-lambda:before{content:"\f541"}.ti-lamp:before{content:"\efab"}.ti-lamp-2:before{content:"\f09e"}.ti-lamp-off:before{content:"\f14d"}.ti-language:before{content:"\ebbe"}.ti-language-hiragana:before{content:"\ef77"}.ti-language-katakana:before{content:"\ef78"}.ti-language-off:before{content:"\f14e"}.ti-lasso:before{content:"\efac"}.ti-lasso-off:before{content:"\f14f"}.ti-lasso-polygon:before{content:"\f388"}.ti-layers-difference:before{content:"\eac8"}.ti-layers-intersect:before{content:"\eac9"}.ti-layers-intersect-2:before{content:"\eff8"}.ti-layers-linked:before{content:"\eea1"}.ti-layers-off:before{content:"\f150"}.ti-layers-subtract:before{content:"\eaca"}.ti-layers-union:before{content:"\eacb"}.ti-layout:before{content:"\eadb"}.ti-layout-2:before{content:"\eacc"}.ti-layout-align-bottom:before{content:"\eacd"}.ti-layout-align-center:before{content:"\eace"}.ti-layout-align-left:before{content:"\eacf"}.ti-layout-align-middle:before{content:"\ead0"}.ti-layout-align-right:before{content:"\ead1"}.ti-layout-align-top:before{content:"\ead2"}.ti-layout-board:before{content:"\ef95"}.ti-layout-board-split:before{content:"\ef94"}.ti-layout-bottombar:before{content:"\ead3"}.ti-layout-bottombar-collapse:before{content:"\f28b"}.ti-layout-bottombar-expand:before{content:"\f28c"}.ti-layout-cards:before{content:"\ec13"}.ti-layout-collage:before{content:"\f389"}.ti-layout-columns:before{content:"\ead4"}.ti-layout-dashboard:before{content:"\f02c"}.ti-layout-distribute-horizontal:before{content:"\ead5"}.ti-layout-distribute-vertical:before{content:"\ead6"}.ti-layout-grid:before{content:"\edba"}.ti-layout-grid-add:before{content:"\edb9"}.ti-layout-kanban:before{content:"\ec3f"}.ti-layout-list:before{content:"\ec14"}.ti-layout-navbar:before{content:"\ead7"}.ti-layout-navbar-collapse:before{content:"\f28d"}.ti-layout-navbar-expand:before{content:"\f28e"}.ti-layout-off:before{content:"\f151"}.ti-layout-rows:before{content:"\ead8"}.ti-layout-sidebar:before{content:"\eada"}.ti-layout-sidebar-left-collapse:before{content:"\f004"}.ti-layout-sidebar-left-expand:before{content:"\f005"}.ti-layout-sidebar-right:before{content:"\ead9"}.ti-layout-sidebar-right-collapse:before{content:"\f006"}.ti-layout-sidebar-right-expand:before{content:"\f007"}.ti-leaf:before{content:"\ed4f"}.ti-leaf-off:before{content:"\f400"}.ti-lego:before{content:"\eadc"}.ti-lego-off:before{content:"\f401"}.ti-lemon:before{content:"\ef10"}.ti-lemon-2:before{content:"\ef81"}.ti-letter-a:before{content:"\ec50"}.ti-letter-b:before{content:"\ec51"}.ti-letter-c:before{content:"\ec52"}.ti-letter-case:before{content:"\eea5"}.ti-letter-case-lower:before{content:"\eea2"}.ti-letter-case-toggle:before{content:"\eea3"}.ti-letter-case-upper:before{content:"\eea4"}.ti-letter-d:before{content:"\ec53"}.ti-letter-e:before{content:"\ec54"}.ti-letter-f:before{content:"\ec55"}.ti-letter-g:before{content:"\ec56"}.ti-letter-h:before{content:"\ec57"}.ti-letter-i:before{content:"\ec58"}.ti-letter-j:before{content:"\ec59"}.ti-letter-k:before{content:"\ec5a"}.ti-letter-l:before{content:"\ec5b"}.ti-letter-m:before{content:"\ec5c"}.ti-letter-n:before{content:"\ec5d"}.ti-letter-o:before{content:"\ec5e"}.ti-letter-p:before{content:"\ec5f"}.ti-letter-q:before{content:"\ec60"}.ti-letter-r:before{content:"\ec61"}.ti-letter-s:before{content:"\ec62"}.ti-letter-spacing:before{content:"\eea6"}.ti-letter-t:before{content:"\ec63"}.ti-letter-u:before{content:"\ec64"}.ti-letter-v:before{content:"\ec65"}.ti-letter-w:before{content:"\ec66"}.ti-letter-x:before{content:"\ec67"}.ti-letter-y:before{content:"\ec68"}.ti-letter-z:before{content:"\ec69"}.ti-license:before{content:"\ebc0"}.ti-license-off:before{content:"\f153"}.ti-lifebuoy:before{content:"\eadd"}.ti-lifebuoy-off:before{content:"\f154"}.ti-lighter:before{content:"\f794"}.ti-line:before{content:"\ec40"}.ti-line-dashed:before{content:"\eea7"}.ti-line-dotted:before{content:"\eea8"}.ti-line-height:before{content:"\eb94"}.ti-link:before{content:"\eade"}.ti-link-off:before{content:"\f402"}.ti-list:before{content:"\eb6b"}.ti-list-check:before{content:"\eb6a"}.ti-list-details:before{content:"\ef40"}.ti-list-numbers:before{content:"\ef11"}.ti-list-search:before{content:"\eea9"}.ti-live-photo:before{content:"\eadf"}.ti-live-photo-off:before{content:"\f403"}.ti-live-view:before{content:"\ec6b"}.ti-loader:before{content:"\eca3"}.ti-loader-2:before{content:"\f226"}.ti-loader-3:before{content:"\f513"}.ti-loader-quarter:before{content:"\eca2"}.ti-location:before{content:"\eae0"}.ti-location-broken:before{content:"\f2c4"}.ti-location-filled:before{content:"\f67f"}.ti-location-off:before{content:"\f155"}.ti-lock:before{content:"\eae2"}.ti-lock-access:before{content:"\eeaa"}.ti-lock-access-off:before{content:"\f404"}.ti-lock-bolt:before{content:"\f924"}.ti-lock-cancel:before{content:"\f925"}.ti-lock-check:before{content:"\f926"}.ti-lock-code:before{content:"\f927"}.ti-lock-cog:before{content:"\f928"}.ti-lock-dollar:before{content:"\f929"}.ti-lock-down:before{content:"\f92a"}.ti-lock-exclamation:before{content:"\f92b"}.ti-lock-heart:before{content:"\f92c"}.ti-lock-minus:before{content:"\f92d"}.ti-lock-off:before{content:"\ed1e"}.ti-lock-open:before{content:"\eae1"}.ti-lock-open-off:before{content:"\f156"}.ti-lock-pause:before{content:"\f92e"}.ti-lock-pin:before{content:"\f92f"}.ti-lock-plus:before{content:"\f930"}.ti-lock-question:before{content:"\f931"}.ti-lock-search:before{content:"\f932"}.ti-lock-share:before{content:"\f933"}.ti-lock-square:before{content:"\ef51"}.ti-lock-square-rounded:before{content:"\f636"}.ti-lock-square-rounded-filled:before{content:"\f6da"}.ti-lock-star:before{content:"\f934"}.ti-lock-up:before{content:"\f935"}.ti-lock-x:before{content:"\f936"}.ti-logic-and:before{content:"\f240"}.ti-logic-buffer:before{content:"\f241"}.ti-logic-nand:before{content:"\f242"}.ti-logic-nor:before{content:"\f243"}.ti-logic-not:before{content:"\f244"}.ti-logic-or:before{content:"\f245"}.ti-logic-xnor:before{content:"\f246"}.ti-logic-xor:before{content:"\f247"}.ti-login:before{content:"\eba7"}.ti-logout:before{content:"\eba8"}.ti-lollipop:before{content:"\efcc"}.ti-lollipop-off:before{content:"\f157"}.ti-luggage:before{content:"\efad"}.ti-luggage-off:before{content:"\f158"}.ti-lungs:before{content:"\ef62"}.ti-lungs-off:before{content:"\f405"}.ti-macro:before{content:"\eeab"}.ti-macro-off:before{content:"\f406"}.ti-magnet:before{content:"\eae3"}.ti-magnet-off:before{content:"\f159"}.ti-mail:before{content:"\eae5"}.ti-mail-bolt:before{content:"\f937"}.ti-mail-cancel:before{content:"\f938"}.ti-mail-check:before{content:"\f939"}.ti-mail-code:before{content:"\f93a"}.ti-mail-cog:before{content:"\f93b"}.ti-mail-dollar:before{content:"\f93c"}.ti-mail-down:before{content:"\f93d"}.ti-mail-exclamation:before{content:"\f93e"}.ti-mail-fast:before{content:"\f069"}.ti-mail-forward:before{content:"\eeac"}.ti-mail-heart:before{content:"\f93f"}.ti-mail-minus:before{content:"\f940"}.ti-mail-off:before{content:"\f15a"}.ti-mail-opened:before{content:"\eae4"}.ti-mail-pause:before{content:"\f941"}.ti-mail-pin:before{content:"\f942"}.ti-mail-plus:before{content:"\f943"}.ti-mail-question:before{content:"\f944"}.ti-mail-search:before{content:"\f945"}.ti-mail-share:before{content:"\f946"}.ti-mail-star:before{content:"\f947"}.ti-mail-up:before{content:"\f948"}.ti-mail-x:before{content:"\f949"}.ti-mailbox:before{content:"\eead"}.ti-mailbox-off:before{content:"\f15b"}.ti-man:before{content:"\eae6"}.ti-manual-gearbox:before{content:"\ed7b"}.ti-map:before{content:"\eae9"}.ti-map-2:before{content:"\eae7"}.ti-map-off:before{content:"\f15c"}.ti-map-pin:before{content:"\eae8"}.ti-map-pin-bolt:before{content:"\f94a"}.ti-map-pin-cancel:before{content:"\f94b"}.ti-map-pin-check:before{content:"\f94c"}.ti-map-pin-code:before{content:"\f94d"}.ti-map-pin-cog:before{content:"\f94e"}.ti-map-pin-dollar:before{content:"\f94f"}.ti-map-pin-down:before{content:"\f950"}.ti-map-pin-exclamation:before{content:"\f951"}.ti-map-pin-filled:before{content:"\f680"}.ti-map-pin-heart:before{content:"\f952"}.ti-map-pin-minus:before{content:"\f953"}.ti-map-pin-off:before{content:"\ecf3"}.ti-map-pin-pause:before{content:"\f954"}.ti-map-pin-pin:before{content:"\f955"}.ti-map-pin-plus:before{content:"\f956"}.ti-map-pin-question:before{content:"\f957"}.ti-map-pin-search:before{content:"\f958"}.ti-map-pin-share:before{content:"\f795"}.ti-map-pin-star:before{content:"\f959"}.ti-map-pin-up:before{content:"\f95a"}.ti-map-pin-x:before{content:"\f95b"}.ti-map-pins:before{content:"\ed5e"}.ti-map-search:before{content:"\ef82"}.ti-markdown:before{content:"\ec41"}.ti-markdown-off:before{content:"\f407"}.ti-marquee:before{content:"\ec77"}.ti-marquee-2:before{content:"\eeae"}.ti-marquee-off:before{content:"\f15d"}.ti-mars:before{content:"\ec80"}.ti-mask:before{content:"\eeb0"}.ti-mask-off:before{content:"\eeaf"}.ti-masks-theater:before{content:"\f263"}.ti-masks-theater-off:before{content:"\f408"}.ti-massage:before{content:"\eeb1"}.ti-matchstick:before{content:"\f577"}.ti-math:before{content:"\ebeb"}.ti-math-1-divide-2:before{content:"\f4e2"}.ti-math-1-divide-3:before{content:"\f4e3"}.ti-math-avg:before{content:"\f0f4"}.ti-math-equal-greater:before{content:"\f4e4"}.ti-math-equal-lower:before{content:"\f4e5"}.ti-math-function:before{content:"\eeb2"}.ti-math-function-off:before{content:"\f15e"}.ti-math-function-y:before{content:"\f4e6"}.ti-math-greater:before{content:"\f4e7"}.ti-math-integral:before{content:"\f4e9"}.ti-math-integral-x:before{content:"\f4e8"}.ti-math-integrals:before{content:"\f4ea"}.ti-math-lower:before{content:"\f4eb"}.ti-math-max:before{content:"\f0f5"}.ti-math-min:before{content:"\f0f6"}.ti-math-not:before{content:"\f4ec"}.ti-math-off:before{content:"\f409"}.ti-math-pi:before{content:"\f4ee"}.ti-math-pi-divide-2:before{content:"\f4ed"}.ti-math-symbols:before{content:"\eeb3"}.ti-math-x-divide-2:before{content:"\f4ef"}.ti-math-x-divide-y:before{content:"\f4f1"}.ti-math-x-divide-y-2:before{content:"\f4f0"}.ti-math-x-minus-x:before{content:"\f4f2"}.ti-math-x-minus-y:before{content:"\f4f3"}.ti-math-x-plus-x:before{content:"\f4f4"}.ti-math-x-plus-y:before{content:"\f4f5"}.ti-math-xy:before{content:"\f4f6"}.ti-math-y-minus-y:before{content:"\f4f7"}.ti-math-y-plus-y:before{content:"\f4f8"}.ti-maximize:before{content:"\eaea"}.ti-maximize-off:before{content:"\f15f"}.ti-meat:before{content:"\ef12"}.ti-meat-off:before{content:"\f40a"}.ti-medal:before{content:"\ec78"}.ti-medal-2:before{content:"\efcd"}.ti-medical-cross:before{content:"\ec2f"}.ti-medical-cross-filled:before{content:"\f681"}.ti-medical-cross-off:before{content:"\f160"}.ti-medicine-syrup:before{content:"\ef63"}.ti-meeple:before{content:"\f514"}.ti-menorah:before{content:"\f58c"}.ti-menu:before{content:"\eaeb"}.ti-menu-2:before{content:"\ec42"}.ti-menu-order:before{content:"\f5f5"}.ti-message:before{content:"\eaef"}.ti-message-2:before{content:"\eaec"}.ti-message-2-bolt:before{content:"\f95c"}.ti-message-2-cancel:before{content:"\f95d"}.ti-message-2-check:before{content:"\f95e"}.ti-message-2-code:before{content:"\f012"}.ti-message-2-cog:before{content:"\f95f"}.ti-message-2-dollar:before{content:"\f960"}.ti-message-2-down:before{content:"\f961"}.ti-message-2-exclamation:before{content:"\f962"}.ti-message-2-heart:before{content:"\f963"}.ti-message-2-minus:before{content:"\f964"}.ti-message-2-off:before{content:"\f40b"}.ti-message-2-pause:before{content:"\f965"}.ti-message-2-pin:before{content:"\f966"}.ti-message-2-plus:before{content:"\f967"}.ti-message-2-question:before{content:"\f968"}.ti-message-2-search:before{content:"\f969"}.ti-message-2-share:before{content:"\f077"}.ti-message-2-star:before{content:"\f96a"}.ti-message-2-up:before{content:"\f96b"}.ti-message-2-x:before{content:"\f96c"}.ti-message-bolt:before{content:"\f96d"}.ti-message-cancel:before{content:"\f96e"}.ti-message-chatbot:before{content:"\f38a"}.ti-message-check:before{content:"\f96f"}.ti-message-circle:before{content:"\eaed"}.ti-message-circle-2:before{content:"\ed3f"}.ti-message-circle-2-filled:before{content:"\f682"}.ti-message-circle-bolt:before{content:"\f970"}.ti-message-circle-cancel:before{content:"\f971"}.ti-message-circle-check:before{content:"\f972"}.ti-message-circle-code:before{content:"\f973"}.ti-message-circle-cog:before{content:"\f974"}.ti-message-circle-dollar:before{content:"\f975"}.ti-message-circle-down:before{content:"\f976"}.ti-message-circle-exclamation:before{content:"\f977"}.ti-message-circle-heart:before{content:"\f978"}.ti-message-circle-minus:before{content:"\f979"}.ti-message-circle-off:before{content:"\ed40"}.ti-message-circle-pause:before{content:"\f97a"}.ti-message-circle-pin:before{content:"\f97b"}.ti-message-circle-plus:before{content:"\f97c"}.ti-message-circle-question:before{content:"\f97d"}.ti-message-circle-search:before{content:"\f97e"}.ti-message-circle-share:before{content:"\f97f"}.ti-message-circle-star:before{content:"\f980"}.ti-message-circle-up:before{content:"\f981"}.ti-message-circle-x:before{content:"\f982"}.ti-message-code:before{content:"\f013"}.ti-message-cog:before{content:"\f983"}.ti-message-dollar:before{content:"\f984"}.ti-message-dots:before{content:"\eaee"}.ti-message-down:before{content:"\f985"}.ti-message-exclamation:before{content:"\f986"}.ti-message-forward:before{content:"\f28f"}.ti-message-heart:before{content:"\f987"}.ti-message-language:before{content:"\efae"}.ti-message-minus:before{content:"\f988"}.ti-message-off:before{content:"\ed41"}.ti-message-pause:before{content:"\f989"}.ti-message-pin:before{content:"\f98a"}.ti-message-plus:before{content:"\ec9a"}.ti-message-question:before{content:"\f98b"}.ti-message-report:before{content:"\ec9b"}.ti-message-search:before{content:"\f98c"}.ti-message-share:before{content:"\f078"}.ti-message-star:before{content:"\f98d"}.ti-message-up:before{content:"\f98e"}.ti-message-x:before{content:"\f98f"}.ti-messages:before{content:"\eb6c"}.ti-messages-off:before{content:"\ed42"}.ti-meteor:before{content:"\f1fd"}.ti-meteor-off:before{content:"\f40c"}.ti-mickey:before{content:"\f2a3"}.ti-mickey-filled:before{content:"\f683"}.ti-microphone:before{content:"\eaf0"}.ti-microphone-2:before{content:"\ef2c"}.ti-microphone-2-off:before{content:"\f40d"}.ti-microphone-off:before{content:"\ed16"}.ti-microscope:before{content:"\ef64"}.ti-microscope-off:before{content:"\f40e"}.ti-microwave:before{content:"\f248"}.ti-microwave-off:before{content:"\f264"}.ti-military-award:before{content:"\f079"}.ti-military-rank:before{content:"\efcf"}.ti-milk:before{content:"\ef13"}.ti-milk-off:before{content:"\f40f"}.ti-milkshake:before{content:"\f4c8"}.ti-minimize:before{content:"\eaf1"}.ti-minus:before{content:"\eaf2"}.ti-minus-vertical:before{content:"\eeb4"}.ti-mist:before{content:"\ec30"}.ti-mist-off:before{content:"\f410"}.ti-mobiledata:before{content:"\f9f5"}.ti-mobiledata-off:before{content:"\f9f4"}.ti-moneybag:before{content:"\f506"}.ti-mood-angry:before{content:"\f2de"}.ti-mood-annoyed:before{content:"\f2e0"}.ti-mood-annoyed-2:before{content:"\f2df"}.ti-mood-boy:before{content:"\ed2d"}.ti-mood-check:before{content:"\f7b3"}.ti-mood-cog:before{content:"\f7b4"}.ti-mood-confuzed:before{content:"\eaf3"}.ti-mood-confuzed-filled:before{content:"\f7f2"}.ti-mood-crazy-happy:before{content:"\ed90"}.ti-mood-cry:before{content:"\ecbb"}.ti-mood-dollar:before{content:"\f7b5"}.ti-mood-empty:before{content:"\eeb5"}.ti-mood-empty-filled:before{content:"\f7f3"}.ti-mood-happy:before{content:"\eaf4"}.ti-mood-happy-filled:before{content:"\f7f4"}.ti-mood-heart:before{content:"\f7b6"}.ti-mood-kid:before{content:"\ec03"}.ti-mood-kid-filled:before{content:"\f7f5"}.ti-mood-look-left:before{content:"\f2c5"}.ti-mood-look-right:before{content:"\f2c6"}.ti-mood-minus:before{content:"\f7b7"}.ti-mood-nerd:before{content:"\f2e1"}.ti-mood-nervous:before{content:"\ef96"}.ti-mood-neutral:before{content:"\eaf5"}.ti-mood-neutral-filled:before{content:"\f7f6"}.ti-mood-off:before{content:"\f161"}.ti-mood-pin:before{content:"\f7b8"}.ti-mood-plus:before{content:"\f7b9"}.ti-mood-sad:before{content:"\eaf6"}.ti-mood-sad-2:before{content:"\f2e2"}.ti-mood-sad-dizzy:before{content:"\f2e3"}.ti-mood-sad-filled:before{content:"\f7f7"}.ti-mood-sad-squint:before{content:"\f2e4"}.ti-mood-search:before{content:"\f7ba"}.ti-mood-sick:before{content:"\f2e5"}.ti-mood-silence:before{content:"\f2e6"}.ti-mood-sing:before{content:"\f2c7"}.ti-mood-smile:before{content:"\eaf7"}.ti-mood-smile-beam:before{content:"\f2e7"}.ti-mood-smile-dizzy:before{content:"\f2e8"}.ti-mood-smile-filled:before{content:"\f7f8"}.ti-mood-suprised:before{content:"\ec04"}.ti-mood-tongue:before{content:"\eb95"}.ti-mood-tongue-wink:before{content:"\f2ea"}.ti-mood-tongue-wink-2:before{content:"\f2e9"}.ti-mood-unamused:before{content:"\f2eb"}.ti-mood-up:before{content:"\f7bb"}.ti-mood-wink:before{content:"\f2ed"}.ti-mood-wink-2:before{content:"\f2ec"}.ti-mood-wrrr:before{content:"\f2ee"}.ti-mood-x:before{content:"\f7bc"}.ti-mood-xd:before{content:"\f2ef"}.ti-moon:before{content:"\eaf8"}.ti-moon-2:before{content:"\ece6"}.ti-moon-filled:before{content:"\f684"}.ti-moon-off:before{content:"\f162"}.ti-moon-stars:before{content:"\ece7"}.ti-moped:before{content:"\ecbc"}.ti-motorbike:before{content:"\eeb6"}.ti-mountain:before{content:"\ef97"}.ti-mountain-off:before{content:"\f411"}.ti-mouse:before{content:"\eaf9"}.ti-mouse-2:before{content:"\f1d7"}.ti-mouse-off:before{content:"\f163"}.ti-moustache:before{content:"\f4c9"}.ti-movie:before{content:"\eafa"}.ti-movie-off:before{content:"\f164"}.ti-mug:before{content:"\eafb"}.ti-mug-off:before{content:"\f165"}.ti-multiplier-0-5x:before{content:"\ef41"}.ti-multiplier-1-5x:before{content:"\ef42"}.ti-multiplier-1x:before{content:"\ef43"}.ti-multiplier-2x:before{content:"\ef44"}.ti-mushroom:before{content:"\ef14"}.ti-mushroom-filled:before{content:"\f7f9"}.ti-mushroom-off:before{content:"\f412"}.ti-music:before{content:"\eafc"}.ti-music-off:before{content:"\f166"}.ti-navigation:before{content:"\f2c8"}.ti-navigation-filled:before{content:"\f685"}.ti-navigation-off:before{content:"\f413"}.ti-needle:before{content:"\f508"}.ti-needle-thread:before{content:"\f507"}.ti-network:before{content:"\f09f"}.ti-network-off:before{content:"\f414"}.ti-new-section:before{content:"\ebc1"}.ti-news:before{content:"\eafd"}.ti-news-off:before{content:"\f167"}.ti-nfc:before{content:"\eeb7"}.ti-nfc-off:before{content:"\f168"}.ti-no-copyright:before{content:"\efb9"}.ti-no-creative-commons:before{content:"\efba"}.ti-no-derivatives:before{content:"\efbb"}.ti-north-star:before{content:"\f014"}.ti-note:before{content:"\eb6d"}.ti-note-off:before{content:"\f169"}.ti-notebook:before{content:"\eb96"}.ti-notebook-off:before{content:"\f415"}.ti-notes:before{content:"\eb6e"}.ti-notes-off:before{content:"\f16a"}.ti-notification:before{content:"\eafe"}.ti-notification-off:before{content:"\f16b"}.ti-number:before{content:"\f1fe"}.ti-number-0:before{content:"\edf0"}.ti-number-1:before{content:"\edf1"}.ti-number-2:before{content:"\edf2"}.ti-number-3:before{content:"\edf3"}.ti-number-4:before{content:"\edf4"}.ti-number-5:before{content:"\edf5"}.ti-number-6:before{content:"\edf6"}.ti-number-7:before{content:"\edf7"}.ti-number-8:before{content:"\edf8"}.ti-number-9:before{content:"\edf9"}.ti-numbers:before{content:"\f015"}.ti-nurse:before{content:"\ef65"}.ti-octagon:before{content:"\ecbd"}.ti-octagon-filled:before{content:"\f686"}.ti-octagon-off:before{content:"\eeb8"}.ti-old:before{content:"\eeb9"}.ti-olympics:before{content:"\eeba"}.ti-olympics-off:before{content:"\f416"}.ti-om:before{content:"\f58d"}.ti-omega:before{content:"\eb97"}.ti-outbound:before{content:"\f249"}.ti-outlet:before{content:"\ebd7"}.ti-oval:before{content:"\f02e"}.ti-oval-filled:before{content:"\f687"}.ti-oval-vertical:before{content:"\f02d"}.ti-oval-vertical-filled:before{content:"\f688"}.ti-overline:before{content:"\eebb"}.ti-package:before{content:"\eaff"}.ti-package-export:before{content:"\f07a"}.ti-package-import:before{content:"\f07b"}.ti-package-off:before{content:"\f16c"}.ti-packages:before{content:"\f2c9"}.ti-pacman:before{content:"\eebc"}.ti-page-break:before{content:"\ec81"}.ti-paint:before{content:"\eb00"}.ti-paint-filled:before{content:"\f75f"}.ti-paint-off:before{content:"\f16d"}.ti-palette:before{content:"\eb01"}.ti-palette-off:before{content:"\f16e"}.ti-panorama-horizontal:before{content:"\ed33"}.ti-panorama-horizontal-off:before{content:"\f417"}.ti-panorama-vertical:before{content:"\ed34"}.ti-panorama-vertical-off:before{content:"\f418"}.ti-paper-bag:before{content:"\f02f"}.ti-paper-bag-off:before{content:"\f16f"}.ti-paperclip:before{content:"\eb02"}.ti-parachute:before{content:"\ed7c"}.ti-parachute-off:before{content:"\f170"}.ti-parentheses:before{content:"\ebd8"}.ti-parentheses-off:before{content:"\f171"}.ti-parking:before{content:"\eb03"}.ti-parking-off:before{content:"\f172"}.ti-password:before{content:"\f4ca"}.ti-paw:before{content:"\eff9"}.ti-paw-filled:before{content:"\f689"}.ti-paw-off:before{content:"\f419"}.ti-pdf:before{content:"\f7ac"}.ti-peace:before{content:"\ecbe"}.ti-pencil:before{content:"\eb04"}.ti-pencil-minus:before{content:"\f1eb"}.ti-pencil-off:before{content:"\f173"}.ti-pencil-plus:before{content:"\f1ec"}.ti-pennant:before{content:"\ed7d"}.ti-pennant-2:before{content:"\f06a"}.ti-pennant-2-filled:before{content:"\f68a"}.ti-pennant-filled:before{content:"\f68b"}.ti-pennant-off:before{content:"\f174"}.ti-pentagon:before{content:"\efe3"}.ti-pentagon-filled:before{content:"\f68c"}.ti-pentagon-off:before{content:"\f41a"}.ti-pentagram:before{content:"\f586"}.ti-pepper:before{content:"\ef15"}.ti-pepper-off:before{content:"\f175"}.ti-percentage:before{content:"\ecf4"}.ti-perfume:before{content:"\f509"}.ti-perspective:before{content:"\eebd"}.ti-perspective-off:before{content:"\f176"}.ti-phone:before{content:"\eb09"}.ti-phone-call:before{content:"\eb05"}.ti-phone-calling:before{content:"\ec43"}.ti-phone-check:before{content:"\ec05"}.ti-phone-incoming:before{content:"\eb06"}.ti-phone-off:before{content:"\ecf5"}.ti-phone-outgoing:before{content:"\eb07"}.ti-phone-pause:before{content:"\eb08"}.ti-phone-plus:before{content:"\ec06"}.ti-phone-x:before{content:"\ec07"}.ti-photo:before{content:"\eb0a"}.ti-photo-bolt:before{content:"\f990"}.ti-photo-cancel:before{content:"\f35d"}.ti-photo-check:before{content:"\f35e"}.ti-photo-code:before{content:"\f991"}.ti-photo-cog:before{content:"\f992"}.ti-photo-dollar:before{content:"\f993"}.ti-photo-down:before{content:"\f35f"}.ti-photo-edit:before{content:"\f360"}.ti-photo-exclamation:before{content:"\f994"}.ti-photo-heart:before{content:"\f361"}.ti-photo-minus:before{content:"\f362"}.ti-photo-off:before{content:"\ecf6"}.ti-photo-pause:before{content:"\f995"}.ti-photo-pin:before{content:"\f996"}.ti-photo-plus:before{content:"\f363"}.ti-photo-question:before{content:"\f997"}.ti-photo-search:before{content:"\f364"}.ti-photo-sensor:before{content:"\f798"}.ti-photo-sensor-2:before{content:"\f796"}.ti-photo-sensor-3:before{content:"\f797"}.ti-photo-share:before{content:"\f998"}.ti-photo-shield:before{content:"\f365"}.ti-photo-star:before{content:"\f366"}.ti-photo-up:before{content:"\f38b"}.ti-photo-x:before{content:"\f367"}.ti-physotherapist:before{content:"\eebe"}.ti-picture-in-picture:before{content:"\ed35"}.ti-picture-in-picture-off:before{content:"\ed43"}.ti-picture-in-picture-on:before{content:"\ed44"}.ti-picture-in-picture-top:before{content:"\efe4"}.ti-pig:before{content:"\ef52"}.ti-pig-money:before{content:"\f38c"}.ti-pig-off:before{content:"\f177"}.ti-pilcrow:before{content:"\f5f6"}.ti-pill:before{content:"\ec44"}.ti-pill-off:before{content:"\f178"}.ti-pills:before{content:"\ef66"}.ti-pin:before{content:"\ec9c"}.ti-pin-filled:before{content:"\f68d"}.ti-ping-pong:before{content:"\f38d"}.ti-pinned:before{content:"\ed60"}.ti-pinned-filled:before{content:"\f68e"}.ti-pinned-off:before{content:"\ed5f"}.ti-pizza:before{content:"\edbb"}.ti-pizza-off:before{content:"\f179"}.ti-placeholder:before{content:"\f626"}.ti-plane:before{content:"\eb6f"}.ti-plane-arrival:before{content:"\eb99"}.ti-plane-departure:before{content:"\eb9a"}.ti-plane-inflight:before{content:"\ef98"}.ti-plane-off:before{content:"\f17a"}.ti-plane-tilt:before{content:"\f1ed"}.ti-planet:before{content:"\ec08"}.ti-planet-off:before{content:"\f17b"}.ti-plant:before{content:"\ed50"}.ti-plant-2:before{content:"\ed7e"}.ti-plant-2-off:before{content:"\f17c"}.ti-plant-off:before{content:"\f17d"}.ti-play-card:before{content:"\eebf"}.ti-play-card-off:before{content:"\f17e"}.ti-player-eject:before{content:"\efbc"}.ti-player-eject-filled:before{content:"\f68f"}.ti-player-pause:before{content:"\ed45"}.ti-player-pause-filled:before{content:"\f690"}.ti-player-play:before{content:"\ed46"}.ti-player-play-filled:before{content:"\f691"}.ti-player-record:before{content:"\ed47"}.ti-player-record-filled:before{content:"\f692"}.ti-player-skip-back:before{content:"\ed48"}.ti-player-skip-back-filled:before{content:"\f693"}.ti-player-skip-forward:before{content:"\ed49"}.ti-player-skip-forward-filled:before{content:"\f694"}.ti-player-stop:before{content:"\ed4a"}.ti-player-stop-filled:before{content:"\f695"}.ti-player-track-next:before{content:"\ed4b"}.ti-player-track-next-filled:before{content:"\f696"}.ti-player-track-prev:before{content:"\ed4c"}.ti-player-track-prev-filled:before{content:"\f697"}.ti-playlist:before{content:"\eec0"}.ti-playlist-add:before{content:"\f008"}.ti-playlist-off:before{content:"\f17f"}.ti-playlist-x:before{content:"\f009"}.ti-playstation-circle:before{content:"\f2ad"}.ti-playstation-square:before{content:"\f2ae"}.ti-playstation-triangle:before{content:"\f2af"}.ti-playstation-x:before{content:"\f2b0"}.ti-plug:before{content:"\ebd9"}.ti-plug-connected:before{content:"\f00a"}.ti-plug-connected-x:before{content:"\f0a0"}.ti-plug-off:before{content:"\f180"}.ti-plug-x:before{content:"\f0a1"}.ti-plus:before{content:"\eb0b"}.ti-plus-equal:before{content:"\f7ad"}.ti-plus-minus:before{content:"\f7ae"}.ti-png:before{content:"\f3ad"}.ti-podium:before{content:"\f1d8"}.ti-podium-off:before{content:"\f41b"}.ti-point:before{content:"\eb0c"}.ti-point-filled:before{content:"\f698"}.ti-point-off:before{content:"\f181"}.ti-pointer:before{content:"\f265"}.ti-pointer-bolt:before{content:"\f999"}.ti-pointer-cancel:before{content:"\f99a"}.ti-pointer-check:before{content:"\f99b"}.ti-pointer-code:before{content:"\f99c"}.ti-pointer-cog:before{content:"\f99d"}.ti-pointer-dollar:before{content:"\f99e"}.ti-pointer-down:before{content:"\f99f"}.ti-pointer-exclamation:before{content:"\f9a0"}.ti-pointer-heart:before{content:"\f9a1"}.ti-pointer-minus:before{content:"\f9a2"}.ti-pointer-off:before{content:"\f9a3"}.ti-pointer-pause:before{content:"\f9a4"}.ti-pointer-pin:before{content:"\f9a5"}.ti-pointer-plus:before{content:"\f9a6"}.ti-pointer-question:before{content:"\f9a7"}.ti-pointer-search:before{content:"\f9a8"}.ti-pointer-share:before{content:"\f9a9"}.ti-pointer-star:before{content:"\f9aa"}.ti-pointer-up:before{content:"\f9ab"}.ti-pointer-x:before{content:"\f9ac"}.ti-pokeball:before{content:"\eec1"}.ti-pokeball-off:before{content:"\f41c"}.ti-poker-chip:before{content:"\f515"}.ti-polaroid:before{content:"\eec2"}.ti-polygon:before{content:"\efd0"}.ti-polygon-off:before{content:"\f182"}.ti-poo:before{content:"\f258"}.ti-pool:before{content:"\ed91"}.ti-pool-off:before{content:"\f41d"}.ti-power:before{content:"\eb0d"}.ti-pray:before{content:"\ecbf"}.ti-premium-rights:before{content:"\efbd"}.ti-prescription:before{content:"\ef99"}.ti-presentation:before{content:"\eb70"}.ti-presentation-analytics:before{content:"\eec3"}.ti-presentation-off:before{content:"\f183"}.ti-printer:before{content:"\eb0e"}.ti-printer-off:before{content:"\f184"}.ti-prison:before{content:"\ef79"}.ti-prompt:before{content:"\eb0f"}.ti-propeller:before{content:"\eec4"}.ti-propeller-off:before{content:"\f185"}.ti-pumpkin-scary:before{content:"\f587"}.ti-puzzle:before{content:"\eb10"}.ti-puzzle-2:before{content:"\ef83"}.ti-puzzle-filled:before{content:"\f699"}.ti-puzzle-off:before{content:"\f186"}.ti-pyramid:before{content:"\eec5"}.ti-pyramid-off:before{content:"\f187"}.ti-qrcode:before{content:"\eb11"}.ti-qrcode-off:before{content:"\f41e"}.ti-question-mark:before{content:"\ec9d"}.ti-quote:before{content:"\efbe"}.ti-quote-off:before{content:"\f188"}.ti-radar:before{content:"\f017"}.ti-radar-2:before{content:"\f016"}.ti-radar-off:before{content:"\f41f"}.ti-radio:before{content:"\ef2d"}.ti-radio-off:before{content:"\f420"}.ti-radioactive:before{content:"\ecc0"}.ti-radioactive-filled:before{content:"\f760"}.ti-radioactive-off:before{content:"\f189"}.ti-radius-bottom-left:before{content:"\eec6"}.ti-radius-bottom-right:before{content:"\eec7"}.ti-radius-top-left:before{content:"\eec8"}.ti-radius-top-right:before{content:"\eec9"}.ti-rainbow:before{content:"\edbc"}.ti-rainbow-off:before{content:"\f18a"}.ti-rating-12-plus:before{content:"\f266"}.ti-rating-14-plus:before{content:"\f267"}.ti-rating-16-plus:before{content:"\f268"}.ti-rating-18-plus:before{content:"\f269"}.ti-rating-21-plus:before{content:"\f26a"}.ti-razor:before{content:"\f4b5"}.ti-razor-electric:before{content:"\f4b4"}.ti-receipt:before{content:"\edfd"}.ti-receipt-2:before{content:"\edfa"}.ti-receipt-off:before{content:"\edfb"}.ti-receipt-refund:before{content:"\edfc"}.ti-receipt-tax:before{content:"\edbd"}.ti-recharging:before{content:"\eeca"}.ti-record-mail:before{content:"\eb12"}.ti-record-mail-off:before{content:"\f18b"}.ti-rectangle:before{content:"\ed37"}.ti-rectangle-filled:before{content:"\f69a"}.ti-rectangle-vertical:before{content:"\ed36"}.ti-rectangle-vertical-filled:before{content:"\f69b"}.ti-recycle:before{content:"\eb9b"}.ti-recycle-off:before{content:"\f18c"}.ti-refresh:before{content:"\eb13"}.ti-refresh-alert:before{content:"\ed57"}.ti-refresh-dot:before{content:"\efbf"}.ti-refresh-off:before{content:"\f18d"}.ti-regex:before{content:"\f31f"}.ti-regex-off:before{content:"\f421"}.ti-registered:before{content:"\eb14"}.ti-relation-many-to-many:before{content:"\ed7f"}.ti-relation-one-to-many:before{content:"\ed80"}.ti-relation-one-to-one:before{content:"\ed81"}.ti-reload:before{content:"\f3ae"}.ti-repeat:before{content:"\eb72"}.ti-repeat-off:before{content:"\f18e"}.ti-repeat-once:before{content:"\eb71"}.ti-replace:before{content:"\ebc7"}.ti-replace-filled:before{content:"\f69c"}.ti-replace-off:before{content:"\f422"}.ti-report:before{content:"\eece"}.ti-report-analytics:before{content:"\eecb"}.ti-report-medical:before{content:"\eecc"}.ti-report-money:before{content:"\eecd"}.ti-report-off:before{content:"\f18f"}.ti-report-search:before{content:"\ef84"}.ti-reserved-line:before{content:"\f9f6"}.ti-resize:before{content:"\eecf"}.ti-ribbon-health:before{content:"\f58e"}.ti-ripple:before{content:"\ed82"}.ti-ripple-off:before{content:"\f190"}.ti-road:before{content:"\f018"}.ti-road-off:before{content:"\f191"}.ti-road-sign:before{content:"\ecdd"}.ti-robot:before{content:"\f00b"}.ti-robot-off:before{content:"\f192"}.ti-rocket:before{content:"\ec45"}.ti-rocket-off:before{content:"\f193"}.ti-roller-skating:before{content:"\efd1"}.ti-rollercoaster:before{content:"\f0a2"}.ti-rollercoaster-off:before{content:"\f423"}.ti-rosette:before{content:"\f599"}.ti-rosette-filled:before{content:"\f69d"}.ti-rosette-number-0:before{content:"\f58f"}.ti-rosette-number-1:before{content:"\f590"}.ti-rosette-number-2:before{content:"\f591"}.ti-rosette-number-3:before{content:"\f592"}.ti-rosette-number-4:before{content:"\f593"}.ti-rosette-number-5:before{content:"\f594"}.ti-rosette-number-6:before{content:"\f595"}.ti-rosette-number-7:before{content:"\f596"}.ti-rosette-number-8:before{content:"\f597"}.ti-rosette-number-9:before{content:"\f598"}.ti-rotate:before{content:"\eb16"}.ti-rotate-2:before{content:"\ebb4"}.ti-rotate-360:before{content:"\ef85"}.ti-rotate-clockwise:before{content:"\eb15"}.ti-rotate-clockwise-2:before{content:"\ebb5"}.ti-rotate-dot:before{content:"\efe5"}.ti-rotate-rectangle:before{content:"\ec15"}.ti-route:before{content:"\eb17"}.ti-route-2:before{content:"\f4b6"}.ti-route-off:before{content:"\f194"}.ti-router:before{content:"\eb18"}.ti-router-off:before{content:"\f424"}.ti-row-insert-bottom:before{content:"\eed0"}.ti-row-insert-top:before{content:"\eed1"}.ti-rss:before{content:"\eb19"}.ti-rubber-stamp:before{content:"\f5ab"}.ti-rubber-stamp-off:before{content:"\f5aa"}.ti-ruler:before{content:"\eb1a"}.ti-ruler-2:before{content:"\eed2"}.ti-ruler-2-off:before{content:"\f195"}.ti-ruler-3:before{content:"\f290"}.ti-ruler-measure:before{content:"\f291"}.ti-ruler-off:before{content:"\f196"}.ti-run:before{content:"\ec82"}.ti-s-turn-down:before{content:"\f516"}.ti-s-turn-left:before{content:"\f517"}.ti-s-turn-right:before{content:"\f518"}.ti-s-turn-up:before{content:"\f519"}.ti-sailboat:before{content:"\ec83"}.ti-sailboat-2:before{content:"\f5f7"}.ti-sailboat-off:before{content:"\f425"}.ti-salad:before{content:"\f50a"}.ti-salt:before{content:"\ef16"}.ti-satellite:before{content:"\eed3"}.ti-satellite-off:before{content:"\f197"}.ti-sausage:before{content:"\ef17"}.ti-scale:before{content:"\ebc2"}.ti-scale-off:before{content:"\f198"}.ti-scale-outline:before{content:"\ef53"}.ti-scale-outline-off:before{content:"\f199"}.ti-scan:before{content:"\ebc8"}.ti-scan-eye:before{content:"\f1ff"}.ti-schema:before{content:"\f200"}.ti-schema-off:before{content:"\f426"}.ti-school:before{content:"\ecf7"}.ti-school-bell:before{content:"\f64a"}.ti-school-off:before{content:"\f19a"}.ti-scissors:before{content:"\eb1b"}.ti-scissors-off:before{content:"\f19b"}.ti-scooter:before{content:"\ec6c"}.ti-scooter-electric:before{content:"\ecc1"}.ti-screen-share:before{content:"\ed18"}.ti-screen-share-off:before{content:"\ed17"}.ti-screenshot:before{content:"\f201"}.ti-scribble:before{content:"\f0a3"}.ti-scribble-off:before{content:"\f427"}.ti-script:before{content:"\f2da"}.ti-script-minus:before{content:"\f2d7"}.ti-script-plus:before{content:"\f2d8"}.ti-script-x:before{content:"\f2d9"}.ti-scuba-mask:before{content:"\eed4"}.ti-scuba-mask-off:before{content:"\f428"}.ti-sdk:before{content:"\f3af"}.ti-search:before{content:"\eb1c"}.ti-search-off:before{content:"\f19c"}.ti-section:before{content:"\eed5"}.ti-section-sign:before{content:"\f019"}.ti-seeding:before{content:"\ed51"}.ti-seeding-off:before{content:"\f19d"}.ti-select:before{content:"\ec9e"}.ti-select-all:before{content:"\f9f7"}.ti-selector:before{content:"\eb1d"}.ti-send:before{content:"\eb1e"}.ti-send-off:before{content:"\f429"}.ti-seo:before{content:"\f26b"}.ti-separator:before{content:"\ebda"}.ti-separator-horizontal:before{content:"\ec79"}.ti-separator-vertical:before{content:"\ec7a"}.ti-server:before{content:"\eb1f"}.ti-server-2:before{content:"\f07c"}.ti-server-bolt:before{content:"\f320"}.ti-server-cog:before{content:"\f321"}.ti-server-off:before{content:"\f19e"}.ti-servicemark:before{content:"\ec09"}.ti-settings:before{content:"\eb20"}.ti-settings-2:before{content:"\f5ac"}.ti-settings-automation:before{content:"\eed6"}.ti-settings-bolt:before{content:"\f9ad"}.ti-settings-cancel:before{content:"\f9ae"}.ti-settings-check:before{content:"\f9af"}.ti-settings-code:before{content:"\f9b0"}.ti-settings-cog:before{content:"\f9b1"}.ti-settings-dollar:before{content:"\f9b2"}.ti-settings-down:before{content:"\f9b3"}.ti-settings-exclamation:before{content:"\f9b4"}.ti-settings-filled:before{content:"\f69e"}.ti-settings-heart:before{content:"\f9b5"}.ti-settings-minus:before{content:"\f9b6"}.ti-settings-off:before{content:"\f19f"}.ti-settings-pause:before{content:"\f9b7"}.ti-settings-pin:before{content:"\f9b8"}.ti-settings-plus:before{content:"\f9b9"}.ti-settings-question:before{content:"\f9ba"}.ti-settings-search:before{content:"\f9bb"}.ti-settings-share:before{content:"\f9bc"}.ti-settings-star:before{content:"\f9bd"}.ti-settings-up:before{content:"\f9be"}.ti-settings-x:before{content:"\f9bf"}.ti-shadow:before{content:"\eed8"}.ti-shadow-off:before{content:"\eed7"}.ti-shape:before{content:"\eb9c"}.ti-shape-2:before{content:"\eed9"}.ti-shape-3:before{content:"\eeda"}.ti-shape-off:before{content:"\f1a0"}.ti-share:before{content:"\eb21"}.ti-share-2:before{content:"\f799"}.ti-share-3:before{content:"\f7bd"}.ti-share-off:before{content:"\f1a1"}.ti-shield:before{content:"\eb24"}.ti-shield-bolt:before{content:"\f9c0"}.ti-shield-cancel:before{content:"\f9c1"}.ti-shield-check:before{content:"\eb22"}.ti-shield-check-filled:before{content:"\f761"}.ti-shield-checkered:before{content:"\ef9a"}.ti-shield-checkered-filled:before{content:"\f762"}.ti-shield-chevron:before{content:"\ef9b"}.ti-shield-code:before{content:"\f9c2"}.ti-shield-cog:before{content:"\f9c3"}.ti-shield-dollar:before{content:"\f9c4"}.ti-shield-down:before{content:"\f9c5"}.ti-shield-exclamation:before{content:"\f9c6"}.ti-shield-filled:before{content:"\f69f"}.ti-shield-half:before{content:"\f358"}.ti-shield-half-filled:before{content:"\f357"}.ti-shield-heart:before{content:"\f9c7"}.ti-shield-lock:before{content:"\ed58"}.ti-shield-lock-filled:before{content:"\f763"}.ti-shield-minus:before{content:"\f9c8"}.ti-shield-off:before{content:"\ecf8"}.ti-shield-pause:before{content:"\f9c9"}.ti-shield-pin:before{content:"\f9ca"}.ti-shield-plus:before{content:"\f9cb"}.ti-shield-question:before{content:"\f9cc"}.ti-shield-search:before{content:"\f9cd"}.ti-shield-share:before{content:"\f9ce"}.ti-shield-star:before{content:"\f9cf"}.ti-shield-up:before{content:"\f9d0"}.ti-shield-x:before{content:"\eb23"}.ti-ship:before{content:"\ec84"}.ti-ship-off:before{content:"\f42a"}.ti-shirt:before{content:"\ec0a"}.ti-shirt-filled:before{content:"\f6a0"}.ti-shirt-off:before{content:"\f1a2"}.ti-shirt-sport:before{content:"\f26c"}.ti-shoe:before{content:"\efd2"}.ti-shoe-off:before{content:"\f1a4"}.ti-shopping-bag:before{content:"\f5f8"}.ti-shopping-cart:before{content:"\eb25"}.ti-shopping-cart-discount:before{content:"\eedb"}.ti-shopping-cart-off:before{content:"\eedc"}.ti-shopping-cart-plus:before{content:"\eedd"}.ti-shopping-cart-x:before{content:"\eede"}.ti-shovel:before{content:"\f1d9"}.ti-shredder:before{content:"\eedf"}.ti-sign-left:before{content:"\f06b"}.ti-sign-left-filled:before{content:"\f6a1"}.ti-sign-right:before{content:"\f06c"}.ti-sign-right-filled:before{content:"\f6a2"}.ti-signal-2g:before{content:"\f79a"}.ti-signal-3g:before{content:"\f1ee"}.ti-signal-4g:before{content:"\f1ef"}.ti-signal-4g-plus:before{content:"\f259"}.ti-signal-5g:before{content:"\f1f0"}.ti-signal-6g:before{content:"\f9f8"}.ti-signal-e:before{content:"\f9f9"}.ti-signal-g:before{content:"\f9fa"}.ti-signal-h:before{content:"\f9fc"}.ti-signal-h-plus:before{content:"\f9fb"}.ti-signal-lte:before{content:"\f9fd"}.ti-signature:before{content:"\eee0"}.ti-signature-off:before{content:"\f1a5"}.ti-sitemap:before{content:"\eb9d"}.ti-sitemap-off:before{content:"\f1a6"}.ti-skateboard:before{content:"\ecc2"}.ti-skateboard-off:before{content:"\f42b"}.ti-skull:before{content:"\f292"}.ti-slash:before{content:"\f4f9"}.ti-slashes:before{content:"\f588"}.ti-sleigh:before{content:"\ef9c"}.ti-slice:before{content:"\ebdb"}.ti-slideshow:before{content:"\ebc9"}.ti-smart-home:before{content:"\ecde"}.ti-smart-home-off:before{content:"\f1a7"}.ti-smoking:before{content:"\ecc4"}.ti-smoking-no:before{content:"\ecc3"}.ti-snowflake:before{content:"\ec0b"}.ti-snowflake-off:before{content:"\f1a8"}.ti-snowman:before{content:"\f26d"}.ti-soccer-field:before{content:"\ed92"}.ti-social:before{content:"\ebec"}.ti-social-off:before{content:"\f1a9"}.ti-sock:before{content:"\eee1"}.ti-sofa:before{content:"\efaf"}.ti-sofa-off:before{content:"\f42c"}.ti-solar-panel:before{content:"\f7bf"}.ti-solar-panel-2:before{content:"\f7be"}.ti-sort-0-9:before{content:"\f54d"}.ti-sort-9-0:before{content:"\f54e"}.ti-sort-a-z:before{content:"\f54f"}.ti-sort-ascending:before{content:"\eb26"}.ti-sort-ascending-2:before{content:"\eee2"}.ti-sort-ascending-letters:before{content:"\ef18"}.ti-sort-ascending-numbers:before{content:"\ef19"}.ti-sort-descending:before{content:"\eb27"}.ti-sort-descending-2:before{content:"\eee3"}.ti-sort-descending-letters:before{content:"\ef1a"}.ti-sort-descending-numbers:before{content:"\ef1b"}.ti-sort-z-a:before{content:"\f550"}.ti-sos:before{content:"\f24a"}.ti-soup:before{content:"\ef2e"}.ti-soup-off:before{content:"\f42d"}.ti-source-code:before{content:"\f4a2"}.ti-space:before{content:"\ec0c"}.ti-space-off:before{content:"\f1aa"}.ti-spacing-horizontal:before{content:"\ef54"}.ti-spacing-vertical:before{content:"\ef55"}.ti-spade:before{content:"\effa"}.ti-spade-filled:before{content:"\f6a3"}.ti-sparkles:before{content:"\f6d7"}.ti-speakerphone:before{content:"\ed61"}.ti-speedboat:before{content:"\ed93"}.ti-spider:before{content:"\f293"}.ti-spiral:before{content:"\f294"}.ti-spiral-off:before{content:"\f42e"}.ti-sport-billard:before{content:"\eee4"}.ti-spray:before{content:"\f50b"}.ti-spy:before{content:"\f227"}.ti-spy-off:before{content:"\f42f"}.ti-sql:before{content:"\f7c0"}.ti-square:before{content:"\eb2c"}.ti-square-0-filled:before{content:"\f764"}.ti-square-1-filled:before{content:"\f765"}.ti-square-2-filled:before{content:"\f7fa"}.ti-square-3-filled:before{content:"\f766"}.ti-square-4-filled:before{content:"\f767"}.ti-square-5-filled:before{content:"\f768"}.ti-square-6-filled:before{content:"\f769"}.ti-square-7-filled:before{content:"\f76a"}.ti-square-8-filled:before{content:"\f76b"}.ti-square-9-filled:before{content:"\f76c"}.ti-square-arrow-down:before{content:"\f4b7"}.ti-square-arrow-left:before{content:"\f4b8"}.ti-square-arrow-right:before{content:"\f4b9"}.ti-square-arrow-up:before{content:"\f4ba"}.ti-square-asterisk:before{content:"\f01a"}.ti-square-check:before{content:"\eb28"}.ti-square-check-filled:before{content:"\f76d"}.ti-square-chevron-down:before{content:"\f627"}.ti-square-chevron-left:before{content:"\f628"}.ti-square-chevron-right:before{content:"\f629"}.ti-square-chevron-up:before{content:"\f62a"}.ti-square-chevrons-down:before{content:"\f64b"}.ti-square-chevrons-left:before{content:"\f64c"}.ti-square-chevrons-right:before{content:"\f64d"}.ti-square-chevrons-up:before{content:"\f64e"}.ti-square-dot:before{content:"\ed59"}.ti-square-f0:before{content:"\f526"}.ti-square-f0-filled:before{content:"\f76e"}.ti-square-f1:before{content:"\f527"}.ti-square-f1-filled:before{content:"\f76f"}.ti-square-f2:before{content:"\f528"}.ti-square-f2-filled:before{content:"\f770"}.ti-square-f3:before{content:"\f529"}.ti-square-f3-filled:before{content:"\f771"}.ti-square-f4:before{content:"\f52a"}.ti-square-f4-filled:before{content:"\f772"}.ti-square-f5:before{content:"\f52b"}.ti-square-f5-filled:before{content:"\f773"}.ti-square-f6:before{content:"\f52c"}.ti-square-f6-filled:before{content:"\f774"}.ti-square-f7:before{content:"\f52d"}.ti-square-f7-filled:before{content:"\f775"}.ti-square-f8:before{content:"\f52e"}.ti-square-f8-filled:before{content:"\f776"}.ti-square-f9:before{content:"\f52f"}.ti-square-f9-filled:before{content:"\f777"}.ti-square-forbid:before{content:"\ed5b"}.ti-square-forbid-2:before{content:"\ed5a"}.ti-square-half:before{content:"\effb"}.ti-square-key:before{content:"\f638"}.ti-square-letter-a:before{content:"\f47c"}.ti-square-letter-b:before{content:"\f47d"}.ti-square-letter-c:before{content:"\f47e"}.ti-square-letter-d:before{content:"\f47f"}.ti-square-letter-e:before{content:"\f480"}.ti-square-letter-f:before{content:"\f481"}.ti-square-letter-g:before{content:"\f482"}.ti-square-letter-h:before{content:"\f483"}.ti-square-letter-i:before{content:"\f484"}.ti-square-letter-j:before{content:"\f485"}.ti-square-letter-k:before{content:"\f486"}.ti-square-letter-l:before{content:"\f487"}.ti-square-letter-m:before{content:"\f488"}.ti-square-letter-n:before{content:"\f489"}.ti-square-letter-o:before{content:"\f48a"}.ti-square-letter-p:before{content:"\f48b"}.ti-square-letter-q:before{content:"\f48c"}.ti-square-letter-r:before{content:"\f48d"}.ti-square-letter-s:before{content:"\f48e"}.ti-square-letter-t:before{content:"\f48f"}.ti-square-letter-u:before{content:"\f490"}.ti-square-letter-v:before{content:"\f4bb"}.ti-square-letter-w:before{content:"\f491"}.ti-square-letter-x:before{content:"\f4bc"}.ti-square-letter-y:before{content:"\f492"}.ti-square-letter-z:before{content:"\f493"}.ti-square-minus:before{content:"\eb29"}.ti-square-number-0:before{content:"\eee5"}.ti-square-number-1:before{content:"\eee6"}.ti-square-number-2:before{content:"\eee7"}.ti-square-number-3:before{content:"\eee8"}.ti-square-number-4:before{content:"\eee9"}.ti-square-number-5:before{content:"\eeea"}.ti-square-number-6:before{content:"\eeeb"}.ti-square-number-7:before{content:"\eeec"}.ti-square-number-8:before{content:"\eeed"}.ti-square-number-9:before{content:"\eeee"}.ti-square-off:before{content:"\eeef"}.ti-square-plus:before{content:"\eb2a"}.ti-square-root:before{content:"\eef1"}.ti-square-root-2:before{content:"\eef0"}.ti-square-rotated:before{content:"\ecdf"}.ti-square-rotated-filled:before{content:"\f6a4"}.ti-square-rotated-forbid:before{content:"\f01c"}.ti-square-rotated-forbid-2:before{content:"\f01b"}.ti-square-rotated-off:before{content:"\eef2"}.ti-square-rounded:before{content:"\f59a"}.ti-square-rounded-arrow-down:before{content:"\f639"}.ti-square-rounded-arrow-down-filled:before{content:"\f6db"}.ti-square-rounded-arrow-left:before{content:"\f63a"}.ti-square-rounded-arrow-left-filled:before{content:"\f6dc"}.ti-square-rounded-arrow-right:before{content:"\f63b"}.ti-square-rounded-arrow-right-filled:before{content:"\f6dd"}.ti-square-rounded-arrow-up:before{content:"\f63c"}.ti-square-rounded-arrow-up-filled:before{content:"\f6de"}.ti-square-rounded-check:before{content:"\f63d"}.ti-square-rounded-check-filled:before{content:"\f6df"}.ti-square-rounded-chevron-down:before{content:"\f62b"}.ti-square-rounded-chevron-down-filled:before{content:"\f6e0"}.ti-square-rounded-chevron-left:before{content:"\f62c"}.ti-square-rounded-chevron-left-filled:before{content:"\f6e1"}.ti-square-rounded-chevron-right:before{content:"\f62d"}.ti-square-rounded-chevron-right-filled:before{content:"\f6e2"}.ti-square-rounded-chevron-up:before{content:"\f62e"}.ti-square-rounded-chevron-up-filled:before{content:"\f6e3"}.ti-square-rounded-chevrons-down:before{content:"\f64f"}.ti-square-rounded-chevrons-down-filled:before{content:"\f6e4"}.ti-square-rounded-chevrons-left:before{content:"\f650"}.ti-square-rounded-chevrons-left-filled:before{content:"\f6e5"}.ti-square-rounded-chevrons-right:before{content:"\f651"}.ti-square-rounded-chevrons-right-filled:before{content:"\f6e6"}.ti-square-rounded-chevrons-up:before{content:"\f652"}.ti-square-rounded-chevrons-up-filled:before{content:"\f6e7"}.ti-square-rounded-filled:before{content:"\f6a5"}.ti-square-rounded-letter-a:before{content:"\f5ae"}.ti-square-rounded-letter-b:before{content:"\f5af"}.ti-square-rounded-letter-c:before{content:"\f5b0"}.ti-square-rounded-letter-d:before{content:"\f5b1"}.ti-square-rounded-letter-e:before{content:"\f5b2"}.ti-square-rounded-letter-f:before{content:"\f5b3"}.ti-square-rounded-letter-g:before{content:"\f5b4"}.ti-square-rounded-letter-h:before{content:"\f5b5"}.ti-square-rounded-letter-i:before{content:"\f5b6"}.ti-square-rounded-letter-j:before{content:"\f5b7"}.ti-square-rounded-letter-k:before{content:"\f5b8"}.ti-square-rounded-letter-l:before{content:"\f5b9"}.ti-square-rounded-letter-m:before{content:"\f5ba"}.ti-square-rounded-letter-n:before{content:"\f5bb"}.ti-square-rounded-letter-o:before{content:"\f5bc"}.ti-square-rounded-letter-p:before{content:"\f5bd"}.ti-square-rounded-letter-q:before{content:"\f5be"}.ti-square-rounded-letter-r:before{content:"\f5bf"}.ti-square-rounded-letter-s:before{content:"\f5c0"}.ti-square-rounded-letter-t:before{content:"\f5c1"}.ti-square-rounded-letter-u:before{content:"\f5c2"}.ti-square-rounded-letter-v:before{content:"\f5c3"}.ti-square-rounded-letter-w:before{content:"\f5c4"}.ti-square-rounded-letter-x:before{content:"\f5c5"}.ti-square-rounded-letter-y:before{content:"\f5c6"}.ti-square-rounded-letter-z:before{content:"\f5c7"}.ti-square-rounded-minus:before{content:"\f63e"}.ti-square-rounded-number-0:before{content:"\f5c8"}.ti-square-rounded-number-0-filled:before{content:"\f778"}.ti-square-rounded-number-1:before{content:"\f5c9"}.ti-square-rounded-number-1-filled:before{content:"\f779"}.ti-square-rounded-number-2:before{content:"\f5ca"}.ti-square-rounded-number-2-filled:before{content:"\f77a"}.ti-square-rounded-number-3:before{content:"\f5cb"}.ti-square-rounded-number-3-filled:before{content:"\f77b"}.ti-square-rounded-number-4:before{content:"\f5cc"}.ti-square-rounded-number-4-filled:before{content:"\f77c"}.ti-square-rounded-number-5:before{content:"\f5cd"}.ti-square-rounded-number-5-filled:before{content:"\f77d"}.ti-square-rounded-number-6:before{content:"\f5ce"}.ti-square-rounded-number-6-filled:before{content:"\f77e"}.ti-square-rounded-number-7:before{content:"\f5cf"}.ti-square-rounded-number-7-filled:before{content:"\f77f"}.ti-square-rounded-number-8:before{content:"\f5d0"}.ti-square-rounded-number-8-filled:before{content:"\f780"}.ti-square-rounded-number-9:before{content:"\f5d1"}.ti-square-rounded-number-9-filled:before{content:"\f781"}.ti-square-rounded-plus:before{content:"\f63f"}.ti-square-rounded-plus-filled:before{content:"\f6e8"}.ti-square-rounded-x:before{content:"\f640"}.ti-square-rounded-x-filled:before{content:"\f6e9"}.ti-square-toggle:before{content:"\eef4"}.ti-square-toggle-horizontal:before{content:"\eef3"}.ti-square-x:before{content:"\eb2b"}.ti-squares-diagonal:before{content:"\eef5"}.ti-squares-filled:before{content:"\eef6"}.ti-stack:before{content:"\eb2d"}.ti-stack-2:before{content:"\eef7"}.ti-stack-3:before{content:"\ef9d"}.ti-stack-pop:before{content:"\f234"}.ti-stack-push:before{content:"\f235"}.ti-stairs:before{content:"\eca6"}.ti-stairs-down:before{content:"\eca4"}.ti-stairs-up:before{content:"\eca5"}.ti-star:before{content:"\eb2e"}.ti-star-filled:before{content:"\f6a6"}.ti-star-half:before{content:"\ed19"}.ti-star-half-filled:before{content:"\f6a7"}.ti-star-off:before{content:"\ed62"}.ti-stars:before{content:"\ed38"}.ti-stars-filled:before{content:"\f6a8"}.ti-stars-off:before{content:"\f430"}.ti-status-change:before{content:"\f3b0"}.ti-steam:before{content:"\f24b"}.ti-steering-wheel:before{content:"\ec7b"}.ti-steering-wheel-off:before{content:"\f431"}.ti-step-into:before{content:"\ece0"}.ti-step-out:before{content:"\ece1"}.ti-stereo-glasses:before{content:"\f4cb"}.ti-stethoscope:before{content:"\edbe"}.ti-stethoscope-off:before{content:"\f432"}.ti-sticker:before{content:"\eb2f"}.ti-storm:before{content:"\f24c"}.ti-storm-off:before{content:"\f433"}.ti-stretching:before{content:"\f2db"}.ti-strikethrough:before{content:"\eb9e"}.ti-submarine:before{content:"\ed94"}.ti-subscript:before{content:"\eb9f"}.ti-subtask:before{content:"\ec9f"}.ti-sum:before{content:"\eb73"}.ti-sum-off:before{content:"\f1ab"}.ti-sun:before{content:"\eb30"}.ti-sun-filled:before{content:"\f6a9"}.ti-sun-high:before{content:"\f236"}.ti-sun-low:before{content:"\f237"}.ti-sun-moon:before{content:"\f4a3"}.ti-sun-off:before{content:"\ed63"}.ti-sun-wind:before{content:"\f238"}.ti-sunglasses:before{content:"\f239"}.ti-sunrise:before{content:"\ef1c"}.ti-sunset:before{content:"\ec31"}.ti-sunset-2:before{content:"\f23a"}.ti-superscript:before{content:"\eba0"}.ti-svg:before{content:"\f25a"}.ti-swimming:before{content:"\ec92"}.ti-swipe:before{content:"\f551"}.ti-switch:before{content:"\eb33"}.ti-switch-2:before{content:"\edbf"}.ti-switch-3:before{content:"\edc0"}.ti-switch-horizontal:before{content:"\eb31"}.ti-switch-vertical:before{content:"\eb32"}.ti-sword:before{content:"\f030"}.ti-sword-off:before{content:"\f434"}.ti-swords:before{content:"\f132"}.ti-table:before{content:"\eba1"}.ti-table-alias:before{content:"\f25b"}.ti-table-export:before{content:"\eef8"}.ti-table-filled:before{content:"\f782"}.ti-table-import:before{content:"\eef9"}.ti-table-off:before{content:"\eefa"}.ti-table-options:before{content:"\f25c"}.ti-table-shortcut:before{content:"\f25d"}.ti-tag:before{content:"\eb34"}.ti-tag-off:before{content:"\efc0"}.ti-tags:before{content:"\ef86"}.ti-tags-off:before{content:"\efc1"}.ti-tallymark-1:before{content:"\ec46"}.ti-tallymark-2:before{content:"\ec47"}.ti-tallymark-3:before{content:"\ec48"}.ti-tallymark-4:before{content:"\ec49"}.ti-tallymarks:before{content:"\ec4a"}.ti-tank:before{content:"\ed95"}.ti-target:before{content:"\eb35"}.ti-target-arrow:before{content:"\f51a"}.ti-target-off:before{content:"\f1ad"}.ti-teapot:before{content:"\f552"}.ti-telescope:before{content:"\f07d"}.ti-telescope-off:before{content:"\f1ae"}.ti-temperature:before{content:"\eb38"}.ti-temperature-celsius:before{content:"\eb36"}.ti-temperature-fahrenheit:before{content:"\eb37"}.ti-temperature-minus:before{content:"\ebed"}.ti-temperature-off:before{content:"\f1af"}.ti-temperature-plus:before{content:"\ebee"}.ti-template:before{content:"\eb39"}.ti-template-off:before{content:"\f1b0"}.ti-tent:before{content:"\eefb"}.ti-tent-off:before{content:"\f435"}.ti-terminal:before{content:"\ebdc"}.ti-terminal-2:before{content:"\ebef"}.ti-test-pipe:before{content:"\eb3a"}.ti-test-pipe-2:before{content:"\f0a4"}.ti-test-pipe-off:before{content:"\f1b1"}.ti-tex:before{content:"\f4e0"}.ti-text-caption:before{content:"\f4a4"}.ti-text-color:before{content:"\f2dc"}.ti-text-decrease:before{content:"\f202"}.ti-text-direction-ltr:before{content:"\eefc"}.ti-text-direction-rtl:before{content:"\eefd"}.ti-text-increase:before{content:"\f203"}.ti-text-orientation:before{content:"\f2a4"}.ti-text-plus:before{content:"\f2a5"}.ti-text-recognition:before{content:"\f204"}.ti-text-resize:before{content:"\ef87"}.ti-text-size:before{content:"\f2b1"}.ti-text-spellcheck:before{content:"\f2a6"}.ti-text-wrap:before{content:"\ebdd"}.ti-text-wrap-disabled:before{content:"\eca7"}.ti-texture:before{content:"\f51b"}.ti-theater:before{content:"\f79b"}.ti-thermometer:before{content:"\ef67"}.ti-thumb-down:before{content:"\eb3b"}.ti-thumb-down-filled:before{content:"\f6aa"}.ti-thumb-down-off:before{content:"\f436"}.ti-thumb-up:before{content:"\eb3c"}.ti-thumb-up-filled:before{content:"\f6ab"}.ti-thumb-up-off:before{content:"\f437"}.ti-tic-tac:before{content:"\f51c"}.ti-ticket:before{content:"\eb3d"}.ti-ticket-off:before{content:"\f1b2"}.ti-tie:before{content:"\f07e"}.ti-tilde:before{content:"\f4a5"}.ti-tilt-shift:before{content:"\eefe"}.ti-tilt-shift-off:before{content:"\f1b3"}.ti-timeline:before{content:"\f031"}.ti-timeline-event:before{content:"\f553"}.ti-timeline-event-exclamation:before{content:"\f662"}.ti-timeline-event-minus:before{content:"\f663"}.ti-timeline-event-plus:before{content:"\f664"}.ti-timeline-event-text:before{content:"\f665"}.ti-timeline-event-x:before{content:"\f666"}.ti-tir:before{content:"\ebf0"}.ti-toggle-left:before{content:"\eb3e"}.ti-toggle-right:before{content:"\eb3f"}.ti-toilet-paper:before{content:"\efd3"}.ti-toilet-paper-off:before{content:"\f1b4"}.ti-tool:before{content:"\eb40"}.ti-tools:before{content:"\ebca"}.ti-tools-kitchen:before{content:"\ed64"}.ti-tools-kitchen-2:before{content:"\eeff"}.ti-tools-kitchen-2-off:before{content:"\f1b5"}.ti-tools-kitchen-off:before{content:"\f1b6"}.ti-tools-off:before{content:"\f1b7"}.ti-tooltip:before{content:"\f2dd"}.ti-topology-bus:before{content:"\f5d9"}.ti-topology-complex:before{content:"\f5da"}.ti-topology-full:before{content:"\f5dc"}.ti-topology-full-hierarchy:before{content:"\f5db"}.ti-topology-ring:before{content:"\f5df"}.ti-topology-ring-2:before{content:"\f5dd"}.ti-topology-ring-3:before{content:"\f5de"}.ti-topology-star:before{content:"\f5e5"}.ti-topology-star-2:before{content:"\f5e0"}.ti-topology-star-3:before{content:"\f5e1"}.ti-topology-star-ring:before{content:"\f5e4"}.ti-topology-star-ring-2:before{content:"\f5e2"}.ti-topology-star-ring-3:before{content:"\f5e3"}.ti-torii:before{content:"\f59b"}.ti-tornado:before{content:"\ece2"}.ti-tournament:before{content:"\ecd0"}.ti-tower:before{content:"\f2cb"}.ti-tower-off:before{content:"\f2ca"}.ti-track:before{content:"\ef00"}.ti-tractor:before{content:"\ec0d"}.ti-trademark:before{content:"\ec0e"}.ti-traffic-cone:before{content:"\ec0f"}.ti-traffic-cone-off:before{content:"\f1b8"}.ti-traffic-lights:before{content:"\ed39"}.ti-traffic-lights-off:before{content:"\f1b9"}.ti-train:before{content:"\ed96"}.ti-transfer-in:before{content:"\ef2f"}.ti-transfer-out:before{content:"\ef30"}.ti-transform:before{content:"\f38e"}.ti-transform-filled:before{content:"\f6ac"}.ti-transition-bottom:before{content:"\f2b2"}.ti-transition-left:before{content:"\f2b3"}.ti-transition-right:before{content:"\f2b4"}.ti-transition-top:before{content:"\f2b5"}.ti-trash:before{content:"\eb41"}.ti-trash-filled:before{content:"\f783"}.ti-trash-off:before{content:"\ed65"}.ti-trash-x:before{content:"\ef88"}.ti-trash-x-filled:before{content:"\f784"}.ti-tree:before{content:"\ef01"}.ti-trees:before{content:"\ec10"}.ti-trekking:before{content:"\f5ad"}.ti-trending-down:before{content:"\eb42"}.ti-trending-down-2:before{content:"\edc1"}.ti-trending-down-3:before{content:"\edc2"}.ti-trending-up:before{content:"\eb43"}.ti-trending-up-2:before{content:"\edc3"}.ti-trending-up-3:before{content:"\edc4"}.ti-triangle:before{content:"\eb44"}.ti-triangle-filled:before{content:"\f6ad"}.ti-triangle-inverted:before{content:"\f01d"}.ti-triangle-inverted-filled:before{content:"\f6ae"}.ti-triangle-off:before{content:"\ef02"}.ti-triangle-square-circle:before{content:"\ece8"}.ti-triangles:before{content:"\f0a5"}.ti-trident:before{content:"\ecc5"}.ti-trolley:before{content:"\f4cc"}.ti-trophy:before{content:"\eb45"}.ti-trophy-filled:before{content:"\f6af"}.ti-trophy-off:before{content:"\f438"}.ti-trowel:before{content:"\f368"}.ti-truck:before{content:"\ebc4"}.ti-truck-delivery:before{content:"\ec4b"}.ti-truck-loading:before{content:"\f1da"}.ti-truck-off:before{content:"\ef03"}.ti-truck-return:before{content:"\ec4c"}.ti-txt:before{content:"\f3b1"}.ti-typography:before{content:"\ebc5"}.ti-typography-off:before{content:"\f1ba"}.ti-ufo:before{content:"\f26f"}.ti-ufo-off:before{content:"\f26e"}.ti-umbrella:before{content:"\ebf1"}.ti-umbrella-filled:before{content:"\f6b0"}.ti-umbrella-off:before{content:"\f1bb"}.ti-underline:before{content:"\eba2"}.ti-unlink:before{content:"\eb46"}.ti-upload:before{content:"\eb47"}.ti-urgent:before{content:"\eb48"}.ti-usb:before{content:"\f00c"}.ti-user:before{content:"\eb4d"}.ti-user-bolt:before{content:"\f9d1"}.ti-user-cancel:before{content:"\f9d2"}.ti-user-check:before{content:"\eb49"}.ti-user-circle:before{content:"\ef68"}.ti-user-code:before{content:"\f9d3"}.ti-user-cog:before{content:"\f9d4"}.ti-user-dollar:before{content:"\f9d5"}.ti-user-down:before{content:"\f9d6"}.ti-user-edit:before{content:"\f7cc"}.ti-user-exclamation:before{content:"\ec12"}.ti-user-heart:before{content:"\f7cd"}.ti-user-minus:before{content:"\eb4a"}.ti-user-off:before{content:"\ecf9"}.ti-user-pause:before{content:"\f9d7"}.ti-user-pin:before{content:"\f7ce"}.ti-user-plus:before{content:"\eb4b"}.ti-user-question:before{content:"\f7cf"}.ti-user-search:before{content:"\ef89"}.ti-user-share:before{content:"\f9d8"}.ti-user-shield:before{content:"\f7d0"}.ti-user-star:before{content:"\f7d1"}.ti-user-up:before{content:"\f7d2"}.ti-user-x:before{content:"\eb4c"}.ti-users:before{content:"\ebf2"}.ti-uv-index:before{content:"\f3b2"}.ti-ux-circle:before{content:"\f369"}.ti-vaccine:before{content:"\ef04"}.ti-vaccine-bottle:before{content:"\ef69"}.ti-vaccine-bottle-off:before{content:"\f439"}.ti-vaccine-off:before{content:"\f1bc"}.ti-vacuum-cleaner:before{content:"\f5e6"}.ti-variable:before{content:"\ef05"}.ti-variable-minus:before{content:"\f36a"}.ti-variable-off:before{content:"\f1bd"}.ti-variable-plus:before{content:"\f36b"}.ti-vector:before{content:"\eca9"}.ti-vector-bezier:before{content:"\ef1d"}.ti-vector-bezier-2:before{content:"\f1a3"}.ti-vector-bezier-arc:before{content:"\f4cd"}.ti-vector-bezier-circle:before{content:"\f4ce"}.ti-vector-off:before{content:"\f1be"}.ti-vector-spline:before{content:"\f565"}.ti-vector-triangle:before{content:"\eca8"}.ti-vector-triangle-off:before{content:"\f1bf"}.ti-venus:before{content:"\ec86"}.ti-versions:before{content:"\ed52"}.ti-versions-filled:before{content:"\f6b1"}.ti-versions-off:before{content:"\f1c0"}.ti-video:before{content:"\ed22"}.ti-video-minus:before{content:"\ed1f"}.ti-video-off:before{content:"\ed20"}.ti-video-plus:before{content:"\ed21"}.ti-view-360:before{content:"\ed84"}.ti-view-360-off:before{content:"\f1c1"}.ti-viewfinder:before{content:"\eb4e"}.ti-viewfinder-off:before{content:"\f1c2"}.ti-viewport-narrow:before{content:"\ebf3"}.ti-viewport-wide:before{content:"\ebf4"}.ti-vinyl:before{content:"\f00d"}.ti-vip:before{content:"\f3b3"}.ti-vip-off:before{content:"\f43a"}.ti-virus:before{content:"\eb74"}.ti-virus-off:before{content:"\ed66"}.ti-virus-search:before{content:"\ed67"}.ti-vocabulary:before{content:"\ef1e"}.ti-vocabulary-off:before{content:"\f43b"}.ti-volcano:before{content:"\f79c"}.ti-volume:before{content:"\eb51"}.ti-volume-2:before{content:"\eb4f"}.ti-volume-3:before{content:"\eb50"}.ti-volume-off:before{content:"\f1c3"}.ti-walk:before{content:"\ec87"}.ti-wall:before{content:"\ef7a"}.ti-wall-off:before{content:"\f43c"}.ti-wallet:before{content:"\eb75"}.ti-wallet-off:before{content:"\f1c4"}.ti-wallpaper:before{content:"\ef56"}.ti-wallpaper-off:before{content:"\f1c5"}.ti-wand:before{content:"\ebcb"}.ti-wand-off:before{content:"\f1c6"}.ti-wash:before{content:"\f311"}.ti-wash-dry:before{content:"\f304"}.ti-wash-dry-1:before{content:"\f2fa"}.ti-wash-dry-2:before{content:"\f2fb"}.ti-wash-dry-3:before{content:"\f2fc"}.ti-wash-dry-a:before{content:"\f2fd"}.ti-wash-dry-dip:before{content:"\f2fe"}.ti-wash-dry-f:before{content:"\f2ff"}.ti-wash-dry-hang:before{content:"\f300"}.ti-wash-dry-off:before{content:"\f301"}.ti-wash-dry-p:before{content:"\f302"}.ti-wash-dry-shade:before{content:"\f303"}.ti-wash-dry-w:before{content:"\f322"}.ti-wash-dryclean:before{content:"\f305"}.ti-wash-dryclean-off:before{content:"\f323"}.ti-wash-gentle:before{content:"\f306"}.ti-wash-machine:before{content:"\f25e"}.ti-wash-off:before{content:"\f307"}.ti-wash-press:before{content:"\f308"}.ti-wash-temperature-1:before{content:"\f309"}.ti-wash-temperature-2:before{content:"\f30a"}.ti-wash-temperature-3:before{content:"\f30b"}.ti-wash-temperature-4:before{content:"\f30c"}.ti-wash-temperature-5:before{content:"\f30d"}.ti-wash-temperature-6:before{content:"\f30e"}.ti-wash-tumble-dry:before{content:"\f30f"}.ti-wash-tumble-off:before{content:"\f310"}.ti-wave-saw-tool:before{content:"\ecd3"}.ti-wave-sine:before{content:"\ecd4"}.ti-wave-square:before{content:"\ecd5"}.ti-webhook:before{content:"\f01e"}.ti-webhook-off:before{content:"\f43d"}.ti-weight:before{content:"\f589"}.ti-wheelchair:before{content:"\f1db"}.ti-wheelchair-off:before{content:"\f43e"}.ti-whirl:before{content:"\f51d"}.ti-wifi:before{content:"\eb52"}.ti-wifi-0:before{content:"\eba3"}.ti-wifi-1:before{content:"\eba4"}.ti-wifi-2:before{content:"\eba5"}.ti-wifi-off:before{content:"\ecfa"}.ti-wind:before{content:"\ec34"}.ti-wind-off:before{content:"\f1c7"}.ti-windmill:before{content:"\ed85"}.ti-windmill-filled:before{content:"\f6b2"}.ti-windmill-off:before{content:"\f1c8"}.ti-window:before{content:"\ef06"}.ti-window-maximize:before{content:"\f1f1"}.ti-window-minimize:before{content:"\f1f2"}.ti-window-off:before{content:"\f1c9"}.ti-windsock:before{content:"\f06d"}.ti-wiper:before{content:"\ecab"}.ti-wiper-wash:before{content:"\ecaa"}.ti-woman:before{content:"\eb53"}.ti-wood:before{content:"\f359"}.ti-world:before{content:"\eb54"}.ti-world-bolt:before{content:"\f9d9"}.ti-world-cancel:before{content:"\f9da"}.ti-world-check:before{content:"\f9db"}.ti-world-code:before{content:"\f9dc"}.ti-world-cog:before{content:"\f9dd"}.ti-world-dollar:before{content:"\f9de"}.ti-world-down:before{content:"\f9df"}.ti-world-download:before{content:"\ef8a"}.ti-world-exclamation:before{content:"\f9e0"}.ti-world-heart:before{content:"\f9e1"}.ti-world-latitude:before{content:"\ed2e"}.ti-world-longitude:before{content:"\ed2f"}.ti-world-minus:before{content:"\f9e2"}.ti-world-off:before{content:"\f1ca"}.ti-world-pause:before{content:"\f9e3"}.ti-world-pin:before{content:"\f9e4"}.ti-world-plus:before{content:"\f9e5"}.ti-world-question:before{content:"\f9e6"}.ti-world-search:before{content:"\f9e7"}.ti-world-share:before{content:"\f9e8"}.ti-world-star:before{content:"\f9e9"}.ti-world-up:before{content:"\f9ea"}.ti-world-upload:before{content:"\ef8b"}.ti-world-www:before{content:"\f38f"}.ti-world-x:before{content:"\f9eb"}.ti-wrecking-ball:before{content:"\ed97"}.ti-writing:before{content:"\ef08"}.ti-writing-off:before{content:"\f1cb"}.ti-writing-sign:before{content:"\ef07"}.ti-writing-sign-off:before{content:"\f1cc"}.ti-x:before{content:"\eb55"}.ti-xbox-a:before{content:"\f2b6"}.ti-xbox-b:before{content:"\f2b7"}.ti-xbox-x:before{content:"\f2b8"}.ti-xbox-y:before{content:"\f2b9"}.ti-yin-yang:before{content:"\ec35"}.ti-yin-yang-filled:before{content:"\f785"}.ti-yoga:before{content:"\f01f"}.ti-zeppelin:before{content:"\f270"}.ti-zeppelin-off:before{content:"\f43f"}.ti-zip:before{content:"\f3b4"}.ti-zodiac-aquarius:before{content:"\ecac"}.ti-zodiac-aries:before{content:"\ecad"}.ti-zodiac-cancer:before{content:"\ecae"}.ti-zodiac-capricorn:before{content:"\ecaf"}.ti-zodiac-gemini:before{content:"\ecb0"}.ti-zodiac-leo:before{content:"\ecb1"}.ti-zodiac-libra:before{content:"\ecb2"}.ti-zodiac-pisces:before{content:"\ecb3"}.ti-zodiac-sagittarius:before{content:"\ecb4"}.ti-zodiac-scorpio:before{content:"\ecb5"}.ti-zodiac-taurus:before{content:"\ecb6"}.ti-zodiac-virgo:before{content:"\ecb7"}.ti-zoom-cancel:before{content:"\ec4d"}.ti-zoom-check:before{content:"\ef09"}.ti-zoom-check-filled:before{content:"\f786"}.ti-zoom-code:before{content:"\f07f"}.ti-zoom-exclamation:before{content:"\f080"}.ti-zoom-filled:before{content:"\f787"}.ti-zoom-in:before{content:"\eb56"}.ti-zoom-in-area:before{content:"\f1dc"}.ti-zoom-in-area-filled:before{content:"\f788"}.ti-zoom-in-filled:before{content:"\f789"}.ti-zoom-money:before{content:"\ef0a"}.ti-zoom-out:before{content:"\eb57"}.ti-zoom-out-area:before{content:"\f1dd"}.ti-zoom-out-filled:before{content:"\f78a"}.ti-zoom-pan:before{content:"\f1de"}.ti-zoom-question:before{content:"\edeb"}.ti-zoom-replace:before{content:"\f2a7"}.ti-zoom-reset:before{content:"\f295"}.ti-zzz:before{content:"\f228"}.ti-zzz-off:before{content:"\f440"}/*# sourceMappingURL=tabler-icons.min.css.map */ diff --git a/playground/fonts/tabler-icons/tabler-icons.scss b/playground/fonts/tabler-icons/tabler-icons.scss deleted file mode 100644 index f1d8511a8ba068..00000000000000 --- a/playground/fonts/tabler-icons/tabler-icons.scss +++ /dev/null @@ -1,8094 +0,0 @@ -/*! - * Tabler Icons 2.11.0 by tabler - https://tabler.io - * License - https://github.com/tabler/tabler-icons/blob/master/LICENSE - */ -$ti-font-family: 'tabler-icons' !default; -$ti-font-path: './fonts' !default; -$ti-font-display: null !default; -$ti-prefix: 'ti' !default; - -@font-face { - font-family: $ti-font-family; - font-style: normal; - font-weight: 400; - font-display: $ti-font-display; - src: url('#{$ti-font-path}/tabler-icons.eot?v2.11.0'); - src: url('#{$ti-font-path}/tabler-icons.eot?#iefix-v2.11.0') format('embedded-opentype'), - url('#{$ti-font-path}/tabler-icons.woff2?v2.11.0') format('woff2'), - url('#{$ti-font-path}/tabler-icons.woff?') format('woff'), - url('#{$ti-font-path}/tabler-icons.ttf?v2.11.0') format('truetype'); -} - -.#{$ti-prefix} { - font-family: $ti-font-family !important; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -@function unicode($str) { - @return unquote("\"")+unquote(str-insert($str, "\\", 1))+unquote("\"") -} - - -$ti-icon-123: unicode('f554'); -$ti-icon-24-hours: unicode('f5e7'); -$ti-icon-2fa: unicode('eca0'); -$ti-icon-360: unicode('f62f'); -$ti-icon-360-view: unicode('f566'); -$ti-icon-3d-cube-sphere: unicode('ecd7'); -$ti-icon-3d-cube-sphere-off: unicode('f3b5'); -$ti-icon-3d-rotate: unicode('f020'); -$ti-icon-a-b: unicode('ec36'); -$ti-icon-a-b-2: unicode('f25f'); -$ti-icon-a-b-off: unicode('f0a6'); -$ti-icon-abacus: unicode('f05c'); -$ti-icon-abacus-off: unicode('f3b6'); -$ti-icon-abc: unicode('f567'); -$ti-icon-access-point: unicode('ed1b'); -$ti-icon-access-point-off: unicode('ed1a'); -$ti-icon-accessible: unicode('eba9'); -$ti-icon-accessible-off: unicode('f0a7'); -$ti-icon-accessible-off-filled: unicode('f6ea'); -$ti-icon-activity: unicode('ed23'); -$ti-icon-activity-heartbeat: unicode('f0db'); -$ti-icon-ad: unicode('ea02'); -$ti-icon-ad-2: unicode('ef1f'); -$ti-icon-ad-circle: unicode('f79e'); -$ti-icon-ad-circle-filled: unicode('f7d3'); -$ti-icon-ad-circle-off: unicode('f79d'); -$ti-icon-ad-filled: unicode('f6eb'); -$ti-icon-ad-off: unicode('f3b7'); -$ti-icon-address-book: unicode('f021'); -$ti-icon-address-book-off: unicode('f3b8'); -$ti-icon-adjustments: unicode('ea03'); -$ti-icon-adjustments-alt: unicode('ec37'); -$ti-icon-adjustments-bolt: unicode('f7fb'); -$ti-icon-adjustments-cancel: unicode('f7fc'); -$ti-icon-adjustments-check: unicode('f7fd'); -$ti-icon-adjustments-code: unicode('f7fe'); -$ti-icon-adjustments-cog: unicode('f7ff'); -$ti-icon-adjustments-dollar: unicode('f800'); -$ti-icon-adjustments-down: unicode('f801'); -$ti-icon-adjustments-exclamation: unicode('f802'); -$ti-icon-adjustments-filled: unicode('f6ec'); -$ti-icon-adjustments-heart: unicode('f803'); -$ti-icon-adjustments-horizontal: unicode('ec38'); -$ti-icon-adjustments-minus: unicode('f804'); -$ti-icon-adjustments-off: unicode('f0a8'); -$ti-icon-adjustments-pause: unicode('f805'); -$ti-icon-adjustments-pin: unicode('f806'); -$ti-icon-adjustments-plus: unicode('f807'); -$ti-icon-adjustments-question: unicode('f808'); -$ti-icon-adjustments-search: unicode('f809'); -$ti-icon-adjustments-share: unicode('f80a'); -$ti-icon-adjustments-star: unicode('f80b'); -$ti-icon-adjustments-up: unicode('f80c'); -$ti-icon-adjustments-x: unicode('f80d'); -$ti-icon-aerial-lift: unicode('edfe'); -$ti-icon-affiliate: unicode('edff'); -$ti-icon-affiliate-filled: unicode('f6ed'); -$ti-icon-air-balloon: unicode('f4a6'); -$ti-icon-air-conditioning: unicode('f3a2'); -$ti-icon-air-conditioning-disabled: unicode('f542'); -$ti-icon-alarm: unicode('ea04'); -$ti-icon-alarm-filled: unicode('f709'); -$ti-icon-alarm-minus: unicode('f630'); -$ti-icon-alarm-minus-filled: unicode('f70a'); -$ti-icon-alarm-off: unicode('f0a9'); -$ti-icon-alarm-plus: unicode('f631'); -$ti-icon-alarm-plus-filled: unicode('f70b'); -$ti-icon-alarm-snooze: unicode('f632'); -$ti-icon-alarm-snooze-filled: unicode('f70c'); -$ti-icon-album: unicode('f022'); -$ti-icon-album-off: unicode('f3b9'); -$ti-icon-alert-circle: unicode('ea05'); -$ti-icon-alert-circle-filled: unicode('f6ee'); -$ti-icon-alert-hexagon: unicode('f80e'); -$ti-icon-alert-octagon: unicode('ecc6'); -$ti-icon-alert-octagon-filled: unicode('f6ef'); -$ti-icon-alert-small: unicode('f80f'); -$ti-icon-alert-square: unicode('f811'); -$ti-icon-alert-square-rounded: unicode('f810'); -$ti-icon-alert-triangle: unicode('ea06'); -$ti-icon-alert-triangle-filled: unicode('f6f0'); -$ti-icon-alien: unicode('ebde'); -$ti-icon-alien-filled: unicode('f70d'); -$ti-icon-align-box-bottom-center: unicode('f530'); -$ti-icon-align-box-bottom-center-filled: unicode('f70e'); -$ti-icon-align-box-bottom-left: unicode('f531'); -$ti-icon-align-box-bottom-left-filled: unicode('f70f'); -$ti-icon-align-box-bottom-right: unicode('f532'); -$ti-icon-align-box-bottom-right-filled: unicode('f710'); -$ti-icon-align-box-center-middle: unicode('f79f'); -$ti-icon-align-box-center-middle-filled: unicode('f7d4'); -$ti-icon-align-box-left-bottom: unicode('f533'); -$ti-icon-align-box-left-bottom-filled: unicode('f711'); -$ti-icon-align-box-left-middle: unicode('f534'); -$ti-icon-align-box-left-middle-filled: unicode('f712'); -$ti-icon-align-box-left-top: unicode('f535'); -$ti-icon-align-box-left-top-filled: unicode('f713'); -$ti-icon-align-box-right-bottom: unicode('f536'); -$ti-icon-align-box-right-bottom-filled: unicode('f714'); -$ti-icon-align-box-right-middle: unicode('f537'); -$ti-icon-align-box-right-middle-filled: unicode('f7d5'); -$ti-icon-align-box-right-top: unicode('f538'); -$ti-icon-align-box-right-top-filled: unicode('f715'); -$ti-icon-align-box-top-center: unicode('f539'); -$ti-icon-align-box-top-center-filled: unicode('f716'); -$ti-icon-align-box-top-left: unicode('f53a'); -$ti-icon-align-box-top-left-filled: unicode('f717'); -$ti-icon-align-box-top-right: unicode('f53b'); -$ti-icon-align-box-top-right-filled: unicode('f718'); -$ti-icon-align-center: unicode('ea07'); -$ti-icon-align-justified: unicode('ea08'); -$ti-icon-align-left: unicode('ea09'); -$ti-icon-align-right: unicode('ea0a'); -$ti-icon-alpha: unicode('f543'); -$ti-icon-alphabet-cyrillic: unicode('f1df'); -$ti-icon-alphabet-greek: unicode('f1e0'); -$ti-icon-alphabet-latin: unicode('f1e1'); -$ti-icon-ambulance: unicode('ebf5'); -$ti-icon-ampersand: unicode('f229'); -$ti-icon-analyze: unicode('f3a3'); -$ti-icon-analyze-filled: unicode('f719'); -$ti-icon-analyze-off: unicode('f3ba'); -$ti-icon-anchor: unicode('eb76'); -$ti-icon-anchor-off: unicode('f0f7'); -$ti-icon-angle: unicode('ef20'); -$ti-icon-ankh: unicode('f1cd'); -$ti-icon-antenna: unicode('f094'); -$ti-icon-antenna-bars-1: unicode('ecc7'); -$ti-icon-antenna-bars-2: unicode('ecc8'); -$ti-icon-antenna-bars-3: unicode('ecc9'); -$ti-icon-antenna-bars-4: unicode('ecca'); -$ti-icon-antenna-bars-5: unicode('eccb'); -$ti-icon-antenna-bars-off: unicode('f0aa'); -$ti-icon-antenna-off: unicode('f3bb'); -$ti-icon-aperture: unicode('eb58'); -$ti-icon-aperture-off: unicode('f3bc'); -$ti-icon-api: unicode('effd'); -$ti-icon-api-app: unicode('effc'); -$ti-icon-api-app-off: unicode('f0ab'); -$ti-icon-api-off: unicode('f0f8'); -$ti-icon-app-window: unicode('efe6'); -$ti-icon-app-window-filled: unicode('f71a'); -$ti-icon-apple: unicode('ef21'); -$ti-icon-apps: unicode('ebb6'); -$ti-icon-apps-filled: unicode('f6f1'); -$ti-icon-apps-off: unicode('f0ac'); -$ti-icon-archive: unicode('ea0b'); -$ti-icon-archive-off: unicode('f0ad'); -$ti-icon-armchair: unicode('ef9e'); -$ti-icon-armchair-2: unicode('efe7'); -$ti-icon-armchair-2-off: unicode('f3bd'); -$ti-icon-armchair-off: unicode('f3be'); -$ti-icon-arrow-autofit-content: unicode('ef31'); -$ti-icon-arrow-autofit-content-filled: unicode('f6f2'); -$ti-icon-arrow-autofit-down: unicode('ef32'); -$ti-icon-arrow-autofit-height: unicode('ef33'); -$ti-icon-arrow-autofit-left: unicode('ef34'); -$ti-icon-arrow-autofit-right: unicode('ef35'); -$ti-icon-arrow-autofit-up: unicode('ef36'); -$ti-icon-arrow-autofit-width: unicode('ef37'); -$ti-icon-arrow-back: unicode('ea0c'); -$ti-icon-arrow-back-up: unicode('eb77'); -$ti-icon-arrow-back-up-double: unicode('f9ec'); -$ti-icon-arrow-badge-down: unicode('f60b'); -$ti-icon-arrow-badge-down-filled: unicode('f7d6'); -$ti-icon-arrow-badge-left: unicode('f60c'); -$ti-icon-arrow-badge-left-filled: unicode('f7d7'); -$ti-icon-arrow-badge-right: unicode('f60d'); -$ti-icon-arrow-badge-right-filled: unicode('f7d8'); -$ti-icon-arrow-badge-up: unicode('f60e'); -$ti-icon-arrow-badge-up-filled: unicode('f7d9'); -$ti-icon-arrow-bar-down: unicode('ea0d'); -$ti-icon-arrow-bar-left: unicode('ea0e'); -$ti-icon-arrow-bar-right: unicode('ea0f'); -$ti-icon-arrow-bar-to-down: unicode('ec88'); -$ti-icon-arrow-bar-to-left: unicode('ec89'); -$ti-icon-arrow-bar-to-right: unicode('ec8a'); -$ti-icon-arrow-bar-to-up: unicode('ec8b'); -$ti-icon-arrow-bar-up: unicode('ea10'); -$ti-icon-arrow-bear-left: unicode('f045'); -$ti-icon-arrow-bear-left-2: unicode('f044'); -$ti-icon-arrow-bear-right: unicode('f047'); -$ti-icon-arrow-bear-right-2: unicode('f046'); -$ti-icon-arrow-big-down: unicode('edda'); -$ti-icon-arrow-big-down-filled: unicode('f6c6'); -$ti-icon-arrow-big-down-line: unicode('efe8'); -$ti-icon-arrow-big-down-line-filled: unicode('f6c7'); -$ti-icon-arrow-big-down-lines: unicode('efe9'); -$ti-icon-arrow-big-down-lines-filled: unicode('f6c8'); -$ti-icon-arrow-big-left: unicode('eddb'); -$ti-icon-arrow-big-left-filled: unicode('f6c9'); -$ti-icon-arrow-big-left-line: unicode('efea'); -$ti-icon-arrow-big-left-line-filled: unicode('f6ca'); -$ti-icon-arrow-big-left-lines: unicode('efeb'); -$ti-icon-arrow-big-left-lines-filled: unicode('f6cb'); -$ti-icon-arrow-big-right: unicode('eddc'); -$ti-icon-arrow-big-right-filled: unicode('f6cc'); -$ti-icon-arrow-big-right-line: unicode('efec'); -$ti-icon-arrow-big-right-line-filled: unicode('f6cd'); -$ti-icon-arrow-big-right-lines: unicode('efed'); -$ti-icon-arrow-big-right-lines-filled: unicode('f6ce'); -$ti-icon-arrow-big-up: unicode('eddd'); -$ti-icon-arrow-big-up-filled: unicode('f6cf'); -$ti-icon-arrow-big-up-line: unicode('efee'); -$ti-icon-arrow-big-up-line-filled: unicode('f6d0'); -$ti-icon-arrow-big-up-lines: unicode('efef'); -$ti-icon-arrow-big-up-lines-filled: unicode('f6d1'); -$ti-icon-arrow-bounce: unicode('f3a4'); -$ti-icon-arrow-curve-left: unicode('f048'); -$ti-icon-arrow-curve-right: unicode('f049'); -$ti-icon-arrow-down: unicode('ea16'); -$ti-icon-arrow-down-bar: unicode('ed98'); -$ti-icon-arrow-down-circle: unicode('ea11'); -$ti-icon-arrow-down-left: unicode('ea13'); -$ti-icon-arrow-down-left-circle: unicode('ea12'); -$ti-icon-arrow-down-rhombus: unicode('f61d'); -$ti-icon-arrow-down-right: unicode('ea15'); -$ti-icon-arrow-down-right-circle: unicode('ea14'); -$ti-icon-arrow-down-square: unicode('ed9a'); -$ti-icon-arrow-down-tail: unicode('ed9b'); -$ti-icon-arrow-elbow-left: unicode('f9ed'); -$ti-icon-arrow-elbow-right: unicode('f9ee'); -$ti-icon-arrow-fork: unicode('f04a'); -$ti-icon-arrow-forward: unicode('ea17'); -$ti-icon-arrow-forward-up: unicode('eb78'); -$ti-icon-arrow-forward-up-double: unicode('f9ef'); -$ti-icon-arrow-guide: unicode('f22a'); -$ti-icon-arrow-iteration: unicode('f578'); -$ti-icon-arrow-left: unicode('ea19'); -$ti-icon-arrow-left-bar: unicode('ed9c'); -$ti-icon-arrow-left-circle: unicode('ea18'); -$ti-icon-arrow-left-rhombus: unicode('f61e'); -$ti-icon-arrow-left-right: unicode('f04b'); -$ti-icon-arrow-left-square: unicode('ed9d'); -$ti-icon-arrow-left-tail: unicode('ed9e'); -$ti-icon-arrow-loop-left: unicode('ed9f'); -$ti-icon-arrow-loop-left-2: unicode('f04c'); -$ti-icon-arrow-loop-right: unicode('eda0'); -$ti-icon-arrow-loop-right-2: unicode('f04d'); -$ti-icon-arrow-merge: unicode('f04e'); -$ti-icon-arrow-merge-both: unicode('f23b'); -$ti-icon-arrow-merge-left: unicode('f23c'); -$ti-icon-arrow-merge-right: unicode('f23d'); -$ti-icon-arrow-move-down: unicode('f2ba'); -$ti-icon-arrow-move-left: unicode('f2bb'); -$ti-icon-arrow-move-right: unicode('f2bc'); -$ti-icon-arrow-move-up: unicode('f2bd'); -$ti-icon-arrow-narrow-down: unicode('ea1a'); -$ti-icon-arrow-narrow-left: unicode('ea1b'); -$ti-icon-arrow-narrow-right: unicode('ea1c'); -$ti-icon-arrow-narrow-up: unicode('ea1d'); -$ti-icon-arrow-ramp-left: unicode('ed3c'); -$ti-icon-arrow-ramp-left-2: unicode('f04f'); -$ti-icon-arrow-ramp-left-3: unicode('f050'); -$ti-icon-arrow-ramp-right: unicode('ed3d'); -$ti-icon-arrow-ramp-right-2: unicode('f051'); -$ti-icon-arrow-ramp-right-3: unicode('f052'); -$ti-icon-arrow-right: unicode('ea1f'); -$ti-icon-arrow-right-bar: unicode('eda1'); -$ti-icon-arrow-right-circle: unicode('ea1e'); -$ti-icon-arrow-right-rhombus: unicode('f61f'); -$ti-icon-arrow-right-square: unicode('eda2'); -$ti-icon-arrow-right-tail: unicode('eda3'); -$ti-icon-arrow-rotary-first-left: unicode('f053'); -$ti-icon-arrow-rotary-first-right: unicode('f054'); -$ti-icon-arrow-rotary-last-left: unicode('f055'); -$ti-icon-arrow-rotary-last-right: unicode('f056'); -$ti-icon-arrow-rotary-left: unicode('f057'); -$ti-icon-arrow-rotary-right: unicode('f058'); -$ti-icon-arrow-rotary-straight: unicode('f059'); -$ti-icon-arrow-roundabout-left: unicode('f22b'); -$ti-icon-arrow-roundabout-right: unicode('f22c'); -$ti-icon-arrow-sharp-turn-left: unicode('f05a'); -$ti-icon-arrow-sharp-turn-right: unicode('f05b'); -$ti-icon-arrow-up: unicode('ea25'); -$ti-icon-arrow-up-bar: unicode('eda4'); -$ti-icon-arrow-up-circle: unicode('ea20'); -$ti-icon-arrow-up-left: unicode('ea22'); -$ti-icon-arrow-up-left-circle: unicode('ea21'); -$ti-icon-arrow-up-rhombus: unicode('f620'); -$ti-icon-arrow-up-right: unicode('ea24'); -$ti-icon-arrow-up-right-circle: unicode('ea23'); -$ti-icon-arrow-up-square: unicode('eda6'); -$ti-icon-arrow-up-tail: unicode('eda7'); -$ti-icon-arrow-wave-left-down: unicode('eda8'); -$ti-icon-arrow-wave-left-up: unicode('eda9'); -$ti-icon-arrow-wave-right-down: unicode('edaa'); -$ti-icon-arrow-wave-right-up: unicode('edab'); -$ti-icon-arrow-zig-zag: unicode('f4a7'); -$ti-icon-arrows-cross: unicode('effe'); -$ti-icon-arrows-diagonal: unicode('ea27'); -$ti-icon-arrows-diagonal-2: unicode('ea26'); -$ti-icon-arrows-diagonal-minimize: unicode('ef39'); -$ti-icon-arrows-diagonal-minimize-2: unicode('ef38'); -$ti-icon-arrows-diff: unicode('f296'); -$ti-icon-arrows-double-ne-sw: unicode('edde'); -$ti-icon-arrows-double-nw-se: unicode('eddf'); -$ti-icon-arrows-double-se-nw: unicode('ede0'); -$ti-icon-arrows-double-sw-ne: unicode('ede1'); -$ti-icon-arrows-down: unicode('edad'); -$ti-icon-arrows-down-up: unicode('edac'); -$ti-icon-arrows-exchange: unicode('f1f4'); -$ti-icon-arrows-exchange-2: unicode('f1f3'); -$ti-icon-arrows-horizontal: unicode('eb59'); -$ti-icon-arrows-join: unicode('edaf'); -$ti-icon-arrows-join-2: unicode('edae'); -$ti-icon-arrows-left: unicode('edb1'); -$ti-icon-arrows-left-down: unicode('ee00'); -$ti-icon-arrows-left-right: unicode('edb0'); -$ti-icon-arrows-maximize: unicode('ea28'); -$ti-icon-arrows-minimize: unicode('ea29'); -$ti-icon-arrows-move: unicode('f22f'); -$ti-icon-arrows-move-horizontal: unicode('f22d'); -$ti-icon-arrows-move-vertical: unicode('f22e'); -$ti-icon-arrows-random: unicode('f095'); -$ti-icon-arrows-right: unicode('edb3'); -$ti-icon-arrows-right-down: unicode('ee01'); -$ti-icon-arrows-right-left: unicode('edb2'); -$ti-icon-arrows-shuffle: unicode('f000'); -$ti-icon-arrows-shuffle-2: unicode('efff'); -$ti-icon-arrows-sort: unicode('eb5a'); -$ti-icon-arrows-split: unicode('edb5'); -$ti-icon-arrows-split-2: unicode('edb4'); -$ti-icon-arrows-transfer-down: unicode('f2cc'); -$ti-icon-arrows-transfer-up: unicode('f2cd'); -$ti-icon-arrows-up: unicode('edb7'); -$ti-icon-arrows-up-down: unicode('edb6'); -$ti-icon-arrows-up-left: unicode('ee02'); -$ti-icon-arrows-up-right: unicode('ee03'); -$ti-icon-arrows-vertical: unicode('eb5b'); -$ti-icon-artboard: unicode('ea2a'); -$ti-icon-artboard-off: unicode('f0ae'); -$ti-icon-article: unicode('f1e2'); -$ti-icon-article-filled-filled: unicode('f7da'); -$ti-icon-article-off: unicode('f3bf'); -$ti-icon-aspect-ratio: unicode('ed30'); -$ti-icon-aspect-ratio-filled: unicode('f7db'); -$ti-icon-aspect-ratio-off: unicode('f0af'); -$ti-icon-assembly: unicode('f24d'); -$ti-icon-assembly-off: unicode('f3c0'); -$ti-icon-asset: unicode('f1ce'); -$ti-icon-asterisk: unicode('efd5'); -$ti-icon-asterisk-simple: unicode('efd4'); -$ti-icon-at: unicode('ea2b'); -$ti-icon-at-off: unicode('f0b0'); -$ti-icon-atom: unicode('eb79'); -$ti-icon-atom-2: unicode('ebdf'); -$ti-icon-atom-2-filled: unicode('f71b'); -$ti-icon-atom-off: unicode('f0f9'); -$ti-icon-augmented-reality: unicode('f023'); -$ti-icon-augmented-reality-2: unicode('f37e'); -$ti-icon-augmented-reality-off: unicode('f3c1'); -$ti-icon-award: unicode('ea2c'); -$ti-icon-award-filled: unicode('f71c'); -$ti-icon-award-off: unicode('f0fa'); -$ti-icon-axe: unicode('ef9f'); -$ti-icon-axis-x: unicode('ef45'); -$ti-icon-axis-y: unicode('ef46'); -$ti-icon-baby-bottle: unicode('f5d2'); -$ti-icon-baby-carriage: unicode('f05d'); -$ti-icon-backhoe: unicode('ed86'); -$ti-icon-backpack: unicode('ef47'); -$ti-icon-backpack-off: unicode('f3c2'); -$ti-icon-backspace: unicode('ea2d'); -$ti-icon-backspace-filled: unicode('f7dc'); -$ti-icon-badge: unicode('efc2'); -$ti-icon-badge-3d: unicode('f555'); -$ti-icon-badge-4k: unicode('f556'); -$ti-icon-badge-8k: unicode('f557'); -$ti-icon-badge-ad: unicode('f558'); -$ti-icon-badge-ar: unicode('f559'); -$ti-icon-badge-cc: unicode('f55a'); -$ti-icon-badge-filled: unicode('f667'); -$ti-icon-badge-hd: unicode('f55b'); -$ti-icon-badge-off: unicode('f0fb'); -$ti-icon-badge-sd: unicode('f55c'); -$ti-icon-badge-tm: unicode('f55d'); -$ti-icon-badge-vo: unicode('f55e'); -$ti-icon-badge-vr: unicode('f55f'); -$ti-icon-badge-wc: unicode('f560'); -$ti-icon-badges: unicode('efc3'); -$ti-icon-badges-filled: unicode('f7dd'); -$ti-icon-badges-off: unicode('f0fc'); -$ti-icon-baguette: unicode('f3a5'); -$ti-icon-ball-american-football: unicode('ee04'); -$ti-icon-ball-american-football-off: unicode('f3c3'); -$ti-icon-ball-baseball: unicode('efa0'); -$ti-icon-ball-basketball: unicode('ec28'); -$ti-icon-ball-bowling: unicode('ec29'); -$ti-icon-ball-football: unicode('ee06'); -$ti-icon-ball-football-off: unicode('ee05'); -$ti-icon-ball-tennis: unicode('ec2a'); -$ti-icon-ball-volleyball: unicode('ec2b'); -$ti-icon-balloon: unicode('ef3a'); -$ti-icon-balloon-off: unicode('f0fd'); -$ti-icon-ballpen: unicode('f06e'); -$ti-icon-ballpen-off: unicode('f0b1'); -$ti-icon-ban: unicode('ea2e'); -$ti-icon-bandage: unicode('eb7a'); -$ti-icon-bandage-filled: unicode('f7de'); -$ti-icon-bandage-off: unicode('f3c4'); -$ti-icon-barbell: unicode('eff0'); -$ti-icon-barbell-off: unicode('f0b2'); -$ti-icon-barcode: unicode('ebc6'); -$ti-icon-barcode-off: unicode('f0b3'); -$ti-icon-barrel: unicode('f0b4'); -$ti-icon-barrel-off: unicode('f0fe'); -$ti-icon-barrier-block: unicode('f00e'); -$ti-icon-barrier-block-off: unicode('f0b5'); -$ti-icon-baseline: unicode('f024'); -$ti-icon-baseline-density-large: unicode('f9f0'); -$ti-icon-baseline-density-medium: unicode('f9f1'); -$ti-icon-baseline-density-small: unicode('f9f2'); -$ti-icon-basket: unicode('ebe1'); -$ti-icon-basket-filled: unicode('f7df'); -$ti-icon-basket-off: unicode('f0b6'); -$ti-icon-bat: unicode('f284'); -$ti-icon-bath: unicode('ef48'); -$ti-icon-bath-filled: unicode('f71d'); -$ti-icon-bath-off: unicode('f0ff'); -$ti-icon-battery: unicode('ea34'); -$ti-icon-battery-1: unicode('ea2f'); -$ti-icon-battery-1-filled: unicode('f71e'); -$ti-icon-battery-2: unicode('ea30'); -$ti-icon-battery-2-filled: unicode('f71f'); -$ti-icon-battery-3: unicode('ea31'); -$ti-icon-battery-3-filled: unicode('f720'); -$ti-icon-battery-4: unicode('ea32'); -$ti-icon-battery-4-filled: unicode('f721'); -$ti-icon-battery-automotive: unicode('ee07'); -$ti-icon-battery-charging: unicode('ea33'); -$ti-icon-battery-charging-2: unicode('ef3b'); -$ti-icon-battery-eco: unicode('ef3c'); -$ti-icon-battery-filled: unicode('f668'); -$ti-icon-battery-off: unicode('ed1c'); -$ti-icon-beach: unicode('ef3d'); -$ti-icon-beach-off: unicode('f0b7'); -$ti-icon-bed: unicode('eb5c'); -$ti-icon-bed-filled: unicode('f7e0'); -$ti-icon-bed-off: unicode('f100'); -$ti-icon-beer: unicode('efa1'); -$ti-icon-beer-filled: unicode('f7e1'); -$ti-icon-beer-off: unicode('f101'); -$ti-icon-bell: unicode('ea35'); -$ti-icon-bell-bolt: unicode('f812'); -$ti-icon-bell-cancel: unicode('f813'); -$ti-icon-bell-check: unicode('f814'); -$ti-icon-bell-code: unicode('f815'); -$ti-icon-bell-cog: unicode('f816'); -$ti-icon-bell-dollar: unicode('f817'); -$ti-icon-bell-down: unicode('f818'); -$ti-icon-bell-exclamation: unicode('f819'); -$ti-icon-bell-filled: unicode('f669'); -$ti-icon-bell-heart: unicode('f81a'); -$ti-icon-bell-minus: unicode('ede2'); -$ti-icon-bell-minus-filled: unicode('f722'); -$ti-icon-bell-off: unicode('ece9'); -$ti-icon-bell-pause: unicode('f81b'); -$ti-icon-bell-pin: unicode('f81c'); -$ti-icon-bell-plus: unicode('ede3'); -$ti-icon-bell-plus-filled: unicode('f723'); -$ti-icon-bell-question: unicode('f81d'); -$ti-icon-bell-ringing: unicode('ed07'); -$ti-icon-bell-ringing-2: unicode('ede4'); -$ti-icon-bell-ringing-2-filled: unicode('f724'); -$ti-icon-bell-ringing-filled: unicode('f725'); -$ti-icon-bell-school: unicode('f05e'); -$ti-icon-bell-search: unicode('f81e'); -$ti-icon-bell-share: unicode('f81f'); -$ti-icon-bell-star: unicode('f820'); -$ti-icon-bell-up: unicode('f821'); -$ti-icon-bell-x: unicode('ede5'); -$ti-icon-bell-x-filled: unicode('f726'); -$ti-icon-bell-z: unicode('eff1'); -$ti-icon-bell-z-filled: unicode('f727'); -$ti-icon-beta: unicode('f544'); -$ti-icon-bible: unicode('efc4'); -$ti-icon-bike: unicode('ea36'); -$ti-icon-bike-off: unicode('f0b8'); -$ti-icon-binary: unicode('ee08'); -$ti-icon-binary-off: unicode('f3c5'); -$ti-icon-binary-tree: unicode('f5d4'); -$ti-icon-binary-tree-2: unicode('f5d3'); -$ti-icon-biohazard: unicode('ecb8'); -$ti-icon-biohazard-off: unicode('f0b9'); -$ti-icon-blade: unicode('f4bd'); -$ti-icon-blade-filled: unicode('f7e2'); -$ti-icon-bleach: unicode('f2f3'); -$ti-icon-bleach-chlorine: unicode('f2f0'); -$ti-icon-bleach-no-chlorine: unicode('f2f1'); -$ti-icon-bleach-off: unicode('f2f2'); -$ti-icon-blockquote: unicode('ee09'); -$ti-icon-bluetooth: unicode('ea37'); -$ti-icon-bluetooth-connected: unicode('ecea'); -$ti-icon-bluetooth-off: unicode('eceb'); -$ti-icon-bluetooth-x: unicode('f081'); -$ti-icon-blur: unicode('ef8c'); -$ti-icon-blur-off: unicode('f3c6'); -$ti-icon-bmp: unicode('f3a6'); -$ti-icon-bold: unicode('eb7b'); -$ti-icon-bold-off: unicode('f0ba'); -$ti-icon-bolt: unicode('ea38'); -$ti-icon-bolt-off: unicode('ecec'); -$ti-icon-bomb: unicode('f59c'); -$ti-icon-bone: unicode('edb8'); -$ti-icon-bone-off: unicode('f0bb'); -$ti-icon-bong: unicode('f3a7'); -$ti-icon-bong-off: unicode('f3c7'); -$ti-icon-book: unicode('ea39'); -$ti-icon-book-2: unicode('efc5'); -$ti-icon-book-download: unicode('f070'); -$ti-icon-book-off: unicode('f0bc'); -$ti-icon-book-upload: unicode('f071'); -$ti-icon-bookmark: unicode('ea3a'); -$ti-icon-bookmark-off: unicode('eced'); -$ti-icon-bookmarks: unicode('ed08'); -$ti-icon-bookmarks-off: unicode('f0bd'); -$ti-icon-books: unicode('eff2'); -$ti-icon-books-off: unicode('f0be'); -$ti-icon-border-all: unicode('ea3b'); -$ti-icon-border-bottom: unicode('ea3c'); -$ti-icon-border-corners: unicode('f7a0'); -$ti-icon-border-horizontal: unicode('ea3d'); -$ti-icon-border-inner: unicode('ea3e'); -$ti-icon-border-left: unicode('ea3f'); -$ti-icon-border-none: unicode('ea40'); -$ti-icon-border-outer: unicode('ea41'); -$ti-icon-border-radius: unicode('eb7c'); -$ti-icon-border-right: unicode('ea42'); -$ti-icon-border-sides: unicode('f7a1'); -$ti-icon-border-style: unicode('ee0a'); -$ti-icon-border-style-2: unicode('ef22'); -$ti-icon-border-top: unicode('ea43'); -$ti-icon-border-vertical: unicode('ea44'); -$ti-icon-bottle: unicode('ef0b'); -$ti-icon-bottle-off: unicode('f3c8'); -$ti-icon-bounce-left: unicode('f59d'); -$ti-icon-bounce-right: unicode('f59e'); -$ti-icon-bow: unicode('f096'); -$ti-icon-bowl: unicode('f4fa'); -$ti-icon-box: unicode('ea45'); -$ti-icon-box-align-bottom: unicode('f2a8'); -$ti-icon-box-align-bottom-left: unicode('f2ce'); -$ti-icon-box-align-bottom-right: unicode('f2cf'); -$ti-icon-box-align-left: unicode('f2a9'); -$ti-icon-box-align-right: unicode('f2aa'); -$ti-icon-box-align-top: unicode('f2ab'); -$ti-icon-box-align-top-left: unicode('f2d0'); -$ti-icon-box-align-top-right: unicode('f2d1'); -$ti-icon-box-margin: unicode('ee0b'); -$ti-icon-box-model: unicode('ee0c'); -$ti-icon-box-model-2: unicode('ef23'); -$ti-icon-box-model-2-off: unicode('f3c9'); -$ti-icon-box-model-off: unicode('f3ca'); -$ti-icon-box-multiple: unicode('ee17'); -$ti-icon-box-multiple-0: unicode('ee0d'); -$ti-icon-box-multiple-1: unicode('ee0e'); -$ti-icon-box-multiple-2: unicode('ee0f'); -$ti-icon-box-multiple-3: unicode('ee10'); -$ti-icon-box-multiple-4: unicode('ee11'); -$ti-icon-box-multiple-5: unicode('ee12'); -$ti-icon-box-multiple-6: unicode('ee13'); -$ti-icon-box-multiple-7: unicode('ee14'); -$ti-icon-box-multiple-8: unicode('ee15'); -$ti-icon-box-multiple-9: unicode('ee16'); -$ti-icon-box-off: unicode('f102'); -$ti-icon-box-padding: unicode('ee18'); -$ti-icon-box-seam: unicode('f561'); -$ti-icon-braces: unicode('ebcc'); -$ti-icon-braces-off: unicode('f0bf'); -$ti-icon-brackets: unicode('ebcd'); -$ti-icon-brackets-contain: unicode('f1e5'); -$ti-icon-brackets-contain-end: unicode('f1e3'); -$ti-icon-brackets-contain-start: unicode('f1e4'); -$ti-icon-brackets-off: unicode('f0c0'); -$ti-icon-braille: unicode('f545'); -$ti-icon-brain: unicode('f59f'); -$ti-icon-brand-4chan: unicode('f494'); -$ti-icon-brand-abstract: unicode('f495'); -$ti-icon-brand-adobe: unicode('f0dc'); -$ti-icon-brand-adonis-js: unicode('f496'); -$ti-icon-brand-airbnb: unicode('ed68'); -$ti-icon-brand-airtable: unicode('ef6a'); -$ti-icon-brand-algolia: unicode('f390'); -$ti-icon-brand-alipay: unicode('f7a2'); -$ti-icon-brand-alpine-js: unicode('f324'); -$ti-icon-brand-amazon: unicode('f230'); -$ti-icon-brand-amd: unicode('f653'); -$ti-icon-brand-amigo: unicode('f5f9'); -$ti-icon-brand-among-us: unicode('f205'); -$ti-icon-brand-android: unicode('ec16'); -$ti-icon-brand-angular: unicode('ef6b'); -$ti-icon-brand-ao3: unicode('f5e8'); -$ti-icon-brand-appgallery: unicode('f231'); -$ti-icon-brand-apple: unicode('ec17'); -$ti-icon-brand-apple-arcade: unicode('ed69'); -$ti-icon-brand-apple-podcast: unicode('f1e6'); -$ti-icon-brand-appstore: unicode('ed24'); -$ti-icon-brand-asana: unicode('edc5'); -$ti-icon-brand-backbone: unicode('f325'); -$ti-icon-brand-badoo: unicode('f206'); -$ti-icon-brand-baidu: unicode('f5e9'); -$ti-icon-brand-bandcamp: unicode('f207'); -$ti-icon-brand-bandlab: unicode('f5fa'); -$ti-icon-brand-beats: unicode('f208'); -$ti-icon-brand-behance: unicode('ec6e'); -$ti-icon-brand-bilibili: unicode('f6d2'); -$ti-icon-brand-binance: unicode('f5a0'); -$ti-icon-brand-bing: unicode('edc6'); -$ti-icon-brand-bitbucket: unicode('edc7'); -$ti-icon-brand-blackberry: unicode('f568'); -$ti-icon-brand-blender: unicode('f326'); -$ti-icon-brand-blogger: unicode('f35a'); -$ti-icon-brand-booking: unicode('edc8'); -$ti-icon-brand-bootstrap: unicode('ef3e'); -$ti-icon-brand-bulma: unicode('f327'); -$ti-icon-brand-bumble: unicode('f5fb'); -$ti-icon-brand-bunpo: unicode('f4cf'); -$ti-icon-brand-c-sharp: unicode('f003'); -$ti-icon-brand-cake: unicode('f7a3'); -$ti-icon-brand-cakephp: unicode('f7af'); -$ti-icon-brand-campaignmonitor: unicode('f328'); -$ti-icon-brand-carbon: unicode('f348'); -$ti-icon-brand-cashapp: unicode('f391'); -$ti-icon-brand-chrome: unicode('ec18'); -$ti-icon-brand-citymapper: unicode('f5fc'); -$ti-icon-brand-codecov: unicode('f329'); -$ti-icon-brand-codepen: unicode('ec6f'); -$ti-icon-brand-codesandbox: unicode('ed6a'); -$ti-icon-brand-cohost: unicode('f5d5'); -$ti-icon-brand-coinbase: unicode('f209'); -$ti-icon-brand-comedy-central: unicode('f217'); -$ti-icon-brand-coreos: unicode('f5fd'); -$ti-icon-brand-couchdb: unicode('f60f'); -$ti-icon-brand-couchsurfing: unicode('f392'); -$ti-icon-brand-cpp: unicode('f5fe'); -$ti-icon-brand-crunchbase: unicode('f7e3'); -$ti-icon-brand-css3: unicode('ed6b'); -$ti-icon-brand-ctemplar: unicode('f4d0'); -$ti-icon-brand-cucumber: unicode('ef6c'); -$ti-icon-brand-cupra: unicode('f4d1'); -$ti-icon-brand-cypress: unicode('f333'); -$ti-icon-brand-d3: unicode('f24e'); -$ti-icon-brand-days-counter: unicode('f4d2'); -$ti-icon-brand-dcos: unicode('f32a'); -$ti-icon-brand-debian: unicode('ef57'); -$ti-icon-brand-deezer: unicode('f78b'); -$ti-icon-brand-deliveroo: unicode('f4d3'); -$ti-icon-brand-deno: unicode('f24f'); -$ti-icon-brand-denodo: unicode('f610'); -$ti-icon-brand-deviantart: unicode('ecfb'); -$ti-icon-brand-dingtalk: unicode('f5ea'); -$ti-icon-brand-discord: unicode('ece3'); -$ti-icon-brand-discord-filled: unicode('f7e4'); -$ti-icon-brand-disney: unicode('f20a'); -$ti-icon-brand-disqus: unicode('edc9'); -$ti-icon-brand-django: unicode('f349'); -$ti-icon-brand-docker: unicode('edca'); -$ti-icon-brand-doctrine: unicode('ef6d'); -$ti-icon-brand-dolby-digital: unicode('f4d4'); -$ti-icon-brand-douban: unicode('f5ff'); -$ti-icon-brand-dribbble: unicode('ec19'); -$ti-icon-brand-dribbble-filled: unicode('f7e5'); -$ti-icon-brand-drops: unicode('f4d5'); -$ti-icon-brand-drupal: unicode('f393'); -$ti-icon-brand-edge: unicode('ecfc'); -$ti-icon-brand-elastic: unicode('f611'); -$ti-icon-brand-ember: unicode('f497'); -$ti-icon-brand-envato: unicode('f394'); -$ti-icon-brand-etsy: unicode('f654'); -$ti-icon-brand-evernote: unicode('f600'); -$ti-icon-brand-facebook: unicode('ec1a'); -$ti-icon-brand-facebook-filled: unicode('f7e6'); -$ti-icon-brand-figma: unicode('ec93'); -$ti-icon-brand-finder: unicode('f218'); -$ti-icon-brand-firebase: unicode('ef6e'); -$ti-icon-brand-firefox: unicode('ecfd'); -$ti-icon-brand-fiverr: unicode('f7a4'); -$ti-icon-brand-flickr: unicode('ecfe'); -$ti-icon-brand-flightradar24: unicode('f4d6'); -$ti-icon-brand-flipboard: unicode('f20b'); -$ti-icon-brand-flutter: unicode('f395'); -$ti-icon-brand-fortnite: unicode('f260'); -$ti-icon-brand-foursquare: unicode('ecff'); -$ti-icon-brand-framer: unicode('ec1b'); -$ti-icon-brand-framer-motion: unicode('f78c'); -$ti-icon-brand-funimation: unicode('f655'); -$ti-icon-brand-gatsby: unicode('f396'); -$ti-icon-brand-git: unicode('ef6f'); -$ti-icon-brand-github: unicode('ec1c'); -$ti-icon-brand-github-copilot: unicode('f4a8'); -$ti-icon-brand-github-filled: unicode('f7e7'); -$ti-icon-brand-gitlab: unicode('ec1d'); -$ti-icon-brand-gmail: unicode('efa2'); -$ti-icon-brand-golang: unicode('f78d'); -$ti-icon-brand-google: unicode('ec1f'); -$ti-icon-brand-google-analytics: unicode('edcb'); -$ti-icon-brand-google-big-query: unicode('f612'); -$ti-icon-brand-google-drive: unicode('ec1e'); -$ti-icon-brand-google-fit: unicode('f297'); -$ti-icon-brand-google-home: unicode('f601'); -$ti-icon-brand-google-one: unicode('f232'); -$ti-icon-brand-google-photos: unicode('f20c'); -$ti-icon-brand-google-play: unicode('ed25'); -$ti-icon-brand-google-podcasts: unicode('f656'); -$ti-icon-brand-grammarly: unicode('f32b'); -$ti-icon-brand-graphql: unicode('f32c'); -$ti-icon-brand-gravatar: unicode('edcc'); -$ti-icon-brand-grindr: unicode('f20d'); -$ti-icon-brand-guardian: unicode('f4fb'); -$ti-icon-brand-gumroad: unicode('f5d6'); -$ti-icon-brand-hbo: unicode('f657'); -$ti-icon-brand-headlessui: unicode('f32d'); -$ti-icon-brand-hipchat: unicode('edcd'); -$ti-icon-brand-html5: unicode('ed6c'); -$ti-icon-brand-inertia: unicode('f34a'); -$ti-icon-brand-instagram: unicode('ec20'); -$ti-icon-brand-intercom: unicode('f1cf'); -$ti-icon-brand-javascript: unicode('ef0c'); -$ti-icon-brand-juejin: unicode('f7b0'); -$ti-icon-brand-kickstarter: unicode('edce'); -$ti-icon-brand-kotlin: unicode('ed6d'); -$ti-icon-brand-laravel: unicode('f34b'); -$ti-icon-brand-lastfm: unicode('f001'); -$ti-icon-brand-line: unicode('f7e8'); -$ti-icon-brand-linkedin: unicode('ec8c'); -$ti-icon-brand-linktree: unicode('f1e7'); -$ti-icon-brand-linqpad: unicode('f562'); -$ti-icon-brand-loom: unicode('ef70'); -$ti-icon-brand-mailgun: unicode('f32e'); -$ti-icon-brand-mantine: unicode('f32f'); -$ti-icon-brand-mastercard: unicode('ef49'); -$ti-icon-brand-mastodon: unicode('f250'); -$ti-icon-brand-matrix: unicode('f5eb'); -$ti-icon-brand-mcdonalds: unicode('f251'); -$ti-icon-brand-medium: unicode('ec70'); -$ti-icon-brand-mercedes: unicode('f072'); -$ti-icon-brand-messenger: unicode('ec71'); -$ti-icon-brand-meta: unicode('efb0'); -$ti-icon-brand-miniprogram: unicode('f602'); -$ti-icon-brand-mixpanel: unicode('f397'); -$ti-icon-brand-monday: unicode('f219'); -$ti-icon-brand-mongodb: unicode('f613'); -$ti-icon-brand-my-oppo: unicode('f4d7'); -$ti-icon-brand-mysql: unicode('f614'); -$ti-icon-brand-national-geographic: unicode('f603'); -$ti-icon-brand-nem: unicode('f5a1'); -$ti-icon-brand-netbeans: unicode('ef71'); -$ti-icon-brand-netease-music: unicode('f604'); -$ti-icon-brand-netflix: unicode('edcf'); -$ti-icon-brand-nexo: unicode('f5a2'); -$ti-icon-brand-nextcloud: unicode('f4d8'); -$ti-icon-brand-nextjs: unicode('f0dd'); -$ti-icon-brand-nord-vpn: unicode('f37f'); -$ti-icon-brand-notion: unicode('ef7b'); -$ti-icon-brand-npm: unicode('f569'); -$ti-icon-brand-nuxt: unicode('f0de'); -$ti-icon-brand-nytimes: unicode('ef8d'); -$ti-icon-brand-office: unicode('f398'); -$ti-icon-brand-ok-ru: unicode('f399'); -$ti-icon-brand-onedrive: unicode('f5d7'); -$ti-icon-brand-onlyfans: unicode('f605'); -$ti-icon-brand-open-source: unicode('edd0'); -$ti-icon-brand-openai: unicode('f78e'); -$ti-icon-brand-openvpn: unicode('f39a'); -$ti-icon-brand-opera: unicode('ec21'); -$ti-icon-brand-pagekit: unicode('edd1'); -$ti-icon-brand-patreon: unicode('edd2'); -$ti-icon-brand-paypal: unicode('ec22'); -$ti-icon-brand-paypal-filled: unicode('f7e9'); -$ti-icon-brand-paypay: unicode('f5ec'); -$ti-icon-brand-peanut: unicode('f39b'); -$ti-icon-brand-pepsi: unicode('f261'); -$ti-icon-brand-php: unicode('ef72'); -$ti-icon-brand-picsart: unicode('f4d9'); -$ti-icon-brand-pinterest: unicode('ec8d'); -$ti-icon-brand-planetscale: unicode('f78f'); -$ti-icon-brand-pocket: unicode('ed00'); -$ti-icon-brand-polymer: unicode('f498'); -$ti-icon-brand-powershell: unicode('f5ed'); -$ti-icon-brand-prisma: unicode('f499'); -$ti-icon-brand-producthunt: unicode('edd3'); -$ti-icon-brand-pushbullet: unicode('f330'); -$ti-icon-brand-pushover: unicode('f20e'); -$ti-icon-brand-python: unicode('ed01'); -$ti-icon-brand-qq: unicode('f606'); -$ti-icon-brand-radix-ui: unicode('f790'); -$ti-icon-brand-react: unicode('f34c'); -$ti-icon-brand-react-native: unicode('ef73'); -$ti-icon-brand-reason: unicode('f49a'); -$ti-icon-brand-reddit: unicode('ec8e'); -$ti-icon-brand-redhat: unicode('f331'); -$ti-icon-brand-redux: unicode('f3a8'); -$ti-icon-brand-revolut: unicode('f4da'); -$ti-icon-brand-safari: unicode('ec23'); -$ti-icon-brand-samsungpass: unicode('f4db'); -$ti-icon-brand-sass: unicode('edd4'); -$ti-icon-brand-sentry: unicode('edd5'); -$ti-icon-brand-sharik: unicode('f4dc'); -$ti-icon-brand-shazam: unicode('edd6'); -$ti-icon-brand-shopee: unicode('f252'); -$ti-icon-brand-sketch: unicode('ec24'); -$ti-icon-brand-skype: unicode('ed02'); -$ti-icon-brand-slack: unicode('ec72'); -$ti-icon-brand-snapchat: unicode('ec25'); -$ti-icon-brand-snapseed: unicode('f253'); -$ti-icon-brand-snowflake: unicode('f615'); -$ti-icon-brand-socket-io: unicode('f49b'); -$ti-icon-brand-solidjs: unicode('f5ee'); -$ti-icon-brand-soundcloud: unicode('ed6e'); -$ti-icon-brand-spacehey: unicode('f4fc'); -$ti-icon-brand-spotify: unicode('ed03'); -$ti-icon-brand-stackoverflow: unicode('ef58'); -$ti-icon-brand-stackshare: unicode('f607'); -$ti-icon-brand-steam: unicode('ed6f'); -$ti-icon-brand-storybook: unicode('f332'); -$ti-icon-brand-storytel: unicode('f608'); -$ti-icon-brand-strava: unicode('f254'); -$ti-icon-brand-stripe: unicode('edd7'); -$ti-icon-brand-sublime-text: unicode('ef74'); -$ti-icon-brand-sugarizer: unicode('f7a5'); -$ti-icon-brand-supabase: unicode('f6d3'); -$ti-icon-brand-superhuman: unicode('f50c'); -$ti-icon-brand-supernova: unicode('f49c'); -$ti-icon-brand-surfshark: unicode('f255'); -$ti-icon-brand-svelte: unicode('f0df'); -$ti-icon-brand-symfony: unicode('f616'); -$ti-icon-brand-tabler: unicode('ec8f'); -$ti-icon-brand-tailwind: unicode('eca1'); -$ti-icon-brand-taobao: unicode('f5ef'); -$ti-icon-brand-ted: unicode('f658'); -$ti-icon-brand-telegram: unicode('ec26'); -$ti-icon-brand-tether: unicode('f5a3'); -$ti-icon-brand-threejs: unicode('f5f0'); -$ti-icon-brand-tidal: unicode('ed70'); -$ti-icon-brand-tikto-filled: unicode('f7ea'); -$ti-icon-brand-tiktok: unicode('ec73'); -$ti-icon-brand-tinder: unicode('ed71'); -$ti-icon-brand-topbuzz: unicode('f50d'); -$ti-icon-brand-torchain: unicode('f5a4'); -$ti-icon-brand-toyota: unicode('f262'); -$ti-icon-brand-trello: unicode('f39d'); -$ti-icon-brand-tripadvisor: unicode('f002'); -$ti-icon-brand-tumblr: unicode('ed04'); -$ti-icon-brand-twilio: unicode('f617'); -$ti-icon-brand-twitch: unicode('ed05'); -$ti-icon-brand-twitter: unicode('ec27'); -$ti-icon-brand-twitter-filled: unicode('f7eb'); -$ti-icon-brand-typescript: unicode('f5f1'); -$ti-icon-brand-uber: unicode('ef75'); -$ti-icon-brand-ubuntu: unicode('ef59'); -$ti-icon-brand-unity: unicode('f49d'); -$ti-icon-brand-unsplash: unicode('edd8'); -$ti-icon-brand-upwork: unicode('f39e'); -$ti-icon-brand-valorant: unicode('f39f'); -$ti-icon-brand-vercel: unicode('ef24'); -$ti-icon-brand-vimeo: unicode('ed06'); -$ti-icon-brand-vinted: unicode('f20f'); -$ti-icon-brand-visa: unicode('f380'); -$ti-icon-brand-visual-studio: unicode('ef76'); -$ti-icon-brand-vite: unicode('f5f2'); -$ti-icon-brand-vivaldi: unicode('f210'); -$ti-icon-brand-vk: unicode('ed72'); -$ti-icon-brand-volkswagen: unicode('f50e'); -$ti-icon-brand-vsco: unicode('f334'); -$ti-icon-brand-vscode: unicode('f3a0'); -$ti-icon-brand-vue: unicode('f0e0'); -$ti-icon-brand-walmart: unicode('f211'); -$ti-icon-brand-waze: unicode('f5d8'); -$ti-icon-brand-webflow: unicode('f2d2'); -$ti-icon-brand-wechat: unicode('f5f3'); -$ti-icon-brand-weibo: unicode('f609'); -$ti-icon-brand-whatsapp: unicode('ec74'); -$ti-icon-brand-windows: unicode('ecd8'); -$ti-icon-brand-windy: unicode('f4dd'); -$ti-icon-brand-wish: unicode('f212'); -$ti-icon-brand-wix: unicode('f3a1'); -$ti-icon-brand-wordpress: unicode('f2d3'); -$ti-icon-brand-xbox: unicode('f298'); -$ti-icon-brand-xing: unicode('f21a'); -$ti-icon-brand-yahoo: unicode('ed73'); -$ti-icon-brand-yatse: unicode('f213'); -$ti-icon-brand-ycombinator: unicode('edd9'); -$ti-icon-brand-youtube: unicode('ec90'); -$ti-icon-brand-youtube-kids: unicode('f214'); -$ti-icon-brand-zalando: unicode('f49e'); -$ti-icon-brand-zapier: unicode('f49f'); -$ti-icon-brand-zeit: unicode('f335'); -$ti-icon-brand-zhihu: unicode('f60a'); -$ti-icon-brand-zoom: unicode('f215'); -$ti-icon-brand-zulip: unicode('f4de'); -$ti-icon-brand-zwift: unicode('f216'); -$ti-icon-bread: unicode('efa3'); -$ti-icon-bread-off: unicode('f3cb'); -$ti-icon-briefcase: unicode('ea46'); -$ti-icon-briefcase-off: unicode('f3cc'); -$ti-icon-brightness: unicode('eb7f'); -$ti-icon-brightness-2: unicode('ee19'); -$ti-icon-brightness-down: unicode('eb7d'); -$ti-icon-brightness-half: unicode('ee1a'); -$ti-icon-brightness-off: unicode('f3cd'); -$ti-icon-brightness-up: unicode('eb7e'); -$ti-icon-broadcast: unicode('f1e9'); -$ti-icon-broadcast-off: unicode('f1e8'); -$ti-icon-browser: unicode('ebb7'); -$ti-icon-browser-check: unicode('efd6'); -$ti-icon-browser-off: unicode('f0c1'); -$ti-icon-browser-plus: unicode('efd7'); -$ti-icon-browser-x: unicode('efd8'); -$ti-icon-brush: unicode('ebb8'); -$ti-icon-brush-off: unicode('f0c2'); -$ti-icon-bucket: unicode('ea47'); -$ti-icon-bucket-droplet: unicode('f56a'); -$ti-icon-bucket-off: unicode('f103'); -$ti-icon-bug: unicode('ea48'); -$ti-icon-bug-off: unicode('f0c3'); -$ti-icon-building: unicode('ea4f'); -$ti-icon-building-arch: unicode('ea49'); -$ti-icon-building-bank: unicode('ebe2'); -$ti-icon-building-bridge: unicode('ea4b'); -$ti-icon-building-bridge-2: unicode('ea4a'); -$ti-icon-building-broadcast-tower: unicode('f4be'); -$ti-icon-building-carousel: unicode('ed87'); -$ti-icon-building-castle: unicode('ed88'); -$ti-icon-building-church: unicode('ea4c'); -$ti-icon-building-circus: unicode('f4bf'); -$ti-icon-building-community: unicode('ebf6'); -$ti-icon-building-cottage: unicode('ee1b'); -$ti-icon-building-estate: unicode('f5a5'); -$ti-icon-building-factory: unicode('ee1c'); -$ti-icon-building-factory-2: unicode('f082'); -$ti-icon-building-fortress: unicode('ed89'); -$ti-icon-building-hospital: unicode('ea4d'); -$ti-icon-building-lighthouse: unicode('ed8a'); -$ti-icon-building-monument: unicode('ed26'); -$ti-icon-building-pavilion: unicode('ebf7'); -$ti-icon-building-skyscraper: unicode('ec39'); -$ti-icon-building-stadium: unicode('f641'); -$ti-icon-building-store: unicode('ea4e'); -$ti-icon-building-tunnel: unicode('f5a6'); -$ti-icon-building-warehouse: unicode('ebe3'); -$ti-icon-building-wind-turbine: unicode('f4c0'); -$ti-icon-bulb: unicode('ea51'); -$ti-icon-bulb-filled: unicode('f66a'); -$ti-icon-bulb-off: unicode('ea50'); -$ti-icon-bulldozer: unicode('ee1d'); -$ti-icon-bus: unicode('ebe4'); -$ti-icon-bus-off: unicode('f3ce'); -$ti-icon-bus-stop: unicode('f2d4'); -$ti-icon-businessplan: unicode('ee1e'); -$ti-icon-butterfly: unicode('efd9'); -$ti-icon-cactus: unicode('f21b'); -$ti-icon-cactus-off: unicode('f3cf'); -$ti-icon-cake: unicode('f00f'); -$ti-icon-cake-off: unicode('f104'); -$ti-icon-calculator: unicode('eb80'); -$ti-icon-calculator-off: unicode('f0c4'); -$ti-icon-calendar: unicode('ea53'); -$ti-icon-calendar-bolt: unicode('f822'); -$ti-icon-calendar-cancel: unicode('f823'); -$ti-icon-calendar-check: unicode('f824'); -$ti-icon-calendar-code: unicode('f825'); -$ti-icon-calendar-cog: unicode('f826'); -$ti-icon-calendar-dollar: unicode('f827'); -$ti-icon-calendar-down: unicode('f828'); -$ti-icon-calendar-due: unicode('f621'); -$ti-icon-calendar-event: unicode('ea52'); -$ti-icon-calendar-exclamation: unicode('f829'); -$ti-icon-calendar-heart: unicode('f82a'); -$ti-icon-calendar-minus: unicode('ebb9'); -$ti-icon-calendar-off: unicode('ee1f'); -$ti-icon-calendar-pause: unicode('f82b'); -$ti-icon-calendar-pin: unicode('f82c'); -$ti-icon-calendar-plus: unicode('ebba'); -$ti-icon-calendar-question: unicode('f82d'); -$ti-icon-calendar-search: unicode('f82e'); -$ti-icon-calendar-share: unicode('f82f'); -$ti-icon-calendar-star: unicode('f830'); -$ti-icon-calendar-stats: unicode('ee20'); -$ti-icon-calendar-time: unicode('ee21'); -$ti-icon-calendar-up: unicode('f831'); -$ti-icon-calendar-x: unicode('f832'); -$ti-icon-camera: unicode('ea54'); -$ti-icon-camera-bolt: unicode('f833'); -$ti-icon-camera-cancel: unicode('f834'); -$ti-icon-camera-check: unicode('f835'); -$ti-icon-camera-code: unicode('f836'); -$ti-icon-camera-cog: unicode('f837'); -$ti-icon-camera-dollar: unicode('f838'); -$ti-icon-camera-down: unicode('f839'); -$ti-icon-camera-exclamation: unicode('f83a'); -$ti-icon-camera-heart: unicode('f83b'); -$ti-icon-camera-minus: unicode('ec3a'); -$ti-icon-camera-off: unicode('ecee'); -$ti-icon-camera-pause: unicode('f83c'); -$ti-icon-camera-pin: unicode('f83d'); -$ti-icon-camera-plus: unicode('ec3b'); -$ti-icon-camera-question: unicode('f83e'); -$ti-icon-camera-rotate: unicode('ee22'); -$ti-icon-camera-search: unicode('f83f'); -$ti-icon-camera-selfie: unicode('ee23'); -$ti-icon-camera-share: unicode('f840'); -$ti-icon-camera-star: unicode('f841'); -$ti-icon-camera-up: unicode('f842'); -$ti-icon-camera-x: unicode('f843'); -$ti-icon-campfire: unicode('f5a7'); -$ti-icon-candle: unicode('efc6'); -$ti-icon-candy: unicode('ef0d'); -$ti-icon-candy-off: unicode('f0c5'); -$ti-icon-cane: unicode('f50f'); -$ti-icon-cannabis: unicode('f4c1'); -$ti-icon-capture: unicode('ec3c'); -$ti-icon-capture-off: unicode('f0c6'); -$ti-icon-car: unicode('ebbb'); -$ti-icon-car-crane: unicode('ef25'); -$ti-icon-car-crash: unicode('efa4'); -$ti-icon-car-off: unicode('f0c7'); -$ti-icon-car-turbine: unicode('f4fd'); -$ti-icon-caravan: unicode('ec7c'); -$ti-icon-cardboards: unicode('ed74'); -$ti-icon-cardboards-off: unicode('f0c8'); -$ti-icon-cards: unicode('f510'); -$ti-icon-caret-down: unicode('eb5d'); -$ti-icon-caret-left: unicode('eb5e'); -$ti-icon-caret-right: unicode('eb5f'); -$ti-icon-caret-up: unicode('eb60'); -$ti-icon-carousel-horizontal: unicode('f659'); -$ti-icon-carousel-vertical: unicode('f65a'); -$ti-icon-carrot: unicode('f21c'); -$ti-icon-carrot-off: unicode('f3d0'); -$ti-icon-cash: unicode('ea55'); -$ti-icon-cash-banknote: unicode('ee25'); -$ti-icon-cash-banknote-off: unicode('ee24'); -$ti-icon-cash-off: unicode('f105'); -$ti-icon-cast: unicode('ea56'); -$ti-icon-cast-off: unicode('f0c9'); -$ti-icon-cat: unicode('f65b'); -$ti-icon-category: unicode('f1f6'); -$ti-icon-category-2: unicode('f1f5'); -$ti-icon-ce: unicode('ed75'); -$ti-icon-ce-off: unicode('f0ca'); -$ti-icon-cell: unicode('f05f'); -$ti-icon-cell-signal-1: unicode('f083'); -$ti-icon-cell-signal-2: unicode('f084'); -$ti-icon-cell-signal-3: unicode('f085'); -$ti-icon-cell-signal-4: unicode('f086'); -$ti-icon-cell-signal-5: unicode('f087'); -$ti-icon-cell-signal-off: unicode('f088'); -$ti-icon-certificate: unicode('ed76'); -$ti-icon-certificate-2: unicode('f073'); -$ti-icon-certificate-2-off: unicode('f0cb'); -$ti-icon-certificate-off: unicode('f0cc'); -$ti-icon-chair-director: unicode('f2d5'); -$ti-icon-chalkboard: unicode('f34d'); -$ti-icon-chalkboard-off: unicode('f3d1'); -$ti-icon-charging-pile: unicode('ee26'); -$ti-icon-chart-arcs: unicode('ee28'); -$ti-icon-chart-arcs-3: unicode('ee27'); -$ti-icon-chart-area: unicode('ea58'); -$ti-icon-chart-area-filled: unicode('f66b'); -$ti-icon-chart-area-line: unicode('ea57'); -$ti-icon-chart-area-line-filled: unicode('f66c'); -$ti-icon-chart-arrows: unicode('ee2a'); -$ti-icon-chart-arrows-vertical: unicode('ee29'); -$ti-icon-chart-bar: unicode('ea59'); -$ti-icon-chart-bar-off: unicode('f3d2'); -$ti-icon-chart-bubble: unicode('ec75'); -$ti-icon-chart-bubble-filled: unicode('f66d'); -$ti-icon-chart-candle: unicode('ea5a'); -$ti-icon-chart-candle-filled: unicode('f66e'); -$ti-icon-chart-circles: unicode('ee2b'); -$ti-icon-chart-donut: unicode('ea5b'); -$ti-icon-chart-donut-2: unicode('ee2c'); -$ti-icon-chart-donut-3: unicode('ee2d'); -$ti-icon-chart-donut-4: unicode('ee2e'); -$ti-icon-chart-donut-filled: unicode('f66f'); -$ti-icon-chart-dots: unicode('ee2f'); -$ti-icon-chart-dots-2: unicode('f097'); -$ti-icon-chart-dots-3: unicode('f098'); -$ti-icon-chart-grid-dots: unicode('f4c2'); -$ti-icon-chart-histogram: unicode('f65c'); -$ti-icon-chart-infographic: unicode('ee30'); -$ti-icon-chart-line: unicode('ea5c'); -$ti-icon-chart-pie: unicode('ea5d'); -$ti-icon-chart-pie-2: unicode('ee31'); -$ti-icon-chart-pie-3: unicode('ee32'); -$ti-icon-chart-pie-4: unicode('ee33'); -$ti-icon-chart-pie-filled: unicode('f670'); -$ti-icon-chart-pie-off: unicode('f3d3'); -$ti-icon-chart-ppf: unicode('f618'); -$ti-icon-chart-radar: unicode('ed77'); -$ti-icon-chart-sankey: unicode('f619'); -$ti-icon-chart-treemap: unicode('f381'); -$ti-icon-check: unicode('ea5e'); -$ti-icon-checkbox: unicode('eba6'); -$ti-icon-checklist: unicode('f074'); -$ti-icon-checks: unicode('ebaa'); -$ti-icon-checkup-list: unicode('ef5a'); -$ti-icon-cheese: unicode('ef26'); -$ti-icon-chef-hat: unicode('f21d'); -$ti-icon-chef-hat-off: unicode('f3d4'); -$ti-icon-cherry: unicode('f511'); -$ti-icon-cherry-filled: unicode('f728'); -$ti-icon-chess: unicode('f382'); -$ti-icon-chess-bishop: unicode('f56b'); -$ti-icon-chess-bishop-filled: unicode('f729'); -$ti-icon-chess-filled: unicode('f72a'); -$ti-icon-chess-king: unicode('f56c'); -$ti-icon-chess-king-filled: unicode('f72b'); -$ti-icon-chess-knight: unicode('f56d'); -$ti-icon-chess-knight-filled: unicode('f72c'); -$ti-icon-chess-queen: unicode('f56e'); -$ti-icon-chess-queen-filled: unicode('f72d'); -$ti-icon-chess-rook: unicode('f56f'); -$ti-icon-chess-rook-filled: unicode('f72e'); -$ti-icon-chevron-down: unicode('ea5f'); -$ti-icon-chevron-down-left: unicode('ed09'); -$ti-icon-chevron-down-right: unicode('ed0a'); -$ti-icon-chevron-left: unicode('ea60'); -$ti-icon-chevron-right: unicode('ea61'); -$ti-icon-chevron-up: unicode('ea62'); -$ti-icon-chevron-up-left: unicode('ed0b'); -$ti-icon-chevron-up-right: unicode('ed0c'); -$ti-icon-chevrons-down: unicode('ea63'); -$ti-icon-chevrons-down-left: unicode('ed0d'); -$ti-icon-chevrons-down-right: unicode('ed0e'); -$ti-icon-chevrons-left: unicode('ea64'); -$ti-icon-chevrons-right: unicode('ea65'); -$ti-icon-chevrons-up: unicode('ea66'); -$ti-icon-chevrons-up-left: unicode('ed0f'); -$ti-icon-chevrons-up-right: unicode('ed10'); -$ti-icon-chisel: unicode('f383'); -$ti-icon-christmas-tree: unicode('ed78'); -$ti-icon-christmas-tree-off: unicode('f3d5'); -$ti-icon-circle: unicode('ea6b'); -$ti-icon-circle-0-filled: unicode('f72f'); -$ti-icon-circle-1-filled: unicode('f730'); -$ti-icon-circle-2-filled: unicode('f731'); -$ti-icon-circle-3-filled: unicode('f732'); -$ti-icon-circle-4-filled: unicode('f733'); -$ti-icon-circle-5-filled: unicode('f734'); -$ti-icon-circle-6-filled: unicode('f735'); -$ti-icon-circle-7-filled: unicode('f736'); -$ti-icon-circle-8-filled: unicode('f737'); -$ti-icon-circle-9-filled: unicode('f738'); -$ti-icon-circle-arrow-down: unicode('f6f9'); -$ti-icon-circle-arrow-down-filled: unicode('f6f4'); -$ti-icon-circle-arrow-down-left: unicode('f6f6'); -$ti-icon-circle-arrow-down-left-filled: unicode('f6f5'); -$ti-icon-circle-arrow-down-right: unicode('f6f8'); -$ti-icon-circle-arrow-down-right-filled: unicode('f6f7'); -$ti-icon-circle-arrow-left: unicode('f6fb'); -$ti-icon-circle-arrow-left-filled: unicode('f6fa'); -$ti-icon-circle-arrow-right: unicode('f6fd'); -$ti-icon-circle-arrow-right-filled: unicode('f6fc'); -$ti-icon-circle-arrow-up: unicode('f703'); -$ti-icon-circle-arrow-up-filled: unicode('f6fe'); -$ti-icon-circle-arrow-up-left: unicode('f700'); -$ti-icon-circle-arrow-up-left-filled: unicode('f6ff'); -$ti-icon-circle-arrow-up-right: unicode('f702'); -$ti-icon-circle-arrow-up-right-filled: unicode('f701'); -$ti-icon-circle-caret-down: unicode('f4a9'); -$ti-icon-circle-caret-left: unicode('f4aa'); -$ti-icon-circle-caret-right: unicode('f4ab'); -$ti-icon-circle-caret-up: unicode('f4ac'); -$ti-icon-circle-check: unicode('ea67'); -$ti-icon-circle-check-filled: unicode('f704'); -$ti-icon-circle-chevron-down: unicode('f622'); -$ti-icon-circle-chevron-left: unicode('f623'); -$ti-icon-circle-chevron-right: unicode('f624'); -$ti-icon-circle-chevron-up: unicode('f625'); -$ti-icon-circle-chevrons-down: unicode('f642'); -$ti-icon-circle-chevrons-left: unicode('f643'); -$ti-icon-circle-chevrons-right: unicode('f644'); -$ti-icon-circle-chevrons-up: unicode('f645'); -$ti-icon-circle-dashed: unicode('ed27'); -$ti-icon-circle-dot: unicode('efb1'); -$ti-icon-circle-dot-filled: unicode('f705'); -$ti-icon-circle-dotted: unicode('ed28'); -$ti-icon-circle-filled: unicode('f671'); -$ti-icon-circle-half: unicode('ee3f'); -$ti-icon-circle-half-2: unicode('eff3'); -$ti-icon-circle-half-vertical: unicode('ee3e'); -$ti-icon-circle-key: unicode('f633'); -$ti-icon-circle-key-filled: unicode('f706'); -$ti-icon-circle-letter-a: unicode('f441'); -$ti-icon-circle-letter-b: unicode('f442'); -$ti-icon-circle-letter-c: unicode('f443'); -$ti-icon-circle-letter-d: unicode('f444'); -$ti-icon-circle-letter-e: unicode('f445'); -$ti-icon-circle-letter-f: unicode('f446'); -$ti-icon-circle-letter-g: unicode('f447'); -$ti-icon-circle-letter-h: unicode('f448'); -$ti-icon-circle-letter-i: unicode('f449'); -$ti-icon-circle-letter-j: unicode('f44a'); -$ti-icon-circle-letter-k: unicode('f44b'); -$ti-icon-circle-letter-l: unicode('f44c'); -$ti-icon-circle-letter-m: unicode('f44d'); -$ti-icon-circle-letter-n: unicode('f44e'); -$ti-icon-circle-letter-o: unicode('f44f'); -$ti-icon-circle-letter-p: unicode('f450'); -$ti-icon-circle-letter-q: unicode('f451'); -$ti-icon-circle-letter-r: unicode('f452'); -$ti-icon-circle-letter-s: unicode('f453'); -$ti-icon-circle-letter-t: unicode('f454'); -$ti-icon-circle-letter-u: unicode('f455'); -$ti-icon-circle-letter-v: unicode('f4ad'); -$ti-icon-circle-letter-w: unicode('f456'); -$ti-icon-circle-letter-x: unicode('f4ae'); -$ti-icon-circle-letter-y: unicode('f457'); -$ti-icon-circle-letter-z: unicode('f458'); -$ti-icon-circle-minus: unicode('ea68'); -$ti-icon-circle-number-0: unicode('ee34'); -$ti-icon-circle-number-1: unicode('ee35'); -$ti-icon-circle-number-2: unicode('ee36'); -$ti-icon-circle-number-3: unicode('ee37'); -$ti-icon-circle-number-4: unicode('ee38'); -$ti-icon-circle-number-5: unicode('ee39'); -$ti-icon-circle-number-6: unicode('ee3a'); -$ti-icon-circle-number-7: unicode('ee3b'); -$ti-icon-circle-number-8: unicode('ee3c'); -$ti-icon-circle-number-9: unicode('ee3d'); -$ti-icon-circle-off: unicode('ee40'); -$ti-icon-circle-plus: unicode('ea69'); -$ti-icon-circle-rectangle: unicode('f010'); -$ti-icon-circle-rectangle-off: unicode('f0cd'); -$ti-icon-circle-square: unicode('ece4'); -$ti-icon-circle-triangle: unicode('f011'); -$ti-icon-circle-x: unicode('ea6a'); -$ti-icon-circle-x-filled: unicode('f739'); -$ti-icon-circles: unicode('ece5'); -$ti-icon-circles-filled: unicode('f672'); -$ti-icon-circles-relation: unicode('f4c3'); -$ti-icon-circuit-ammeter: unicode('f271'); -$ti-icon-circuit-battery: unicode('f272'); -$ti-icon-circuit-bulb: unicode('f273'); -$ti-icon-circuit-capacitor: unicode('f275'); -$ti-icon-circuit-capacitor-polarized: unicode('f274'); -$ti-icon-circuit-cell: unicode('f277'); -$ti-icon-circuit-cell-plus: unicode('f276'); -$ti-icon-circuit-changeover: unicode('f278'); -$ti-icon-circuit-diode: unicode('f27a'); -$ti-icon-circuit-diode-zener: unicode('f279'); -$ti-icon-circuit-ground: unicode('f27c'); -$ti-icon-circuit-ground-digital: unicode('f27b'); -$ti-icon-circuit-inductor: unicode('f27d'); -$ti-icon-circuit-motor: unicode('f27e'); -$ti-icon-circuit-pushbutton: unicode('f27f'); -$ti-icon-circuit-resistor: unicode('f280'); -$ti-icon-circuit-switch-closed: unicode('f281'); -$ti-icon-circuit-switch-open: unicode('f282'); -$ti-icon-circuit-voltmeter: unicode('f283'); -$ti-icon-clear-all: unicode('ee41'); -$ti-icon-clear-formatting: unicode('ebe5'); -$ti-icon-click: unicode('ebbc'); -$ti-icon-clipboard: unicode('ea6f'); -$ti-icon-clipboard-check: unicode('ea6c'); -$ti-icon-clipboard-copy: unicode('f299'); -$ti-icon-clipboard-data: unicode('f563'); -$ti-icon-clipboard-heart: unicode('f34e'); -$ti-icon-clipboard-list: unicode('ea6d'); -$ti-icon-clipboard-off: unicode('f0ce'); -$ti-icon-clipboard-plus: unicode('efb2'); -$ti-icon-clipboard-text: unicode('f089'); -$ti-icon-clipboard-typography: unicode('f34f'); -$ti-icon-clipboard-x: unicode('ea6e'); -$ti-icon-clock: unicode('ea70'); -$ti-icon-clock-2: unicode('f099'); -$ti-icon-clock-bolt: unicode('f844'); -$ti-icon-clock-cancel: unicode('f546'); -$ti-icon-clock-check: unicode('f7c1'); -$ti-icon-clock-code: unicode('f845'); -$ti-icon-clock-cog: unicode('f7c2'); -$ti-icon-clock-dollar: unicode('f846'); -$ti-icon-clock-down: unicode('f7c3'); -$ti-icon-clock-edit: unicode('f547'); -$ti-icon-clock-exclamation: unicode('f847'); -$ti-icon-clock-filled: unicode('f73a'); -$ti-icon-clock-heart: unicode('f7c4'); -$ti-icon-clock-hour-1: unicode('f313'); -$ti-icon-clock-hour-10: unicode('f314'); -$ti-icon-clock-hour-11: unicode('f315'); -$ti-icon-clock-hour-12: unicode('f316'); -$ti-icon-clock-hour-2: unicode('f317'); -$ti-icon-clock-hour-3: unicode('f318'); -$ti-icon-clock-hour-4: unicode('f319'); -$ti-icon-clock-hour-5: unicode('f31a'); -$ti-icon-clock-hour-6: unicode('f31b'); -$ti-icon-clock-hour-7: unicode('f31c'); -$ti-icon-clock-hour-8: unicode('f31d'); -$ti-icon-clock-hour-9: unicode('f31e'); -$ti-icon-clock-minus: unicode('f848'); -$ti-icon-clock-off: unicode('f0cf'); -$ti-icon-clock-pause: unicode('f548'); -$ti-icon-clock-pin: unicode('f849'); -$ti-icon-clock-play: unicode('f549'); -$ti-icon-clock-plus: unicode('f7c5'); -$ti-icon-clock-question: unicode('f7c6'); -$ti-icon-clock-record: unicode('f54a'); -$ti-icon-clock-search: unicode('f7c7'); -$ti-icon-clock-share: unicode('f84a'); -$ti-icon-clock-shield: unicode('f7c8'); -$ti-icon-clock-star: unicode('f7c9'); -$ti-icon-clock-stop: unicode('f54b'); -$ti-icon-clock-up: unicode('f7ca'); -$ti-icon-clock-x: unicode('f7cb'); -$ti-icon-clothes-rack: unicode('f285'); -$ti-icon-clothes-rack-off: unicode('f3d6'); -$ti-icon-cloud: unicode('ea76'); -$ti-icon-cloud-bolt: unicode('f84b'); -$ti-icon-cloud-cancel: unicode('f84c'); -$ti-icon-cloud-check: unicode('f84d'); -$ti-icon-cloud-code: unicode('f84e'); -$ti-icon-cloud-cog: unicode('f84f'); -$ti-icon-cloud-computing: unicode('f1d0'); -$ti-icon-cloud-data-connection: unicode('f1d1'); -$ti-icon-cloud-dollar: unicode('f850'); -$ti-icon-cloud-down: unicode('f851'); -$ti-icon-cloud-download: unicode('ea71'); -$ti-icon-cloud-exclamation: unicode('f852'); -$ti-icon-cloud-filled: unicode('f673'); -$ti-icon-cloud-fog: unicode('ecd9'); -$ti-icon-cloud-heart: unicode('f853'); -$ti-icon-cloud-lock: unicode('efdb'); -$ti-icon-cloud-lock-open: unicode('efda'); -$ti-icon-cloud-minus: unicode('f854'); -$ti-icon-cloud-off: unicode('ed3e'); -$ti-icon-cloud-pause: unicode('f855'); -$ti-icon-cloud-pin: unicode('f856'); -$ti-icon-cloud-plus: unicode('f857'); -$ti-icon-cloud-question: unicode('f858'); -$ti-icon-cloud-rain: unicode('ea72'); -$ti-icon-cloud-search: unicode('f859'); -$ti-icon-cloud-share: unicode('f85a'); -$ti-icon-cloud-snow: unicode('ea73'); -$ti-icon-cloud-star: unicode('f85b'); -$ti-icon-cloud-storm: unicode('ea74'); -$ti-icon-cloud-up: unicode('f85c'); -$ti-icon-cloud-upload: unicode('ea75'); -$ti-icon-cloud-x: unicode('f85d'); -$ti-icon-clover: unicode('f1ea'); -$ti-icon-clover-2: unicode('f21e'); -$ti-icon-clubs: unicode('eff4'); -$ti-icon-clubs-filled: unicode('f674'); -$ti-icon-code: unicode('ea77'); -$ti-icon-code-asterix: unicode('f312'); -$ti-icon-code-circle: unicode('f4ff'); -$ti-icon-code-circle-2: unicode('f4fe'); -$ti-icon-code-dots: unicode('f61a'); -$ti-icon-code-minus: unicode('ee42'); -$ti-icon-code-off: unicode('f0d0'); -$ti-icon-code-plus: unicode('ee43'); -$ti-icon-coffee: unicode('ef0e'); -$ti-icon-coffee-off: unicode('f106'); -$ti-icon-coffin: unicode('f579'); -$ti-icon-coin: unicode('eb82'); -$ti-icon-coin-bitcoin: unicode('f2be'); -$ti-icon-coin-euro: unicode('f2bf'); -$ti-icon-coin-monero: unicode('f4a0'); -$ti-icon-coin-off: unicode('f0d1'); -$ti-icon-coin-pound: unicode('f2c0'); -$ti-icon-coin-rupee: unicode('f2c1'); -$ti-icon-coin-yen: unicode('f2c2'); -$ti-icon-coin-yuan: unicode('f2c3'); -$ti-icon-coins: unicode('f65d'); -$ti-icon-color-filter: unicode('f5a8'); -$ti-icon-color-picker: unicode('ebe6'); -$ti-icon-color-picker-off: unicode('f0d2'); -$ti-icon-color-swatch: unicode('eb61'); -$ti-icon-color-swatch-off: unicode('f0d3'); -$ti-icon-column-insert-left: unicode('ee44'); -$ti-icon-column-insert-right: unicode('ee45'); -$ti-icon-columns: unicode('eb83'); -$ti-icon-columns-1: unicode('f6d4'); -$ti-icon-columns-2: unicode('f6d5'); -$ti-icon-columns-3: unicode('f6d6'); -$ti-icon-columns-off: unicode('f0d4'); -$ti-icon-comet: unicode('ec76'); -$ti-icon-command: unicode('ea78'); -$ti-icon-command-off: unicode('f3d7'); -$ti-icon-compass: unicode('ea79'); -$ti-icon-compass-off: unicode('f0d5'); -$ti-icon-components: unicode('efa5'); -$ti-icon-components-off: unicode('f0d6'); -$ti-icon-cone: unicode('efdd'); -$ti-icon-cone-2: unicode('efdc'); -$ti-icon-cone-off: unicode('f3d8'); -$ti-icon-confetti: unicode('ee46'); -$ti-icon-confetti-off: unicode('f3d9'); -$ti-icon-confucius: unicode('f58a'); -$ti-icon-container: unicode('ee47'); -$ti-icon-container-off: unicode('f107'); -$ti-icon-contrast: unicode('ec4e'); -$ti-icon-contrast-2: unicode('efc7'); -$ti-icon-contrast-2-off: unicode('f3da'); -$ti-icon-contrast-off: unicode('f3db'); -$ti-icon-cooker: unicode('f57a'); -$ti-icon-cookie: unicode('ef0f'); -$ti-icon-cookie-man: unicode('f4c4'); -$ti-icon-cookie-off: unicode('f0d7'); -$ti-icon-copy: unicode('ea7a'); -$ti-icon-copy-off: unicode('f0d8'); -$ti-icon-copyleft: unicode('ec3d'); -$ti-icon-copyleft-filled: unicode('f73b'); -$ti-icon-copyleft-off: unicode('f0d9'); -$ti-icon-copyright: unicode('ea7b'); -$ti-icon-copyright-filled: unicode('f73c'); -$ti-icon-copyright-off: unicode('f0da'); -$ti-icon-corner-down-left: unicode('ea7c'); -$ti-icon-corner-down-left-double: unicode('ee48'); -$ti-icon-corner-down-right: unicode('ea7d'); -$ti-icon-corner-down-right-double: unicode('ee49'); -$ti-icon-corner-left-down: unicode('ea7e'); -$ti-icon-corner-left-down-double: unicode('ee4a'); -$ti-icon-corner-left-up: unicode('ea7f'); -$ti-icon-corner-left-up-double: unicode('ee4b'); -$ti-icon-corner-right-down: unicode('ea80'); -$ti-icon-corner-right-down-double: unicode('ee4c'); -$ti-icon-corner-right-up: unicode('ea81'); -$ti-icon-corner-right-up-double: unicode('ee4d'); -$ti-icon-corner-up-left: unicode('ea82'); -$ti-icon-corner-up-left-double: unicode('ee4e'); -$ti-icon-corner-up-right: unicode('ea83'); -$ti-icon-corner-up-right-double: unicode('ee4f'); -$ti-icon-cpu: unicode('ef8e'); -$ti-icon-cpu-2: unicode('f075'); -$ti-icon-cpu-off: unicode('f108'); -$ti-icon-crane: unicode('ef27'); -$ti-icon-crane-off: unicode('f109'); -$ti-icon-creative-commons: unicode('efb3'); -$ti-icon-creative-commons-by: unicode('f21f'); -$ti-icon-creative-commons-nc: unicode('f220'); -$ti-icon-creative-commons-nd: unicode('f221'); -$ti-icon-creative-commons-off: unicode('f10a'); -$ti-icon-creative-commons-sa: unicode('f222'); -$ti-icon-creative-commons-zero: unicode('f223'); -$ti-icon-credit-card: unicode('ea84'); -$ti-icon-credit-card-off: unicode('ed11'); -$ti-icon-cricket: unicode('f09a'); -$ti-icon-crop: unicode('ea85'); -$ti-icon-cross: unicode('ef8f'); -$ti-icon-cross-filled: unicode('f675'); -$ti-icon-cross-off: unicode('f10b'); -$ti-icon-crosshair: unicode('ec3e'); -$ti-icon-crown: unicode('ed12'); -$ti-icon-crown-off: unicode('ee50'); -$ti-icon-crutches: unicode('ef5b'); -$ti-icon-crutches-off: unicode('f10c'); -$ti-icon-crystal-ball: unicode('f57b'); -$ti-icon-csv: unicode('f791'); -$ti-icon-cube-send: unicode('f61b'); -$ti-icon-cube-unfolded: unicode('f61c'); -$ti-icon-cup: unicode('ef28'); -$ti-icon-cup-off: unicode('f10d'); -$ti-icon-curling: unicode('efc8'); -$ti-icon-curly-loop: unicode('ecda'); -$ti-icon-currency: unicode('efa6'); -$ti-icon-currency-afghani: unicode('f65e'); -$ti-icon-currency-bahraini: unicode('ee51'); -$ti-icon-currency-baht: unicode('f08a'); -$ti-icon-currency-bitcoin: unicode('ebab'); -$ti-icon-currency-cent: unicode('ee53'); -$ti-icon-currency-dinar: unicode('ee54'); -$ti-icon-currency-dirham: unicode('ee55'); -$ti-icon-currency-dogecoin: unicode('ef4b'); -$ti-icon-currency-dollar: unicode('eb84'); -$ti-icon-currency-dollar-australian: unicode('ee56'); -$ti-icon-currency-dollar-brunei: unicode('f36c'); -$ti-icon-currency-dollar-canadian: unicode('ee57'); -$ti-icon-currency-dollar-guyanese: unicode('f36d'); -$ti-icon-currency-dollar-off: unicode('f3dc'); -$ti-icon-currency-dollar-singapore: unicode('ee58'); -$ti-icon-currency-dollar-zimbabwean: unicode('f36e'); -$ti-icon-currency-dong: unicode('f36f'); -$ti-icon-currency-dram: unicode('f370'); -$ti-icon-currency-ethereum: unicode('ee59'); -$ti-icon-currency-euro: unicode('eb85'); -$ti-icon-currency-euro-off: unicode('f3dd'); -$ti-icon-currency-forint: unicode('ee5a'); -$ti-icon-currency-frank: unicode('ee5b'); -$ti-icon-currency-guarani: unicode('f371'); -$ti-icon-currency-hryvnia: unicode('f372'); -$ti-icon-currency-kip: unicode('f373'); -$ti-icon-currency-krone-czech: unicode('ee5c'); -$ti-icon-currency-krone-danish: unicode('ee5d'); -$ti-icon-currency-krone-swedish: unicode('ee5e'); -$ti-icon-currency-lari: unicode('f374'); -$ti-icon-currency-leu: unicode('ee5f'); -$ti-icon-currency-lira: unicode('ee60'); -$ti-icon-currency-litecoin: unicode('ee61'); -$ti-icon-currency-lyd: unicode('f375'); -$ti-icon-currency-manat: unicode('f376'); -$ti-icon-currency-monero: unicode('f377'); -$ti-icon-currency-naira: unicode('ee62'); -$ti-icon-currency-nano: unicode('f7a6'); -$ti-icon-currency-off: unicode('f3de'); -$ti-icon-currency-paanga: unicode('f378'); -$ti-icon-currency-peso: unicode('f65f'); -$ti-icon-currency-pound: unicode('ebac'); -$ti-icon-currency-pound-off: unicode('f3df'); -$ti-icon-currency-quetzal: unicode('f379'); -$ti-icon-currency-real: unicode('ee63'); -$ti-icon-currency-renminbi: unicode('ee64'); -$ti-icon-currency-ripple: unicode('ee65'); -$ti-icon-currency-riyal: unicode('ee66'); -$ti-icon-currency-rubel: unicode('ee67'); -$ti-icon-currency-rufiyaa: unicode('f37a'); -$ti-icon-currency-rupee: unicode('ebad'); -$ti-icon-currency-rupee-nepalese: unicode('f37b'); -$ti-icon-currency-shekel: unicode('ee68'); -$ti-icon-currency-solana: unicode('f4a1'); -$ti-icon-currency-som: unicode('f37c'); -$ti-icon-currency-taka: unicode('ee69'); -$ti-icon-currency-tenge: unicode('f37d'); -$ti-icon-currency-tugrik: unicode('ee6a'); -$ti-icon-currency-won: unicode('ee6b'); -$ti-icon-currency-yen: unicode('ebae'); -$ti-icon-currency-yen-off: unicode('f3e0'); -$ti-icon-currency-yuan: unicode('f29a'); -$ti-icon-currency-zloty: unicode('ee6c'); -$ti-icon-current-location: unicode('ecef'); -$ti-icon-current-location-off: unicode('f10e'); -$ti-icon-cursor-off: unicode('f10f'); -$ti-icon-cursor-text: unicode('ee6d'); -$ti-icon-cut: unicode('ea86'); -$ti-icon-cylinder: unicode('f54c'); -$ti-icon-dashboard: unicode('ea87'); -$ti-icon-dashboard-off: unicode('f3e1'); -$ti-icon-database: unicode('ea88'); -$ti-icon-database-export: unicode('ee6e'); -$ti-icon-database-import: unicode('ee6f'); -$ti-icon-database-off: unicode('ee70'); -$ti-icon-deer: unicode('f4c5'); -$ti-icon-delta: unicode('f53c'); -$ti-icon-dental: unicode('f025'); -$ti-icon-dental-broken: unicode('f286'); -$ti-icon-dental-off: unicode('f110'); -$ti-icon-deselect: unicode('f9f3'); -$ti-icon-details: unicode('ee71'); -$ti-icon-details-off: unicode('f3e2'); -$ti-icon-device-airpods: unicode('f5a9'); -$ti-icon-device-airpods-case: unicode('f646'); -$ti-icon-device-analytics: unicode('ee72'); -$ti-icon-device-audio-tape: unicode('ee73'); -$ti-icon-device-camera-phone: unicode('f233'); -$ti-icon-device-cctv: unicode('ee74'); -$ti-icon-device-cctv-off: unicode('f3e3'); -$ti-icon-device-computer-camera: unicode('ee76'); -$ti-icon-device-computer-camera-off: unicode('ee75'); -$ti-icon-device-desktop: unicode('ea89'); -$ti-icon-device-desktop-analytics: unicode('ee77'); -$ti-icon-device-desktop-bolt: unicode('f85e'); -$ti-icon-device-desktop-cancel: unicode('f85f'); -$ti-icon-device-desktop-check: unicode('f860'); -$ti-icon-device-desktop-code: unicode('f861'); -$ti-icon-device-desktop-cog: unicode('f862'); -$ti-icon-device-desktop-dollar: unicode('f863'); -$ti-icon-device-desktop-down: unicode('f864'); -$ti-icon-device-desktop-exclamation: unicode('f865'); -$ti-icon-device-desktop-heart: unicode('f866'); -$ti-icon-device-desktop-minus: unicode('f867'); -$ti-icon-device-desktop-off: unicode('ee78'); -$ti-icon-device-desktop-pause: unicode('f868'); -$ti-icon-device-desktop-pin: unicode('f869'); -$ti-icon-device-desktop-plus: unicode('f86a'); -$ti-icon-device-desktop-question: unicode('f86b'); -$ti-icon-device-desktop-search: unicode('f86c'); -$ti-icon-device-desktop-share: unicode('f86d'); -$ti-icon-device-desktop-star: unicode('f86e'); -$ti-icon-device-desktop-up: unicode('f86f'); -$ti-icon-device-desktop-x: unicode('f870'); -$ti-icon-device-floppy: unicode('eb62'); -$ti-icon-device-gamepad: unicode('eb63'); -$ti-icon-device-gamepad-2: unicode('f1d2'); -$ti-icon-device-heart-monitor: unicode('f060'); -$ti-icon-device-imac: unicode('f7a7'); -$ti-icon-device-imac-bolt: unicode('f871'); -$ti-icon-device-imac-cancel: unicode('f872'); -$ti-icon-device-imac-check: unicode('f873'); -$ti-icon-device-imac-code: unicode('f874'); -$ti-icon-device-imac-cog: unicode('f875'); -$ti-icon-device-imac-dollar: unicode('f876'); -$ti-icon-device-imac-down: unicode('f877'); -$ti-icon-device-imac-exclamation: unicode('f878'); -$ti-icon-device-imac-heart: unicode('f879'); -$ti-icon-device-imac-minus: unicode('f87a'); -$ti-icon-device-imac-off: unicode('f87b'); -$ti-icon-device-imac-pause: unicode('f87c'); -$ti-icon-device-imac-pin: unicode('f87d'); -$ti-icon-device-imac-plus: unicode('f87e'); -$ti-icon-device-imac-question: unicode('f87f'); -$ti-icon-device-imac-search: unicode('f880'); -$ti-icon-device-imac-share: unicode('f881'); -$ti-icon-device-imac-star: unicode('f882'); -$ti-icon-device-imac-up: unicode('f883'); -$ti-icon-device-imac-x: unicode('f884'); -$ti-icon-device-ipad: unicode('f648'); -$ti-icon-device-ipad-bolt: unicode('f885'); -$ti-icon-device-ipad-cancel: unicode('f886'); -$ti-icon-device-ipad-check: unicode('f887'); -$ti-icon-device-ipad-code: unicode('f888'); -$ti-icon-device-ipad-cog: unicode('f889'); -$ti-icon-device-ipad-dollar: unicode('f88a'); -$ti-icon-device-ipad-down: unicode('f88b'); -$ti-icon-device-ipad-exclamation: unicode('f88c'); -$ti-icon-device-ipad-heart: unicode('f88d'); -$ti-icon-device-ipad-horizontal: unicode('f647'); -$ti-icon-device-ipad-horizontal-bolt: unicode('f88e'); -$ti-icon-device-ipad-horizontal-cancel: unicode('f88f'); -$ti-icon-device-ipad-horizontal-check: unicode('f890'); -$ti-icon-device-ipad-horizontal-code: unicode('f891'); -$ti-icon-device-ipad-horizontal-cog: unicode('f892'); -$ti-icon-device-ipad-horizontal-dollar: unicode('f893'); -$ti-icon-device-ipad-horizontal-down: unicode('f894'); -$ti-icon-device-ipad-horizontal-exclamation: unicode('f895'); -$ti-icon-device-ipad-horizontal-heart: unicode('f896'); -$ti-icon-device-ipad-horizontal-minus: unicode('f897'); -$ti-icon-device-ipad-horizontal-off: unicode('f898'); -$ti-icon-device-ipad-horizontal-pause: unicode('f899'); -$ti-icon-device-ipad-horizontal-pin: unicode('f89a'); -$ti-icon-device-ipad-horizontal-plus: unicode('f89b'); -$ti-icon-device-ipad-horizontal-question: unicode('f89c'); -$ti-icon-device-ipad-horizontal-search: unicode('f89d'); -$ti-icon-device-ipad-horizontal-share: unicode('f89e'); -$ti-icon-device-ipad-horizontal-star: unicode('f89f'); -$ti-icon-device-ipad-horizontal-up: unicode('f8a0'); -$ti-icon-device-ipad-horizontal-x: unicode('f8a1'); -$ti-icon-device-ipad-minus: unicode('f8a2'); -$ti-icon-device-ipad-off: unicode('f8a3'); -$ti-icon-device-ipad-pause: unicode('f8a4'); -$ti-icon-device-ipad-pin: unicode('f8a5'); -$ti-icon-device-ipad-plus: unicode('f8a6'); -$ti-icon-device-ipad-question: unicode('f8a7'); -$ti-icon-device-ipad-search: unicode('f8a8'); -$ti-icon-device-ipad-share: unicode('f8a9'); -$ti-icon-device-ipad-star: unicode('f8aa'); -$ti-icon-device-ipad-up: unicode('f8ab'); -$ti-icon-device-ipad-x: unicode('f8ac'); -$ti-icon-device-landline-phone: unicode('f649'); -$ti-icon-device-laptop: unicode('eb64'); -$ti-icon-device-laptop-off: unicode('f061'); -$ti-icon-device-mobile: unicode('ea8a'); -$ti-icon-device-mobile-bolt: unicode('f8ad'); -$ti-icon-device-mobile-cancel: unicode('f8ae'); -$ti-icon-device-mobile-charging: unicode('f224'); -$ti-icon-device-mobile-check: unicode('f8af'); -$ti-icon-device-mobile-code: unicode('f8b0'); -$ti-icon-device-mobile-cog: unicode('f8b1'); -$ti-icon-device-mobile-dollar: unicode('f8b2'); -$ti-icon-device-mobile-down: unicode('f8b3'); -$ti-icon-device-mobile-exclamation: unicode('f8b4'); -$ti-icon-device-mobile-heart: unicode('f8b5'); -$ti-icon-device-mobile-message: unicode('ee79'); -$ti-icon-device-mobile-minus: unicode('f8b6'); -$ti-icon-device-mobile-off: unicode('f062'); -$ti-icon-device-mobile-pause: unicode('f8b7'); -$ti-icon-device-mobile-pin: unicode('f8b8'); -$ti-icon-device-mobile-plus: unicode('f8b9'); -$ti-icon-device-mobile-question: unicode('f8ba'); -$ti-icon-device-mobile-rotated: unicode('ecdb'); -$ti-icon-device-mobile-search: unicode('f8bb'); -$ti-icon-device-mobile-share: unicode('f8bc'); -$ti-icon-device-mobile-star: unicode('f8bd'); -$ti-icon-device-mobile-up: unicode('f8be'); -$ti-icon-device-mobile-vibration: unicode('eb86'); -$ti-icon-device-mobile-x: unicode('f8bf'); -$ti-icon-device-nintendo: unicode('f026'); -$ti-icon-device-nintendo-off: unicode('f111'); -$ti-icon-device-remote: unicode('f792'); -$ti-icon-device-sd-card: unicode('f384'); -$ti-icon-device-sim: unicode('f4b2'); -$ti-icon-device-sim-1: unicode('f4af'); -$ti-icon-device-sim-2: unicode('f4b0'); -$ti-icon-device-sim-3: unicode('f4b1'); -$ti-icon-device-speaker: unicode('ea8b'); -$ti-icon-device-speaker-off: unicode('f112'); -$ti-icon-device-tablet: unicode('ea8c'); -$ti-icon-device-tablet-bolt: unicode('f8c0'); -$ti-icon-device-tablet-cancel: unicode('f8c1'); -$ti-icon-device-tablet-check: unicode('f8c2'); -$ti-icon-device-tablet-code: unicode('f8c3'); -$ti-icon-device-tablet-cog: unicode('f8c4'); -$ti-icon-device-tablet-dollar: unicode('f8c5'); -$ti-icon-device-tablet-down: unicode('f8c6'); -$ti-icon-device-tablet-exclamation: unicode('f8c7'); -$ti-icon-device-tablet-heart: unicode('f8c8'); -$ti-icon-device-tablet-minus: unicode('f8c9'); -$ti-icon-device-tablet-off: unicode('f063'); -$ti-icon-device-tablet-pause: unicode('f8ca'); -$ti-icon-device-tablet-pin: unicode('f8cb'); -$ti-icon-device-tablet-plus: unicode('f8cc'); -$ti-icon-device-tablet-question: unicode('f8cd'); -$ti-icon-device-tablet-search: unicode('f8ce'); -$ti-icon-device-tablet-share: unicode('f8cf'); -$ti-icon-device-tablet-star: unicode('f8d0'); -$ti-icon-device-tablet-up: unicode('f8d1'); -$ti-icon-device-tablet-x: unicode('f8d2'); -$ti-icon-device-tv: unicode('ea8d'); -$ti-icon-device-tv-off: unicode('f064'); -$ti-icon-device-tv-old: unicode('f1d3'); -$ti-icon-device-watch: unicode('ebf9'); -$ti-icon-device-watch-bolt: unicode('f8d3'); -$ti-icon-device-watch-cancel: unicode('f8d4'); -$ti-icon-device-watch-check: unicode('f8d5'); -$ti-icon-device-watch-code: unicode('f8d6'); -$ti-icon-device-watch-cog: unicode('f8d7'); -$ti-icon-device-watch-dollar: unicode('f8d8'); -$ti-icon-device-watch-down: unicode('f8d9'); -$ti-icon-device-watch-exclamation: unicode('f8da'); -$ti-icon-device-watch-heart: unicode('f8db'); -$ti-icon-device-watch-minus: unicode('f8dc'); -$ti-icon-device-watch-off: unicode('f065'); -$ti-icon-device-watch-pause: unicode('f8dd'); -$ti-icon-device-watch-pin: unicode('f8de'); -$ti-icon-device-watch-plus: unicode('f8df'); -$ti-icon-device-watch-question: unicode('f8e0'); -$ti-icon-device-watch-search: unicode('f8e1'); -$ti-icon-device-watch-share: unicode('f8e2'); -$ti-icon-device-watch-star: unicode('f8e3'); -$ti-icon-device-watch-stats: unicode('ef7d'); -$ti-icon-device-watch-stats-2: unicode('ef7c'); -$ti-icon-device-watch-up: unicode('f8e4'); -$ti-icon-device-watch-x: unicode('f8e5'); -$ti-icon-devices: unicode('eb87'); -$ti-icon-devices-2: unicode('ed29'); -$ti-icon-devices-bolt: unicode('f8e6'); -$ti-icon-devices-cancel: unicode('f8e7'); -$ti-icon-devices-check: unicode('f8e8'); -$ti-icon-devices-code: unicode('f8e9'); -$ti-icon-devices-cog: unicode('f8ea'); -$ti-icon-devices-dollar: unicode('f8eb'); -$ti-icon-devices-down: unicode('f8ec'); -$ti-icon-devices-exclamation: unicode('f8ed'); -$ti-icon-devices-heart: unicode('f8ee'); -$ti-icon-devices-minus: unicode('f8ef'); -$ti-icon-devices-off: unicode('f3e4'); -$ti-icon-devices-pause: unicode('f8f0'); -$ti-icon-devices-pc: unicode('ee7a'); -$ti-icon-devices-pc-off: unicode('f113'); -$ti-icon-devices-pin: unicode('f8f1'); -$ti-icon-devices-plus: unicode('f8f2'); -$ti-icon-devices-question: unicode('f8f3'); -$ti-icon-devices-search: unicode('f8f4'); -$ti-icon-devices-share: unicode('f8f5'); -$ti-icon-devices-star: unicode('f8f6'); -$ti-icon-devices-up: unicode('f8f7'); -$ti-icon-devices-x: unicode('f8f8'); -$ti-icon-dialpad: unicode('f067'); -$ti-icon-dialpad-off: unicode('f114'); -$ti-icon-diamond: unicode('eb65'); -$ti-icon-diamond-filled: unicode('f73d'); -$ti-icon-diamond-off: unicode('f115'); -$ti-icon-diamonds: unicode('eff5'); -$ti-icon-diamonds-filled: unicode('f676'); -$ti-icon-dice: unicode('eb66'); -$ti-icon-dice-1: unicode('f08b'); -$ti-icon-dice-1-filled: unicode('f73e'); -$ti-icon-dice-2: unicode('f08c'); -$ti-icon-dice-2-filled: unicode('f73f'); -$ti-icon-dice-3: unicode('f08d'); -$ti-icon-dice-3-filled: unicode('f740'); -$ti-icon-dice-4: unicode('f08e'); -$ti-icon-dice-4-filled: unicode('f741'); -$ti-icon-dice-5: unicode('f08f'); -$ti-icon-dice-5-filled: unicode('f742'); -$ti-icon-dice-6: unicode('f090'); -$ti-icon-dice-6-filled: unicode('f743'); -$ti-icon-dice-filled: unicode('f744'); -$ti-icon-dimensions: unicode('ee7b'); -$ti-icon-direction: unicode('ebfb'); -$ti-icon-direction-horizontal: unicode('ebfa'); -$ti-icon-direction-sign: unicode('f1f7'); -$ti-icon-direction-sign-filled: unicode('f745'); -$ti-icon-direction-sign-off: unicode('f3e5'); -$ti-icon-directions: unicode('ea8e'); -$ti-icon-directions-off: unicode('f116'); -$ti-icon-disabled: unicode('ea8f'); -$ti-icon-disabled-2: unicode('ebaf'); -$ti-icon-disabled-off: unicode('f117'); -$ti-icon-disc: unicode('ea90'); -$ti-icon-disc-golf: unicode('f385'); -$ti-icon-disc-off: unicode('f118'); -$ti-icon-discount: unicode('ebbd'); -$ti-icon-discount-2: unicode('ee7c'); -$ti-icon-discount-2-off: unicode('f3e6'); -$ti-icon-discount-check: unicode('f1f8'); -$ti-icon-discount-check-filled: unicode('f746'); -$ti-icon-discount-off: unicode('f3e7'); -$ti-icon-divide: unicode('ed5c'); -$ti-icon-dna: unicode('ee7d'); -$ti-icon-dna-2: unicode('ef5c'); -$ti-icon-dna-2-off: unicode('f119'); -$ti-icon-dna-off: unicode('f11a'); -$ti-icon-dog: unicode('f660'); -$ti-icon-dog-bowl: unicode('ef29'); -$ti-icon-door: unicode('ef4e'); -$ti-icon-door-enter: unicode('ef4c'); -$ti-icon-door-exit: unicode('ef4d'); -$ti-icon-door-off: unicode('f11b'); -$ti-icon-dots: unicode('ea95'); -$ti-icon-dots-circle-horizontal: unicode('ea91'); -$ti-icon-dots-diagonal: unicode('ea93'); -$ti-icon-dots-diagonal-2: unicode('ea92'); -$ti-icon-dots-vertical: unicode('ea94'); -$ti-icon-download: unicode('ea96'); -$ti-icon-download-off: unicode('f11c'); -$ti-icon-drag-drop: unicode('eb89'); -$ti-icon-drag-drop-2: unicode('eb88'); -$ti-icon-drone: unicode('ed79'); -$ti-icon-drone-off: unicode('ee7e'); -$ti-icon-drop-circle: unicode('efde'); -$ti-icon-droplet: unicode('ea97'); -$ti-icon-droplet-bolt: unicode('f8f9'); -$ti-icon-droplet-cancel: unicode('f8fa'); -$ti-icon-droplet-check: unicode('f8fb'); -$ti-icon-droplet-code: unicode('f8fc'); -$ti-icon-droplet-cog: unicode('f8fd'); -$ti-icon-droplet-dollar: unicode('f8fe'); -$ti-icon-droplet-down: unicode('f8ff'); -$ti-icon-droplet-exclamation: unicode('f900'); -$ti-icon-droplet-filled: unicode('ee80'); -$ti-icon-droplet-filled-2: unicode('ee7f'); -$ti-icon-droplet-half: unicode('ee82'); -$ti-icon-droplet-half-2: unicode('ee81'); -$ti-icon-droplet-half-filled: unicode('f6c5'); -$ti-icon-droplet-heart: unicode('f901'); -$ti-icon-droplet-minus: unicode('f902'); -$ti-icon-droplet-off: unicode('ee83'); -$ti-icon-droplet-pause: unicode('f903'); -$ti-icon-droplet-pin: unicode('f904'); -$ti-icon-droplet-plus: unicode('f905'); -$ti-icon-droplet-question: unicode('f906'); -$ti-icon-droplet-search: unicode('f907'); -$ti-icon-droplet-share: unicode('f908'); -$ti-icon-droplet-star: unicode('f909'); -$ti-icon-droplet-up: unicode('f90a'); -$ti-icon-droplet-x: unicode('f90b'); -$ti-icon-e-passport: unicode('f4df'); -$ti-icon-ear: unicode('ebce'); -$ti-icon-ear-off: unicode('ee84'); -$ti-icon-ease-in: unicode('f573'); -$ti-icon-ease-in-control-point: unicode('f570'); -$ti-icon-ease-in-out: unicode('f572'); -$ti-icon-ease-in-out-control-points: unicode('f571'); -$ti-icon-ease-out: unicode('f575'); -$ti-icon-ease-out-control-point: unicode('f574'); -$ti-icon-edit: unicode('ea98'); -$ti-icon-edit-circle: unicode('ee85'); -$ti-icon-edit-circle-off: unicode('f11d'); -$ti-icon-edit-off: unicode('f11e'); -$ti-icon-egg: unicode('eb8a'); -$ti-icon-egg-cracked: unicode('f2d6'); -$ti-icon-egg-filled: unicode('f678'); -$ti-icon-egg-fried: unicode('f386'); -$ti-icon-egg-off: unicode('f11f'); -$ti-icon-eggs: unicode('f500'); -$ti-icon-elevator: unicode('efdf'); -$ti-icon-elevator-off: unicode('f3e8'); -$ti-icon-emergency-bed: unicode('ef5d'); -$ti-icon-empathize: unicode('f29b'); -$ti-icon-empathize-off: unicode('f3e9'); -$ti-icon-emphasis: unicode('ebcf'); -$ti-icon-engine: unicode('ef7e'); -$ti-icon-engine-off: unicode('f120'); -$ti-icon-equal: unicode('ee87'); -$ti-icon-equal-double: unicode('f4e1'); -$ti-icon-equal-not: unicode('ee86'); -$ti-icon-eraser: unicode('eb8b'); -$ti-icon-eraser-off: unicode('f121'); -$ti-icon-error-404: unicode('f027'); -$ti-icon-error-404-off: unicode('f122'); -$ti-icon-exchange: unicode('ebe7'); -$ti-icon-exchange-off: unicode('f123'); -$ti-icon-exclamation-circle: unicode('f634'); -$ti-icon-exclamation-mark: unicode('efb4'); -$ti-icon-exclamation-mark-off: unicode('f124'); -$ti-icon-explicit: unicode('f256'); -$ti-icon-explicit-off: unicode('f3ea'); -$ti-icon-exposure: unicode('eb8c'); -$ti-icon-exposure-0: unicode('f29c'); -$ti-icon-exposure-minus-1: unicode('f29d'); -$ti-icon-exposure-minus-2: unicode('f29e'); -$ti-icon-exposure-off: unicode('f3eb'); -$ti-icon-exposure-plus-1: unicode('f29f'); -$ti-icon-exposure-plus-2: unicode('f2a0'); -$ti-icon-external-link: unicode('ea99'); -$ti-icon-external-link-off: unicode('f125'); -$ti-icon-eye: unicode('ea9a'); -$ti-icon-eye-check: unicode('ee88'); -$ti-icon-eye-closed: unicode('f7ec'); -$ti-icon-eye-cog: unicode('f7ed'); -$ti-icon-eye-edit: unicode('f7ee'); -$ti-icon-eye-exclamation: unicode('f7ef'); -$ti-icon-eye-filled: unicode('f679'); -$ti-icon-eye-heart: unicode('f7f0'); -$ti-icon-eye-off: unicode('ecf0'); -$ti-icon-eye-table: unicode('ef5e'); -$ti-icon-eye-x: unicode('f7f1'); -$ti-icon-eyeglass: unicode('ee8a'); -$ti-icon-eyeglass-2: unicode('ee89'); -$ti-icon-eyeglass-off: unicode('f126'); -$ti-icon-face-id: unicode('ea9b'); -$ti-icon-face-id-error: unicode('efa7'); -$ti-icon-face-mask: unicode('efb5'); -$ti-icon-face-mask-off: unicode('f127'); -$ti-icon-fall: unicode('ecb9'); -$ti-icon-feather: unicode('ee8b'); -$ti-icon-feather-off: unicode('f128'); -$ti-icon-fence: unicode('ef2a'); -$ti-icon-fence-off: unicode('f129'); -$ti-icon-fidget-spinner: unicode('f068'); -$ti-icon-file: unicode('eaa4'); -$ti-icon-file-3d: unicode('f032'); -$ti-icon-file-alert: unicode('ede6'); -$ti-icon-file-analytics: unicode('ede7'); -$ti-icon-file-arrow-left: unicode('f033'); -$ti-icon-file-arrow-right: unicode('f034'); -$ti-icon-file-barcode: unicode('f035'); -$ti-icon-file-broken: unicode('f501'); -$ti-icon-file-certificate: unicode('ed4d'); -$ti-icon-file-chart: unicode('f036'); -$ti-icon-file-check: unicode('ea9c'); -$ti-icon-file-code: unicode('ebd0'); -$ti-icon-file-code-2: unicode('ede8'); -$ti-icon-file-database: unicode('f037'); -$ti-icon-file-delta: unicode('f53d'); -$ti-icon-file-description: unicode('f028'); -$ti-icon-file-diff: unicode('ecf1'); -$ti-icon-file-digit: unicode('efa8'); -$ti-icon-file-dislike: unicode('ed2a'); -$ti-icon-file-dollar: unicode('efe0'); -$ti-icon-file-dots: unicode('f038'); -$ti-icon-file-download: unicode('ea9d'); -$ti-icon-file-euro: unicode('efe1'); -$ti-icon-file-export: unicode('ede9'); -$ti-icon-file-filled: unicode('f747'); -$ti-icon-file-function: unicode('f53e'); -$ti-icon-file-horizontal: unicode('ebb0'); -$ti-icon-file-import: unicode('edea'); -$ti-icon-file-infinity: unicode('f502'); -$ti-icon-file-info: unicode('edec'); -$ti-icon-file-invoice: unicode('eb67'); -$ti-icon-file-lambda: unicode('f53f'); -$ti-icon-file-like: unicode('ed2b'); -$ti-icon-file-minus: unicode('ea9e'); -$ti-icon-file-music: unicode('ea9f'); -$ti-icon-file-off: unicode('ecf2'); -$ti-icon-file-orientation: unicode('f2a1'); -$ti-icon-file-pencil: unicode('f039'); -$ti-icon-file-percent: unicode('f540'); -$ti-icon-file-phone: unicode('ecdc'); -$ti-icon-file-plus: unicode('eaa0'); -$ti-icon-file-power: unicode('f03a'); -$ti-icon-file-report: unicode('eded'); -$ti-icon-file-rss: unicode('f03b'); -$ti-icon-file-scissors: unicode('f03c'); -$ti-icon-file-search: unicode('ed5d'); -$ti-icon-file-settings: unicode('f029'); -$ti-icon-file-shredder: unicode('eaa1'); -$ti-icon-file-signal: unicode('f03d'); -$ti-icon-file-spreadsheet: unicode('f03e'); -$ti-icon-file-stack: unicode('f503'); -$ti-icon-file-star: unicode('f03f'); -$ti-icon-file-symlink: unicode('ed53'); -$ti-icon-file-text: unicode('eaa2'); -$ti-icon-file-time: unicode('f040'); -$ti-icon-file-typography: unicode('f041'); -$ti-icon-file-unknown: unicode('f042'); -$ti-icon-file-upload: unicode('ec91'); -$ti-icon-file-vector: unicode('f043'); -$ti-icon-file-x: unicode('eaa3'); -$ti-icon-file-x-filled: unicode('f748'); -$ti-icon-file-zip: unicode('ed4e'); -$ti-icon-files: unicode('edef'); -$ti-icon-files-off: unicode('edee'); -$ti-icon-filter: unicode('eaa5'); -$ti-icon-filter-off: unicode('ed2c'); -$ti-icon-filters: unicode('f793'); -$ti-icon-fingerprint: unicode('ebd1'); -$ti-icon-fingerprint-off: unicode('f12a'); -$ti-icon-fire-hydrant: unicode('f3a9'); -$ti-icon-fire-hydrant-off: unicode('f3ec'); -$ti-icon-firetruck: unicode('ebe8'); -$ti-icon-first-aid-kit: unicode('ef5f'); -$ti-icon-first-aid-kit-off: unicode('f3ed'); -$ti-icon-fish: unicode('ef2b'); -$ti-icon-fish-bone: unicode('f287'); -$ti-icon-fish-christianity: unicode('f58b'); -$ti-icon-fish-hook: unicode('f1f9'); -$ti-icon-fish-hook-off: unicode('f3ee'); -$ti-icon-fish-off: unicode('f12b'); -$ti-icon-flag: unicode('eaa6'); -$ti-icon-flag-2: unicode('ee8c'); -$ti-icon-flag-2-filled: unicode('f707'); -$ti-icon-flag-2-off: unicode('f12c'); -$ti-icon-flag-3: unicode('ee8d'); -$ti-icon-flag-3-filled: unicode('f708'); -$ti-icon-flag-filled: unicode('f67a'); -$ti-icon-flag-off: unicode('f12d'); -$ti-icon-flame: unicode('ec2c'); -$ti-icon-flame-off: unicode('f12e'); -$ti-icon-flare: unicode('ee8e'); -$ti-icon-flask: unicode('ebd2'); -$ti-icon-flask-2: unicode('ef60'); -$ti-icon-flask-2-off: unicode('f12f'); -$ti-icon-flask-off: unicode('f130'); -$ti-icon-flip-flops: unicode('f564'); -$ti-icon-flip-horizontal: unicode('eaa7'); -$ti-icon-flip-vertical: unicode('eaa8'); -$ti-icon-float-center: unicode('ebb1'); -$ti-icon-float-left: unicode('ebb2'); -$ti-icon-float-none: unicode('ed13'); -$ti-icon-float-right: unicode('ebb3'); -$ti-icon-flower: unicode('eff6'); -$ti-icon-flower-off: unicode('f131'); -$ti-icon-focus: unicode('eb8d'); -$ti-icon-focus-2: unicode('ebd3'); -$ti-icon-focus-centered: unicode('f02a'); -$ti-icon-fold: unicode('ed56'); -$ti-icon-fold-down: unicode('ed54'); -$ti-icon-fold-up: unicode('ed55'); -$ti-icon-folder: unicode('eaad'); -$ti-icon-folder-bolt: unicode('f90c'); -$ti-icon-folder-cancel: unicode('f90d'); -$ti-icon-folder-check: unicode('f90e'); -$ti-icon-folder-code: unicode('f90f'); -$ti-icon-folder-cog: unicode('f910'); -$ti-icon-folder-dollar: unicode('f911'); -$ti-icon-folder-down: unicode('f912'); -$ti-icon-folder-exclamation: unicode('f913'); -$ti-icon-folder-filled: unicode('f749'); -$ti-icon-folder-heart: unicode('f914'); -$ti-icon-folder-minus: unicode('eaaa'); -$ti-icon-folder-off: unicode('ed14'); -$ti-icon-folder-pause: unicode('f915'); -$ti-icon-folder-pin: unicode('f916'); -$ti-icon-folder-plus: unicode('eaab'); -$ti-icon-folder-question: unicode('f917'); -$ti-icon-folder-search: unicode('f918'); -$ti-icon-folder-share: unicode('f919'); -$ti-icon-folder-star: unicode('f91a'); -$ti-icon-folder-symlink: unicode('f91b'); -$ti-icon-folder-up: unicode('f91c'); -$ti-icon-folder-x: unicode('eaac'); -$ti-icon-folders: unicode('eaae'); -$ti-icon-folders-off: unicode('f133'); -$ti-icon-forbid: unicode('ebd5'); -$ti-icon-forbid-2: unicode('ebd4'); -$ti-icon-forklift: unicode('ebe9'); -$ti-icon-forms: unicode('ee8f'); -$ti-icon-fountain: unicode('f09b'); -$ti-icon-fountain-off: unicode('f134'); -$ti-icon-frame: unicode('eaaf'); -$ti-icon-frame-off: unicode('f135'); -$ti-icon-free-rights: unicode('efb6'); -$ti-icon-fridge: unicode('f1fa'); -$ti-icon-fridge-off: unicode('f3ef'); -$ti-icon-friends: unicode('eab0'); -$ti-icon-friends-off: unicode('f136'); -$ti-icon-function: unicode('f225'); -$ti-icon-function-off: unicode('f3f0'); -$ti-icon-garden-cart: unicode('f23e'); -$ti-icon-garden-cart-off: unicode('f3f1'); -$ti-icon-gas-station: unicode('ec7d'); -$ti-icon-gas-station-off: unicode('f137'); -$ti-icon-gauge: unicode('eab1'); -$ti-icon-gauge-off: unicode('f138'); -$ti-icon-gavel: unicode('ef90'); -$ti-icon-gender-agender: unicode('f0e1'); -$ti-icon-gender-androgyne: unicode('f0e2'); -$ti-icon-gender-bigender: unicode('f0e3'); -$ti-icon-gender-demiboy: unicode('f0e4'); -$ti-icon-gender-demigirl: unicode('f0e5'); -$ti-icon-gender-epicene: unicode('f0e6'); -$ti-icon-gender-female: unicode('f0e7'); -$ti-icon-gender-femme: unicode('f0e8'); -$ti-icon-gender-genderfluid: unicode('f0e9'); -$ti-icon-gender-genderless: unicode('f0ea'); -$ti-icon-gender-genderqueer: unicode('f0eb'); -$ti-icon-gender-hermaphrodite: unicode('f0ec'); -$ti-icon-gender-intergender: unicode('f0ed'); -$ti-icon-gender-male: unicode('f0ee'); -$ti-icon-gender-neutrois: unicode('f0ef'); -$ti-icon-gender-third: unicode('f0f0'); -$ti-icon-gender-transgender: unicode('f0f1'); -$ti-icon-gender-trasvesti: unicode('f0f2'); -$ti-icon-geometry: unicode('ee90'); -$ti-icon-ghost: unicode('eb8e'); -$ti-icon-ghost-2: unicode('f57c'); -$ti-icon-ghost-2-filled: unicode('f74a'); -$ti-icon-ghost-filled: unicode('f74b'); -$ti-icon-ghost-off: unicode('f3f2'); -$ti-icon-gif: unicode('f257'); -$ti-icon-gift: unicode('eb68'); -$ti-icon-gift-card: unicode('f3aa'); -$ti-icon-gift-off: unicode('f3f3'); -$ti-icon-git-branch: unicode('eab2'); -$ti-icon-git-branch-deleted: unicode('f57d'); -$ti-icon-git-cherry-pick: unicode('f57e'); -$ti-icon-git-commit: unicode('eab3'); -$ti-icon-git-compare: unicode('eab4'); -$ti-icon-git-fork: unicode('eb8f'); -$ti-icon-git-merge: unicode('eab5'); -$ti-icon-git-pull-request: unicode('eab6'); -$ti-icon-git-pull-request-closed: unicode('ef7f'); -$ti-icon-git-pull-request-draft: unicode('efb7'); -$ti-icon-gizmo: unicode('f02b'); -$ti-icon-glass: unicode('eab8'); -$ti-icon-glass-full: unicode('eab7'); -$ti-icon-glass-off: unicode('ee91'); -$ti-icon-globe: unicode('eab9'); -$ti-icon-globe-off: unicode('f139'); -$ti-icon-go-game: unicode('f512'); -$ti-icon-golf: unicode('ed8c'); -$ti-icon-golf-off: unicode('f13a'); -$ti-icon-gps: unicode('ed7a'); -$ti-icon-gradienter: unicode('f3ab'); -$ti-icon-grain: unicode('ee92'); -$ti-icon-graph: unicode('f288'); -$ti-icon-graph-off: unicode('f3f4'); -$ti-icon-grave: unicode('f580'); -$ti-icon-grave-2: unicode('f57f'); -$ti-icon-grid-dots: unicode('eaba'); -$ti-icon-grid-pattern: unicode('efc9'); -$ti-icon-grill: unicode('efa9'); -$ti-icon-grill-fork: unicode('f35b'); -$ti-icon-grill-off: unicode('f3f5'); -$ti-icon-grill-spatula: unicode('f35c'); -$ti-icon-grip-horizontal: unicode('ec00'); -$ti-icon-grip-vertical: unicode('ec01'); -$ti-icon-growth: unicode('ee93'); -$ti-icon-guitar-pick: unicode('f4c6'); -$ti-icon-guitar-pick-filled: unicode('f67b'); -$ti-icon-h-1: unicode('ec94'); -$ti-icon-h-2: unicode('ec95'); -$ti-icon-h-3: unicode('ec96'); -$ti-icon-h-4: unicode('ec97'); -$ti-icon-h-5: unicode('ec98'); -$ti-icon-h-6: unicode('ec99'); -$ti-icon-hammer: unicode('ef91'); -$ti-icon-hammer-off: unicode('f13c'); -$ti-icon-hand-click: unicode('ef4f'); -$ti-icon-hand-finger: unicode('ee94'); -$ti-icon-hand-finger-off: unicode('f13d'); -$ti-icon-hand-grab: unicode('f091'); -$ti-icon-hand-little-finger: unicode('ee95'); -$ti-icon-hand-middle-finger: unicode('ec2d'); -$ti-icon-hand-move: unicode('ef50'); -$ti-icon-hand-off: unicode('ed15'); -$ti-icon-hand-ring-finger: unicode('ee96'); -$ti-icon-hand-rock: unicode('ee97'); -$ti-icon-hand-sanitizer: unicode('f5f4'); -$ti-icon-hand-stop: unicode('ec2e'); -$ti-icon-hand-three-fingers: unicode('ee98'); -$ti-icon-hand-two-fingers: unicode('ee99'); -$ti-icon-hanger: unicode('ee9a'); -$ti-icon-hanger-2: unicode('f09c'); -$ti-icon-hanger-off: unicode('f13e'); -$ti-icon-hash: unicode('eabc'); -$ti-icon-haze: unicode('efaa'); -$ti-icon-heading: unicode('ee9b'); -$ti-icon-heading-off: unicode('f13f'); -$ti-icon-headphones: unicode('eabd'); -$ti-icon-headphones-off: unicode('ed1d'); -$ti-icon-headset: unicode('eb90'); -$ti-icon-headset-off: unicode('f3f6'); -$ti-icon-health-recognition: unicode('f1fb'); -$ti-icon-heart: unicode('eabe'); -$ti-icon-heart-broken: unicode('ecba'); -$ti-icon-heart-filled: unicode('f67c'); -$ti-icon-heart-handshake: unicode('f0f3'); -$ti-icon-heart-minus: unicode('f140'); -$ti-icon-heart-off: unicode('f141'); -$ti-icon-heart-plus: unicode('f142'); -$ti-icon-heart-rate-monitor: unicode('ef61'); -$ti-icon-heartbeat: unicode('ef92'); -$ti-icon-hearts: unicode('f387'); -$ti-icon-hearts-off: unicode('f3f7'); -$ti-icon-helicopter: unicode('ed8e'); -$ti-icon-helicopter-landing: unicode('ed8d'); -$ti-icon-helmet: unicode('efca'); -$ti-icon-helmet-off: unicode('f143'); -$ti-icon-help: unicode('eabf'); -$ti-icon-help-circle: unicode('f91d'); -$ti-icon-help-hexagon: unicode('f7a8'); -$ti-icon-help-octagon: unicode('f7a9'); -$ti-icon-help-off: unicode('f3f8'); -$ti-icon-help-small: unicode('f91e'); -$ti-icon-help-square: unicode('f920'); -$ti-icon-help-square-rounded: unicode('f91f'); -$ti-icon-help-triangle: unicode('f921'); -$ti-icon-hexagon: unicode('ec02'); -$ti-icon-hexagon-0-filled: unicode('f74c'); -$ti-icon-hexagon-1-filled: unicode('f74d'); -$ti-icon-hexagon-2-filled: unicode('f74e'); -$ti-icon-hexagon-3-filled: unicode('f74f'); -$ti-icon-hexagon-3d: unicode('f4c7'); -$ti-icon-hexagon-4-filled: unicode('f750'); -$ti-icon-hexagon-5-filled: unicode('f751'); -$ti-icon-hexagon-6-filled: unicode('f752'); -$ti-icon-hexagon-7-filled: unicode('f753'); -$ti-icon-hexagon-8-filled: unicode('f754'); -$ti-icon-hexagon-9-filled: unicode('f755'); -$ti-icon-hexagon-filled: unicode('f67d'); -$ti-icon-hexagon-letter-a: unicode('f463'); -$ti-icon-hexagon-letter-b: unicode('f464'); -$ti-icon-hexagon-letter-c: unicode('f465'); -$ti-icon-hexagon-letter-d: unicode('f466'); -$ti-icon-hexagon-letter-e: unicode('f467'); -$ti-icon-hexagon-letter-f: unicode('f468'); -$ti-icon-hexagon-letter-g: unicode('f469'); -$ti-icon-hexagon-letter-h: unicode('f46a'); -$ti-icon-hexagon-letter-i: unicode('f46b'); -$ti-icon-hexagon-letter-j: unicode('f46c'); -$ti-icon-hexagon-letter-k: unicode('f46d'); -$ti-icon-hexagon-letter-l: unicode('f46e'); -$ti-icon-hexagon-letter-m: unicode('f46f'); -$ti-icon-hexagon-letter-n: unicode('f470'); -$ti-icon-hexagon-letter-o: unicode('f471'); -$ti-icon-hexagon-letter-p: unicode('f472'); -$ti-icon-hexagon-letter-q: unicode('f473'); -$ti-icon-hexagon-letter-r: unicode('f474'); -$ti-icon-hexagon-letter-s: unicode('f475'); -$ti-icon-hexagon-letter-t: unicode('f476'); -$ti-icon-hexagon-letter-u: unicode('f477'); -$ti-icon-hexagon-letter-v: unicode('f4b3'); -$ti-icon-hexagon-letter-w: unicode('f478'); -$ti-icon-hexagon-letter-x: unicode('f479'); -$ti-icon-hexagon-letter-y: unicode('f47a'); -$ti-icon-hexagon-letter-z: unicode('f47b'); -$ti-icon-hexagon-number-0: unicode('f459'); -$ti-icon-hexagon-number-1: unicode('f45a'); -$ti-icon-hexagon-number-2: unicode('f45b'); -$ti-icon-hexagon-number-3: unicode('f45c'); -$ti-icon-hexagon-number-4: unicode('f45d'); -$ti-icon-hexagon-number-5: unicode('f45e'); -$ti-icon-hexagon-number-6: unicode('f45f'); -$ti-icon-hexagon-number-7: unicode('f460'); -$ti-icon-hexagon-number-8: unicode('f461'); -$ti-icon-hexagon-number-9: unicode('f462'); -$ti-icon-hexagon-off: unicode('ee9c'); -$ti-icon-hexagons: unicode('f09d'); -$ti-icon-hexagons-off: unicode('f3f9'); -$ti-icon-hierarchy: unicode('ee9e'); -$ti-icon-hierarchy-2: unicode('ee9d'); -$ti-icon-hierarchy-3: unicode('f289'); -$ti-icon-hierarchy-off: unicode('f3fa'); -$ti-icon-highlight: unicode('ef3f'); -$ti-icon-highlight-off: unicode('f144'); -$ti-icon-history: unicode('ebea'); -$ti-icon-history-off: unicode('f3fb'); -$ti-icon-history-toggle: unicode('f1fc'); -$ti-icon-home: unicode('eac1'); -$ti-icon-home-2: unicode('eac0'); -$ti-icon-home-bolt: unicode('f336'); -$ti-icon-home-cancel: unicode('f350'); -$ti-icon-home-check: unicode('f337'); -$ti-icon-home-cog: unicode('f338'); -$ti-icon-home-dollar: unicode('f339'); -$ti-icon-home-dot: unicode('f33a'); -$ti-icon-home-down: unicode('f33b'); -$ti-icon-home-eco: unicode('f351'); -$ti-icon-home-edit: unicode('f352'); -$ti-icon-home-exclamation: unicode('f33c'); -$ti-icon-home-hand: unicode('f504'); -$ti-icon-home-heart: unicode('f353'); -$ti-icon-home-infinity: unicode('f505'); -$ti-icon-home-link: unicode('f354'); -$ti-icon-home-minus: unicode('f33d'); -$ti-icon-home-move: unicode('f33e'); -$ti-icon-home-off: unicode('f145'); -$ti-icon-home-plus: unicode('f33f'); -$ti-icon-home-question: unicode('f340'); -$ti-icon-home-ribbon: unicode('f355'); -$ti-icon-home-search: unicode('f341'); -$ti-icon-home-share: unicode('f342'); -$ti-icon-home-shield: unicode('f343'); -$ti-icon-home-signal: unicode('f356'); -$ti-icon-home-star: unicode('f344'); -$ti-icon-home-stats: unicode('f345'); -$ti-icon-home-up: unicode('f346'); -$ti-icon-home-x: unicode('f347'); -$ti-icon-horse-toy: unicode('f28a'); -$ti-icon-hotel-service: unicode('ef80'); -$ti-icon-hourglass: unicode('ef93'); -$ti-icon-hourglass-empty: unicode('f146'); -$ti-icon-hourglass-filled: unicode('f756'); -$ti-icon-hourglass-high: unicode('f092'); -$ti-icon-hourglass-low: unicode('f093'); -$ti-icon-hourglass-off: unicode('f147'); -$ti-icon-html: unicode('f7b1'); -$ti-icon-ice-cream: unicode('eac2'); -$ti-icon-ice-cream-2: unicode('ee9f'); -$ti-icon-ice-cream-off: unicode('f148'); -$ti-icon-ice-skating: unicode('efcb'); -$ti-icon-icons: unicode('f1d4'); -$ti-icon-icons-off: unicode('f3fc'); -$ti-icon-id: unicode('eac3'); -$ti-icon-id-badge: unicode('eff7'); -$ti-icon-id-badge-2: unicode('f076'); -$ti-icon-id-badge-off: unicode('f3fd'); -$ti-icon-id-off: unicode('f149'); -$ti-icon-inbox: unicode('eac4'); -$ti-icon-inbox-off: unicode('f14a'); -$ti-icon-indent-decrease: unicode('eb91'); -$ti-icon-indent-increase: unicode('eb92'); -$ti-icon-infinity: unicode('eb69'); -$ti-icon-infinity-off: unicode('f3fe'); -$ti-icon-info-circle: unicode('eac5'); -$ti-icon-info-circle-filled: unicode('f6d8'); -$ti-icon-info-hexagon: unicode('f7aa'); -$ti-icon-info-octagon: unicode('f7ab'); -$ti-icon-info-small: unicode('f922'); -$ti-icon-info-square: unicode('eac6'); -$ti-icon-info-square-rounded: unicode('f635'); -$ti-icon-info-square-rounded-filled: unicode('f6d9'); -$ti-icon-info-triangle: unicode('f923'); -$ti-icon-inner-shadow-bottom: unicode('f520'); -$ti-icon-inner-shadow-bottom-filled: unicode('f757'); -$ti-icon-inner-shadow-bottom-left: unicode('f51e'); -$ti-icon-inner-shadow-bottom-left-filled: unicode('f758'); -$ti-icon-inner-shadow-bottom-right: unicode('f51f'); -$ti-icon-inner-shadow-bottom-right-filled: unicode('f759'); -$ti-icon-inner-shadow-left: unicode('f521'); -$ti-icon-inner-shadow-left-filled: unicode('f75a'); -$ti-icon-inner-shadow-right: unicode('f522'); -$ti-icon-inner-shadow-right-filled: unicode('f75b'); -$ti-icon-inner-shadow-top: unicode('f525'); -$ti-icon-inner-shadow-top-filled: unicode('f75c'); -$ti-icon-inner-shadow-top-left: unicode('f523'); -$ti-icon-inner-shadow-top-left-filled: unicode('f75d'); -$ti-icon-inner-shadow-top-right: unicode('f524'); -$ti-icon-inner-shadow-top-right-filled: unicode('f75e'); -$ti-icon-input-search: unicode('f2a2'); -$ti-icon-ironing-1: unicode('f2f4'); -$ti-icon-ironing-2: unicode('f2f5'); -$ti-icon-ironing-3: unicode('f2f6'); -$ti-icon-ironing-off: unicode('f2f7'); -$ti-icon-ironing-steam: unicode('f2f9'); -$ti-icon-ironing-steam-off: unicode('f2f8'); -$ti-icon-italic: unicode('eb93'); -$ti-icon-jacket: unicode('f661'); -$ti-icon-jetpack: unicode('f581'); -$ti-icon-jewish-star: unicode('f3ff'); -$ti-icon-jewish-star-filled: unicode('f67e'); -$ti-icon-jpg: unicode('f3ac'); -$ti-icon-json: unicode('f7b2'); -$ti-icon-jump-rope: unicode('ed8f'); -$ti-icon-karate: unicode('ed32'); -$ti-icon-kayak: unicode('f1d6'); -$ti-icon-kering: unicode('efb8'); -$ti-icon-key: unicode('eac7'); -$ti-icon-key-off: unicode('f14b'); -$ti-icon-keyboard: unicode('ebd6'); -$ti-icon-keyboard-hide: unicode('ec7e'); -$ti-icon-keyboard-off: unicode('eea0'); -$ti-icon-keyboard-show: unicode('ec7f'); -$ti-icon-keyframe: unicode('f576'); -$ti-icon-keyframe-align-center: unicode('f582'); -$ti-icon-keyframe-align-horizontal: unicode('f583'); -$ti-icon-keyframe-align-vertical: unicode('f584'); -$ti-icon-keyframes: unicode('f585'); -$ti-icon-ladder: unicode('efe2'); -$ti-icon-ladder-off: unicode('f14c'); -$ti-icon-lambda: unicode('f541'); -$ti-icon-lamp: unicode('efab'); -$ti-icon-lamp-2: unicode('f09e'); -$ti-icon-lamp-off: unicode('f14d'); -$ti-icon-language: unicode('ebbe'); -$ti-icon-language-hiragana: unicode('ef77'); -$ti-icon-language-katakana: unicode('ef78'); -$ti-icon-language-off: unicode('f14e'); -$ti-icon-lasso: unicode('efac'); -$ti-icon-lasso-off: unicode('f14f'); -$ti-icon-lasso-polygon: unicode('f388'); -$ti-icon-layers-difference: unicode('eac8'); -$ti-icon-layers-intersect: unicode('eac9'); -$ti-icon-layers-intersect-2: unicode('eff8'); -$ti-icon-layers-linked: unicode('eea1'); -$ti-icon-layers-off: unicode('f150'); -$ti-icon-layers-subtract: unicode('eaca'); -$ti-icon-layers-union: unicode('eacb'); -$ti-icon-layout: unicode('eadb'); -$ti-icon-layout-2: unicode('eacc'); -$ti-icon-layout-align-bottom: unicode('eacd'); -$ti-icon-layout-align-center: unicode('eace'); -$ti-icon-layout-align-left: unicode('eacf'); -$ti-icon-layout-align-middle: unicode('ead0'); -$ti-icon-layout-align-right: unicode('ead1'); -$ti-icon-layout-align-top: unicode('ead2'); -$ti-icon-layout-board: unicode('ef95'); -$ti-icon-layout-board-split: unicode('ef94'); -$ti-icon-layout-bottombar: unicode('ead3'); -$ti-icon-layout-bottombar-collapse: unicode('f28b'); -$ti-icon-layout-bottombar-expand: unicode('f28c'); -$ti-icon-layout-cards: unicode('ec13'); -$ti-icon-layout-collage: unicode('f389'); -$ti-icon-layout-columns: unicode('ead4'); -$ti-icon-layout-dashboard: unicode('f02c'); -$ti-icon-layout-distribute-horizontal: unicode('ead5'); -$ti-icon-layout-distribute-vertical: unicode('ead6'); -$ti-icon-layout-grid: unicode('edba'); -$ti-icon-layout-grid-add: unicode('edb9'); -$ti-icon-layout-kanban: unicode('ec3f'); -$ti-icon-layout-list: unicode('ec14'); -$ti-icon-layout-navbar: unicode('ead7'); -$ti-icon-layout-navbar-collapse: unicode('f28d'); -$ti-icon-layout-navbar-expand: unicode('f28e'); -$ti-icon-layout-off: unicode('f151'); -$ti-icon-layout-rows: unicode('ead8'); -$ti-icon-layout-sidebar: unicode('eada'); -$ti-icon-layout-sidebar-left-collapse: unicode('f004'); -$ti-icon-layout-sidebar-left-expand: unicode('f005'); -$ti-icon-layout-sidebar-right: unicode('ead9'); -$ti-icon-layout-sidebar-right-collapse: unicode('f006'); -$ti-icon-layout-sidebar-right-expand: unicode('f007'); -$ti-icon-leaf: unicode('ed4f'); -$ti-icon-leaf-off: unicode('f400'); -$ti-icon-lego: unicode('eadc'); -$ti-icon-lego-off: unicode('f401'); -$ti-icon-lemon: unicode('ef10'); -$ti-icon-lemon-2: unicode('ef81'); -$ti-icon-letter-a: unicode('ec50'); -$ti-icon-letter-b: unicode('ec51'); -$ti-icon-letter-c: unicode('ec52'); -$ti-icon-letter-case: unicode('eea5'); -$ti-icon-letter-case-lower: unicode('eea2'); -$ti-icon-letter-case-toggle: unicode('eea3'); -$ti-icon-letter-case-upper: unicode('eea4'); -$ti-icon-letter-d: unicode('ec53'); -$ti-icon-letter-e: unicode('ec54'); -$ti-icon-letter-f: unicode('ec55'); -$ti-icon-letter-g: unicode('ec56'); -$ti-icon-letter-h: unicode('ec57'); -$ti-icon-letter-i: unicode('ec58'); -$ti-icon-letter-j: unicode('ec59'); -$ti-icon-letter-k: unicode('ec5a'); -$ti-icon-letter-l: unicode('ec5b'); -$ti-icon-letter-m: unicode('ec5c'); -$ti-icon-letter-n: unicode('ec5d'); -$ti-icon-letter-o: unicode('ec5e'); -$ti-icon-letter-p: unicode('ec5f'); -$ti-icon-letter-q: unicode('ec60'); -$ti-icon-letter-r: unicode('ec61'); -$ti-icon-letter-s: unicode('ec62'); -$ti-icon-letter-spacing: unicode('eea6'); -$ti-icon-letter-t: unicode('ec63'); -$ti-icon-letter-u: unicode('ec64'); -$ti-icon-letter-v: unicode('ec65'); -$ti-icon-letter-w: unicode('ec66'); -$ti-icon-letter-x: unicode('ec67'); -$ti-icon-letter-y: unicode('ec68'); -$ti-icon-letter-z: unicode('ec69'); -$ti-icon-license: unicode('ebc0'); -$ti-icon-license-off: unicode('f153'); -$ti-icon-lifebuoy: unicode('eadd'); -$ti-icon-lifebuoy-off: unicode('f154'); -$ti-icon-lighter: unicode('f794'); -$ti-icon-line: unicode('ec40'); -$ti-icon-line-dashed: unicode('eea7'); -$ti-icon-line-dotted: unicode('eea8'); -$ti-icon-line-height: unicode('eb94'); -$ti-icon-link: unicode('eade'); -$ti-icon-link-off: unicode('f402'); -$ti-icon-list: unicode('eb6b'); -$ti-icon-list-check: unicode('eb6a'); -$ti-icon-list-details: unicode('ef40'); -$ti-icon-list-numbers: unicode('ef11'); -$ti-icon-list-search: unicode('eea9'); -$ti-icon-live-photo: unicode('eadf'); -$ti-icon-live-photo-off: unicode('f403'); -$ti-icon-live-view: unicode('ec6b'); -$ti-icon-loader: unicode('eca3'); -$ti-icon-loader-2: unicode('f226'); -$ti-icon-loader-3: unicode('f513'); -$ti-icon-loader-quarter: unicode('eca2'); -$ti-icon-location: unicode('eae0'); -$ti-icon-location-broken: unicode('f2c4'); -$ti-icon-location-filled: unicode('f67f'); -$ti-icon-location-off: unicode('f155'); -$ti-icon-lock: unicode('eae2'); -$ti-icon-lock-access: unicode('eeaa'); -$ti-icon-lock-access-off: unicode('f404'); -$ti-icon-lock-bolt: unicode('f924'); -$ti-icon-lock-cancel: unicode('f925'); -$ti-icon-lock-check: unicode('f926'); -$ti-icon-lock-code: unicode('f927'); -$ti-icon-lock-cog: unicode('f928'); -$ti-icon-lock-dollar: unicode('f929'); -$ti-icon-lock-down: unicode('f92a'); -$ti-icon-lock-exclamation: unicode('f92b'); -$ti-icon-lock-heart: unicode('f92c'); -$ti-icon-lock-minus: unicode('f92d'); -$ti-icon-lock-off: unicode('ed1e'); -$ti-icon-lock-open: unicode('eae1'); -$ti-icon-lock-open-off: unicode('f156'); -$ti-icon-lock-pause: unicode('f92e'); -$ti-icon-lock-pin: unicode('f92f'); -$ti-icon-lock-plus: unicode('f930'); -$ti-icon-lock-question: unicode('f931'); -$ti-icon-lock-search: unicode('f932'); -$ti-icon-lock-share: unicode('f933'); -$ti-icon-lock-square: unicode('ef51'); -$ti-icon-lock-square-rounded: unicode('f636'); -$ti-icon-lock-square-rounded-filled: unicode('f6da'); -$ti-icon-lock-star: unicode('f934'); -$ti-icon-lock-up: unicode('f935'); -$ti-icon-lock-x: unicode('f936'); -$ti-icon-logic-and: unicode('f240'); -$ti-icon-logic-buffer: unicode('f241'); -$ti-icon-logic-nand: unicode('f242'); -$ti-icon-logic-nor: unicode('f243'); -$ti-icon-logic-not: unicode('f244'); -$ti-icon-logic-or: unicode('f245'); -$ti-icon-logic-xnor: unicode('f246'); -$ti-icon-logic-xor: unicode('f247'); -$ti-icon-login: unicode('eba7'); -$ti-icon-logout: unicode('eba8'); -$ti-icon-lollipop: unicode('efcc'); -$ti-icon-lollipop-off: unicode('f157'); -$ti-icon-luggage: unicode('efad'); -$ti-icon-luggage-off: unicode('f158'); -$ti-icon-lungs: unicode('ef62'); -$ti-icon-lungs-off: unicode('f405'); -$ti-icon-macro: unicode('eeab'); -$ti-icon-macro-off: unicode('f406'); -$ti-icon-magnet: unicode('eae3'); -$ti-icon-magnet-off: unicode('f159'); -$ti-icon-mail: unicode('eae5'); -$ti-icon-mail-bolt: unicode('f937'); -$ti-icon-mail-cancel: unicode('f938'); -$ti-icon-mail-check: unicode('f939'); -$ti-icon-mail-code: unicode('f93a'); -$ti-icon-mail-cog: unicode('f93b'); -$ti-icon-mail-dollar: unicode('f93c'); -$ti-icon-mail-down: unicode('f93d'); -$ti-icon-mail-exclamation: unicode('f93e'); -$ti-icon-mail-fast: unicode('f069'); -$ti-icon-mail-forward: unicode('eeac'); -$ti-icon-mail-heart: unicode('f93f'); -$ti-icon-mail-minus: unicode('f940'); -$ti-icon-mail-off: unicode('f15a'); -$ti-icon-mail-opened: unicode('eae4'); -$ti-icon-mail-pause: unicode('f941'); -$ti-icon-mail-pin: unicode('f942'); -$ti-icon-mail-plus: unicode('f943'); -$ti-icon-mail-question: unicode('f944'); -$ti-icon-mail-search: unicode('f945'); -$ti-icon-mail-share: unicode('f946'); -$ti-icon-mail-star: unicode('f947'); -$ti-icon-mail-up: unicode('f948'); -$ti-icon-mail-x: unicode('f949'); -$ti-icon-mailbox: unicode('eead'); -$ti-icon-mailbox-off: unicode('f15b'); -$ti-icon-man: unicode('eae6'); -$ti-icon-manual-gearbox: unicode('ed7b'); -$ti-icon-map: unicode('eae9'); -$ti-icon-map-2: unicode('eae7'); -$ti-icon-map-off: unicode('f15c'); -$ti-icon-map-pin: unicode('eae8'); -$ti-icon-map-pin-bolt: unicode('f94a'); -$ti-icon-map-pin-cancel: unicode('f94b'); -$ti-icon-map-pin-check: unicode('f94c'); -$ti-icon-map-pin-code: unicode('f94d'); -$ti-icon-map-pin-cog: unicode('f94e'); -$ti-icon-map-pin-dollar: unicode('f94f'); -$ti-icon-map-pin-down: unicode('f950'); -$ti-icon-map-pin-exclamation: unicode('f951'); -$ti-icon-map-pin-filled: unicode('f680'); -$ti-icon-map-pin-heart: unicode('f952'); -$ti-icon-map-pin-minus: unicode('f953'); -$ti-icon-map-pin-off: unicode('ecf3'); -$ti-icon-map-pin-pause: unicode('f954'); -$ti-icon-map-pin-pin: unicode('f955'); -$ti-icon-map-pin-plus: unicode('f956'); -$ti-icon-map-pin-question: unicode('f957'); -$ti-icon-map-pin-search: unicode('f958'); -$ti-icon-map-pin-share: unicode('f795'); -$ti-icon-map-pin-star: unicode('f959'); -$ti-icon-map-pin-up: unicode('f95a'); -$ti-icon-map-pin-x: unicode('f95b'); -$ti-icon-map-pins: unicode('ed5e'); -$ti-icon-map-search: unicode('ef82'); -$ti-icon-markdown: unicode('ec41'); -$ti-icon-markdown-off: unicode('f407'); -$ti-icon-marquee: unicode('ec77'); -$ti-icon-marquee-2: unicode('eeae'); -$ti-icon-marquee-off: unicode('f15d'); -$ti-icon-mars: unicode('ec80'); -$ti-icon-mask: unicode('eeb0'); -$ti-icon-mask-off: unicode('eeaf'); -$ti-icon-masks-theater: unicode('f263'); -$ti-icon-masks-theater-off: unicode('f408'); -$ti-icon-massage: unicode('eeb1'); -$ti-icon-matchstick: unicode('f577'); -$ti-icon-math: unicode('ebeb'); -$ti-icon-math-1-divide-2: unicode('f4e2'); -$ti-icon-math-1-divide-3: unicode('f4e3'); -$ti-icon-math-avg: unicode('f0f4'); -$ti-icon-math-equal-greater: unicode('f4e4'); -$ti-icon-math-equal-lower: unicode('f4e5'); -$ti-icon-math-function: unicode('eeb2'); -$ti-icon-math-function-off: unicode('f15e'); -$ti-icon-math-function-y: unicode('f4e6'); -$ti-icon-math-greater: unicode('f4e7'); -$ti-icon-math-integral: unicode('f4e9'); -$ti-icon-math-integral-x: unicode('f4e8'); -$ti-icon-math-integrals: unicode('f4ea'); -$ti-icon-math-lower: unicode('f4eb'); -$ti-icon-math-max: unicode('f0f5'); -$ti-icon-math-min: unicode('f0f6'); -$ti-icon-math-not: unicode('f4ec'); -$ti-icon-math-off: unicode('f409'); -$ti-icon-math-pi: unicode('f4ee'); -$ti-icon-math-pi-divide-2: unicode('f4ed'); -$ti-icon-math-symbols: unicode('eeb3'); -$ti-icon-math-x-divide-2: unicode('f4ef'); -$ti-icon-math-x-divide-y: unicode('f4f1'); -$ti-icon-math-x-divide-y-2: unicode('f4f0'); -$ti-icon-math-x-minus-x: unicode('f4f2'); -$ti-icon-math-x-minus-y: unicode('f4f3'); -$ti-icon-math-x-plus-x: unicode('f4f4'); -$ti-icon-math-x-plus-y: unicode('f4f5'); -$ti-icon-math-xy: unicode('f4f6'); -$ti-icon-math-y-minus-y: unicode('f4f7'); -$ti-icon-math-y-plus-y: unicode('f4f8'); -$ti-icon-maximize: unicode('eaea'); -$ti-icon-maximize-off: unicode('f15f'); -$ti-icon-meat: unicode('ef12'); -$ti-icon-meat-off: unicode('f40a'); -$ti-icon-medal: unicode('ec78'); -$ti-icon-medal-2: unicode('efcd'); -$ti-icon-medical-cross: unicode('ec2f'); -$ti-icon-medical-cross-filled: unicode('f681'); -$ti-icon-medical-cross-off: unicode('f160'); -$ti-icon-medicine-syrup: unicode('ef63'); -$ti-icon-meeple: unicode('f514'); -$ti-icon-menorah: unicode('f58c'); -$ti-icon-menu: unicode('eaeb'); -$ti-icon-menu-2: unicode('ec42'); -$ti-icon-menu-order: unicode('f5f5'); -$ti-icon-message: unicode('eaef'); -$ti-icon-message-2: unicode('eaec'); -$ti-icon-message-2-bolt: unicode('f95c'); -$ti-icon-message-2-cancel: unicode('f95d'); -$ti-icon-message-2-check: unicode('f95e'); -$ti-icon-message-2-code: unicode('f012'); -$ti-icon-message-2-cog: unicode('f95f'); -$ti-icon-message-2-dollar: unicode('f960'); -$ti-icon-message-2-down: unicode('f961'); -$ti-icon-message-2-exclamation: unicode('f962'); -$ti-icon-message-2-heart: unicode('f963'); -$ti-icon-message-2-minus: unicode('f964'); -$ti-icon-message-2-off: unicode('f40b'); -$ti-icon-message-2-pause: unicode('f965'); -$ti-icon-message-2-pin: unicode('f966'); -$ti-icon-message-2-plus: unicode('f967'); -$ti-icon-message-2-question: unicode('f968'); -$ti-icon-message-2-search: unicode('f969'); -$ti-icon-message-2-share: unicode('f077'); -$ti-icon-message-2-star: unicode('f96a'); -$ti-icon-message-2-up: unicode('f96b'); -$ti-icon-message-2-x: unicode('f96c'); -$ti-icon-message-bolt: unicode('f96d'); -$ti-icon-message-cancel: unicode('f96e'); -$ti-icon-message-chatbot: unicode('f38a'); -$ti-icon-message-check: unicode('f96f'); -$ti-icon-message-circle: unicode('eaed'); -$ti-icon-message-circle-2: unicode('ed3f'); -$ti-icon-message-circle-2-filled: unicode('f682'); -$ti-icon-message-circle-bolt: unicode('f970'); -$ti-icon-message-circle-cancel: unicode('f971'); -$ti-icon-message-circle-check: unicode('f972'); -$ti-icon-message-circle-code: unicode('f973'); -$ti-icon-message-circle-cog: unicode('f974'); -$ti-icon-message-circle-dollar: unicode('f975'); -$ti-icon-message-circle-down: unicode('f976'); -$ti-icon-message-circle-exclamation: unicode('f977'); -$ti-icon-message-circle-heart: unicode('f978'); -$ti-icon-message-circle-minus: unicode('f979'); -$ti-icon-message-circle-off: unicode('ed40'); -$ti-icon-message-circle-pause: unicode('f97a'); -$ti-icon-message-circle-pin: unicode('f97b'); -$ti-icon-message-circle-plus: unicode('f97c'); -$ti-icon-message-circle-question: unicode('f97d'); -$ti-icon-message-circle-search: unicode('f97e'); -$ti-icon-message-circle-share: unicode('f97f'); -$ti-icon-message-circle-star: unicode('f980'); -$ti-icon-message-circle-up: unicode('f981'); -$ti-icon-message-circle-x: unicode('f982'); -$ti-icon-message-code: unicode('f013'); -$ti-icon-message-cog: unicode('f983'); -$ti-icon-message-dollar: unicode('f984'); -$ti-icon-message-dots: unicode('eaee'); -$ti-icon-message-down: unicode('f985'); -$ti-icon-message-exclamation: unicode('f986'); -$ti-icon-message-forward: unicode('f28f'); -$ti-icon-message-heart: unicode('f987'); -$ti-icon-message-language: unicode('efae'); -$ti-icon-message-minus: unicode('f988'); -$ti-icon-message-off: unicode('ed41'); -$ti-icon-message-pause: unicode('f989'); -$ti-icon-message-pin: unicode('f98a'); -$ti-icon-message-plus: unicode('ec9a'); -$ti-icon-message-question: unicode('f98b'); -$ti-icon-message-report: unicode('ec9b'); -$ti-icon-message-search: unicode('f98c'); -$ti-icon-message-share: unicode('f078'); -$ti-icon-message-star: unicode('f98d'); -$ti-icon-message-up: unicode('f98e'); -$ti-icon-message-x: unicode('f98f'); -$ti-icon-messages: unicode('eb6c'); -$ti-icon-messages-off: unicode('ed42'); -$ti-icon-meteor: unicode('f1fd'); -$ti-icon-meteor-off: unicode('f40c'); -$ti-icon-mickey: unicode('f2a3'); -$ti-icon-mickey-filled: unicode('f683'); -$ti-icon-microphone: unicode('eaf0'); -$ti-icon-microphone-2: unicode('ef2c'); -$ti-icon-microphone-2-off: unicode('f40d'); -$ti-icon-microphone-off: unicode('ed16'); -$ti-icon-microscope: unicode('ef64'); -$ti-icon-microscope-off: unicode('f40e'); -$ti-icon-microwave: unicode('f248'); -$ti-icon-microwave-off: unicode('f264'); -$ti-icon-military-award: unicode('f079'); -$ti-icon-military-rank: unicode('efcf'); -$ti-icon-milk: unicode('ef13'); -$ti-icon-milk-off: unicode('f40f'); -$ti-icon-milkshake: unicode('f4c8'); -$ti-icon-minimize: unicode('eaf1'); -$ti-icon-minus: unicode('eaf2'); -$ti-icon-minus-vertical: unicode('eeb4'); -$ti-icon-mist: unicode('ec30'); -$ti-icon-mist-off: unicode('f410'); -$ti-icon-mobiledata: unicode('f9f5'); -$ti-icon-mobiledata-off: unicode('f9f4'); -$ti-icon-moneybag: unicode('f506'); -$ti-icon-mood-angry: unicode('f2de'); -$ti-icon-mood-annoyed: unicode('f2e0'); -$ti-icon-mood-annoyed-2: unicode('f2df'); -$ti-icon-mood-boy: unicode('ed2d'); -$ti-icon-mood-check: unicode('f7b3'); -$ti-icon-mood-cog: unicode('f7b4'); -$ti-icon-mood-confuzed: unicode('eaf3'); -$ti-icon-mood-confuzed-filled: unicode('f7f2'); -$ti-icon-mood-crazy-happy: unicode('ed90'); -$ti-icon-mood-cry: unicode('ecbb'); -$ti-icon-mood-dollar: unicode('f7b5'); -$ti-icon-mood-empty: unicode('eeb5'); -$ti-icon-mood-empty-filled: unicode('f7f3'); -$ti-icon-mood-happy: unicode('eaf4'); -$ti-icon-mood-happy-filled: unicode('f7f4'); -$ti-icon-mood-heart: unicode('f7b6'); -$ti-icon-mood-kid: unicode('ec03'); -$ti-icon-mood-kid-filled: unicode('f7f5'); -$ti-icon-mood-look-left: unicode('f2c5'); -$ti-icon-mood-look-right: unicode('f2c6'); -$ti-icon-mood-minus: unicode('f7b7'); -$ti-icon-mood-nerd: unicode('f2e1'); -$ti-icon-mood-nervous: unicode('ef96'); -$ti-icon-mood-neutral: unicode('eaf5'); -$ti-icon-mood-neutral-filled: unicode('f7f6'); -$ti-icon-mood-off: unicode('f161'); -$ti-icon-mood-pin: unicode('f7b8'); -$ti-icon-mood-plus: unicode('f7b9'); -$ti-icon-mood-sad: unicode('eaf6'); -$ti-icon-mood-sad-2: unicode('f2e2'); -$ti-icon-mood-sad-dizzy: unicode('f2e3'); -$ti-icon-mood-sad-filled: unicode('f7f7'); -$ti-icon-mood-sad-squint: unicode('f2e4'); -$ti-icon-mood-search: unicode('f7ba'); -$ti-icon-mood-sick: unicode('f2e5'); -$ti-icon-mood-silence: unicode('f2e6'); -$ti-icon-mood-sing: unicode('f2c7'); -$ti-icon-mood-smile: unicode('eaf7'); -$ti-icon-mood-smile-beam: unicode('f2e7'); -$ti-icon-mood-smile-dizzy: unicode('f2e8'); -$ti-icon-mood-smile-filled: unicode('f7f8'); -$ti-icon-mood-suprised: unicode('ec04'); -$ti-icon-mood-tongue: unicode('eb95'); -$ti-icon-mood-tongue-wink: unicode('f2ea'); -$ti-icon-mood-tongue-wink-2: unicode('f2e9'); -$ti-icon-mood-unamused: unicode('f2eb'); -$ti-icon-mood-up: unicode('f7bb'); -$ti-icon-mood-wink: unicode('f2ed'); -$ti-icon-mood-wink-2: unicode('f2ec'); -$ti-icon-mood-wrrr: unicode('f2ee'); -$ti-icon-mood-x: unicode('f7bc'); -$ti-icon-mood-xd: unicode('f2ef'); -$ti-icon-moon: unicode('eaf8'); -$ti-icon-moon-2: unicode('ece6'); -$ti-icon-moon-filled: unicode('f684'); -$ti-icon-moon-off: unicode('f162'); -$ti-icon-moon-stars: unicode('ece7'); -$ti-icon-moped: unicode('ecbc'); -$ti-icon-motorbike: unicode('eeb6'); -$ti-icon-mountain: unicode('ef97'); -$ti-icon-mountain-off: unicode('f411'); -$ti-icon-mouse: unicode('eaf9'); -$ti-icon-mouse-2: unicode('f1d7'); -$ti-icon-mouse-off: unicode('f163'); -$ti-icon-moustache: unicode('f4c9'); -$ti-icon-movie: unicode('eafa'); -$ti-icon-movie-off: unicode('f164'); -$ti-icon-mug: unicode('eafb'); -$ti-icon-mug-off: unicode('f165'); -$ti-icon-multiplier-0-5x: unicode('ef41'); -$ti-icon-multiplier-1-5x: unicode('ef42'); -$ti-icon-multiplier-1x: unicode('ef43'); -$ti-icon-multiplier-2x: unicode('ef44'); -$ti-icon-mushroom: unicode('ef14'); -$ti-icon-mushroom-filled: unicode('f7f9'); -$ti-icon-mushroom-off: unicode('f412'); -$ti-icon-music: unicode('eafc'); -$ti-icon-music-off: unicode('f166'); -$ti-icon-navigation: unicode('f2c8'); -$ti-icon-navigation-filled: unicode('f685'); -$ti-icon-navigation-off: unicode('f413'); -$ti-icon-needle: unicode('f508'); -$ti-icon-needle-thread: unicode('f507'); -$ti-icon-network: unicode('f09f'); -$ti-icon-network-off: unicode('f414'); -$ti-icon-new-section: unicode('ebc1'); -$ti-icon-news: unicode('eafd'); -$ti-icon-news-off: unicode('f167'); -$ti-icon-nfc: unicode('eeb7'); -$ti-icon-nfc-off: unicode('f168'); -$ti-icon-no-copyright: unicode('efb9'); -$ti-icon-no-creative-commons: unicode('efba'); -$ti-icon-no-derivatives: unicode('efbb'); -$ti-icon-north-star: unicode('f014'); -$ti-icon-note: unicode('eb6d'); -$ti-icon-note-off: unicode('f169'); -$ti-icon-notebook: unicode('eb96'); -$ti-icon-notebook-off: unicode('f415'); -$ti-icon-notes: unicode('eb6e'); -$ti-icon-notes-off: unicode('f16a'); -$ti-icon-notification: unicode('eafe'); -$ti-icon-notification-off: unicode('f16b'); -$ti-icon-number: unicode('f1fe'); -$ti-icon-number-0: unicode('edf0'); -$ti-icon-number-1: unicode('edf1'); -$ti-icon-number-2: unicode('edf2'); -$ti-icon-number-3: unicode('edf3'); -$ti-icon-number-4: unicode('edf4'); -$ti-icon-number-5: unicode('edf5'); -$ti-icon-number-6: unicode('edf6'); -$ti-icon-number-7: unicode('edf7'); -$ti-icon-number-8: unicode('edf8'); -$ti-icon-number-9: unicode('edf9'); -$ti-icon-numbers: unicode('f015'); -$ti-icon-nurse: unicode('ef65'); -$ti-icon-octagon: unicode('ecbd'); -$ti-icon-octagon-filled: unicode('f686'); -$ti-icon-octagon-off: unicode('eeb8'); -$ti-icon-old: unicode('eeb9'); -$ti-icon-olympics: unicode('eeba'); -$ti-icon-olympics-off: unicode('f416'); -$ti-icon-om: unicode('f58d'); -$ti-icon-omega: unicode('eb97'); -$ti-icon-outbound: unicode('f249'); -$ti-icon-outlet: unicode('ebd7'); -$ti-icon-oval: unicode('f02e'); -$ti-icon-oval-filled: unicode('f687'); -$ti-icon-oval-vertical: unicode('f02d'); -$ti-icon-oval-vertical-filled: unicode('f688'); -$ti-icon-overline: unicode('eebb'); -$ti-icon-package: unicode('eaff'); -$ti-icon-package-export: unicode('f07a'); -$ti-icon-package-import: unicode('f07b'); -$ti-icon-package-off: unicode('f16c'); -$ti-icon-packages: unicode('f2c9'); -$ti-icon-pacman: unicode('eebc'); -$ti-icon-page-break: unicode('ec81'); -$ti-icon-paint: unicode('eb00'); -$ti-icon-paint-filled: unicode('f75f'); -$ti-icon-paint-off: unicode('f16d'); -$ti-icon-palette: unicode('eb01'); -$ti-icon-palette-off: unicode('f16e'); -$ti-icon-panorama-horizontal: unicode('ed33'); -$ti-icon-panorama-horizontal-off: unicode('f417'); -$ti-icon-panorama-vertical: unicode('ed34'); -$ti-icon-panorama-vertical-off: unicode('f418'); -$ti-icon-paper-bag: unicode('f02f'); -$ti-icon-paper-bag-off: unicode('f16f'); -$ti-icon-paperclip: unicode('eb02'); -$ti-icon-parachute: unicode('ed7c'); -$ti-icon-parachute-off: unicode('f170'); -$ti-icon-parentheses: unicode('ebd8'); -$ti-icon-parentheses-off: unicode('f171'); -$ti-icon-parking: unicode('eb03'); -$ti-icon-parking-off: unicode('f172'); -$ti-icon-password: unicode('f4ca'); -$ti-icon-paw: unicode('eff9'); -$ti-icon-paw-filled: unicode('f689'); -$ti-icon-paw-off: unicode('f419'); -$ti-icon-pdf: unicode('f7ac'); -$ti-icon-peace: unicode('ecbe'); -$ti-icon-pencil: unicode('eb04'); -$ti-icon-pencil-minus: unicode('f1eb'); -$ti-icon-pencil-off: unicode('f173'); -$ti-icon-pencil-plus: unicode('f1ec'); -$ti-icon-pennant: unicode('ed7d'); -$ti-icon-pennant-2: unicode('f06a'); -$ti-icon-pennant-2-filled: unicode('f68a'); -$ti-icon-pennant-filled: unicode('f68b'); -$ti-icon-pennant-off: unicode('f174'); -$ti-icon-pentagon: unicode('efe3'); -$ti-icon-pentagon-filled: unicode('f68c'); -$ti-icon-pentagon-off: unicode('f41a'); -$ti-icon-pentagram: unicode('f586'); -$ti-icon-pepper: unicode('ef15'); -$ti-icon-pepper-off: unicode('f175'); -$ti-icon-percentage: unicode('ecf4'); -$ti-icon-perfume: unicode('f509'); -$ti-icon-perspective: unicode('eebd'); -$ti-icon-perspective-off: unicode('f176'); -$ti-icon-phone: unicode('eb09'); -$ti-icon-phone-call: unicode('eb05'); -$ti-icon-phone-calling: unicode('ec43'); -$ti-icon-phone-check: unicode('ec05'); -$ti-icon-phone-incoming: unicode('eb06'); -$ti-icon-phone-off: unicode('ecf5'); -$ti-icon-phone-outgoing: unicode('eb07'); -$ti-icon-phone-pause: unicode('eb08'); -$ti-icon-phone-plus: unicode('ec06'); -$ti-icon-phone-x: unicode('ec07'); -$ti-icon-photo: unicode('eb0a'); -$ti-icon-photo-bolt: unicode('f990'); -$ti-icon-photo-cancel: unicode('f35d'); -$ti-icon-photo-check: unicode('f35e'); -$ti-icon-photo-code: unicode('f991'); -$ti-icon-photo-cog: unicode('f992'); -$ti-icon-photo-dollar: unicode('f993'); -$ti-icon-photo-down: unicode('f35f'); -$ti-icon-photo-edit: unicode('f360'); -$ti-icon-photo-exclamation: unicode('f994'); -$ti-icon-photo-heart: unicode('f361'); -$ti-icon-photo-minus: unicode('f362'); -$ti-icon-photo-off: unicode('ecf6'); -$ti-icon-photo-pause: unicode('f995'); -$ti-icon-photo-pin: unicode('f996'); -$ti-icon-photo-plus: unicode('f363'); -$ti-icon-photo-question: unicode('f997'); -$ti-icon-photo-search: unicode('f364'); -$ti-icon-photo-sensor: unicode('f798'); -$ti-icon-photo-sensor-2: unicode('f796'); -$ti-icon-photo-sensor-3: unicode('f797'); -$ti-icon-photo-share: unicode('f998'); -$ti-icon-photo-shield: unicode('f365'); -$ti-icon-photo-star: unicode('f366'); -$ti-icon-photo-up: unicode('f38b'); -$ti-icon-photo-x: unicode('f367'); -$ti-icon-physotherapist: unicode('eebe'); -$ti-icon-picture-in-picture: unicode('ed35'); -$ti-icon-picture-in-picture-off: unicode('ed43'); -$ti-icon-picture-in-picture-on: unicode('ed44'); -$ti-icon-picture-in-picture-top: unicode('efe4'); -$ti-icon-pig: unicode('ef52'); -$ti-icon-pig-money: unicode('f38c'); -$ti-icon-pig-off: unicode('f177'); -$ti-icon-pilcrow: unicode('f5f6'); -$ti-icon-pill: unicode('ec44'); -$ti-icon-pill-off: unicode('f178'); -$ti-icon-pills: unicode('ef66'); -$ti-icon-pin: unicode('ec9c'); -$ti-icon-pin-filled: unicode('f68d'); -$ti-icon-ping-pong: unicode('f38d'); -$ti-icon-pinned: unicode('ed60'); -$ti-icon-pinned-filled: unicode('f68e'); -$ti-icon-pinned-off: unicode('ed5f'); -$ti-icon-pizza: unicode('edbb'); -$ti-icon-pizza-off: unicode('f179'); -$ti-icon-placeholder: unicode('f626'); -$ti-icon-plane: unicode('eb6f'); -$ti-icon-plane-arrival: unicode('eb99'); -$ti-icon-plane-departure: unicode('eb9a'); -$ti-icon-plane-inflight: unicode('ef98'); -$ti-icon-plane-off: unicode('f17a'); -$ti-icon-plane-tilt: unicode('f1ed'); -$ti-icon-planet: unicode('ec08'); -$ti-icon-planet-off: unicode('f17b'); -$ti-icon-plant: unicode('ed50'); -$ti-icon-plant-2: unicode('ed7e'); -$ti-icon-plant-2-off: unicode('f17c'); -$ti-icon-plant-off: unicode('f17d'); -$ti-icon-play-card: unicode('eebf'); -$ti-icon-play-card-off: unicode('f17e'); -$ti-icon-player-eject: unicode('efbc'); -$ti-icon-player-eject-filled: unicode('f68f'); -$ti-icon-player-pause: unicode('ed45'); -$ti-icon-player-pause-filled: unicode('f690'); -$ti-icon-player-play: unicode('ed46'); -$ti-icon-player-play-filled: unicode('f691'); -$ti-icon-player-record: unicode('ed47'); -$ti-icon-player-record-filled: unicode('f692'); -$ti-icon-player-skip-back: unicode('ed48'); -$ti-icon-player-skip-back-filled: unicode('f693'); -$ti-icon-player-skip-forward: unicode('ed49'); -$ti-icon-player-skip-forward-filled: unicode('f694'); -$ti-icon-player-stop: unicode('ed4a'); -$ti-icon-player-stop-filled: unicode('f695'); -$ti-icon-player-track-next: unicode('ed4b'); -$ti-icon-player-track-next-filled: unicode('f696'); -$ti-icon-player-track-prev: unicode('ed4c'); -$ti-icon-player-track-prev-filled: unicode('f697'); -$ti-icon-playlist: unicode('eec0'); -$ti-icon-playlist-add: unicode('f008'); -$ti-icon-playlist-off: unicode('f17f'); -$ti-icon-playlist-x: unicode('f009'); -$ti-icon-playstation-circle: unicode('f2ad'); -$ti-icon-playstation-square: unicode('f2ae'); -$ti-icon-playstation-triangle: unicode('f2af'); -$ti-icon-playstation-x: unicode('f2b0'); -$ti-icon-plug: unicode('ebd9'); -$ti-icon-plug-connected: unicode('f00a'); -$ti-icon-plug-connected-x: unicode('f0a0'); -$ti-icon-plug-off: unicode('f180'); -$ti-icon-plug-x: unicode('f0a1'); -$ti-icon-plus: unicode('eb0b'); -$ti-icon-plus-equal: unicode('f7ad'); -$ti-icon-plus-minus: unicode('f7ae'); -$ti-icon-png: unicode('f3ad'); -$ti-icon-podium: unicode('f1d8'); -$ti-icon-podium-off: unicode('f41b'); -$ti-icon-point: unicode('eb0c'); -$ti-icon-point-filled: unicode('f698'); -$ti-icon-point-off: unicode('f181'); -$ti-icon-pointer: unicode('f265'); -$ti-icon-pointer-bolt: unicode('f999'); -$ti-icon-pointer-cancel: unicode('f99a'); -$ti-icon-pointer-check: unicode('f99b'); -$ti-icon-pointer-code: unicode('f99c'); -$ti-icon-pointer-cog: unicode('f99d'); -$ti-icon-pointer-dollar: unicode('f99e'); -$ti-icon-pointer-down: unicode('f99f'); -$ti-icon-pointer-exclamation: unicode('f9a0'); -$ti-icon-pointer-heart: unicode('f9a1'); -$ti-icon-pointer-minus: unicode('f9a2'); -$ti-icon-pointer-off: unicode('f9a3'); -$ti-icon-pointer-pause: unicode('f9a4'); -$ti-icon-pointer-pin: unicode('f9a5'); -$ti-icon-pointer-plus: unicode('f9a6'); -$ti-icon-pointer-question: unicode('f9a7'); -$ti-icon-pointer-search: unicode('f9a8'); -$ti-icon-pointer-share: unicode('f9a9'); -$ti-icon-pointer-star: unicode('f9aa'); -$ti-icon-pointer-up: unicode('f9ab'); -$ti-icon-pointer-x: unicode('f9ac'); -$ti-icon-pokeball: unicode('eec1'); -$ti-icon-pokeball-off: unicode('f41c'); -$ti-icon-poker-chip: unicode('f515'); -$ti-icon-polaroid: unicode('eec2'); -$ti-icon-polygon: unicode('efd0'); -$ti-icon-polygon-off: unicode('f182'); -$ti-icon-poo: unicode('f258'); -$ti-icon-pool: unicode('ed91'); -$ti-icon-pool-off: unicode('f41d'); -$ti-icon-power: unicode('eb0d'); -$ti-icon-pray: unicode('ecbf'); -$ti-icon-premium-rights: unicode('efbd'); -$ti-icon-prescription: unicode('ef99'); -$ti-icon-presentation: unicode('eb70'); -$ti-icon-presentation-analytics: unicode('eec3'); -$ti-icon-presentation-off: unicode('f183'); -$ti-icon-printer: unicode('eb0e'); -$ti-icon-printer-off: unicode('f184'); -$ti-icon-prison: unicode('ef79'); -$ti-icon-prompt: unicode('eb0f'); -$ti-icon-propeller: unicode('eec4'); -$ti-icon-propeller-off: unicode('f185'); -$ti-icon-pumpkin-scary: unicode('f587'); -$ti-icon-puzzle: unicode('eb10'); -$ti-icon-puzzle-2: unicode('ef83'); -$ti-icon-puzzle-filled: unicode('f699'); -$ti-icon-puzzle-off: unicode('f186'); -$ti-icon-pyramid: unicode('eec5'); -$ti-icon-pyramid-off: unicode('f187'); -$ti-icon-qrcode: unicode('eb11'); -$ti-icon-qrcode-off: unicode('f41e'); -$ti-icon-question-mark: unicode('ec9d'); -$ti-icon-quote: unicode('efbe'); -$ti-icon-quote-off: unicode('f188'); -$ti-icon-radar: unicode('f017'); -$ti-icon-radar-2: unicode('f016'); -$ti-icon-radar-off: unicode('f41f'); -$ti-icon-radio: unicode('ef2d'); -$ti-icon-radio-off: unicode('f420'); -$ti-icon-radioactive: unicode('ecc0'); -$ti-icon-radioactive-filled: unicode('f760'); -$ti-icon-radioactive-off: unicode('f189'); -$ti-icon-radius-bottom-left: unicode('eec6'); -$ti-icon-radius-bottom-right: unicode('eec7'); -$ti-icon-radius-top-left: unicode('eec8'); -$ti-icon-radius-top-right: unicode('eec9'); -$ti-icon-rainbow: unicode('edbc'); -$ti-icon-rainbow-off: unicode('f18a'); -$ti-icon-rating-12-plus: unicode('f266'); -$ti-icon-rating-14-plus: unicode('f267'); -$ti-icon-rating-16-plus: unicode('f268'); -$ti-icon-rating-18-plus: unicode('f269'); -$ti-icon-rating-21-plus: unicode('f26a'); -$ti-icon-razor: unicode('f4b5'); -$ti-icon-razor-electric: unicode('f4b4'); -$ti-icon-receipt: unicode('edfd'); -$ti-icon-receipt-2: unicode('edfa'); -$ti-icon-receipt-off: unicode('edfb'); -$ti-icon-receipt-refund: unicode('edfc'); -$ti-icon-receipt-tax: unicode('edbd'); -$ti-icon-recharging: unicode('eeca'); -$ti-icon-record-mail: unicode('eb12'); -$ti-icon-record-mail-off: unicode('f18b'); -$ti-icon-rectangle: unicode('ed37'); -$ti-icon-rectangle-filled: unicode('f69a'); -$ti-icon-rectangle-vertical: unicode('ed36'); -$ti-icon-rectangle-vertical-filled: unicode('f69b'); -$ti-icon-recycle: unicode('eb9b'); -$ti-icon-recycle-off: unicode('f18c'); -$ti-icon-refresh: unicode('eb13'); -$ti-icon-refresh-alert: unicode('ed57'); -$ti-icon-refresh-dot: unicode('efbf'); -$ti-icon-refresh-off: unicode('f18d'); -$ti-icon-regex: unicode('f31f'); -$ti-icon-regex-off: unicode('f421'); -$ti-icon-registered: unicode('eb14'); -$ti-icon-relation-many-to-many: unicode('ed7f'); -$ti-icon-relation-one-to-many: unicode('ed80'); -$ti-icon-relation-one-to-one: unicode('ed81'); -$ti-icon-reload: unicode('f3ae'); -$ti-icon-repeat: unicode('eb72'); -$ti-icon-repeat-off: unicode('f18e'); -$ti-icon-repeat-once: unicode('eb71'); -$ti-icon-replace: unicode('ebc7'); -$ti-icon-replace-filled: unicode('f69c'); -$ti-icon-replace-off: unicode('f422'); -$ti-icon-report: unicode('eece'); -$ti-icon-report-analytics: unicode('eecb'); -$ti-icon-report-medical: unicode('eecc'); -$ti-icon-report-money: unicode('eecd'); -$ti-icon-report-off: unicode('f18f'); -$ti-icon-report-search: unicode('ef84'); -$ti-icon-reserved-line: unicode('f9f6'); -$ti-icon-resize: unicode('eecf'); -$ti-icon-ribbon-health: unicode('f58e'); -$ti-icon-ripple: unicode('ed82'); -$ti-icon-ripple-off: unicode('f190'); -$ti-icon-road: unicode('f018'); -$ti-icon-road-off: unicode('f191'); -$ti-icon-road-sign: unicode('ecdd'); -$ti-icon-robot: unicode('f00b'); -$ti-icon-robot-off: unicode('f192'); -$ti-icon-rocket: unicode('ec45'); -$ti-icon-rocket-off: unicode('f193'); -$ti-icon-roller-skating: unicode('efd1'); -$ti-icon-rollercoaster: unicode('f0a2'); -$ti-icon-rollercoaster-off: unicode('f423'); -$ti-icon-rosette: unicode('f599'); -$ti-icon-rosette-filled: unicode('f69d'); -$ti-icon-rosette-number-0: unicode('f58f'); -$ti-icon-rosette-number-1: unicode('f590'); -$ti-icon-rosette-number-2: unicode('f591'); -$ti-icon-rosette-number-3: unicode('f592'); -$ti-icon-rosette-number-4: unicode('f593'); -$ti-icon-rosette-number-5: unicode('f594'); -$ti-icon-rosette-number-6: unicode('f595'); -$ti-icon-rosette-number-7: unicode('f596'); -$ti-icon-rosette-number-8: unicode('f597'); -$ti-icon-rosette-number-9: unicode('f598'); -$ti-icon-rotate: unicode('eb16'); -$ti-icon-rotate-2: unicode('ebb4'); -$ti-icon-rotate-360: unicode('ef85'); -$ti-icon-rotate-clockwise: unicode('eb15'); -$ti-icon-rotate-clockwise-2: unicode('ebb5'); -$ti-icon-rotate-dot: unicode('efe5'); -$ti-icon-rotate-rectangle: unicode('ec15'); -$ti-icon-route: unicode('eb17'); -$ti-icon-route-2: unicode('f4b6'); -$ti-icon-route-off: unicode('f194'); -$ti-icon-router: unicode('eb18'); -$ti-icon-router-off: unicode('f424'); -$ti-icon-row-insert-bottom: unicode('eed0'); -$ti-icon-row-insert-top: unicode('eed1'); -$ti-icon-rss: unicode('eb19'); -$ti-icon-rubber-stamp: unicode('f5ab'); -$ti-icon-rubber-stamp-off: unicode('f5aa'); -$ti-icon-ruler: unicode('eb1a'); -$ti-icon-ruler-2: unicode('eed2'); -$ti-icon-ruler-2-off: unicode('f195'); -$ti-icon-ruler-3: unicode('f290'); -$ti-icon-ruler-measure: unicode('f291'); -$ti-icon-ruler-off: unicode('f196'); -$ti-icon-run: unicode('ec82'); -$ti-icon-s-turn-down: unicode('f516'); -$ti-icon-s-turn-left: unicode('f517'); -$ti-icon-s-turn-right: unicode('f518'); -$ti-icon-s-turn-up: unicode('f519'); -$ti-icon-sailboat: unicode('ec83'); -$ti-icon-sailboat-2: unicode('f5f7'); -$ti-icon-sailboat-off: unicode('f425'); -$ti-icon-salad: unicode('f50a'); -$ti-icon-salt: unicode('ef16'); -$ti-icon-satellite: unicode('eed3'); -$ti-icon-satellite-off: unicode('f197'); -$ti-icon-sausage: unicode('ef17'); -$ti-icon-scale: unicode('ebc2'); -$ti-icon-scale-off: unicode('f198'); -$ti-icon-scale-outline: unicode('ef53'); -$ti-icon-scale-outline-off: unicode('f199'); -$ti-icon-scan: unicode('ebc8'); -$ti-icon-scan-eye: unicode('f1ff'); -$ti-icon-schema: unicode('f200'); -$ti-icon-schema-off: unicode('f426'); -$ti-icon-school: unicode('ecf7'); -$ti-icon-school-bell: unicode('f64a'); -$ti-icon-school-off: unicode('f19a'); -$ti-icon-scissors: unicode('eb1b'); -$ti-icon-scissors-off: unicode('f19b'); -$ti-icon-scooter: unicode('ec6c'); -$ti-icon-scooter-electric: unicode('ecc1'); -$ti-icon-screen-share: unicode('ed18'); -$ti-icon-screen-share-off: unicode('ed17'); -$ti-icon-screenshot: unicode('f201'); -$ti-icon-scribble: unicode('f0a3'); -$ti-icon-scribble-off: unicode('f427'); -$ti-icon-script: unicode('f2da'); -$ti-icon-script-minus: unicode('f2d7'); -$ti-icon-script-plus: unicode('f2d8'); -$ti-icon-script-x: unicode('f2d9'); -$ti-icon-scuba-mask: unicode('eed4'); -$ti-icon-scuba-mask-off: unicode('f428'); -$ti-icon-sdk: unicode('f3af'); -$ti-icon-search: unicode('eb1c'); -$ti-icon-search-off: unicode('f19c'); -$ti-icon-section: unicode('eed5'); -$ti-icon-section-sign: unicode('f019'); -$ti-icon-seeding: unicode('ed51'); -$ti-icon-seeding-off: unicode('f19d'); -$ti-icon-select: unicode('ec9e'); -$ti-icon-select-all: unicode('f9f7'); -$ti-icon-selector: unicode('eb1d'); -$ti-icon-send: unicode('eb1e'); -$ti-icon-send-off: unicode('f429'); -$ti-icon-seo: unicode('f26b'); -$ti-icon-separator: unicode('ebda'); -$ti-icon-separator-horizontal: unicode('ec79'); -$ti-icon-separator-vertical: unicode('ec7a'); -$ti-icon-server: unicode('eb1f'); -$ti-icon-server-2: unicode('f07c'); -$ti-icon-server-bolt: unicode('f320'); -$ti-icon-server-cog: unicode('f321'); -$ti-icon-server-off: unicode('f19e'); -$ti-icon-servicemark: unicode('ec09'); -$ti-icon-settings: unicode('eb20'); -$ti-icon-settings-2: unicode('f5ac'); -$ti-icon-settings-automation: unicode('eed6'); -$ti-icon-settings-bolt: unicode('f9ad'); -$ti-icon-settings-cancel: unicode('f9ae'); -$ti-icon-settings-check: unicode('f9af'); -$ti-icon-settings-code: unicode('f9b0'); -$ti-icon-settings-cog: unicode('f9b1'); -$ti-icon-settings-dollar: unicode('f9b2'); -$ti-icon-settings-down: unicode('f9b3'); -$ti-icon-settings-exclamation: unicode('f9b4'); -$ti-icon-settings-filled: unicode('f69e'); -$ti-icon-settings-heart: unicode('f9b5'); -$ti-icon-settings-minus: unicode('f9b6'); -$ti-icon-settings-off: unicode('f19f'); -$ti-icon-settings-pause: unicode('f9b7'); -$ti-icon-settings-pin: unicode('f9b8'); -$ti-icon-settings-plus: unicode('f9b9'); -$ti-icon-settings-question: unicode('f9ba'); -$ti-icon-settings-search: unicode('f9bb'); -$ti-icon-settings-share: unicode('f9bc'); -$ti-icon-settings-star: unicode('f9bd'); -$ti-icon-settings-up: unicode('f9be'); -$ti-icon-settings-x: unicode('f9bf'); -$ti-icon-shadow: unicode('eed8'); -$ti-icon-shadow-off: unicode('eed7'); -$ti-icon-shape: unicode('eb9c'); -$ti-icon-shape-2: unicode('eed9'); -$ti-icon-shape-3: unicode('eeda'); -$ti-icon-shape-off: unicode('f1a0'); -$ti-icon-share: unicode('eb21'); -$ti-icon-share-2: unicode('f799'); -$ti-icon-share-3: unicode('f7bd'); -$ti-icon-share-off: unicode('f1a1'); -$ti-icon-shield: unicode('eb24'); -$ti-icon-shield-bolt: unicode('f9c0'); -$ti-icon-shield-cancel: unicode('f9c1'); -$ti-icon-shield-check: unicode('eb22'); -$ti-icon-shield-check-filled: unicode('f761'); -$ti-icon-shield-checkered: unicode('ef9a'); -$ti-icon-shield-checkered-filled: unicode('f762'); -$ti-icon-shield-chevron: unicode('ef9b'); -$ti-icon-shield-code: unicode('f9c2'); -$ti-icon-shield-cog: unicode('f9c3'); -$ti-icon-shield-dollar: unicode('f9c4'); -$ti-icon-shield-down: unicode('f9c5'); -$ti-icon-shield-exclamation: unicode('f9c6'); -$ti-icon-shield-filled: unicode('f69f'); -$ti-icon-shield-half: unicode('f358'); -$ti-icon-shield-half-filled: unicode('f357'); -$ti-icon-shield-heart: unicode('f9c7'); -$ti-icon-shield-lock: unicode('ed58'); -$ti-icon-shield-lock-filled: unicode('f763'); -$ti-icon-shield-minus: unicode('f9c8'); -$ti-icon-shield-off: unicode('ecf8'); -$ti-icon-shield-pause: unicode('f9c9'); -$ti-icon-shield-pin: unicode('f9ca'); -$ti-icon-shield-plus: unicode('f9cb'); -$ti-icon-shield-question: unicode('f9cc'); -$ti-icon-shield-search: unicode('f9cd'); -$ti-icon-shield-share: unicode('f9ce'); -$ti-icon-shield-star: unicode('f9cf'); -$ti-icon-shield-up: unicode('f9d0'); -$ti-icon-shield-x: unicode('eb23'); -$ti-icon-ship: unicode('ec84'); -$ti-icon-ship-off: unicode('f42a'); -$ti-icon-shirt: unicode('ec0a'); -$ti-icon-shirt-filled: unicode('f6a0'); -$ti-icon-shirt-off: unicode('f1a2'); -$ti-icon-shirt-sport: unicode('f26c'); -$ti-icon-shoe: unicode('efd2'); -$ti-icon-shoe-off: unicode('f1a4'); -$ti-icon-shopping-bag: unicode('f5f8'); -$ti-icon-shopping-cart: unicode('eb25'); -$ti-icon-shopping-cart-discount: unicode('eedb'); -$ti-icon-shopping-cart-off: unicode('eedc'); -$ti-icon-shopping-cart-plus: unicode('eedd'); -$ti-icon-shopping-cart-x: unicode('eede'); -$ti-icon-shovel: unicode('f1d9'); -$ti-icon-shredder: unicode('eedf'); -$ti-icon-sign-left: unicode('f06b'); -$ti-icon-sign-left-filled: unicode('f6a1'); -$ti-icon-sign-right: unicode('f06c'); -$ti-icon-sign-right-filled: unicode('f6a2'); -$ti-icon-signal-2g: unicode('f79a'); -$ti-icon-signal-3g: unicode('f1ee'); -$ti-icon-signal-4g: unicode('f1ef'); -$ti-icon-signal-4g-plus: unicode('f259'); -$ti-icon-signal-5g: unicode('f1f0'); -$ti-icon-signal-6g: unicode('f9f8'); -$ti-icon-signal-e: unicode('f9f9'); -$ti-icon-signal-g: unicode('f9fa'); -$ti-icon-signal-h: unicode('f9fc'); -$ti-icon-signal-h-plus: unicode('f9fb'); -$ti-icon-signal-lte: unicode('f9fd'); -$ti-icon-signature: unicode('eee0'); -$ti-icon-signature-off: unicode('f1a5'); -$ti-icon-sitemap: unicode('eb9d'); -$ti-icon-sitemap-off: unicode('f1a6'); -$ti-icon-skateboard: unicode('ecc2'); -$ti-icon-skateboard-off: unicode('f42b'); -$ti-icon-skull: unicode('f292'); -$ti-icon-slash: unicode('f4f9'); -$ti-icon-slashes: unicode('f588'); -$ti-icon-sleigh: unicode('ef9c'); -$ti-icon-slice: unicode('ebdb'); -$ti-icon-slideshow: unicode('ebc9'); -$ti-icon-smart-home: unicode('ecde'); -$ti-icon-smart-home-off: unicode('f1a7'); -$ti-icon-smoking: unicode('ecc4'); -$ti-icon-smoking-no: unicode('ecc3'); -$ti-icon-snowflake: unicode('ec0b'); -$ti-icon-snowflake-off: unicode('f1a8'); -$ti-icon-snowman: unicode('f26d'); -$ti-icon-soccer-field: unicode('ed92'); -$ti-icon-social: unicode('ebec'); -$ti-icon-social-off: unicode('f1a9'); -$ti-icon-sock: unicode('eee1'); -$ti-icon-sofa: unicode('efaf'); -$ti-icon-sofa-off: unicode('f42c'); -$ti-icon-solar-panel: unicode('f7bf'); -$ti-icon-solar-panel-2: unicode('f7be'); -$ti-icon-sort-0-9: unicode('f54d'); -$ti-icon-sort-9-0: unicode('f54e'); -$ti-icon-sort-a-z: unicode('f54f'); -$ti-icon-sort-ascending: unicode('eb26'); -$ti-icon-sort-ascending-2: unicode('eee2'); -$ti-icon-sort-ascending-letters: unicode('ef18'); -$ti-icon-sort-ascending-numbers: unicode('ef19'); -$ti-icon-sort-descending: unicode('eb27'); -$ti-icon-sort-descending-2: unicode('eee3'); -$ti-icon-sort-descending-letters: unicode('ef1a'); -$ti-icon-sort-descending-numbers: unicode('ef1b'); -$ti-icon-sort-z-a: unicode('f550'); -$ti-icon-sos: unicode('f24a'); -$ti-icon-soup: unicode('ef2e'); -$ti-icon-soup-off: unicode('f42d'); -$ti-icon-source-code: unicode('f4a2'); -$ti-icon-space: unicode('ec0c'); -$ti-icon-space-off: unicode('f1aa'); -$ti-icon-spacing-horizontal: unicode('ef54'); -$ti-icon-spacing-vertical: unicode('ef55'); -$ti-icon-spade: unicode('effa'); -$ti-icon-spade-filled: unicode('f6a3'); -$ti-icon-sparkles: unicode('f6d7'); -$ti-icon-speakerphone: unicode('ed61'); -$ti-icon-speedboat: unicode('ed93'); -$ti-icon-spider: unicode('f293'); -$ti-icon-spiral: unicode('f294'); -$ti-icon-spiral-off: unicode('f42e'); -$ti-icon-sport-billard: unicode('eee4'); -$ti-icon-spray: unicode('f50b'); -$ti-icon-spy: unicode('f227'); -$ti-icon-spy-off: unicode('f42f'); -$ti-icon-sql: unicode('f7c0'); -$ti-icon-square: unicode('eb2c'); -$ti-icon-square-0-filled: unicode('f764'); -$ti-icon-square-1-filled: unicode('f765'); -$ti-icon-square-2-filled: unicode('f7fa'); -$ti-icon-square-3-filled: unicode('f766'); -$ti-icon-square-4-filled: unicode('f767'); -$ti-icon-square-5-filled: unicode('f768'); -$ti-icon-square-6-filled: unicode('f769'); -$ti-icon-square-7-filled: unicode('f76a'); -$ti-icon-square-8-filled: unicode('f76b'); -$ti-icon-square-9-filled: unicode('f76c'); -$ti-icon-square-arrow-down: unicode('f4b7'); -$ti-icon-square-arrow-left: unicode('f4b8'); -$ti-icon-square-arrow-right: unicode('f4b9'); -$ti-icon-square-arrow-up: unicode('f4ba'); -$ti-icon-square-asterisk: unicode('f01a'); -$ti-icon-square-check: unicode('eb28'); -$ti-icon-square-check-filled: unicode('f76d'); -$ti-icon-square-chevron-down: unicode('f627'); -$ti-icon-square-chevron-left: unicode('f628'); -$ti-icon-square-chevron-right: unicode('f629'); -$ti-icon-square-chevron-up: unicode('f62a'); -$ti-icon-square-chevrons-down: unicode('f64b'); -$ti-icon-square-chevrons-left: unicode('f64c'); -$ti-icon-square-chevrons-right: unicode('f64d'); -$ti-icon-square-chevrons-up: unicode('f64e'); -$ti-icon-square-dot: unicode('ed59'); -$ti-icon-square-f0: unicode('f526'); -$ti-icon-square-f0-filled: unicode('f76e'); -$ti-icon-square-f1: unicode('f527'); -$ti-icon-square-f1-filled: unicode('f76f'); -$ti-icon-square-f2: unicode('f528'); -$ti-icon-square-f2-filled: unicode('f770'); -$ti-icon-square-f3: unicode('f529'); -$ti-icon-square-f3-filled: unicode('f771'); -$ti-icon-square-f4: unicode('f52a'); -$ti-icon-square-f4-filled: unicode('f772'); -$ti-icon-square-f5: unicode('f52b'); -$ti-icon-square-f5-filled: unicode('f773'); -$ti-icon-square-f6: unicode('f52c'); -$ti-icon-square-f6-filled: unicode('f774'); -$ti-icon-square-f7: unicode('f52d'); -$ti-icon-square-f7-filled: unicode('f775'); -$ti-icon-square-f8: unicode('f52e'); -$ti-icon-square-f8-filled: unicode('f776'); -$ti-icon-square-f9: unicode('f52f'); -$ti-icon-square-f9-filled: unicode('f777'); -$ti-icon-square-forbid: unicode('ed5b'); -$ti-icon-square-forbid-2: unicode('ed5a'); -$ti-icon-square-half: unicode('effb'); -$ti-icon-square-key: unicode('f638'); -$ti-icon-square-letter-a: unicode('f47c'); -$ti-icon-square-letter-b: unicode('f47d'); -$ti-icon-square-letter-c: unicode('f47e'); -$ti-icon-square-letter-d: unicode('f47f'); -$ti-icon-square-letter-e: unicode('f480'); -$ti-icon-square-letter-f: unicode('f481'); -$ti-icon-square-letter-g: unicode('f482'); -$ti-icon-square-letter-h: unicode('f483'); -$ti-icon-square-letter-i: unicode('f484'); -$ti-icon-square-letter-j: unicode('f485'); -$ti-icon-square-letter-k: unicode('f486'); -$ti-icon-square-letter-l: unicode('f487'); -$ti-icon-square-letter-m: unicode('f488'); -$ti-icon-square-letter-n: unicode('f489'); -$ti-icon-square-letter-o: unicode('f48a'); -$ti-icon-square-letter-p: unicode('f48b'); -$ti-icon-square-letter-q: unicode('f48c'); -$ti-icon-square-letter-r: unicode('f48d'); -$ti-icon-square-letter-s: unicode('f48e'); -$ti-icon-square-letter-t: unicode('f48f'); -$ti-icon-square-letter-u: unicode('f490'); -$ti-icon-square-letter-v: unicode('f4bb'); -$ti-icon-square-letter-w: unicode('f491'); -$ti-icon-square-letter-x: unicode('f4bc'); -$ti-icon-square-letter-y: unicode('f492'); -$ti-icon-square-letter-z: unicode('f493'); -$ti-icon-square-minus: unicode('eb29'); -$ti-icon-square-number-0: unicode('eee5'); -$ti-icon-square-number-1: unicode('eee6'); -$ti-icon-square-number-2: unicode('eee7'); -$ti-icon-square-number-3: unicode('eee8'); -$ti-icon-square-number-4: unicode('eee9'); -$ti-icon-square-number-5: unicode('eeea'); -$ti-icon-square-number-6: unicode('eeeb'); -$ti-icon-square-number-7: unicode('eeec'); -$ti-icon-square-number-8: unicode('eeed'); -$ti-icon-square-number-9: unicode('eeee'); -$ti-icon-square-off: unicode('eeef'); -$ti-icon-square-plus: unicode('eb2a'); -$ti-icon-square-root: unicode('eef1'); -$ti-icon-square-root-2: unicode('eef0'); -$ti-icon-square-rotated: unicode('ecdf'); -$ti-icon-square-rotated-filled: unicode('f6a4'); -$ti-icon-square-rotated-forbid: unicode('f01c'); -$ti-icon-square-rotated-forbid-2: unicode('f01b'); -$ti-icon-square-rotated-off: unicode('eef2'); -$ti-icon-square-rounded: unicode('f59a'); -$ti-icon-square-rounded-arrow-down: unicode('f639'); -$ti-icon-square-rounded-arrow-down-filled: unicode('f6db'); -$ti-icon-square-rounded-arrow-left: unicode('f63a'); -$ti-icon-square-rounded-arrow-left-filled: unicode('f6dc'); -$ti-icon-square-rounded-arrow-right: unicode('f63b'); -$ti-icon-square-rounded-arrow-right-filled: unicode('f6dd'); -$ti-icon-square-rounded-arrow-up: unicode('f63c'); -$ti-icon-square-rounded-arrow-up-filled: unicode('f6de'); -$ti-icon-square-rounded-check: unicode('f63d'); -$ti-icon-square-rounded-check-filled: unicode('f6df'); -$ti-icon-square-rounded-chevron-down: unicode('f62b'); -$ti-icon-square-rounded-chevron-down-filled: unicode('f6e0'); -$ti-icon-square-rounded-chevron-left: unicode('f62c'); -$ti-icon-square-rounded-chevron-left-filled: unicode('f6e1'); -$ti-icon-square-rounded-chevron-right: unicode('f62d'); -$ti-icon-square-rounded-chevron-right-filled: unicode('f6e2'); -$ti-icon-square-rounded-chevron-up: unicode('f62e'); -$ti-icon-square-rounded-chevron-up-filled: unicode('f6e3'); -$ti-icon-square-rounded-chevrons-down: unicode('f64f'); -$ti-icon-square-rounded-chevrons-down-filled: unicode('f6e4'); -$ti-icon-square-rounded-chevrons-left: unicode('f650'); -$ti-icon-square-rounded-chevrons-left-filled: unicode('f6e5'); -$ti-icon-square-rounded-chevrons-right: unicode('f651'); -$ti-icon-square-rounded-chevrons-right-filled: unicode('f6e6'); -$ti-icon-square-rounded-chevrons-up: unicode('f652'); -$ti-icon-square-rounded-chevrons-up-filled: unicode('f6e7'); -$ti-icon-square-rounded-filled: unicode('f6a5'); -$ti-icon-square-rounded-letter-a: unicode('f5ae'); -$ti-icon-square-rounded-letter-b: unicode('f5af'); -$ti-icon-square-rounded-letter-c: unicode('f5b0'); -$ti-icon-square-rounded-letter-d: unicode('f5b1'); -$ti-icon-square-rounded-letter-e: unicode('f5b2'); -$ti-icon-square-rounded-letter-f: unicode('f5b3'); -$ti-icon-square-rounded-letter-g: unicode('f5b4'); -$ti-icon-square-rounded-letter-h: unicode('f5b5'); -$ti-icon-square-rounded-letter-i: unicode('f5b6'); -$ti-icon-square-rounded-letter-j: unicode('f5b7'); -$ti-icon-square-rounded-letter-k: unicode('f5b8'); -$ti-icon-square-rounded-letter-l: unicode('f5b9'); -$ti-icon-square-rounded-letter-m: unicode('f5ba'); -$ti-icon-square-rounded-letter-n: unicode('f5bb'); -$ti-icon-square-rounded-letter-o: unicode('f5bc'); -$ti-icon-square-rounded-letter-p: unicode('f5bd'); -$ti-icon-square-rounded-letter-q: unicode('f5be'); -$ti-icon-square-rounded-letter-r: unicode('f5bf'); -$ti-icon-square-rounded-letter-s: unicode('f5c0'); -$ti-icon-square-rounded-letter-t: unicode('f5c1'); -$ti-icon-square-rounded-letter-u: unicode('f5c2'); -$ti-icon-square-rounded-letter-v: unicode('f5c3'); -$ti-icon-square-rounded-letter-w: unicode('f5c4'); -$ti-icon-square-rounded-letter-x: unicode('f5c5'); -$ti-icon-square-rounded-letter-y: unicode('f5c6'); -$ti-icon-square-rounded-letter-z: unicode('f5c7'); -$ti-icon-square-rounded-minus: unicode('f63e'); -$ti-icon-square-rounded-number-0: unicode('f5c8'); -$ti-icon-square-rounded-number-0-filled: unicode('f778'); -$ti-icon-square-rounded-number-1: unicode('f5c9'); -$ti-icon-square-rounded-number-1-filled: unicode('f779'); -$ti-icon-square-rounded-number-2: unicode('f5ca'); -$ti-icon-square-rounded-number-2-filled: unicode('f77a'); -$ti-icon-square-rounded-number-3: unicode('f5cb'); -$ti-icon-square-rounded-number-3-filled: unicode('f77b'); -$ti-icon-square-rounded-number-4: unicode('f5cc'); -$ti-icon-square-rounded-number-4-filled: unicode('f77c'); -$ti-icon-square-rounded-number-5: unicode('f5cd'); -$ti-icon-square-rounded-number-5-filled: unicode('f77d'); -$ti-icon-square-rounded-number-6: unicode('f5ce'); -$ti-icon-square-rounded-number-6-filled: unicode('f77e'); -$ti-icon-square-rounded-number-7: unicode('f5cf'); -$ti-icon-square-rounded-number-7-filled: unicode('f77f'); -$ti-icon-square-rounded-number-8: unicode('f5d0'); -$ti-icon-square-rounded-number-8-filled: unicode('f780'); -$ti-icon-square-rounded-number-9: unicode('f5d1'); -$ti-icon-square-rounded-number-9-filled: unicode('f781'); -$ti-icon-square-rounded-plus: unicode('f63f'); -$ti-icon-square-rounded-plus-filled: unicode('f6e8'); -$ti-icon-square-rounded-x: unicode('f640'); -$ti-icon-square-rounded-x-filled: unicode('f6e9'); -$ti-icon-square-toggle: unicode('eef4'); -$ti-icon-square-toggle-horizontal: unicode('eef3'); -$ti-icon-square-x: unicode('eb2b'); -$ti-icon-squares-diagonal: unicode('eef5'); -$ti-icon-squares-filled: unicode('eef6'); -$ti-icon-stack: unicode('eb2d'); -$ti-icon-stack-2: unicode('eef7'); -$ti-icon-stack-3: unicode('ef9d'); -$ti-icon-stack-pop: unicode('f234'); -$ti-icon-stack-push: unicode('f235'); -$ti-icon-stairs: unicode('eca6'); -$ti-icon-stairs-down: unicode('eca4'); -$ti-icon-stairs-up: unicode('eca5'); -$ti-icon-star: unicode('eb2e'); -$ti-icon-star-filled: unicode('f6a6'); -$ti-icon-star-half: unicode('ed19'); -$ti-icon-star-half-filled: unicode('f6a7'); -$ti-icon-star-off: unicode('ed62'); -$ti-icon-stars: unicode('ed38'); -$ti-icon-stars-filled: unicode('f6a8'); -$ti-icon-stars-off: unicode('f430'); -$ti-icon-status-change: unicode('f3b0'); -$ti-icon-steam: unicode('f24b'); -$ti-icon-steering-wheel: unicode('ec7b'); -$ti-icon-steering-wheel-off: unicode('f431'); -$ti-icon-step-into: unicode('ece0'); -$ti-icon-step-out: unicode('ece1'); -$ti-icon-stereo-glasses: unicode('f4cb'); -$ti-icon-stethoscope: unicode('edbe'); -$ti-icon-stethoscope-off: unicode('f432'); -$ti-icon-sticker: unicode('eb2f'); -$ti-icon-storm: unicode('f24c'); -$ti-icon-storm-off: unicode('f433'); -$ti-icon-stretching: unicode('f2db'); -$ti-icon-strikethrough: unicode('eb9e'); -$ti-icon-submarine: unicode('ed94'); -$ti-icon-subscript: unicode('eb9f'); -$ti-icon-subtask: unicode('ec9f'); -$ti-icon-sum: unicode('eb73'); -$ti-icon-sum-off: unicode('f1ab'); -$ti-icon-sun: unicode('eb30'); -$ti-icon-sun-filled: unicode('f6a9'); -$ti-icon-sun-high: unicode('f236'); -$ti-icon-sun-low: unicode('f237'); -$ti-icon-sun-moon: unicode('f4a3'); -$ti-icon-sun-off: unicode('ed63'); -$ti-icon-sun-wind: unicode('f238'); -$ti-icon-sunglasses: unicode('f239'); -$ti-icon-sunrise: unicode('ef1c'); -$ti-icon-sunset: unicode('ec31'); -$ti-icon-sunset-2: unicode('f23a'); -$ti-icon-superscript: unicode('eba0'); -$ti-icon-svg: unicode('f25a'); -$ti-icon-swimming: unicode('ec92'); -$ti-icon-swipe: unicode('f551'); -$ti-icon-switch: unicode('eb33'); -$ti-icon-switch-2: unicode('edbf'); -$ti-icon-switch-3: unicode('edc0'); -$ti-icon-switch-horizontal: unicode('eb31'); -$ti-icon-switch-vertical: unicode('eb32'); -$ti-icon-sword: unicode('f030'); -$ti-icon-sword-off: unicode('f434'); -$ti-icon-swords: unicode('f132'); -$ti-icon-table: unicode('eba1'); -$ti-icon-table-alias: unicode('f25b'); -$ti-icon-table-export: unicode('eef8'); -$ti-icon-table-filled: unicode('f782'); -$ti-icon-table-import: unicode('eef9'); -$ti-icon-table-off: unicode('eefa'); -$ti-icon-table-options: unicode('f25c'); -$ti-icon-table-shortcut: unicode('f25d'); -$ti-icon-tag: unicode('eb34'); -$ti-icon-tag-off: unicode('efc0'); -$ti-icon-tags: unicode('ef86'); -$ti-icon-tags-off: unicode('efc1'); -$ti-icon-tallymark-1: unicode('ec46'); -$ti-icon-tallymark-2: unicode('ec47'); -$ti-icon-tallymark-3: unicode('ec48'); -$ti-icon-tallymark-4: unicode('ec49'); -$ti-icon-tallymarks: unicode('ec4a'); -$ti-icon-tank: unicode('ed95'); -$ti-icon-target: unicode('eb35'); -$ti-icon-target-arrow: unicode('f51a'); -$ti-icon-target-off: unicode('f1ad'); -$ti-icon-teapot: unicode('f552'); -$ti-icon-telescope: unicode('f07d'); -$ti-icon-telescope-off: unicode('f1ae'); -$ti-icon-temperature: unicode('eb38'); -$ti-icon-temperature-celsius: unicode('eb36'); -$ti-icon-temperature-fahrenheit: unicode('eb37'); -$ti-icon-temperature-minus: unicode('ebed'); -$ti-icon-temperature-off: unicode('f1af'); -$ti-icon-temperature-plus: unicode('ebee'); -$ti-icon-template: unicode('eb39'); -$ti-icon-template-off: unicode('f1b0'); -$ti-icon-tent: unicode('eefb'); -$ti-icon-tent-off: unicode('f435'); -$ti-icon-terminal: unicode('ebdc'); -$ti-icon-terminal-2: unicode('ebef'); -$ti-icon-test-pipe: unicode('eb3a'); -$ti-icon-test-pipe-2: unicode('f0a4'); -$ti-icon-test-pipe-off: unicode('f1b1'); -$ti-icon-tex: unicode('f4e0'); -$ti-icon-text-caption: unicode('f4a4'); -$ti-icon-text-color: unicode('f2dc'); -$ti-icon-text-decrease: unicode('f202'); -$ti-icon-text-direction-ltr: unicode('eefc'); -$ti-icon-text-direction-rtl: unicode('eefd'); -$ti-icon-text-increase: unicode('f203'); -$ti-icon-text-orientation: unicode('f2a4'); -$ti-icon-text-plus: unicode('f2a5'); -$ti-icon-text-recognition: unicode('f204'); -$ti-icon-text-resize: unicode('ef87'); -$ti-icon-text-size: unicode('f2b1'); -$ti-icon-text-spellcheck: unicode('f2a6'); -$ti-icon-text-wrap: unicode('ebdd'); -$ti-icon-text-wrap-disabled: unicode('eca7'); -$ti-icon-texture: unicode('f51b'); -$ti-icon-theater: unicode('f79b'); -$ti-icon-thermometer: unicode('ef67'); -$ti-icon-thumb-down: unicode('eb3b'); -$ti-icon-thumb-down-filled: unicode('f6aa'); -$ti-icon-thumb-down-off: unicode('f436'); -$ti-icon-thumb-up: unicode('eb3c'); -$ti-icon-thumb-up-filled: unicode('f6ab'); -$ti-icon-thumb-up-off: unicode('f437'); -$ti-icon-tic-tac: unicode('f51c'); -$ti-icon-ticket: unicode('eb3d'); -$ti-icon-ticket-off: unicode('f1b2'); -$ti-icon-tie: unicode('f07e'); -$ti-icon-tilde: unicode('f4a5'); -$ti-icon-tilt-shift: unicode('eefe'); -$ti-icon-tilt-shift-off: unicode('f1b3'); -$ti-icon-timeline: unicode('f031'); -$ti-icon-timeline-event: unicode('f553'); -$ti-icon-timeline-event-exclamation: unicode('f662'); -$ti-icon-timeline-event-minus: unicode('f663'); -$ti-icon-timeline-event-plus: unicode('f664'); -$ti-icon-timeline-event-text: unicode('f665'); -$ti-icon-timeline-event-x: unicode('f666'); -$ti-icon-tir: unicode('ebf0'); -$ti-icon-toggle-left: unicode('eb3e'); -$ti-icon-toggle-right: unicode('eb3f'); -$ti-icon-toilet-paper: unicode('efd3'); -$ti-icon-toilet-paper-off: unicode('f1b4'); -$ti-icon-tool: unicode('eb40'); -$ti-icon-tools: unicode('ebca'); -$ti-icon-tools-kitchen: unicode('ed64'); -$ti-icon-tools-kitchen-2: unicode('eeff'); -$ti-icon-tools-kitchen-2-off: unicode('f1b5'); -$ti-icon-tools-kitchen-off: unicode('f1b6'); -$ti-icon-tools-off: unicode('f1b7'); -$ti-icon-tooltip: unicode('f2dd'); -$ti-icon-topology-bus: unicode('f5d9'); -$ti-icon-topology-complex: unicode('f5da'); -$ti-icon-topology-full: unicode('f5dc'); -$ti-icon-topology-full-hierarchy: unicode('f5db'); -$ti-icon-topology-ring: unicode('f5df'); -$ti-icon-topology-ring-2: unicode('f5dd'); -$ti-icon-topology-ring-3: unicode('f5de'); -$ti-icon-topology-star: unicode('f5e5'); -$ti-icon-topology-star-2: unicode('f5e0'); -$ti-icon-topology-star-3: unicode('f5e1'); -$ti-icon-topology-star-ring: unicode('f5e4'); -$ti-icon-topology-star-ring-2: unicode('f5e2'); -$ti-icon-topology-star-ring-3: unicode('f5e3'); -$ti-icon-torii: unicode('f59b'); -$ti-icon-tornado: unicode('ece2'); -$ti-icon-tournament: unicode('ecd0'); -$ti-icon-tower: unicode('f2cb'); -$ti-icon-tower-off: unicode('f2ca'); -$ti-icon-track: unicode('ef00'); -$ti-icon-tractor: unicode('ec0d'); -$ti-icon-trademark: unicode('ec0e'); -$ti-icon-traffic-cone: unicode('ec0f'); -$ti-icon-traffic-cone-off: unicode('f1b8'); -$ti-icon-traffic-lights: unicode('ed39'); -$ti-icon-traffic-lights-off: unicode('f1b9'); -$ti-icon-train: unicode('ed96'); -$ti-icon-transfer-in: unicode('ef2f'); -$ti-icon-transfer-out: unicode('ef30'); -$ti-icon-transform: unicode('f38e'); -$ti-icon-transform-filled: unicode('f6ac'); -$ti-icon-transition-bottom: unicode('f2b2'); -$ti-icon-transition-left: unicode('f2b3'); -$ti-icon-transition-right: unicode('f2b4'); -$ti-icon-transition-top: unicode('f2b5'); -$ti-icon-trash: unicode('eb41'); -$ti-icon-trash-filled: unicode('f783'); -$ti-icon-trash-off: unicode('ed65'); -$ti-icon-trash-x: unicode('ef88'); -$ti-icon-trash-x-filled: unicode('f784'); -$ti-icon-tree: unicode('ef01'); -$ti-icon-trees: unicode('ec10'); -$ti-icon-trekking: unicode('f5ad'); -$ti-icon-trending-down: unicode('eb42'); -$ti-icon-trending-down-2: unicode('edc1'); -$ti-icon-trending-down-3: unicode('edc2'); -$ti-icon-trending-up: unicode('eb43'); -$ti-icon-trending-up-2: unicode('edc3'); -$ti-icon-trending-up-3: unicode('edc4'); -$ti-icon-triangle: unicode('eb44'); -$ti-icon-triangle-filled: unicode('f6ad'); -$ti-icon-triangle-inverted: unicode('f01d'); -$ti-icon-triangle-inverted-filled: unicode('f6ae'); -$ti-icon-triangle-off: unicode('ef02'); -$ti-icon-triangle-square-circle: unicode('ece8'); -$ti-icon-triangles: unicode('f0a5'); -$ti-icon-trident: unicode('ecc5'); -$ti-icon-trolley: unicode('f4cc'); -$ti-icon-trophy: unicode('eb45'); -$ti-icon-trophy-filled: unicode('f6af'); -$ti-icon-trophy-off: unicode('f438'); -$ti-icon-trowel: unicode('f368'); -$ti-icon-truck: unicode('ebc4'); -$ti-icon-truck-delivery: unicode('ec4b'); -$ti-icon-truck-loading: unicode('f1da'); -$ti-icon-truck-off: unicode('ef03'); -$ti-icon-truck-return: unicode('ec4c'); -$ti-icon-txt: unicode('f3b1'); -$ti-icon-typography: unicode('ebc5'); -$ti-icon-typography-off: unicode('f1ba'); -$ti-icon-ufo: unicode('f26f'); -$ti-icon-ufo-off: unicode('f26e'); -$ti-icon-umbrella: unicode('ebf1'); -$ti-icon-umbrella-filled: unicode('f6b0'); -$ti-icon-umbrella-off: unicode('f1bb'); -$ti-icon-underline: unicode('eba2'); -$ti-icon-unlink: unicode('eb46'); -$ti-icon-upload: unicode('eb47'); -$ti-icon-urgent: unicode('eb48'); -$ti-icon-usb: unicode('f00c'); -$ti-icon-user: unicode('eb4d'); -$ti-icon-user-bolt: unicode('f9d1'); -$ti-icon-user-cancel: unicode('f9d2'); -$ti-icon-user-check: unicode('eb49'); -$ti-icon-user-circle: unicode('ef68'); -$ti-icon-user-code: unicode('f9d3'); -$ti-icon-user-cog: unicode('f9d4'); -$ti-icon-user-dollar: unicode('f9d5'); -$ti-icon-user-down: unicode('f9d6'); -$ti-icon-user-edit: unicode('f7cc'); -$ti-icon-user-exclamation: unicode('ec12'); -$ti-icon-user-heart: unicode('f7cd'); -$ti-icon-user-minus: unicode('eb4a'); -$ti-icon-user-off: unicode('ecf9'); -$ti-icon-user-pause: unicode('f9d7'); -$ti-icon-user-pin: unicode('f7ce'); -$ti-icon-user-plus: unicode('eb4b'); -$ti-icon-user-question: unicode('f7cf'); -$ti-icon-user-search: unicode('ef89'); -$ti-icon-user-share: unicode('f9d8'); -$ti-icon-user-shield: unicode('f7d0'); -$ti-icon-user-star: unicode('f7d1'); -$ti-icon-user-up: unicode('f7d2'); -$ti-icon-user-x: unicode('eb4c'); -$ti-icon-users: unicode('ebf2'); -$ti-icon-uv-index: unicode('f3b2'); -$ti-icon-ux-circle: unicode('f369'); -$ti-icon-vaccine: unicode('ef04'); -$ti-icon-vaccine-bottle: unicode('ef69'); -$ti-icon-vaccine-bottle-off: unicode('f439'); -$ti-icon-vaccine-off: unicode('f1bc'); -$ti-icon-vacuum-cleaner: unicode('f5e6'); -$ti-icon-variable: unicode('ef05'); -$ti-icon-variable-minus: unicode('f36a'); -$ti-icon-variable-off: unicode('f1bd'); -$ti-icon-variable-plus: unicode('f36b'); -$ti-icon-vector: unicode('eca9'); -$ti-icon-vector-bezier: unicode('ef1d'); -$ti-icon-vector-bezier-2: unicode('f1a3'); -$ti-icon-vector-bezier-arc: unicode('f4cd'); -$ti-icon-vector-bezier-circle: unicode('f4ce'); -$ti-icon-vector-off: unicode('f1be'); -$ti-icon-vector-spline: unicode('f565'); -$ti-icon-vector-triangle: unicode('eca8'); -$ti-icon-vector-triangle-off: unicode('f1bf'); -$ti-icon-venus: unicode('ec86'); -$ti-icon-versions: unicode('ed52'); -$ti-icon-versions-filled: unicode('f6b1'); -$ti-icon-versions-off: unicode('f1c0'); -$ti-icon-video: unicode('ed22'); -$ti-icon-video-minus: unicode('ed1f'); -$ti-icon-video-off: unicode('ed20'); -$ti-icon-video-plus: unicode('ed21'); -$ti-icon-view-360: unicode('ed84'); -$ti-icon-view-360-off: unicode('f1c1'); -$ti-icon-viewfinder: unicode('eb4e'); -$ti-icon-viewfinder-off: unicode('f1c2'); -$ti-icon-viewport-narrow: unicode('ebf3'); -$ti-icon-viewport-wide: unicode('ebf4'); -$ti-icon-vinyl: unicode('f00d'); -$ti-icon-vip: unicode('f3b3'); -$ti-icon-vip-off: unicode('f43a'); -$ti-icon-virus: unicode('eb74'); -$ti-icon-virus-off: unicode('ed66'); -$ti-icon-virus-search: unicode('ed67'); -$ti-icon-vocabulary: unicode('ef1e'); -$ti-icon-vocabulary-off: unicode('f43b'); -$ti-icon-volcano: unicode('f79c'); -$ti-icon-volume: unicode('eb51'); -$ti-icon-volume-2: unicode('eb4f'); -$ti-icon-volume-3: unicode('eb50'); -$ti-icon-volume-off: unicode('f1c3'); -$ti-icon-walk: unicode('ec87'); -$ti-icon-wall: unicode('ef7a'); -$ti-icon-wall-off: unicode('f43c'); -$ti-icon-wallet: unicode('eb75'); -$ti-icon-wallet-off: unicode('f1c4'); -$ti-icon-wallpaper: unicode('ef56'); -$ti-icon-wallpaper-off: unicode('f1c5'); -$ti-icon-wand: unicode('ebcb'); -$ti-icon-wand-off: unicode('f1c6'); -$ti-icon-wash: unicode('f311'); -$ti-icon-wash-dry: unicode('f304'); -$ti-icon-wash-dry-1: unicode('f2fa'); -$ti-icon-wash-dry-2: unicode('f2fb'); -$ti-icon-wash-dry-3: unicode('f2fc'); -$ti-icon-wash-dry-a: unicode('f2fd'); -$ti-icon-wash-dry-dip: unicode('f2fe'); -$ti-icon-wash-dry-f: unicode('f2ff'); -$ti-icon-wash-dry-hang: unicode('f300'); -$ti-icon-wash-dry-off: unicode('f301'); -$ti-icon-wash-dry-p: unicode('f302'); -$ti-icon-wash-dry-shade: unicode('f303'); -$ti-icon-wash-dry-w: unicode('f322'); -$ti-icon-wash-dryclean: unicode('f305'); -$ti-icon-wash-dryclean-off: unicode('f323'); -$ti-icon-wash-gentle: unicode('f306'); -$ti-icon-wash-machine: unicode('f25e'); -$ti-icon-wash-off: unicode('f307'); -$ti-icon-wash-press: unicode('f308'); -$ti-icon-wash-temperature-1: unicode('f309'); -$ti-icon-wash-temperature-2: unicode('f30a'); -$ti-icon-wash-temperature-3: unicode('f30b'); -$ti-icon-wash-temperature-4: unicode('f30c'); -$ti-icon-wash-temperature-5: unicode('f30d'); -$ti-icon-wash-temperature-6: unicode('f30e'); -$ti-icon-wash-tumble-dry: unicode('f30f'); -$ti-icon-wash-tumble-off: unicode('f310'); -$ti-icon-wave-saw-tool: unicode('ecd3'); -$ti-icon-wave-sine: unicode('ecd4'); -$ti-icon-wave-square: unicode('ecd5'); -$ti-icon-webhook: unicode('f01e'); -$ti-icon-webhook-off: unicode('f43d'); -$ti-icon-weight: unicode('f589'); -$ti-icon-wheelchair: unicode('f1db'); -$ti-icon-wheelchair-off: unicode('f43e'); -$ti-icon-whirl: unicode('f51d'); -$ti-icon-wifi: unicode('eb52'); -$ti-icon-wifi-0: unicode('eba3'); -$ti-icon-wifi-1: unicode('eba4'); -$ti-icon-wifi-2: unicode('eba5'); -$ti-icon-wifi-off: unicode('ecfa'); -$ti-icon-wind: unicode('ec34'); -$ti-icon-wind-off: unicode('f1c7'); -$ti-icon-windmill: unicode('ed85'); -$ti-icon-windmill-filled: unicode('f6b2'); -$ti-icon-windmill-off: unicode('f1c8'); -$ti-icon-window: unicode('ef06'); -$ti-icon-window-maximize: unicode('f1f1'); -$ti-icon-window-minimize: unicode('f1f2'); -$ti-icon-window-off: unicode('f1c9'); -$ti-icon-windsock: unicode('f06d'); -$ti-icon-wiper: unicode('ecab'); -$ti-icon-wiper-wash: unicode('ecaa'); -$ti-icon-woman: unicode('eb53'); -$ti-icon-wood: unicode('f359'); -$ti-icon-world: unicode('eb54'); -$ti-icon-world-bolt: unicode('f9d9'); -$ti-icon-world-cancel: unicode('f9da'); -$ti-icon-world-check: unicode('f9db'); -$ti-icon-world-code: unicode('f9dc'); -$ti-icon-world-cog: unicode('f9dd'); -$ti-icon-world-dollar: unicode('f9de'); -$ti-icon-world-down: unicode('f9df'); -$ti-icon-world-download: unicode('ef8a'); -$ti-icon-world-exclamation: unicode('f9e0'); -$ti-icon-world-heart: unicode('f9e1'); -$ti-icon-world-latitude: unicode('ed2e'); -$ti-icon-world-longitude: unicode('ed2f'); -$ti-icon-world-minus: unicode('f9e2'); -$ti-icon-world-off: unicode('f1ca'); -$ti-icon-world-pause: unicode('f9e3'); -$ti-icon-world-pin: unicode('f9e4'); -$ti-icon-world-plus: unicode('f9e5'); -$ti-icon-world-question: unicode('f9e6'); -$ti-icon-world-search: unicode('f9e7'); -$ti-icon-world-share: unicode('f9e8'); -$ti-icon-world-star: unicode('f9e9'); -$ti-icon-world-up: unicode('f9ea'); -$ti-icon-world-upload: unicode('ef8b'); -$ti-icon-world-www: unicode('f38f'); -$ti-icon-world-x: unicode('f9eb'); -$ti-icon-wrecking-ball: unicode('ed97'); -$ti-icon-writing: unicode('ef08'); -$ti-icon-writing-off: unicode('f1cb'); -$ti-icon-writing-sign: unicode('ef07'); -$ti-icon-writing-sign-off: unicode('f1cc'); -$ti-icon-x: unicode('eb55'); -$ti-icon-xbox-a: unicode('f2b6'); -$ti-icon-xbox-b: unicode('f2b7'); -$ti-icon-xbox-x: unicode('f2b8'); -$ti-icon-xbox-y: unicode('f2b9'); -$ti-icon-yin-yang: unicode('ec35'); -$ti-icon-yin-yang-filled: unicode('f785'); -$ti-icon-yoga: unicode('f01f'); -$ti-icon-zeppelin: unicode('f270'); -$ti-icon-zeppelin-off: unicode('f43f'); -$ti-icon-zip: unicode('f3b4'); -$ti-icon-zodiac-aquarius: unicode('ecac'); -$ti-icon-zodiac-aries: unicode('ecad'); -$ti-icon-zodiac-cancer: unicode('ecae'); -$ti-icon-zodiac-capricorn: unicode('ecaf'); -$ti-icon-zodiac-gemini: unicode('ecb0'); -$ti-icon-zodiac-leo: unicode('ecb1'); -$ti-icon-zodiac-libra: unicode('ecb2'); -$ti-icon-zodiac-pisces: unicode('ecb3'); -$ti-icon-zodiac-sagittarius: unicode('ecb4'); -$ti-icon-zodiac-scorpio: unicode('ecb5'); -$ti-icon-zodiac-taurus: unicode('ecb6'); -$ti-icon-zodiac-virgo: unicode('ecb7'); -$ti-icon-zoom-cancel: unicode('ec4d'); -$ti-icon-zoom-check: unicode('ef09'); -$ti-icon-zoom-check-filled: unicode('f786'); -$ti-icon-zoom-code: unicode('f07f'); -$ti-icon-zoom-exclamation: unicode('f080'); -$ti-icon-zoom-filled: unicode('f787'); -$ti-icon-zoom-in: unicode('eb56'); -$ti-icon-zoom-in-area: unicode('f1dc'); -$ti-icon-zoom-in-area-filled: unicode('f788'); -$ti-icon-zoom-in-filled: unicode('f789'); -$ti-icon-zoom-money: unicode('ef0a'); -$ti-icon-zoom-out: unicode('eb57'); -$ti-icon-zoom-out-area: unicode('f1dd'); -$ti-icon-zoom-out-filled: unicode('f78a'); -$ti-icon-zoom-pan: unicode('f1de'); -$ti-icon-zoom-question: unicode('edeb'); -$ti-icon-zoom-replace: unicode('f2a7'); -$ti-icon-zoom-reset: unicode('f295'); -$ti-icon-zzz: unicode('f228'); -$ti-icon-zzz-off: unicode('f440'); - - -.#{$ti-prefix}-123:before { content: $ti-icon-123; } -.#{$ti-prefix}-24-hours:before { content: $ti-icon-24-hours; } -.#{$ti-prefix}-2fa:before { content: $ti-icon-2fa; } -.#{$ti-prefix}-360:before { content: $ti-icon-360; } -.#{$ti-prefix}-360-view:before { content: $ti-icon-360-view; } -.#{$ti-prefix}-3d-cube-sphere:before { content: $ti-icon-3d-cube-sphere; } -.#{$ti-prefix}-3d-cube-sphere-off:before { content: $ti-icon-3d-cube-sphere-off; } -.#{$ti-prefix}-3d-rotate:before { content: $ti-icon-3d-rotate; } -.#{$ti-prefix}-a-b:before { content: $ti-icon-a-b; } -.#{$ti-prefix}-a-b-2:before { content: $ti-icon-a-b-2; } -.#{$ti-prefix}-a-b-off:before { content: $ti-icon-a-b-off; } -.#{$ti-prefix}-abacus:before { content: $ti-icon-abacus; } -.#{$ti-prefix}-abacus-off:before { content: $ti-icon-abacus-off; } -.#{$ti-prefix}-abc:before { content: $ti-icon-abc; } -.#{$ti-prefix}-access-point:before { content: $ti-icon-access-point; } -.#{$ti-prefix}-access-point-off:before { content: $ti-icon-access-point-off; } -.#{$ti-prefix}-accessible:before { content: $ti-icon-accessible; } -.#{$ti-prefix}-accessible-off:before { content: $ti-icon-accessible-off; } -.#{$ti-prefix}-accessible-off-filled:before { content: $ti-icon-accessible-off-filled; } -.#{$ti-prefix}-activity:before { content: $ti-icon-activity; } -.#{$ti-prefix}-activity-heartbeat:before { content: $ti-icon-activity-heartbeat; } -.#{$ti-prefix}-ad:before { content: $ti-icon-ad; } -.#{$ti-prefix}-ad-2:before { content: $ti-icon-ad-2; } -.#{$ti-prefix}-ad-circle:before { content: $ti-icon-ad-circle; } -.#{$ti-prefix}-ad-circle-filled:before { content: $ti-icon-ad-circle-filled; } -.#{$ti-prefix}-ad-circle-off:before { content: $ti-icon-ad-circle-off; } -.#{$ti-prefix}-ad-filled:before { content: $ti-icon-ad-filled; } -.#{$ti-prefix}-ad-off:before { content: $ti-icon-ad-off; } -.#{$ti-prefix}-address-book:before { content: $ti-icon-address-book; } -.#{$ti-prefix}-address-book-off:before { content: $ti-icon-address-book-off; } -.#{$ti-prefix}-adjustments:before { content: $ti-icon-adjustments; } -.#{$ti-prefix}-adjustments-alt:before { content: $ti-icon-adjustments-alt; } -.#{$ti-prefix}-adjustments-bolt:before { content: $ti-icon-adjustments-bolt; } -.#{$ti-prefix}-adjustments-cancel:before { content: $ti-icon-adjustments-cancel; } -.#{$ti-prefix}-adjustments-check:before { content: $ti-icon-adjustments-check; } -.#{$ti-prefix}-adjustments-code:before { content: $ti-icon-adjustments-code; } -.#{$ti-prefix}-adjustments-cog:before { content: $ti-icon-adjustments-cog; } -.#{$ti-prefix}-adjustments-dollar:before { content: $ti-icon-adjustments-dollar; } -.#{$ti-prefix}-adjustments-down:before { content: $ti-icon-adjustments-down; } -.#{$ti-prefix}-adjustments-exclamation:before { content: $ti-icon-adjustments-exclamation; } -.#{$ti-prefix}-adjustments-filled:before { content: $ti-icon-adjustments-filled; } -.#{$ti-prefix}-adjustments-heart:before { content: $ti-icon-adjustments-heart; } -.#{$ti-prefix}-adjustments-horizontal:before { content: $ti-icon-adjustments-horizontal; } -.#{$ti-prefix}-adjustments-minus:before { content: $ti-icon-adjustments-minus; } -.#{$ti-prefix}-adjustments-off:before { content: $ti-icon-adjustments-off; } -.#{$ti-prefix}-adjustments-pause:before { content: $ti-icon-adjustments-pause; } -.#{$ti-prefix}-adjustments-pin:before { content: $ti-icon-adjustments-pin; } -.#{$ti-prefix}-adjustments-plus:before { content: $ti-icon-adjustments-plus; } -.#{$ti-prefix}-adjustments-question:before { content: $ti-icon-adjustments-question; } -.#{$ti-prefix}-adjustments-search:before { content: $ti-icon-adjustments-search; } -.#{$ti-prefix}-adjustments-share:before { content: $ti-icon-adjustments-share; } -.#{$ti-prefix}-adjustments-star:before { content: $ti-icon-adjustments-star; } -.#{$ti-prefix}-adjustments-up:before { content: $ti-icon-adjustments-up; } -.#{$ti-prefix}-adjustments-x:before { content: $ti-icon-adjustments-x; } -.#{$ti-prefix}-aerial-lift:before { content: $ti-icon-aerial-lift; } -.#{$ti-prefix}-affiliate:before { content: $ti-icon-affiliate; } -.#{$ti-prefix}-affiliate-filled:before { content: $ti-icon-affiliate-filled; } -.#{$ti-prefix}-air-balloon:before { content: $ti-icon-air-balloon; } -.#{$ti-prefix}-air-conditioning:before { content: $ti-icon-air-conditioning; } -.#{$ti-prefix}-air-conditioning-disabled:before { content: $ti-icon-air-conditioning-disabled; } -.#{$ti-prefix}-alarm:before { content: $ti-icon-alarm; } -.#{$ti-prefix}-alarm-filled:before { content: $ti-icon-alarm-filled; } -.#{$ti-prefix}-alarm-minus:before { content: $ti-icon-alarm-minus; } -.#{$ti-prefix}-alarm-minus-filled:before { content: $ti-icon-alarm-minus-filled; } -.#{$ti-prefix}-alarm-off:before { content: $ti-icon-alarm-off; } -.#{$ti-prefix}-alarm-plus:before { content: $ti-icon-alarm-plus; } -.#{$ti-prefix}-alarm-plus-filled:before { content: $ti-icon-alarm-plus-filled; } -.#{$ti-prefix}-alarm-snooze:before { content: $ti-icon-alarm-snooze; } -.#{$ti-prefix}-alarm-snooze-filled:before { content: $ti-icon-alarm-snooze-filled; } -.#{$ti-prefix}-album:before { content: $ti-icon-album; } -.#{$ti-prefix}-album-off:before { content: $ti-icon-album-off; } -.#{$ti-prefix}-alert-circle:before { content: $ti-icon-alert-circle; } -.#{$ti-prefix}-alert-circle-filled:before { content: $ti-icon-alert-circle-filled; } -.#{$ti-prefix}-alert-hexagon:before { content: $ti-icon-alert-hexagon; } -.#{$ti-prefix}-alert-octagon:before { content: $ti-icon-alert-octagon; } -.#{$ti-prefix}-alert-octagon-filled:before { content: $ti-icon-alert-octagon-filled; } -.#{$ti-prefix}-alert-small:before { content: $ti-icon-alert-small; } -.#{$ti-prefix}-alert-square:before { content: $ti-icon-alert-square; } -.#{$ti-prefix}-alert-square-rounded:before { content: $ti-icon-alert-square-rounded; } -.#{$ti-prefix}-alert-triangle:before { content: $ti-icon-alert-triangle; } -.#{$ti-prefix}-alert-triangle-filled:before { content: $ti-icon-alert-triangle-filled; } -.#{$ti-prefix}-alien:before { content: $ti-icon-alien; } -.#{$ti-prefix}-alien-filled:before { content: $ti-icon-alien-filled; } -.#{$ti-prefix}-align-box-bottom-center:before { content: $ti-icon-align-box-bottom-center; } -.#{$ti-prefix}-align-box-bottom-center-filled:before { content: $ti-icon-align-box-bottom-center-filled; } -.#{$ti-prefix}-align-box-bottom-left:before { content: $ti-icon-align-box-bottom-left; } -.#{$ti-prefix}-align-box-bottom-left-filled:before { content: $ti-icon-align-box-bottom-left-filled; } -.#{$ti-prefix}-align-box-bottom-right:before { content: $ti-icon-align-box-bottom-right; } -.#{$ti-prefix}-align-box-bottom-right-filled:before { content: $ti-icon-align-box-bottom-right-filled; } -.#{$ti-prefix}-align-box-center-middle:before { content: $ti-icon-align-box-center-middle; } -.#{$ti-prefix}-align-box-center-middle-filled:before { content: $ti-icon-align-box-center-middle-filled; } -.#{$ti-prefix}-align-box-left-bottom:before { content: $ti-icon-align-box-left-bottom; } -.#{$ti-prefix}-align-box-left-bottom-filled:before { content: $ti-icon-align-box-left-bottom-filled; } -.#{$ti-prefix}-align-box-left-middle:before { content: $ti-icon-align-box-left-middle; } -.#{$ti-prefix}-align-box-left-middle-filled:before { content: $ti-icon-align-box-left-middle-filled; } -.#{$ti-prefix}-align-box-left-top:before { content: $ti-icon-align-box-left-top; } -.#{$ti-prefix}-align-box-left-top-filled:before { content: $ti-icon-align-box-left-top-filled; } -.#{$ti-prefix}-align-box-right-bottom:before { content: $ti-icon-align-box-right-bottom; } -.#{$ti-prefix}-align-box-right-bottom-filled:before { content: $ti-icon-align-box-right-bottom-filled; } -.#{$ti-prefix}-align-box-right-middle:before { content: $ti-icon-align-box-right-middle; } -.#{$ti-prefix}-align-box-right-middle-filled:before { content: $ti-icon-align-box-right-middle-filled; } -.#{$ti-prefix}-align-box-right-top:before { content: $ti-icon-align-box-right-top; } -.#{$ti-prefix}-align-box-right-top-filled:before { content: $ti-icon-align-box-right-top-filled; } -.#{$ti-prefix}-align-box-top-center:before { content: $ti-icon-align-box-top-center; } -.#{$ti-prefix}-align-box-top-center-filled:before { content: $ti-icon-align-box-top-center-filled; } -.#{$ti-prefix}-align-box-top-left:before { content: $ti-icon-align-box-top-left; } -.#{$ti-prefix}-align-box-top-left-filled:before { content: $ti-icon-align-box-top-left-filled; } -.#{$ti-prefix}-align-box-top-right:before { content: $ti-icon-align-box-top-right; } -.#{$ti-prefix}-align-box-top-right-filled:before { content: $ti-icon-align-box-top-right-filled; } -.#{$ti-prefix}-align-center:before { content: $ti-icon-align-center; } -.#{$ti-prefix}-align-justified:before { content: $ti-icon-align-justified; } -.#{$ti-prefix}-align-left:before { content: $ti-icon-align-left; } -.#{$ti-prefix}-align-right:before { content: $ti-icon-align-right; } -.#{$ti-prefix}-alpha:before { content: $ti-icon-alpha; } -.#{$ti-prefix}-alphabet-cyrillic:before { content: $ti-icon-alphabet-cyrillic; } -.#{$ti-prefix}-alphabet-greek:before { content: $ti-icon-alphabet-greek; } -.#{$ti-prefix}-alphabet-latin:before { content: $ti-icon-alphabet-latin; } -.#{$ti-prefix}-ambulance:before { content: $ti-icon-ambulance; } -.#{$ti-prefix}-ampersand:before { content: $ti-icon-ampersand; } -.#{$ti-prefix}-analyze:before { content: $ti-icon-analyze; } -.#{$ti-prefix}-analyze-filled:before { content: $ti-icon-analyze-filled; } -.#{$ti-prefix}-analyze-off:before { content: $ti-icon-analyze-off; } -.#{$ti-prefix}-anchor:before { content: $ti-icon-anchor; } -.#{$ti-prefix}-anchor-off:before { content: $ti-icon-anchor-off; } -.#{$ti-prefix}-angle:before { content: $ti-icon-angle; } -.#{$ti-prefix}-ankh:before { content: $ti-icon-ankh; } -.#{$ti-prefix}-antenna:before { content: $ti-icon-antenna; } -.#{$ti-prefix}-antenna-bars-1:before { content: $ti-icon-antenna-bars-1; } -.#{$ti-prefix}-antenna-bars-2:before { content: $ti-icon-antenna-bars-2; } -.#{$ti-prefix}-antenna-bars-3:before { content: $ti-icon-antenna-bars-3; } -.#{$ti-prefix}-antenna-bars-4:before { content: $ti-icon-antenna-bars-4; } -.#{$ti-prefix}-antenna-bars-5:before { content: $ti-icon-antenna-bars-5; } -.#{$ti-prefix}-antenna-bars-off:before { content: $ti-icon-antenna-bars-off; } -.#{$ti-prefix}-antenna-off:before { content: $ti-icon-antenna-off; } -.#{$ti-prefix}-aperture:before { content: $ti-icon-aperture; } -.#{$ti-prefix}-aperture-off:before { content: $ti-icon-aperture-off; } -.#{$ti-prefix}-api:before { content: $ti-icon-api; } -.#{$ti-prefix}-api-app:before { content: $ti-icon-api-app; } -.#{$ti-prefix}-api-app-off:before { content: $ti-icon-api-app-off; } -.#{$ti-prefix}-api-off:before { content: $ti-icon-api-off; } -.#{$ti-prefix}-app-window:before { content: $ti-icon-app-window; } -.#{$ti-prefix}-app-window-filled:before { content: $ti-icon-app-window-filled; } -.#{$ti-prefix}-apple:before { content: $ti-icon-apple; } -.#{$ti-prefix}-apps:before { content: $ti-icon-apps; } -.#{$ti-prefix}-apps-filled:before { content: $ti-icon-apps-filled; } -.#{$ti-prefix}-apps-off:before { content: $ti-icon-apps-off; } -.#{$ti-prefix}-archive:before { content: $ti-icon-archive; } -.#{$ti-prefix}-archive-off:before { content: $ti-icon-archive-off; } -.#{$ti-prefix}-armchair:before { content: $ti-icon-armchair; } -.#{$ti-prefix}-armchair-2:before { content: $ti-icon-armchair-2; } -.#{$ti-prefix}-armchair-2-off:before { content: $ti-icon-armchair-2-off; } -.#{$ti-prefix}-armchair-off:before { content: $ti-icon-armchair-off; } -.#{$ti-prefix}-arrow-autofit-content:before { content: $ti-icon-arrow-autofit-content; } -.#{$ti-prefix}-arrow-autofit-content-filled:before { content: $ti-icon-arrow-autofit-content-filled; } -.#{$ti-prefix}-arrow-autofit-down:before { content: $ti-icon-arrow-autofit-down; } -.#{$ti-prefix}-arrow-autofit-height:before { content: $ti-icon-arrow-autofit-height; } -.#{$ti-prefix}-arrow-autofit-left:before { content: $ti-icon-arrow-autofit-left; } -.#{$ti-prefix}-arrow-autofit-right:before { content: $ti-icon-arrow-autofit-right; } -.#{$ti-prefix}-arrow-autofit-up:before { content: $ti-icon-arrow-autofit-up; } -.#{$ti-prefix}-arrow-autofit-width:before { content: $ti-icon-arrow-autofit-width; } -.#{$ti-prefix}-arrow-back:before { content: $ti-icon-arrow-back; } -.#{$ti-prefix}-arrow-back-up:before { content: $ti-icon-arrow-back-up; } -.#{$ti-prefix}-arrow-back-up-double:before { content: $ti-icon-arrow-back-up-double; } -.#{$ti-prefix}-arrow-badge-down:before { content: $ti-icon-arrow-badge-down; } -.#{$ti-prefix}-arrow-badge-down-filled:before { content: $ti-icon-arrow-badge-down-filled; } -.#{$ti-prefix}-arrow-badge-left:before { content: $ti-icon-arrow-badge-left; } -.#{$ti-prefix}-arrow-badge-left-filled:before { content: $ti-icon-arrow-badge-left-filled; } -.#{$ti-prefix}-arrow-badge-right:before { content: $ti-icon-arrow-badge-right; } -.#{$ti-prefix}-arrow-badge-right-filled:before { content: $ti-icon-arrow-badge-right-filled; } -.#{$ti-prefix}-arrow-badge-up:before { content: $ti-icon-arrow-badge-up; } -.#{$ti-prefix}-arrow-badge-up-filled:before { content: $ti-icon-arrow-badge-up-filled; } -.#{$ti-prefix}-arrow-bar-down:before { content: $ti-icon-arrow-bar-down; } -.#{$ti-prefix}-arrow-bar-left:before { content: $ti-icon-arrow-bar-left; } -.#{$ti-prefix}-arrow-bar-right:before { content: $ti-icon-arrow-bar-right; } -.#{$ti-prefix}-arrow-bar-to-down:before { content: $ti-icon-arrow-bar-to-down; } -.#{$ti-prefix}-arrow-bar-to-left:before { content: $ti-icon-arrow-bar-to-left; } -.#{$ti-prefix}-arrow-bar-to-right:before { content: $ti-icon-arrow-bar-to-right; } -.#{$ti-prefix}-arrow-bar-to-up:before { content: $ti-icon-arrow-bar-to-up; } -.#{$ti-prefix}-arrow-bar-up:before { content: $ti-icon-arrow-bar-up; } -.#{$ti-prefix}-arrow-bear-left:before { content: $ti-icon-arrow-bear-left; } -.#{$ti-prefix}-arrow-bear-left-2:before { content: $ti-icon-arrow-bear-left-2; } -.#{$ti-prefix}-arrow-bear-right:before { content: $ti-icon-arrow-bear-right; } -.#{$ti-prefix}-arrow-bear-right-2:before { content: $ti-icon-arrow-bear-right-2; } -.#{$ti-prefix}-arrow-big-down:before { content: $ti-icon-arrow-big-down; } -.#{$ti-prefix}-arrow-big-down-filled:before { content: $ti-icon-arrow-big-down-filled; } -.#{$ti-prefix}-arrow-big-down-line:before { content: $ti-icon-arrow-big-down-line; } -.#{$ti-prefix}-arrow-big-down-line-filled:before { content: $ti-icon-arrow-big-down-line-filled; } -.#{$ti-prefix}-arrow-big-down-lines:before { content: $ti-icon-arrow-big-down-lines; } -.#{$ti-prefix}-arrow-big-down-lines-filled:before { content: $ti-icon-arrow-big-down-lines-filled; } -.#{$ti-prefix}-arrow-big-left:before { content: $ti-icon-arrow-big-left; } -.#{$ti-prefix}-arrow-big-left-filled:before { content: $ti-icon-arrow-big-left-filled; } -.#{$ti-prefix}-arrow-big-left-line:before { content: $ti-icon-arrow-big-left-line; } -.#{$ti-prefix}-arrow-big-left-line-filled:before { content: $ti-icon-arrow-big-left-line-filled; } -.#{$ti-prefix}-arrow-big-left-lines:before { content: $ti-icon-arrow-big-left-lines; } -.#{$ti-prefix}-arrow-big-left-lines-filled:before { content: $ti-icon-arrow-big-left-lines-filled; } -.#{$ti-prefix}-arrow-big-right:before { content: $ti-icon-arrow-big-right; } -.#{$ti-prefix}-arrow-big-right-filled:before { content: $ti-icon-arrow-big-right-filled; } -.#{$ti-prefix}-arrow-big-right-line:before { content: $ti-icon-arrow-big-right-line; } -.#{$ti-prefix}-arrow-big-right-line-filled:before { content: $ti-icon-arrow-big-right-line-filled; } -.#{$ti-prefix}-arrow-big-right-lines:before { content: $ti-icon-arrow-big-right-lines; } -.#{$ti-prefix}-arrow-big-right-lines-filled:before { content: $ti-icon-arrow-big-right-lines-filled; } -.#{$ti-prefix}-arrow-big-up:before { content: $ti-icon-arrow-big-up; } -.#{$ti-prefix}-arrow-big-up-filled:before { content: $ti-icon-arrow-big-up-filled; } -.#{$ti-prefix}-arrow-big-up-line:before { content: $ti-icon-arrow-big-up-line; } -.#{$ti-prefix}-arrow-big-up-line-filled:before { content: $ti-icon-arrow-big-up-line-filled; } -.#{$ti-prefix}-arrow-big-up-lines:before { content: $ti-icon-arrow-big-up-lines; } -.#{$ti-prefix}-arrow-big-up-lines-filled:before { content: $ti-icon-arrow-big-up-lines-filled; } -.#{$ti-prefix}-arrow-bounce:before { content: $ti-icon-arrow-bounce; } -.#{$ti-prefix}-arrow-curve-left:before { content: $ti-icon-arrow-curve-left; } -.#{$ti-prefix}-arrow-curve-right:before { content: $ti-icon-arrow-curve-right; } -.#{$ti-prefix}-arrow-down:before { content: $ti-icon-arrow-down; } -.#{$ti-prefix}-arrow-down-bar:before { content: $ti-icon-arrow-down-bar; } -.#{$ti-prefix}-arrow-down-circle:before { content: $ti-icon-arrow-down-circle; } -.#{$ti-prefix}-arrow-down-left:before { content: $ti-icon-arrow-down-left; } -.#{$ti-prefix}-arrow-down-left-circle:before { content: $ti-icon-arrow-down-left-circle; } -.#{$ti-prefix}-arrow-down-rhombus:before { content: $ti-icon-arrow-down-rhombus; } -.#{$ti-prefix}-arrow-down-right:before { content: $ti-icon-arrow-down-right; } -.#{$ti-prefix}-arrow-down-right-circle:before { content: $ti-icon-arrow-down-right-circle; } -.#{$ti-prefix}-arrow-down-square:before { content: $ti-icon-arrow-down-square; } -.#{$ti-prefix}-arrow-down-tail:before { content: $ti-icon-arrow-down-tail; } -.#{$ti-prefix}-arrow-elbow-left:before { content: $ti-icon-arrow-elbow-left; } -.#{$ti-prefix}-arrow-elbow-right:before { content: $ti-icon-arrow-elbow-right; } -.#{$ti-prefix}-arrow-fork:before { content: $ti-icon-arrow-fork; } -.#{$ti-prefix}-arrow-forward:before { content: $ti-icon-arrow-forward; } -.#{$ti-prefix}-arrow-forward-up:before { content: $ti-icon-arrow-forward-up; } -.#{$ti-prefix}-arrow-forward-up-double:before { content: $ti-icon-arrow-forward-up-double; } -.#{$ti-prefix}-arrow-guide:before { content: $ti-icon-arrow-guide; } -.#{$ti-prefix}-arrow-iteration:before { content: $ti-icon-arrow-iteration; } -.#{$ti-prefix}-arrow-left:before { content: $ti-icon-arrow-left; } -.#{$ti-prefix}-arrow-left-bar:before { content: $ti-icon-arrow-left-bar; } -.#{$ti-prefix}-arrow-left-circle:before { content: $ti-icon-arrow-left-circle; } -.#{$ti-prefix}-arrow-left-rhombus:before { content: $ti-icon-arrow-left-rhombus; } -.#{$ti-prefix}-arrow-left-right:before { content: $ti-icon-arrow-left-right; } -.#{$ti-prefix}-arrow-left-square:before { content: $ti-icon-arrow-left-square; } -.#{$ti-prefix}-arrow-left-tail:before { content: $ti-icon-arrow-left-tail; } -.#{$ti-prefix}-arrow-loop-left:before { content: $ti-icon-arrow-loop-left; } -.#{$ti-prefix}-arrow-loop-left-2:before { content: $ti-icon-arrow-loop-left-2; } -.#{$ti-prefix}-arrow-loop-right:before { content: $ti-icon-arrow-loop-right; } -.#{$ti-prefix}-arrow-loop-right-2:before { content: $ti-icon-arrow-loop-right-2; } -.#{$ti-prefix}-arrow-merge:before { content: $ti-icon-arrow-merge; } -.#{$ti-prefix}-arrow-merge-both:before { content: $ti-icon-arrow-merge-both; } -.#{$ti-prefix}-arrow-merge-left:before { content: $ti-icon-arrow-merge-left; } -.#{$ti-prefix}-arrow-merge-right:before { content: $ti-icon-arrow-merge-right; } -.#{$ti-prefix}-arrow-move-down:before { content: $ti-icon-arrow-move-down; } -.#{$ti-prefix}-arrow-move-left:before { content: $ti-icon-arrow-move-left; } -.#{$ti-prefix}-arrow-move-right:before { content: $ti-icon-arrow-move-right; } -.#{$ti-prefix}-arrow-move-up:before { content: $ti-icon-arrow-move-up; } -.#{$ti-prefix}-arrow-narrow-down:before { content: $ti-icon-arrow-narrow-down; } -.#{$ti-prefix}-arrow-narrow-left:before { content: $ti-icon-arrow-narrow-left; } -.#{$ti-prefix}-arrow-narrow-right:before { content: $ti-icon-arrow-narrow-right; } -.#{$ti-prefix}-arrow-narrow-up:before { content: $ti-icon-arrow-narrow-up; } -.#{$ti-prefix}-arrow-ramp-left:before { content: $ti-icon-arrow-ramp-left; } -.#{$ti-prefix}-arrow-ramp-left-2:before { content: $ti-icon-arrow-ramp-left-2; } -.#{$ti-prefix}-arrow-ramp-left-3:before { content: $ti-icon-arrow-ramp-left-3; } -.#{$ti-prefix}-arrow-ramp-right:before { content: $ti-icon-arrow-ramp-right; } -.#{$ti-prefix}-arrow-ramp-right-2:before { content: $ti-icon-arrow-ramp-right-2; } -.#{$ti-prefix}-arrow-ramp-right-3:before { content: $ti-icon-arrow-ramp-right-3; } -.#{$ti-prefix}-arrow-right:before { content: $ti-icon-arrow-right; } -.#{$ti-prefix}-arrow-right-bar:before { content: $ti-icon-arrow-right-bar; } -.#{$ti-prefix}-arrow-right-circle:before { content: $ti-icon-arrow-right-circle; } -.#{$ti-prefix}-arrow-right-rhombus:before { content: $ti-icon-arrow-right-rhombus; } -.#{$ti-prefix}-arrow-right-square:before { content: $ti-icon-arrow-right-square; } -.#{$ti-prefix}-arrow-right-tail:before { content: $ti-icon-arrow-right-tail; } -.#{$ti-prefix}-arrow-rotary-first-left:before { content: $ti-icon-arrow-rotary-first-left; } -.#{$ti-prefix}-arrow-rotary-first-right:before { content: $ti-icon-arrow-rotary-first-right; } -.#{$ti-prefix}-arrow-rotary-last-left:before { content: $ti-icon-arrow-rotary-last-left; } -.#{$ti-prefix}-arrow-rotary-last-right:before { content: $ti-icon-arrow-rotary-last-right; } -.#{$ti-prefix}-arrow-rotary-left:before { content: $ti-icon-arrow-rotary-left; } -.#{$ti-prefix}-arrow-rotary-right:before { content: $ti-icon-arrow-rotary-right; } -.#{$ti-prefix}-arrow-rotary-straight:before { content: $ti-icon-arrow-rotary-straight; } -.#{$ti-prefix}-arrow-roundabout-left:before { content: $ti-icon-arrow-roundabout-left; } -.#{$ti-prefix}-arrow-roundabout-right:before { content: $ti-icon-arrow-roundabout-right; } -.#{$ti-prefix}-arrow-sharp-turn-left:before { content: $ti-icon-arrow-sharp-turn-left; } -.#{$ti-prefix}-arrow-sharp-turn-right:before { content: $ti-icon-arrow-sharp-turn-right; } -.#{$ti-prefix}-arrow-up:before { content: $ti-icon-arrow-up; } -.#{$ti-prefix}-arrow-up-bar:before { content: $ti-icon-arrow-up-bar; } -.#{$ti-prefix}-arrow-up-circle:before { content: $ti-icon-arrow-up-circle; } -.#{$ti-prefix}-arrow-up-left:before { content: $ti-icon-arrow-up-left; } -.#{$ti-prefix}-arrow-up-left-circle:before { content: $ti-icon-arrow-up-left-circle; } -.#{$ti-prefix}-arrow-up-rhombus:before { content: $ti-icon-arrow-up-rhombus; } -.#{$ti-prefix}-arrow-up-right:before { content: $ti-icon-arrow-up-right; } -.#{$ti-prefix}-arrow-up-right-circle:before { content: $ti-icon-arrow-up-right-circle; } -.#{$ti-prefix}-arrow-up-square:before { content: $ti-icon-arrow-up-square; } -.#{$ti-prefix}-arrow-up-tail:before { content: $ti-icon-arrow-up-tail; } -.#{$ti-prefix}-arrow-wave-left-down:before { content: $ti-icon-arrow-wave-left-down; } -.#{$ti-prefix}-arrow-wave-left-up:before { content: $ti-icon-arrow-wave-left-up; } -.#{$ti-prefix}-arrow-wave-right-down:before { content: $ti-icon-arrow-wave-right-down; } -.#{$ti-prefix}-arrow-wave-right-up:before { content: $ti-icon-arrow-wave-right-up; } -.#{$ti-prefix}-arrow-zig-zag:before { content: $ti-icon-arrow-zig-zag; } -.#{$ti-prefix}-arrows-cross:before { content: $ti-icon-arrows-cross; } -.#{$ti-prefix}-arrows-diagonal:before { content: $ti-icon-arrows-diagonal; } -.#{$ti-prefix}-arrows-diagonal-2:before { content: $ti-icon-arrows-diagonal-2; } -.#{$ti-prefix}-arrows-diagonal-minimize:before { content: $ti-icon-arrows-diagonal-minimize; } -.#{$ti-prefix}-arrows-diagonal-minimize-2:before { content: $ti-icon-arrows-diagonal-minimize-2; } -.#{$ti-prefix}-arrows-diff:before { content: $ti-icon-arrows-diff; } -.#{$ti-prefix}-arrows-double-ne-sw:before { content: $ti-icon-arrows-double-ne-sw; } -.#{$ti-prefix}-arrows-double-nw-se:before { content: $ti-icon-arrows-double-nw-se; } -.#{$ti-prefix}-arrows-double-se-nw:before { content: $ti-icon-arrows-double-se-nw; } -.#{$ti-prefix}-arrows-double-sw-ne:before { content: $ti-icon-arrows-double-sw-ne; } -.#{$ti-prefix}-arrows-down:before { content: $ti-icon-arrows-down; } -.#{$ti-prefix}-arrows-down-up:before { content: $ti-icon-arrows-down-up; } -.#{$ti-prefix}-arrows-exchange:before { content: $ti-icon-arrows-exchange; } -.#{$ti-prefix}-arrows-exchange-2:before { content: $ti-icon-arrows-exchange-2; } -.#{$ti-prefix}-arrows-horizontal:before { content: $ti-icon-arrows-horizontal; } -.#{$ti-prefix}-arrows-join:before { content: $ti-icon-arrows-join; } -.#{$ti-prefix}-arrows-join-2:before { content: $ti-icon-arrows-join-2; } -.#{$ti-prefix}-arrows-left:before { content: $ti-icon-arrows-left; } -.#{$ti-prefix}-arrows-left-down:before { content: $ti-icon-arrows-left-down; } -.#{$ti-prefix}-arrows-left-right:before { content: $ti-icon-arrows-left-right; } -.#{$ti-prefix}-arrows-maximize:before { content: $ti-icon-arrows-maximize; } -.#{$ti-prefix}-arrows-minimize:before { content: $ti-icon-arrows-minimize; } -.#{$ti-prefix}-arrows-move:before { content: $ti-icon-arrows-move; } -.#{$ti-prefix}-arrows-move-horizontal:before { content: $ti-icon-arrows-move-horizontal; } -.#{$ti-prefix}-arrows-move-vertical:before { content: $ti-icon-arrows-move-vertical; } -.#{$ti-prefix}-arrows-random:before { content: $ti-icon-arrows-random; } -.#{$ti-prefix}-arrows-right:before { content: $ti-icon-arrows-right; } -.#{$ti-prefix}-arrows-right-down:before { content: $ti-icon-arrows-right-down; } -.#{$ti-prefix}-arrows-right-left:before { content: $ti-icon-arrows-right-left; } -.#{$ti-prefix}-arrows-shuffle:before { content: $ti-icon-arrows-shuffle; } -.#{$ti-prefix}-arrows-shuffle-2:before { content: $ti-icon-arrows-shuffle-2; } -.#{$ti-prefix}-arrows-sort:before { content: $ti-icon-arrows-sort; } -.#{$ti-prefix}-arrows-split:before { content: $ti-icon-arrows-split; } -.#{$ti-prefix}-arrows-split-2:before { content: $ti-icon-arrows-split-2; } -.#{$ti-prefix}-arrows-transfer-down:before { content: $ti-icon-arrows-transfer-down; } -.#{$ti-prefix}-arrows-transfer-up:before { content: $ti-icon-arrows-transfer-up; } -.#{$ti-prefix}-arrows-up:before { content: $ti-icon-arrows-up; } -.#{$ti-prefix}-arrows-up-down:before { content: $ti-icon-arrows-up-down; } -.#{$ti-prefix}-arrows-up-left:before { content: $ti-icon-arrows-up-left; } -.#{$ti-prefix}-arrows-up-right:before { content: $ti-icon-arrows-up-right; } -.#{$ti-prefix}-arrows-vertical:before { content: $ti-icon-arrows-vertical; } -.#{$ti-prefix}-artboard:before { content: $ti-icon-artboard; } -.#{$ti-prefix}-artboard-off:before { content: $ti-icon-artboard-off; } -.#{$ti-prefix}-article:before { content: $ti-icon-article; } -.#{$ti-prefix}-article-filled-filled:before { content: $ti-icon-article-filled-filled; } -.#{$ti-prefix}-article-off:before { content: $ti-icon-article-off; } -.#{$ti-prefix}-aspect-ratio:before { content: $ti-icon-aspect-ratio; } -.#{$ti-prefix}-aspect-ratio-filled:before { content: $ti-icon-aspect-ratio-filled; } -.#{$ti-prefix}-aspect-ratio-off:before { content: $ti-icon-aspect-ratio-off; } -.#{$ti-prefix}-assembly:before { content: $ti-icon-assembly; } -.#{$ti-prefix}-assembly-off:before { content: $ti-icon-assembly-off; } -.#{$ti-prefix}-asset:before { content: $ti-icon-asset; } -.#{$ti-prefix}-asterisk:before { content: $ti-icon-asterisk; } -.#{$ti-prefix}-asterisk-simple:before { content: $ti-icon-asterisk-simple; } -.#{$ti-prefix}-at:before { content: $ti-icon-at; } -.#{$ti-prefix}-at-off:before { content: $ti-icon-at-off; } -.#{$ti-prefix}-atom:before { content: $ti-icon-atom; } -.#{$ti-prefix}-atom-2:before { content: $ti-icon-atom-2; } -.#{$ti-prefix}-atom-2-filled:before { content: $ti-icon-atom-2-filled; } -.#{$ti-prefix}-atom-off:before { content: $ti-icon-atom-off; } -.#{$ti-prefix}-augmented-reality:before { content: $ti-icon-augmented-reality; } -.#{$ti-prefix}-augmented-reality-2:before { content: $ti-icon-augmented-reality-2; } -.#{$ti-prefix}-augmented-reality-off:before { content: $ti-icon-augmented-reality-off; } -.#{$ti-prefix}-award:before { content: $ti-icon-award; } -.#{$ti-prefix}-award-filled:before { content: $ti-icon-award-filled; } -.#{$ti-prefix}-award-off:before { content: $ti-icon-award-off; } -.#{$ti-prefix}-axe:before { content: $ti-icon-axe; } -.#{$ti-prefix}-axis-x:before { content: $ti-icon-axis-x; } -.#{$ti-prefix}-axis-y:before { content: $ti-icon-axis-y; } -.#{$ti-prefix}-baby-bottle:before { content: $ti-icon-baby-bottle; } -.#{$ti-prefix}-baby-carriage:before { content: $ti-icon-baby-carriage; } -.#{$ti-prefix}-backhoe:before { content: $ti-icon-backhoe; } -.#{$ti-prefix}-backpack:before { content: $ti-icon-backpack; } -.#{$ti-prefix}-backpack-off:before { content: $ti-icon-backpack-off; } -.#{$ti-prefix}-backspace:before { content: $ti-icon-backspace; } -.#{$ti-prefix}-backspace-filled:before { content: $ti-icon-backspace-filled; } -.#{$ti-prefix}-badge:before { content: $ti-icon-badge; } -.#{$ti-prefix}-badge-3d:before { content: $ti-icon-badge-3d; } -.#{$ti-prefix}-badge-4k:before { content: $ti-icon-badge-4k; } -.#{$ti-prefix}-badge-8k:before { content: $ti-icon-badge-8k; } -.#{$ti-prefix}-badge-ad:before { content: $ti-icon-badge-ad; } -.#{$ti-prefix}-badge-ar:before { content: $ti-icon-badge-ar; } -.#{$ti-prefix}-badge-cc:before { content: $ti-icon-badge-cc; } -.#{$ti-prefix}-badge-filled:before { content: $ti-icon-badge-filled; } -.#{$ti-prefix}-badge-hd:before { content: $ti-icon-badge-hd; } -.#{$ti-prefix}-badge-off:before { content: $ti-icon-badge-off; } -.#{$ti-prefix}-badge-sd:before { content: $ti-icon-badge-sd; } -.#{$ti-prefix}-badge-tm:before { content: $ti-icon-badge-tm; } -.#{$ti-prefix}-badge-vo:before { content: $ti-icon-badge-vo; } -.#{$ti-prefix}-badge-vr:before { content: $ti-icon-badge-vr; } -.#{$ti-prefix}-badge-wc:before { content: $ti-icon-badge-wc; } -.#{$ti-prefix}-badges:before { content: $ti-icon-badges; } -.#{$ti-prefix}-badges-filled:before { content: $ti-icon-badges-filled; } -.#{$ti-prefix}-badges-off:before { content: $ti-icon-badges-off; } -.#{$ti-prefix}-baguette:before { content: $ti-icon-baguette; } -.#{$ti-prefix}-ball-american-football:before { content: $ti-icon-ball-american-football; } -.#{$ti-prefix}-ball-american-football-off:before { content: $ti-icon-ball-american-football-off; } -.#{$ti-prefix}-ball-baseball:before { content: $ti-icon-ball-baseball; } -.#{$ti-prefix}-ball-basketball:before { content: $ti-icon-ball-basketball; } -.#{$ti-prefix}-ball-bowling:before { content: $ti-icon-ball-bowling; } -.#{$ti-prefix}-ball-football:before { content: $ti-icon-ball-football; } -.#{$ti-prefix}-ball-football-off:before { content: $ti-icon-ball-football-off; } -.#{$ti-prefix}-ball-tennis:before { content: $ti-icon-ball-tennis; } -.#{$ti-prefix}-ball-volleyball:before { content: $ti-icon-ball-volleyball; } -.#{$ti-prefix}-balloon:before { content: $ti-icon-balloon; } -.#{$ti-prefix}-balloon-off:before { content: $ti-icon-balloon-off; } -.#{$ti-prefix}-ballpen:before { content: $ti-icon-ballpen; } -.#{$ti-prefix}-ballpen-off:before { content: $ti-icon-ballpen-off; } -.#{$ti-prefix}-ban:before { content: $ti-icon-ban; } -.#{$ti-prefix}-bandage:before { content: $ti-icon-bandage; } -.#{$ti-prefix}-bandage-filled:before { content: $ti-icon-bandage-filled; } -.#{$ti-prefix}-bandage-off:before { content: $ti-icon-bandage-off; } -.#{$ti-prefix}-barbell:before { content: $ti-icon-barbell; } -.#{$ti-prefix}-barbell-off:before { content: $ti-icon-barbell-off; } -.#{$ti-prefix}-barcode:before { content: $ti-icon-barcode; } -.#{$ti-prefix}-barcode-off:before { content: $ti-icon-barcode-off; } -.#{$ti-prefix}-barrel:before { content: $ti-icon-barrel; } -.#{$ti-prefix}-barrel-off:before { content: $ti-icon-barrel-off; } -.#{$ti-prefix}-barrier-block:before { content: $ti-icon-barrier-block; } -.#{$ti-prefix}-barrier-block-off:before { content: $ti-icon-barrier-block-off; } -.#{$ti-prefix}-baseline:before { content: $ti-icon-baseline; } -.#{$ti-prefix}-baseline-density-large:before { content: $ti-icon-baseline-density-large; } -.#{$ti-prefix}-baseline-density-medium:before { content: $ti-icon-baseline-density-medium; } -.#{$ti-prefix}-baseline-density-small:before { content: $ti-icon-baseline-density-small; } -.#{$ti-prefix}-basket:before { content: $ti-icon-basket; } -.#{$ti-prefix}-basket-filled:before { content: $ti-icon-basket-filled; } -.#{$ti-prefix}-basket-off:before { content: $ti-icon-basket-off; } -.#{$ti-prefix}-bat:before { content: $ti-icon-bat; } -.#{$ti-prefix}-bath:before { content: $ti-icon-bath; } -.#{$ti-prefix}-bath-filled:before { content: $ti-icon-bath-filled; } -.#{$ti-prefix}-bath-off:before { content: $ti-icon-bath-off; } -.#{$ti-prefix}-battery:before { content: $ti-icon-battery; } -.#{$ti-prefix}-battery-1:before { content: $ti-icon-battery-1; } -.#{$ti-prefix}-battery-1-filled:before { content: $ti-icon-battery-1-filled; } -.#{$ti-prefix}-battery-2:before { content: $ti-icon-battery-2; } -.#{$ti-prefix}-battery-2-filled:before { content: $ti-icon-battery-2-filled; } -.#{$ti-prefix}-battery-3:before { content: $ti-icon-battery-3; } -.#{$ti-prefix}-battery-3-filled:before { content: $ti-icon-battery-3-filled; } -.#{$ti-prefix}-battery-4:before { content: $ti-icon-battery-4; } -.#{$ti-prefix}-battery-4-filled:before { content: $ti-icon-battery-4-filled; } -.#{$ti-prefix}-battery-automotive:before { content: $ti-icon-battery-automotive; } -.#{$ti-prefix}-battery-charging:before { content: $ti-icon-battery-charging; } -.#{$ti-prefix}-battery-charging-2:before { content: $ti-icon-battery-charging-2; } -.#{$ti-prefix}-battery-eco:before { content: $ti-icon-battery-eco; } -.#{$ti-prefix}-battery-filled:before { content: $ti-icon-battery-filled; } -.#{$ti-prefix}-battery-off:before { content: $ti-icon-battery-off; } -.#{$ti-prefix}-beach:before { content: $ti-icon-beach; } -.#{$ti-prefix}-beach-off:before { content: $ti-icon-beach-off; } -.#{$ti-prefix}-bed:before { content: $ti-icon-bed; } -.#{$ti-prefix}-bed-filled:before { content: $ti-icon-bed-filled; } -.#{$ti-prefix}-bed-off:before { content: $ti-icon-bed-off; } -.#{$ti-prefix}-beer:before { content: $ti-icon-beer; } -.#{$ti-prefix}-beer-filled:before { content: $ti-icon-beer-filled; } -.#{$ti-prefix}-beer-off:before { content: $ti-icon-beer-off; } -.#{$ti-prefix}-bell:before { content: $ti-icon-bell; } -.#{$ti-prefix}-bell-bolt:before { content: $ti-icon-bell-bolt; } -.#{$ti-prefix}-bell-cancel:before { content: $ti-icon-bell-cancel; } -.#{$ti-prefix}-bell-check:before { content: $ti-icon-bell-check; } -.#{$ti-prefix}-bell-code:before { content: $ti-icon-bell-code; } -.#{$ti-prefix}-bell-cog:before { content: $ti-icon-bell-cog; } -.#{$ti-prefix}-bell-dollar:before { content: $ti-icon-bell-dollar; } -.#{$ti-prefix}-bell-down:before { content: $ti-icon-bell-down; } -.#{$ti-prefix}-bell-exclamation:before { content: $ti-icon-bell-exclamation; } -.#{$ti-prefix}-bell-filled:before { content: $ti-icon-bell-filled; } -.#{$ti-prefix}-bell-heart:before { content: $ti-icon-bell-heart; } -.#{$ti-prefix}-bell-minus:before { content: $ti-icon-bell-minus; } -.#{$ti-prefix}-bell-minus-filled:before { content: $ti-icon-bell-minus-filled; } -.#{$ti-prefix}-bell-off:before { content: $ti-icon-bell-off; } -.#{$ti-prefix}-bell-pause:before { content: $ti-icon-bell-pause; } -.#{$ti-prefix}-bell-pin:before { content: $ti-icon-bell-pin; } -.#{$ti-prefix}-bell-plus:before { content: $ti-icon-bell-plus; } -.#{$ti-prefix}-bell-plus-filled:before { content: $ti-icon-bell-plus-filled; } -.#{$ti-prefix}-bell-question:before { content: $ti-icon-bell-question; } -.#{$ti-prefix}-bell-ringing:before { content: $ti-icon-bell-ringing; } -.#{$ti-prefix}-bell-ringing-2:before { content: $ti-icon-bell-ringing-2; } -.#{$ti-prefix}-bell-ringing-2-filled:before { content: $ti-icon-bell-ringing-2-filled; } -.#{$ti-prefix}-bell-ringing-filled:before { content: $ti-icon-bell-ringing-filled; } -.#{$ti-prefix}-bell-school:before { content: $ti-icon-bell-school; } -.#{$ti-prefix}-bell-search:before { content: $ti-icon-bell-search; } -.#{$ti-prefix}-bell-share:before { content: $ti-icon-bell-share; } -.#{$ti-prefix}-bell-star:before { content: $ti-icon-bell-star; } -.#{$ti-prefix}-bell-up:before { content: $ti-icon-bell-up; } -.#{$ti-prefix}-bell-x:before { content: $ti-icon-bell-x; } -.#{$ti-prefix}-bell-x-filled:before { content: $ti-icon-bell-x-filled; } -.#{$ti-prefix}-bell-z:before { content: $ti-icon-bell-z; } -.#{$ti-prefix}-bell-z-filled:before { content: $ti-icon-bell-z-filled; } -.#{$ti-prefix}-beta:before { content: $ti-icon-beta; } -.#{$ti-prefix}-bible:before { content: $ti-icon-bible; } -.#{$ti-prefix}-bike:before { content: $ti-icon-bike; } -.#{$ti-prefix}-bike-off:before { content: $ti-icon-bike-off; } -.#{$ti-prefix}-binary:before { content: $ti-icon-binary; } -.#{$ti-prefix}-binary-off:before { content: $ti-icon-binary-off; } -.#{$ti-prefix}-binary-tree:before { content: $ti-icon-binary-tree; } -.#{$ti-prefix}-binary-tree-2:before { content: $ti-icon-binary-tree-2; } -.#{$ti-prefix}-biohazard:before { content: $ti-icon-biohazard; } -.#{$ti-prefix}-biohazard-off:before { content: $ti-icon-biohazard-off; } -.#{$ti-prefix}-blade:before { content: $ti-icon-blade; } -.#{$ti-prefix}-blade-filled:before { content: $ti-icon-blade-filled; } -.#{$ti-prefix}-bleach:before { content: $ti-icon-bleach; } -.#{$ti-prefix}-bleach-chlorine:before { content: $ti-icon-bleach-chlorine; } -.#{$ti-prefix}-bleach-no-chlorine:before { content: $ti-icon-bleach-no-chlorine; } -.#{$ti-prefix}-bleach-off:before { content: $ti-icon-bleach-off; } -.#{$ti-prefix}-blockquote:before { content: $ti-icon-blockquote; } -.#{$ti-prefix}-bluetooth:before { content: $ti-icon-bluetooth; } -.#{$ti-prefix}-bluetooth-connected:before { content: $ti-icon-bluetooth-connected; } -.#{$ti-prefix}-bluetooth-off:before { content: $ti-icon-bluetooth-off; } -.#{$ti-prefix}-bluetooth-x:before { content: $ti-icon-bluetooth-x; } -.#{$ti-prefix}-blur:before { content: $ti-icon-blur; } -.#{$ti-prefix}-blur-off:before { content: $ti-icon-blur-off; } -.#{$ti-prefix}-bmp:before { content: $ti-icon-bmp; } -.#{$ti-prefix}-bold:before { content: $ti-icon-bold; } -.#{$ti-prefix}-bold-off:before { content: $ti-icon-bold-off; } -.#{$ti-prefix}-bolt:before { content: $ti-icon-bolt; } -.#{$ti-prefix}-bolt-off:before { content: $ti-icon-bolt-off; } -.#{$ti-prefix}-bomb:before { content: $ti-icon-bomb; } -.#{$ti-prefix}-bone:before { content: $ti-icon-bone; } -.#{$ti-prefix}-bone-off:before { content: $ti-icon-bone-off; } -.#{$ti-prefix}-bong:before { content: $ti-icon-bong; } -.#{$ti-prefix}-bong-off:before { content: $ti-icon-bong-off; } -.#{$ti-prefix}-book:before { content: $ti-icon-book; } -.#{$ti-prefix}-book-2:before { content: $ti-icon-book-2; } -.#{$ti-prefix}-book-download:before { content: $ti-icon-book-download; } -.#{$ti-prefix}-book-off:before { content: $ti-icon-book-off; } -.#{$ti-prefix}-book-upload:before { content: $ti-icon-book-upload; } -.#{$ti-prefix}-bookmark:before { content: $ti-icon-bookmark; } -.#{$ti-prefix}-bookmark-off:before { content: $ti-icon-bookmark-off; } -.#{$ti-prefix}-bookmarks:before { content: $ti-icon-bookmarks; } -.#{$ti-prefix}-bookmarks-off:before { content: $ti-icon-bookmarks-off; } -.#{$ti-prefix}-books:before { content: $ti-icon-books; } -.#{$ti-prefix}-books-off:before { content: $ti-icon-books-off; } -.#{$ti-prefix}-border-all:before { content: $ti-icon-border-all; } -.#{$ti-prefix}-border-bottom:before { content: $ti-icon-border-bottom; } -.#{$ti-prefix}-border-corners:before { content: $ti-icon-border-corners; } -.#{$ti-prefix}-border-horizontal:before { content: $ti-icon-border-horizontal; } -.#{$ti-prefix}-border-inner:before { content: $ti-icon-border-inner; } -.#{$ti-prefix}-border-left:before { content: $ti-icon-border-left; } -.#{$ti-prefix}-border-none:before { content: $ti-icon-border-none; } -.#{$ti-prefix}-border-outer:before { content: $ti-icon-border-outer; } -.#{$ti-prefix}-border-radius:before { content: $ti-icon-border-radius; } -.#{$ti-prefix}-border-right:before { content: $ti-icon-border-right; } -.#{$ti-prefix}-border-sides:before { content: $ti-icon-border-sides; } -.#{$ti-prefix}-border-style:before { content: $ti-icon-border-style; } -.#{$ti-prefix}-border-style-2:before { content: $ti-icon-border-style-2; } -.#{$ti-prefix}-border-top:before { content: $ti-icon-border-top; } -.#{$ti-prefix}-border-vertical:before { content: $ti-icon-border-vertical; } -.#{$ti-prefix}-bottle:before { content: $ti-icon-bottle; } -.#{$ti-prefix}-bottle-off:before { content: $ti-icon-bottle-off; } -.#{$ti-prefix}-bounce-left:before { content: $ti-icon-bounce-left; } -.#{$ti-prefix}-bounce-right:before { content: $ti-icon-bounce-right; } -.#{$ti-prefix}-bow:before { content: $ti-icon-bow; } -.#{$ti-prefix}-bowl:before { content: $ti-icon-bowl; } -.#{$ti-prefix}-box:before { content: $ti-icon-box; } -.#{$ti-prefix}-box-align-bottom:before { content: $ti-icon-box-align-bottom; } -.#{$ti-prefix}-box-align-bottom-left:before { content: $ti-icon-box-align-bottom-left; } -.#{$ti-prefix}-box-align-bottom-right:before { content: $ti-icon-box-align-bottom-right; } -.#{$ti-prefix}-box-align-left:before { content: $ti-icon-box-align-left; } -.#{$ti-prefix}-box-align-right:before { content: $ti-icon-box-align-right; } -.#{$ti-prefix}-box-align-top:before { content: $ti-icon-box-align-top; } -.#{$ti-prefix}-box-align-top-left:before { content: $ti-icon-box-align-top-left; } -.#{$ti-prefix}-box-align-top-right:before { content: $ti-icon-box-align-top-right; } -.#{$ti-prefix}-box-margin:before { content: $ti-icon-box-margin; } -.#{$ti-prefix}-box-model:before { content: $ti-icon-box-model; } -.#{$ti-prefix}-box-model-2:before { content: $ti-icon-box-model-2; } -.#{$ti-prefix}-box-model-2-off:before { content: $ti-icon-box-model-2-off; } -.#{$ti-prefix}-box-model-off:before { content: $ti-icon-box-model-off; } -.#{$ti-prefix}-box-multiple:before { content: $ti-icon-box-multiple; } -.#{$ti-prefix}-box-multiple-0:before { content: $ti-icon-box-multiple-0; } -.#{$ti-prefix}-box-multiple-1:before { content: $ti-icon-box-multiple-1; } -.#{$ti-prefix}-box-multiple-2:before { content: $ti-icon-box-multiple-2; } -.#{$ti-prefix}-box-multiple-3:before { content: $ti-icon-box-multiple-3; } -.#{$ti-prefix}-box-multiple-4:before { content: $ti-icon-box-multiple-4; } -.#{$ti-prefix}-box-multiple-5:before { content: $ti-icon-box-multiple-5; } -.#{$ti-prefix}-box-multiple-6:before { content: $ti-icon-box-multiple-6; } -.#{$ti-prefix}-box-multiple-7:before { content: $ti-icon-box-multiple-7; } -.#{$ti-prefix}-box-multiple-8:before { content: $ti-icon-box-multiple-8; } -.#{$ti-prefix}-box-multiple-9:before { content: $ti-icon-box-multiple-9; } -.#{$ti-prefix}-box-off:before { content: $ti-icon-box-off; } -.#{$ti-prefix}-box-padding:before { content: $ti-icon-box-padding; } -.#{$ti-prefix}-box-seam:before { content: $ti-icon-box-seam; } -.#{$ti-prefix}-braces:before { content: $ti-icon-braces; } -.#{$ti-prefix}-braces-off:before { content: $ti-icon-braces-off; } -.#{$ti-prefix}-brackets:before { content: $ti-icon-brackets; } -.#{$ti-prefix}-brackets-contain:before { content: $ti-icon-brackets-contain; } -.#{$ti-prefix}-brackets-contain-end:before { content: $ti-icon-brackets-contain-end; } -.#{$ti-prefix}-brackets-contain-start:before { content: $ti-icon-brackets-contain-start; } -.#{$ti-prefix}-brackets-off:before { content: $ti-icon-brackets-off; } -.#{$ti-prefix}-braille:before { content: $ti-icon-braille; } -.#{$ti-prefix}-brain:before { content: $ti-icon-brain; } -.#{$ti-prefix}-brand-4chan:before { content: $ti-icon-brand-4chan; } -.#{$ti-prefix}-brand-abstract:before { content: $ti-icon-brand-abstract; } -.#{$ti-prefix}-brand-adobe:before { content: $ti-icon-brand-adobe; } -.#{$ti-prefix}-brand-adonis-js:before { content: $ti-icon-brand-adonis-js; } -.#{$ti-prefix}-brand-airbnb:before { content: $ti-icon-brand-airbnb; } -.#{$ti-prefix}-brand-airtable:before { content: $ti-icon-brand-airtable; } -.#{$ti-prefix}-brand-algolia:before { content: $ti-icon-brand-algolia; } -.#{$ti-prefix}-brand-alipay:before { content: $ti-icon-brand-alipay; } -.#{$ti-prefix}-brand-alpine-js:before { content: $ti-icon-brand-alpine-js; } -.#{$ti-prefix}-brand-amazon:before { content: $ti-icon-brand-amazon; } -.#{$ti-prefix}-brand-amd:before { content: $ti-icon-brand-amd; } -.#{$ti-prefix}-brand-amigo:before { content: $ti-icon-brand-amigo; } -.#{$ti-prefix}-brand-among-us:before { content: $ti-icon-brand-among-us; } -.#{$ti-prefix}-brand-android:before { content: $ti-icon-brand-android; } -.#{$ti-prefix}-brand-angular:before { content: $ti-icon-brand-angular; } -.#{$ti-prefix}-brand-ao3:before { content: $ti-icon-brand-ao3; } -.#{$ti-prefix}-brand-appgallery:before { content: $ti-icon-brand-appgallery; } -.#{$ti-prefix}-brand-apple:before { content: $ti-icon-brand-apple; } -.#{$ti-prefix}-brand-apple-arcade:before { content: $ti-icon-brand-apple-arcade; } -.#{$ti-prefix}-brand-apple-podcast:before { content: $ti-icon-brand-apple-podcast; } -.#{$ti-prefix}-brand-appstore:before { content: $ti-icon-brand-appstore; } -.#{$ti-prefix}-brand-asana:before { content: $ti-icon-brand-asana; } -.#{$ti-prefix}-brand-backbone:before { content: $ti-icon-brand-backbone; } -.#{$ti-prefix}-brand-badoo:before { content: $ti-icon-brand-badoo; } -.#{$ti-prefix}-brand-baidu:before { content: $ti-icon-brand-baidu; } -.#{$ti-prefix}-brand-bandcamp:before { content: $ti-icon-brand-bandcamp; } -.#{$ti-prefix}-brand-bandlab:before { content: $ti-icon-brand-bandlab; } -.#{$ti-prefix}-brand-beats:before { content: $ti-icon-brand-beats; } -.#{$ti-prefix}-brand-behance:before { content: $ti-icon-brand-behance; } -.#{$ti-prefix}-brand-bilibili:before { content: $ti-icon-brand-bilibili; } -.#{$ti-prefix}-brand-binance:before { content: $ti-icon-brand-binance; } -.#{$ti-prefix}-brand-bing:before { content: $ti-icon-brand-bing; } -.#{$ti-prefix}-brand-bitbucket:before { content: $ti-icon-brand-bitbucket; } -.#{$ti-prefix}-brand-blackberry:before { content: $ti-icon-brand-blackberry; } -.#{$ti-prefix}-brand-blender:before { content: $ti-icon-brand-blender; } -.#{$ti-prefix}-brand-blogger:before { content: $ti-icon-brand-blogger; } -.#{$ti-prefix}-brand-booking:before { content: $ti-icon-brand-booking; } -.#{$ti-prefix}-brand-bootstrap:before { content: $ti-icon-brand-bootstrap; } -.#{$ti-prefix}-brand-bulma:before { content: $ti-icon-brand-bulma; } -.#{$ti-prefix}-brand-bumble:before { content: $ti-icon-brand-bumble; } -.#{$ti-prefix}-brand-bunpo:before { content: $ti-icon-brand-bunpo; } -.#{$ti-prefix}-brand-c-sharp:before { content: $ti-icon-brand-c-sharp; } -.#{$ti-prefix}-brand-cake:before { content: $ti-icon-brand-cake; } -.#{$ti-prefix}-brand-cakephp:before { content: $ti-icon-brand-cakephp; } -.#{$ti-prefix}-brand-campaignmonitor:before { content: $ti-icon-brand-campaignmonitor; } -.#{$ti-prefix}-brand-carbon:before { content: $ti-icon-brand-carbon; } -.#{$ti-prefix}-brand-cashapp:before { content: $ti-icon-brand-cashapp; } -.#{$ti-prefix}-brand-chrome:before { content: $ti-icon-brand-chrome; } -.#{$ti-prefix}-brand-citymapper:before { content: $ti-icon-brand-citymapper; } -.#{$ti-prefix}-brand-codecov:before { content: $ti-icon-brand-codecov; } -.#{$ti-prefix}-brand-codepen:before { content: $ti-icon-brand-codepen; } -.#{$ti-prefix}-brand-codesandbox:before { content: $ti-icon-brand-codesandbox; } -.#{$ti-prefix}-brand-cohost:before { content: $ti-icon-brand-cohost; } -.#{$ti-prefix}-brand-coinbase:before { content: $ti-icon-brand-coinbase; } -.#{$ti-prefix}-brand-comedy-central:before { content: $ti-icon-brand-comedy-central; } -.#{$ti-prefix}-brand-coreos:before { content: $ti-icon-brand-coreos; } -.#{$ti-prefix}-brand-couchdb:before { content: $ti-icon-brand-couchdb; } -.#{$ti-prefix}-brand-couchsurfing:before { content: $ti-icon-brand-couchsurfing; } -.#{$ti-prefix}-brand-cpp:before { content: $ti-icon-brand-cpp; } -.#{$ti-prefix}-brand-crunchbase:before { content: $ti-icon-brand-crunchbase; } -.#{$ti-prefix}-brand-css3:before { content: $ti-icon-brand-css3; } -.#{$ti-prefix}-brand-ctemplar:before { content: $ti-icon-brand-ctemplar; } -.#{$ti-prefix}-brand-cucumber:before { content: $ti-icon-brand-cucumber; } -.#{$ti-prefix}-brand-cupra:before { content: $ti-icon-brand-cupra; } -.#{$ti-prefix}-brand-cypress:before { content: $ti-icon-brand-cypress; } -.#{$ti-prefix}-brand-d3:before { content: $ti-icon-brand-d3; } -.#{$ti-prefix}-brand-days-counter:before { content: $ti-icon-brand-days-counter; } -.#{$ti-prefix}-brand-dcos:before { content: $ti-icon-brand-dcos; } -.#{$ti-prefix}-brand-debian:before { content: $ti-icon-brand-debian; } -.#{$ti-prefix}-brand-deezer:before { content: $ti-icon-brand-deezer; } -.#{$ti-prefix}-brand-deliveroo:before { content: $ti-icon-brand-deliveroo; } -.#{$ti-prefix}-brand-deno:before { content: $ti-icon-brand-deno; } -.#{$ti-prefix}-brand-denodo:before { content: $ti-icon-brand-denodo; } -.#{$ti-prefix}-brand-deviantart:before { content: $ti-icon-brand-deviantart; } -.#{$ti-prefix}-brand-dingtalk:before { content: $ti-icon-brand-dingtalk; } -.#{$ti-prefix}-brand-discord:before { content: $ti-icon-brand-discord; } -.#{$ti-prefix}-brand-discord-filled:before { content: $ti-icon-brand-discord-filled; } -.#{$ti-prefix}-brand-disney:before { content: $ti-icon-brand-disney; } -.#{$ti-prefix}-brand-disqus:before { content: $ti-icon-brand-disqus; } -.#{$ti-prefix}-brand-django:before { content: $ti-icon-brand-django; } -.#{$ti-prefix}-brand-docker:before { content: $ti-icon-brand-docker; } -.#{$ti-prefix}-brand-doctrine:before { content: $ti-icon-brand-doctrine; } -.#{$ti-prefix}-brand-dolby-digital:before { content: $ti-icon-brand-dolby-digital; } -.#{$ti-prefix}-brand-douban:before { content: $ti-icon-brand-douban; } -.#{$ti-prefix}-brand-dribbble:before { content: $ti-icon-brand-dribbble; } -.#{$ti-prefix}-brand-dribbble-filled:before { content: $ti-icon-brand-dribbble-filled; } -.#{$ti-prefix}-brand-drops:before { content: $ti-icon-brand-drops; } -.#{$ti-prefix}-brand-drupal:before { content: $ti-icon-brand-drupal; } -.#{$ti-prefix}-brand-edge:before { content: $ti-icon-brand-edge; } -.#{$ti-prefix}-brand-elastic:before { content: $ti-icon-brand-elastic; } -.#{$ti-prefix}-brand-ember:before { content: $ti-icon-brand-ember; } -.#{$ti-prefix}-brand-envato:before { content: $ti-icon-brand-envato; } -.#{$ti-prefix}-brand-etsy:before { content: $ti-icon-brand-etsy; } -.#{$ti-prefix}-brand-evernote:before { content: $ti-icon-brand-evernote; } -.#{$ti-prefix}-brand-facebook:before { content: $ti-icon-brand-facebook; } -.#{$ti-prefix}-brand-facebook-filled:before { content: $ti-icon-brand-facebook-filled; } -.#{$ti-prefix}-brand-figma:before { content: $ti-icon-brand-figma; } -.#{$ti-prefix}-brand-finder:before { content: $ti-icon-brand-finder; } -.#{$ti-prefix}-brand-firebase:before { content: $ti-icon-brand-firebase; } -.#{$ti-prefix}-brand-firefox:before { content: $ti-icon-brand-firefox; } -.#{$ti-prefix}-brand-fiverr:before { content: $ti-icon-brand-fiverr; } -.#{$ti-prefix}-brand-flickr:before { content: $ti-icon-brand-flickr; } -.#{$ti-prefix}-brand-flightradar24:before { content: $ti-icon-brand-flightradar24; } -.#{$ti-prefix}-brand-flipboard:before { content: $ti-icon-brand-flipboard; } -.#{$ti-prefix}-brand-flutter:before { content: $ti-icon-brand-flutter; } -.#{$ti-prefix}-brand-fortnite:before { content: $ti-icon-brand-fortnite; } -.#{$ti-prefix}-brand-foursquare:before { content: $ti-icon-brand-foursquare; } -.#{$ti-prefix}-brand-framer:before { content: $ti-icon-brand-framer; } -.#{$ti-prefix}-brand-framer-motion:before { content: $ti-icon-brand-framer-motion; } -.#{$ti-prefix}-brand-funimation:before { content: $ti-icon-brand-funimation; } -.#{$ti-prefix}-brand-gatsby:before { content: $ti-icon-brand-gatsby; } -.#{$ti-prefix}-brand-git:before { content: $ti-icon-brand-git; } -.#{$ti-prefix}-brand-github:before { content: $ti-icon-brand-github; } -.#{$ti-prefix}-brand-github-copilot:before { content: $ti-icon-brand-github-copilot; } -.#{$ti-prefix}-brand-github-filled:before { content: $ti-icon-brand-github-filled; } -.#{$ti-prefix}-brand-gitlab:before { content: $ti-icon-brand-gitlab; } -.#{$ti-prefix}-brand-gmail:before { content: $ti-icon-brand-gmail; } -.#{$ti-prefix}-brand-golang:before { content: $ti-icon-brand-golang; } -.#{$ti-prefix}-brand-google:before { content: $ti-icon-brand-google; } -.#{$ti-prefix}-brand-google-analytics:before { content: $ti-icon-brand-google-analytics; } -.#{$ti-prefix}-brand-google-big-query:before { content: $ti-icon-brand-google-big-query; } -.#{$ti-prefix}-brand-google-drive:before { content: $ti-icon-brand-google-drive; } -.#{$ti-prefix}-brand-google-fit:before { content: $ti-icon-brand-google-fit; } -.#{$ti-prefix}-brand-google-home:before { content: $ti-icon-brand-google-home; } -.#{$ti-prefix}-brand-google-one:before { content: $ti-icon-brand-google-one; } -.#{$ti-prefix}-brand-google-photos:before { content: $ti-icon-brand-google-photos; } -.#{$ti-prefix}-brand-google-play:before { content: $ti-icon-brand-google-play; } -.#{$ti-prefix}-brand-google-podcasts:before { content: $ti-icon-brand-google-podcasts; } -.#{$ti-prefix}-brand-grammarly:before { content: $ti-icon-brand-grammarly; } -.#{$ti-prefix}-brand-graphql:before { content: $ti-icon-brand-graphql; } -.#{$ti-prefix}-brand-gravatar:before { content: $ti-icon-brand-gravatar; } -.#{$ti-prefix}-brand-grindr:before { content: $ti-icon-brand-grindr; } -.#{$ti-prefix}-brand-guardian:before { content: $ti-icon-brand-guardian; } -.#{$ti-prefix}-brand-gumroad:before { content: $ti-icon-brand-gumroad; } -.#{$ti-prefix}-brand-hbo:before { content: $ti-icon-brand-hbo; } -.#{$ti-prefix}-brand-headlessui:before { content: $ti-icon-brand-headlessui; } -.#{$ti-prefix}-brand-hipchat:before { content: $ti-icon-brand-hipchat; } -.#{$ti-prefix}-brand-html5:before { content: $ti-icon-brand-html5; } -.#{$ti-prefix}-brand-inertia:before { content: $ti-icon-brand-inertia; } -.#{$ti-prefix}-brand-instagram:before { content: $ti-icon-brand-instagram; } -.#{$ti-prefix}-brand-intercom:before { content: $ti-icon-brand-intercom; } -.#{$ti-prefix}-brand-javascript:before { content: $ti-icon-brand-javascript; } -.#{$ti-prefix}-brand-juejin:before { content: $ti-icon-brand-juejin; } -.#{$ti-prefix}-brand-kickstarter:before { content: $ti-icon-brand-kickstarter; } -.#{$ti-prefix}-brand-kotlin:before { content: $ti-icon-brand-kotlin; } -.#{$ti-prefix}-brand-laravel:before { content: $ti-icon-brand-laravel; } -.#{$ti-prefix}-brand-lastfm:before { content: $ti-icon-brand-lastfm; } -.#{$ti-prefix}-brand-line:before { content: $ti-icon-brand-line; } -.#{$ti-prefix}-brand-linkedin:before { content: $ti-icon-brand-linkedin; } -.#{$ti-prefix}-brand-linktree:before { content: $ti-icon-brand-linktree; } -.#{$ti-prefix}-brand-linqpad:before { content: $ti-icon-brand-linqpad; } -.#{$ti-prefix}-brand-loom:before { content: $ti-icon-brand-loom; } -.#{$ti-prefix}-brand-mailgun:before { content: $ti-icon-brand-mailgun; } -.#{$ti-prefix}-brand-mantine:before { content: $ti-icon-brand-mantine; } -.#{$ti-prefix}-brand-mastercard:before { content: $ti-icon-brand-mastercard; } -.#{$ti-prefix}-brand-mastodon:before { content: $ti-icon-brand-mastodon; } -.#{$ti-prefix}-brand-matrix:before { content: $ti-icon-brand-matrix; } -.#{$ti-prefix}-brand-mcdonalds:before { content: $ti-icon-brand-mcdonalds; } -.#{$ti-prefix}-brand-medium:before { content: $ti-icon-brand-medium; } -.#{$ti-prefix}-brand-mercedes:before { content: $ti-icon-brand-mercedes; } -.#{$ti-prefix}-brand-messenger:before { content: $ti-icon-brand-messenger; } -.#{$ti-prefix}-brand-meta:before { content: $ti-icon-brand-meta; } -.#{$ti-prefix}-brand-miniprogram:before { content: $ti-icon-brand-miniprogram; } -.#{$ti-prefix}-brand-mixpanel:before { content: $ti-icon-brand-mixpanel; } -.#{$ti-prefix}-brand-monday:before { content: $ti-icon-brand-monday; } -.#{$ti-prefix}-brand-mongodb:before { content: $ti-icon-brand-mongodb; } -.#{$ti-prefix}-brand-my-oppo:before { content: $ti-icon-brand-my-oppo; } -.#{$ti-prefix}-brand-mysql:before { content: $ti-icon-brand-mysql; } -.#{$ti-prefix}-brand-national-geographic:before { content: $ti-icon-brand-national-geographic; } -.#{$ti-prefix}-brand-nem:before { content: $ti-icon-brand-nem; } -.#{$ti-prefix}-brand-netbeans:before { content: $ti-icon-brand-netbeans; } -.#{$ti-prefix}-brand-netease-music:before { content: $ti-icon-brand-netease-music; } -.#{$ti-prefix}-brand-netflix:before { content: $ti-icon-brand-netflix; } -.#{$ti-prefix}-brand-nexo:before { content: $ti-icon-brand-nexo; } -.#{$ti-prefix}-brand-nextcloud:before { content: $ti-icon-brand-nextcloud; } -.#{$ti-prefix}-brand-nextjs:before { content: $ti-icon-brand-nextjs; } -.#{$ti-prefix}-brand-nord-vpn:before { content: $ti-icon-brand-nord-vpn; } -.#{$ti-prefix}-brand-notion:before { content: $ti-icon-brand-notion; } -.#{$ti-prefix}-brand-npm:before { content: $ti-icon-brand-npm; } -.#{$ti-prefix}-brand-nuxt:before { content: $ti-icon-brand-nuxt; } -.#{$ti-prefix}-brand-nytimes:before { content: $ti-icon-brand-nytimes; } -.#{$ti-prefix}-brand-office:before { content: $ti-icon-brand-office; } -.#{$ti-prefix}-brand-ok-ru:before { content: $ti-icon-brand-ok-ru; } -.#{$ti-prefix}-brand-onedrive:before { content: $ti-icon-brand-onedrive; } -.#{$ti-prefix}-brand-onlyfans:before { content: $ti-icon-brand-onlyfans; } -.#{$ti-prefix}-brand-open-source:before { content: $ti-icon-brand-open-source; } -.#{$ti-prefix}-brand-openai:before { content: $ti-icon-brand-openai; } -.#{$ti-prefix}-brand-openvpn:before { content: $ti-icon-brand-openvpn; } -.#{$ti-prefix}-brand-opera:before { content: $ti-icon-brand-opera; } -.#{$ti-prefix}-brand-pagekit:before { content: $ti-icon-brand-pagekit; } -.#{$ti-prefix}-brand-patreon:before { content: $ti-icon-brand-patreon; } -.#{$ti-prefix}-brand-paypal:before { content: $ti-icon-brand-paypal; } -.#{$ti-prefix}-brand-paypal-filled:before { content: $ti-icon-brand-paypal-filled; } -.#{$ti-prefix}-brand-paypay:before { content: $ti-icon-brand-paypay; } -.#{$ti-prefix}-brand-peanut:before { content: $ti-icon-brand-peanut; } -.#{$ti-prefix}-brand-pepsi:before { content: $ti-icon-brand-pepsi; } -.#{$ti-prefix}-brand-php:before { content: $ti-icon-brand-php; } -.#{$ti-prefix}-brand-picsart:before { content: $ti-icon-brand-picsart; } -.#{$ti-prefix}-brand-pinterest:before { content: $ti-icon-brand-pinterest; } -.#{$ti-prefix}-brand-planetscale:before { content: $ti-icon-brand-planetscale; } -.#{$ti-prefix}-brand-pocket:before { content: $ti-icon-brand-pocket; } -.#{$ti-prefix}-brand-polymer:before { content: $ti-icon-brand-polymer; } -.#{$ti-prefix}-brand-powershell:before { content: $ti-icon-brand-powershell; } -.#{$ti-prefix}-brand-prisma:before { content: $ti-icon-brand-prisma; } -.#{$ti-prefix}-brand-producthunt:before { content: $ti-icon-brand-producthunt; } -.#{$ti-prefix}-brand-pushbullet:before { content: $ti-icon-brand-pushbullet; } -.#{$ti-prefix}-brand-pushover:before { content: $ti-icon-brand-pushover; } -.#{$ti-prefix}-brand-python:before { content: $ti-icon-brand-python; } -.#{$ti-prefix}-brand-qq:before { content: $ti-icon-brand-qq; } -.#{$ti-prefix}-brand-radix-ui:before { content: $ti-icon-brand-radix-ui; } -.#{$ti-prefix}-brand-react:before { content: $ti-icon-brand-react; } -.#{$ti-prefix}-brand-react-native:before { content: $ti-icon-brand-react-native; } -.#{$ti-prefix}-brand-reason:before { content: $ti-icon-brand-reason; } -.#{$ti-prefix}-brand-reddit:before { content: $ti-icon-brand-reddit; } -.#{$ti-prefix}-brand-redhat:before { content: $ti-icon-brand-redhat; } -.#{$ti-prefix}-brand-redux:before { content: $ti-icon-brand-redux; } -.#{$ti-prefix}-brand-revolut:before { content: $ti-icon-brand-revolut; } -.#{$ti-prefix}-brand-safari:before { content: $ti-icon-brand-safari; } -.#{$ti-prefix}-brand-samsungpass:before { content: $ti-icon-brand-samsungpass; } -.#{$ti-prefix}-brand-sass:before { content: $ti-icon-brand-sass; } -.#{$ti-prefix}-brand-sentry:before { content: $ti-icon-brand-sentry; } -.#{$ti-prefix}-brand-sharik:before { content: $ti-icon-brand-sharik; } -.#{$ti-prefix}-brand-shazam:before { content: $ti-icon-brand-shazam; } -.#{$ti-prefix}-brand-shopee:before { content: $ti-icon-brand-shopee; } -.#{$ti-prefix}-brand-sketch:before { content: $ti-icon-brand-sketch; } -.#{$ti-prefix}-brand-skype:before { content: $ti-icon-brand-skype; } -.#{$ti-prefix}-brand-slack:before { content: $ti-icon-brand-slack; } -.#{$ti-prefix}-brand-snapchat:before { content: $ti-icon-brand-snapchat; } -.#{$ti-prefix}-brand-snapseed:before { content: $ti-icon-brand-snapseed; } -.#{$ti-prefix}-brand-snowflake:before { content: $ti-icon-brand-snowflake; } -.#{$ti-prefix}-brand-socket-io:before { content: $ti-icon-brand-socket-io; } -.#{$ti-prefix}-brand-solidjs:before { content: $ti-icon-brand-solidjs; } -.#{$ti-prefix}-brand-soundcloud:before { content: $ti-icon-brand-soundcloud; } -.#{$ti-prefix}-brand-spacehey:before { content: $ti-icon-brand-spacehey; } -.#{$ti-prefix}-brand-spotify:before { content: $ti-icon-brand-spotify; } -.#{$ti-prefix}-brand-stackoverflow:before { content: $ti-icon-brand-stackoverflow; } -.#{$ti-prefix}-brand-stackshare:before { content: $ti-icon-brand-stackshare; } -.#{$ti-prefix}-brand-steam:before { content: $ti-icon-brand-steam; } -.#{$ti-prefix}-brand-storybook:before { content: $ti-icon-brand-storybook; } -.#{$ti-prefix}-brand-storytel:before { content: $ti-icon-brand-storytel; } -.#{$ti-prefix}-brand-strava:before { content: $ti-icon-brand-strava; } -.#{$ti-prefix}-brand-stripe:before { content: $ti-icon-brand-stripe; } -.#{$ti-prefix}-brand-sublime-text:before { content: $ti-icon-brand-sublime-text; } -.#{$ti-prefix}-brand-sugarizer:before { content: $ti-icon-brand-sugarizer; } -.#{$ti-prefix}-brand-supabase:before { content: $ti-icon-brand-supabase; } -.#{$ti-prefix}-brand-superhuman:before { content: $ti-icon-brand-superhuman; } -.#{$ti-prefix}-brand-supernova:before { content: $ti-icon-brand-supernova; } -.#{$ti-prefix}-brand-surfshark:before { content: $ti-icon-brand-surfshark; } -.#{$ti-prefix}-brand-svelte:before { content: $ti-icon-brand-svelte; } -.#{$ti-prefix}-brand-symfony:before { content: $ti-icon-brand-symfony; } -.#{$ti-prefix}-brand-tabler:before { content: $ti-icon-brand-tabler; } -.#{$ti-prefix}-brand-tailwind:before { content: $ti-icon-brand-tailwind; } -.#{$ti-prefix}-brand-taobao:before { content: $ti-icon-brand-taobao; } -.#{$ti-prefix}-brand-ted:before { content: $ti-icon-brand-ted; } -.#{$ti-prefix}-brand-telegram:before { content: $ti-icon-brand-telegram; } -.#{$ti-prefix}-brand-tether:before { content: $ti-icon-brand-tether; } -.#{$ti-prefix}-brand-threejs:before { content: $ti-icon-brand-threejs; } -.#{$ti-prefix}-brand-tidal:before { content: $ti-icon-brand-tidal; } -.#{$ti-prefix}-brand-tikto-filled:before { content: $ti-icon-brand-tikto-filled; } -.#{$ti-prefix}-brand-tiktok:before { content: $ti-icon-brand-tiktok; } -.#{$ti-prefix}-brand-tinder:before { content: $ti-icon-brand-tinder; } -.#{$ti-prefix}-brand-topbuzz:before { content: $ti-icon-brand-topbuzz; } -.#{$ti-prefix}-brand-torchain:before { content: $ti-icon-brand-torchain; } -.#{$ti-prefix}-brand-toyota:before { content: $ti-icon-brand-toyota; } -.#{$ti-prefix}-brand-trello:before { content: $ti-icon-brand-trello; } -.#{$ti-prefix}-brand-tripadvisor:before { content: $ti-icon-brand-tripadvisor; } -.#{$ti-prefix}-brand-tumblr:before { content: $ti-icon-brand-tumblr; } -.#{$ti-prefix}-brand-twilio:before { content: $ti-icon-brand-twilio; } -.#{$ti-prefix}-brand-twitch:before { content: $ti-icon-brand-twitch; } -.#{$ti-prefix}-brand-twitter:before { content: $ti-icon-brand-twitter; } -.#{$ti-prefix}-brand-twitter-filled:before { content: $ti-icon-brand-twitter-filled; } -.#{$ti-prefix}-brand-typescript:before { content: $ti-icon-brand-typescript; } -.#{$ti-prefix}-brand-uber:before { content: $ti-icon-brand-uber; } -.#{$ti-prefix}-brand-ubuntu:before { content: $ti-icon-brand-ubuntu; } -.#{$ti-prefix}-brand-unity:before { content: $ti-icon-brand-unity; } -.#{$ti-prefix}-brand-unsplash:before { content: $ti-icon-brand-unsplash; } -.#{$ti-prefix}-brand-upwork:before { content: $ti-icon-brand-upwork; } -.#{$ti-prefix}-brand-valorant:before { content: $ti-icon-brand-valorant; } -.#{$ti-prefix}-brand-vercel:before { content: $ti-icon-brand-vercel; } -.#{$ti-prefix}-brand-vimeo:before { content: $ti-icon-brand-vimeo; } -.#{$ti-prefix}-brand-vinted:before { content: $ti-icon-brand-vinted; } -.#{$ti-prefix}-brand-visa:before { content: $ti-icon-brand-visa; } -.#{$ti-prefix}-brand-visual-studio:before { content: $ti-icon-brand-visual-studio; } -.#{$ti-prefix}-brand-vite:before { content: $ti-icon-brand-vite; } -.#{$ti-prefix}-brand-vivaldi:before { content: $ti-icon-brand-vivaldi; } -.#{$ti-prefix}-brand-vk:before { content: $ti-icon-brand-vk; } -.#{$ti-prefix}-brand-volkswagen:before { content: $ti-icon-brand-volkswagen; } -.#{$ti-prefix}-brand-vsco:before { content: $ti-icon-brand-vsco; } -.#{$ti-prefix}-brand-vscode:before { content: $ti-icon-brand-vscode; } -.#{$ti-prefix}-brand-vue:before { content: $ti-icon-brand-vue; } -.#{$ti-prefix}-brand-walmart:before { content: $ti-icon-brand-walmart; } -.#{$ti-prefix}-brand-waze:before { content: $ti-icon-brand-waze; } -.#{$ti-prefix}-brand-webflow:before { content: $ti-icon-brand-webflow; } -.#{$ti-prefix}-brand-wechat:before { content: $ti-icon-brand-wechat; } -.#{$ti-prefix}-brand-weibo:before { content: $ti-icon-brand-weibo; } -.#{$ti-prefix}-brand-whatsapp:before { content: $ti-icon-brand-whatsapp; } -.#{$ti-prefix}-brand-windows:before { content: $ti-icon-brand-windows; } -.#{$ti-prefix}-brand-windy:before { content: $ti-icon-brand-windy; } -.#{$ti-prefix}-brand-wish:before { content: $ti-icon-brand-wish; } -.#{$ti-prefix}-brand-wix:before { content: $ti-icon-brand-wix; } -.#{$ti-prefix}-brand-wordpress:before { content: $ti-icon-brand-wordpress; } -.#{$ti-prefix}-brand-xbox:before { content: $ti-icon-brand-xbox; } -.#{$ti-prefix}-brand-xing:before { content: $ti-icon-brand-xing; } -.#{$ti-prefix}-brand-yahoo:before { content: $ti-icon-brand-yahoo; } -.#{$ti-prefix}-brand-yatse:before { content: $ti-icon-brand-yatse; } -.#{$ti-prefix}-brand-ycombinator:before { content: $ti-icon-brand-ycombinator; } -.#{$ti-prefix}-brand-youtube:before { content: $ti-icon-brand-youtube; } -.#{$ti-prefix}-brand-youtube-kids:before { content: $ti-icon-brand-youtube-kids; } -.#{$ti-prefix}-brand-zalando:before { content: $ti-icon-brand-zalando; } -.#{$ti-prefix}-brand-zapier:before { content: $ti-icon-brand-zapier; } -.#{$ti-prefix}-brand-zeit:before { content: $ti-icon-brand-zeit; } -.#{$ti-prefix}-brand-zhihu:before { content: $ti-icon-brand-zhihu; } -.#{$ti-prefix}-brand-zoom:before { content: $ti-icon-brand-zoom; } -.#{$ti-prefix}-brand-zulip:before { content: $ti-icon-brand-zulip; } -.#{$ti-prefix}-brand-zwift:before { content: $ti-icon-brand-zwift; } -.#{$ti-prefix}-bread:before { content: $ti-icon-bread; } -.#{$ti-prefix}-bread-off:before { content: $ti-icon-bread-off; } -.#{$ti-prefix}-briefcase:before { content: $ti-icon-briefcase; } -.#{$ti-prefix}-briefcase-off:before { content: $ti-icon-briefcase-off; } -.#{$ti-prefix}-brightness:before { content: $ti-icon-brightness; } -.#{$ti-prefix}-brightness-2:before { content: $ti-icon-brightness-2; } -.#{$ti-prefix}-brightness-down:before { content: $ti-icon-brightness-down; } -.#{$ti-prefix}-brightness-half:before { content: $ti-icon-brightness-half; } -.#{$ti-prefix}-brightness-off:before { content: $ti-icon-brightness-off; } -.#{$ti-prefix}-brightness-up:before { content: $ti-icon-brightness-up; } -.#{$ti-prefix}-broadcast:before { content: $ti-icon-broadcast; } -.#{$ti-prefix}-broadcast-off:before { content: $ti-icon-broadcast-off; } -.#{$ti-prefix}-browser:before { content: $ti-icon-browser; } -.#{$ti-prefix}-browser-check:before { content: $ti-icon-browser-check; } -.#{$ti-prefix}-browser-off:before { content: $ti-icon-browser-off; } -.#{$ti-prefix}-browser-plus:before { content: $ti-icon-browser-plus; } -.#{$ti-prefix}-browser-x:before { content: $ti-icon-browser-x; } -.#{$ti-prefix}-brush:before { content: $ti-icon-brush; } -.#{$ti-prefix}-brush-off:before { content: $ti-icon-brush-off; } -.#{$ti-prefix}-bucket:before { content: $ti-icon-bucket; } -.#{$ti-prefix}-bucket-droplet:before { content: $ti-icon-bucket-droplet; } -.#{$ti-prefix}-bucket-off:before { content: $ti-icon-bucket-off; } -.#{$ti-prefix}-bug:before { content: $ti-icon-bug; } -.#{$ti-prefix}-bug-off:before { content: $ti-icon-bug-off; } -.#{$ti-prefix}-building:before { content: $ti-icon-building; } -.#{$ti-prefix}-building-arch:before { content: $ti-icon-building-arch; } -.#{$ti-prefix}-building-bank:before { content: $ti-icon-building-bank; } -.#{$ti-prefix}-building-bridge:before { content: $ti-icon-building-bridge; } -.#{$ti-prefix}-building-bridge-2:before { content: $ti-icon-building-bridge-2; } -.#{$ti-prefix}-building-broadcast-tower:before { content: $ti-icon-building-broadcast-tower; } -.#{$ti-prefix}-building-carousel:before { content: $ti-icon-building-carousel; } -.#{$ti-prefix}-building-castle:before { content: $ti-icon-building-castle; } -.#{$ti-prefix}-building-church:before { content: $ti-icon-building-church; } -.#{$ti-prefix}-building-circus:before { content: $ti-icon-building-circus; } -.#{$ti-prefix}-building-community:before { content: $ti-icon-building-community; } -.#{$ti-prefix}-building-cottage:before { content: $ti-icon-building-cottage; } -.#{$ti-prefix}-building-estate:before { content: $ti-icon-building-estate; } -.#{$ti-prefix}-building-factory:before { content: $ti-icon-building-factory; } -.#{$ti-prefix}-building-factory-2:before { content: $ti-icon-building-factory-2; } -.#{$ti-prefix}-building-fortress:before { content: $ti-icon-building-fortress; } -.#{$ti-prefix}-building-hospital:before { content: $ti-icon-building-hospital; } -.#{$ti-prefix}-building-lighthouse:before { content: $ti-icon-building-lighthouse; } -.#{$ti-prefix}-building-monument:before { content: $ti-icon-building-monument; } -.#{$ti-prefix}-building-pavilion:before { content: $ti-icon-building-pavilion; } -.#{$ti-prefix}-building-skyscraper:before { content: $ti-icon-building-skyscraper; } -.#{$ti-prefix}-building-stadium:before { content: $ti-icon-building-stadium; } -.#{$ti-prefix}-building-store:before { content: $ti-icon-building-store; } -.#{$ti-prefix}-building-tunnel:before { content: $ti-icon-building-tunnel; } -.#{$ti-prefix}-building-warehouse:before { content: $ti-icon-building-warehouse; } -.#{$ti-prefix}-building-wind-turbine:before { content: $ti-icon-building-wind-turbine; } -.#{$ti-prefix}-bulb:before { content: $ti-icon-bulb; } -.#{$ti-prefix}-bulb-filled:before { content: $ti-icon-bulb-filled; } -.#{$ti-prefix}-bulb-off:before { content: $ti-icon-bulb-off; } -.#{$ti-prefix}-bulldozer:before { content: $ti-icon-bulldozer; } -.#{$ti-prefix}-bus:before { content: $ti-icon-bus; } -.#{$ti-prefix}-bus-off:before { content: $ti-icon-bus-off; } -.#{$ti-prefix}-bus-stop:before { content: $ti-icon-bus-stop; } -.#{$ti-prefix}-businessplan:before { content: $ti-icon-businessplan; } -.#{$ti-prefix}-butterfly:before { content: $ti-icon-butterfly; } -.#{$ti-prefix}-cactus:before { content: $ti-icon-cactus; } -.#{$ti-prefix}-cactus-off:before { content: $ti-icon-cactus-off; } -.#{$ti-prefix}-cake:before { content: $ti-icon-cake; } -.#{$ti-prefix}-cake-off:before { content: $ti-icon-cake-off; } -.#{$ti-prefix}-calculator:before { content: $ti-icon-calculator; } -.#{$ti-prefix}-calculator-off:before { content: $ti-icon-calculator-off; } -.#{$ti-prefix}-calendar:before { content: $ti-icon-calendar; } -.#{$ti-prefix}-calendar-bolt:before { content: $ti-icon-calendar-bolt; } -.#{$ti-prefix}-calendar-cancel:before { content: $ti-icon-calendar-cancel; } -.#{$ti-prefix}-calendar-check:before { content: $ti-icon-calendar-check; } -.#{$ti-prefix}-calendar-code:before { content: $ti-icon-calendar-code; } -.#{$ti-prefix}-calendar-cog:before { content: $ti-icon-calendar-cog; } -.#{$ti-prefix}-calendar-dollar:before { content: $ti-icon-calendar-dollar; } -.#{$ti-prefix}-calendar-down:before { content: $ti-icon-calendar-down; } -.#{$ti-prefix}-calendar-due:before { content: $ti-icon-calendar-due; } -.#{$ti-prefix}-calendar-event:before { content: $ti-icon-calendar-event; } -.#{$ti-prefix}-calendar-exclamation:before { content: $ti-icon-calendar-exclamation; } -.#{$ti-prefix}-calendar-heart:before { content: $ti-icon-calendar-heart; } -.#{$ti-prefix}-calendar-minus:before { content: $ti-icon-calendar-minus; } -.#{$ti-prefix}-calendar-off:before { content: $ti-icon-calendar-off; } -.#{$ti-prefix}-calendar-pause:before { content: $ti-icon-calendar-pause; } -.#{$ti-prefix}-calendar-pin:before { content: $ti-icon-calendar-pin; } -.#{$ti-prefix}-calendar-plus:before { content: $ti-icon-calendar-plus; } -.#{$ti-prefix}-calendar-question:before { content: $ti-icon-calendar-question; } -.#{$ti-prefix}-calendar-search:before { content: $ti-icon-calendar-search; } -.#{$ti-prefix}-calendar-share:before { content: $ti-icon-calendar-share; } -.#{$ti-prefix}-calendar-star:before { content: $ti-icon-calendar-star; } -.#{$ti-prefix}-calendar-stats:before { content: $ti-icon-calendar-stats; } -.#{$ti-prefix}-calendar-time:before { content: $ti-icon-calendar-time; } -.#{$ti-prefix}-calendar-up:before { content: $ti-icon-calendar-up; } -.#{$ti-prefix}-calendar-x:before { content: $ti-icon-calendar-x; } -.#{$ti-prefix}-camera:before { content: $ti-icon-camera; } -.#{$ti-prefix}-camera-bolt:before { content: $ti-icon-camera-bolt; } -.#{$ti-prefix}-camera-cancel:before { content: $ti-icon-camera-cancel; } -.#{$ti-prefix}-camera-check:before { content: $ti-icon-camera-check; } -.#{$ti-prefix}-camera-code:before { content: $ti-icon-camera-code; } -.#{$ti-prefix}-camera-cog:before { content: $ti-icon-camera-cog; } -.#{$ti-prefix}-camera-dollar:before { content: $ti-icon-camera-dollar; } -.#{$ti-prefix}-camera-down:before { content: $ti-icon-camera-down; } -.#{$ti-prefix}-camera-exclamation:before { content: $ti-icon-camera-exclamation; } -.#{$ti-prefix}-camera-heart:before { content: $ti-icon-camera-heart; } -.#{$ti-prefix}-camera-minus:before { content: $ti-icon-camera-minus; } -.#{$ti-prefix}-camera-off:before { content: $ti-icon-camera-off; } -.#{$ti-prefix}-camera-pause:before { content: $ti-icon-camera-pause; } -.#{$ti-prefix}-camera-pin:before { content: $ti-icon-camera-pin; } -.#{$ti-prefix}-camera-plus:before { content: $ti-icon-camera-plus; } -.#{$ti-prefix}-camera-question:before { content: $ti-icon-camera-question; } -.#{$ti-prefix}-camera-rotate:before { content: $ti-icon-camera-rotate; } -.#{$ti-prefix}-camera-search:before { content: $ti-icon-camera-search; } -.#{$ti-prefix}-camera-selfie:before { content: $ti-icon-camera-selfie; } -.#{$ti-prefix}-camera-share:before { content: $ti-icon-camera-share; } -.#{$ti-prefix}-camera-star:before { content: $ti-icon-camera-star; } -.#{$ti-prefix}-camera-up:before { content: $ti-icon-camera-up; } -.#{$ti-prefix}-camera-x:before { content: $ti-icon-camera-x; } -.#{$ti-prefix}-campfire:before { content: $ti-icon-campfire; } -.#{$ti-prefix}-candle:before { content: $ti-icon-candle; } -.#{$ti-prefix}-candy:before { content: $ti-icon-candy; } -.#{$ti-prefix}-candy-off:before { content: $ti-icon-candy-off; } -.#{$ti-prefix}-cane:before { content: $ti-icon-cane; } -.#{$ti-prefix}-cannabis:before { content: $ti-icon-cannabis; } -.#{$ti-prefix}-capture:before { content: $ti-icon-capture; } -.#{$ti-prefix}-capture-off:before { content: $ti-icon-capture-off; } -.#{$ti-prefix}-car:before { content: $ti-icon-car; } -.#{$ti-prefix}-car-crane:before { content: $ti-icon-car-crane; } -.#{$ti-prefix}-car-crash:before { content: $ti-icon-car-crash; } -.#{$ti-prefix}-car-off:before { content: $ti-icon-car-off; } -.#{$ti-prefix}-car-turbine:before { content: $ti-icon-car-turbine; } -.#{$ti-prefix}-caravan:before { content: $ti-icon-caravan; } -.#{$ti-prefix}-cardboards:before { content: $ti-icon-cardboards; } -.#{$ti-prefix}-cardboards-off:before { content: $ti-icon-cardboards-off; } -.#{$ti-prefix}-cards:before { content: $ti-icon-cards; } -.#{$ti-prefix}-caret-down:before { content: $ti-icon-caret-down; } -.#{$ti-prefix}-caret-left:before { content: $ti-icon-caret-left; } -.#{$ti-prefix}-caret-right:before { content: $ti-icon-caret-right; } -.#{$ti-prefix}-caret-up:before { content: $ti-icon-caret-up; } -.#{$ti-prefix}-carousel-horizontal:before { content: $ti-icon-carousel-horizontal; } -.#{$ti-prefix}-carousel-vertical:before { content: $ti-icon-carousel-vertical; } -.#{$ti-prefix}-carrot:before { content: $ti-icon-carrot; } -.#{$ti-prefix}-carrot-off:before { content: $ti-icon-carrot-off; } -.#{$ti-prefix}-cash:before { content: $ti-icon-cash; } -.#{$ti-prefix}-cash-banknote:before { content: $ti-icon-cash-banknote; } -.#{$ti-prefix}-cash-banknote-off:before { content: $ti-icon-cash-banknote-off; } -.#{$ti-prefix}-cash-off:before { content: $ti-icon-cash-off; } -.#{$ti-prefix}-cast:before { content: $ti-icon-cast; } -.#{$ti-prefix}-cast-off:before { content: $ti-icon-cast-off; } -.#{$ti-prefix}-cat:before { content: $ti-icon-cat; } -.#{$ti-prefix}-category:before { content: $ti-icon-category; } -.#{$ti-prefix}-category-2:before { content: $ti-icon-category-2; } -.#{$ti-prefix}-ce:before { content: $ti-icon-ce; } -.#{$ti-prefix}-ce-off:before { content: $ti-icon-ce-off; } -.#{$ti-prefix}-cell:before { content: $ti-icon-cell; } -.#{$ti-prefix}-cell-signal-1:before { content: $ti-icon-cell-signal-1; } -.#{$ti-prefix}-cell-signal-2:before { content: $ti-icon-cell-signal-2; } -.#{$ti-prefix}-cell-signal-3:before { content: $ti-icon-cell-signal-3; } -.#{$ti-prefix}-cell-signal-4:before { content: $ti-icon-cell-signal-4; } -.#{$ti-prefix}-cell-signal-5:before { content: $ti-icon-cell-signal-5; } -.#{$ti-prefix}-cell-signal-off:before { content: $ti-icon-cell-signal-off; } -.#{$ti-prefix}-certificate:before { content: $ti-icon-certificate; } -.#{$ti-prefix}-certificate-2:before { content: $ti-icon-certificate-2; } -.#{$ti-prefix}-certificate-2-off:before { content: $ti-icon-certificate-2-off; } -.#{$ti-prefix}-certificate-off:before { content: $ti-icon-certificate-off; } -.#{$ti-prefix}-chair-director:before { content: $ti-icon-chair-director; } -.#{$ti-prefix}-chalkboard:before { content: $ti-icon-chalkboard; } -.#{$ti-prefix}-chalkboard-off:before { content: $ti-icon-chalkboard-off; } -.#{$ti-prefix}-charging-pile:before { content: $ti-icon-charging-pile; } -.#{$ti-prefix}-chart-arcs:before { content: $ti-icon-chart-arcs; } -.#{$ti-prefix}-chart-arcs-3:before { content: $ti-icon-chart-arcs-3; } -.#{$ti-prefix}-chart-area:before { content: $ti-icon-chart-area; } -.#{$ti-prefix}-chart-area-filled:before { content: $ti-icon-chart-area-filled; } -.#{$ti-prefix}-chart-area-line:before { content: $ti-icon-chart-area-line; } -.#{$ti-prefix}-chart-area-line-filled:before { content: $ti-icon-chart-area-line-filled; } -.#{$ti-prefix}-chart-arrows:before { content: $ti-icon-chart-arrows; } -.#{$ti-prefix}-chart-arrows-vertical:before { content: $ti-icon-chart-arrows-vertical; } -.#{$ti-prefix}-chart-bar:before { content: $ti-icon-chart-bar; } -.#{$ti-prefix}-chart-bar-off:before { content: $ti-icon-chart-bar-off; } -.#{$ti-prefix}-chart-bubble:before { content: $ti-icon-chart-bubble; } -.#{$ti-prefix}-chart-bubble-filled:before { content: $ti-icon-chart-bubble-filled; } -.#{$ti-prefix}-chart-candle:before { content: $ti-icon-chart-candle; } -.#{$ti-prefix}-chart-candle-filled:before { content: $ti-icon-chart-candle-filled; } -.#{$ti-prefix}-chart-circles:before { content: $ti-icon-chart-circles; } -.#{$ti-prefix}-chart-donut:before { content: $ti-icon-chart-donut; } -.#{$ti-prefix}-chart-donut-2:before { content: $ti-icon-chart-donut-2; } -.#{$ti-prefix}-chart-donut-3:before { content: $ti-icon-chart-donut-3; } -.#{$ti-prefix}-chart-donut-4:before { content: $ti-icon-chart-donut-4; } -.#{$ti-prefix}-chart-donut-filled:before { content: $ti-icon-chart-donut-filled; } -.#{$ti-prefix}-chart-dots:before { content: $ti-icon-chart-dots; } -.#{$ti-prefix}-chart-dots-2:before { content: $ti-icon-chart-dots-2; } -.#{$ti-prefix}-chart-dots-3:before { content: $ti-icon-chart-dots-3; } -.#{$ti-prefix}-chart-grid-dots:before { content: $ti-icon-chart-grid-dots; } -.#{$ti-prefix}-chart-histogram:before { content: $ti-icon-chart-histogram; } -.#{$ti-prefix}-chart-infographic:before { content: $ti-icon-chart-infographic; } -.#{$ti-prefix}-chart-line:before { content: $ti-icon-chart-line; } -.#{$ti-prefix}-chart-pie:before { content: $ti-icon-chart-pie; } -.#{$ti-prefix}-chart-pie-2:before { content: $ti-icon-chart-pie-2; } -.#{$ti-prefix}-chart-pie-3:before { content: $ti-icon-chart-pie-3; } -.#{$ti-prefix}-chart-pie-4:before { content: $ti-icon-chart-pie-4; } -.#{$ti-prefix}-chart-pie-filled:before { content: $ti-icon-chart-pie-filled; } -.#{$ti-prefix}-chart-pie-off:before { content: $ti-icon-chart-pie-off; } -.#{$ti-prefix}-chart-ppf:before { content: $ti-icon-chart-ppf; } -.#{$ti-prefix}-chart-radar:before { content: $ti-icon-chart-radar; } -.#{$ti-prefix}-chart-sankey:before { content: $ti-icon-chart-sankey; } -.#{$ti-prefix}-chart-treemap:before { content: $ti-icon-chart-treemap; } -.#{$ti-prefix}-check:before { content: $ti-icon-check; } -.#{$ti-prefix}-checkbox:before { content: $ti-icon-checkbox; } -.#{$ti-prefix}-checklist:before { content: $ti-icon-checklist; } -.#{$ti-prefix}-checks:before { content: $ti-icon-checks; } -.#{$ti-prefix}-checkup-list:before { content: $ti-icon-checkup-list; } -.#{$ti-prefix}-cheese:before { content: $ti-icon-cheese; } -.#{$ti-prefix}-chef-hat:before { content: $ti-icon-chef-hat; } -.#{$ti-prefix}-chef-hat-off:before { content: $ti-icon-chef-hat-off; } -.#{$ti-prefix}-cherry:before { content: $ti-icon-cherry; } -.#{$ti-prefix}-cherry-filled:before { content: $ti-icon-cherry-filled; } -.#{$ti-prefix}-chess:before { content: $ti-icon-chess; } -.#{$ti-prefix}-chess-bishop:before { content: $ti-icon-chess-bishop; } -.#{$ti-prefix}-chess-bishop-filled:before { content: $ti-icon-chess-bishop-filled; } -.#{$ti-prefix}-chess-filled:before { content: $ti-icon-chess-filled; } -.#{$ti-prefix}-chess-king:before { content: $ti-icon-chess-king; } -.#{$ti-prefix}-chess-king-filled:before { content: $ti-icon-chess-king-filled; } -.#{$ti-prefix}-chess-knight:before { content: $ti-icon-chess-knight; } -.#{$ti-prefix}-chess-knight-filled:before { content: $ti-icon-chess-knight-filled; } -.#{$ti-prefix}-chess-queen:before { content: $ti-icon-chess-queen; } -.#{$ti-prefix}-chess-queen-filled:before { content: $ti-icon-chess-queen-filled; } -.#{$ti-prefix}-chess-rook:before { content: $ti-icon-chess-rook; } -.#{$ti-prefix}-chess-rook-filled:before { content: $ti-icon-chess-rook-filled; } -.#{$ti-prefix}-chevron-down:before { content: $ti-icon-chevron-down; } -.#{$ti-prefix}-chevron-down-left:before { content: $ti-icon-chevron-down-left; } -.#{$ti-prefix}-chevron-down-right:before { content: $ti-icon-chevron-down-right; } -.#{$ti-prefix}-chevron-left:before { content: $ti-icon-chevron-left; } -.#{$ti-prefix}-chevron-right:before { content: $ti-icon-chevron-right; } -.#{$ti-prefix}-chevron-up:before { content: $ti-icon-chevron-up; } -.#{$ti-prefix}-chevron-up-left:before { content: $ti-icon-chevron-up-left; } -.#{$ti-prefix}-chevron-up-right:before { content: $ti-icon-chevron-up-right; } -.#{$ti-prefix}-chevrons-down:before { content: $ti-icon-chevrons-down; } -.#{$ti-prefix}-chevrons-down-left:before { content: $ti-icon-chevrons-down-left; } -.#{$ti-prefix}-chevrons-down-right:before { content: $ti-icon-chevrons-down-right; } -.#{$ti-prefix}-chevrons-left:before { content: $ti-icon-chevrons-left; } -.#{$ti-prefix}-chevrons-right:before { content: $ti-icon-chevrons-right; } -.#{$ti-prefix}-chevrons-up:before { content: $ti-icon-chevrons-up; } -.#{$ti-prefix}-chevrons-up-left:before { content: $ti-icon-chevrons-up-left; } -.#{$ti-prefix}-chevrons-up-right:before { content: $ti-icon-chevrons-up-right; } -.#{$ti-prefix}-chisel:before { content: $ti-icon-chisel; } -.#{$ti-prefix}-christmas-tree:before { content: $ti-icon-christmas-tree; } -.#{$ti-prefix}-christmas-tree-off:before { content: $ti-icon-christmas-tree-off; } -.#{$ti-prefix}-circle:before { content: $ti-icon-circle; } -.#{$ti-prefix}-circle-0-filled:before { content: $ti-icon-circle-0-filled; } -.#{$ti-prefix}-circle-1-filled:before { content: $ti-icon-circle-1-filled; } -.#{$ti-prefix}-circle-2-filled:before { content: $ti-icon-circle-2-filled; } -.#{$ti-prefix}-circle-3-filled:before { content: $ti-icon-circle-3-filled; } -.#{$ti-prefix}-circle-4-filled:before { content: $ti-icon-circle-4-filled; } -.#{$ti-prefix}-circle-5-filled:before { content: $ti-icon-circle-5-filled; } -.#{$ti-prefix}-circle-6-filled:before { content: $ti-icon-circle-6-filled; } -.#{$ti-prefix}-circle-7-filled:before { content: $ti-icon-circle-7-filled; } -.#{$ti-prefix}-circle-8-filled:before { content: $ti-icon-circle-8-filled; } -.#{$ti-prefix}-circle-9-filled:before { content: $ti-icon-circle-9-filled; } -.#{$ti-prefix}-circle-arrow-down:before { content: $ti-icon-circle-arrow-down; } -.#{$ti-prefix}-circle-arrow-down-filled:before { content: $ti-icon-circle-arrow-down-filled; } -.#{$ti-prefix}-circle-arrow-down-left:before { content: $ti-icon-circle-arrow-down-left; } -.#{$ti-prefix}-circle-arrow-down-left-filled:before { content: $ti-icon-circle-arrow-down-left-filled; } -.#{$ti-prefix}-circle-arrow-down-right:before { content: $ti-icon-circle-arrow-down-right; } -.#{$ti-prefix}-circle-arrow-down-right-filled:before { content: $ti-icon-circle-arrow-down-right-filled; } -.#{$ti-prefix}-circle-arrow-left:before { content: $ti-icon-circle-arrow-left; } -.#{$ti-prefix}-circle-arrow-left-filled:before { content: $ti-icon-circle-arrow-left-filled; } -.#{$ti-prefix}-circle-arrow-right:before { content: $ti-icon-circle-arrow-right; } -.#{$ti-prefix}-circle-arrow-right-filled:before { content: $ti-icon-circle-arrow-right-filled; } -.#{$ti-prefix}-circle-arrow-up:before { content: $ti-icon-circle-arrow-up; } -.#{$ti-prefix}-circle-arrow-up-filled:before { content: $ti-icon-circle-arrow-up-filled; } -.#{$ti-prefix}-circle-arrow-up-left:before { content: $ti-icon-circle-arrow-up-left; } -.#{$ti-prefix}-circle-arrow-up-left-filled:before { content: $ti-icon-circle-arrow-up-left-filled; } -.#{$ti-prefix}-circle-arrow-up-right:before { content: $ti-icon-circle-arrow-up-right; } -.#{$ti-prefix}-circle-arrow-up-right-filled:before { content: $ti-icon-circle-arrow-up-right-filled; } -.#{$ti-prefix}-circle-caret-down:before { content: $ti-icon-circle-caret-down; } -.#{$ti-prefix}-circle-caret-left:before { content: $ti-icon-circle-caret-left; } -.#{$ti-prefix}-circle-caret-right:before { content: $ti-icon-circle-caret-right; } -.#{$ti-prefix}-circle-caret-up:before { content: $ti-icon-circle-caret-up; } -.#{$ti-prefix}-circle-check:before { content: $ti-icon-circle-check; } -.#{$ti-prefix}-circle-check-filled:before { content: $ti-icon-circle-check-filled; } -.#{$ti-prefix}-circle-chevron-down:before { content: $ti-icon-circle-chevron-down; } -.#{$ti-prefix}-circle-chevron-left:before { content: $ti-icon-circle-chevron-left; } -.#{$ti-prefix}-circle-chevron-right:before { content: $ti-icon-circle-chevron-right; } -.#{$ti-prefix}-circle-chevron-up:before { content: $ti-icon-circle-chevron-up; } -.#{$ti-prefix}-circle-chevrons-down:before { content: $ti-icon-circle-chevrons-down; } -.#{$ti-prefix}-circle-chevrons-left:before { content: $ti-icon-circle-chevrons-left; } -.#{$ti-prefix}-circle-chevrons-right:before { content: $ti-icon-circle-chevrons-right; } -.#{$ti-prefix}-circle-chevrons-up:before { content: $ti-icon-circle-chevrons-up; } -.#{$ti-prefix}-circle-dashed:before { content: $ti-icon-circle-dashed; } -.#{$ti-prefix}-circle-dot:before { content: $ti-icon-circle-dot; } -.#{$ti-prefix}-circle-dot-filled:before { content: $ti-icon-circle-dot-filled; } -.#{$ti-prefix}-circle-dotted:before { content: $ti-icon-circle-dotted; } -.#{$ti-prefix}-circle-filled:before { content: $ti-icon-circle-filled; } -.#{$ti-prefix}-circle-half:before { content: $ti-icon-circle-half; } -.#{$ti-prefix}-circle-half-2:before { content: $ti-icon-circle-half-2; } -.#{$ti-prefix}-circle-half-vertical:before { content: $ti-icon-circle-half-vertical; } -.#{$ti-prefix}-circle-key:before { content: $ti-icon-circle-key; } -.#{$ti-prefix}-circle-key-filled:before { content: $ti-icon-circle-key-filled; } -.#{$ti-prefix}-circle-letter-a:before { content: $ti-icon-circle-letter-a; } -.#{$ti-prefix}-circle-letter-b:before { content: $ti-icon-circle-letter-b; } -.#{$ti-prefix}-circle-letter-c:before { content: $ti-icon-circle-letter-c; } -.#{$ti-prefix}-circle-letter-d:before { content: $ti-icon-circle-letter-d; } -.#{$ti-prefix}-circle-letter-e:before { content: $ti-icon-circle-letter-e; } -.#{$ti-prefix}-circle-letter-f:before { content: $ti-icon-circle-letter-f; } -.#{$ti-prefix}-circle-letter-g:before { content: $ti-icon-circle-letter-g; } -.#{$ti-prefix}-circle-letter-h:before { content: $ti-icon-circle-letter-h; } -.#{$ti-prefix}-circle-letter-i:before { content: $ti-icon-circle-letter-i; } -.#{$ti-prefix}-circle-letter-j:before { content: $ti-icon-circle-letter-j; } -.#{$ti-prefix}-circle-letter-k:before { content: $ti-icon-circle-letter-k; } -.#{$ti-prefix}-circle-letter-l:before { content: $ti-icon-circle-letter-l; } -.#{$ti-prefix}-circle-letter-m:before { content: $ti-icon-circle-letter-m; } -.#{$ti-prefix}-circle-letter-n:before { content: $ti-icon-circle-letter-n; } -.#{$ti-prefix}-circle-letter-o:before { content: $ti-icon-circle-letter-o; } -.#{$ti-prefix}-circle-letter-p:before { content: $ti-icon-circle-letter-p; } -.#{$ti-prefix}-circle-letter-q:before { content: $ti-icon-circle-letter-q; } -.#{$ti-prefix}-circle-letter-r:before { content: $ti-icon-circle-letter-r; } -.#{$ti-prefix}-circle-letter-s:before { content: $ti-icon-circle-letter-s; } -.#{$ti-prefix}-circle-letter-t:before { content: $ti-icon-circle-letter-t; } -.#{$ti-prefix}-circle-letter-u:before { content: $ti-icon-circle-letter-u; } -.#{$ti-prefix}-circle-letter-v:before { content: $ti-icon-circle-letter-v; } -.#{$ti-prefix}-circle-letter-w:before { content: $ti-icon-circle-letter-w; } -.#{$ti-prefix}-circle-letter-x:before { content: $ti-icon-circle-letter-x; } -.#{$ti-prefix}-circle-letter-y:before { content: $ti-icon-circle-letter-y; } -.#{$ti-prefix}-circle-letter-z:before { content: $ti-icon-circle-letter-z; } -.#{$ti-prefix}-circle-minus:before { content: $ti-icon-circle-minus; } -.#{$ti-prefix}-circle-number-0:before { content: $ti-icon-circle-number-0; } -.#{$ti-prefix}-circle-number-1:before { content: $ti-icon-circle-number-1; } -.#{$ti-prefix}-circle-number-2:before { content: $ti-icon-circle-number-2; } -.#{$ti-prefix}-circle-number-3:before { content: $ti-icon-circle-number-3; } -.#{$ti-prefix}-circle-number-4:before { content: $ti-icon-circle-number-4; } -.#{$ti-prefix}-circle-number-5:before { content: $ti-icon-circle-number-5; } -.#{$ti-prefix}-circle-number-6:before { content: $ti-icon-circle-number-6; } -.#{$ti-prefix}-circle-number-7:before { content: $ti-icon-circle-number-7; } -.#{$ti-prefix}-circle-number-8:before { content: $ti-icon-circle-number-8; } -.#{$ti-prefix}-circle-number-9:before { content: $ti-icon-circle-number-9; } -.#{$ti-prefix}-circle-off:before { content: $ti-icon-circle-off; } -.#{$ti-prefix}-circle-plus:before { content: $ti-icon-circle-plus; } -.#{$ti-prefix}-circle-rectangle:before { content: $ti-icon-circle-rectangle; } -.#{$ti-prefix}-circle-rectangle-off:before { content: $ti-icon-circle-rectangle-off; } -.#{$ti-prefix}-circle-square:before { content: $ti-icon-circle-square; } -.#{$ti-prefix}-circle-triangle:before { content: $ti-icon-circle-triangle; } -.#{$ti-prefix}-circle-x:before { content: $ti-icon-circle-x; } -.#{$ti-prefix}-circle-x-filled:before { content: $ti-icon-circle-x-filled; } -.#{$ti-prefix}-circles:before { content: $ti-icon-circles; } -.#{$ti-prefix}-circles-filled:before { content: $ti-icon-circles-filled; } -.#{$ti-prefix}-circles-relation:before { content: $ti-icon-circles-relation; } -.#{$ti-prefix}-circuit-ammeter:before { content: $ti-icon-circuit-ammeter; } -.#{$ti-prefix}-circuit-battery:before { content: $ti-icon-circuit-battery; } -.#{$ti-prefix}-circuit-bulb:before { content: $ti-icon-circuit-bulb; } -.#{$ti-prefix}-circuit-capacitor:before { content: $ti-icon-circuit-capacitor; } -.#{$ti-prefix}-circuit-capacitor-polarized:before { content: $ti-icon-circuit-capacitor-polarized; } -.#{$ti-prefix}-circuit-cell:before { content: $ti-icon-circuit-cell; } -.#{$ti-prefix}-circuit-cell-plus:before { content: $ti-icon-circuit-cell-plus; } -.#{$ti-prefix}-circuit-changeover:before { content: $ti-icon-circuit-changeover; } -.#{$ti-prefix}-circuit-diode:before { content: $ti-icon-circuit-diode; } -.#{$ti-prefix}-circuit-diode-zener:before { content: $ti-icon-circuit-diode-zener; } -.#{$ti-prefix}-circuit-ground:before { content: $ti-icon-circuit-ground; } -.#{$ti-prefix}-circuit-ground-digital:before { content: $ti-icon-circuit-ground-digital; } -.#{$ti-prefix}-circuit-inductor:before { content: $ti-icon-circuit-inductor; } -.#{$ti-prefix}-circuit-motor:before { content: $ti-icon-circuit-motor; } -.#{$ti-prefix}-circuit-pushbutton:before { content: $ti-icon-circuit-pushbutton; } -.#{$ti-prefix}-circuit-resistor:before { content: $ti-icon-circuit-resistor; } -.#{$ti-prefix}-circuit-switch-closed:before { content: $ti-icon-circuit-switch-closed; } -.#{$ti-prefix}-circuit-switch-open:before { content: $ti-icon-circuit-switch-open; } -.#{$ti-prefix}-circuit-voltmeter:before { content: $ti-icon-circuit-voltmeter; } -.#{$ti-prefix}-clear-all:before { content: $ti-icon-clear-all; } -.#{$ti-prefix}-clear-formatting:before { content: $ti-icon-clear-formatting; } -.#{$ti-prefix}-click:before { content: $ti-icon-click; } -.#{$ti-prefix}-clipboard:before { content: $ti-icon-clipboard; } -.#{$ti-prefix}-clipboard-check:before { content: $ti-icon-clipboard-check; } -.#{$ti-prefix}-clipboard-copy:before { content: $ti-icon-clipboard-copy; } -.#{$ti-prefix}-clipboard-data:before { content: $ti-icon-clipboard-data; } -.#{$ti-prefix}-clipboard-heart:before { content: $ti-icon-clipboard-heart; } -.#{$ti-prefix}-clipboard-list:before { content: $ti-icon-clipboard-list; } -.#{$ti-prefix}-clipboard-off:before { content: $ti-icon-clipboard-off; } -.#{$ti-prefix}-clipboard-plus:before { content: $ti-icon-clipboard-plus; } -.#{$ti-prefix}-clipboard-text:before { content: $ti-icon-clipboard-text; } -.#{$ti-prefix}-clipboard-typography:before { content: $ti-icon-clipboard-typography; } -.#{$ti-prefix}-clipboard-x:before { content: $ti-icon-clipboard-x; } -.#{$ti-prefix}-clock:before { content: $ti-icon-clock; } -.#{$ti-prefix}-clock-2:before { content: $ti-icon-clock-2; } -.#{$ti-prefix}-clock-bolt:before { content: $ti-icon-clock-bolt; } -.#{$ti-prefix}-clock-cancel:before { content: $ti-icon-clock-cancel; } -.#{$ti-prefix}-clock-check:before { content: $ti-icon-clock-check; } -.#{$ti-prefix}-clock-code:before { content: $ti-icon-clock-code; } -.#{$ti-prefix}-clock-cog:before { content: $ti-icon-clock-cog; } -.#{$ti-prefix}-clock-dollar:before { content: $ti-icon-clock-dollar; } -.#{$ti-prefix}-clock-down:before { content: $ti-icon-clock-down; } -.#{$ti-prefix}-clock-edit:before { content: $ti-icon-clock-edit; } -.#{$ti-prefix}-clock-exclamation:before { content: $ti-icon-clock-exclamation; } -.#{$ti-prefix}-clock-filled:before { content: $ti-icon-clock-filled; } -.#{$ti-prefix}-clock-heart:before { content: $ti-icon-clock-heart; } -.#{$ti-prefix}-clock-hour-1:before { content: $ti-icon-clock-hour-1; } -.#{$ti-prefix}-clock-hour-10:before { content: $ti-icon-clock-hour-10; } -.#{$ti-prefix}-clock-hour-11:before { content: $ti-icon-clock-hour-11; } -.#{$ti-prefix}-clock-hour-12:before { content: $ti-icon-clock-hour-12; } -.#{$ti-prefix}-clock-hour-2:before { content: $ti-icon-clock-hour-2; } -.#{$ti-prefix}-clock-hour-3:before { content: $ti-icon-clock-hour-3; } -.#{$ti-prefix}-clock-hour-4:before { content: $ti-icon-clock-hour-4; } -.#{$ti-prefix}-clock-hour-5:before { content: $ti-icon-clock-hour-5; } -.#{$ti-prefix}-clock-hour-6:before { content: $ti-icon-clock-hour-6; } -.#{$ti-prefix}-clock-hour-7:before { content: $ti-icon-clock-hour-7; } -.#{$ti-prefix}-clock-hour-8:before { content: $ti-icon-clock-hour-8; } -.#{$ti-prefix}-clock-hour-9:before { content: $ti-icon-clock-hour-9; } -.#{$ti-prefix}-clock-minus:before { content: $ti-icon-clock-minus; } -.#{$ti-prefix}-clock-off:before { content: $ti-icon-clock-off; } -.#{$ti-prefix}-clock-pause:before { content: $ti-icon-clock-pause; } -.#{$ti-prefix}-clock-pin:before { content: $ti-icon-clock-pin; } -.#{$ti-prefix}-clock-play:before { content: $ti-icon-clock-play; } -.#{$ti-prefix}-clock-plus:before { content: $ti-icon-clock-plus; } -.#{$ti-prefix}-clock-question:before { content: $ti-icon-clock-question; } -.#{$ti-prefix}-clock-record:before { content: $ti-icon-clock-record; } -.#{$ti-prefix}-clock-search:before { content: $ti-icon-clock-search; } -.#{$ti-prefix}-clock-share:before { content: $ti-icon-clock-share; } -.#{$ti-prefix}-clock-shield:before { content: $ti-icon-clock-shield; } -.#{$ti-prefix}-clock-star:before { content: $ti-icon-clock-star; } -.#{$ti-prefix}-clock-stop:before { content: $ti-icon-clock-stop; } -.#{$ti-prefix}-clock-up:before { content: $ti-icon-clock-up; } -.#{$ti-prefix}-clock-x:before { content: $ti-icon-clock-x; } -.#{$ti-prefix}-clothes-rack:before { content: $ti-icon-clothes-rack; } -.#{$ti-prefix}-clothes-rack-off:before { content: $ti-icon-clothes-rack-off; } -.#{$ti-prefix}-cloud:before { content: $ti-icon-cloud; } -.#{$ti-prefix}-cloud-bolt:before { content: $ti-icon-cloud-bolt; } -.#{$ti-prefix}-cloud-cancel:before { content: $ti-icon-cloud-cancel; } -.#{$ti-prefix}-cloud-check:before { content: $ti-icon-cloud-check; } -.#{$ti-prefix}-cloud-code:before { content: $ti-icon-cloud-code; } -.#{$ti-prefix}-cloud-cog:before { content: $ti-icon-cloud-cog; } -.#{$ti-prefix}-cloud-computing:before { content: $ti-icon-cloud-computing; } -.#{$ti-prefix}-cloud-data-connection:before { content: $ti-icon-cloud-data-connection; } -.#{$ti-prefix}-cloud-dollar:before { content: $ti-icon-cloud-dollar; } -.#{$ti-prefix}-cloud-down:before { content: $ti-icon-cloud-down; } -.#{$ti-prefix}-cloud-download:before { content: $ti-icon-cloud-download; } -.#{$ti-prefix}-cloud-exclamation:before { content: $ti-icon-cloud-exclamation; } -.#{$ti-prefix}-cloud-filled:before { content: $ti-icon-cloud-filled; } -.#{$ti-prefix}-cloud-fog:before { content: $ti-icon-cloud-fog; } -.#{$ti-prefix}-cloud-heart:before { content: $ti-icon-cloud-heart; } -.#{$ti-prefix}-cloud-lock:before { content: $ti-icon-cloud-lock; } -.#{$ti-prefix}-cloud-lock-open:before { content: $ti-icon-cloud-lock-open; } -.#{$ti-prefix}-cloud-minus:before { content: $ti-icon-cloud-minus; } -.#{$ti-prefix}-cloud-off:before { content: $ti-icon-cloud-off; } -.#{$ti-prefix}-cloud-pause:before { content: $ti-icon-cloud-pause; } -.#{$ti-prefix}-cloud-pin:before { content: $ti-icon-cloud-pin; } -.#{$ti-prefix}-cloud-plus:before { content: $ti-icon-cloud-plus; } -.#{$ti-prefix}-cloud-question:before { content: $ti-icon-cloud-question; } -.#{$ti-prefix}-cloud-rain:before { content: $ti-icon-cloud-rain; } -.#{$ti-prefix}-cloud-search:before { content: $ti-icon-cloud-search; } -.#{$ti-prefix}-cloud-share:before { content: $ti-icon-cloud-share; } -.#{$ti-prefix}-cloud-snow:before { content: $ti-icon-cloud-snow; } -.#{$ti-prefix}-cloud-star:before { content: $ti-icon-cloud-star; } -.#{$ti-prefix}-cloud-storm:before { content: $ti-icon-cloud-storm; } -.#{$ti-prefix}-cloud-up:before { content: $ti-icon-cloud-up; } -.#{$ti-prefix}-cloud-upload:before { content: $ti-icon-cloud-upload; } -.#{$ti-prefix}-cloud-x:before { content: $ti-icon-cloud-x; } -.#{$ti-prefix}-clover:before { content: $ti-icon-clover; } -.#{$ti-prefix}-clover-2:before { content: $ti-icon-clover-2; } -.#{$ti-prefix}-clubs:before { content: $ti-icon-clubs; } -.#{$ti-prefix}-clubs-filled:before { content: $ti-icon-clubs-filled; } -.#{$ti-prefix}-code:before { content: $ti-icon-code; } -.#{$ti-prefix}-code-asterix:before { content: $ti-icon-code-asterix; } -.#{$ti-prefix}-code-circle:before { content: $ti-icon-code-circle; } -.#{$ti-prefix}-code-circle-2:before { content: $ti-icon-code-circle-2; } -.#{$ti-prefix}-code-dots:before { content: $ti-icon-code-dots; } -.#{$ti-prefix}-code-minus:before { content: $ti-icon-code-minus; } -.#{$ti-prefix}-code-off:before { content: $ti-icon-code-off; } -.#{$ti-prefix}-code-plus:before { content: $ti-icon-code-plus; } -.#{$ti-prefix}-coffee:before { content: $ti-icon-coffee; } -.#{$ti-prefix}-coffee-off:before { content: $ti-icon-coffee-off; } -.#{$ti-prefix}-coffin:before { content: $ti-icon-coffin; } -.#{$ti-prefix}-coin:before { content: $ti-icon-coin; } -.#{$ti-prefix}-coin-bitcoin:before { content: $ti-icon-coin-bitcoin; } -.#{$ti-prefix}-coin-euro:before { content: $ti-icon-coin-euro; } -.#{$ti-prefix}-coin-monero:before { content: $ti-icon-coin-monero; } -.#{$ti-prefix}-coin-off:before { content: $ti-icon-coin-off; } -.#{$ti-prefix}-coin-pound:before { content: $ti-icon-coin-pound; } -.#{$ti-prefix}-coin-rupee:before { content: $ti-icon-coin-rupee; } -.#{$ti-prefix}-coin-yen:before { content: $ti-icon-coin-yen; } -.#{$ti-prefix}-coin-yuan:before { content: $ti-icon-coin-yuan; } -.#{$ti-prefix}-coins:before { content: $ti-icon-coins; } -.#{$ti-prefix}-color-filter:before { content: $ti-icon-color-filter; } -.#{$ti-prefix}-color-picker:before { content: $ti-icon-color-picker; } -.#{$ti-prefix}-color-picker-off:before { content: $ti-icon-color-picker-off; } -.#{$ti-prefix}-color-swatch:before { content: $ti-icon-color-swatch; } -.#{$ti-prefix}-color-swatch-off:before { content: $ti-icon-color-swatch-off; } -.#{$ti-prefix}-column-insert-left:before { content: $ti-icon-column-insert-left; } -.#{$ti-prefix}-column-insert-right:before { content: $ti-icon-column-insert-right; } -.#{$ti-prefix}-columns:before { content: $ti-icon-columns; } -.#{$ti-prefix}-columns-1:before { content: $ti-icon-columns-1; } -.#{$ti-prefix}-columns-2:before { content: $ti-icon-columns-2; } -.#{$ti-prefix}-columns-3:before { content: $ti-icon-columns-3; } -.#{$ti-prefix}-columns-off:before { content: $ti-icon-columns-off; } -.#{$ti-prefix}-comet:before { content: $ti-icon-comet; } -.#{$ti-prefix}-command:before { content: $ti-icon-command; } -.#{$ti-prefix}-command-off:before { content: $ti-icon-command-off; } -.#{$ti-prefix}-compass:before { content: $ti-icon-compass; } -.#{$ti-prefix}-compass-off:before { content: $ti-icon-compass-off; } -.#{$ti-prefix}-components:before { content: $ti-icon-components; } -.#{$ti-prefix}-components-off:before { content: $ti-icon-components-off; } -.#{$ti-prefix}-cone:before { content: $ti-icon-cone; } -.#{$ti-prefix}-cone-2:before { content: $ti-icon-cone-2; } -.#{$ti-prefix}-cone-off:before { content: $ti-icon-cone-off; } -.#{$ti-prefix}-confetti:before { content: $ti-icon-confetti; } -.#{$ti-prefix}-confetti-off:before { content: $ti-icon-confetti-off; } -.#{$ti-prefix}-confucius:before { content: $ti-icon-confucius; } -.#{$ti-prefix}-container:before { content: $ti-icon-container; } -.#{$ti-prefix}-container-off:before { content: $ti-icon-container-off; } -.#{$ti-prefix}-contrast:before { content: $ti-icon-contrast; } -.#{$ti-prefix}-contrast-2:before { content: $ti-icon-contrast-2; } -.#{$ti-prefix}-contrast-2-off:before { content: $ti-icon-contrast-2-off; } -.#{$ti-prefix}-contrast-off:before { content: $ti-icon-contrast-off; } -.#{$ti-prefix}-cooker:before { content: $ti-icon-cooker; } -.#{$ti-prefix}-cookie:before { content: $ti-icon-cookie; } -.#{$ti-prefix}-cookie-man:before { content: $ti-icon-cookie-man; } -.#{$ti-prefix}-cookie-off:before { content: $ti-icon-cookie-off; } -.#{$ti-prefix}-copy:before { content: $ti-icon-copy; } -.#{$ti-prefix}-copy-off:before { content: $ti-icon-copy-off; } -.#{$ti-prefix}-copyleft:before { content: $ti-icon-copyleft; } -.#{$ti-prefix}-copyleft-filled:before { content: $ti-icon-copyleft-filled; } -.#{$ti-prefix}-copyleft-off:before { content: $ti-icon-copyleft-off; } -.#{$ti-prefix}-copyright:before { content: $ti-icon-copyright; } -.#{$ti-prefix}-copyright-filled:before { content: $ti-icon-copyright-filled; } -.#{$ti-prefix}-copyright-off:before { content: $ti-icon-copyright-off; } -.#{$ti-prefix}-corner-down-left:before { content: $ti-icon-corner-down-left; } -.#{$ti-prefix}-corner-down-left-double:before { content: $ti-icon-corner-down-left-double; } -.#{$ti-prefix}-corner-down-right:before { content: $ti-icon-corner-down-right; } -.#{$ti-prefix}-corner-down-right-double:before { content: $ti-icon-corner-down-right-double; } -.#{$ti-prefix}-corner-left-down:before { content: $ti-icon-corner-left-down; } -.#{$ti-prefix}-corner-left-down-double:before { content: $ti-icon-corner-left-down-double; } -.#{$ti-prefix}-corner-left-up:before { content: $ti-icon-corner-left-up; } -.#{$ti-prefix}-corner-left-up-double:before { content: $ti-icon-corner-left-up-double; } -.#{$ti-prefix}-corner-right-down:before { content: $ti-icon-corner-right-down; } -.#{$ti-prefix}-corner-right-down-double:before { content: $ti-icon-corner-right-down-double; } -.#{$ti-prefix}-corner-right-up:before { content: $ti-icon-corner-right-up; } -.#{$ti-prefix}-corner-right-up-double:before { content: $ti-icon-corner-right-up-double; } -.#{$ti-prefix}-corner-up-left:before { content: $ti-icon-corner-up-left; } -.#{$ti-prefix}-corner-up-left-double:before { content: $ti-icon-corner-up-left-double; } -.#{$ti-prefix}-corner-up-right:before { content: $ti-icon-corner-up-right; } -.#{$ti-prefix}-corner-up-right-double:before { content: $ti-icon-corner-up-right-double; } -.#{$ti-prefix}-cpu:before { content: $ti-icon-cpu; } -.#{$ti-prefix}-cpu-2:before { content: $ti-icon-cpu-2; } -.#{$ti-prefix}-cpu-off:before { content: $ti-icon-cpu-off; } -.#{$ti-prefix}-crane:before { content: $ti-icon-crane; } -.#{$ti-prefix}-crane-off:before { content: $ti-icon-crane-off; } -.#{$ti-prefix}-creative-commons:before { content: $ti-icon-creative-commons; } -.#{$ti-prefix}-creative-commons-by:before { content: $ti-icon-creative-commons-by; } -.#{$ti-prefix}-creative-commons-nc:before { content: $ti-icon-creative-commons-nc; } -.#{$ti-prefix}-creative-commons-nd:before { content: $ti-icon-creative-commons-nd; } -.#{$ti-prefix}-creative-commons-off:before { content: $ti-icon-creative-commons-off; } -.#{$ti-prefix}-creative-commons-sa:before { content: $ti-icon-creative-commons-sa; } -.#{$ti-prefix}-creative-commons-zero:before { content: $ti-icon-creative-commons-zero; } -.#{$ti-prefix}-credit-card:before { content: $ti-icon-credit-card; } -.#{$ti-prefix}-credit-card-off:before { content: $ti-icon-credit-card-off; } -.#{$ti-prefix}-cricket:before { content: $ti-icon-cricket; } -.#{$ti-prefix}-crop:before { content: $ti-icon-crop; } -.#{$ti-prefix}-cross:before { content: $ti-icon-cross; } -.#{$ti-prefix}-cross-filled:before { content: $ti-icon-cross-filled; } -.#{$ti-prefix}-cross-off:before { content: $ti-icon-cross-off; } -.#{$ti-prefix}-crosshair:before { content: $ti-icon-crosshair; } -.#{$ti-prefix}-crown:before { content: $ti-icon-crown; } -.#{$ti-prefix}-crown-off:before { content: $ti-icon-crown-off; } -.#{$ti-prefix}-crutches:before { content: $ti-icon-crutches; } -.#{$ti-prefix}-crutches-off:before { content: $ti-icon-crutches-off; } -.#{$ti-prefix}-crystal-ball:before { content: $ti-icon-crystal-ball; } -.#{$ti-prefix}-csv:before { content: $ti-icon-csv; } -.#{$ti-prefix}-cube-send:before { content: $ti-icon-cube-send; } -.#{$ti-prefix}-cube-unfolded:before { content: $ti-icon-cube-unfolded; } -.#{$ti-prefix}-cup:before { content: $ti-icon-cup; } -.#{$ti-prefix}-cup-off:before { content: $ti-icon-cup-off; } -.#{$ti-prefix}-curling:before { content: $ti-icon-curling; } -.#{$ti-prefix}-curly-loop:before { content: $ti-icon-curly-loop; } -.#{$ti-prefix}-currency:before { content: $ti-icon-currency; } -.#{$ti-prefix}-currency-afghani:before { content: $ti-icon-currency-afghani; } -.#{$ti-prefix}-currency-bahraini:before { content: $ti-icon-currency-bahraini; } -.#{$ti-prefix}-currency-baht:before { content: $ti-icon-currency-baht; } -.#{$ti-prefix}-currency-bitcoin:before { content: $ti-icon-currency-bitcoin; } -.#{$ti-prefix}-currency-cent:before { content: $ti-icon-currency-cent; } -.#{$ti-prefix}-currency-dinar:before { content: $ti-icon-currency-dinar; } -.#{$ti-prefix}-currency-dirham:before { content: $ti-icon-currency-dirham; } -.#{$ti-prefix}-currency-dogecoin:before { content: $ti-icon-currency-dogecoin; } -.#{$ti-prefix}-currency-dollar:before { content: $ti-icon-currency-dollar; } -.#{$ti-prefix}-currency-dollar-australian:before { content: $ti-icon-currency-dollar-australian; } -.#{$ti-prefix}-currency-dollar-brunei:before { content: $ti-icon-currency-dollar-brunei; } -.#{$ti-prefix}-currency-dollar-canadian:before { content: $ti-icon-currency-dollar-canadian; } -.#{$ti-prefix}-currency-dollar-guyanese:before { content: $ti-icon-currency-dollar-guyanese; } -.#{$ti-prefix}-currency-dollar-off:before { content: $ti-icon-currency-dollar-off; } -.#{$ti-prefix}-currency-dollar-singapore:before { content: $ti-icon-currency-dollar-singapore; } -.#{$ti-prefix}-currency-dollar-zimbabwean:before { content: $ti-icon-currency-dollar-zimbabwean; } -.#{$ti-prefix}-currency-dong:before { content: $ti-icon-currency-dong; } -.#{$ti-prefix}-currency-dram:before { content: $ti-icon-currency-dram; } -.#{$ti-prefix}-currency-ethereum:before { content: $ti-icon-currency-ethereum; } -.#{$ti-prefix}-currency-euro:before { content: $ti-icon-currency-euro; } -.#{$ti-prefix}-currency-euro-off:before { content: $ti-icon-currency-euro-off; } -.#{$ti-prefix}-currency-forint:before { content: $ti-icon-currency-forint; } -.#{$ti-prefix}-currency-frank:before { content: $ti-icon-currency-frank; } -.#{$ti-prefix}-currency-guarani:before { content: $ti-icon-currency-guarani; } -.#{$ti-prefix}-currency-hryvnia:before { content: $ti-icon-currency-hryvnia; } -.#{$ti-prefix}-currency-kip:before { content: $ti-icon-currency-kip; } -.#{$ti-prefix}-currency-krone-czech:before { content: $ti-icon-currency-krone-czech; } -.#{$ti-prefix}-currency-krone-danish:before { content: $ti-icon-currency-krone-danish; } -.#{$ti-prefix}-currency-krone-swedish:before { content: $ti-icon-currency-krone-swedish; } -.#{$ti-prefix}-currency-lari:before { content: $ti-icon-currency-lari; } -.#{$ti-prefix}-currency-leu:before { content: $ti-icon-currency-leu; } -.#{$ti-prefix}-currency-lira:before { content: $ti-icon-currency-lira; } -.#{$ti-prefix}-currency-litecoin:before { content: $ti-icon-currency-litecoin; } -.#{$ti-prefix}-currency-lyd:before { content: $ti-icon-currency-lyd; } -.#{$ti-prefix}-currency-manat:before { content: $ti-icon-currency-manat; } -.#{$ti-prefix}-currency-monero:before { content: $ti-icon-currency-monero; } -.#{$ti-prefix}-currency-naira:before { content: $ti-icon-currency-naira; } -.#{$ti-prefix}-currency-nano:before { content: $ti-icon-currency-nano; } -.#{$ti-prefix}-currency-off:before { content: $ti-icon-currency-off; } -.#{$ti-prefix}-currency-paanga:before { content: $ti-icon-currency-paanga; } -.#{$ti-prefix}-currency-peso:before { content: $ti-icon-currency-peso; } -.#{$ti-prefix}-currency-pound:before { content: $ti-icon-currency-pound; } -.#{$ti-prefix}-currency-pound-off:before { content: $ti-icon-currency-pound-off; } -.#{$ti-prefix}-currency-quetzal:before { content: $ti-icon-currency-quetzal; } -.#{$ti-prefix}-currency-real:before { content: $ti-icon-currency-real; } -.#{$ti-prefix}-currency-renminbi:before { content: $ti-icon-currency-renminbi; } -.#{$ti-prefix}-currency-ripple:before { content: $ti-icon-currency-ripple; } -.#{$ti-prefix}-currency-riyal:before { content: $ti-icon-currency-riyal; } -.#{$ti-prefix}-currency-rubel:before { content: $ti-icon-currency-rubel; } -.#{$ti-prefix}-currency-rufiyaa:before { content: $ti-icon-currency-rufiyaa; } -.#{$ti-prefix}-currency-rupee:before { content: $ti-icon-currency-rupee; } -.#{$ti-prefix}-currency-rupee-nepalese:before { content: $ti-icon-currency-rupee-nepalese; } -.#{$ti-prefix}-currency-shekel:before { content: $ti-icon-currency-shekel; } -.#{$ti-prefix}-currency-solana:before { content: $ti-icon-currency-solana; } -.#{$ti-prefix}-currency-som:before { content: $ti-icon-currency-som; } -.#{$ti-prefix}-currency-taka:before { content: $ti-icon-currency-taka; } -.#{$ti-prefix}-currency-tenge:before { content: $ti-icon-currency-tenge; } -.#{$ti-prefix}-currency-tugrik:before { content: $ti-icon-currency-tugrik; } -.#{$ti-prefix}-currency-won:before { content: $ti-icon-currency-won; } -.#{$ti-prefix}-currency-yen:before { content: $ti-icon-currency-yen; } -.#{$ti-prefix}-currency-yen-off:before { content: $ti-icon-currency-yen-off; } -.#{$ti-prefix}-currency-yuan:before { content: $ti-icon-currency-yuan; } -.#{$ti-prefix}-currency-zloty:before { content: $ti-icon-currency-zloty; } -.#{$ti-prefix}-current-location:before { content: $ti-icon-current-location; } -.#{$ti-prefix}-current-location-off:before { content: $ti-icon-current-location-off; } -.#{$ti-prefix}-cursor-off:before { content: $ti-icon-cursor-off; } -.#{$ti-prefix}-cursor-text:before { content: $ti-icon-cursor-text; } -.#{$ti-prefix}-cut:before { content: $ti-icon-cut; } -.#{$ti-prefix}-cylinder:before { content: $ti-icon-cylinder; } -.#{$ti-prefix}-dashboard:before { content: $ti-icon-dashboard; } -.#{$ti-prefix}-dashboard-off:before { content: $ti-icon-dashboard-off; } -.#{$ti-prefix}-database:before { content: $ti-icon-database; } -.#{$ti-prefix}-database-export:before { content: $ti-icon-database-export; } -.#{$ti-prefix}-database-import:before { content: $ti-icon-database-import; } -.#{$ti-prefix}-database-off:before { content: $ti-icon-database-off; } -.#{$ti-prefix}-deer:before { content: $ti-icon-deer; } -.#{$ti-prefix}-delta:before { content: $ti-icon-delta; } -.#{$ti-prefix}-dental:before { content: $ti-icon-dental; } -.#{$ti-prefix}-dental-broken:before { content: $ti-icon-dental-broken; } -.#{$ti-prefix}-dental-off:before { content: $ti-icon-dental-off; } -.#{$ti-prefix}-deselect:before { content: $ti-icon-deselect; } -.#{$ti-prefix}-details:before { content: $ti-icon-details; } -.#{$ti-prefix}-details-off:before { content: $ti-icon-details-off; } -.#{$ti-prefix}-device-airpods:before { content: $ti-icon-device-airpods; } -.#{$ti-prefix}-device-airpods-case:before { content: $ti-icon-device-airpods-case; } -.#{$ti-prefix}-device-analytics:before { content: $ti-icon-device-analytics; } -.#{$ti-prefix}-device-audio-tape:before { content: $ti-icon-device-audio-tape; } -.#{$ti-prefix}-device-camera-phone:before { content: $ti-icon-device-camera-phone; } -.#{$ti-prefix}-device-cctv:before { content: $ti-icon-device-cctv; } -.#{$ti-prefix}-device-cctv-off:before { content: $ti-icon-device-cctv-off; } -.#{$ti-prefix}-device-computer-camera:before { content: $ti-icon-device-computer-camera; } -.#{$ti-prefix}-device-computer-camera-off:before { content: $ti-icon-device-computer-camera-off; } -.#{$ti-prefix}-device-desktop:before { content: $ti-icon-device-desktop; } -.#{$ti-prefix}-device-desktop-analytics:before { content: $ti-icon-device-desktop-analytics; } -.#{$ti-prefix}-device-desktop-bolt:before { content: $ti-icon-device-desktop-bolt; } -.#{$ti-prefix}-device-desktop-cancel:before { content: $ti-icon-device-desktop-cancel; } -.#{$ti-prefix}-device-desktop-check:before { content: $ti-icon-device-desktop-check; } -.#{$ti-prefix}-device-desktop-code:before { content: $ti-icon-device-desktop-code; } -.#{$ti-prefix}-device-desktop-cog:before { content: $ti-icon-device-desktop-cog; } -.#{$ti-prefix}-device-desktop-dollar:before { content: $ti-icon-device-desktop-dollar; } -.#{$ti-prefix}-device-desktop-down:before { content: $ti-icon-device-desktop-down; } -.#{$ti-prefix}-device-desktop-exclamation:before { content: $ti-icon-device-desktop-exclamation; } -.#{$ti-prefix}-device-desktop-heart:before { content: $ti-icon-device-desktop-heart; } -.#{$ti-prefix}-device-desktop-minus:before { content: $ti-icon-device-desktop-minus; } -.#{$ti-prefix}-device-desktop-off:before { content: $ti-icon-device-desktop-off; } -.#{$ti-prefix}-device-desktop-pause:before { content: $ti-icon-device-desktop-pause; } -.#{$ti-prefix}-device-desktop-pin:before { content: $ti-icon-device-desktop-pin; } -.#{$ti-prefix}-device-desktop-plus:before { content: $ti-icon-device-desktop-plus; } -.#{$ti-prefix}-device-desktop-question:before { content: $ti-icon-device-desktop-question; } -.#{$ti-prefix}-device-desktop-search:before { content: $ti-icon-device-desktop-search; } -.#{$ti-prefix}-device-desktop-share:before { content: $ti-icon-device-desktop-share; } -.#{$ti-prefix}-device-desktop-star:before { content: $ti-icon-device-desktop-star; } -.#{$ti-prefix}-device-desktop-up:before { content: $ti-icon-device-desktop-up; } -.#{$ti-prefix}-device-desktop-x:before { content: $ti-icon-device-desktop-x; } -.#{$ti-prefix}-device-floppy:before { content: $ti-icon-device-floppy; } -.#{$ti-prefix}-device-gamepad:before { content: $ti-icon-device-gamepad; } -.#{$ti-prefix}-device-gamepad-2:before { content: $ti-icon-device-gamepad-2; } -.#{$ti-prefix}-device-heart-monitor:before { content: $ti-icon-device-heart-monitor; } -.#{$ti-prefix}-device-imac:before { content: $ti-icon-device-imac; } -.#{$ti-prefix}-device-imac-bolt:before { content: $ti-icon-device-imac-bolt; } -.#{$ti-prefix}-device-imac-cancel:before { content: $ti-icon-device-imac-cancel; } -.#{$ti-prefix}-device-imac-check:before { content: $ti-icon-device-imac-check; } -.#{$ti-prefix}-device-imac-code:before { content: $ti-icon-device-imac-code; } -.#{$ti-prefix}-device-imac-cog:before { content: $ti-icon-device-imac-cog; } -.#{$ti-prefix}-device-imac-dollar:before { content: $ti-icon-device-imac-dollar; } -.#{$ti-prefix}-device-imac-down:before { content: $ti-icon-device-imac-down; } -.#{$ti-prefix}-device-imac-exclamation:before { content: $ti-icon-device-imac-exclamation; } -.#{$ti-prefix}-device-imac-heart:before { content: $ti-icon-device-imac-heart; } -.#{$ti-prefix}-device-imac-minus:before { content: $ti-icon-device-imac-minus; } -.#{$ti-prefix}-device-imac-off:before { content: $ti-icon-device-imac-off; } -.#{$ti-prefix}-device-imac-pause:before { content: $ti-icon-device-imac-pause; } -.#{$ti-prefix}-device-imac-pin:before { content: $ti-icon-device-imac-pin; } -.#{$ti-prefix}-device-imac-plus:before { content: $ti-icon-device-imac-plus; } -.#{$ti-prefix}-device-imac-question:before { content: $ti-icon-device-imac-question; } -.#{$ti-prefix}-device-imac-search:before { content: $ti-icon-device-imac-search; } -.#{$ti-prefix}-device-imac-share:before { content: $ti-icon-device-imac-share; } -.#{$ti-prefix}-device-imac-star:before { content: $ti-icon-device-imac-star; } -.#{$ti-prefix}-device-imac-up:before { content: $ti-icon-device-imac-up; } -.#{$ti-prefix}-device-imac-x:before { content: $ti-icon-device-imac-x; } -.#{$ti-prefix}-device-ipad:before { content: $ti-icon-device-ipad; } -.#{$ti-prefix}-device-ipad-bolt:before { content: $ti-icon-device-ipad-bolt; } -.#{$ti-prefix}-device-ipad-cancel:before { content: $ti-icon-device-ipad-cancel; } -.#{$ti-prefix}-device-ipad-check:before { content: $ti-icon-device-ipad-check; } -.#{$ti-prefix}-device-ipad-code:before { content: $ti-icon-device-ipad-code; } -.#{$ti-prefix}-device-ipad-cog:before { content: $ti-icon-device-ipad-cog; } -.#{$ti-prefix}-device-ipad-dollar:before { content: $ti-icon-device-ipad-dollar; } -.#{$ti-prefix}-device-ipad-down:before { content: $ti-icon-device-ipad-down; } -.#{$ti-prefix}-device-ipad-exclamation:before { content: $ti-icon-device-ipad-exclamation; } -.#{$ti-prefix}-device-ipad-heart:before { content: $ti-icon-device-ipad-heart; } -.#{$ti-prefix}-device-ipad-horizontal:before { content: $ti-icon-device-ipad-horizontal; } -.#{$ti-prefix}-device-ipad-horizontal-bolt:before { content: $ti-icon-device-ipad-horizontal-bolt; } -.#{$ti-prefix}-device-ipad-horizontal-cancel:before { content: $ti-icon-device-ipad-horizontal-cancel; } -.#{$ti-prefix}-device-ipad-horizontal-check:before { content: $ti-icon-device-ipad-horizontal-check; } -.#{$ti-prefix}-device-ipad-horizontal-code:before { content: $ti-icon-device-ipad-horizontal-code; } -.#{$ti-prefix}-device-ipad-horizontal-cog:before { content: $ti-icon-device-ipad-horizontal-cog; } -.#{$ti-prefix}-device-ipad-horizontal-dollar:before { content: $ti-icon-device-ipad-horizontal-dollar; } -.#{$ti-prefix}-device-ipad-horizontal-down:before { content: $ti-icon-device-ipad-horizontal-down; } -.#{$ti-prefix}-device-ipad-horizontal-exclamation:before { content: $ti-icon-device-ipad-horizontal-exclamation; } -.#{$ti-prefix}-device-ipad-horizontal-heart:before { content: $ti-icon-device-ipad-horizontal-heart; } -.#{$ti-prefix}-device-ipad-horizontal-minus:before { content: $ti-icon-device-ipad-horizontal-minus; } -.#{$ti-prefix}-device-ipad-horizontal-off:before { content: $ti-icon-device-ipad-horizontal-off; } -.#{$ti-prefix}-device-ipad-horizontal-pause:before { content: $ti-icon-device-ipad-horizontal-pause; } -.#{$ti-prefix}-device-ipad-horizontal-pin:before { content: $ti-icon-device-ipad-horizontal-pin; } -.#{$ti-prefix}-device-ipad-horizontal-plus:before { content: $ti-icon-device-ipad-horizontal-plus; } -.#{$ti-prefix}-device-ipad-horizontal-question:before { content: $ti-icon-device-ipad-horizontal-question; } -.#{$ti-prefix}-device-ipad-horizontal-search:before { content: $ti-icon-device-ipad-horizontal-search; } -.#{$ti-prefix}-device-ipad-horizontal-share:before { content: $ti-icon-device-ipad-horizontal-share; } -.#{$ti-prefix}-device-ipad-horizontal-star:before { content: $ti-icon-device-ipad-horizontal-star; } -.#{$ti-prefix}-device-ipad-horizontal-up:before { content: $ti-icon-device-ipad-horizontal-up; } -.#{$ti-prefix}-device-ipad-horizontal-x:before { content: $ti-icon-device-ipad-horizontal-x; } -.#{$ti-prefix}-device-ipad-minus:before { content: $ti-icon-device-ipad-minus; } -.#{$ti-prefix}-device-ipad-off:before { content: $ti-icon-device-ipad-off; } -.#{$ti-prefix}-device-ipad-pause:before { content: $ti-icon-device-ipad-pause; } -.#{$ti-prefix}-device-ipad-pin:before { content: $ti-icon-device-ipad-pin; } -.#{$ti-prefix}-device-ipad-plus:before { content: $ti-icon-device-ipad-plus; } -.#{$ti-prefix}-device-ipad-question:before { content: $ti-icon-device-ipad-question; } -.#{$ti-prefix}-device-ipad-search:before { content: $ti-icon-device-ipad-search; } -.#{$ti-prefix}-device-ipad-share:before { content: $ti-icon-device-ipad-share; } -.#{$ti-prefix}-device-ipad-star:before { content: $ti-icon-device-ipad-star; } -.#{$ti-prefix}-device-ipad-up:before { content: $ti-icon-device-ipad-up; } -.#{$ti-prefix}-device-ipad-x:before { content: $ti-icon-device-ipad-x; } -.#{$ti-prefix}-device-landline-phone:before { content: $ti-icon-device-landline-phone; } -.#{$ti-prefix}-device-laptop:before { content: $ti-icon-device-laptop; } -.#{$ti-prefix}-device-laptop-off:before { content: $ti-icon-device-laptop-off; } -.#{$ti-prefix}-device-mobile:before { content: $ti-icon-device-mobile; } -.#{$ti-prefix}-device-mobile-bolt:before { content: $ti-icon-device-mobile-bolt; } -.#{$ti-prefix}-device-mobile-cancel:before { content: $ti-icon-device-mobile-cancel; } -.#{$ti-prefix}-device-mobile-charging:before { content: $ti-icon-device-mobile-charging; } -.#{$ti-prefix}-device-mobile-check:before { content: $ti-icon-device-mobile-check; } -.#{$ti-prefix}-device-mobile-code:before { content: $ti-icon-device-mobile-code; } -.#{$ti-prefix}-device-mobile-cog:before { content: $ti-icon-device-mobile-cog; } -.#{$ti-prefix}-device-mobile-dollar:before { content: $ti-icon-device-mobile-dollar; } -.#{$ti-prefix}-device-mobile-down:before { content: $ti-icon-device-mobile-down; } -.#{$ti-prefix}-device-mobile-exclamation:before { content: $ti-icon-device-mobile-exclamation; } -.#{$ti-prefix}-device-mobile-heart:before { content: $ti-icon-device-mobile-heart; } -.#{$ti-prefix}-device-mobile-message:before { content: $ti-icon-device-mobile-message; } -.#{$ti-prefix}-device-mobile-minus:before { content: $ti-icon-device-mobile-minus; } -.#{$ti-prefix}-device-mobile-off:before { content: $ti-icon-device-mobile-off; } -.#{$ti-prefix}-device-mobile-pause:before { content: $ti-icon-device-mobile-pause; } -.#{$ti-prefix}-device-mobile-pin:before { content: $ti-icon-device-mobile-pin; } -.#{$ti-prefix}-device-mobile-plus:before { content: $ti-icon-device-mobile-plus; } -.#{$ti-prefix}-device-mobile-question:before { content: $ti-icon-device-mobile-question; } -.#{$ti-prefix}-device-mobile-rotated:before { content: $ti-icon-device-mobile-rotated; } -.#{$ti-prefix}-device-mobile-search:before { content: $ti-icon-device-mobile-search; } -.#{$ti-prefix}-device-mobile-share:before { content: $ti-icon-device-mobile-share; } -.#{$ti-prefix}-device-mobile-star:before { content: $ti-icon-device-mobile-star; } -.#{$ti-prefix}-device-mobile-up:before { content: $ti-icon-device-mobile-up; } -.#{$ti-prefix}-device-mobile-vibration:before { content: $ti-icon-device-mobile-vibration; } -.#{$ti-prefix}-device-mobile-x:before { content: $ti-icon-device-mobile-x; } -.#{$ti-prefix}-device-nintendo:before { content: $ti-icon-device-nintendo; } -.#{$ti-prefix}-device-nintendo-off:before { content: $ti-icon-device-nintendo-off; } -.#{$ti-prefix}-device-remote:before { content: $ti-icon-device-remote; } -.#{$ti-prefix}-device-sd-card:before { content: $ti-icon-device-sd-card; } -.#{$ti-prefix}-device-sim:before { content: $ti-icon-device-sim; } -.#{$ti-prefix}-device-sim-1:before { content: $ti-icon-device-sim-1; } -.#{$ti-prefix}-device-sim-2:before { content: $ti-icon-device-sim-2; } -.#{$ti-prefix}-device-sim-3:before { content: $ti-icon-device-sim-3; } -.#{$ti-prefix}-device-speaker:before { content: $ti-icon-device-speaker; } -.#{$ti-prefix}-device-speaker-off:before { content: $ti-icon-device-speaker-off; } -.#{$ti-prefix}-device-tablet:before { content: $ti-icon-device-tablet; } -.#{$ti-prefix}-device-tablet-bolt:before { content: $ti-icon-device-tablet-bolt; } -.#{$ti-prefix}-device-tablet-cancel:before { content: $ti-icon-device-tablet-cancel; } -.#{$ti-prefix}-device-tablet-check:before { content: $ti-icon-device-tablet-check; } -.#{$ti-prefix}-device-tablet-code:before { content: $ti-icon-device-tablet-code; } -.#{$ti-prefix}-device-tablet-cog:before { content: $ti-icon-device-tablet-cog; } -.#{$ti-prefix}-device-tablet-dollar:before { content: $ti-icon-device-tablet-dollar; } -.#{$ti-prefix}-device-tablet-down:before { content: $ti-icon-device-tablet-down; } -.#{$ti-prefix}-device-tablet-exclamation:before { content: $ti-icon-device-tablet-exclamation; } -.#{$ti-prefix}-device-tablet-heart:before { content: $ti-icon-device-tablet-heart; } -.#{$ti-prefix}-device-tablet-minus:before { content: $ti-icon-device-tablet-minus; } -.#{$ti-prefix}-device-tablet-off:before { content: $ti-icon-device-tablet-off; } -.#{$ti-prefix}-device-tablet-pause:before { content: $ti-icon-device-tablet-pause; } -.#{$ti-prefix}-device-tablet-pin:before { content: $ti-icon-device-tablet-pin; } -.#{$ti-prefix}-device-tablet-plus:before { content: $ti-icon-device-tablet-plus; } -.#{$ti-prefix}-device-tablet-question:before { content: $ti-icon-device-tablet-question; } -.#{$ti-prefix}-device-tablet-search:before { content: $ti-icon-device-tablet-search; } -.#{$ti-prefix}-device-tablet-share:before { content: $ti-icon-device-tablet-share; } -.#{$ti-prefix}-device-tablet-star:before { content: $ti-icon-device-tablet-star; } -.#{$ti-prefix}-device-tablet-up:before { content: $ti-icon-device-tablet-up; } -.#{$ti-prefix}-device-tablet-x:before { content: $ti-icon-device-tablet-x; } -.#{$ti-prefix}-device-tv:before { content: $ti-icon-device-tv; } -.#{$ti-prefix}-device-tv-off:before { content: $ti-icon-device-tv-off; } -.#{$ti-prefix}-device-tv-old:before { content: $ti-icon-device-tv-old; } -.#{$ti-prefix}-device-watch:before { content: $ti-icon-device-watch; } -.#{$ti-prefix}-device-watch-bolt:before { content: $ti-icon-device-watch-bolt; } -.#{$ti-prefix}-device-watch-cancel:before { content: $ti-icon-device-watch-cancel; } -.#{$ti-prefix}-device-watch-check:before { content: $ti-icon-device-watch-check; } -.#{$ti-prefix}-device-watch-code:before { content: $ti-icon-device-watch-code; } -.#{$ti-prefix}-device-watch-cog:before { content: $ti-icon-device-watch-cog; } -.#{$ti-prefix}-device-watch-dollar:before { content: $ti-icon-device-watch-dollar; } -.#{$ti-prefix}-device-watch-down:before { content: $ti-icon-device-watch-down; } -.#{$ti-prefix}-device-watch-exclamation:before { content: $ti-icon-device-watch-exclamation; } -.#{$ti-prefix}-device-watch-heart:before { content: $ti-icon-device-watch-heart; } -.#{$ti-prefix}-device-watch-minus:before { content: $ti-icon-device-watch-minus; } -.#{$ti-prefix}-device-watch-off:before { content: $ti-icon-device-watch-off; } -.#{$ti-prefix}-device-watch-pause:before { content: $ti-icon-device-watch-pause; } -.#{$ti-prefix}-device-watch-pin:before { content: $ti-icon-device-watch-pin; } -.#{$ti-prefix}-device-watch-plus:before { content: $ti-icon-device-watch-plus; } -.#{$ti-prefix}-device-watch-question:before { content: $ti-icon-device-watch-question; } -.#{$ti-prefix}-device-watch-search:before { content: $ti-icon-device-watch-search; } -.#{$ti-prefix}-device-watch-share:before { content: $ti-icon-device-watch-share; } -.#{$ti-prefix}-device-watch-star:before { content: $ti-icon-device-watch-star; } -.#{$ti-prefix}-device-watch-stats:before { content: $ti-icon-device-watch-stats; } -.#{$ti-prefix}-device-watch-stats-2:before { content: $ti-icon-device-watch-stats-2; } -.#{$ti-prefix}-device-watch-up:before { content: $ti-icon-device-watch-up; } -.#{$ti-prefix}-device-watch-x:before { content: $ti-icon-device-watch-x; } -.#{$ti-prefix}-devices:before { content: $ti-icon-devices; } -.#{$ti-prefix}-devices-2:before { content: $ti-icon-devices-2; } -.#{$ti-prefix}-devices-bolt:before { content: $ti-icon-devices-bolt; } -.#{$ti-prefix}-devices-cancel:before { content: $ti-icon-devices-cancel; } -.#{$ti-prefix}-devices-check:before { content: $ti-icon-devices-check; } -.#{$ti-prefix}-devices-code:before { content: $ti-icon-devices-code; } -.#{$ti-prefix}-devices-cog:before { content: $ti-icon-devices-cog; } -.#{$ti-prefix}-devices-dollar:before { content: $ti-icon-devices-dollar; } -.#{$ti-prefix}-devices-down:before { content: $ti-icon-devices-down; } -.#{$ti-prefix}-devices-exclamation:before { content: $ti-icon-devices-exclamation; } -.#{$ti-prefix}-devices-heart:before { content: $ti-icon-devices-heart; } -.#{$ti-prefix}-devices-minus:before { content: $ti-icon-devices-minus; } -.#{$ti-prefix}-devices-off:before { content: $ti-icon-devices-off; } -.#{$ti-prefix}-devices-pause:before { content: $ti-icon-devices-pause; } -.#{$ti-prefix}-devices-pc:before { content: $ti-icon-devices-pc; } -.#{$ti-prefix}-devices-pc-off:before { content: $ti-icon-devices-pc-off; } -.#{$ti-prefix}-devices-pin:before { content: $ti-icon-devices-pin; } -.#{$ti-prefix}-devices-plus:before { content: $ti-icon-devices-plus; } -.#{$ti-prefix}-devices-question:before { content: $ti-icon-devices-question; } -.#{$ti-prefix}-devices-search:before { content: $ti-icon-devices-search; } -.#{$ti-prefix}-devices-share:before { content: $ti-icon-devices-share; } -.#{$ti-prefix}-devices-star:before { content: $ti-icon-devices-star; } -.#{$ti-prefix}-devices-up:before { content: $ti-icon-devices-up; } -.#{$ti-prefix}-devices-x:before { content: $ti-icon-devices-x; } -.#{$ti-prefix}-dialpad:before { content: $ti-icon-dialpad; } -.#{$ti-prefix}-dialpad-off:before { content: $ti-icon-dialpad-off; } -.#{$ti-prefix}-diamond:before { content: $ti-icon-diamond; } -.#{$ti-prefix}-diamond-filled:before { content: $ti-icon-diamond-filled; } -.#{$ti-prefix}-diamond-off:before { content: $ti-icon-diamond-off; } -.#{$ti-prefix}-diamonds:before { content: $ti-icon-diamonds; } -.#{$ti-prefix}-diamonds-filled:before { content: $ti-icon-diamonds-filled; } -.#{$ti-prefix}-dice:before { content: $ti-icon-dice; } -.#{$ti-prefix}-dice-1:before { content: $ti-icon-dice-1; } -.#{$ti-prefix}-dice-1-filled:before { content: $ti-icon-dice-1-filled; } -.#{$ti-prefix}-dice-2:before { content: $ti-icon-dice-2; } -.#{$ti-prefix}-dice-2-filled:before { content: $ti-icon-dice-2-filled; } -.#{$ti-prefix}-dice-3:before { content: $ti-icon-dice-3; } -.#{$ti-prefix}-dice-3-filled:before { content: $ti-icon-dice-3-filled; } -.#{$ti-prefix}-dice-4:before { content: $ti-icon-dice-4; } -.#{$ti-prefix}-dice-4-filled:before { content: $ti-icon-dice-4-filled; } -.#{$ti-prefix}-dice-5:before { content: $ti-icon-dice-5; } -.#{$ti-prefix}-dice-5-filled:before { content: $ti-icon-dice-5-filled; } -.#{$ti-prefix}-dice-6:before { content: $ti-icon-dice-6; } -.#{$ti-prefix}-dice-6-filled:before { content: $ti-icon-dice-6-filled; } -.#{$ti-prefix}-dice-filled:before { content: $ti-icon-dice-filled; } -.#{$ti-prefix}-dimensions:before { content: $ti-icon-dimensions; } -.#{$ti-prefix}-direction:before { content: $ti-icon-direction; } -.#{$ti-prefix}-direction-horizontal:before { content: $ti-icon-direction-horizontal; } -.#{$ti-prefix}-direction-sign:before { content: $ti-icon-direction-sign; } -.#{$ti-prefix}-direction-sign-filled:before { content: $ti-icon-direction-sign-filled; } -.#{$ti-prefix}-direction-sign-off:before { content: $ti-icon-direction-sign-off; } -.#{$ti-prefix}-directions:before { content: $ti-icon-directions; } -.#{$ti-prefix}-directions-off:before { content: $ti-icon-directions-off; } -.#{$ti-prefix}-disabled:before { content: $ti-icon-disabled; } -.#{$ti-prefix}-disabled-2:before { content: $ti-icon-disabled-2; } -.#{$ti-prefix}-disabled-off:before { content: $ti-icon-disabled-off; } -.#{$ti-prefix}-disc:before { content: $ti-icon-disc; } -.#{$ti-prefix}-disc-golf:before { content: $ti-icon-disc-golf; } -.#{$ti-prefix}-disc-off:before { content: $ti-icon-disc-off; } -.#{$ti-prefix}-discount:before { content: $ti-icon-discount; } -.#{$ti-prefix}-discount-2:before { content: $ti-icon-discount-2; } -.#{$ti-prefix}-discount-2-off:before { content: $ti-icon-discount-2-off; } -.#{$ti-prefix}-discount-check:before { content: $ti-icon-discount-check; } -.#{$ti-prefix}-discount-check-filled:before { content: $ti-icon-discount-check-filled; } -.#{$ti-prefix}-discount-off:before { content: $ti-icon-discount-off; } -.#{$ti-prefix}-divide:before { content: $ti-icon-divide; } -.#{$ti-prefix}-dna:before { content: $ti-icon-dna; } -.#{$ti-prefix}-dna-2:before { content: $ti-icon-dna-2; } -.#{$ti-prefix}-dna-2-off:before { content: $ti-icon-dna-2-off; } -.#{$ti-prefix}-dna-off:before { content: $ti-icon-dna-off; } -.#{$ti-prefix}-dog:before { content: $ti-icon-dog; } -.#{$ti-prefix}-dog-bowl:before { content: $ti-icon-dog-bowl; } -.#{$ti-prefix}-door:before { content: $ti-icon-door; } -.#{$ti-prefix}-door-enter:before { content: $ti-icon-door-enter; } -.#{$ti-prefix}-door-exit:before { content: $ti-icon-door-exit; } -.#{$ti-prefix}-door-off:before { content: $ti-icon-door-off; } -.#{$ti-prefix}-dots:before { content: $ti-icon-dots; } -.#{$ti-prefix}-dots-circle-horizontal:before { content: $ti-icon-dots-circle-horizontal; } -.#{$ti-prefix}-dots-diagonal:before { content: $ti-icon-dots-diagonal; } -.#{$ti-prefix}-dots-diagonal-2:before { content: $ti-icon-dots-diagonal-2; } -.#{$ti-prefix}-dots-vertical:before { content: $ti-icon-dots-vertical; } -.#{$ti-prefix}-download:before { content: $ti-icon-download; } -.#{$ti-prefix}-download-off:before { content: $ti-icon-download-off; } -.#{$ti-prefix}-drag-drop:before { content: $ti-icon-drag-drop; } -.#{$ti-prefix}-drag-drop-2:before { content: $ti-icon-drag-drop-2; } -.#{$ti-prefix}-drone:before { content: $ti-icon-drone; } -.#{$ti-prefix}-drone-off:before { content: $ti-icon-drone-off; } -.#{$ti-prefix}-drop-circle:before { content: $ti-icon-drop-circle; } -.#{$ti-prefix}-droplet:before { content: $ti-icon-droplet; } -.#{$ti-prefix}-droplet-bolt:before { content: $ti-icon-droplet-bolt; } -.#{$ti-prefix}-droplet-cancel:before { content: $ti-icon-droplet-cancel; } -.#{$ti-prefix}-droplet-check:before { content: $ti-icon-droplet-check; } -.#{$ti-prefix}-droplet-code:before { content: $ti-icon-droplet-code; } -.#{$ti-prefix}-droplet-cog:before { content: $ti-icon-droplet-cog; } -.#{$ti-prefix}-droplet-dollar:before { content: $ti-icon-droplet-dollar; } -.#{$ti-prefix}-droplet-down:before { content: $ti-icon-droplet-down; } -.#{$ti-prefix}-droplet-exclamation:before { content: $ti-icon-droplet-exclamation; } -.#{$ti-prefix}-droplet-filled:before { content: $ti-icon-droplet-filled; } -.#{$ti-prefix}-droplet-filled-2:before { content: $ti-icon-droplet-filled-2; } -.#{$ti-prefix}-droplet-half:before { content: $ti-icon-droplet-half; } -.#{$ti-prefix}-droplet-half-2:before { content: $ti-icon-droplet-half-2; } -.#{$ti-prefix}-droplet-half-filled:before { content: $ti-icon-droplet-half-filled; } -.#{$ti-prefix}-droplet-heart:before { content: $ti-icon-droplet-heart; } -.#{$ti-prefix}-droplet-minus:before { content: $ti-icon-droplet-minus; } -.#{$ti-prefix}-droplet-off:before { content: $ti-icon-droplet-off; } -.#{$ti-prefix}-droplet-pause:before { content: $ti-icon-droplet-pause; } -.#{$ti-prefix}-droplet-pin:before { content: $ti-icon-droplet-pin; } -.#{$ti-prefix}-droplet-plus:before { content: $ti-icon-droplet-plus; } -.#{$ti-prefix}-droplet-question:before { content: $ti-icon-droplet-question; } -.#{$ti-prefix}-droplet-search:before { content: $ti-icon-droplet-search; } -.#{$ti-prefix}-droplet-share:before { content: $ti-icon-droplet-share; } -.#{$ti-prefix}-droplet-star:before { content: $ti-icon-droplet-star; } -.#{$ti-prefix}-droplet-up:before { content: $ti-icon-droplet-up; } -.#{$ti-prefix}-droplet-x:before { content: $ti-icon-droplet-x; } -.#{$ti-prefix}-e-passport:before { content: $ti-icon-e-passport; } -.#{$ti-prefix}-ear:before { content: $ti-icon-ear; } -.#{$ti-prefix}-ear-off:before { content: $ti-icon-ear-off; } -.#{$ti-prefix}-ease-in:before { content: $ti-icon-ease-in; } -.#{$ti-prefix}-ease-in-control-point:before { content: $ti-icon-ease-in-control-point; } -.#{$ti-prefix}-ease-in-out:before { content: $ti-icon-ease-in-out; } -.#{$ti-prefix}-ease-in-out-control-points:before { content: $ti-icon-ease-in-out-control-points; } -.#{$ti-prefix}-ease-out:before { content: $ti-icon-ease-out; } -.#{$ti-prefix}-ease-out-control-point:before { content: $ti-icon-ease-out-control-point; } -.#{$ti-prefix}-edit:before { content: $ti-icon-edit; } -.#{$ti-prefix}-edit-circle:before { content: $ti-icon-edit-circle; } -.#{$ti-prefix}-edit-circle-off:before { content: $ti-icon-edit-circle-off; } -.#{$ti-prefix}-edit-off:before { content: $ti-icon-edit-off; } -.#{$ti-prefix}-egg:before { content: $ti-icon-egg; } -.#{$ti-prefix}-egg-cracked:before { content: $ti-icon-egg-cracked; } -.#{$ti-prefix}-egg-filled:before { content: $ti-icon-egg-filled; } -.#{$ti-prefix}-egg-fried:before { content: $ti-icon-egg-fried; } -.#{$ti-prefix}-egg-off:before { content: $ti-icon-egg-off; } -.#{$ti-prefix}-eggs:before { content: $ti-icon-eggs; } -.#{$ti-prefix}-elevator:before { content: $ti-icon-elevator; } -.#{$ti-prefix}-elevator-off:before { content: $ti-icon-elevator-off; } -.#{$ti-prefix}-emergency-bed:before { content: $ti-icon-emergency-bed; } -.#{$ti-prefix}-empathize:before { content: $ti-icon-empathize; } -.#{$ti-prefix}-empathize-off:before { content: $ti-icon-empathize-off; } -.#{$ti-prefix}-emphasis:before { content: $ti-icon-emphasis; } -.#{$ti-prefix}-engine:before { content: $ti-icon-engine; } -.#{$ti-prefix}-engine-off:before { content: $ti-icon-engine-off; } -.#{$ti-prefix}-equal:before { content: $ti-icon-equal; } -.#{$ti-prefix}-equal-double:before { content: $ti-icon-equal-double; } -.#{$ti-prefix}-equal-not:before { content: $ti-icon-equal-not; } -.#{$ti-prefix}-eraser:before { content: $ti-icon-eraser; } -.#{$ti-prefix}-eraser-off:before { content: $ti-icon-eraser-off; } -.#{$ti-prefix}-error-404:before { content: $ti-icon-error-404; } -.#{$ti-prefix}-error-404-off:before { content: $ti-icon-error-404-off; } -.#{$ti-prefix}-exchange:before { content: $ti-icon-exchange; } -.#{$ti-prefix}-exchange-off:before { content: $ti-icon-exchange-off; } -.#{$ti-prefix}-exclamation-circle:before { content: $ti-icon-exclamation-circle; } -.#{$ti-prefix}-exclamation-mark:before { content: $ti-icon-exclamation-mark; } -.#{$ti-prefix}-exclamation-mark-off:before { content: $ti-icon-exclamation-mark-off; } -.#{$ti-prefix}-explicit:before { content: $ti-icon-explicit; } -.#{$ti-prefix}-explicit-off:before { content: $ti-icon-explicit-off; } -.#{$ti-prefix}-exposure:before { content: $ti-icon-exposure; } -.#{$ti-prefix}-exposure-0:before { content: $ti-icon-exposure-0; } -.#{$ti-prefix}-exposure-minus-1:before { content: $ti-icon-exposure-minus-1; } -.#{$ti-prefix}-exposure-minus-2:before { content: $ti-icon-exposure-minus-2; } -.#{$ti-prefix}-exposure-off:before { content: $ti-icon-exposure-off; } -.#{$ti-prefix}-exposure-plus-1:before { content: $ti-icon-exposure-plus-1; } -.#{$ti-prefix}-exposure-plus-2:before { content: $ti-icon-exposure-plus-2; } -.#{$ti-prefix}-external-link:before { content: $ti-icon-external-link; } -.#{$ti-prefix}-external-link-off:before { content: $ti-icon-external-link-off; } -.#{$ti-prefix}-eye:before { content: $ti-icon-eye; } -.#{$ti-prefix}-eye-check:before { content: $ti-icon-eye-check; } -.#{$ti-prefix}-eye-closed:before { content: $ti-icon-eye-closed; } -.#{$ti-prefix}-eye-cog:before { content: $ti-icon-eye-cog; } -.#{$ti-prefix}-eye-edit:before { content: $ti-icon-eye-edit; } -.#{$ti-prefix}-eye-exclamation:before { content: $ti-icon-eye-exclamation; } -.#{$ti-prefix}-eye-filled:before { content: $ti-icon-eye-filled; } -.#{$ti-prefix}-eye-heart:before { content: $ti-icon-eye-heart; } -.#{$ti-prefix}-eye-off:before { content: $ti-icon-eye-off; } -.#{$ti-prefix}-eye-table:before { content: $ti-icon-eye-table; } -.#{$ti-prefix}-eye-x:before { content: $ti-icon-eye-x; } -.#{$ti-prefix}-eyeglass:before { content: $ti-icon-eyeglass; } -.#{$ti-prefix}-eyeglass-2:before { content: $ti-icon-eyeglass-2; } -.#{$ti-prefix}-eyeglass-off:before { content: $ti-icon-eyeglass-off; } -.#{$ti-prefix}-face-id:before { content: $ti-icon-face-id; } -.#{$ti-prefix}-face-id-error:before { content: $ti-icon-face-id-error; } -.#{$ti-prefix}-face-mask:before { content: $ti-icon-face-mask; } -.#{$ti-prefix}-face-mask-off:before { content: $ti-icon-face-mask-off; } -.#{$ti-prefix}-fall:before { content: $ti-icon-fall; } -.#{$ti-prefix}-feather:before { content: $ti-icon-feather; } -.#{$ti-prefix}-feather-off:before { content: $ti-icon-feather-off; } -.#{$ti-prefix}-fence:before { content: $ti-icon-fence; } -.#{$ti-prefix}-fence-off:before { content: $ti-icon-fence-off; } -.#{$ti-prefix}-fidget-spinner:before { content: $ti-icon-fidget-spinner; } -.#{$ti-prefix}-file:before { content: $ti-icon-file; } -.#{$ti-prefix}-file-3d:before { content: $ti-icon-file-3d; } -.#{$ti-prefix}-file-alert:before { content: $ti-icon-file-alert; } -.#{$ti-prefix}-file-analytics:before { content: $ti-icon-file-analytics; } -.#{$ti-prefix}-file-arrow-left:before { content: $ti-icon-file-arrow-left; } -.#{$ti-prefix}-file-arrow-right:before { content: $ti-icon-file-arrow-right; } -.#{$ti-prefix}-file-barcode:before { content: $ti-icon-file-barcode; } -.#{$ti-prefix}-file-broken:before { content: $ti-icon-file-broken; } -.#{$ti-prefix}-file-certificate:before { content: $ti-icon-file-certificate; } -.#{$ti-prefix}-file-chart:before { content: $ti-icon-file-chart; } -.#{$ti-prefix}-file-check:before { content: $ti-icon-file-check; } -.#{$ti-prefix}-file-code:before { content: $ti-icon-file-code; } -.#{$ti-prefix}-file-code-2:before { content: $ti-icon-file-code-2; } -.#{$ti-prefix}-file-database:before { content: $ti-icon-file-database; } -.#{$ti-prefix}-file-delta:before { content: $ti-icon-file-delta; } -.#{$ti-prefix}-file-description:before { content: $ti-icon-file-description; } -.#{$ti-prefix}-file-diff:before { content: $ti-icon-file-diff; } -.#{$ti-prefix}-file-digit:before { content: $ti-icon-file-digit; } -.#{$ti-prefix}-file-dislike:before { content: $ti-icon-file-dislike; } -.#{$ti-prefix}-file-dollar:before { content: $ti-icon-file-dollar; } -.#{$ti-prefix}-file-dots:before { content: $ti-icon-file-dots; } -.#{$ti-prefix}-file-download:before { content: $ti-icon-file-download; } -.#{$ti-prefix}-file-euro:before { content: $ti-icon-file-euro; } -.#{$ti-prefix}-file-export:before { content: $ti-icon-file-export; } -.#{$ti-prefix}-file-filled:before { content: $ti-icon-file-filled; } -.#{$ti-prefix}-file-function:before { content: $ti-icon-file-function; } -.#{$ti-prefix}-file-horizontal:before { content: $ti-icon-file-horizontal; } -.#{$ti-prefix}-file-import:before { content: $ti-icon-file-import; } -.#{$ti-prefix}-file-infinity:before { content: $ti-icon-file-infinity; } -.#{$ti-prefix}-file-info:before { content: $ti-icon-file-info; } -.#{$ti-prefix}-file-invoice:before { content: $ti-icon-file-invoice; } -.#{$ti-prefix}-file-lambda:before { content: $ti-icon-file-lambda; } -.#{$ti-prefix}-file-like:before { content: $ti-icon-file-like; } -.#{$ti-prefix}-file-minus:before { content: $ti-icon-file-minus; } -.#{$ti-prefix}-file-music:before { content: $ti-icon-file-music; } -.#{$ti-prefix}-file-off:before { content: $ti-icon-file-off; } -.#{$ti-prefix}-file-orientation:before { content: $ti-icon-file-orientation; } -.#{$ti-prefix}-file-pencil:before { content: $ti-icon-file-pencil; } -.#{$ti-prefix}-file-percent:before { content: $ti-icon-file-percent; } -.#{$ti-prefix}-file-phone:before { content: $ti-icon-file-phone; } -.#{$ti-prefix}-file-plus:before { content: $ti-icon-file-plus; } -.#{$ti-prefix}-file-power:before { content: $ti-icon-file-power; } -.#{$ti-prefix}-file-report:before { content: $ti-icon-file-report; } -.#{$ti-prefix}-file-rss:before { content: $ti-icon-file-rss; } -.#{$ti-prefix}-file-scissors:before { content: $ti-icon-file-scissors; } -.#{$ti-prefix}-file-search:before { content: $ti-icon-file-search; } -.#{$ti-prefix}-file-settings:before { content: $ti-icon-file-settings; } -.#{$ti-prefix}-file-shredder:before { content: $ti-icon-file-shredder; } -.#{$ti-prefix}-file-signal:before { content: $ti-icon-file-signal; } -.#{$ti-prefix}-file-spreadsheet:before { content: $ti-icon-file-spreadsheet; } -.#{$ti-prefix}-file-stack:before { content: $ti-icon-file-stack; } -.#{$ti-prefix}-file-star:before { content: $ti-icon-file-star; } -.#{$ti-prefix}-file-symlink:before { content: $ti-icon-file-symlink; } -.#{$ti-prefix}-file-text:before { content: $ti-icon-file-text; } -.#{$ti-prefix}-file-time:before { content: $ti-icon-file-time; } -.#{$ti-prefix}-file-typography:before { content: $ti-icon-file-typography; } -.#{$ti-prefix}-file-unknown:before { content: $ti-icon-file-unknown; } -.#{$ti-prefix}-file-upload:before { content: $ti-icon-file-upload; } -.#{$ti-prefix}-file-vector:before { content: $ti-icon-file-vector; } -.#{$ti-prefix}-file-x:before { content: $ti-icon-file-x; } -.#{$ti-prefix}-file-x-filled:before { content: $ti-icon-file-x-filled; } -.#{$ti-prefix}-file-zip:before { content: $ti-icon-file-zip; } -.#{$ti-prefix}-files:before { content: $ti-icon-files; } -.#{$ti-prefix}-files-off:before { content: $ti-icon-files-off; } -.#{$ti-prefix}-filter:before { content: $ti-icon-filter; } -.#{$ti-prefix}-filter-off:before { content: $ti-icon-filter-off; } -.#{$ti-prefix}-filters:before { content: $ti-icon-filters; } -.#{$ti-prefix}-fingerprint:before { content: $ti-icon-fingerprint; } -.#{$ti-prefix}-fingerprint-off:before { content: $ti-icon-fingerprint-off; } -.#{$ti-prefix}-fire-hydrant:before { content: $ti-icon-fire-hydrant; } -.#{$ti-prefix}-fire-hydrant-off:before { content: $ti-icon-fire-hydrant-off; } -.#{$ti-prefix}-firetruck:before { content: $ti-icon-firetruck; } -.#{$ti-prefix}-first-aid-kit:before { content: $ti-icon-first-aid-kit; } -.#{$ti-prefix}-first-aid-kit-off:before { content: $ti-icon-first-aid-kit-off; } -.#{$ti-prefix}-fish:before { content: $ti-icon-fish; } -.#{$ti-prefix}-fish-bone:before { content: $ti-icon-fish-bone; } -.#{$ti-prefix}-fish-christianity:before { content: $ti-icon-fish-christianity; } -.#{$ti-prefix}-fish-hook:before { content: $ti-icon-fish-hook; } -.#{$ti-prefix}-fish-hook-off:before { content: $ti-icon-fish-hook-off; } -.#{$ti-prefix}-fish-off:before { content: $ti-icon-fish-off; } -.#{$ti-prefix}-flag:before { content: $ti-icon-flag; } -.#{$ti-prefix}-flag-2:before { content: $ti-icon-flag-2; } -.#{$ti-prefix}-flag-2-filled:before { content: $ti-icon-flag-2-filled; } -.#{$ti-prefix}-flag-2-off:before { content: $ti-icon-flag-2-off; } -.#{$ti-prefix}-flag-3:before { content: $ti-icon-flag-3; } -.#{$ti-prefix}-flag-3-filled:before { content: $ti-icon-flag-3-filled; } -.#{$ti-prefix}-flag-filled:before { content: $ti-icon-flag-filled; } -.#{$ti-prefix}-flag-off:before { content: $ti-icon-flag-off; } -.#{$ti-prefix}-flame:before { content: $ti-icon-flame; } -.#{$ti-prefix}-flame-off:before { content: $ti-icon-flame-off; } -.#{$ti-prefix}-flare:before { content: $ti-icon-flare; } -.#{$ti-prefix}-flask:before { content: $ti-icon-flask; } -.#{$ti-prefix}-flask-2:before { content: $ti-icon-flask-2; } -.#{$ti-prefix}-flask-2-off:before { content: $ti-icon-flask-2-off; } -.#{$ti-prefix}-flask-off:before { content: $ti-icon-flask-off; } -.#{$ti-prefix}-flip-flops:before { content: $ti-icon-flip-flops; } -.#{$ti-prefix}-flip-horizontal:before { content: $ti-icon-flip-horizontal; } -.#{$ti-prefix}-flip-vertical:before { content: $ti-icon-flip-vertical; } -.#{$ti-prefix}-float-center:before { content: $ti-icon-float-center; } -.#{$ti-prefix}-float-left:before { content: $ti-icon-float-left; } -.#{$ti-prefix}-float-none:before { content: $ti-icon-float-none; } -.#{$ti-prefix}-float-right:before { content: $ti-icon-float-right; } -.#{$ti-prefix}-flower:before { content: $ti-icon-flower; } -.#{$ti-prefix}-flower-off:before { content: $ti-icon-flower-off; } -.#{$ti-prefix}-focus:before { content: $ti-icon-focus; } -.#{$ti-prefix}-focus-2:before { content: $ti-icon-focus-2; } -.#{$ti-prefix}-focus-centered:before { content: $ti-icon-focus-centered; } -.#{$ti-prefix}-fold:before { content: $ti-icon-fold; } -.#{$ti-prefix}-fold-down:before { content: $ti-icon-fold-down; } -.#{$ti-prefix}-fold-up:before { content: $ti-icon-fold-up; } -.#{$ti-prefix}-folder:before { content: $ti-icon-folder; } -.#{$ti-prefix}-folder-bolt:before { content: $ti-icon-folder-bolt; } -.#{$ti-prefix}-folder-cancel:before { content: $ti-icon-folder-cancel; } -.#{$ti-prefix}-folder-check:before { content: $ti-icon-folder-check; } -.#{$ti-prefix}-folder-code:before { content: $ti-icon-folder-code; } -.#{$ti-prefix}-folder-cog:before { content: $ti-icon-folder-cog; } -.#{$ti-prefix}-folder-dollar:before { content: $ti-icon-folder-dollar; } -.#{$ti-prefix}-folder-down:before { content: $ti-icon-folder-down; } -.#{$ti-prefix}-folder-exclamation:before { content: $ti-icon-folder-exclamation; } -.#{$ti-prefix}-folder-filled:before { content: $ti-icon-folder-filled; } -.#{$ti-prefix}-folder-heart:before { content: $ti-icon-folder-heart; } -.#{$ti-prefix}-folder-minus:before { content: $ti-icon-folder-minus; } -.#{$ti-prefix}-folder-off:before { content: $ti-icon-folder-off; } -.#{$ti-prefix}-folder-pause:before { content: $ti-icon-folder-pause; } -.#{$ti-prefix}-folder-pin:before { content: $ti-icon-folder-pin; } -.#{$ti-prefix}-folder-plus:before { content: $ti-icon-folder-plus; } -.#{$ti-prefix}-folder-question:before { content: $ti-icon-folder-question; } -.#{$ti-prefix}-folder-search:before { content: $ti-icon-folder-search; } -.#{$ti-prefix}-folder-share:before { content: $ti-icon-folder-share; } -.#{$ti-prefix}-folder-star:before { content: $ti-icon-folder-star; } -.#{$ti-prefix}-folder-symlink:before { content: $ti-icon-folder-symlink; } -.#{$ti-prefix}-folder-up:before { content: $ti-icon-folder-up; } -.#{$ti-prefix}-folder-x:before { content: $ti-icon-folder-x; } -.#{$ti-prefix}-folders:before { content: $ti-icon-folders; } -.#{$ti-prefix}-folders-off:before { content: $ti-icon-folders-off; } -.#{$ti-prefix}-forbid:before { content: $ti-icon-forbid; } -.#{$ti-prefix}-forbid-2:before { content: $ti-icon-forbid-2; } -.#{$ti-prefix}-forklift:before { content: $ti-icon-forklift; } -.#{$ti-prefix}-forms:before { content: $ti-icon-forms; } -.#{$ti-prefix}-fountain:before { content: $ti-icon-fountain; } -.#{$ti-prefix}-fountain-off:before { content: $ti-icon-fountain-off; } -.#{$ti-prefix}-frame:before { content: $ti-icon-frame; } -.#{$ti-prefix}-frame-off:before { content: $ti-icon-frame-off; } -.#{$ti-prefix}-free-rights:before { content: $ti-icon-free-rights; } -.#{$ti-prefix}-fridge:before { content: $ti-icon-fridge; } -.#{$ti-prefix}-fridge-off:before { content: $ti-icon-fridge-off; } -.#{$ti-prefix}-friends:before { content: $ti-icon-friends; } -.#{$ti-prefix}-friends-off:before { content: $ti-icon-friends-off; } -.#{$ti-prefix}-function:before { content: $ti-icon-function; } -.#{$ti-prefix}-function-off:before { content: $ti-icon-function-off; } -.#{$ti-prefix}-garden-cart:before { content: $ti-icon-garden-cart; } -.#{$ti-prefix}-garden-cart-off:before { content: $ti-icon-garden-cart-off; } -.#{$ti-prefix}-gas-station:before { content: $ti-icon-gas-station; } -.#{$ti-prefix}-gas-station-off:before { content: $ti-icon-gas-station-off; } -.#{$ti-prefix}-gauge:before { content: $ti-icon-gauge; } -.#{$ti-prefix}-gauge-off:before { content: $ti-icon-gauge-off; } -.#{$ti-prefix}-gavel:before { content: $ti-icon-gavel; } -.#{$ti-prefix}-gender-agender:before { content: $ti-icon-gender-agender; } -.#{$ti-prefix}-gender-androgyne:before { content: $ti-icon-gender-androgyne; } -.#{$ti-prefix}-gender-bigender:before { content: $ti-icon-gender-bigender; } -.#{$ti-prefix}-gender-demiboy:before { content: $ti-icon-gender-demiboy; } -.#{$ti-prefix}-gender-demigirl:before { content: $ti-icon-gender-demigirl; } -.#{$ti-prefix}-gender-epicene:before { content: $ti-icon-gender-epicene; } -.#{$ti-prefix}-gender-female:before { content: $ti-icon-gender-female; } -.#{$ti-prefix}-gender-femme:before { content: $ti-icon-gender-femme; } -.#{$ti-prefix}-gender-genderfluid:before { content: $ti-icon-gender-genderfluid; } -.#{$ti-prefix}-gender-genderless:before { content: $ti-icon-gender-genderless; } -.#{$ti-prefix}-gender-genderqueer:before { content: $ti-icon-gender-genderqueer; } -.#{$ti-prefix}-gender-hermaphrodite:before { content: $ti-icon-gender-hermaphrodite; } -.#{$ti-prefix}-gender-intergender:before { content: $ti-icon-gender-intergender; } -.#{$ti-prefix}-gender-male:before { content: $ti-icon-gender-male; } -.#{$ti-prefix}-gender-neutrois:before { content: $ti-icon-gender-neutrois; } -.#{$ti-prefix}-gender-third:before { content: $ti-icon-gender-third; } -.#{$ti-prefix}-gender-transgender:before { content: $ti-icon-gender-transgender; } -.#{$ti-prefix}-gender-trasvesti:before { content: $ti-icon-gender-trasvesti; } -.#{$ti-prefix}-geometry:before { content: $ti-icon-geometry; } -.#{$ti-prefix}-ghost:before { content: $ti-icon-ghost; } -.#{$ti-prefix}-ghost-2:before { content: $ti-icon-ghost-2; } -.#{$ti-prefix}-ghost-2-filled:before { content: $ti-icon-ghost-2-filled; } -.#{$ti-prefix}-ghost-filled:before { content: $ti-icon-ghost-filled; } -.#{$ti-prefix}-ghost-off:before { content: $ti-icon-ghost-off; } -.#{$ti-prefix}-gif:before { content: $ti-icon-gif; } -.#{$ti-prefix}-gift:before { content: $ti-icon-gift; } -.#{$ti-prefix}-gift-card:before { content: $ti-icon-gift-card; } -.#{$ti-prefix}-gift-off:before { content: $ti-icon-gift-off; } -.#{$ti-prefix}-git-branch:before { content: $ti-icon-git-branch; } -.#{$ti-prefix}-git-branch-deleted:before { content: $ti-icon-git-branch-deleted; } -.#{$ti-prefix}-git-cherry-pick:before { content: $ti-icon-git-cherry-pick; } -.#{$ti-prefix}-git-commit:before { content: $ti-icon-git-commit; } -.#{$ti-prefix}-git-compare:before { content: $ti-icon-git-compare; } -.#{$ti-prefix}-git-fork:before { content: $ti-icon-git-fork; } -.#{$ti-prefix}-git-merge:before { content: $ti-icon-git-merge; } -.#{$ti-prefix}-git-pull-request:before { content: $ti-icon-git-pull-request; } -.#{$ti-prefix}-git-pull-request-closed:before { content: $ti-icon-git-pull-request-closed; } -.#{$ti-prefix}-git-pull-request-draft:before { content: $ti-icon-git-pull-request-draft; } -.#{$ti-prefix}-gizmo:before { content: $ti-icon-gizmo; } -.#{$ti-prefix}-glass:before { content: $ti-icon-glass; } -.#{$ti-prefix}-glass-full:before { content: $ti-icon-glass-full; } -.#{$ti-prefix}-glass-off:before { content: $ti-icon-glass-off; } -.#{$ti-prefix}-globe:before { content: $ti-icon-globe; } -.#{$ti-prefix}-globe-off:before { content: $ti-icon-globe-off; } -.#{$ti-prefix}-go-game:before { content: $ti-icon-go-game; } -.#{$ti-prefix}-golf:before { content: $ti-icon-golf; } -.#{$ti-prefix}-golf-off:before { content: $ti-icon-golf-off; } -.#{$ti-prefix}-gps:before { content: $ti-icon-gps; } -.#{$ti-prefix}-gradienter:before { content: $ti-icon-gradienter; } -.#{$ti-prefix}-grain:before { content: $ti-icon-grain; } -.#{$ti-prefix}-graph:before { content: $ti-icon-graph; } -.#{$ti-prefix}-graph-off:before { content: $ti-icon-graph-off; } -.#{$ti-prefix}-grave:before { content: $ti-icon-grave; } -.#{$ti-prefix}-grave-2:before { content: $ti-icon-grave-2; } -.#{$ti-prefix}-grid-dots:before { content: $ti-icon-grid-dots; } -.#{$ti-prefix}-grid-pattern:before { content: $ti-icon-grid-pattern; } -.#{$ti-prefix}-grill:before { content: $ti-icon-grill; } -.#{$ti-prefix}-grill-fork:before { content: $ti-icon-grill-fork; } -.#{$ti-prefix}-grill-off:before { content: $ti-icon-grill-off; } -.#{$ti-prefix}-grill-spatula:before { content: $ti-icon-grill-spatula; } -.#{$ti-prefix}-grip-horizontal:before { content: $ti-icon-grip-horizontal; } -.#{$ti-prefix}-grip-vertical:before { content: $ti-icon-grip-vertical; } -.#{$ti-prefix}-growth:before { content: $ti-icon-growth; } -.#{$ti-prefix}-guitar-pick:before { content: $ti-icon-guitar-pick; } -.#{$ti-prefix}-guitar-pick-filled:before { content: $ti-icon-guitar-pick-filled; } -.#{$ti-prefix}-h-1:before { content: $ti-icon-h-1; } -.#{$ti-prefix}-h-2:before { content: $ti-icon-h-2; } -.#{$ti-prefix}-h-3:before { content: $ti-icon-h-3; } -.#{$ti-prefix}-h-4:before { content: $ti-icon-h-4; } -.#{$ti-prefix}-h-5:before { content: $ti-icon-h-5; } -.#{$ti-prefix}-h-6:before { content: $ti-icon-h-6; } -.#{$ti-prefix}-hammer:before { content: $ti-icon-hammer; } -.#{$ti-prefix}-hammer-off:before { content: $ti-icon-hammer-off; } -.#{$ti-prefix}-hand-click:before { content: $ti-icon-hand-click; } -.#{$ti-prefix}-hand-finger:before { content: $ti-icon-hand-finger; } -.#{$ti-prefix}-hand-finger-off:before { content: $ti-icon-hand-finger-off; } -.#{$ti-prefix}-hand-grab:before { content: $ti-icon-hand-grab; } -.#{$ti-prefix}-hand-little-finger:before { content: $ti-icon-hand-little-finger; } -.#{$ti-prefix}-hand-middle-finger:before { content: $ti-icon-hand-middle-finger; } -.#{$ti-prefix}-hand-move:before { content: $ti-icon-hand-move; } -.#{$ti-prefix}-hand-off:before { content: $ti-icon-hand-off; } -.#{$ti-prefix}-hand-ring-finger:before { content: $ti-icon-hand-ring-finger; } -.#{$ti-prefix}-hand-rock:before { content: $ti-icon-hand-rock; } -.#{$ti-prefix}-hand-sanitizer:before { content: $ti-icon-hand-sanitizer; } -.#{$ti-prefix}-hand-stop:before { content: $ti-icon-hand-stop; } -.#{$ti-prefix}-hand-three-fingers:before { content: $ti-icon-hand-three-fingers; } -.#{$ti-prefix}-hand-two-fingers:before { content: $ti-icon-hand-two-fingers; } -.#{$ti-prefix}-hanger:before { content: $ti-icon-hanger; } -.#{$ti-prefix}-hanger-2:before { content: $ti-icon-hanger-2; } -.#{$ti-prefix}-hanger-off:before { content: $ti-icon-hanger-off; } -.#{$ti-prefix}-hash:before { content: $ti-icon-hash; } -.#{$ti-prefix}-haze:before { content: $ti-icon-haze; } -.#{$ti-prefix}-heading:before { content: $ti-icon-heading; } -.#{$ti-prefix}-heading-off:before { content: $ti-icon-heading-off; } -.#{$ti-prefix}-headphones:before { content: $ti-icon-headphones; } -.#{$ti-prefix}-headphones-off:before { content: $ti-icon-headphones-off; } -.#{$ti-prefix}-headset:before { content: $ti-icon-headset; } -.#{$ti-prefix}-headset-off:before { content: $ti-icon-headset-off; } -.#{$ti-prefix}-health-recognition:before { content: $ti-icon-health-recognition; } -.#{$ti-prefix}-heart:before { content: $ti-icon-heart; } -.#{$ti-prefix}-heart-broken:before { content: $ti-icon-heart-broken; } -.#{$ti-prefix}-heart-filled:before { content: $ti-icon-heart-filled; } -.#{$ti-prefix}-heart-handshake:before { content: $ti-icon-heart-handshake; } -.#{$ti-prefix}-heart-minus:before { content: $ti-icon-heart-minus; } -.#{$ti-prefix}-heart-off:before { content: $ti-icon-heart-off; } -.#{$ti-prefix}-heart-plus:before { content: $ti-icon-heart-plus; } -.#{$ti-prefix}-heart-rate-monitor:before { content: $ti-icon-heart-rate-monitor; } -.#{$ti-prefix}-heartbeat:before { content: $ti-icon-heartbeat; } -.#{$ti-prefix}-hearts:before { content: $ti-icon-hearts; } -.#{$ti-prefix}-hearts-off:before { content: $ti-icon-hearts-off; } -.#{$ti-prefix}-helicopter:before { content: $ti-icon-helicopter; } -.#{$ti-prefix}-helicopter-landing:before { content: $ti-icon-helicopter-landing; } -.#{$ti-prefix}-helmet:before { content: $ti-icon-helmet; } -.#{$ti-prefix}-helmet-off:before { content: $ti-icon-helmet-off; } -.#{$ti-prefix}-help:before { content: $ti-icon-help; } -.#{$ti-prefix}-help-circle:before { content: $ti-icon-help-circle; } -.#{$ti-prefix}-help-hexagon:before { content: $ti-icon-help-hexagon; } -.#{$ti-prefix}-help-octagon:before { content: $ti-icon-help-octagon; } -.#{$ti-prefix}-help-off:before { content: $ti-icon-help-off; } -.#{$ti-prefix}-help-small:before { content: $ti-icon-help-small; } -.#{$ti-prefix}-help-square:before { content: $ti-icon-help-square; } -.#{$ti-prefix}-help-square-rounded:before { content: $ti-icon-help-square-rounded; } -.#{$ti-prefix}-help-triangle:before { content: $ti-icon-help-triangle; } -.#{$ti-prefix}-hexagon:before { content: $ti-icon-hexagon; } -.#{$ti-prefix}-hexagon-0-filled:before { content: $ti-icon-hexagon-0-filled; } -.#{$ti-prefix}-hexagon-1-filled:before { content: $ti-icon-hexagon-1-filled; } -.#{$ti-prefix}-hexagon-2-filled:before { content: $ti-icon-hexagon-2-filled; } -.#{$ti-prefix}-hexagon-3-filled:before { content: $ti-icon-hexagon-3-filled; } -.#{$ti-prefix}-hexagon-3d:before { content: $ti-icon-hexagon-3d; } -.#{$ti-prefix}-hexagon-4-filled:before { content: $ti-icon-hexagon-4-filled; } -.#{$ti-prefix}-hexagon-5-filled:before { content: $ti-icon-hexagon-5-filled; } -.#{$ti-prefix}-hexagon-6-filled:before { content: $ti-icon-hexagon-6-filled; } -.#{$ti-prefix}-hexagon-7-filled:before { content: $ti-icon-hexagon-7-filled; } -.#{$ti-prefix}-hexagon-8-filled:before { content: $ti-icon-hexagon-8-filled; } -.#{$ti-prefix}-hexagon-9-filled:before { content: $ti-icon-hexagon-9-filled; } -.#{$ti-prefix}-hexagon-filled:before { content: $ti-icon-hexagon-filled; } -.#{$ti-prefix}-hexagon-letter-a:before { content: $ti-icon-hexagon-letter-a; } -.#{$ti-prefix}-hexagon-letter-b:before { content: $ti-icon-hexagon-letter-b; } -.#{$ti-prefix}-hexagon-letter-c:before { content: $ti-icon-hexagon-letter-c; } -.#{$ti-prefix}-hexagon-letter-d:before { content: $ti-icon-hexagon-letter-d; } -.#{$ti-prefix}-hexagon-letter-e:before { content: $ti-icon-hexagon-letter-e; } -.#{$ti-prefix}-hexagon-letter-f:before { content: $ti-icon-hexagon-letter-f; } -.#{$ti-prefix}-hexagon-letter-g:before { content: $ti-icon-hexagon-letter-g; } -.#{$ti-prefix}-hexagon-letter-h:before { content: $ti-icon-hexagon-letter-h; } -.#{$ti-prefix}-hexagon-letter-i:before { content: $ti-icon-hexagon-letter-i; } -.#{$ti-prefix}-hexagon-letter-j:before { content: $ti-icon-hexagon-letter-j; } -.#{$ti-prefix}-hexagon-letter-k:before { content: $ti-icon-hexagon-letter-k; } -.#{$ti-prefix}-hexagon-letter-l:before { content: $ti-icon-hexagon-letter-l; } -.#{$ti-prefix}-hexagon-letter-m:before { content: $ti-icon-hexagon-letter-m; } -.#{$ti-prefix}-hexagon-letter-n:before { content: $ti-icon-hexagon-letter-n; } -.#{$ti-prefix}-hexagon-letter-o:before { content: $ti-icon-hexagon-letter-o; } -.#{$ti-prefix}-hexagon-letter-p:before { content: $ti-icon-hexagon-letter-p; } -.#{$ti-prefix}-hexagon-letter-q:before { content: $ti-icon-hexagon-letter-q; } -.#{$ti-prefix}-hexagon-letter-r:before { content: $ti-icon-hexagon-letter-r; } -.#{$ti-prefix}-hexagon-letter-s:before { content: $ti-icon-hexagon-letter-s; } -.#{$ti-prefix}-hexagon-letter-t:before { content: $ti-icon-hexagon-letter-t; } -.#{$ti-prefix}-hexagon-letter-u:before { content: $ti-icon-hexagon-letter-u; } -.#{$ti-prefix}-hexagon-letter-v:before { content: $ti-icon-hexagon-letter-v; } -.#{$ti-prefix}-hexagon-letter-w:before { content: $ti-icon-hexagon-letter-w; } -.#{$ti-prefix}-hexagon-letter-x:before { content: $ti-icon-hexagon-letter-x; } -.#{$ti-prefix}-hexagon-letter-y:before { content: $ti-icon-hexagon-letter-y; } -.#{$ti-prefix}-hexagon-letter-z:before { content: $ti-icon-hexagon-letter-z; } -.#{$ti-prefix}-hexagon-number-0:before { content: $ti-icon-hexagon-number-0; } -.#{$ti-prefix}-hexagon-number-1:before { content: $ti-icon-hexagon-number-1; } -.#{$ti-prefix}-hexagon-number-2:before { content: $ti-icon-hexagon-number-2; } -.#{$ti-prefix}-hexagon-number-3:before { content: $ti-icon-hexagon-number-3; } -.#{$ti-prefix}-hexagon-number-4:before { content: $ti-icon-hexagon-number-4; } -.#{$ti-prefix}-hexagon-number-5:before { content: $ti-icon-hexagon-number-5; } -.#{$ti-prefix}-hexagon-number-6:before { content: $ti-icon-hexagon-number-6; } -.#{$ti-prefix}-hexagon-number-7:before { content: $ti-icon-hexagon-number-7; } -.#{$ti-prefix}-hexagon-number-8:before { content: $ti-icon-hexagon-number-8; } -.#{$ti-prefix}-hexagon-number-9:before { content: $ti-icon-hexagon-number-9; } -.#{$ti-prefix}-hexagon-off:before { content: $ti-icon-hexagon-off; } -.#{$ti-prefix}-hexagons:before { content: $ti-icon-hexagons; } -.#{$ti-prefix}-hexagons-off:before { content: $ti-icon-hexagons-off; } -.#{$ti-prefix}-hierarchy:before { content: $ti-icon-hierarchy; } -.#{$ti-prefix}-hierarchy-2:before { content: $ti-icon-hierarchy-2; } -.#{$ti-prefix}-hierarchy-3:before { content: $ti-icon-hierarchy-3; } -.#{$ti-prefix}-hierarchy-off:before { content: $ti-icon-hierarchy-off; } -.#{$ti-prefix}-highlight:before { content: $ti-icon-highlight; } -.#{$ti-prefix}-highlight-off:before { content: $ti-icon-highlight-off; } -.#{$ti-prefix}-history:before { content: $ti-icon-history; } -.#{$ti-prefix}-history-off:before { content: $ti-icon-history-off; } -.#{$ti-prefix}-history-toggle:before { content: $ti-icon-history-toggle; } -.#{$ti-prefix}-home:before { content: $ti-icon-home; } -.#{$ti-prefix}-home-2:before { content: $ti-icon-home-2; } -.#{$ti-prefix}-home-bolt:before { content: $ti-icon-home-bolt; } -.#{$ti-prefix}-home-cancel:before { content: $ti-icon-home-cancel; } -.#{$ti-prefix}-home-check:before { content: $ti-icon-home-check; } -.#{$ti-prefix}-home-cog:before { content: $ti-icon-home-cog; } -.#{$ti-prefix}-home-dollar:before { content: $ti-icon-home-dollar; } -.#{$ti-prefix}-home-dot:before { content: $ti-icon-home-dot; } -.#{$ti-prefix}-home-down:before { content: $ti-icon-home-down; } -.#{$ti-prefix}-home-eco:before { content: $ti-icon-home-eco; } -.#{$ti-prefix}-home-edit:before { content: $ti-icon-home-edit; } -.#{$ti-prefix}-home-exclamation:before { content: $ti-icon-home-exclamation; } -.#{$ti-prefix}-home-hand:before { content: $ti-icon-home-hand; } -.#{$ti-prefix}-home-heart:before { content: $ti-icon-home-heart; } -.#{$ti-prefix}-home-infinity:before { content: $ti-icon-home-infinity; } -.#{$ti-prefix}-home-link:before { content: $ti-icon-home-link; } -.#{$ti-prefix}-home-minus:before { content: $ti-icon-home-minus; } -.#{$ti-prefix}-home-move:before { content: $ti-icon-home-move; } -.#{$ti-prefix}-home-off:before { content: $ti-icon-home-off; } -.#{$ti-prefix}-home-plus:before { content: $ti-icon-home-plus; } -.#{$ti-prefix}-home-question:before { content: $ti-icon-home-question; } -.#{$ti-prefix}-home-ribbon:before { content: $ti-icon-home-ribbon; } -.#{$ti-prefix}-home-search:before { content: $ti-icon-home-search; } -.#{$ti-prefix}-home-share:before { content: $ti-icon-home-share; } -.#{$ti-prefix}-home-shield:before { content: $ti-icon-home-shield; } -.#{$ti-prefix}-home-signal:before { content: $ti-icon-home-signal; } -.#{$ti-prefix}-home-star:before { content: $ti-icon-home-star; } -.#{$ti-prefix}-home-stats:before { content: $ti-icon-home-stats; } -.#{$ti-prefix}-home-up:before { content: $ti-icon-home-up; } -.#{$ti-prefix}-home-x:before { content: $ti-icon-home-x; } -.#{$ti-prefix}-horse-toy:before { content: $ti-icon-horse-toy; } -.#{$ti-prefix}-hotel-service:before { content: $ti-icon-hotel-service; } -.#{$ti-prefix}-hourglass:before { content: $ti-icon-hourglass; } -.#{$ti-prefix}-hourglass-empty:before { content: $ti-icon-hourglass-empty; } -.#{$ti-prefix}-hourglass-filled:before { content: $ti-icon-hourglass-filled; } -.#{$ti-prefix}-hourglass-high:before { content: $ti-icon-hourglass-high; } -.#{$ti-prefix}-hourglass-low:before { content: $ti-icon-hourglass-low; } -.#{$ti-prefix}-hourglass-off:before { content: $ti-icon-hourglass-off; } -.#{$ti-prefix}-html:before { content: $ti-icon-html; } -.#{$ti-prefix}-ice-cream:before { content: $ti-icon-ice-cream; } -.#{$ti-prefix}-ice-cream-2:before { content: $ti-icon-ice-cream-2; } -.#{$ti-prefix}-ice-cream-off:before { content: $ti-icon-ice-cream-off; } -.#{$ti-prefix}-ice-skating:before { content: $ti-icon-ice-skating; } -.#{$ti-prefix}-icons:before { content: $ti-icon-icons; } -.#{$ti-prefix}-icons-off:before { content: $ti-icon-icons-off; } -.#{$ti-prefix}-id:before { content: $ti-icon-id; } -.#{$ti-prefix}-id-badge:before { content: $ti-icon-id-badge; } -.#{$ti-prefix}-id-badge-2:before { content: $ti-icon-id-badge-2; } -.#{$ti-prefix}-id-badge-off:before { content: $ti-icon-id-badge-off; } -.#{$ti-prefix}-id-off:before { content: $ti-icon-id-off; } -.#{$ti-prefix}-inbox:before { content: $ti-icon-inbox; } -.#{$ti-prefix}-inbox-off:before { content: $ti-icon-inbox-off; } -.#{$ti-prefix}-indent-decrease:before { content: $ti-icon-indent-decrease; } -.#{$ti-prefix}-indent-increase:before { content: $ti-icon-indent-increase; } -.#{$ti-prefix}-infinity:before { content: $ti-icon-infinity; } -.#{$ti-prefix}-infinity-off:before { content: $ti-icon-infinity-off; } -.#{$ti-prefix}-info-circle:before { content: $ti-icon-info-circle; } -.#{$ti-prefix}-info-circle-filled:before { content: $ti-icon-info-circle-filled; } -.#{$ti-prefix}-info-hexagon:before { content: $ti-icon-info-hexagon; } -.#{$ti-prefix}-info-octagon:before { content: $ti-icon-info-octagon; } -.#{$ti-prefix}-info-small:before { content: $ti-icon-info-small; } -.#{$ti-prefix}-info-square:before { content: $ti-icon-info-square; } -.#{$ti-prefix}-info-square-rounded:before { content: $ti-icon-info-square-rounded; } -.#{$ti-prefix}-info-square-rounded-filled:before { content: $ti-icon-info-square-rounded-filled; } -.#{$ti-prefix}-info-triangle:before { content: $ti-icon-info-triangle; } -.#{$ti-prefix}-inner-shadow-bottom:before { content: $ti-icon-inner-shadow-bottom; } -.#{$ti-prefix}-inner-shadow-bottom-filled:before { content: $ti-icon-inner-shadow-bottom-filled; } -.#{$ti-prefix}-inner-shadow-bottom-left:before { content: $ti-icon-inner-shadow-bottom-left; } -.#{$ti-prefix}-inner-shadow-bottom-left-filled:before { content: $ti-icon-inner-shadow-bottom-left-filled; } -.#{$ti-prefix}-inner-shadow-bottom-right:before { content: $ti-icon-inner-shadow-bottom-right; } -.#{$ti-prefix}-inner-shadow-bottom-right-filled:before { content: $ti-icon-inner-shadow-bottom-right-filled; } -.#{$ti-prefix}-inner-shadow-left:before { content: $ti-icon-inner-shadow-left; } -.#{$ti-prefix}-inner-shadow-left-filled:before { content: $ti-icon-inner-shadow-left-filled; } -.#{$ti-prefix}-inner-shadow-right:before { content: $ti-icon-inner-shadow-right; } -.#{$ti-prefix}-inner-shadow-right-filled:before { content: $ti-icon-inner-shadow-right-filled; } -.#{$ti-prefix}-inner-shadow-top:before { content: $ti-icon-inner-shadow-top; } -.#{$ti-prefix}-inner-shadow-top-filled:before { content: $ti-icon-inner-shadow-top-filled; } -.#{$ti-prefix}-inner-shadow-top-left:before { content: $ti-icon-inner-shadow-top-left; } -.#{$ti-prefix}-inner-shadow-top-left-filled:before { content: $ti-icon-inner-shadow-top-left-filled; } -.#{$ti-prefix}-inner-shadow-top-right:before { content: $ti-icon-inner-shadow-top-right; } -.#{$ti-prefix}-inner-shadow-top-right-filled:before { content: $ti-icon-inner-shadow-top-right-filled; } -.#{$ti-prefix}-input-search:before { content: $ti-icon-input-search; } -.#{$ti-prefix}-ironing-1:before { content: $ti-icon-ironing-1; } -.#{$ti-prefix}-ironing-2:before { content: $ti-icon-ironing-2; } -.#{$ti-prefix}-ironing-3:before { content: $ti-icon-ironing-3; } -.#{$ti-prefix}-ironing-off:before { content: $ti-icon-ironing-off; } -.#{$ti-prefix}-ironing-steam:before { content: $ti-icon-ironing-steam; } -.#{$ti-prefix}-ironing-steam-off:before { content: $ti-icon-ironing-steam-off; } -.#{$ti-prefix}-italic:before { content: $ti-icon-italic; } -.#{$ti-prefix}-jacket:before { content: $ti-icon-jacket; } -.#{$ti-prefix}-jetpack:before { content: $ti-icon-jetpack; } -.#{$ti-prefix}-jewish-star:before { content: $ti-icon-jewish-star; } -.#{$ti-prefix}-jewish-star-filled:before { content: $ti-icon-jewish-star-filled; } -.#{$ti-prefix}-jpg:before { content: $ti-icon-jpg; } -.#{$ti-prefix}-json:before { content: $ti-icon-json; } -.#{$ti-prefix}-jump-rope:before { content: $ti-icon-jump-rope; } -.#{$ti-prefix}-karate:before { content: $ti-icon-karate; } -.#{$ti-prefix}-kayak:before { content: $ti-icon-kayak; } -.#{$ti-prefix}-kering:before { content: $ti-icon-kering; } -.#{$ti-prefix}-key:before { content: $ti-icon-key; } -.#{$ti-prefix}-key-off:before { content: $ti-icon-key-off; } -.#{$ti-prefix}-keyboard:before { content: $ti-icon-keyboard; } -.#{$ti-prefix}-keyboard-hide:before { content: $ti-icon-keyboard-hide; } -.#{$ti-prefix}-keyboard-off:before { content: $ti-icon-keyboard-off; } -.#{$ti-prefix}-keyboard-show:before { content: $ti-icon-keyboard-show; } -.#{$ti-prefix}-keyframe:before { content: $ti-icon-keyframe; } -.#{$ti-prefix}-keyframe-align-center:before { content: $ti-icon-keyframe-align-center; } -.#{$ti-prefix}-keyframe-align-horizontal:before { content: $ti-icon-keyframe-align-horizontal; } -.#{$ti-prefix}-keyframe-align-vertical:before { content: $ti-icon-keyframe-align-vertical; } -.#{$ti-prefix}-keyframes:before { content: $ti-icon-keyframes; } -.#{$ti-prefix}-ladder:before { content: $ti-icon-ladder; } -.#{$ti-prefix}-ladder-off:before { content: $ti-icon-ladder-off; } -.#{$ti-prefix}-lambda:before { content: $ti-icon-lambda; } -.#{$ti-prefix}-lamp:before { content: $ti-icon-lamp; } -.#{$ti-prefix}-lamp-2:before { content: $ti-icon-lamp-2; } -.#{$ti-prefix}-lamp-off:before { content: $ti-icon-lamp-off; } -.#{$ti-prefix}-language:before { content: $ti-icon-language; } -.#{$ti-prefix}-language-hiragana:before { content: $ti-icon-language-hiragana; } -.#{$ti-prefix}-language-katakana:before { content: $ti-icon-language-katakana; } -.#{$ti-prefix}-language-off:before { content: $ti-icon-language-off; } -.#{$ti-prefix}-lasso:before { content: $ti-icon-lasso; } -.#{$ti-prefix}-lasso-off:before { content: $ti-icon-lasso-off; } -.#{$ti-prefix}-lasso-polygon:before { content: $ti-icon-lasso-polygon; } -.#{$ti-prefix}-layers-difference:before { content: $ti-icon-layers-difference; } -.#{$ti-prefix}-layers-intersect:before { content: $ti-icon-layers-intersect; } -.#{$ti-prefix}-layers-intersect-2:before { content: $ti-icon-layers-intersect-2; } -.#{$ti-prefix}-layers-linked:before { content: $ti-icon-layers-linked; } -.#{$ti-prefix}-layers-off:before { content: $ti-icon-layers-off; } -.#{$ti-prefix}-layers-subtract:before { content: $ti-icon-layers-subtract; } -.#{$ti-prefix}-layers-union:before { content: $ti-icon-layers-union; } -.#{$ti-prefix}-layout:before { content: $ti-icon-layout; } -.#{$ti-prefix}-layout-2:before { content: $ti-icon-layout-2; } -.#{$ti-prefix}-layout-align-bottom:before { content: $ti-icon-layout-align-bottom; } -.#{$ti-prefix}-layout-align-center:before { content: $ti-icon-layout-align-center; } -.#{$ti-prefix}-layout-align-left:before { content: $ti-icon-layout-align-left; } -.#{$ti-prefix}-layout-align-middle:before { content: $ti-icon-layout-align-middle; } -.#{$ti-prefix}-layout-align-right:before { content: $ti-icon-layout-align-right; } -.#{$ti-prefix}-layout-align-top:before { content: $ti-icon-layout-align-top; } -.#{$ti-prefix}-layout-board:before { content: $ti-icon-layout-board; } -.#{$ti-prefix}-layout-board-split:before { content: $ti-icon-layout-board-split; } -.#{$ti-prefix}-layout-bottombar:before { content: $ti-icon-layout-bottombar; } -.#{$ti-prefix}-layout-bottombar-collapse:before { content: $ti-icon-layout-bottombar-collapse; } -.#{$ti-prefix}-layout-bottombar-expand:before { content: $ti-icon-layout-bottombar-expand; } -.#{$ti-prefix}-layout-cards:before { content: $ti-icon-layout-cards; } -.#{$ti-prefix}-layout-collage:before { content: $ti-icon-layout-collage; } -.#{$ti-prefix}-layout-columns:before { content: $ti-icon-layout-columns; } -.#{$ti-prefix}-layout-dashboard:before { content: $ti-icon-layout-dashboard; } -.#{$ti-prefix}-layout-distribute-horizontal:before { content: $ti-icon-layout-distribute-horizontal; } -.#{$ti-prefix}-layout-distribute-vertical:before { content: $ti-icon-layout-distribute-vertical; } -.#{$ti-prefix}-layout-grid:before { content: $ti-icon-layout-grid; } -.#{$ti-prefix}-layout-grid-add:before { content: $ti-icon-layout-grid-add; } -.#{$ti-prefix}-layout-kanban:before { content: $ti-icon-layout-kanban; } -.#{$ti-prefix}-layout-list:before { content: $ti-icon-layout-list; } -.#{$ti-prefix}-layout-navbar:before { content: $ti-icon-layout-navbar; } -.#{$ti-prefix}-layout-navbar-collapse:before { content: $ti-icon-layout-navbar-collapse; } -.#{$ti-prefix}-layout-navbar-expand:before { content: $ti-icon-layout-navbar-expand; } -.#{$ti-prefix}-layout-off:before { content: $ti-icon-layout-off; } -.#{$ti-prefix}-layout-rows:before { content: $ti-icon-layout-rows; } -.#{$ti-prefix}-layout-sidebar:before { content: $ti-icon-layout-sidebar; } -.#{$ti-prefix}-layout-sidebar-left-collapse:before { content: $ti-icon-layout-sidebar-left-collapse; } -.#{$ti-prefix}-layout-sidebar-left-expand:before { content: $ti-icon-layout-sidebar-left-expand; } -.#{$ti-prefix}-layout-sidebar-right:before { content: $ti-icon-layout-sidebar-right; } -.#{$ti-prefix}-layout-sidebar-right-collapse:before { content: $ti-icon-layout-sidebar-right-collapse; } -.#{$ti-prefix}-layout-sidebar-right-expand:before { content: $ti-icon-layout-sidebar-right-expand; } -.#{$ti-prefix}-leaf:before { content: $ti-icon-leaf; } -.#{$ti-prefix}-leaf-off:before { content: $ti-icon-leaf-off; } -.#{$ti-prefix}-lego:before { content: $ti-icon-lego; } -.#{$ti-prefix}-lego-off:before { content: $ti-icon-lego-off; } -.#{$ti-prefix}-lemon:before { content: $ti-icon-lemon; } -.#{$ti-prefix}-lemon-2:before { content: $ti-icon-lemon-2; } -.#{$ti-prefix}-letter-a:before { content: $ti-icon-letter-a; } -.#{$ti-prefix}-letter-b:before { content: $ti-icon-letter-b; } -.#{$ti-prefix}-letter-c:before { content: $ti-icon-letter-c; } -.#{$ti-prefix}-letter-case:before { content: $ti-icon-letter-case; } -.#{$ti-prefix}-letter-case-lower:before { content: $ti-icon-letter-case-lower; } -.#{$ti-prefix}-letter-case-toggle:before { content: $ti-icon-letter-case-toggle; } -.#{$ti-prefix}-letter-case-upper:before { content: $ti-icon-letter-case-upper; } -.#{$ti-prefix}-letter-d:before { content: $ti-icon-letter-d; } -.#{$ti-prefix}-letter-e:before { content: $ti-icon-letter-e; } -.#{$ti-prefix}-letter-f:before { content: $ti-icon-letter-f; } -.#{$ti-prefix}-letter-g:before { content: $ti-icon-letter-g; } -.#{$ti-prefix}-letter-h:before { content: $ti-icon-letter-h; } -.#{$ti-prefix}-letter-i:before { content: $ti-icon-letter-i; } -.#{$ti-prefix}-letter-j:before { content: $ti-icon-letter-j; } -.#{$ti-prefix}-letter-k:before { content: $ti-icon-letter-k; } -.#{$ti-prefix}-letter-l:before { content: $ti-icon-letter-l; } -.#{$ti-prefix}-letter-m:before { content: $ti-icon-letter-m; } -.#{$ti-prefix}-letter-n:before { content: $ti-icon-letter-n; } -.#{$ti-prefix}-letter-o:before { content: $ti-icon-letter-o; } -.#{$ti-prefix}-letter-p:before { content: $ti-icon-letter-p; } -.#{$ti-prefix}-letter-q:before { content: $ti-icon-letter-q; } -.#{$ti-prefix}-letter-r:before { content: $ti-icon-letter-r; } -.#{$ti-prefix}-letter-s:before { content: $ti-icon-letter-s; } -.#{$ti-prefix}-letter-spacing:before { content: $ti-icon-letter-spacing; } -.#{$ti-prefix}-letter-t:before { content: $ti-icon-letter-t; } -.#{$ti-prefix}-letter-u:before { content: $ti-icon-letter-u; } -.#{$ti-prefix}-letter-v:before { content: $ti-icon-letter-v; } -.#{$ti-prefix}-letter-w:before { content: $ti-icon-letter-w; } -.#{$ti-prefix}-letter-x:before { content: $ti-icon-letter-x; } -.#{$ti-prefix}-letter-y:before { content: $ti-icon-letter-y; } -.#{$ti-prefix}-letter-z:before { content: $ti-icon-letter-z; } -.#{$ti-prefix}-license:before { content: $ti-icon-license; } -.#{$ti-prefix}-license-off:before { content: $ti-icon-license-off; } -.#{$ti-prefix}-lifebuoy:before { content: $ti-icon-lifebuoy; } -.#{$ti-prefix}-lifebuoy-off:before { content: $ti-icon-lifebuoy-off; } -.#{$ti-prefix}-lighter:before { content: $ti-icon-lighter; } -.#{$ti-prefix}-line:before { content: $ti-icon-line; } -.#{$ti-prefix}-line-dashed:before { content: $ti-icon-line-dashed; } -.#{$ti-prefix}-line-dotted:before { content: $ti-icon-line-dotted; } -.#{$ti-prefix}-line-height:before { content: $ti-icon-line-height; } -.#{$ti-prefix}-link:before { content: $ti-icon-link; } -.#{$ti-prefix}-link-off:before { content: $ti-icon-link-off; } -.#{$ti-prefix}-list:before { content: $ti-icon-list; } -.#{$ti-prefix}-list-check:before { content: $ti-icon-list-check; } -.#{$ti-prefix}-list-details:before { content: $ti-icon-list-details; } -.#{$ti-prefix}-list-numbers:before { content: $ti-icon-list-numbers; } -.#{$ti-prefix}-list-search:before { content: $ti-icon-list-search; } -.#{$ti-prefix}-live-photo:before { content: $ti-icon-live-photo; } -.#{$ti-prefix}-live-photo-off:before { content: $ti-icon-live-photo-off; } -.#{$ti-prefix}-live-view:before { content: $ti-icon-live-view; } -.#{$ti-prefix}-loader:before { content: $ti-icon-loader; } -.#{$ti-prefix}-loader-2:before { content: $ti-icon-loader-2; } -.#{$ti-prefix}-loader-3:before { content: $ti-icon-loader-3; } -.#{$ti-prefix}-loader-quarter:before { content: $ti-icon-loader-quarter; } -.#{$ti-prefix}-location:before { content: $ti-icon-location; } -.#{$ti-prefix}-location-broken:before { content: $ti-icon-location-broken; } -.#{$ti-prefix}-location-filled:before { content: $ti-icon-location-filled; } -.#{$ti-prefix}-location-off:before { content: $ti-icon-location-off; } -.#{$ti-prefix}-lock:before { content: $ti-icon-lock; } -.#{$ti-prefix}-lock-access:before { content: $ti-icon-lock-access; } -.#{$ti-prefix}-lock-access-off:before { content: $ti-icon-lock-access-off; } -.#{$ti-prefix}-lock-bolt:before { content: $ti-icon-lock-bolt; } -.#{$ti-prefix}-lock-cancel:before { content: $ti-icon-lock-cancel; } -.#{$ti-prefix}-lock-check:before { content: $ti-icon-lock-check; } -.#{$ti-prefix}-lock-code:before { content: $ti-icon-lock-code; } -.#{$ti-prefix}-lock-cog:before { content: $ti-icon-lock-cog; } -.#{$ti-prefix}-lock-dollar:before { content: $ti-icon-lock-dollar; } -.#{$ti-prefix}-lock-down:before { content: $ti-icon-lock-down; } -.#{$ti-prefix}-lock-exclamation:before { content: $ti-icon-lock-exclamation; } -.#{$ti-prefix}-lock-heart:before { content: $ti-icon-lock-heart; } -.#{$ti-prefix}-lock-minus:before { content: $ti-icon-lock-minus; } -.#{$ti-prefix}-lock-off:before { content: $ti-icon-lock-off; } -.#{$ti-prefix}-lock-open:before { content: $ti-icon-lock-open; } -.#{$ti-prefix}-lock-open-off:before { content: $ti-icon-lock-open-off; } -.#{$ti-prefix}-lock-pause:before { content: $ti-icon-lock-pause; } -.#{$ti-prefix}-lock-pin:before { content: $ti-icon-lock-pin; } -.#{$ti-prefix}-lock-plus:before { content: $ti-icon-lock-plus; } -.#{$ti-prefix}-lock-question:before { content: $ti-icon-lock-question; } -.#{$ti-prefix}-lock-search:before { content: $ti-icon-lock-search; } -.#{$ti-prefix}-lock-share:before { content: $ti-icon-lock-share; } -.#{$ti-prefix}-lock-square:before { content: $ti-icon-lock-square; } -.#{$ti-prefix}-lock-square-rounded:before { content: $ti-icon-lock-square-rounded; } -.#{$ti-prefix}-lock-square-rounded-filled:before { content: $ti-icon-lock-square-rounded-filled; } -.#{$ti-prefix}-lock-star:before { content: $ti-icon-lock-star; } -.#{$ti-prefix}-lock-up:before { content: $ti-icon-lock-up; } -.#{$ti-prefix}-lock-x:before { content: $ti-icon-lock-x; } -.#{$ti-prefix}-logic-and:before { content: $ti-icon-logic-and; } -.#{$ti-prefix}-logic-buffer:before { content: $ti-icon-logic-buffer; } -.#{$ti-prefix}-logic-nand:before { content: $ti-icon-logic-nand; } -.#{$ti-prefix}-logic-nor:before { content: $ti-icon-logic-nor; } -.#{$ti-prefix}-logic-not:before { content: $ti-icon-logic-not; } -.#{$ti-prefix}-logic-or:before { content: $ti-icon-logic-or; } -.#{$ti-prefix}-logic-xnor:before { content: $ti-icon-logic-xnor; } -.#{$ti-prefix}-logic-xor:before { content: $ti-icon-logic-xor; } -.#{$ti-prefix}-login:before { content: $ti-icon-login; } -.#{$ti-prefix}-logout:before { content: $ti-icon-logout; } -.#{$ti-prefix}-lollipop:before { content: $ti-icon-lollipop; } -.#{$ti-prefix}-lollipop-off:before { content: $ti-icon-lollipop-off; } -.#{$ti-prefix}-luggage:before { content: $ti-icon-luggage; } -.#{$ti-prefix}-luggage-off:before { content: $ti-icon-luggage-off; } -.#{$ti-prefix}-lungs:before { content: $ti-icon-lungs; } -.#{$ti-prefix}-lungs-off:before { content: $ti-icon-lungs-off; } -.#{$ti-prefix}-macro:before { content: $ti-icon-macro; } -.#{$ti-prefix}-macro-off:before { content: $ti-icon-macro-off; } -.#{$ti-prefix}-magnet:before { content: $ti-icon-magnet; } -.#{$ti-prefix}-magnet-off:before { content: $ti-icon-magnet-off; } -.#{$ti-prefix}-mail:before { content: $ti-icon-mail; } -.#{$ti-prefix}-mail-bolt:before { content: $ti-icon-mail-bolt; } -.#{$ti-prefix}-mail-cancel:before { content: $ti-icon-mail-cancel; } -.#{$ti-prefix}-mail-check:before { content: $ti-icon-mail-check; } -.#{$ti-prefix}-mail-code:before { content: $ti-icon-mail-code; } -.#{$ti-prefix}-mail-cog:before { content: $ti-icon-mail-cog; } -.#{$ti-prefix}-mail-dollar:before { content: $ti-icon-mail-dollar; } -.#{$ti-prefix}-mail-down:before { content: $ti-icon-mail-down; } -.#{$ti-prefix}-mail-exclamation:before { content: $ti-icon-mail-exclamation; } -.#{$ti-prefix}-mail-fast:before { content: $ti-icon-mail-fast; } -.#{$ti-prefix}-mail-forward:before { content: $ti-icon-mail-forward; } -.#{$ti-prefix}-mail-heart:before { content: $ti-icon-mail-heart; } -.#{$ti-prefix}-mail-minus:before { content: $ti-icon-mail-minus; } -.#{$ti-prefix}-mail-off:before { content: $ti-icon-mail-off; } -.#{$ti-prefix}-mail-opened:before { content: $ti-icon-mail-opened; } -.#{$ti-prefix}-mail-pause:before { content: $ti-icon-mail-pause; } -.#{$ti-prefix}-mail-pin:before { content: $ti-icon-mail-pin; } -.#{$ti-prefix}-mail-plus:before { content: $ti-icon-mail-plus; } -.#{$ti-prefix}-mail-question:before { content: $ti-icon-mail-question; } -.#{$ti-prefix}-mail-search:before { content: $ti-icon-mail-search; } -.#{$ti-prefix}-mail-share:before { content: $ti-icon-mail-share; } -.#{$ti-prefix}-mail-star:before { content: $ti-icon-mail-star; } -.#{$ti-prefix}-mail-up:before { content: $ti-icon-mail-up; } -.#{$ti-prefix}-mail-x:before { content: $ti-icon-mail-x; } -.#{$ti-prefix}-mailbox:before { content: $ti-icon-mailbox; } -.#{$ti-prefix}-mailbox-off:before { content: $ti-icon-mailbox-off; } -.#{$ti-prefix}-man:before { content: $ti-icon-man; } -.#{$ti-prefix}-manual-gearbox:before { content: $ti-icon-manual-gearbox; } -.#{$ti-prefix}-map:before { content: $ti-icon-map; } -.#{$ti-prefix}-map-2:before { content: $ti-icon-map-2; } -.#{$ti-prefix}-map-off:before { content: $ti-icon-map-off; } -.#{$ti-prefix}-map-pin:before { content: $ti-icon-map-pin; } -.#{$ti-prefix}-map-pin-bolt:before { content: $ti-icon-map-pin-bolt; } -.#{$ti-prefix}-map-pin-cancel:before { content: $ti-icon-map-pin-cancel; } -.#{$ti-prefix}-map-pin-check:before { content: $ti-icon-map-pin-check; } -.#{$ti-prefix}-map-pin-code:before { content: $ti-icon-map-pin-code; } -.#{$ti-prefix}-map-pin-cog:before { content: $ti-icon-map-pin-cog; } -.#{$ti-prefix}-map-pin-dollar:before { content: $ti-icon-map-pin-dollar; } -.#{$ti-prefix}-map-pin-down:before { content: $ti-icon-map-pin-down; } -.#{$ti-prefix}-map-pin-exclamation:before { content: $ti-icon-map-pin-exclamation; } -.#{$ti-prefix}-map-pin-filled:before { content: $ti-icon-map-pin-filled; } -.#{$ti-prefix}-map-pin-heart:before { content: $ti-icon-map-pin-heart; } -.#{$ti-prefix}-map-pin-minus:before { content: $ti-icon-map-pin-minus; } -.#{$ti-prefix}-map-pin-off:before { content: $ti-icon-map-pin-off; } -.#{$ti-prefix}-map-pin-pause:before { content: $ti-icon-map-pin-pause; } -.#{$ti-prefix}-map-pin-pin:before { content: $ti-icon-map-pin-pin; } -.#{$ti-prefix}-map-pin-plus:before { content: $ti-icon-map-pin-plus; } -.#{$ti-prefix}-map-pin-question:before { content: $ti-icon-map-pin-question; } -.#{$ti-prefix}-map-pin-search:before { content: $ti-icon-map-pin-search; } -.#{$ti-prefix}-map-pin-share:before { content: $ti-icon-map-pin-share; } -.#{$ti-prefix}-map-pin-star:before { content: $ti-icon-map-pin-star; } -.#{$ti-prefix}-map-pin-up:before { content: $ti-icon-map-pin-up; } -.#{$ti-prefix}-map-pin-x:before { content: $ti-icon-map-pin-x; } -.#{$ti-prefix}-map-pins:before { content: $ti-icon-map-pins; } -.#{$ti-prefix}-map-search:before { content: $ti-icon-map-search; } -.#{$ti-prefix}-markdown:before { content: $ti-icon-markdown; } -.#{$ti-prefix}-markdown-off:before { content: $ti-icon-markdown-off; } -.#{$ti-prefix}-marquee:before { content: $ti-icon-marquee; } -.#{$ti-prefix}-marquee-2:before { content: $ti-icon-marquee-2; } -.#{$ti-prefix}-marquee-off:before { content: $ti-icon-marquee-off; } -.#{$ti-prefix}-mars:before { content: $ti-icon-mars; } -.#{$ti-prefix}-mask:before { content: $ti-icon-mask; } -.#{$ti-prefix}-mask-off:before { content: $ti-icon-mask-off; } -.#{$ti-prefix}-masks-theater:before { content: $ti-icon-masks-theater; } -.#{$ti-prefix}-masks-theater-off:before { content: $ti-icon-masks-theater-off; } -.#{$ti-prefix}-massage:before { content: $ti-icon-massage; } -.#{$ti-prefix}-matchstick:before { content: $ti-icon-matchstick; } -.#{$ti-prefix}-math:before { content: $ti-icon-math; } -.#{$ti-prefix}-math-1-divide-2:before { content: $ti-icon-math-1-divide-2; } -.#{$ti-prefix}-math-1-divide-3:before { content: $ti-icon-math-1-divide-3; } -.#{$ti-prefix}-math-avg:before { content: $ti-icon-math-avg; } -.#{$ti-prefix}-math-equal-greater:before { content: $ti-icon-math-equal-greater; } -.#{$ti-prefix}-math-equal-lower:before { content: $ti-icon-math-equal-lower; } -.#{$ti-prefix}-math-function:before { content: $ti-icon-math-function; } -.#{$ti-prefix}-math-function-off:before { content: $ti-icon-math-function-off; } -.#{$ti-prefix}-math-function-y:before { content: $ti-icon-math-function-y; } -.#{$ti-prefix}-math-greater:before { content: $ti-icon-math-greater; } -.#{$ti-prefix}-math-integral:before { content: $ti-icon-math-integral; } -.#{$ti-prefix}-math-integral-x:before { content: $ti-icon-math-integral-x; } -.#{$ti-prefix}-math-integrals:before { content: $ti-icon-math-integrals; } -.#{$ti-prefix}-math-lower:before { content: $ti-icon-math-lower; } -.#{$ti-prefix}-math-max:before { content: $ti-icon-math-max; } -.#{$ti-prefix}-math-min:before { content: $ti-icon-math-min; } -.#{$ti-prefix}-math-not:before { content: $ti-icon-math-not; } -.#{$ti-prefix}-math-off:before { content: $ti-icon-math-off; } -.#{$ti-prefix}-math-pi:before { content: $ti-icon-math-pi; } -.#{$ti-prefix}-math-pi-divide-2:before { content: $ti-icon-math-pi-divide-2; } -.#{$ti-prefix}-math-symbols:before { content: $ti-icon-math-symbols; } -.#{$ti-prefix}-math-x-divide-2:before { content: $ti-icon-math-x-divide-2; } -.#{$ti-prefix}-math-x-divide-y:before { content: $ti-icon-math-x-divide-y; } -.#{$ti-prefix}-math-x-divide-y-2:before { content: $ti-icon-math-x-divide-y-2; } -.#{$ti-prefix}-math-x-minus-x:before { content: $ti-icon-math-x-minus-x; } -.#{$ti-prefix}-math-x-minus-y:before { content: $ti-icon-math-x-minus-y; } -.#{$ti-prefix}-math-x-plus-x:before { content: $ti-icon-math-x-plus-x; } -.#{$ti-prefix}-math-x-plus-y:before { content: $ti-icon-math-x-plus-y; } -.#{$ti-prefix}-math-xy:before { content: $ti-icon-math-xy; } -.#{$ti-prefix}-math-y-minus-y:before { content: $ti-icon-math-y-minus-y; } -.#{$ti-prefix}-math-y-plus-y:before { content: $ti-icon-math-y-plus-y; } -.#{$ti-prefix}-maximize:before { content: $ti-icon-maximize; } -.#{$ti-prefix}-maximize-off:before { content: $ti-icon-maximize-off; } -.#{$ti-prefix}-meat:before { content: $ti-icon-meat; } -.#{$ti-prefix}-meat-off:before { content: $ti-icon-meat-off; } -.#{$ti-prefix}-medal:before { content: $ti-icon-medal; } -.#{$ti-prefix}-medal-2:before { content: $ti-icon-medal-2; } -.#{$ti-prefix}-medical-cross:before { content: $ti-icon-medical-cross; } -.#{$ti-prefix}-medical-cross-filled:before { content: $ti-icon-medical-cross-filled; } -.#{$ti-prefix}-medical-cross-off:before { content: $ti-icon-medical-cross-off; } -.#{$ti-prefix}-medicine-syrup:before { content: $ti-icon-medicine-syrup; } -.#{$ti-prefix}-meeple:before { content: $ti-icon-meeple; } -.#{$ti-prefix}-menorah:before { content: $ti-icon-menorah; } -.#{$ti-prefix}-menu:before { content: $ti-icon-menu; } -.#{$ti-prefix}-menu-2:before { content: $ti-icon-menu-2; } -.#{$ti-prefix}-menu-order:before { content: $ti-icon-menu-order; } -.#{$ti-prefix}-message:before { content: $ti-icon-message; } -.#{$ti-prefix}-message-2:before { content: $ti-icon-message-2; } -.#{$ti-prefix}-message-2-bolt:before { content: $ti-icon-message-2-bolt; } -.#{$ti-prefix}-message-2-cancel:before { content: $ti-icon-message-2-cancel; } -.#{$ti-prefix}-message-2-check:before { content: $ti-icon-message-2-check; } -.#{$ti-prefix}-message-2-code:before { content: $ti-icon-message-2-code; } -.#{$ti-prefix}-message-2-cog:before { content: $ti-icon-message-2-cog; } -.#{$ti-prefix}-message-2-dollar:before { content: $ti-icon-message-2-dollar; } -.#{$ti-prefix}-message-2-down:before { content: $ti-icon-message-2-down; } -.#{$ti-prefix}-message-2-exclamation:before { content: $ti-icon-message-2-exclamation; } -.#{$ti-prefix}-message-2-heart:before { content: $ti-icon-message-2-heart; } -.#{$ti-prefix}-message-2-minus:before { content: $ti-icon-message-2-minus; } -.#{$ti-prefix}-message-2-off:before { content: $ti-icon-message-2-off; } -.#{$ti-prefix}-message-2-pause:before { content: $ti-icon-message-2-pause; } -.#{$ti-prefix}-message-2-pin:before { content: $ti-icon-message-2-pin; } -.#{$ti-prefix}-message-2-plus:before { content: $ti-icon-message-2-plus; } -.#{$ti-prefix}-message-2-question:before { content: $ti-icon-message-2-question; } -.#{$ti-prefix}-message-2-search:before { content: $ti-icon-message-2-search; } -.#{$ti-prefix}-message-2-share:before { content: $ti-icon-message-2-share; } -.#{$ti-prefix}-message-2-star:before { content: $ti-icon-message-2-star; } -.#{$ti-prefix}-message-2-up:before { content: $ti-icon-message-2-up; } -.#{$ti-prefix}-message-2-x:before { content: $ti-icon-message-2-x; } -.#{$ti-prefix}-message-bolt:before { content: $ti-icon-message-bolt; } -.#{$ti-prefix}-message-cancel:before { content: $ti-icon-message-cancel; } -.#{$ti-prefix}-message-chatbot:before { content: $ti-icon-message-chatbot; } -.#{$ti-prefix}-message-check:before { content: $ti-icon-message-check; } -.#{$ti-prefix}-message-circle:before { content: $ti-icon-message-circle; } -.#{$ti-prefix}-message-circle-2:before { content: $ti-icon-message-circle-2; } -.#{$ti-prefix}-message-circle-2-filled:before { content: $ti-icon-message-circle-2-filled; } -.#{$ti-prefix}-message-circle-bolt:before { content: $ti-icon-message-circle-bolt; } -.#{$ti-prefix}-message-circle-cancel:before { content: $ti-icon-message-circle-cancel; } -.#{$ti-prefix}-message-circle-check:before { content: $ti-icon-message-circle-check; } -.#{$ti-prefix}-message-circle-code:before { content: $ti-icon-message-circle-code; } -.#{$ti-prefix}-message-circle-cog:before { content: $ti-icon-message-circle-cog; } -.#{$ti-prefix}-message-circle-dollar:before { content: $ti-icon-message-circle-dollar; } -.#{$ti-prefix}-message-circle-down:before { content: $ti-icon-message-circle-down; } -.#{$ti-prefix}-message-circle-exclamation:before { content: $ti-icon-message-circle-exclamation; } -.#{$ti-prefix}-message-circle-heart:before { content: $ti-icon-message-circle-heart; } -.#{$ti-prefix}-message-circle-minus:before { content: $ti-icon-message-circle-minus; } -.#{$ti-prefix}-message-circle-off:before { content: $ti-icon-message-circle-off; } -.#{$ti-prefix}-message-circle-pause:before { content: $ti-icon-message-circle-pause; } -.#{$ti-prefix}-message-circle-pin:before { content: $ti-icon-message-circle-pin; } -.#{$ti-prefix}-message-circle-plus:before { content: $ti-icon-message-circle-plus; } -.#{$ti-prefix}-message-circle-question:before { content: $ti-icon-message-circle-question; } -.#{$ti-prefix}-message-circle-search:before { content: $ti-icon-message-circle-search; } -.#{$ti-prefix}-message-circle-share:before { content: $ti-icon-message-circle-share; } -.#{$ti-prefix}-message-circle-star:before { content: $ti-icon-message-circle-star; } -.#{$ti-prefix}-message-circle-up:before { content: $ti-icon-message-circle-up; } -.#{$ti-prefix}-message-circle-x:before { content: $ti-icon-message-circle-x; } -.#{$ti-prefix}-message-code:before { content: $ti-icon-message-code; } -.#{$ti-prefix}-message-cog:before { content: $ti-icon-message-cog; } -.#{$ti-prefix}-message-dollar:before { content: $ti-icon-message-dollar; } -.#{$ti-prefix}-message-dots:before { content: $ti-icon-message-dots; } -.#{$ti-prefix}-message-down:before { content: $ti-icon-message-down; } -.#{$ti-prefix}-message-exclamation:before { content: $ti-icon-message-exclamation; } -.#{$ti-prefix}-message-forward:before { content: $ti-icon-message-forward; } -.#{$ti-prefix}-message-heart:before { content: $ti-icon-message-heart; } -.#{$ti-prefix}-message-language:before { content: $ti-icon-message-language; } -.#{$ti-prefix}-message-minus:before { content: $ti-icon-message-minus; } -.#{$ti-prefix}-message-off:before { content: $ti-icon-message-off; } -.#{$ti-prefix}-message-pause:before { content: $ti-icon-message-pause; } -.#{$ti-prefix}-message-pin:before { content: $ti-icon-message-pin; } -.#{$ti-prefix}-message-plus:before { content: $ti-icon-message-plus; } -.#{$ti-prefix}-message-question:before { content: $ti-icon-message-question; } -.#{$ti-prefix}-message-report:before { content: $ti-icon-message-report; } -.#{$ti-prefix}-message-search:before { content: $ti-icon-message-search; } -.#{$ti-prefix}-message-share:before { content: $ti-icon-message-share; } -.#{$ti-prefix}-message-star:before { content: $ti-icon-message-star; } -.#{$ti-prefix}-message-up:before { content: $ti-icon-message-up; } -.#{$ti-prefix}-message-x:before { content: $ti-icon-message-x; } -.#{$ti-prefix}-messages:before { content: $ti-icon-messages; } -.#{$ti-prefix}-messages-off:before { content: $ti-icon-messages-off; } -.#{$ti-prefix}-meteor:before { content: $ti-icon-meteor; } -.#{$ti-prefix}-meteor-off:before { content: $ti-icon-meteor-off; } -.#{$ti-prefix}-mickey:before { content: $ti-icon-mickey; } -.#{$ti-prefix}-mickey-filled:before { content: $ti-icon-mickey-filled; } -.#{$ti-prefix}-microphone:before { content: $ti-icon-microphone; } -.#{$ti-prefix}-microphone-2:before { content: $ti-icon-microphone-2; } -.#{$ti-prefix}-microphone-2-off:before { content: $ti-icon-microphone-2-off; } -.#{$ti-prefix}-microphone-off:before { content: $ti-icon-microphone-off; } -.#{$ti-prefix}-microscope:before { content: $ti-icon-microscope; } -.#{$ti-prefix}-microscope-off:before { content: $ti-icon-microscope-off; } -.#{$ti-prefix}-microwave:before { content: $ti-icon-microwave; } -.#{$ti-prefix}-microwave-off:before { content: $ti-icon-microwave-off; } -.#{$ti-prefix}-military-award:before { content: $ti-icon-military-award; } -.#{$ti-prefix}-military-rank:before { content: $ti-icon-military-rank; } -.#{$ti-prefix}-milk:before { content: $ti-icon-milk; } -.#{$ti-prefix}-milk-off:before { content: $ti-icon-milk-off; } -.#{$ti-prefix}-milkshake:before { content: $ti-icon-milkshake; } -.#{$ti-prefix}-minimize:before { content: $ti-icon-minimize; } -.#{$ti-prefix}-minus:before { content: $ti-icon-minus; } -.#{$ti-prefix}-minus-vertical:before { content: $ti-icon-minus-vertical; } -.#{$ti-prefix}-mist:before { content: $ti-icon-mist; } -.#{$ti-prefix}-mist-off:before { content: $ti-icon-mist-off; } -.#{$ti-prefix}-mobiledata:before { content: $ti-icon-mobiledata; } -.#{$ti-prefix}-mobiledata-off:before { content: $ti-icon-mobiledata-off; } -.#{$ti-prefix}-moneybag:before { content: $ti-icon-moneybag; } -.#{$ti-prefix}-mood-angry:before { content: $ti-icon-mood-angry; } -.#{$ti-prefix}-mood-annoyed:before { content: $ti-icon-mood-annoyed; } -.#{$ti-prefix}-mood-annoyed-2:before { content: $ti-icon-mood-annoyed-2; } -.#{$ti-prefix}-mood-boy:before { content: $ti-icon-mood-boy; } -.#{$ti-prefix}-mood-check:before { content: $ti-icon-mood-check; } -.#{$ti-prefix}-mood-cog:before { content: $ti-icon-mood-cog; } -.#{$ti-prefix}-mood-confuzed:before { content: $ti-icon-mood-confuzed; } -.#{$ti-prefix}-mood-confuzed-filled:before { content: $ti-icon-mood-confuzed-filled; } -.#{$ti-prefix}-mood-crazy-happy:before { content: $ti-icon-mood-crazy-happy; } -.#{$ti-prefix}-mood-cry:before { content: $ti-icon-mood-cry; } -.#{$ti-prefix}-mood-dollar:before { content: $ti-icon-mood-dollar; } -.#{$ti-prefix}-mood-empty:before { content: $ti-icon-mood-empty; } -.#{$ti-prefix}-mood-empty-filled:before { content: $ti-icon-mood-empty-filled; } -.#{$ti-prefix}-mood-happy:before { content: $ti-icon-mood-happy; } -.#{$ti-prefix}-mood-happy-filled:before { content: $ti-icon-mood-happy-filled; } -.#{$ti-prefix}-mood-heart:before { content: $ti-icon-mood-heart; } -.#{$ti-prefix}-mood-kid:before { content: $ti-icon-mood-kid; } -.#{$ti-prefix}-mood-kid-filled:before { content: $ti-icon-mood-kid-filled; } -.#{$ti-prefix}-mood-look-left:before { content: $ti-icon-mood-look-left; } -.#{$ti-prefix}-mood-look-right:before { content: $ti-icon-mood-look-right; } -.#{$ti-prefix}-mood-minus:before { content: $ti-icon-mood-minus; } -.#{$ti-prefix}-mood-nerd:before { content: $ti-icon-mood-nerd; } -.#{$ti-prefix}-mood-nervous:before { content: $ti-icon-mood-nervous; } -.#{$ti-prefix}-mood-neutral:before { content: $ti-icon-mood-neutral; } -.#{$ti-prefix}-mood-neutral-filled:before { content: $ti-icon-mood-neutral-filled; } -.#{$ti-prefix}-mood-off:before { content: $ti-icon-mood-off; } -.#{$ti-prefix}-mood-pin:before { content: $ti-icon-mood-pin; } -.#{$ti-prefix}-mood-plus:before { content: $ti-icon-mood-plus; } -.#{$ti-prefix}-mood-sad:before { content: $ti-icon-mood-sad; } -.#{$ti-prefix}-mood-sad-2:before { content: $ti-icon-mood-sad-2; } -.#{$ti-prefix}-mood-sad-dizzy:before { content: $ti-icon-mood-sad-dizzy; } -.#{$ti-prefix}-mood-sad-filled:before { content: $ti-icon-mood-sad-filled; } -.#{$ti-prefix}-mood-sad-squint:before { content: $ti-icon-mood-sad-squint; } -.#{$ti-prefix}-mood-search:before { content: $ti-icon-mood-search; } -.#{$ti-prefix}-mood-sick:before { content: $ti-icon-mood-sick; } -.#{$ti-prefix}-mood-silence:before { content: $ti-icon-mood-silence; } -.#{$ti-prefix}-mood-sing:before { content: $ti-icon-mood-sing; } -.#{$ti-prefix}-mood-smile:before { content: $ti-icon-mood-smile; } -.#{$ti-prefix}-mood-smile-beam:before { content: $ti-icon-mood-smile-beam; } -.#{$ti-prefix}-mood-smile-dizzy:before { content: $ti-icon-mood-smile-dizzy; } -.#{$ti-prefix}-mood-smile-filled:before { content: $ti-icon-mood-smile-filled; } -.#{$ti-prefix}-mood-suprised:before { content: $ti-icon-mood-suprised; } -.#{$ti-prefix}-mood-tongue:before { content: $ti-icon-mood-tongue; } -.#{$ti-prefix}-mood-tongue-wink:before { content: $ti-icon-mood-tongue-wink; } -.#{$ti-prefix}-mood-tongue-wink-2:before { content: $ti-icon-mood-tongue-wink-2; } -.#{$ti-prefix}-mood-unamused:before { content: $ti-icon-mood-unamused; } -.#{$ti-prefix}-mood-up:before { content: $ti-icon-mood-up; } -.#{$ti-prefix}-mood-wink:before { content: $ti-icon-mood-wink; } -.#{$ti-prefix}-mood-wink-2:before { content: $ti-icon-mood-wink-2; } -.#{$ti-prefix}-mood-wrrr:before { content: $ti-icon-mood-wrrr; } -.#{$ti-prefix}-mood-x:before { content: $ti-icon-mood-x; } -.#{$ti-prefix}-mood-xd:before { content: $ti-icon-mood-xd; } -.#{$ti-prefix}-moon:before { content: $ti-icon-moon; } -.#{$ti-prefix}-moon-2:before { content: $ti-icon-moon-2; } -.#{$ti-prefix}-moon-filled:before { content: $ti-icon-moon-filled; } -.#{$ti-prefix}-moon-off:before { content: $ti-icon-moon-off; } -.#{$ti-prefix}-moon-stars:before { content: $ti-icon-moon-stars; } -.#{$ti-prefix}-moped:before { content: $ti-icon-moped; } -.#{$ti-prefix}-motorbike:before { content: $ti-icon-motorbike; } -.#{$ti-prefix}-mountain:before { content: $ti-icon-mountain; } -.#{$ti-prefix}-mountain-off:before { content: $ti-icon-mountain-off; } -.#{$ti-prefix}-mouse:before { content: $ti-icon-mouse; } -.#{$ti-prefix}-mouse-2:before { content: $ti-icon-mouse-2; } -.#{$ti-prefix}-mouse-off:before { content: $ti-icon-mouse-off; } -.#{$ti-prefix}-moustache:before { content: $ti-icon-moustache; } -.#{$ti-prefix}-movie:before { content: $ti-icon-movie; } -.#{$ti-prefix}-movie-off:before { content: $ti-icon-movie-off; } -.#{$ti-prefix}-mug:before { content: $ti-icon-mug; } -.#{$ti-prefix}-mug-off:before { content: $ti-icon-mug-off; } -.#{$ti-prefix}-multiplier-0-5x:before { content: $ti-icon-multiplier-0-5x; } -.#{$ti-prefix}-multiplier-1-5x:before { content: $ti-icon-multiplier-1-5x; } -.#{$ti-prefix}-multiplier-1x:before { content: $ti-icon-multiplier-1x; } -.#{$ti-prefix}-multiplier-2x:before { content: $ti-icon-multiplier-2x; } -.#{$ti-prefix}-mushroom:before { content: $ti-icon-mushroom; } -.#{$ti-prefix}-mushroom-filled:before { content: $ti-icon-mushroom-filled; } -.#{$ti-prefix}-mushroom-off:before { content: $ti-icon-mushroom-off; } -.#{$ti-prefix}-music:before { content: $ti-icon-music; } -.#{$ti-prefix}-music-off:before { content: $ti-icon-music-off; } -.#{$ti-prefix}-navigation:before { content: $ti-icon-navigation; } -.#{$ti-prefix}-navigation-filled:before { content: $ti-icon-navigation-filled; } -.#{$ti-prefix}-navigation-off:before { content: $ti-icon-navigation-off; } -.#{$ti-prefix}-needle:before { content: $ti-icon-needle; } -.#{$ti-prefix}-needle-thread:before { content: $ti-icon-needle-thread; } -.#{$ti-prefix}-network:before { content: $ti-icon-network; } -.#{$ti-prefix}-network-off:before { content: $ti-icon-network-off; } -.#{$ti-prefix}-new-section:before { content: $ti-icon-new-section; } -.#{$ti-prefix}-news:before { content: $ti-icon-news; } -.#{$ti-prefix}-news-off:before { content: $ti-icon-news-off; } -.#{$ti-prefix}-nfc:before { content: $ti-icon-nfc; } -.#{$ti-prefix}-nfc-off:before { content: $ti-icon-nfc-off; } -.#{$ti-prefix}-no-copyright:before { content: $ti-icon-no-copyright; } -.#{$ti-prefix}-no-creative-commons:before { content: $ti-icon-no-creative-commons; } -.#{$ti-prefix}-no-derivatives:before { content: $ti-icon-no-derivatives; } -.#{$ti-prefix}-north-star:before { content: $ti-icon-north-star; } -.#{$ti-prefix}-note:before { content: $ti-icon-note; } -.#{$ti-prefix}-note-off:before { content: $ti-icon-note-off; } -.#{$ti-prefix}-notebook:before { content: $ti-icon-notebook; } -.#{$ti-prefix}-notebook-off:before { content: $ti-icon-notebook-off; } -.#{$ti-prefix}-notes:before { content: $ti-icon-notes; } -.#{$ti-prefix}-notes-off:before { content: $ti-icon-notes-off; } -.#{$ti-prefix}-notification:before { content: $ti-icon-notification; } -.#{$ti-prefix}-notification-off:before { content: $ti-icon-notification-off; } -.#{$ti-prefix}-number:before { content: $ti-icon-number; } -.#{$ti-prefix}-number-0:before { content: $ti-icon-number-0; } -.#{$ti-prefix}-number-1:before { content: $ti-icon-number-1; } -.#{$ti-prefix}-number-2:before { content: $ti-icon-number-2; } -.#{$ti-prefix}-number-3:before { content: $ti-icon-number-3; } -.#{$ti-prefix}-number-4:before { content: $ti-icon-number-4; } -.#{$ti-prefix}-number-5:before { content: $ti-icon-number-5; } -.#{$ti-prefix}-number-6:before { content: $ti-icon-number-6; } -.#{$ti-prefix}-number-7:before { content: $ti-icon-number-7; } -.#{$ti-prefix}-number-8:before { content: $ti-icon-number-8; } -.#{$ti-prefix}-number-9:before { content: $ti-icon-number-9; } -.#{$ti-prefix}-numbers:before { content: $ti-icon-numbers; } -.#{$ti-prefix}-nurse:before { content: $ti-icon-nurse; } -.#{$ti-prefix}-octagon:before { content: $ti-icon-octagon; } -.#{$ti-prefix}-octagon-filled:before { content: $ti-icon-octagon-filled; } -.#{$ti-prefix}-octagon-off:before { content: $ti-icon-octagon-off; } -.#{$ti-prefix}-old:before { content: $ti-icon-old; } -.#{$ti-prefix}-olympics:before { content: $ti-icon-olympics; } -.#{$ti-prefix}-olympics-off:before { content: $ti-icon-olympics-off; } -.#{$ti-prefix}-om:before { content: $ti-icon-om; } -.#{$ti-prefix}-omega:before { content: $ti-icon-omega; } -.#{$ti-prefix}-outbound:before { content: $ti-icon-outbound; } -.#{$ti-prefix}-outlet:before { content: $ti-icon-outlet; } -.#{$ti-prefix}-oval:before { content: $ti-icon-oval; } -.#{$ti-prefix}-oval-filled:before { content: $ti-icon-oval-filled; } -.#{$ti-prefix}-oval-vertical:before { content: $ti-icon-oval-vertical; } -.#{$ti-prefix}-oval-vertical-filled:before { content: $ti-icon-oval-vertical-filled; } -.#{$ti-prefix}-overline:before { content: $ti-icon-overline; } -.#{$ti-prefix}-package:before { content: $ti-icon-package; } -.#{$ti-prefix}-package-export:before { content: $ti-icon-package-export; } -.#{$ti-prefix}-package-import:before { content: $ti-icon-package-import; } -.#{$ti-prefix}-package-off:before { content: $ti-icon-package-off; } -.#{$ti-prefix}-packages:before { content: $ti-icon-packages; } -.#{$ti-prefix}-pacman:before { content: $ti-icon-pacman; } -.#{$ti-prefix}-page-break:before { content: $ti-icon-page-break; } -.#{$ti-prefix}-paint:before { content: $ti-icon-paint; } -.#{$ti-prefix}-paint-filled:before { content: $ti-icon-paint-filled; } -.#{$ti-prefix}-paint-off:before { content: $ti-icon-paint-off; } -.#{$ti-prefix}-palette:before { content: $ti-icon-palette; } -.#{$ti-prefix}-palette-off:before { content: $ti-icon-palette-off; } -.#{$ti-prefix}-panorama-horizontal:before { content: $ti-icon-panorama-horizontal; } -.#{$ti-prefix}-panorama-horizontal-off:before { content: $ti-icon-panorama-horizontal-off; } -.#{$ti-prefix}-panorama-vertical:before { content: $ti-icon-panorama-vertical; } -.#{$ti-prefix}-panorama-vertical-off:before { content: $ti-icon-panorama-vertical-off; } -.#{$ti-prefix}-paper-bag:before { content: $ti-icon-paper-bag; } -.#{$ti-prefix}-paper-bag-off:before { content: $ti-icon-paper-bag-off; } -.#{$ti-prefix}-paperclip:before { content: $ti-icon-paperclip; } -.#{$ti-prefix}-parachute:before { content: $ti-icon-parachute; } -.#{$ti-prefix}-parachute-off:before { content: $ti-icon-parachute-off; } -.#{$ti-prefix}-parentheses:before { content: $ti-icon-parentheses; } -.#{$ti-prefix}-parentheses-off:before { content: $ti-icon-parentheses-off; } -.#{$ti-prefix}-parking:before { content: $ti-icon-parking; } -.#{$ti-prefix}-parking-off:before { content: $ti-icon-parking-off; } -.#{$ti-prefix}-password:before { content: $ti-icon-password; } -.#{$ti-prefix}-paw:before { content: $ti-icon-paw; } -.#{$ti-prefix}-paw-filled:before { content: $ti-icon-paw-filled; } -.#{$ti-prefix}-paw-off:before { content: $ti-icon-paw-off; } -.#{$ti-prefix}-pdf:before { content: $ti-icon-pdf; } -.#{$ti-prefix}-peace:before { content: $ti-icon-peace; } -.#{$ti-prefix}-pencil:before { content: $ti-icon-pencil; } -.#{$ti-prefix}-pencil-minus:before { content: $ti-icon-pencil-minus; } -.#{$ti-prefix}-pencil-off:before { content: $ti-icon-pencil-off; } -.#{$ti-prefix}-pencil-plus:before { content: $ti-icon-pencil-plus; } -.#{$ti-prefix}-pennant:before { content: $ti-icon-pennant; } -.#{$ti-prefix}-pennant-2:before { content: $ti-icon-pennant-2; } -.#{$ti-prefix}-pennant-2-filled:before { content: $ti-icon-pennant-2-filled; } -.#{$ti-prefix}-pennant-filled:before { content: $ti-icon-pennant-filled; } -.#{$ti-prefix}-pennant-off:before { content: $ti-icon-pennant-off; } -.#{$ti-prefix}-pentagon:before { content: $ti-icon-pentagon; } -.#{$ti-prefix}-pentagon-filled:before { content: $ti-icon-pentagon-filled; } -.#{$ti-prefix}-pentagon-off:before { content: $ti-icon-pentagon-off; } -.#{$ti-prefix}-pentagram:before { content: $ti-icon-pentagram; } -.#{$ti-prefix}-pepper:before { content: $ti-icon-pepper; } -.#{$ti-prefix}-pepper-off:before { content: $ti-icon-pepper-off; } -.#{$ti-prefix}-percentage:before { content: $ti-icon-percentage; } -.#{$ti-prefix}-perfume:before { content: $ti-icon-perfume; } -.#{$ti-prefix}-perspective:before { content: $ti-icon-perspective; } -.#{$ti-prefix}-perspective-off:before { content: $ti-icon-perspective-off; } -.#{$ti-prefix}-phone:before { content: $ti-icon-phone; } -.#{$ti-prefix}-phone-call:before { content: $ti-icon-phone-call; } -.#{$ti-prefix}-phone-calling:before { content: $ti-icon-phone-calling; } -.#{$ti-prefix}-phone-check:before { content: $ti-icon-phone-check; } -.#{$ti-prefix}-phone-incoming:before { content: $ti-icon-phone-incoming; } -.#{$ti-prefix}-phone-off:before { content: $ti-icon-phone-off; } -.#{$ti-prefix}-phone-outgoing:before { content: $ti-icon-phone-outgoing; } -.#{$ti-prefix}-phone-pause:before { content: $ti-icon-phone-pause; } -.#{$ti-prefix}-phone-plus:before { content: $ti-icon-phone-plus; } -.#{$ti-prefix}-phone-x:before { content: $ti-icon-phone-x; } -.#{$ti-prefix}-photo:before { content: $ti-icon-photo; } -.#{$ti-prefix}-photo-bolt:before { content: $ti-icon-photo-bolt; } -.#{$ti-prefix}-photo-cancel:before { content: $ti-icon-photo-cancel; } -.#{$ti-prefix}-photo-check:before { content: $ti-icon-photo-check; } -.#{$ti-prefix}-photo-code:before { content: $ti-icon-photo-code; } -.#{$ti-prefix}-photo-cog:before { content: $ti-icon-photo-cog; } -.#{$ti-prefix}-photo-dollar:before { content: $ti-icon-photo-dollar; } -.#{$ti-prefix}-photo-down:before { content: $ti-icon-photo-down; } -.#{$ti-prefix}-photo-edit:before { content: $ti-icon-photo-edit; } -.#{$ti-prefix}-photo-exclamation:before { content: $ti-icon-photo-exclamation; } -.#{$ti-prefix}-photo-heart:before { content: $ti-icon-photo-heart; } -.#{$ti-prefix}-photo-minus:before { content: $ti-icon-photo-minus; } -.#{$ti-prefix}-photo-off:before { content: $ti-icon-photo-off; } -.#{$ti-prefix}-photo-pause:before { content: $ti-icon-photo-pause; } -.#{$ti-prefix}-photo-pin:before { content: $ti-icon-photo-pin; } -.#{$ti-prefix}-photo-plus:before { content: $ti-icon-photo-plus; } -.#{$ti-prefix}-photo-question:before { content: $ti-icon-photo-question; } -.#{$ti-prefix}-photo-search:before { content: $ti-icon-photo-search; } -.#{$ti-prefix}-photo-sensor:before { content: $ti-icon-photo-sensor; } -.#{$ti-prefix}-photo-sensor-2:before { content: $ti-icon-photo-sensor-2; } -.#{$ti-prefix}-photo-sensor-3:before { content: $ti-icon-photo-sensor-3; } -.#{$ti-prefix}-photo-share:before { content: $ti-icon-photo-share; } -.#{$ti-prefix}-photo-shield:before { content: $ti-icon-photo-shield; } -.#{$ti-prefix}-photo-star:before { content: $ti-icon-photo-star; } -.#{$ti-prefix}-photo-up:before { content: $ti-icon-photo-up; } -.#{$ti-prefix}-photo-x:before { content: $ti-icon-photo-x; } -.#{$ti-prefix}-physotherapist:before { content: $ti-icon-physotherapist; } -.#{$ti-prefix}-picture-in-picture:before { content: $ti-icon-picture-in-picture; } -.#{$ti-prefix}-picture-in-picture-off:before { content: $ti-icon-picture-in-picture-off; } -.#{$ti-prefix}-picture-in-picture-on:before { content: $ti-icon-picture-in-picture-on; } -.#{$ti-prefix}-picture-in-picture-top:before { content: $ti-icon-picture-in-picture-top; } -.#{$ti-prefix}-pig:before { content: $ti-icon-pig; } -.#{$ti-prefix}-pig-money:before { content: $ti-icon-pig-money; } -.#{$ti-prefix}-pig-off:before { content: $ti-icon-pig-off; } -.#{$ti-prefix}-pilcrow:before { content: $ti-icon-pilcrow; } -.#{$ti-prefix}-pill:before { content: $ti-icon-pill; } -.#{$ti-prefix}-pill-off:before { content: $ti-icon-pill-off; } -.#{$ti-prefix}-pills:before { content: $ti-icon-pills; } -.#{$ti-prefix}-pin:before { content: $ti-icon-pin; } -.#{$ti-prefix}-pin-filled:before { content: $ti-icon-pin-filled; } -.#{$ti-prefix}-ping-pong:before { content: $ti-icon-ping-pong; } -.#{$ti-prefix}-pinned:before { content: $ti-icon-pinned; } -.#{$ti-prefix}-pinned-filled:before { content: $ti-icon-pinned-filled; } -.#{$ti-prefix}-pinned-off:before { content: $ti-icon-pinned-off; } -.#{$ti-prefix}-pizza:before { content: $ti-icon-pizza; } -.#{$ti-prefix}-pizza-off:before { content: $ti-icon-pizza-off; } -.#{$ti-prefix}-placeholder:before { content: $ti-icon-placeholder; } -.#{$ti-prefix}-plane:before { content: $ti-icon-plane; } -.#{$ti-prefix}-plane-arrival:before { content: $ti-icon-plane-arrival; } -.#{$ti-prefix}-plane-departure:before { content: $ti-icon-plane-departure; } -.#{$ti-prefix}-plane-inflight:before { content: $ti-icon-plane-inflight; } -.#{$ti-prefix}-plane-off:before { content: $ti-icon-plane-off; } -.#{$ti-prefix}-plane-tilt:before { content: $ti-icon-plane-tilt; } -.#{$ti-prefix}-planet:before { content: $ti-icon-planet; } -.#{$ti-prefix}-planet-off:before { content: $ti-icon-planet-off; } -.#{$ti-prefix}-plant:before { content: $ti-icon-plant; } -.#{$ti-prefix}-plant-2:before { content: $ti-icon-plant-2; } -.#{$ti-prefix}-plant-2-off:before { content: $ti-icon-plant-2-off; } -.#{$ti-prefix}-plant-off:before { content: $ti-icon-plant-off; } -.#{$ti-prefix}-play-card:before { content: $ti-icon-play-card; } -.#{$ti-prefix}-play-card-off:before { content: $ti-icon-play-card-off; } -.#{$ti-prefix}-player-eject:before { content: $ti-icon-player-eject; } -.#{$ti-prefix}-player-eject-filled:before { content: $ti-icon-player-eject-filled; } -.#{$ti-prefix}-player-pause:before { content: $ti-icon-player-pause; } -.#{$ti-prefix}-player-pause-filled:before { content: $ti-icon-player-pause-filled; } -.#{$ti-prefix}-player-play:before { content: $ti-icon-player-play; } -.#{$ti-prefix}-player-play-filled:before { content: $ti-icon-player-play-filled; } -.#{$ti-prefix}-player-record:before { content: $ti-icon-player-record; } -.#{$ti-prefix}-player-record-filled:before { content: $ti-icon-player-record-filled; } -.#{$ti-prefix}-player-skip-back:before { content: $ti-icon-player-skip-back; } -.#{$ti-prefix}-player-skip-back-filled:before { content: $ti-icon-player-skip-back-filled; } -.#{$ti-prefix}-player-skip-forward:before { content: $ti-icon-player-skip-forward; } -.#{$ti-prefix}-player-skip-forward-filled:before { content: $ti-icon-player-skip-forward-filled; } -.#{$ti-prefix}-player-stop:before { content: $ti-icon-player-stop; } -.#{$ti-prefix}-player-stop-filled:before { content: $ti-icon-player-stop-filled; } -.#{$ti-prefix}-player-track-next:before { content: $ti-icon-player-track-next; } -.#{$ti-prefix}-player-track-next-filled:before { content: $ti-icon-player-track-next-filled; } -.#{$ti-prefix}-player-track-prev:before { content: $ti-icon-player-track-prev; } -.#{$ti-prefix}-player-track-prev-filled:before { content: $ti-icon-player-track-prev-filled; } -.#{$ti-prefix}-playlist:before { content: $ti-icon-playlist; } -.#{$ti-prefix}-playlist-add:before { content: $ti-icon-playlist-add; } -.#{$ti-prefix}-playlist-off:before { content: $ti-icon-playlist-off; } -.#{$ti-prefix}-playlist-x:before { content: $ti-icon-playlist-x; } -.#{$ti-prefix}-playstation-circle:before { content: $ti-icon-playstation-circle; } -.#{$ti-prefix}-playstation-square:before { content: $ti-icon-playstation-square; } -.#{$ti-prefix}-playstation-triangle:before { content: $ti-icon-playstation-triangle; } -.#{$ti-prefix}-playstation-x:before { content: $ti-icon-playstation-x; } -.#{$ti-prefix}-plug:before { content: $ti-icon-plug; } -.#{$ti-prefix}-plug-connected:before { content: $ti-icon-plug-connected; } -.#{$ti-prefix}-plug-connected-x:before { content: $ti-icon-plug-connected-x; } -.#{$ti-prefix}-plug-off:before { content: $ti-icon-plug-off; } -.#{$ti-prefix}-plug-x:before { content: $ti-icon-plug-x; } -.#{$ti-prefix}-plus:before { content: $ti-icon-plus; } -.#{$ti-prefix}-plus-equal:before { content: $ti-icon-plus-equal; } -.#{$ti-prefix}-plus-minus:before { content: $ti-icon-plus-minus; } -.#{$ti-prefix}-png:before { content: $ti-icon-png; } -.#{$ti-prefix}-podium:before { content: $ti-icon-podium; } -.#{$ti-prefix}-podium-off:before { content: $ti-icon-podium-off; } -.#{$ti-prefix}-point:before { content: $ti-icon-point; } -.#{$ti-prefix}-point-filled:before { content: $ti-icon-point-filled; } -.#{$ti-prefix}-point-off:before { content: $ti-icon-point-off; } -.#{$ti-prefix}-pointer:before { content: $ti-icon-pointer; } -.#{$ti-prefix}-pointer-bolt:before { content: $ti-icon-pointer-bolt; } -.#{$ti-prefix}-pointer-cancel:before { content: $ti-icon-pointer-cancel; } -.#{$ti-prefix}-pointer-check:before { content: $ti-icon-pointer-check; } -.#{$ti-prefix}-pointer-code:before { content: $ti-icon-pointer-code; } -.#{$ti-prefix}-pointer-cog:before { content: $ti-icon-pointer-cog; } -.#{$ti-prefix}-pointer-dollar:before { content: $ti-icon-pointer-dollar; } -.#{$ti-prefix}-pointer-down:before { content: $ti-icon-pointer-down; } -.#{$ti-prefix}-pointer-exclamation:before { content: $ti-icon-pointer-exclamation; } -.#{$ti-prefix}-pointer-heart:before { content: $ti-icon-pointer-heart; } -.#{$ti-prefix}-pointer-minus:before { content: $ti-icon-pointer-minus; } -.#{$ti-prefix}-pointer-off:before { content: $ti-icon-pointer-off; } -.#{$ti-prefix}-pointer-pause:before { content: $ti-icon-pointer-pause; } -.#{$ti-prefix}-pointer-pin:before { content: $ti-icon-pointer-pin; } -.#{$ti-prefix}-pointer-plus:before { content: $ti-icon-pointer-plus; } -.#{$ti-prefix}-pointer-question:before { content: $ti-icon-pointer-question; } -.#{$ti-prefix}-pointer-search:before { content: $ti-icon-pointer-search; } -.#{$ti-prefix}-pointer-share:before { content: $ti-icon-pointer-share; } -.#{$ti-prefix}-pointer-star:before { content: $ti-icon-pointer-star; } -.#{$ti-prefix}-pointer-up:before { content: $ti-icon-pointer-up; } -.#{$ti-prefix}-pointer-x:before { content: $ti-icon-pointer-x; } -.#{$ti-prefix}-pokeball:before { content: $ti-icon-pokeball; } -.#{$ti-prefix}-pokeball-off:before { content: $ti-icon-pokeball-off; } -.#{$ti-prefix}-poker-chip:before { content: $ti-icon-poker-chip; } -.#{$ti-prefix}-polaroid:before { content: $ti-icon-polaroid; } -.#{$ti-prefix}-polygon:before { content: $ti-icon-polygon; } -.#{$ti-prefix}-polygon-off:before { content: $ti-icon-polygon-off; } -.#{$ti-prefix}-poo:before { content: $ti-icon-poo; } -.#{$ti-prefix}-pool:before { content: $ti-icon-pool; } -.#{$ti-prefix}-pool-off:before { content: $ti-icon-pool-off; } -.#{$ti-prefix}-power:before { content: $ti-icon-power; } -.#{$ti-prefix}-pray:before { content: $ti-icon-pray; } -.#{$ti-prefix}-premium-rights:before { content: $ti-icon-premium-rights; } -.#{$ti-prefix}-prescription:before { content: $ti-icon-prescription; } -.#{$ti-prefix}-presentation:before { content: $ti-icon-presentation; } -.#{$ti-prefix}-presentation-analytics:before { content: $ti-icon-presentation-analytics; } -.#{$ti-prefix}-presentation-off:before { content: $ti-icon-presentation-off; } -.#{$ti-prefix}-printer:before { content: $ti-icon-printer; } -.#{$ti-prefix}-printer-off:before { content: $ti-icon-printer-off; } -.#{$ti-prefix}-prison:before { content: $ti-icon-prison; } -.#{$ti-prefix}-prompt:before { content: $ti-icon-prompt; } -.#{$ti-prefix}-propeller:before { content: $ti-icon-propeller; } -.#{$ti-prefix}-propeller-off:before { content: $ti-icon-propeller-off; } -.#{$ti-prefix}-pumpkin-scary:before { content: $ti-icon-pumpkin-scary; } -.#{$ti-prefix}-puzzle:before { content: $ti-icon-puzzle; } -.#{$ti-prefix}-puzzle-2:before { content: $ti-icon-puzzle-2; } -.#{$ti-prefix}-puzzle-filled:before { content: $ti-icon-puzzle-filled; } -.#{$ti-prefix}-puzzle-off:before { content: $ti-icon-puzzle-off; } -.#{$ti-prefix}-pyramid:before { content: $ti-icon-pyramid; } -.#{$ti-prefix}-pyramid-off:before { content: $ti-icon-pyramid-off; } -.#{$ti-prefix}-qrcode:before { content: $ti-icon-qrcode; } -.#{$ti-prefix}-qrcode-off:before { content: $ti-icon-qrcode-off; } -.#{$ti-prefix}-question-mark:before { content: $ti-icon-question-mark; } -.#{$ti-prefix}-quote:before { content: $ti-icon-quote; } -.#{$ti-prefix}-quote-off:before { content: $ti-icon-quote-off; } -.#{$ti-prefix}-radar:before { content: $ti-icon-radar; } -.#{$ti-prefix}-radar-2:before { content: $ti-icon-radar-2; } -.#{$ti-prefix}-radar-off:before { content: $ti-icon-radar-off; } -.#{$ti-prefix}-radio:before { content: $ti-icon-radio; } -.#{$ti-prefix}-radio-off:before { content: $ti-icon-radio-off; } -.#{$ti-prefix}-radioactive:before { content: $ti-icon-radioactive; } -.#{$ti-prefix}-radioactive-filled:before { content: $ti-icon-radioactive-filled; } -.#{$ti-prefix}-radioactive-off:before { content: $ti-icon-radioactive-off; } -.#{$ti-prefix}-radius-bottom-left:before { content: $ti-icon-radius-bottom-left; } -.#{$ti-prefix}-radius-bottom-right:before { content: $ti-icon-radius-bottom-right; } -.#{$ti-prefix}-radius-top-left:before { content: $ti-icon-radius-top-left; } -.#{$ti-prefix}-radius-top-right:before { content: $ti-icon-radius-top-right; } -.#{$ti-prefix}-rainbow:before { content: $ti-icon-rainbow; } -.#{$ti-prefix}-rainbow-off:before { content: $ti-icon-rainbow-off; } -.#{$ti-prefix}-rating-12-plus:before { content: $ti-icon-rating-12-plus; } -.#{$ti-prefix}-rating-14-plus:before { content: $ti-icon-rating-14-plus; } -.#{$ti-prefix}-rating-16-plus:before { content: $ti-icon-rating-16-plus; } -.#{$ti-prefix}-rating-18-plus:before { content: $ti-icon-rating-18-plus; } -.#{$ti-prefix}-rating-21-plus:before { content: $ti-icon-rating-21-plus; } -.#{$ti-prefix}-razor:before { content: $ti-icon-razor; } -.#{$ti-prefix}-razor-electric:before { content: $ti-icon-razor-electric; } -.#{$ti-prefix}-receipt:before { content: $ti-icon-receipt; } -.#{$ti-prefix}-receipt-2:before { content: $ti-icon-receipt-2; } -.#{$ti-prefix}-receipt-off:before { content: $ti-icon-receipt-off; } -.#{$ti-prefix}-receipt-refund:before { content: $ti-icon-receipt-refund; } -.#{$ti-prefix}-receipt-tax:before { content: $ti-icon-receipt-tax; } -.#{$ti-prefix}-recharging:before { content: $ti-icon-recharging; } -.#{$ti-prefix}-record-mail:before { content: $ti-icon-record-mail; } -.#{$ti-prefix}-record-mail-off:before { content: $ti-icon-record-mail-off; } -.#{$ti-prefix}-rectangle:before { content: $ti-icon-rectangle; } -.#{$ti-prefix}-rectangle-filled:before { content: $ti-icon-rectangle-filled; } -.#{$ti-prefix}-rectangle-vertical:before { content: $ti-icon-rectangle-vertical; } -.#{$ti-prefix}-rectangle-vertical-filled:before { content: $ti-icon-rectangle-vertical-filled; } -.#{$ti-prefix}-recycle:before { content: $ti-icon-recycle; } -.#{$ti-prefix}-recycle-off:before { content: $ti-icon-recycle-off; } -.#{$ti-prefix}-refresh:before { content: $ti-icon-refresh; } -.#{$ti-prefix}-refresh-alert:before { content: $ti-icon-refresh-alert; } -.#{$ti-prefix}-refresh-dot:before { content: $ti-icon-refresh-dot; } -.#{$ti-prefix}-refresh-off:before { content: $ti-icon-refresh-off; } -.#{$ti-prefix}-regex:before { content: $ti-icon-regex; } -.#{$ti-prefix}-regex-off:before { content: $ti-icon-regex-off; } -.#{$ti-prefix}-registered:before { content: $ti-icon-registered; } -.#{$ti-prefix}-relation-many-to-many:before { content: $ti-icon-relation-many-to-many; } -.#{$ti-prefix}-relation-one-to-many:before { content: $ti-icon-relation-one-to-many; } -.#{$ti-prefix}-relation-one-to-one:before { content: $ti-icon-relation-one-to-one; } -.#{$ti-prefix}-reload:before { content: $ti-icon-reload; } -.#{$ti-prefix}-repeat:before { content: $ti-icon-repeat; } -.#{$ti-prefix}-repeat-off:before { content: $ti-icon-repeat-off; } -.#{$ti-prefix}-repeat-once:before { content: $ti-icon-repeat-once; } -.#{$ti-prefix}-replace:before { content: $ti-icon-replace; } -.#{$ti-prefix}-replace-filled:before { content: $ti-icon-replace-filled; } -.#{$ti-prefix}-replace-off:before { content: $ti-icon-replace-off; } -.#{$ti-prefix}-report:before { content: $ti-icon-report; } -.#{$ti-prefix}-report-analytics:before { content: $ti-icon-report-analytics; } -.#{$ti-prefix}-report-medical:before { content: $ti-icon-report-medical; } -.#{$ti-prefix}-report-money:before { content: $ti-icon-report-money; } -.#{$ti-prefix}-report-off:before { content: $ti-icon-report-off; } -.#{$ti-prefix}-report-search:before { content: $ti-icon-report-search; } -.#{$ti-prefix}-reserved-line:before { content: $ti-icon-reserved-line; } -.#{$ti-prefix}-resize:before { content: $ti-icon-resize; } -.#{$ti-prefix}-ribbon-health:before { content: $ti-icon-ribbon-health; } -.#{$ti-prefix}-ripple:before { content: $ti-icon-ripple; } -.#{$ti-prefix}-ripple-off:before { content: $ti-icon-ripple-off; } -.#{$ti-prefix}-road:before { content: $ti-icon-road; } -.#{$ti-prefix}-road-off:before { content: $ti-icon-road-off; } -.#{$ti-prefix}-road-sign:before { content: $ti-icon-road-sign; } -.#{$ti-prefix}-robot:before { content: $ti-icon-robot; } -.#{$ti-prefix}-robot-off:before { content: $ti-icon-robot-off; } -.#{$ti-prefix}-rocket:before { content: $ti-icon-rocket; } -.#{$ti-prefix}-rocket-off:before { content: $ti-icon-rocket-off; } -.#{$ti-prefix}-roller-skating:before { content: $ti-icon-roller-skating; } -.#{$ti-prefix}-rollercoaster:before { content: $ti-icon-rollercoaster; } -.#{$ti-prefix}-rollercoaster-off:before { content: $ti-icon-rollercoaster-off; } -.#{$ti-prefix}-rosette:before { content: $ti-icon-rosette; } -.#{$ti-prefix}-rosette-filled:before { content: $ti-icon-rosette-filled; } -.#{$ti-prefix}-rosette-number-0:before { content: $ti-icon-rosette-number-0; } -.#{$ti-prefix}-rosette-number-1:before { content: $ti-icon-rosette-number-1; } -.#{$ti-prefix}-rosette-number-2:before { content: $ti-icon-rosette-number-2; } -.#{$ti-prefix}-rosette-number-3:before { content: $ti-icon-rosette-number-3; } -.#{$ti-prefix}-rosette-number-4:before { content: $ti-icon-rosette-number-4; } -.#{$ti-prefix}-rosette-number-5:before { content: $ti-icon-rosette-number-5; } -.#{$ti-prefix}-rosette-number-6:before { content: $ti-icon-rosette-number-6; } -.#{$ti-prefix}-rosette-number-7:before { content: $ti-icon-rosette-number-7; } -.#{$ti-prefix}-rosette-number-8:before { content: $ti-icon-rosette-number-8; } -.#{$ti-prefix}-rosette-number-9:before { content: $ti-icon-rosette-number-9; } -.#{$ti-prefix}-rotate:before { content: $ti-icon-rotate; } -.#{$ti-prefix}-rotate-2:before { content: $ti-icon-rotate-2; } -.#{$ti-prefix}-rotate-360:before { content: $ti-icon-rotate-360; } -.#{$ti-prefix}-rotate-clockwise:before { content: $ti-icon-rotate-clockwise; } -.#{$ti-prefix}-rotate-clockwise-2:before { content: $ti-icon-rotate-clockwise-2; } -.#{$ti-prefix}-rotate-dot:before { content: $ti-icon-rotate-dot; } -.#{$ti-prefix}-rotate-rectangle:before { content: $ti-icon-rotate-rectangle; } -.#{$ti-prefix}-route:before { content: $ti-icon-route; } -.#{$ti-prefix}-route-2:before { content: $ti-icon-route-2; } -.#{$ti-prefix}-route-off:before { content: $ti-icon-route-off; } -.#{$ti-prefix}-router:before { content: $ti-icon-router; } -.#{$ti-prefix}-router-off:before { content: $ti-icon-router-off; } -.#{$ti-prefix}-row-insert-bottom:before { content: $ti-icon-row-insert-bottom; } -.#{$ti-prefix}-row-insert-top:before { content: $ti-icon-row-insert-top; } -.#{$ti-prefix}-rss:before { content: $ti-icon-rss; } -.#{$ti-prefix}-rubber-stamp:before { content: $ti-icon-rubber-stamp; } -.#{$ti-prefix}-rubber-stamp-off:before { content: $ti-icon-rubber-stamp-off; } -.#{$ti-prefix}-ruler:before { content: $ti-icon-ruler; } -.#{$ti-prefix}-ruler-2:before { content: $ti-icon-ruler-2; } -.#{$ti-prefix}-ruler-2-off:before { content: $ti-icon-ruler-2-off; } -.#{$ti-prefix}-ruler-3:before { content: $ti-icon-ruler-3; } -.#{$ti-prefix}-ruler-measure:before { content: $ti-icon-ruler-measure; } -.#{$ti-prefix}-ruler-off:before { content: $ti-icon-ruler-off; } -.#{$ti-prefix}-run:before { content: $ti-icon-run; } -.#{$ti-prefix}-s-turn-down:before { content: $ti-icon-s-turn-down; } -.#{$ti-prefix}-s-turn-left:before { content: $ti-icon-s-turn-left; } -.#{$ti-prefix}-s-turn-right:before { content: $ti-icon-s-turn-right; } -.#{$ti-prefix}-s-turn-up:before { content: $ti-icon-s-turn-up; } -.#{$ti-prefix}-sailboat:before { content: $ti-icon-sailboat; } -.#{$ti-prefix}-sailboat-2:before { content: $ti-icon-sailboat-2; } -.#{$ti-prefix}-sailboat-off:before { content: $ti-icon-sailboat-off; } -.#{$ti-prefix}-salad:before { content: $ti-icon-salad; } -.#{$ti-prefix}-salt:before { content: $ti-icon-salt; } -.#{$ti-prefix}-satellite:before { content: $ti-icon-satellite; } -.#{$ti-prefix}-satellite-off:before { content: $ti-icon-satellite-off; } -.#{$ti-prefix}-sausage:before { content: $ti-icon-sausage; } -.#{$ti-prefix}-scale:before { content: $ti-icon-scale; } -.#{$ti-prefix}-scale-off:before { content: $ti-icon-scale-off; } -.#{$ti-prefix}-scale-outline:before { content: $ti-icon-scale-outline; } -.#{$ti-prefix}-scale-outline-off:before { content: $ti-icon-scale-outline-off; } -.#{$ti-prefix}-scan:before { content: $ti-icon-scan; } -.#{$ti-prefix}-scan-eye:before { content: $ti-icon-scan-eye; } -.#{$ti-prefix}-schema:before { content: $ti-icon-schema; } -.#{$ti-prefix}-schema-off:before { content: $ti-icon-schema-off; } -.#{$ti-prefix}-school:before { content: $ti-icon-school; } -.#{$ti-prefix}-school-bell:before { content: $ti-icon-school-bell; } -.#{$ti-prefix}-school-off:before { content: $ti-icon-school-off; } -.#{$ti-prefix}-scissors:before { content: $ti-icon-scissors; } -.#{$ti-prefix}-scissors-off:before { content: $ti-icon-scissors-off; } -.#{$ti-prefix}-scooter:before { content: $ti-icon-scooter; } -.#{$ti-prefix}-scooter-electric:before { content: $ti-icon-scooter-electric; } -.#{$ti-prefix}-screen-share:before { content: $ti-icon-screen-share; } -.#{$ti-prefix}-screen-share-off:before { content: $ti-icon-screen-share-off; } -.#{$ti-prefix}-screenshot:before { content: $ti-icon-screenshot; } -.#{$ti-prefix}-scribble:before { content: $ti-icon-scribble; } -.#{$ti-prefix}-scribble-off:before { content: $ti-icon-scribble-off; } -.#{$ti-prefix}-script:before { content: $ti-icon-script; } -.#{$ti-prefix}-script-minus:before { content: $ti-icon-script-minus; } -.#{$ti-prefix}-script-plus:before { content: $ti-icon-script-plus; } -.#{$ti-prefix}-script-x:before { content: $ti-icon-script-x; } -.#{$ti-prefix}-scuba-mask:before { content: $ti-icon-scuba-mask; } -.#{$ti-prefix}-scuba-mask-off:before { content: $ti-icon-scuba-mask-off; } -.#{$ti-prefix}-sdk:before { content: $ti-icon-sdk; } -.#{$ti-prefix}-search:before { content: $ti-icon-search; } -.#{$ti-prefix}-search-off:before { content: $ti-icon-search-off; } -.#{$ti-prefix}-section:before { content: $ti-icon-section; } -.#{$ti-prefix}-section-sign:before { content: $ti-icon-section-sign; } -.#{$ti-prefix}-seeding:before { content: $ti-icon-seeding; } -.#{$ti-prefix}-seeding-off:before { content: $ti-icon-seeding-off; } -.#{$ti-prefix}-select:before { content: $ti-icon-select; } -.#{$ti-prefix}-select-all:before { content: $ti-icon-select-all; } -.#{$ti-prefix}-selector:before { content: $ti-icon-selector; } -.#{$ti-prefix}-send:before { content: $ti-icon-send; } -.#{$ti-prefix}-send-off:before { content: $ti-icon-send-off; } -.#{$ti-prefix}-seo:before { content: $ti-icon-seo; } -.#{$ti-prefix}-separator:before { content: $ti-icon-separator; } -.#{$ti-prefix}-separator-horizontal:before { content: $ti-icon-separator-horizontal; } -.#{$ti-prefix}-separator-vertical:before { content: $ti-icon-separator-vertical; } -.#{$ti-prefix}-server:before { content: $ti-icon-server; } -.#{$ti-prefix}-server-2:before { content: $ti-icon-server-2; } -.#{$ti-prefix}-server-bolt:before { content: $ti-icon-server-bolt; } -.#{$ti-prefix}-server-cog:before { content: $ti-icon-server-cog; } -.#{$ti-prefix}-server-off:before { content: $ti-icon-server-off; } -.#{$ti-prefix}-servicemark:before { content: $ti-icon-servicemark; } -.#{$ti-prefix}-settings:before { content: $ti-icon-settings; } -.#{$ti-prefix}-settings-2:before { content: $ti-icon-settings-2; } -.#{$ti-prefix}-settings-automation:before { content: $ti-icon-settings-automation; } -.#{$ti-prefix}-settings-bolt:before { content: $ti-icon-settings-bolt; } -.#{$ti-prefix}-settings-cancel:before { content: $ti-icon-settings-cancel; } -.#{$ti-prefix}-settings-check:before { content: $ti-icon-settings-check; } -.#{$ti-prefix}-settings-code:before { content: $ti-icon-settings-code; } -.#{$ti-prefix}-settings-cog:before { content: $ti-icon-settings-cog; } -.#{$ti-prefix}-settings-dollar:before { content: $ti-icon-settings-dollar; } -.#{$ti-prefix}-settings-down:before { content: $ti-icon-settings-down; } -.#{$ti-prefix}-settings-exclamation:before { content: $ti-icon-settings-exclamation; } -.#{$ti-prefix}-settings-filled:before { content: $ti-icon-settings-filled; } -.#{$ti-prefix}-settings-heart:before { content: $ti-icon-settings-heart; } -.#{$ti-prefix}-settings-minus:before { content: $ti-icon-settings-minus; } -.#{$ti-prefix}-settings-off:before { content: $ti-icon-settings-off; } -.#{$ti-prefix}-settings-pause:before { content: $ti-icon-settings-pause; } -.#{$ti-prefix}-settings-pin:before { content: $ti-icon-settings-pin; } -.#{$ti-prefix}-settings-plus:before { content: $ti-icon-settings-plus; } -.#{$ti-prefix}-settings-question:before { content: $ti-icon-settings-question; } -.#{$ti-prefix}-settings-search:before { content: $ti-icon-settings-search; } -.#{$ti-prefix}-settings-share:before { content: $ti-icon-settings-share; } -.#{$ti-prefix}-settings-star:before { content: $ti-icon-settings-star; } -.#{$ti-prefix}-settings-up:before { content: $ti-icon-settings-up; } -.#{$ti-prefix}-settings-x:before { content: $ti-icon-settings-x; } -.#{$ti-prefix}-shadow:before { content: $ti-icon-shadow; } -.#{$ti-prefix}-shadow-off:before { content: $ti-icon-shadow-off; } -.#{$ti-prefix}-shape:before { content: $ti-icon-shape; } -.#{$ti-prefix}-shape-2:before { content: $ti-icon-shape-2; } -.#{$ti-prefix}-shape-3:before { content: $ti-icon-shape-3; } -.#{$ti-prefix}-shape-off:before { content: $ti-icon-shape-off; } -.#{$ti-prefix}-share:before { content: $ti-icon-share; } -.#{$ti-prefix}-share-2:before { content: $ti-icon-share-2; } -.#{$ti-prefix}-share-3:before { content: $ti-icon-share-3; } -.#{$ti-prefix}-share-off:before { content: $ti-icon-share-off; } -.#{$ti-prefix}-shield:before { content: $ti-icon-shield; } -.#{$ti-prefix}-shield-bolt:before { content: $ti-icon-shield-bolt; } -.#{$ti-prefix}-shield-cancel:before { content: $ti-icon-shield-cancel; } -.#{$ti-prefix}-shield-check:before { content: $ti-icon-shield-check; } -.#{$ti-prefix}-shield-check-filled:before { content: $ti-icon-shield-check-filled; } -.#{$ti-prefix}-shield-checkered:before { content: $ti-icon-shield-checkered; } -.#{$ti-prefix}-shield-checkered-filled:before { content: $ti-icon-shield-checkered-filled; } -.#{$ti-prefix}-shield-chevron:before { content: $ti-icon-shield-chevron; } -.#{$ti-prefix}-shield-code:before { content: $ti-icon-shield-code; } -.#{$ti-prefix}-shield-cog:before { content: $ti-icon-shield-cog; } -.#{$ti-prefix}-shield-dollar:before { content: $ti-icon-shield-dollar; } -.#{$ti-prefix}-shield-down:before { content: $ti-icon-shield-down; } -.#{$ti-prefix}-shield-exclamation:before { content: $ti-icon-shield-exclamation; } -.#{$ti-prefix}-shield-filled:before { content: $ti-icon-shield-filled; } -.#{$ti-prefix}-shield-half:before { content: $ti-icon-shield-half; } -.#{$ti-prefix}-shield-half-filled:before { content: $ti-icon-shield-half-filled; } -.#{$ti-prefix}-shield-heart:before { content: $ti-icon-shield-heart; } -.#{$ti-prefix}-shield-lock:before { content: $ti-icon-shield-lock; } -.#{$ti-prefix}-shield-lock-filled:before { content: $ti-icon-shield-lock-filled; } -.#{$ti-prefix}-shield-minus:before { content: $ti-icon-shield-minus; } -.#{$ti-prefix}-shield-off:before { content: $ti-icon-shield-off; } -.#{$ti-prefix}-shield-pause:before { content: $ti-icon-shield-pause; } -.#{$ti-prefix}-shield-pin:before { content: $ti-icon-shield-pin; } -.#{$ti-prefix}-shield-plus:before { content: $ti-icon-shield-plus; } -.#{$ti-prefix}-shield-question:before { content: $ti-icon-shield-question; } -.#{$ti-prefix}-shield-search:before { content: $ti-icon-shield-search; } -.#{$ti-prefix}-shield-share:before { content: $ti-icon-shield-share; } -.#{$ti-prefix}-shield-star:before { content: $ti-icon-shield-star; } -.#{$ti-prefix}-shield-up:before { content: $ti-icon-shield-up; } -.#{$ti-prefix}-shield-x:before { content: $ti-icon-shield-x; } -.#{$ti-prefix}-ship:before { content: $ti-icon-ship; } -.#{$ti-prefix}-ship-off:before { content: $ti-icon-ship-off; } -.#{$ti-prefix}-shirt:before { content: $ti-icon-shirt; } -.#{$ti-prefix}-shirt-filled:before { content: $ti-icon-shirt-filled; } -.#{$ti-prefix}-shirt-off:before { content: $ti-icon-shirt-off; } -.#{$ti-prefix}-shirt-sport:before { content: $ti-icon-shirt-sport; } -.#{$ti-prefix}-shoe:before { content: $ti-icon-shoe; } -.#{$ti-prefix}-shoe-off:before { content: $ti-icon-shoe-off; } -.#{$ti-prefix}-shopping-bag:before { content: $ti-icon-shopping-bag; } -.#{$ti-prefix}-shopping-cart:before { content: $ti-icon-shopping-cart; } -.#{$ti-prefix}-shopping-cart-discount:before { content: $ti-icon-shopping-cart-discount; } -.#{$ti-prefix}-shopping-cart-off:before { content: $ti-icon-shopping-cart-off; } -.#{$ti-prefix}-shopping-cart-plus:before { content: $ti-icon-shopping-cart-plus; } -.#{$ti-prefix}-shopping-cart-x:before { content: $ti-icon-shopping-cart-x; } -.#{$ti-prefix}-shovel:before { content: $ti-icon-shovel; } -.#{$ti-prefix}-shredder:before { content: $ti-icon-shredder; } -.#{$ti-prefix}-sign-left:before { content: $ti-icon-sign-left; } -.#{$ti-prefix}-sign-left-filled:before { content: $ti-icon-sign-left-filled; } -.#{$ti-prefix}-sign-right:before { content: $ti-icon-sign-right; } -.#{$ti-prefix}-sign-right-filled:before { content: $ti-icon-sign-right-filled; } -.#{$ti-prefix}-signal-2g:before { content: $ti-icon-signal-2g; } -.#{$ti-prefix}-signal-3g:before { content: $ti-icon-signal-3g; } -.#{$ti-prefix}-signal-4g:before { content: $ti-icon-signal-4g; } -.#{$ti-prefix}-signal-4g-plus:before { content: $ti-icon-signal-4g-plus; } -.#{$ti-prefix}-signal-5g:before { content: $ti-icon-signal-5g; } -.#{$ti-prefix}-signal-6g:before { content: $ti-icon-signal-6g; } -.#{$ti-prefix}-signal-e:before { content: $ti-icon-signal-e; } -.#{$ti-prefix}-signal-g:before { content: $ti-icon-signal-g; } -.#{$ti-prefix}-signal-h:before { content: $ti-icon-signal-h; } -.#{$ti-prefix}-signal-h-plus:before { content: $ti-icon-signal-h-plus; } -.#{$ti-prefix}-signal-lte:before { content: $ti-icon-signal-lte; } -.#{$ti-prefix}-signature:before { content: $ti-icon-signature; } -.#{$ti-prefix}-signature-off:before { content: $ti-icon-signature-off; } -.#{$ti-prefix}-sitemap:before { content: $ti-icon-sitemap; } -.#{$ti-prefix}-sitemap-off:before { content: $ti-icon-sitemap-off; } -.#{$ti-prefix}-skateboard:before { content: $ti-icon-skateboard; } -.#{$ti-prefix}-skateboard-off:before { content: $ti-icon-skateboard-off; } -.#{$ti-prefix}-skull:before { content: $ti-icon-skull; } -.#{$ti-prefix}-slash:before { content: $ti-icon-slash; } -.#{$ti-prefix}-slashes:before { content: $ti-icon-slashes; } -.#{$ti-prefix}-sleigh:before { content: $ti-icon-sleigh; } -.#{$ti-prefix}-slice:before { content: $ti-icon-slice; } -.#{$ti-prefix}-slideshow:before { content: $ti-icon-slideshow; } -.#{$ti-prefix}-smart-home:before { content: $ti-icon-smart-home; } -.#{$ti-prefix}-smart-home-off:before { content: $ti-icon-smart-home-off; } -.#{$ti-prefix}-smoking:before { content: $ti-icon-smoking; } -.#{$ti-prefix}-smoking-no:before { content: $ti-icon-smoking-no; } -.#{$ti-prefix}-snowflake:before { content: $ti-icon-snowflake; } -.#{$ti-prefix}-snowflake-off:before { content: $ti-icon-snowflake-off; } -.#{$ti-prefix}-snowman:before { content: $ti-icon-snowman; } -.#{$ti-prefix}-soccer-field:before { content: $ti-icon-soccer-field; } -.#{$ti-prefix}-social:before { content: $ti-icon-social; } -.#{$ti-prefix}-social-off:before { content: $ti-icon-social-off; } -.#{$ti-prefix}-sock:before { content: $ti-icon-sock; } -.#{$ti-prefix}-sofa:before { content: $ti-icon-sofa; } -.#{$ti-prefix}-sofa-off:before { content: $ti-icon-sofa-off; } -.#{$ti-prefix}-solar-panel:before { content: $ti-icon-solar-panel; } -.#{$ti-prefix}-solar-panel-2:before { content: $ti-icon-solar-panel-2; } -.#{$ti-prefix}-sort-0-9:before { content: $ti-icon-sort-0-9; } -.#{$ti-prefix}-sort-9-0:before { content: $ti-icon-sort-9-0; } -.#{$ti-prefix}-sort-a-z:before { content: $ti-icon-sort-a-z; } -.#{$ti-prefix}-sort-ascending:before { content: $ti-icon-sort-ascending; } -.#{$ti-prefix}-sort-ascending-2:before { content: $ti-icon-sort-ascending-2; } -.#{$ti-prefix}-sort-ascending-letters:before { content: $ti-icon-sort-ascending-letters; } -.#{$ti-prefix}-sort-ascending-numbers:before { content: $ti-icon-sort-ascending-numbers; } -.#{$ti-prefix}-sort-descending:before { content: $ti-icon-sort-descending; } -.#{$ti-prefix}-sort-descending-2:before { content: $ti-icon-sort-descending-2; } -.#{$ti-prefix}-sort-descending-letters:before { content: $ti-icon-sort-descending-letters; } -.#{$ti-prefix}-sort-descending-numbers:before { content: $ti-icon-sort-descending-numbers; } -.#{$ti-prefix}-sort-z-a:before { content: $ti-icon-sort-z-a; } -.#{$ti-prefix}-sos:before { content: $ti-icon-sos; } -.#{$ti-prefix}-soup:before { content: $ti-icon-soup; } -.#{$ti-prefix}-soup-off:before { content: $ti-icon-soup-off; } -.#{$ti-prefix}-source-code:before { content: $ti-icon-source-code; } -.#{$ti-prefix}-space:before { content: $ti-icon-space; } -.#{$ti-prefix}-space-off:before { content: $ti-icon-space-off; } -.#{$ti-prefix}-spacing-horizontal:before { content: $ti-icon-spacing-horizontal; } -.#{$ti-prefix}-spacing-vertical:before { content: $ti-icon-spacing-vertical; } -.#{$ti-prefix}-spade:before { content: $ti-icon-spade; } -.#{$ti-prefix}-spade-filled:before { content: $ti-icon-spade-filled; } -.#{$ti-prefix}-sparkles:before { content: $ti-icon-sparkles; } -.#{$ti-prefix}-speakerphone:before { content: $ti-icon-speakerphone; } -.#{$ti-prefix}-speedboat:before { content: $ti-icon-speedboat; } -.#{$ti-prefix}-spider:before { content: $ti-icon-spider; } -.#{$ti-prefix}-spiral:before { content: $ti-icon-spiral; } -.#{$ti-prefix}-spiral-off:before { content: $ti-icon-spiral-off; } -.#{$ti-prefix}-sport-billard:before { content: $ti-icon-sport-billard; } -.#{$ti-prefix}-spray:before { content: $ti-icon-spray; } -.#{$ti-prefix}-spy:before { content: $ti-icon-spy; } -.#{$ti-prefix}-spy-off:before { content: $ti-icon-spy-off; } -.#{$ti-prefix}-sql:before { content: $ti-icon-sql; } -.#{$ti-prefix}-square:before { content: $ti-icon-square; } -.#{$ti-prefix}-square-0-filled:before { content: $ti-icon-square-0-filled; } -.#{$ti-prefix}-square-1-filled:before { content: $ti-icon-square-1-filled; } -.#{$ti-prefix}-square-2-filled:before { content: $ti-icon-square-2-filled; } -.#{$ti-prefix}-square-3-filled:before { content: $ti-icon-square-3-filled; } -.#{$ti-prefix}-square-4-filled:before { content: $ti-icon-square-4-filled; } -.#{$ti-prefix}-square-5-filled:before { content: $ti-icon-square-5-filled; } -.#{$ti-prefix}-square-6-filled:before { content: $ti-icon-square-6-filled; } -.#{$ti-prefix}-square-7-filled:before { content: $ti-icon-square-7-filled; } -.#{$ti-prefix}-square-8-filled:before { content: $ti-icon-square-8-filled; } -.#{$ti-prefix}-square-9-filled:before { content: $ti-icon-square-9-filled; } -.#{$ti-prefix}-square-arrow-down:before { content: $ti-icon-square-arrow-down; } -.#{$ti-prefix}-square-arrow-left:before { content: $ti-icon-square-arrow-left; } -.#{$ti-prefix}-square-arrow-right:before { content: $ti-icon-square-arrow-right; } -.#{$ti-prefix}-square-arrow-up:before { content: $ti-icon-square-arrow-up; } -.#{$ti-prefix}-square-asterisk:before { content: $ti-icon-square-asterisk; } -.#{$ti-prefix}-square-check:before { content: $ti-icon-square-check; } -.#{$ti-prefix}-square-check-filled:before { content: $ti-icon-square-check-filled; } -.#{$ti-prefix}-square-chevron-down:before { content: $ti-icon-square-chevron-down; } -.#{$ti-prefix}-square-chevron-left:before { content: $ti-icon-square-chevron-left; } -.#{$ti-prefix}-square-chevron-right:before { content: $ti-icon-square-chevron-right; } -.#{$ti-prefix}-square-chevron-up:before { content: $ti-icon-square-chevron-up; } -.#{$ti-prefix}-square-chevrons-down:before { content: $ti-icon-square-chevrons-down; } -.#{$ti-prefix}-square-chevrons-left:before { content: $ti-icon-square-chevrons-left; } -.#{$ti-prefix}-square-chevrons-right:before { content: $ti-icon-square-chevrons-right; } -.#{$ti-prefix}-square-chevrons-up:before { content: $ti-icon-square-chevrons-up; } -.#{$ti-prefix}-square-dot:before { content: $ti-icon-square-dot; } -.#{$ti-prefix}-square-f0:before { content: $ti-icon-square-f0; } -.#{$ti-prefix}-square-f0-filled:before { content: $ti-icon-square-f0-filled; } -.#{$ti-prefix}-square-f1:before { content: $ti-icon-square-f1; } -.#{$ti-prefix}-square-f1-filled:before { content: $ti-icon-square-f1-filled; } -.#{$ti-prefix}-square-f2:before { content: $ti-icon-square-f2; } -.#{$ti-prefix}-square-f2-filled:before { content: $ti-icon-square-f2-filled; } -.#{$ti-prefix}-square-f3:before { content: $ti-icon-square-f3; } -.#{$ti-prefix}-square-f3-filled:before { content: $ti-icon-square-f3-filled; } -.#{$ti-prefix}-square-f4:before { content: $ti-icon-square-f4; } -.#{$ti-prefix}-square-f4-filled:before { content: $ti-icon-square-f4-filled; } -.#{$ti-prefix}-square-f5:before { content: $ti-icon-square-f5; } -.#{$ti-prefix}-square-f5-filled:before { content: $ti-icon-square-f5-filled; } -.#{$ti-prefix}-square-f6:before { content: $ti-icon-square-f6; } -.#{$ti-prefix}-square-f6-filled:before { content: $ti-icon-square-f6-filled; } -.#{$ti-prefix}-square-f7:before { content: $ti-icon-square-f7; } -.#{$ti-prefix}-square-f7-filled:before { content: $ti-icon-square-f7-filled; } -.#{$ti-prefix}-square-f8:before { content: $ti-icon-square-f8; } -.#{$ti-prefix}-square-f8-filled:before { content: $ti-icon-square-f8-filled; } -.#{$ti-prefix}-square-f9:before { content: $ti-icon-square-f9; } -.#{$ti-prefix}-square-f9-filled:before { content: $ti-icon-square-f9-filled; } -.#{$ti-prefix}-square-forbid:before { content: $ti-icon-square-forbid; } -.#{$ti-prefix}-square-forbid-2:before { content: $ti-icon-square-forbid-2; } -.#{$ti-prefix}-square-half:before { content: $ti-icon-square-half; } -.#{$ti-prefix}-square-key:before { content: $ti-icon-square-key; } -.#{$ti-prefix}-square-letter-a:before { content: $ti-icon-square-letter-a; } -.#{$ti-prefix}-square-letter-b:before { content: $ti-icon-square-letter-b; } -.#{$ti-prefix}-square-letter-c:before { content: $ti-icon-square-letter-c; } -.#{$ti-prefix}-square-letter-d:before { content: $ti-icon-square-letter-d; } -.#{$ti-prefix}-square-letter-e:before { content: $ti-icon-square-letter-e; } -.#{$ti-prefix}-square-letter-f:before { content: $ti-icon-square-letter-f; } -.#{$ti-prefix}-square-letter-g:before { content: $ti-icon-square-letter-g; } -.#{$ti-prefix}-square-letter-h:before { content: $ti-icon-square-letter-h; } -.#{$ti-prefix}-square-letter-i:before { content: $ti-icon-square-letter-i; } -.#{$ti-prefix}-square-letter-j:before { content: $ti-icon-square-letter-j; } -.#{$ti-prefix}-square-letter-k:before { content: $ti-icon-square-letter-k; } -.#{$ti-prefix}-square-letter-l:before { content: $ti-icon-square-letter-l; } -.#{$ti-prefix}-square-letter-m:before { content: $ti-icon-square-letter-m; } -.#{$ti-prefix}-square-letter-n:before { content: $ti-icon-square-letter-n; } -.#{$ti-prefix}-square-letter-o:before { content: $ti-icon-square-letter-o; } -.#{$ti-prefix}-square-letter-p:before { content: $ti-icon-square-letter-p; } -.#{$ti-prefix}-square-letter-q:before { content: $ti-icon-square-letter-q; } -.#{$ti-prefix}-square-letter-r:before { content: $ti-icon-square-letter-r; } -.#{$ti-prefix}-square-letter-s:before { content: $ti-icon-square-letter-s; } -.#{$ti-prefix}-square-letter-t:before { content: $ti-icon-square-letter-t; } -.#{$ti-prefix}-square-letter-u:before { content: $ti-icon-square-letter-u; } -.#{$ti-prefix}-square-letter-v:before { content: $ti-icon-square-letter-v; } -.#{$ti-prefix}-square-letter-w:before { content: $ti-icon-square-letter-w; } -.#{$ti-prefix}-square-letter-x:before { content: $ti-icon-square-letter-x; } -.#{$ti-prefix}-square-letter-y:before { content: $ti-icon-square-letter-y; } -.#{$ti-prefix}-square-letter-z:before { content: $ti-icon-square-letter-z; } -.#{$ti-prefix}-square-minus:before { content: $ti-icon-square-minus; } -.#{$ti-prefix}-square-number-0:before { content: $ti-icon-square-number-0; } -.#{$ti-prefix}-square-number-1:before { content: $ti-icon-square-number-1; } -.#{$ti-prefix}-square-number-2:before { content: $ti-icon-square-number-2; } -.#{$ti-prefix}-square-number-3:before { content: $ti-icon-square-number-3; } -.#{$ti-prefix}-square-number-4:before { content: $ti-icon-square-number-4; } -.#{$ti-prefix}-square-number-5:before { content: $ti-icon-square-number-5; } -.#{$ti-prefix}-square-number-6:before { content: $ti-icon-square-number-6; } -.#{$ti-prefix}-square-number-7:before { content: $ti-icon-square-number-7; } -.#{$ti-prefix}-square-number-8:before { content: $ti-icon-square-number-8; } -.#{$ti-prefix}-square-number-9:before { content: $ti-icon-square-number-9; } -.#{$ti-prefix}-square-off:before { content: $ti-icon-square-off; } -.#{$ti-prefix}-square-plus:before { content: $ti-icon-square-plus; } -.#{$ti-prefix}-square-root:before { content: $ti-icon-square-root; } -.#{$ti-prefix}-square-root-2:before { content: $ti-icon-square-root-2; } -.#{$ti-prefix}-square-rotated:before { content: $ti-icon-square-rotated; } -.#{$ti-prefix}-square-rotated-filled:before { content: $ti-icon-square-rotated-filled; } -.#{$ti-prefix}-square-rotated-forbid:before { content: $ti-icon-square-rotated-forbid; } -.#{$ti-prefix}-square-rotated-forbid-2:before { content: $ti-icon-square-rotated-forbid-2; } -.#{$ti-prefix}-square-rotated-off:before { content: $ti-icon-square-rotated-off; } -.#{$ti-prefix}-square-rounded:before { content: $ti-icon-square-rounded; } -.#{$ti-prefix}-square-rounded-arrow-down:before { content: $ti-icon-square-rounded-arrow-down; } -.#{$ti-prefix}-square-rounded-arrow-down-filled:before { content: $ti-icon-square-rounded-arrow-down-filled; } -.#{$ti-prefix}-square-rounded-arrow-left:before { content: $ti-icon-square-rounded-arrow-left; } -.#{$ti-prefix}-square-rounded-arrow-left-filled:before { content: $ti-icon-square-rounded-arrow-left-filled; } -.#{$ti-prefix}-square-rounded-arrow-right:before { content: $ti-icon-square-rounded-arrow-right; } -.#{$ti-prefix}-square-rounded-arrow-right-filled:before { content: $ti-icon-square-rounded-arrow-right-filled; } -.#{$ti-prefix}-square-rounded-arrow-up:before { content: $ti-icon-square-rounded-arrow-up; } -.#{$ti-prefix}-square-rounded-arrow-up-filled:before { content: $ti-icon-square-rounded-arrow-up-filled; } -.#{$ti-prefix}-square-rounded-check:before { content: $ti-icon-square-rounded-check; } -.#{$ti-prefix}-square-rounded-check-filled:before { content: $ti-icon-square-rounded-check-filled; } -.#{$ti-prefix}-square-rounded-chevron-down:before { content: $ti-icon-square-rounded-chevron-down; } -.#{$ti-prefix}-square-rounded-chevron-down-filled:before { content: $ti-icon-square-rounded-chevron-down-filled; } -.#{$ti-prefix}-square-rounded-chevron-left:before { content: $ti-icon-square-rounded-chevron-left; } -.#{$ti-prefix}-square-rounded-chevron-left-filled:before { content: $ti-icon-square-rounded-chevron-left-filled; } -.#{$ti-prefix}-square-rounded-chevron-right:before { content: $ti-icon-square-rounded-chevron-right; } -.#{$ti-prefix}-square-rounded-chevron-right-filled:before { content: $ti-icon-square-rounded-chevron-right-filled; } -.#{$ti-prefix}-square-rounded-chevron-up:before { content: $ti-icon-square-rounded-chevron-up; } -.#{$ti-prefix}-square-rounded-chevron-up-filled:before { content: $ti-icon-square-rounded-chevron-up-filled; } -.#{$ti-prefix}-square-rounded-chevrons-down:before { content: $ti-icon-square-rounded-chevrons-down; } -.#{$ti-prefix}-square-rounded-chevrons-down-filled:before { content: $ti-icon-square-rounded-chevrons-down-filled; } -.#{$ti-prefix}-square-rounded-chevrons-left:before { content: $ti-icon-square-rounded-chevrons-left; } -.#{$ti-prefix}-square-rounded-chevrons-left-filled:before { content: $ti-icon-square-rounded-chevrons-left-filled; } -.#{$ti-prefix}-square-rounded-chevrons-right:before { content: $ti-icon-square-rounded-chevrons-right; } -.#{$ti-prefix}-square-rounded-chevrons-right-filled:before { content: $ti-icon-square-rounded-chevrons-right-filled; } -.#{$ti-prefix}-square-rounded-chevrons-up:before { content: $ti-icon-square-rounded-chevrons-up; } -.#{$ti-prefix}-square-rounded-chevrons-up-filled:before { content: $ti-icon-square-rounded-chevrons-up-filled; } -.#{$ti-prefix}-square-rounded-filled:before { content: $ti-icon-square-rounded-filled; } -.#{$ti-prefix}-square-rounded-letter-a:before { content: $ti-icon-square-rounded-letter-a; } -.#{$ti-prefix}-square-rounded-letter-b:before { content: $ti-icon-square-rounded-letter-b; } -.#{$ti-prefix}-square-rounded-letter-c:before { content: $ti-icon-square-rounded-letter-c; } -.#{$ti-prefix}-square-rounded-letter-d:before { content: $ti-icon-square-rounded-letter-d; } -.#{$ti-prefix}-square-rounded-letter-e:before { content: $ti-icon-square-rounded-letter-e; } -.#{$ti-prefix}-square-rounded-letter-f:before { content: $ti-icon-square-rounded-letter-f; } -.#{$ti-prefix}-square-rounded-letter-g:before { content: $ti-icon-square-rounded-letter-g; } -.#{$ti-prefix}-square-rounded-letter-h:before { content: $ti-icon-square-rounded-letter-h; } -.#{$ti-prefix}-square-rounded-letter-i:before { content: $ti-icon-square-rounded-letter-i; } -.#{$ti-prefix}-square-rounded-letter-j:before { content: $ti-icon-square-rounded-letter-j; } -.#{$ti-prefix}-square-rounded-letter-k:before { content: $ti-icon-square-rounded-letter-k; } -.#{$ti-prefix}-square-rounded-letter-l:before { content: $ti-icon-square-rounded-letter-l; } -.#{$ti-prefix}-square-rounded-letter-m:before { content: $ti-icon-square-rounded-letter-m; } -.#{$ti-prefix}-square-rounded-letter-n:before { content: $ti-icon-square-rounded-letter-n; } -.#{$ti-prefix}-square-rounded-letter-o:before { content: $ti-icon-square-rounded-letter-o; } -.#{$ti-prefix}-square-rounded-letter-p:before { content: $ti-icon-square-rounded-letter-p; } -.#{$ti-prefix}-square-rounded-letter-q:before { content: $ti-icon-square-rounded-letter-q; } -.#{$ti-prefix}-square-rounded-letter-r:before { content: $ti-icon-square-rounded-letter-r; } -.#{$ti-prefix}-square-rounded-letter-s:before { content: $ti-icon-square-rounded-letter-s; } -.#{$ti-prefix}-square-rounded-letter-t:before { content: $ti-icon-square-rounded-letter-t; } -.#{$ti-prefix}-square-rounded-letter-u:before { content: $ti-icon-square-rounded-letter-u; } -.#{$ti-prefix}-square-rounded-letter-v:before { content: $ti-icon-square-rounded-letter-v; } -.#{$ti-prefix}-square-rounded-letter-w:before { content: $ti-icon-square-rounded-letter-w; } -.#{$ti-prefix}-square-rounded-letter-x:before { content: $ti-icon-square-rounded-letter-x; } -.#{$ti-prefix}-square-rounded-letter-y:before { content: $ti-icon-square-rounded-letter-y; } -.#{$ti-prefix}-square-rounded-letter-z:before { content: $ti-icon-square-rounded-letter-z; } -.#{$ti-prefix}-square-rounded-minus:before { content: $ti-icon-square-rounded-minus; } -.#{$ti-prefix}-square-rounded-number-0:before { content: $ti-icon-square-rounded-number-0; } -.#{$ti-prefix}-square-rounded-number-0-filled:before { content: $ti-icon-square-rounded-number-0-filled; } -.#{$ti-prefix}-square-rounded-number-1:before { content: $ti-icon-square-rounded-number-1; } -.#{$ti-prefix}-square-rounded-number-1-filled:before { content: $ti-icon-square-rounded-number-1-filled; } -.#{$ti-prefix}-square-rounded-number-2:before { content: $ti-icon-square-rounded-number-2; } -.#{$ti-prefix}-square-rounded-number-2-filled:before { content: $ti-icon-square-rounded-number-2-filled; } -.#{$ti-prefix}-square-rounded-number-3:before { content: $ti-icon-square-rounded-number-3; } -.#{$ti-prefix}-square-rounded-number-3-filled:before { content: $ti-icon-square-rounded-number-3-filled; } -.#{$ti-prefix}-square-rounded-number-4:before { content: $ti-icon-square-rounded-number-4; } -.#{$ti-prefix}-square-rounded-number-4-filled:before { content: $ti-icon-square-rounded-number-4-filled; } -.#{$ti-prefix}-square-rounded-number-5:before { content: $ti-icon-square-rounded-number-5; } -.#{$ti-prefix}-square-rounded-number-5-filled:before { content: $ti-icon-square-rounded-number-5-filled; } -.#{$ti-prefix}-square-rounded-number-6:before { content: $ti-icon-square-rounded-number-6; } -.#{$ti-prefix}-square-rounded-number-6-filled:before { content: $ti-icon-square-rounded-number-6-filled; } -.#{$ti-prefix}-square-rounded-number-7:before { content: $ti-icon-square-rounded-number-7; } -.#{$ti-prefix}-square-rounded-number-7-filled:before { content: $ti-icon-square-rounded-number-7-filled; } -.#{$ti-prefix}-square-rounded-number-8:before { content: $ti-icon-square-rounded-number-8; } -.#{$ti-prefix}-square-rounded-number-8-filled:before { content: $ti-icon-square-rounded-number-8-filled; } -.#{$ti-prefix}-square-rounded-number-9:before { content: $ti-icon-square-rounded-number-9; } -.#{$ti-prefix}-square-rounded-number-9-filled:before { content: $ti-icon-square-rounded-number-9-filled; } -.#{$ti-prefix}-square-rounded-plus:before { content: $ti-icon-square-rounded-plus; } -.#{$ti-prefix}-square-rounded-plus-filled:before { content: $ti-icon-square-rounded-plus-filled; } -.#{$ti-prefix}-square-rounded-x:before { content: $ti-icon-square-rounded-x; } -.#{$ti-prefix}-square-rounded-x-filled:before { content: $ti-icon-square-rounded-x-filled; } -.#{$ti-prefix}-square-toggle:before { content: $ti-icon-square-toggle; } -.#{$ti-prefix}-square-toggle-horizontal:before { content: $ti-icon-square-toggle-horizontal; } -.#{$ti-prefix}-square-x:before { content: $ti-icon-square-x; } -.#{$ti-prefix}-squares-diagonal:before { content: $ti-icon-squares-diagonal; } -.#{$ti-prefix}-squares-filled:before { content: $ti-icon-squares-filled; } -.#{$ti-prefix}-stack:before { content: $ti-icon-stack; } -.#{$ti-prefix}-stack-2:before { content: $ti-icon-stack-2; } -.#{$ti-prefix}-stack-3:before { content: $ti-icon-stack-3; } -.#{$ti-prefix}-stack-pop:before { content: $ti-icon-stack-pop; } -.#{$ti-prefix}-stack-push:before { content: $ti-icon-stack-push; } -.#{$ti-prefix}-stairs:before { content: $ti-icon-stairs; } -.#{$ti-prefix}-stairs-down:before { content: $ti-icon-stairs-down; } -.#{$ti-prefix}-stairs-up:before { content: $ti-icon-stairs-up; } -.#{$ti-prefix}-star:before { content: $ti-icon-star; } -.#{$ti-prefix}-star-filled:before { content: $ti-icon-star-filled; } -.#{$ti-prefix}-star-half:before { content: $ti-icon-star-half; } -.#{$ti-prefix}-star-half-filled:before { content: $ti-icon-star-half-filled; } -.#{$ti-prefix}-star-off:before { content: $ti-icon-star-off; } -.#{$ti-prefix}-stars:before { content: $ti-icon-stars; } -.#{$ti-prefix}-stars-filled:before { content: $ti-icon-stars-filled; } -.#{$ti-prefix}-stars-off:before { content: $ti-icon-stars-off; } -.#{$ti-prefix}-status-change:before { content: $ti-icon-status-change; } -.#{$ti-prefix}-steam:before { content: $ti-icon-steam; } -.#{$ti-prefix}-steering-wheel:before { content: $ti-icon-steering-wheel; } -.#{$ti-prefix}-steering-wheel-off:before { content: $ti-icon-steering-wheel-off; } -.#{$ti-prefix}-step-into:before { content: $ti-icon-step-into; } -.#{$ti-prefix}-step-out:before { content: $ti-icon-step-out; } -.#{$ti-prefix}-stereo-glasses:before { content: $ti-icon-stereo-glasses; } -.#{$ti-prefix}-stethoscope:before { content: $ti-icon-stethoscope; } -.#{$ti-prefix}-stethoscope-off:before { content: $ti-icon-stethoscope-off; } -.#{$ti-prefix}-sticker:before { content: $ti-icon-sticker; } -.#{$ti-prefix}-storm:before { content: $ti-icon-storm; } -.#{$ti-prefix}-storm-off:before { content: $ti-icon-storm-off; } -.#{$ti-prefix}-stretching:before { content: $ti-icon-stretching; } -.#{$ti-prefix}-strikethrough:before { content: $ti-icon-strikethrough; } -.#{$ti-prefix}-submarine:before { content: $ti-icon-submarine; } -.#{$ti-prefix}-subscript:before { content: $ti-icon-subscript; } -.#{$ti-prefix}-subtask:before { content: $ti-icon-subtask; } -.#{$ti-prefix}-sum:before { content: $ti-icon-sum; } -.#{$ti-prefix}-sum-off:before { content: $ti-icon-sum-off; } -.#{$ti-prefix}-sun:before { content: $ti-icon-sun; } -.#{$ti-prefix}-sun-filled:before { content: $ti-icon-sun-filled; } -.#{$ti-prefix}-sun-high:before { content: $ti-icon-sun-high; } -.#{$ti-prefix}-sun-low:before { content: $ti-icon-sun-low; } -.#{$ti-prefix}-sun-moon:before { content: $ti-icon-sun-moon; } -.#{$ti-prefix}-sun-off:before { content: $ti-icon-sun-off; } -.#{$ti-prefix}-sun-wind:before { content: $ti-icon-sun-wind; } -.#{$ti-prefix}-sunglasses:before { content: $ti-icon-sunglasses; } -.#{$ti-prefix}-sunrise:before { content: $ti-icon-sunrise; } -.#{$ti-prefix}-sunset:before { content: $ti-icon-sunset; } -.#{$ti-prefix}-sunset-2:before { content: $ti-icon-sunset-2; } -.#{$ti-prefix}-superscript:before { content: $ti-icon-superscript; } -.#{$ti-prefix}-svg:before { content: $ti-icon-svg; } -.#{$ti-prefix}-swimming:before { content: $ti-icon-swimming; } -.#{$ti-prefix}-swipe:before { content: $ti-icon-swipe; } -.#{$ti-prefix}-switch:before { content: $ti-icon-switch; } -.#{$ti-prefix}-switch-2:before { content: $ti-icon-switch-2; } -.#{$ti-prefix}-switch-3:before { content: $ti-icon-switch-3; } -.#{$ti-prefix}-switch-horizontal:before { content: $ti-icon-switch-horizontal; } -.#{$ti-prefix}-switch-vertical:before { content: $ti-icon-switch-vertical; } -.#{$ti-prefix}-sword:before { content: $ti-icon-sword; } -.#{$ti-prefix}-sword-off:before { content: $ti-icon-sword-off; } -.#{$ti-prefix}-swords:before { content: $ti-icon-swords; } -.#{$ti-prefix}-table:before { content: $ti-icon-table; } -.#{$ti-prefix}-table-alias:before { content: $ti-icon-table-alias; } -.#{$ti-prefix}-table-export:before { content: $ti-icon-table-export; } -.#{$ti-prefix}-table-filled:before { content: $ti-icon-table-filled; } -.#{$ti-prefix}-table-import:before { content: $ti-icon-table-import; } -.#{$ti-prefix}-table-off:before { content: $ti-icon-table-off; } -.#{$ti-prefix}-table-options:before { content: $ti-icon-table-options; } -.#{$ti-prefix}-table-shortcut:before { content: $ti-icon-table-shortcut; } -.#{$ti-prefix}-tag:before { content: $ti-icon-tag; } -.#{$ti-prefix}-tag-off:before { content: $ti-icon-tag-off; } -.#{$ti-prefix}-tags:before { content: $ti-icon-tags; } -.#{$ti-prefix}-tags-off:before { content: $ti-icon-tags-off; } -.#{$ti-prefix}-tallymark-1:before { content: $ti-icon-tallymark-1; } -.#{$ti-prefix}-tallymark-2:before { content: $ti-icon-tallymark-2; } -.#{$ti-prefix}-tallymark-3:before { content: $ti-icon-tallymark-3; } -.#{$ti-prefix}-tallymark-4:before { content: $ti-icon-tallymark-4; } -.#{$ti-prefix}-tallymarks:before { content: $ti-icon-tallymarks; } -.#{$ti-prefix}-tank:before { content: $ti-icon-tank; } -.#{$ti-prefix}-target:before { content: $ti-icon-target; } -.#{$ti-prefix}-target-arrow:before { content: $ti-icon-target-arrow; } -.#{$ti-prefix}-target-off:before { content: $ti-icon-target-off; } -.#{$ti-prefix}-teapot:before { content: $ti-icon-teapot; } -.#{$ti-prefix}-telescope:before { content: $ti-icon-telescope; } -.#{$ti-prefix}-telescope-off:before { content: $ti-icon-telescope-off; } -.#{$ti-prefix}-temperature:before { content: $ti-icon-temperature; } -.#{$ti-prefix}-temperature-celsius:before { content: $ti-icon-temperature-celsius; } -.#{$ti-prefix}-temperature-fahrenheit:before { content: $ti-icon-temperature-fahrenheit; } -.#{$ti-prefix}-temperature-minus:before { content: $ti-icon-temperature-minus; } -.#{$ti-prefix}-temperature-off:before { content: $ti-icon-temperature-off; } -.#{$ti-prefix}-temperature-plus:before { content: $ti-icon-temperature-plus; } -.#{$ti-prefix}-template:before { content: $ti-icon-template; } -.#{$ti-prefix}-template-off:before { content: $ti-icon-template-off; } -.#{$ti-prefix}-tent:before { content: $ti-icon-tent; } -.#{$ti-prefix}-tent-off:before { content: $ti-icon-tent-off; } -.#{$ti-prefix}-terminal:before { content: $ti-icon-terminal; } -.#{$ti-prefix}-terminal-2:before { content: $ti-icon-terminal-2; } -.#{$ti-prefix}-test-pipe:before { content: $ti-icon-test-pipe; } -.#{$ti-prefix}-test-pipe-2:before { content: $ti-icon-test-pipe-2; } -.#{$ti-prefix}-test-pipe-off:before { content: $ti-icon-test-pipe-off; } -.#{$ti-prefix}-tex:before { content: $ti-icon-tex; } -.#{$ti-prefix}-text-caption:before { content: $ti-icon-text-caption; } -.#{$ti-prefix}-text-color:before { content: $ti-icon-text-color; } -.#{$ti-prefix}-text-decrease:before { content: $ti-icon-text-decrease; } -.#{$ti-prefix}-text-direction-ltr:before { content: $ti-icon-text-direction-ltr; } -.#{$ti-prefix}-text-direction-rtl:before { content: $ti-icon-text-direction-rtl; } -.#{$ti-prefix}-text-increase:before { content: $ti-icon-text-increase; } -.#{$ti-prefix}-text-orientation:before { content: $ti-icon-text-orientation; } -.#{$ti-prefix}-text-plus:before { content: $ti-icon-text-plus; } -.#{$ti-prefix}-text-recognition:before { content: $ti-icon-text-recognition; } -.#{$ti-prefix}-text-resize:before { content: $ti-icon-text-resize; } -.#{$ti-prefix}-text-size:before { content: $ti-icon-text-size; } -.#{$ti-prefix}-text-spellcheck:before { content: $ti-icon-text-spellcheck; } -.#{$ti-prefix}-text-wrap:before { content: $ti-icon-text-wrap; } -.#{$ti-prefix}-text-wrap-disabled:before { content: $ti-icon-text-wrap-disabled; } -.#{$ti-prefix}-texture:before { content: $ti-icon-texture; } -.#{$ti-prefix}-theater:before { content: $ti-icon-theater; } -.#{$ti-prefix}-thermometer:before { content: $ti-icon-thermometer; } -.#{$ti-prefix}-thumb-down:before { content: $ti-icon-thumb-down; } -.#{$ti-prefix}-thumb-down-filled:before { content: $ti-icon-thumb-down-filled; } -.#{$ti-prefix}-thumb-down-off:before { content: $ti-icon-thumb-down-off; } -.#{$ti-prefix}-thumb-up:before { content: $ti-icon-thumb-up; } -.#{$ti-prefix}-thumb-up-filled:before { content: $ti-icon-thumb-up-filled; } -.#{$ti-prefix}-thumb-up-off:before { content: $ti-icon-thumb-up-off; } -.#{$ti-prefix}-tic-tac:before { content: $ti-icon-tic-tac; } -.#{$ti-prefix}-ticket:before { content: $ti-icon-ticket; } -.#{$ti-prefix}-ticket-off:before { content: $ti-icon-ticket-off; } -.#{$ti-prefix}-tie:before { content: $ti-icon-tie; } -.#{$ti-prefix}-tilde:before { content: $ti-icon-tilde; } -.#{$ti-prefix}-tilt-shift:before { content: $ti-icon-tilt-shift; } -.#{$ti-prefix}-tilt-shift-off:before { content: $ti-icon-tilt-shift-off; } -.#{$ti-prefix}-timeline:before { content: $ti-icon-timeline; } -.#{$ti-prefix}-timeline-event:before { content: $ti-icon-timeline-event; } -.#{$ti-prefix}-timeline-event-exclamation:before { content: $ti-icon-timeline-event-exclamation; } -.#{$ti-prefix}-timeline-event-minus:before { content: $ti-icon-timeline-event-minus; } -.#{$ti-prefix}-timeline-event-plus:before { content: $ti-icon-timeline-event-plus; } -.#{$ti-prefix}-timeline-event-text:before { content: $ti-icon-timeline-event-text; } -.#{$ti-prefix}-timeline-event-x:before { content: $ti-icon-timeline-event-x; } -.#{$ti-prefix}-tir:before { content: $ti-icon-tir; } -.#{$ti-prefix}-toggle-left:before { content: $ti-icon-toggle-left; } -.#{$ti-prefix}-toggle-right:before { content: $ti-icon-toggle-right; } -.#{$ti-prefix}-toilet-paper:before { content: $ti-icon-toilet-paper; } -.#{$ti-prefix}-toilet-paper-off:before { content: $ti-icon-toilet-paper-off; } -.#{$ti-prefix}-tool:before { content: $ti-icon-tool; } -.#{$ti-prefix}-tools:before { content: $ti-icon-tools; } -.#{$ti-prefix}-tools-kitchen:before { content: $ti-icon-tools-kitchen; } -.#{$ti-prefix}-tools-kitchen-2:before { content: $ti-icon-tools-kitchen-2; } -.#{$ti-prefix}-tools-kitchen-2-off:before { content: $ti-icon-tools-kitchen-2-off; } -.#{$ti-prefix}-tools-kitchen-off:before { content: $ti-icon-tools-kitchen-off; } -.#{$ti-prefix}-tools-off:before { content: $ti-icon-tools-off; } -.#{$ti-prefix}-tooltip:before { content: $ti-icon-tooltip; } -.#{$ti-prefix}-topology-bus:before { content: $ti-icon-topology-bus; } -.#{$ti-prefix}-topology-complex:before { content: $ti-icon-topology-complex; } -.#{$ti-prefix}-topology-full:before { content: $ti-icon-topology-full; } -.#{$ti-prefix}-topology-full-hierarchy:before { content: $ti-icon-topology-full-hierarchy; } -.#{$ti-prefix}-topology-ring:before { content: $ti-icon-topology-ring; } -.#{$ti-prefix}-topology-ring-2:before { content: $ti-icon-topology-ring-2; } -.#{$ti-prefix}-topology-ring-3:before { content: $ti-icon-topology-ring-3; } -.#{$ti-prefix}-topology-star:before { content: $ti-icon-topology-star; } -.#{$ti-prefix}-topology-star-2:before { content: $ti-icon-topology-star-2; } -.#{$ti-prefix}-topology-star-3:before { content: $ti-icon-topology-star-3; } -.#{$ti-prefix}-topology-star-ring:before { content: $ti-icon-topology-star-ring; } -.#{$ti-prefix}-topology-star-ring-2:before { content: $ti-icon-topology-star-ring-2; } -.#{$ti-prefix}-topology-star-ring-3:before { content: $ti-icon-topology-star-ring-3; } -.#{$ti-prefix}-torii:before { content: $ti-icon-torii; } -.#{$ti-prefix}-tornado:before { content: $ti-icon-tornado; } -.#{$ti-prefix}-tournament:before { content: $ti-icon-tournament; } -.#{$ti-prefix}-tower:before { content: $ti-icon-tower; } -.#{$ti-prefix}-tower-off:before { content: $ti-icon-tower-off; } -.#{$ti-prefix}-track:before { content: $ti-icon-track; } -.#{$ti-prefix}-tractor:before { content: $ti-icon-tractor; } -.#{$ti-prefix}-trademark:before { content: $ti-icon-trademark; } -.#{$ti-prefix}-traffic-cone:before { content: $ti-icon-traffic-cone; } -.#{$ti-prefix}-traffic-cone-off:before { content: $ti-icon-traffic-cone-off; } -.#{$ti-prefix}-traffic-lights:before { content: $ti-icon-traffic-lights; } -.#{$ti-prefix}-traffic-lights-off:before { content: $ti-icon-traffic-lights-off; } -.#{$ti-prefix}-train:before { content: $ti-icon-train; } -.#{$ti-prefix}-transfer-in:before { content: $ti-icon-transfer-in; } -.#{$ti-prefix}-transfer-out:before { content: $ti-icon-transfer-out; } -.#{$ti-prefix}-transform:before { content: $ti-icon-transform; } -.#{$ti-prefix}-transform-filled:before { content: $ti-icon-transform-filled; } -.#{$ti-prefix}-transition-bottom:before { content: $ti-icon-transition-bottom; } -.#{$ti-prefix}-transition-left:before { content: $ti-icon-transition-left; } -.#{$ti-prefix}-transition-right:before { content: $ti-icon-transition-right; } -.#{$ti-prefix}-transition-top:before { content: $ti-icon-transition-top; } -.#{$ti-prefix}-trash:before { content: $ti-icon-trash; } -.#{$ti-prefix}-trash-filled:before { content: $ti-icon-trash-filled; } -.#{$ti-prefix}-trash-off:before { content: $ti-icon-trash-off; } -.#{$ti-prefix}-trash-x:before { content: $ti-icon-trash-x; } -.#{$ti-prefix}-trash-x-filled:before { content: $ti-icon-trash-x-filled; } -.#{$ti-prefix}-tree:before { content: $ti-icon-tree; } -.#{$ti-prefix}-trees:before { content: $ti-icon-trees; } -.#{$ti-prefix}-trekking:before { content: $ti-icon-trekking; } -.#{$ti-prefix}-trending-down:before { content: $ti-icon-trending-down; } -.#{$ti-prefix}-trending-down-2:before { content: $ti-icon-trending-down-2; } -.#{$ti-prefix}-trending-down-3:before { content: $ti-icon-trending-down-3; } -.#{$ti-prefix}-trending-up:before { content: $ti-icon-trending-up; } -.#{$ti-prefix}-trending-up-2:before { content: $ti-icon-trending-up-2; } -.#{$ti-prefix}-trending-up-3:before { content: $ti-icon-trending-up-3; } -.#{$ti-prefix}-triangle:before { content: $ti-icon-triangle; } -.#{$ti-prefix}-triangle-filled:before { content: $ti-icon-triangle-filled; } -.#{$ti-prefix}-triangle-inverted:before { content: $ti-icon-triangle-inverted; } -.#{$ti-prefix}-triangle-inverted-filled:before { content: $ti-icon-triangle-inverted-filled; } -.#{$ti-prefix}-triangle-off:before { content: $ti-icon-triangle-off; } -.#{$ti-prefix}-triangle-square-circle:before { content: $ti-icon-triangle-square-circle; } -.#{$ti-prefix}-triangles:before { content: $ti-icon-triangles; } -.#{$ti-prefix}-trident:before { content: $ti-icon-trident; } -.#{$ti-prefix}-trolley:before { content: $ti-icon-trolley; } -.#{$ti-prefix}-trophy:before { content: $ti-icon-trophy; } -.#{$ti-prefix}-trophy-filled:before { content: $ti-icon-trophy-filled; } -.#{$ti-prefix}-trophy-off:before { content: $ti-icon-trophy-off; } -.#{$ti-prefix}-trowel:before { content: $ti-icon-trowel; } -.#{$ti-prefix}-truck:before { content: $ti-icon-truck; } -.#{$ti-prefix}-truck-delivery:before { content: $ti-icon-truck-delivery; } -.#{$ti-prefix}-truck-loading:before { content: $ti-icon-truck-loading; } -.#{$ti-prefix}-truck-off:before { content: $ti-icon-truck-off; } -.#{$ti-prefix}-truck-return:before { content: $ti-icon-truck-return; } -.#{$ti-prefix}-txt:before { content: $ti-icon-txt; } -.#{$ti-prefix}-typography:before { content: $ti-icon-typography; } -.#{$ti-prefix}-typography-off:before { content: $ti-icon-typography-off; } -.#{$ti-prefix}-ufo:before { content: $ti-icon-ufo; } -.#{$ti-prefix}-ufo-off:before { content: $ti-icon-ufo-off; } -.#{$ti-prefix}-umbrella:before { content: $ti-icon-umbrella; } -.#{$ti-prefix}-umbrella-filled:before { content: $ti-icon-umbrella-filled; } -.#{$ti-prefix}-umbrella-off:before { content: $ti-icon-umbrella-off; } -.#{$ti-prefix}-underline:before { content: $ti-icon-underline; } -.#{$ti-prefix}-unlink:before { content: $ti-icon-unlink; } -.#{$ti-prefix}-upload:before { content: $ti-icon-upload; } -.#{$ti-prefix}-urgent:before { content: $ti-icon-urgent; } -.#{$ti-prefix}-usb:before { content: $ti-icon-usb; } -.#{$ti-prefix}-user:before { content: $ti-icon-user; } -.#{$ti-prefix}-user-bolt:before { content: $ti-icon-user-bolt; } -.#{$ti-prefix}-user-cancel:before { content: $ti-icon-user-cancel; } -.#{$ti-prefix}-user-check:before { content: $ti-icon-user-check; } -.#{$ti-prefix}-user-circle:before { content: $ti-icon-user-circle; } -.#{$ti-prefix}-user-code:before { content: $ti-icon-user-code; } -.#{$ti-prefix}-user-cog:before { content: $ti-icon-user-cog; } -.#{$ti-prefix}-user-dollar:before { content: $ti-icon-user-dollar; } -.#{$ti-prefix}-user-down:before { content: $ti-icon-user-down; } -.#{$ti-prefix}-user-edit:before { content: $ti-icon-user-edit; } -.#{$ti-prefix}-user-exclamation:before { content: $ti-icon-user-exclamation; } -.#{$ti-prefix}-user-heart:before { content: $ti-icon-user-heart; } -.#{$ti-prefix}-user-minus:before { content: $ti-icon-user-minus; } -.#{$ti-prefix}-user-off:before { content: $ti-icon-user-off; } -.#{$ti-prefix}-user-pause:before { content: $ti-icon-user-pause; } -.#{$ti-prefix}-user-pin:before { content: $ti-icon-user-pin; } -.#{$ti-prefix}-user-plus:before { content: $ti-icon-user-plus; } -.#{$ti-prefix}-user-question:before { content: $ti-icon-user-question; } -.#{$ti-prefix}-user-search:before { content: $ti-icon-user-search; } -.#{$ti-prefix}-user-share:before { content: $ti-icon-user-share; } -.#{$ti-prefix}-user-shield:before { content: $ti-icon-user-shield; } -.#{$ti-prefix}-user-star:before { content: $ti-icon-user-star; } -.#{$ti-prefix}-user-up:before { content: $ti-icon-user-up; } -.#{$ti-prefix}-user-x:before { content: $ti-icon-user-x; } -.#{$ti-prefix}-users:before { content: $ti-icon-users; } -.#{$ti-prefix}-uv-index:before { content: $ti-icon-uv-index; } -.#{$ti-prefix}-ux-circle:before { content: $ti-icon-ux-circle; } -.#{$ti-prefix}-vaccine:before { content: $ti-icon-vaccine; } -.#{$ti-prefix}-vaccine-bottle:before { content: $ti-icon-vaccine-bottle; } -.#{$ti-prefix}-vaccine-bottle-off:before { content: $ti-icon-vaccine-bottle-off; } -.#{$ti-prefix}-vaccine-off:before { content: $ti-icon-vaccine-off; } -.#{$ti-prefix}-vacuum-cleaner:before { content: $ti-icon-vacuum-cleaner; } -.#{$ti-prefix}-variable:before { content: $ti-icon-variable; } -.#{$ti-prefix}-variable-minus:before { content: $ti-icon-variable-minus; } -.#{$ti-prefix}-variable-off:before { content: $ti-icon-variable-off; } -.#{$ti-prefix}-variable-plus:before { content: $ti-icon-variable-plus; } -.#{$ti-prefix}-vector:before { content: $ti-icon-vector; } -.#{$ti-prefix}-vector-bezier:before { content: $ti-icon-vector-bezier; } -.#{$ti-prefix}-vector-bezier-2:before { content: $ti-icon-vector-bezier-2; } -.#{$ti-prefix}-vector-bezier-arc:before { content: $ti-icon-vector-bezier-arc; } -.#{$ti-prefix}-vector-bezier-circle:before { content: $ti-icon-vector-bezier-circle; } -.#{$ti-prefix}-vector-off:before { content: $ti-icon-vector-off; } -.#{$ti-prefix}-vector-spline:before { content: $ti-icon-vector-spline; } -.#{$ti-prefix}-vector-triangle:before { content: $ti-icon-vector-triangle; } -.#{$ti-prefix}-vector-triangle-off:before { content: $ti-icon-vector-triangle-off; } -.#{$ti-prefix}-venus:before { content: $ti-icon-venus; } -.#{$ti-prefix}-versions:before { content: $ti-icon-versions; } -.#{$ti-prefix}-versions-filled:before { content: $ti-icon-versions-filled; } -.#{$ti-prefix}-versions-off:before { content: $ti-icon-versions-off; } -.#{$ti-prefix}-video:before { content: $ti-icon-video; } -.#{$ti-prefix}-video-minus:before { content: $ti-icon-video-minus; } -.#{$ti-prefix}-video-off:before { content: $ti-icon-video-off; } -.#{$ti-prefix}-video-plus:before { content: $ti-icon-video-plus; } -.#{$ti-prefix}-view-360:before { content: $ti-icon-view-360; } -.#{$ti-prefix}-view-360-off:before { content: $ti-icon-view-360-off; } -.#{$ti-prefix}-viewfinder:before { content: $ti-icon-viewfinder; } -.#{$ti-prefix}-viewfinder-off:before { content: $ti-icon-viewfinder-off; } -.#{$ti-prefix}-viewport-narrow:before { content: $ti-icon-viewport-narrow; } -.#{$ti-prefix}-viewport-wide:before { content: $ti-icon-viewport-wide; } -.#{$ti-prefix}-vinyl:before { content: $ti-icon-vinyl; } -.#{$ti-prefix}-vip:before { content: $ti-icon-vip; } -.#{$ti-prefix}-vip-off:before { content: $ti-icon-vip-off; } -.#{$ti-prefix}-virus:before { content: $ti-icon-virus; } -.#{$ti-prefix}-virus-off:before { content: $ti-icon-virus-off; } -.#{$ti-prefix}-virus-search:before { content: $ti-icon-virus-search; } -.#{$ti-prefix}-vocabulary:before { content: $ti-icon-vocabulary; } -.#{$ti-prefix}-vocabulary-off:before { content: $ti-icon-vocabulary-off; } -.#{$ti-prefix}-volcano:before { content: $ti-icon-volcano; } -.#{$ti-prefix}-volume:before { content: $ti-icon-volume; } -.#{$ti-prefix}-volume-2:before { content: $ti-icon-volume-2; } -.#{$ti-prefix}-volume-3:before { content: $ti-icon-volume-3; } -.#{$ti-prefix}-volume-off:before { content: $ti-icon-volume-off; } -.#{$ti-prefix}-walk:before { content: $ti-icon-walk; } -.#{$ti-prefix}-wall:before { content: $ti-icon-wall; } -.#{$ti-prefix}-wall-off:before { content: $ti-icon-wall-off; } -.#{$ti-prefix}-wallet:before { content: $ti-icon-wallet; } -.#{$ti-prefix}-wallet-off:before { content: $ti-icon-wallet-off; } -.#{$ti-prefix}-wallpaper:before { content: $ti-icon-wallpaper; } -.#{$ti-prefix}-wallpaper-off:before { content: $ti-icon-wallpaper-off; } -.#{$ti-prefix}-wand:before { content: $ti-icon-wand; } -.#{$ti-prefix}-wand-off:before { content: $ti-icon-wand-off; } -.#{$ti-prefix}-wash:before { content: $ti-icon-wash; } -.#{$ti-prefix}-wash-dry:before { content: $ti-icon-wash-dry; } -.#{$ti-prefix}-wash-dry-1:before { content: $ti-icon-wash-dry-1; } -.#{$ti-prefix}-wash-dry-2:before { content: $ti-icon-wash-dry-2; } -.#{$ti-prefix}-wash-dry-3:before { content: $ti-icon-wash-dry-3; } -.#{$ti-prefix}-wash-dry-a:before { content: $ti-icon-wash-dry-a; } -.#{$ti-prefix}-wash-dry-dip:before { content: $ti-icon-wash-dry-dip; } -.#{$ti-prefix}-wash-dry-f:before { content: $ti-icon-wash-dry-f; } -.#{$ti-prefix}-wash-dry-hang:before { content: $ti-icon-wash-dry-hang; } -.#{$ti-prefix}-wash-dry-off:before { content: $ti-icon-wash-dry-off; } -.#{$ti-prefix}-wash-dry-p:before { content: $ti-icon-wash-dry-p; } -.#{$ti-prefix}-wash-dry-shade:before { content: $ti-icon-wash-dry-shade; } -.#{$ti-prefix}-wash-dry-w:before { content: $ti-icon-wash-dry-w; } -.#{$ti-prefix}-wash-dryclean:before { content: $ti-icon-wash-dryclean; } -.#{$ti-prefix}-wash-dryclean-off:before { content: $ti-icon-wash-dryclean-off; } -.#{$ti-prefix}-wash-gentle:before { content: $ti-icon-wash-gentle; } -.#{$ti-prefix}-wash-machine:before { content: $ti-icon-wash-machine; } -.#{$ti-prefix}-wash-off:before { content: $ti-icon-wash-off; } -.#{$ti-prefix}-wash-press:before { content: $ti-icon-wash-press; } -.#{$ti-prefix}-wash-temperature-1:before { content: $ti-icon-wash-temperature-1; } -.#{$ti-prefix}-wash-temperature-2:before { content: $ti-icon-wash-temperature-2; } -.#{$ti-prefix}-wash-temperature-3:before { content: $ti-icon-wash-temperature-3; } -.#{$ti-prefix}-wash-temperature-4:before { content: $ti-icon-wash-temperature-4; } -.#{$ti-prefix}-wash-temperature-5:before { content: $ti-icon-wash-temperature-5; } -.#{$ti-prefix}-wash-temperature-6:before { content: $ti-icon-wash-temperature-6; } -.#{$ti-prefix}-wash-tumble-dry:before { content: $ti-icon-wash-tumble-dry; } -.#{$ti-prefix}-wash-tumble-off:before { content: $ti-icon-wash-tumble-off; } -.#{$ti-prefix}-wave-saw-tool:before { content: $ti-icon-wave-saw-tool; } -.#{$ti-prefix}-wave-sine:before { content: $ti-icon-wave-sine; } -.#{$ti-prefix}-wave-square:before { content: $ti-icon-wave-square; } -.#{$ti-prefix}-webhook:before { content: $ti-icon-webhook; } -.#{$ti-prefix}-webhook-off:before { content: $ti-icon-webhook-off; } -.#{$ti-prefix}-weight:before { content: $ti-icon-weight; } -.#{$ti-prefix}-wheelchair:before { content: $ti-icon-wheelchair; } -.#{$ti-prefix}-wheelchair-off:before { content: $ti-icon-wheelchair-off; } -.#{$ti-prefix}-whirl:before { content: $ti-icon-whirl; } -.#{$ti-prefix}-wifi:before { content: $ti-icon-wifi; } -.#{$ti-prefix}-wifi-0:before { content: $ti-icon-wifi-0; } -.#{$ti-prefix}-wifi-1:before { content: $ti-icon-wifi-1; } -.#{$ti-prefix}-wifi-2:before { content: $ti-icon-wifi-2; } -.#{$ti-prefix}-wifi-off:before { content: $ti-icon-wifi-off; } -.#{$ti-prefix}-wind:before { content: $ti-icon-wind; } -.#{$ti-prefix}-wind-off:before { content: $ti-icon-wind-off; } -.#{$ti-prefix}-windmill:before { content: $ti-icon-windmill; } -.#{$ti-prefix}-windmill-filled:before { content: $ti-icon-windmill-filled; } -.#{$ti-prefix}-windmill-off:before { content: $ti-icon-windmill-off; } -.#{$ti-prefix}-window:before { content: $ti-icon-window; } -.#{$ti-prefix}-window-maximize:before { content: $ti-icon-window-maximize; } -.#{$ti-prefix}-window-minimize:before { content: $ti-icon-window-minimize; } -.#{$ti-prefix}-window-off:before { content: $ti-icon-window-off; } -.#{$ti-prefix}-windsock:before { content: $ti-icon-windsock; } -.#{$ti-prefix}-wiper:before { content: $ti-icon-wiper; } -.#{$ti-prefix}-wiper-wash:before { content: $ti-icon-wiper-wash; } -.#{$ti-prefix}-woman:before { content: $ti-icon-woman; } -.#{$ti-prefix}-wood:before { content: $ti-icon-wood; } -.#{$ti-prefix}-world:before { content: $ti-icon-world; } -.#{$ti-prefix}-world-bolt:before { content: $ti-icon-world-bolt; } -.#{$ti-prefix}-world-cancel:before { content: $ti-icon-world-cancel; } -.#{$ti-prefix}-world-check:before { content: $ti-icon-world-check; } -.#{$ti-prefix}-world-code:before { content: $ti-icon-world-code; } -.#{$ti-prefix}-world-cog:before { content: $ti-icon-world-cog; } -.#{$ti-prefix}-world-dollar:before { content: $ti-icon-world-dollar; } -.#{$ti-prefix}-world-down:before { content: $ti-icon-world-down; } -.#{$ti-prefix}-world-download:before { content: $ti-icon-world-download; } -.#{$ti-prefix}-world-exclamation:before { content: $ti-icon-world-exclamation; } -.#{$ti-prefix}-world-heart:before { content: $ti-icon-world-heart; } -.#{$ti-prefix}-world-latitude:before { content: $ti-icon-world-latitude; } -.#{$ti-prefix}-world-longitude:before { content: $ti-icon-world-longitude; } -.#{$ti-prefix}-world-minus:before { content: $ti-icon-world-minus; } -.#{$ti-prefix}-world-off:before { content: $ti-icon-world-off; } -.#{$ti-prefix}-world-pause:before { content: $ti-icon-world-pause; } -.#{$ti-prefix}-world-pin:before { content: $ti-icon-world-pin; } -.#{$ti-prefix}-world-plus:before { content: $ti-icon-world-plus; } -.#{$ti-prefix}-world-question:before { content: $ti-icon-world-question; } -.#{$ti-prefix}-world-search:before { content: $ti-icon-world-search; } -.#{$ti-prefix}-world-share:before { content: $ti-icon-world-share; } -.#{$ti-prefix}-world-star:before { content: $ti-icon-world-star; } -.#{$ti-prefix}-world-up:before { content: $ti-icon-world-up; } -.#{$ti-prefix}-world-upload:before { content: $ti-icon-world-upload; } -.#{$ti-prefix}-world-www:before { content: $ti-icon-world-www; } -.#{$ti-prefix}-world-x:before { content: $ti-icon-world-x; } -.#{$ti-prefix}-wrecking-ball:before { content: $ti-icon-wrecking-ball; } -.#{$ti-prefix}-writing:before { content: $ti-icon-writing; } -.#{$ti-prefix}-writing-off:before { content: $ti-icon-writing-off; } -.#{$ti-prefix}-writing-sign:before { content: $ti-icon-writing-sign; } -.#{$ti-prefix}-writing-sign-off:before { content: $ti-icon-writing-sign-off; } -.#{$ti-prefix}-x:before { content: $ti-icon-x; } -.#{$ti-prefix}-xbox-a:before { content: $ti-icon-xbox-a; } -.#{$ti-prefix}-xbox-b:before { content: $ti-icon-xbox-b; } -.#{$ti-prefix}-xbox-x:before { content: $ti-icon-xbox-x; } -.#{$ti-prefix}-xbox-y:before { content: $ti-icon-xbox-y; } -.#{$ti-prefix}-yin-yang:before { content: $ti-icon-yin-yang; } -.#{$ti-prefix}-yin-yang-filled:before { content: $ti-icon-yin-yang-filled; } -.#{$ti-prefix}-yoga:before { content: $ti-icon-yoga; } -.#{$ti-prefix}-zeppelin:before { content: $ti-icon-zeppelin; } -.#{$ti-prefix}-zeppelin-off:before { content: $ti-icon-zeppelin-off; } -.#{$ti-prefix}-zip:before { content: $ti-icon-zip; } -.#{$ti-prefix}-zodiac-aquarius:before { content: $ti-icon-zodiac-aquarius; } -.#{$ti-prefix}-zodiac-aries:before { content: $ti-icon-zodiac-aries; } -.#{$ti-prefix}-zodiac-cancer:before { content: $ti-icon-zodiac-cancer; } -.#{$ti-prefix}-zodiac-capricorn:before { content: $ti-icon-zodiac-capricorn; } -.#{$ti-prefix}-zodiac-gemini:before { content: $ti-icon-zodiac-gemini; } -.#{$ti-prefix}-zodiac-leo:before { content: $ti-icon-zodiac-leo; } -.#{$ti-prefix}-zodiac-libra:before { content: $ti-icon-zodiac-libra; } -.#{$ti-prefix}-zodiac-pisces:before { content: $ti-icon-zodiac-pisces; } -.#{$ti-prefix}-zodiac-sagittarius:before { content: $ti-icon-zodiac-sagittarius; } -.#{$ti-prefix}-zodiac-scorpio:before { content: $ti-icon-zodiac-scorpio; } -.#{$ti-prefix}-zodiac-taurus:before { content: $ti-icon-zodiac-taurus; } -.#{$ti-prefix}-zodiac-virgo:before { content: $ti-icon-zodiac-virgo; } -.#{$ti-prefix}-zoom-cancel:before { content: $ti-icon-zoom-cancel; } -.#{$ti-prefix}-zoom-check:before { content: $ti-icon-zoom-check; } -.#{$ti-prefix}-zoom-check-filled:before { content: $ti-icon-zoom-check-filled; } -.#{$ti-prefix}-zoom-code:before { content: $ti-icon-zoom-code; } -.#{$ti-prefix}-zoom-exclamation:before { content: $ti-icon-zoom-exclamation; } -.#{$ti-prefix}-zoom-filled:before { content: $ti-icon-zoom-filled; } -.#{$ti-prefix}-zoom-in:before { content: $ti-icon-zoom-in; } -.#{$ti-prefix}-zoom-in-area:before { content: $ti-icon-zoom-in-area; } -.#{$ti-prefix}-zoom-in-area-filled:before { content: $ti-icon-zoom-in-area-filled; } -.#{$ti-prefix}-zoom-in-filled:before { content: $ti-icon-zoom-in-filled; } -.#{$ti-prefix}-zoom-money:before { content: $ti-icon-zoom-money; } -.#{$ti-prefix}-zoom-out:before { content: $ti-icon-zoom-out; } -.#{$ti-prefix}-zoom-out-area:before { content: $ti-icon-zoom-out-area; } -.#{$ti-prefix}-zoom-out-filled:before { content: $ti-icon-zoom-out-filled; } -.#{$ti-prefix}-zoom-pan:before { content: $ti-icon-zoom-pan; } -.#{$ti-prefix}-zoom-question:before { content: $ti-icon-zoom-question; } -.#{$ti-prefix}-zoom-replace:before { content: $ti-icon-zoom-replace; } -.#{$ti-prefix}-zoom-reset:before { content: $ti-icon-zoom-reset; } -.#{$ti-prefix}-zzz:before { content: $ti-icon-zzz; } -.#{$ti-prefix}-zzz-off:before { content: $ti-icon-zzz-off; } diff --git a/playground/index.html b/playground/index.html deleted file mode 100644 index 58322b859c6e25..00000000000000 --- a/playground/index.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - three.js - playground - - - - - - - - - - - - - - - - diff --git a/playground/libs/flow.module.js b/playground/libs/flow.module.js deleted file mode 100644 index c9fd315097db13..00000000000000 --- a/playground/libs/flow.module.js +++ /dev/null @@ -1,5000 +0,0 @@ -/** - * https://github.com/sunag/flow - */ - -function __flow__addCSS( css ) { - - try { - - const style = document.createElement( 'style' ); - - style.setAttribute( 'type', 'text/css' ); - style.innerHTML = css; - document.head.appendChild( style ); - - } catch ( e ) {} - -} - -__flow__addCSS( `f-element .ti { vertical-align: middle; font-size: 17px; display: inline-block; margin-right: 5px;}f-element f-disconnect .ti { font-size: 20px; margin-top: -6px; margin-left: 2px;}@keyframes f-animation-open { 0% { transform: scale(.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; }}f-canvas,f-canvas canvas.background,f-canvas canvas.frontground { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; transition: opacity .17s;}f-canvas { cursor: grab;}f-canvas canvas.frontground { z-index: 10;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas.background,f-canvas canvas.frontground { position: fixed; overflow: hidden;}f-canvas canvas.frontground { pointer-events: none;}::-webkit-scrollbar { width: 6px; height: 6px;}::-webkit-scrollbar-thumb:hover{ background: #014fc5;}::-webkit-scrollbar-track { background: #363636;}::-webkit-scrollbar-thumb { background-color: #666666; border-radius: 8px; border: 0;}f-canvas f-content { left: 0; top: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-canvas canvas.map { position: absolute; top: 10px; right: 10px; z-index: 50; backdrop-filter: blur( 10px ); background-color: rgba( 45, 45, 48, .8 );}f-node { position: absolute; margin: 0; padding: 0; user-select: none; width: 320px; z-index: 1; cursor: auto; filter: drop-shadow(0 0 10px #00000061); backdrop-filter: blur(4px);}f-node.selected { z-index: 2;}f-canvas.focusing canvas.background,f-canvas.focusing f-node:not(.selected),f-canvas.focusing f-element f-disconnect:not(.selected) { opacity: 0; pointer-events: none;}.dragging f-canvas f-element f-disconnect { opacity: 0;}.dragging.node f-canvas.focusing canvas.background,.dragging.node f-canvas.focusing f-node:not(.selected) { opacity: .5;}f-node.selected,f-canvas.dragging-rio f-node:hover,f-canvas.dragging-lio f-node:hover { filter: drop-shadow(0 0 10px #00000061) drop-shadow(0 0 8px #4444dd);}f-node.closed f-element:not(:first-child) { display: none;}f-node.center { top: 50%; left: 50%; transform: translate( -50%, -50% );}f-node.top-right { top: 0; right: 0;}f-node.top-center { top: 0; left: 50%; transform: translateX( -50% );}f-node.top-left { top: 0; left: 0;}f-node { transition: filter 0.2s ease, opacity 0.12s ease;}f-node { animation: .2s f-animation-open 1 alternate ease-out;}f-tips,f-drop,f-menu,f-menu input,f-menu button,f-element,f-element input,f-element select,f-element button,f-element textarea { font-family: 'Open Sans', sans-serif; font-size: 12px; text-transform: initial; line-height: normal; color: #eeeeee; outline: solid 0px #000; margin: 0; padding: 0; border: 0; user-select: none; -webkit-tap-highlight-color: transparent; transition: background 0.2s ease, filter 0.2s ease;}f-node.resizable { display: grid; width: auto !important;}f-node.resizable f-element:last-child { resize: both; overflow: auto; min-width: 100px;}f-element input:read-only { color: #666;}f-element input,f-element textarea { text-transform: initial;}f-element input { transition: background 0.1s ease;}f-element input,f-element select,f-element button,f-element textarea { background-color: #232324d1;}f-element { position: relative; width: calc( 100% - 14px ); background: rgba(45, 45, 48, 0.95); pointer-events: auto; border-bottom: 2px solid #232323; display: flex; padding-left: 7px; padding-right: 7px; padding-top: 2px; padding-bottom: 2px;}f-element:after,f-element:before { transition: opacity .17s; opacity: 0; content: '';}f-element[tooltip]:hover:after,f-element[tooltip]:focus-within:after { font-size: 14px !important; display: flex; justify-content: center; position: fixed; margin-left: -7px; width: calc( 100% ); background: #1d1d1de8; border: 1px solid #444444a1; border-radius: 6px; color: #dadada; content: attr( tooltip ); margin-top: -41px; font-size: 16px; padding-top: 3px; padding-bottom: 3px; z-index: 10; opacity: 1; backdrop-filter: blur(4px); white-space: nowrap; overflow: hidden; text-shadow: 1px 1px 0px #0007;}f-element[tooltip]:hover:before,f-element[tooltip]:focus-within:before { border: solid; border-color: #1d1d1de8 transparent; border-width: 12px 6px 0 6px; left: calc( 50% - 6px ); bottom: 30px; position: absolute; opacity: 1; z-index: 11;}f-element[error] { background-color: #ff0000;}f-element[error]:hover:after,f-element[error]:focus-within:after { border: none; background-color: #ff0000bb; filter: drop-shadow( 2px 2px 5px #000 ); color: #fff;}f-element[error]:hover:before,f-element[error]:focus-within:before { border-color: #ff0000bb transparent;}f-element { height: 24px;}f-element input { margin-top: 2px; margin-bottom: 2px; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%); margin-left: 2px; margin-right: 2px; width: 100%; padding-left: 4px; padding-right: 4px; line-height: 100%;}f-element f-string:has( i[type=icon] ) input { padding-right: 23px;}f-element input.number { cursor: col-resize;}f-element input:focus[type='text'], f-element input:focus[type='range'], f-element input:focus[type='color'] { background: rgba( 0, 0, 0, 0.6 ); outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-element input[type='color'] { appearance: none; padding: 0; margin-left: 2px; margin-right: 2px; height: calc( 100% - 4px ); margin-top: 2px; border: none;}f-element input[type='color']::-webkit-color-swatch-wrapper { padding: 2px;}f-element input[type='color']::-webkit-color-swatch { border: none; cursor: alias;}f-element input[type='range'] { appearance: none; width: 100%; overflow: hidden; padding: 0; cursor: ew-resize;}f-element input[type='range']::-webkit-slider-runnable-track { appearance: none; height: 10px; color: #13bba4; margin: 0;}f-element input[type='range']::-webkit-slider-thumb { appearance: none; width: 0; background: #434343; box-shadow: -500px 0 0 500px rgba( 0, 120, 255, 0.98 ); border-radius: 50%; border: 0 !important;}f-element input[type='range']::-webkit-slider-runnable-track { margin-left: -4px; margin-right: -5px;}f-element input[type='checkbox'] { appearance: none; cursor: pointer;}f-element input[type='checkbox'].toggle { height: 20px; width: 45px; border-radius: 16px; display: inline-block; position: relative; margin: 0; margin-top: 2px; background: linear-gradient( 0deg, #292929 0%, #0a0a0ac2 100% ); transition: all 0.2s ease;}f-element input[type='checkbox'].toggle:after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 2px rgba(44, 44, 44, 0.2); transition: all 0.2s cubic-bezier(0.5, 0.1, 0.75, 1.35);}f-element input[type='checkbox'].toggle:checked { background: linear-gradient( 0deg, #0177fb 0%, #0177fb 100% );}f-element input[type='checkbox'].toggle:checked:after { transform: translatex(25px);}f-element.auto-height { display: table;}f-element textarea { width: calc( 100% - 18px ); padding-top: 1px; padding-bottom: 3px; padding-left: 4px; padding-right: 8px; margin-top: 2px; margin-left: 2px; height: calc( 100% - 8px ); max-height: 300px; border-radius: 2px; resize: none; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element.auto-height textarea { resize: auto;}f-element select { width: 100%; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px; cursor: pointer; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element f-toolbar { position: absolute; top: 0; height: 100%; align-content: space-around; margin-top: auto; margin-bottom: auto; margin-left: 6px; margin-right: 6px; font-size: 18px; line-height: 18px; display: inline-flex; justify-content: flex-end; left: 2px;}f-element f-toolbar button { opacity: .7; cursor: pointer; font-size: 14px; width: unset; height: unset; border-radius: unset; border: unset; outline: 0; background-color: unset; box-shadow: unset; padding-right: 0; padding-left: 0; margin-left: 0; margin-right: 0;}f-element f-toolbar button span { padding-right: 5px;}f-element f-toolbar button:hover,f-element f-toolbar button:active { opacity: 1; border: 0; background-color: unset;}f-element input.range-value { width: 60px; text-align: center;}f-menu.context button,f-element button { width: 100%; height: calc( 100% - 4px ); margin-left: 2px; margin-right: 2px; margin-top: 3px; border-radius: 3px; cursor: pointer;}f-element button { box-shadow: inset 1px 1px 1px 0 rgb(255 255 255 / 17%), inset -2px -2px 2px 0 rgb(0 0 0 / 26%);}f-element button:hover { color: #fff; background-color: #2a2a2a;}f-element button:active { border: 1px solid rgba( 0, 120, 255, 0.98 );}f-element f-inputs,f-element f-subinputs { display: flex; justify-content: flex-end; width: 100%;}f-element f-inputs { left: 100px; top: 50%; transform: translateY( -50% ); position: absolute; width: calc( 100% - 106px ); height: calc( 100% - 4px );}f-element.inputs-disable f-inputs { filter: grayscale(100%); opacity: .5;}f-element.inputs-disable f-inputs input { pointer-events: none;}f-element f-label,f-element span { margin: auto; text-shadow: 1px 1px 0px #0007;}f-element f-label { padding-left: 4px; white-space: nowrap; position: absolute; top: 50%; transform: translateY( -50% ); width: calc( 100% - 20px );}f-element.right f-label { text-align: right;}f-element.center f-label { text-align: center;}f-element f-label i { font-size: 18px; margin-right: 4px; vertical-align: sub; margin-right: 0;}f-element f-label.center { width: 100%; text-align: center; display: block;}f-element.title { height: 29px; background-color: #3a3a3ab0; background-color: #3b3b43ed; cursor: all-scroll; border-top-left-radius: 6px; border-top-right-radius: 6px;}f-element:last-child { border-bottom-left-radius: 6px; border-bottom-right-radius: 6px;}f-element.blue { background-color: #014fc5;}f-element.red { background-color: #bd0b0b;}f-element.green { background-color: #148d05;}f-element.yellow { background-color: #d6b100;}f-element.title.left { text-align: left; display: inline-grid; justify-content: start;}f-element.title f-title { text-align: center; font-size: 15px; position: absolute; top: 50%; transform: translateY( -50% ); width: calc( 100% - 14px );}f-element.title > i { font-size: 21px; position: absolute; right: 8px; top: 50%; transform: translateY( -50% ); opacity: .7;}f-element.title f-toolbar i { font-size: 22px; display: contents; right: unset; left: unset;}f-element.title.left span { text-align: left;}f-element f-io { border: 2px solid #dadada; width: 7px; height: 7px; position: absolute; background: #242427; border-radius: 8px; float: left; left: -7px; top: calc( 50% - 5px ); cursor: alias; box-shadow: 0 0 3px 2px #0000005e; z-index: 1;}f-element f-io.connect,f-canvas.dragging-rio f-element:hover f-io.lio,f-canvas.dragging-lio f-element:hover f-io.rio { zoom: 1.4;}f-node.io-connect f-io:not(.connect) { border: 2px solid #dadada !important; zoom: 1 !important;}f-element f-io.rio { float: right; right: -7px; left: unset;}f-element f-disconnect { position: absolute; left: -35px; top: 50%; font-size: 22px; transform: translateY( -50% ); filter: drop-shadow(0 0 5px #000); text-shadow: 0px 0px 5px black; cursor: pointer; transition: all .2s;}f-element.input-right f-disconnect { right: -35px; left: unset;}f-element f-disconnect:hover { color: #ff3300;}f-element textarea::-webkit-scrollbar { width: 6px;}f-element textarea::-webkit-scrollbar-track { background: #111; } f-element textarea::-webkit-scrollbar-thumb { background: #0177fb; }f-element textarea::-webkit-scrollbar-thumb:hover { background: #1187ff; }f-element.small { height: 18px;}f-element.large { height: 36px;}f-canvas.dragging-lio f-node:not(.io-connect) f-element.rio:hover,f-canvas.dragging-rio f-node:not(.io-connect) f-element.lio:hover,f-element.select { background-color: rgba(61, 70, 82, 0.98);}f-element.invalid > f-io { zoom: 1 !important;}f-element.invalid::after,.zoom f-element.no-zoom::after { font-size: 14px !important; display: flex; justify-content: center; align-items:center; margin: auto; position: absolute; width: 100%; height: 100%; background: #bd0b0b77; vertical-align: middle; color: #fff; content: 'Incompatible!'; opacity: .95; backdrop-filter: grayscale(100%); white-space: nowrap; overflow: hidden; left: 0; top: 0; text-transform: initial;}.zoom f-element.no-zoom::after { background: #0b3fbd77; content: 'Incompatible with zoom!';}f-treeview { width: 100%; background-color: #232324d1; border-radius: 2px; overflow-y: auto; overflow-x: hidden; margin-top: 2px; margin-left: 2px; height: calc( 100% - 6px ); box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-treeview f-treeview-node { position: relative; margin-top: 1px; min-height: 24px;}f-treeview f-treeview-node f-treeview-children { position: relative; display: none; padding-left: 16px;}f-treeview f-treeview-node input[type='checkbox'] { position: absolute; width: 100%; height: 24px; margin-top: 0px; background: none; box-shadow: none; cursor: default; width: calc( 100% + 100px ); padding-top: 3px; margin-left: -100px;}f-treeview f-treeview-node input[type='checkbox']:checked ~ f-treeview-children { display: block;}f-treeview f-arrow { border: solid #999; border-width: 0 2px 2px 0; display: inline-block; padding: 3px; position: absolute; right: 10px; margin-top: 8px; transform: rotate( -45deg ); transition: all 0.1s ease; pointer-events: none;}f-treeview f-treeview-node input[type='checkbox']:checked ~ f-arrow { margin-top: 7px; transform: rotate( 45deg );}f-treeview f-treeview-label { display: flex; align-content: center; width: 100%; height: 22px; background: none; box-shadow: none; cursor: default; width: calc( 100% + 100px ); padding-top: 3px; margin-left: -100px; padding-left: 105px; border-bottom: 1px solid #333; pointer-events: none; z-index: 1;}f-treeview f-treeview-node input[type='checkbox']:hover { background: #2c2c2f;}f-treeview f-treeview-node:has( f-arrow ) > input[type='checkbox'] { background: #2c2c2f;}f-treeview f-treeview-node:has( f-arrow ) > input[type='checkbox']:hover { background: #333339;}f-treeview f-treeview-label { color: #aaa;}f-treeview f-treeview-label spam { margin-top: 1px;}f-treeview f-treeview-label i { color: #ccc; transition: color 0.1s ease; margin-top: 1px;}f-treeview f-treeview-node { position: relative; display: flex; flex-direction: column;}f-treeview f-treeview-node input[type='checkbox']:hover ~ f-treeview-label { color: #eee;}f-treeview f-treeview-node input[type='checkbox']:hover ~ f-treeview-label i { color: #fff;}f-menu.context f-item f-node { position: relative; display: block; width: calc( 100% - 6px ) !important; margin: 3px; animation: unset;}f-treeview f-treeview-node.selected > input[type='checkbox'] { background-color: #014fc5;}f-treeview f-treeview-node.selected > f-treeview-label,f-treeview f-treeview-node.selected > f-treeview-label i { color: #fff;}f-treeview f-treeview-node.selected > input[type='checkbox']:hover { background-color: #06f;}f-string { display: contents;}f-string f-buttons { position: absolute; top: 50%; right: 1px; transform: translateY( -50% );}f-string f-buttons i { color: #999; padding-left: 4px; padding-right: 4px; padding-bottom: 1px; margin-right: 1px; cursor: pointer; background: #252526eb; height: 100%; padding-top: 1px; margin-right: 1px !important;}f-string i[type=icon] { color: #999; position: absolute; right: 8px; top: calc( 50% - 8px ); margin-right: 5px;}f-inputs f-string i[type=icon] { right: 0;}f-string f-buttons i:hover { color: #eeeeee;}f-string input:focus ~ f-string { opacity: .9;}f-string:hover input::placeholder { color: #999;}f-string f-treeview { position: absolute; max-height: 200px; height: 200px; background-color: #000; z-index: 10;}f-drop { width: 100%; height: 100%; position: sticky; left: 0; top: 0; background: #02358417; text-align: center; justify-content: center; align-items: center; display: flex; box-shadow: inset 0 0 20px 10px #464ace17; pointer-events: none; transition: all .07s; opacity: 0; visibility: hidden;}f-drop.visible { visibility: unset; opacity: unset; transition: all .23s;}f-drop span { opacity: .5; font-size: 40px; text-shadow: 0px 0px 5px #000; font-weight: bold;}f-tooltip { pointer-events: none;}f-tooltip { position: absolute; left: 0; top: 0; background: rgba(0,0,0,.8); backdrop-filter: blur(4px); font-size: 14px; padding: 7px; left: 50%; border-radius: 10px; transform: translateX(-50%); visibility: hidden; pointer-events: none; opacity: 0; transition: all 0.3s ease; z-index: 150; white-space: nowrap;}f-menu.context,f-menu.search { position: absolute;}f-menu.context { width: 170px; z-index: 110;}f-menu.search { bottom: 85px; left: 50%; transform: translateX(-50%); z-index: 10; width: 300px;}f-menu.context f-list { display: block; margin: 0; background: #171717e6; font-size: 12px; border-radius: 6px; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; box-shadow: 3px 3px 6px rgba(0,0,0,.2); transition: opacity 0.2s ease, transform 0.1s ease;}f-menu.search f-list { margin: 0 6px 0 6px; display: flex; flex-direction: column-reverse; margin-bottom: 5px;}f-menu.context.hidden { visibility: hidden; opacity: 0;}f-menu.context f-item,f-menu.search f-item { display: block; position: relative; margin: 0; padding: 0; white-space: nowrap;}f-menu.search f-item { opacity: 0;}f-menu.context f-item.submenu::after { content: ""; position: absolute; right: 6px; top: 50%; -webkit-transform: translateY( -50% ); transform: translateY( -50% ); border: 5px solid transparent; border-left-color: #808080;}f-menu.context f-item:hover > f-menu,f-menu.context f-item.active > f-menu { visibility: unset; transform: unset; opacity: unset;}f-menu.context f-menu { top: 0px; left: calc( 100% - 4px );}f-menu.context f-item button,f-menu.search f-item button { overflow: visible; display: block; width: calc( 100% - 6px ); text-align: left; cursor: pointer; white-space: nowrap; padding: 6px 8px; border-radius: 3px; background: rgba(45, 45, 48, 0.95); border: 0; color: #ddd; margin: 3px; text-shadow: 1px 1px 0px #0007;}f-menu.context f-item button i,f-menu.search f-item button i { float: left; font-size: 20px; margin-top: -1px; margin-right: 3px;}f-menu.context f-item button i { height: 18px; margin-top: -2px;}f-menu.context f-item button span,f-menu.search f-item button span { margin-left: 4px;}f-menu.context f-item:hover > button,f-menu.search f-item:hover > button,f-menu.search f-item.active > button { color: #fff; background-color: rgba(61, 70, 82, 0.98);}f-menu.search f-item:hover,f-menu.search f-item.active { opacity: 1 !important;}f-menu.context f-item button:active { outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-menu.context f-item f-tooltip { margin-left: 85px; top: -50px;}f-menu.search f-item { display: none;}f-menu.search f-item:nth-child(1) { opacity: 1; display: unset;}f-menu.search f-item:nth-child(2) { opacity: .8; display: unset;}f-menu.search f-item:nth-child(3) { opacity: .6; display: unset;}f-menu.search f-item:nth-child(4) { opacity: .4; display: unset;}f-menu.search f-item button { border-radius: 14px;}f-tips { right: 10px; top: 10px; position: absolute; z-index: 100; pointer-events: none; display: flex; flex-direction: column;}f-tips f-tip { width: 450px; font-size: 13px; border-radius: 6px; text-align: center; display: block; height: auto; color: #ffffffe0; margin: 4px; padding: 4px; background: #17171794; border: 1px solid #7e7e7e38; line-height: 100%; backdrop-filter: blur(6px); transition: all 0.2s ease; text-transform: initial; opacity: 0;}f-tips f-tip:nth-child(1) { opacity: 1;}f-tips f-tip:nth-child(2) { opacity: .75;}f-tips f-tip:nth-child(3) { opacity: .25;}f-tips f-tip:nth-child(4) { opacity: .1;}f-tips f-tip.error { background: #b900005e;}f-menu.search input { width: calc( 100% - 28px ); height: 41px; position: absolute; z-index: 10; border-radius: 20px; padding-left: 14px; padding-right: 14px; font-size: 15px; background-color: #17171794; border: 1px solid #7e7e7e45; backdrop-filter: blur(6px); box-shadow: 3px 3px 6px rgb(0 0 0 / 20%); text-transform: initial;}f-menu.circle { position: absolute; z-index: 100;}f-menu.circle.top { top: 40px;}f-menu.circle.left { left: 40px;}f-menu.circle.bottom { bottom: 40px;}f-menu.circle.right { right: 40px;}f-menu.circle f-item { align-content: space-around; margin-right: 20px;}f-menu.circle f-item button { width: 46px; height: 46px; font-size: 22px; background: #17171794; border-radius: 50%; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; line-height: 100%; cursor: pointer; box-shadow: 3px 3px 6px rgba(0,0,0,.2); margin-bottom: 20px;}f-menu.circle f-item f-tooltip { margin-top: -60px;}f-menu.circle.top f-item f-tooltip { margin-top: 50px;}.f-rounded f-node f-element,.f-rounded f-node f-element.title.left { border-radius: 10px 5px 10px 5px;}.f-rounded f-node f-element input, .f-rounded f-node f-element select,.f-rounded f-node f-element button,.f-rounded f-node f-element textarea,.f-rounded f-node f-element input[type='checkbox'].toggle,.f-rounded f-node f-element input[type='checkbox'].toggle:after { border-radius: 20px 10px;}.f-rounded f-node f-element input { padding-left: 7px; padding-right: 7px;}.f-rounded f-menu.context,.f-rounded f-menu.context f-item button { border-radius: 20px 10px;}@media (hover: hover) and (pointer: fine) { f-node:not(.selected):hover { filter: drop-shadow(0 0 6px #66666630); } f-element f-toolbar { visibility: hidden; opacity: 0; transition: opacity 0.2s ease; } body:not(.connecting) f-node:hover > f-element f-toolbar, f-node.selected f-element f-toolbar { visibility: visible; opacity: 1; } f-element f-io:hover { zoom: 1.4; } f-menu.circle f-item button:hover { background-color: #2a2a2a; } f-menu.search input:hover, f-menu.search input:focus { background-color: #1a1a1a; filter: drop-shadow(0 0 6px #66666630); } f-menu.search input:focus { filter: drop-shadow(0 0 8px #4444dd); } f-menu.circle f-item button:hover > f-tooltip, f-menu.context f-item button:hover > f-tooltip { visibility: visible; opacity: 1; } f-menu.circle f-item button:hover > f-tooltip { margin-top: -50px; } f-menu.circle.top f-item button:hover > f-tooltip { margin-top: 60px; } f-menu.context f-item button:hover > f-tooltip { top: -30px; } f-menu.circle f-item button:focus > f-tooltip, f-menu.context f-item button:focus > f-tooltip { visibility: hidden; opacity: 0; }}@media (hover: none) and (pointer: coarse) { body.dragging f-canvas, body.connecting f-canvas { overflow: hidden !important; }}f-element.invalid > f-inputs,f-element.invalid > f-label,f-element.invalid > f-title,f-element.invalid > f-toolbar,f-element.invalid > input,f-element.invalid > select { opacity: .1 !important;}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` ); - -const REVISION = '3'; - -let _id = 0; - -class Serializer extends EventTarget { - - static get type() { - - return 'Serializer'; - - } - - constructor() { - - super(); - - this._id = _id ++; - - this._serializable = true; - - } - - get id() { - - return this._id; - - } - - setSerializable( value ) { - - this._serializable = value; - - return this; - - } - - getSerializable() { - - return this._serializable; - - } - - serialize( /*data*/ ) { - - console.warn( 'Serializer: Abstract function.' ); - - } - - deserialize( /*data*/ ) { - - console.warn( 'Serializer: Abstract function.' ); - - } - - deserializeLib( /*data, lib*/ ) { - - // Abstract function. - - } - - get className() { - - return this.constructor.type || this.constructor.name; - - } - - toJSON( data = null ) { - - let object = null; - - const id = this.id; - - if ( data !== null ) { - - const objects = data.objects; - - object = objects[ id ]; - - if ( object === undefined ) { - - object = { objects }; - - this.serialize( object ); - - delete object.objects; - - objects[ id ] = object; - - } - - } else { - - object = { objects: {} }; - - this.serialize( object ); - - } - - object.id = id; - object.type = this.className; - - return object; - - } - -} - -class PointerMonitor { - - constructor() { - - this.x = 0; - this.y = 0; - this.started = false; - - this._onMoveEvent = ( e ) => { - - const event = e.touches ? e.touches[ 0 ] : e; - - this.x = event.clientX; - this.y = event.clientY; - - }; - - } - - start() { - - if ( this.started ) return; - - this.started = true; - - window.addEventListener( 'wheel', this._onMoveEvent, true ); - - window.addEventListener( 'mousedown', this._onMoveEvent, true ); - window.addEventListener( 'touchstart', this._onMoveEvent, true ); - - window.addEventListener( 'mousemove', this._onMoveEvent, true ); - window.addEventListener( 'touchmove', this._onMoveEvent, true ); - - window.addEventListener( 'dragover', this._onMoveEvent, true ); - - return this; - - } - -} - -const pointer = new PointerMonitor().start(); - -const draggableDOM = ( dom, callback = null, settings = {} ) => { - - settings = Object.assign( { - className: 'dragging', - click: false, - bypass: false - }, settings ); - - let dragData = null; - - const { className, click, bypass } = settings; - - const getZoom = () => { - - let zoomDOM = dom; - - while ( zoomDOM && zoomDOM !== document ) { - - const zoom = zoomDOM.style.zoom; - - if ( zoom ) { - - return Number( zoom ); - - } - - zoomDOM = zoomDOM.parentNode; - - } - - return 1; - - }; - - const onMouseDown = ( e ) => { - - const event = e.touches ? e.touches[ 0 ] : e; - - if ( bypass === false ) e.stopImmediatePropagation(); - - dragData = { - client: { x: event.clientX, y: event.clientY }, - delta: { x: 0, y: 0 }, - start: { x: dom.offsetLeft, y: dom.offsetTop }, - frame: 0, - isDown: true, - dragging: false, - isTouch: !! e.touches - }; - - if ( click === true ) { - - callback( dragData ); - - dragData.frame ++; - - } - - window.addEventListener( 'mousemove', onGlobalMouseMove ); - window.addEventListener( 'mouseup', onGlobalMouseUp ); - - window.addEventListener( 'touchmove', onGlobalMouseMove ); - window.addEventListener( 'touchend', onGlobalMouseUp ); - - }; - - const onGlobalMouseMove = ( e ) => { - - const { start, delta, client } = dragData; - - const event = e.touches ? e.touches[ 0 ] : e; - - const zoom = getZoom(); - - delta.x = ( event.clientX - client.x ) / zoom; - delta.y = ( event.clientY - client.y ) / zoom; - - dragData.x = start.x + delta.x; - dragData.y = start.y + delta.y; - - if ( dragData.dragging === true ) { - - if ( callback !== null ) { - - callback( dragData ); - - dragData.frame ++; - - } else { - - dom.style.cssText += `; left: ${ dragData.x }px; top: ${ dragData.y }px;`; - - } - - if ( bypass === false ) e.stopImmediatePropagation(); - - } else { - - if ( Math.abs( delta.x ) > 2 || Math.abs( delta.y ) > 2 ) { - - dragData.dragging = true; - - dom.classList.add( 'drag' ); - - if ( className ) document.body.classList.add( ...className.split( ' ' ) ); - - if ( bypass === false ) e.stopImmediatePropagation(); - - } - - } - - }; - - const onGlobalMouseUp = ( e ) => { - - if ( bypass === false ) e.stopImmediatePropagation(); - - dom.classList.remove( 'drag' ); - - if ( className ) document.body.classList.remove( ...className.split( ' ' ) ); - - window.removeEventListener( 'mousemove', onGlobalMouseMove ); - window.removeEventListener( 'mouseup', onGlobalMouseUp ); - - window.removeEventListener( 'touchmove', onGlobalMouseMove ); - window.removeEventListener( 'touchend', onGlobalMouseUp ); - - if ( callback === null ) { - - dom.removeEventListener( 'mousedown', onMouseDown ); - dom.removeEventListener( 'touchstart', onMouseDown ); - - } - - dragData.dragging = false; - dragData.isDown = false; - - if ( callback !== null ) { - - callback( dragData ); - - dragData.frame ++; - - } - - }; - - if ( dom instanceof Event ) { - - const e = dom; - dom = e.target; - - onMouseDown( e ); - - } else { - - dom.addEventListener( 'mousedown', onMouseDown ); - dom.addEventListener( 'touchstart', onMouseDown ); - - } - -}; - -const dispatchEventList = ( list, ...params ) => { - - for ( const callback of list ) { - - if ( callback( ...params ) === false ) { - - return false; - - } - - } - - return true; - -}; - -const numberToPX = ( val ) => { - - if ( isNaN( val ) === false ) { - - val = `${ val }px`; - - } - - return val; - -}; - -const numberToHex = ( val ) => { - - if ( isNaN( val ) === false ) { - - val = `#${ val.toString( 16 ).padStart( 6, '0' ) }`; - - } - - return val; - -}; - -const rgbaToArray = ( rgba ) => { - - const values = rgba.substring( rgba.indexOf( '(' ) + 1, rgba.indexOf( ')' ) ) - .split( ',' ) - .map( num => parseInt( num.trim() ) ); - - return values; - -}; - -const removeDOMClass = ( dom, classList ) => { - - if ( classList ) classList.split( ' ' ).forEach( alignClass => dom.classList.remove( alignClass ) ); - -}; - -const addDOMClass = ( dom, classList ) => { - - if ( classList ) classList.split( ' ' ).forEach( alignClass => dom.classList.add( alignClass ) ); - -}; - -var Utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - pointer: pointer, - draggableDOM: draggableDOM, - dispatchEventList: dispatchEventList, - numberToPX: numberToPX, - numberToHex: numberToHex, - rgbaToArray: rgbaToArray, - removeDOMClass: removeDOMClass, - addDOMClass: addDOMClass -}); - -class Link { - - constructor( inputElement = null, outputElement = null ) { - - this.inputElement = inputElement; - this.outputElement = outputElement; - - } - - get lioElement() { - - if ( Link.InputDirection === 'left' ) { - - return this.outputElement; - - } else { - - return this.inputElement; - - } - - } - - get rioElement() { - - if ( Link.InputDirection === 'left' ) { - - return this.inputElement; - - } else { - - return this.outputElement; - - } - - } - -} - -//Link.InputDirection = 'right'; -Link.InputDirection = 'left'; - -let selected = null; - -class Element extends Serializer { - - static get type() { - - return 'Element'; - - } - - constructor( draggable = false ) { - - super(); - - this.isElement = true; - - const dom = document.createElement( 'f-element' ); - dom.element = this; - - const onSelect = ( e ) => { - - let element = this; - - if ( e.changedTouches && e.changedTouches.length > 0 ) { - - const touch = e.changedTouches[ 0 ]; - - let overDOM = document.elementFromPoint( touch.clientX, touch.clientY ); - - while ( overDOM && ( ! overDOM.element || ! overDOM.element.isElement ) ) { - - overDOM = overDOM.parentNode; - - } - - element = overDOM ? overDOM.element : null; - - } - - const type = e.type; - - if ( ( type === 'mouseout' ) && selected === element ) { - - selected = null; - - } else { - - selected = element; - - } - - }; - - if ( draggable === false ) { - - dom.ontouchstart = dom.onmousedown = ( e ) => { - - e.stopPropagation(); - - }; - - } - - dom.addEventListener( 'mouseup', onSelect, true ); - dom.addEventListener( 'mouseover', onSelect ); - dom.addEventListener( 'mouseout', onSelect ); - dom.addEventListener( 'touchmove', onSelect ); - dom.addEventListener( 'touchend', onSelect ); - - this.inputs = []; - - this.links = []; - - this.dom = dom; - - this.lioLength = 0; - this.rioLength = 0; - - this.events = { - 'connect': [], - 'connectChildren': [], - 'valid': [] - }; - - this.node = null; - - this.style = ''; - this.color = null; - - this.object = null; - this.objectCallback = null; - - this.enabledInputs = true; - - this.visible = true; - - this.inputsDOM = dom; - - this.disconnectDOM = null; - - this.lioDOM = this._createIO( 'lio' ); - this.rioDOM = this._createIO( 'rio' ); - - this.dom.classList.add( `input-${ Link.InputDirection }` ); - - this.addEventListener( 'connect', ( ) => { - - dispatchEventList( this.events.connect, this ); - - } ); - - this.addEventListener( 'connectChildren', ( ) => { - - dispatchEventList( this.events.connectChildren, this ); - - } ); - - } - - setAttribute( name, value ) { - - this.dom.setAttribute( name, value ); - - return this; - - } - - onValid( callback ) { - - this.events.valid.push( callback ); - - return this; - - } - - onConnect( callback, childrens = false ) { - - this.events.connect.push( callback ); - - if ( childrens ) { - - this.events.connectChildren.push( callback ); - - } - - return this; - - } - - setObjectCallback( callback ) { - - this.objectCallback = callback; - - return this; - - } - - setObject( value ) { - - this.object = value; - - return this; - - } - - getObject( output = null ) { - - return this.objectCallback ? this.objectCallback( output ) : this.object; - - } - - setVisible( value ) { - - this.visible = value; - - this.dom.style.display = value ? '' : 'none'; - - return this; - - } - - getVisible() { - - return this.visible; - - } - - setEnabledInputs( value ) { - - const dom = this.dom; - - if ( ! this.enabledInputs ) dom.classList.remove( 'inputs-disable' ); - - if ( ! value ) dom.classList.add( 'inputs-disable' ); - - this.enabledInputs = value; - - return this; - - } - - getEnabledInputs() { - - return this.enabledInputs; - - } - - setColor( color ) { - - this.dom.style[ 'background-color' ] = numberToHex( color ); - this.color = null; - - return this; - - } - - getColor() { - - if ( this.color === null ) { - - const css = window.getComputedStyle( this.dom ); - - this.color = css.getPropertyValue( 'background-color' ); - - } - - return this.color; - - } - - setStyle( style ) { - - const dom = this.dom; - - if ( this.style ) dom.classList.remove( this.style ); - - if ( style ) dom.classList.add( style ); - - this.style = style; - this.color = null; - - return this; - - } - - setInput( length ) { - - if ( Link.InputDirection === 'left' ) { - - return this.setLIO( length ); - - } else { - - return this.setRIO( length ); - - } - - } - - setInputColor( color ) { - - if ( Link.InputDirection === 'left' ) { - - return this.setLIOColor( color ); - - } else { - - return this.setRIOColor( color ); - - } - - } - - setOutput( length ) { - - if ( Link.InputDirection === 'left' ) { - - return this.setRIO( length ); - - } else { - - return this.setLIO( length ); - - } - - } - - setOutputColor( color ) { - - if ( Link.InputDirection === 'left' ) { - - return this.setRIOColor( color ); - - } else { - - return this.setLIOColor( color ); - - } - - } - - get inputLength() { - - if ( Link.InputDirection === 'left' ) { - - return this.lioLength; - - } else { - - return this.rioLength; - - } - - } - - get outputLength() { - - if ( Link.InputDirection === 'left' ) { - - return this.rioLength; - - } else { - - return this.lioLength; - - } - - } - - setLIOColor( color ) { - - this.lioDOM.style[ 'border-color' ] = numberToHex( color ); - - return this; - - } - - setLIO( length ) { - - this.lioLength = length; - - this.lioDOM.style.visibility = length > 0 ? '' : 'hidden'; - - if ( length > 0 ) { - - this.dom.classList.add( 'lio' ); - this.dom.prepend( this.lioDOM ); - - } else { - - this.dom.classList.remove( 'lio' ); - this.lioDOM.remove(); - - } - - return this; - - } - - getLIOColor() { - - return this.lioDOM.style[ 'border-color' ]; - - } - - setRIOColor( color ) { - - this.rioDOM.style[ 'border-color' ] = numberToHex( color ); - - return this; - - } - - getRIOColor() { - - return this.rioDOM.style[ 'border-color' ]; - - } - - setRIO( length ) { - - this.rioLength = length; - - this.rioDOM.style.visibility = length > 0 ? '' : 'hidden'; - - if ( length > 0 ) { - - this.dom.classList.add( 'rio' ); - this.dom.prepend( this.rioDOM ); - - } else { - - this.dom.classList.remove( 'rio' ); - this.rioDOM.remove(); - - } - - return this; - - } - - add( input ) { - - this.inputs.push( input ); - - input.element = this; - - this.inputsDOM.append( input.dom ); - - return this; - - } - - setHeight( val ) { - - this.dom.style.height = numberToPX( val ); - - return this; - - } - - getHeight() { - - return parseInt( this.dom.style.height ); - - } - - connect( element = null ) { - - if ( this.disconnectDOM !== null ) { - - // remove the current input - - this.disconnectDOM.dispatchEvent( new Event( 'disconnect' ) ); - - } - - if ( element !== null ) { - - element = element.baseElement || element; - - if ( dispatchEventList( this.events.valid, this, element, 'connect' ) === false ) { - - return false; - - } - - const link = new Link( this, element ); - - this.links.push( link ); - - if ( this.disconnectDOM === null ) { - - this.disconnectDOM = document.createElement( 'f-disconnect' ); - this.disconnectDOM.innerHTML = Element.icons.unlink ? `` : '✖'; - - this.dom.append( this.disconnectDOM ); - - const onDisconnect = () => { - - this.links = []; - this.dom.removeChild( this.disconnectDOM ); - - this.disconnectDOM.removeEventListener( 'mousedown', onClick, true ); - this.disconnectDOM.removeEventListener( 'touchstart', onClick, true ); - this.disconnectDOM.removeEventListener( 'disconnect', onDisconnect, true ); - - element.removeEventListener( 'connect', onConnect ); - element.removeEventListener( 'connectChildren', onConnect ); - element.removeEventListener( 'nodeConnect', onConnect ); - element.removeEventListener( 'nodeConnectChildren', onConnect ); - element.removeEventListener( 'dispose', onDispose ); - - this.disconnectDOM = null; - - }; - - const onConnect = () => { - - this.dispatchEvent( new Event( 'connectChildren' ) ); - - }; - - const onDispose = () => { - - this.connect(); - - }; - - const onClick = ( e ) => { - - e.stopPropagation(); - - this.connect(); - - }; - - this.disconnectDOM.addEventListener( 'mousedown', onClick, true ); - this.disconnectDOM.addEventListener( 'touchstart', onClick, true ); - this.disconnectDOM.addEventListener( 'disconnect', onDisconnect, true ); - - element.addEventListener( 'connect', onConnect ); - element.addEventListener( 'connectChildren', onConnect ); - element.addEventListener( 'nodeConnect', onConnect ); - element.addEventListener( 'nodeConnectChildren', onConnect ); - element.addEventListener( 'dispose', onDispose ); - - } - - } - - this.dispatchEvent( new Event( 'connect' ) ); - - return true; - - } - - dispose() { - - this.dispatchEvent( new Event( 'dispose' ) ); - - } - - getInputByProperty( property ) { - - for ( const input of this.inputs ) { - - if ( input.getProperty() === property ) { - - return input; - - } - - } - - } - - serialize( data ) { - - const inputs = []; - const properties = []; - const links = []; - - for ( const input of this.inputs ) { - - const id = input.toJSON( data ).id; - const property = input.getProperty(); - - inputs.push( id ); - - if ( property !== null ) { - - properties.push( { property, id } ); - - } - - } - - for ( const link of this.links ) { - - if ( link.inputElement !== null && link.outputElement !== null ) { - - links.push( link.outputElement.toJSON( data ).id ); - - } - - } - - if ( this.inputLength > 0 ) data.inputLength = this.inputLength; - if ( this.outputLength > 0 ) data.outputLength = this.outputLength; - - if ( inputs.length > 0 ) data.inputs = inputs; - if ( properties.length > 0 ) data.properties = properties; - if ( links.length > 0 ) data.links = links; - - if ( this.style !== '' ) { - - data.style = this.style; - - } - - data.height = this.getHeight(); - - } - - deserialize( data ) { - - if ( data.inputLength !== undefined ) this.setInput( data.inputLength ); - if ( data.outputLength !== undefined ) this.setOutput( data.outputLength ); - - if ( data.properties !== undefined ) { - - for ( const { id, property } of data.properties ) { - - data.objects[ id ] = this.getInputByProperty( property ); - - } - - } else if ( data.inputs !== undefined ) { - - const inputs = this.inputs; - - if ( inputs.length > 0 ) { - - let index = 0; - - for ( const id of data.inputs ) { - - data.objects[ id ] = inputs[ index ++ ]; - - } - - } else { - - for ( const id of data.inputs ) { - - this.add( data.objects[ id ] ); - - } - - } - - } - - if ( data.links !== undefined ) { - - for ( const id of data.links ) { - - this.connect( data.objects[ id ] ); - - } - - } - - if ( data.style !== undefined ) { - - this.setStyle( data.style ); - - } - - if ( data.height !== undefined ) { - - this.setHeight( data.height ); - - } - - } - - getLinkedObject( output = null ) { - - const linkedElement = this.getLinkedElement(); - - return linkedElement ? linkedElement.getObject( output ) : null; - - } - - getLinkedElement() { - - const link = this.getLink(); - - return link ? link.outputElement : null; - - } - - getLink() { - - return this.links[ 0 ]; - - } - - _createIO( type ) { - - const { dom } = this; - - const ioDOM = document.createElement( 'f-io' ); - ioDOM.style.visibility = 'hidden'; - ioDOM.className = type; - - const onConnectEvent = ( e ) => { - - e.preventDefault(); - - e.stopPropagation(); - - selected = null; - - const nodeDOM = this.node.dom; - - nodeDOM.classList.add( 'io-connect' ); - - ioDOM.classList.add( 'connect' ); - dom.classList.add( 'select' ); - - const defaultOutput = Link.InputDirection === 'left' ? 'lio' : 'rio'; - - const link = type === defaultOutput ? new Link( this ) : new Link( null, this ); - const previewLink = new Link( link.inputElement, link.outputElement ); - - this.links.push( link ); - - draggableDOM( e, ( data ) => { - - if ( previewLink.outputElement ) - previewLink.outputElement.dom.classList.remove( 'invalid' ); - - if ( previewLink.inputElement ) - previewLink.inputElement.dom.classList.remove( 'invalid' ); - - previewLink.inputElement = link.inputElement; - previewLink.outputElement = link.outputElement; - - if ( type === defaultOutput ) { - - previewLink.outputElement = selected; - - } else { - - previewLink.inputElement = selected; - - } - - const isInvalid = previewLink.inputElement !== null && previewLink.outputElement !== null && - previewLink.inputElement.inputLength > 0 && previewLink.outputElement.outputLength > 0 && - dispatchEventList( previewLink.inputElement.events.valid, previewLink.inputElement, previewLink.outputElement, data.dragging ? 'dragging' : 'dragged' ) === false; - - if ( data.dragging && isInvalid ) { - - if ( type === defaultOutput ) { - - if ( previewLink.outputElement ) - previewLink.outputElement.dom.classList.add( 'invalid' ); - - } else { - - if ( previewLink.inputElement ) - previewLink.inputElement.dom.classList.add( 'invalid' ); - - } - - return; - - } - - if ( ! data.dragging ) { - - nodeDOM.classList.remove( 'io-connect' ); - - ioDOM.classList.remove( 'connect' ); - dom.classList.remove( 'select' ); - - this.links.splice( this.links.indexOf( link ), 1 ); - - if ( selected !== null && ! isInvalid ) { - - link.inputElement = previewLink.inputElement; - link.outputElement = previewLink.outputElement; - - // check if is an is circular link - - if ( link.outputElement.node.isCircular( link.inputElement.node ) ) { - - return; - - } - - // - - if ( link.inputElement.inputLength > 0 && link.outputElement.outputLength > 0 ) { - - link.inputElement.connect( link.outputElement ); - - } - - } - - } - - }, { className: 'connecting' } ); - - }; - - ioDOM.addEventListener( 'mousedown', onConnectEvent, true ); - ioDOM.addEventListener( 'touchstart', onConnectEvent, true ); - - return ioDOM; - - } - -} - -Element.icons = { unlink: '' }; - -class Input extends Serializer { - - static get type() { - - return 'Input'; - - } - - constructor( dom ) { - - super(); - - this.dom = dom; - - this.element = null; - - this.extra = null; - - this.tagColor = null; - - this.property = null; - - this.events = { - 'change': [], - 'click': [] - }; - - this.addEventListener( 'change', ( ) => { - - dispatchEventList( this.events.change, this ); - - } ); - - this.addEventListener( 'click', ( ) => { - - dispatchEventList( this.events.click, this ); - - } ); - - } - - setExtra( value ) { - - this.extra = value; - - return this; - - } - - getExtra() { - - return this.extra; - - } - - setProperty( name ) { - - this.property = name; - - return this; - - } - - getProperty() { - - return this.property; - - } - - setTagColor( color ) { - - this.tagColor = color; - - this.dom.style[ 'border-left' ] = `2px solid ${color}`; - - return this; - - } - - getTagColor() { - - return this.tagColor; - - } - - setToolTip( text ) { - - const div = document.createElement( 'f-tooltip' ); - div.innerText = text; - - this.dom.append( div ); - - return this; - - } - - onChange( callback ) { - - this.events.change.push( callback ); - - return this; - - } - - onClick( callback ) { - - this.events.click.push( callback ); - - return this; - - } - - setReadOnly( value ) { - - this.getInput().readOnly = value; - - return this; - - } - - getReadOnly() { - - return this.getInput().readOnly; - - } - - setValue( value, dispatch = true ) { - - this.getInput().value = value; - - if ( dispatch ) this.dispatchEvent( new Event( 'change' ) ); - - return this; - - } - - getValue() { - - return this.getInput().value; - - } - - getInput() { - - return this.dom; - - } - - serialize( data ) { - - data.value = this.getValue(); - - } - - deserialize( data ) { - - this.setValue( data.value ); - - } - -} - -Input.prototype.isInput = true; - -class Node extends Serializer { - - static get type() { - - return 'Node'; - - } - - constructor() { - - super(); - - const dom = document.createElement( 'f-node' ); - - const onDown = () => { - - const canvas = this.canvas; - - if ( canvas !== null ) { - - canvas.select( this ); - - } - - }; - - dom.addEventListener( 'mousedown', onDown, true ); - dom.addEventListener( 'touchstart', onDown, true ); - - this._onConnect = ( e ) => { - - const { target } = e; - - for ( const element of this.elements ) { - - if ( element !== target ) { - - element.dispatchEvent( new Event( 'nodeConnect' ) ); - - } - - } - - }; - - this._onConnectChildren = ( e ) => { - - const { target } = e; - - for ( const element of this.elements ) { - - if ( element !== target ) { - - element.dispatchEvent( new Event( 'nodeConnectChildren' ) ); - - } - - } - - }; - - this.dom = dom; - - this.style = ''; - - this.canvas = null; - this.resizable = false; - this.serializePriority = 0; - - this.elements = []; - - this.events = { - 'focus': [], - 'blur': [] - }; - - this.setWidth( 300 ).setPosition( 0, 0 ); - - } - - get baseElement() { - - return this.elements[ 0 ]; - - } - - setAlign( align ) { - - const dom = this.dom; - const style = dom.style; - - style.left = ''; - style.top = ''; - style.animation = 'none'; - - if ( typeof align === 'string' ) { - - dom.classList.add( align ); - - } else if ( align ) { - - for ( const name in align ) { - - style[ name ] = align[ name ]; - - } - - } - - return this; - - } - - setResizable( val ) { - - this.resizable = val === true; - - if ( this.resizable ) { - - this.dom.classList.add( 'resizable' ); - - } else { - - this.dom.classList.remove( 'resizable' ); - - } - - this.updateSize(); - - return this; - - } - - onFocus( callback ) { - - this.events.focus.push( callback ); - - return this; - - } - - onBlur( callback ) { - - this.events.blur.push( callback ); - - return this; - - } - - setStyle( style ) { - - const dom = this.dom; - - if ( this.style ) dom.classList.remove( this.style ); - - if ( style ) dom.classList.add( style ); - - this.style = style; - - return this; - - } - - setPosition( x, y ) { - - const dom = this.dom; - - dom.style.left = numberToPX( x ); - dom.style.top = numberToPX( y ); - - return this; - - } - - getPosition() { - - const dom = this.dom; - - return { - x: parseInt( dom.style.left ), - y: parseInt( dom.style.top ) - }; - - } - - setWidth( val ) { - - this.dom.style.width = numberToPX( val ); - - this.updateSize(); - - return this; - - } - - getWidth() { - - return parseInt( this.dom.style.width ); - - } - - getHeight() { - - return this.dom.offsetHeight; - - } - - getBound() { - - const { x, y } = this.getPosition(); - const { width, height } = this.dom.getBoundingClientRect(); - - return { x, y, width, height }; - - } - - add( element ) { - - this.elements.push( element ); - - element.node = this; - element.addEventListener( 'connect', this._onConnect ); - element.addEventListener( 'connectChildren', this._onConnectChildren ); - - this.dom.append( element.dom ); - - this.updateSize(); - - return this; - - } - - remove( element ) { - - this.elements.splice( this.elements.indexOf( element ), 1 ); - - element.node = null; - element.removeEventListener( 'connect', this._onConnect ); - element.removeEventListener( 'connectChildren', this._onConnectChildren ); - - this.dom.removeChild( element.dom ); - - this.updateSize(); - - return this; - - } - - dispose() { - - const canvas = this.canvas; - - if ( canvas !== null ) canvas.remove( this ); - - for ( const element of this.elements ) { - - element.dispose(); - - } - - this.dispatchEvent( new Event( 'dispose' ) ); - - } - - isCircular( node ) { - - if ( node === this ) return true; - - const links = this.getLinks(); - - for ( const link of links ) { - - if ( link.outputElement.node.isCircular( node ) ) { - - return true; - - } - - } - - return false; - - } - - getLinks() { - - const links = []; - - for ( const element of this.elements ) { - - links.push( ...element.links ); - - } - - return links; - - } - - getColor() { - - return this.elements.length > 0 ? this.elements[ 0 ].getColor() : null; - - } - - updateSize() { - - for ( const element of this.elements ) { - - element.dom.style.width = ''; - - } - - if ( this.resizable === true ) { - - const element = this.elements[ this.elements.length - 1 ]; - - if ( element !== undefined ) { - - element.dom.style.width = this.dom.style.width; - - } - - } - - } - - serialize( data ) { - - const { x, y } = this.getPosition(); - - const elements = []; - - for ( const element of this.elements ) { - - elements.push( element.toJSON( data ).id ); - - } - - data.x = x; - data.y = y; - data.width = this.getWidth(); - data.elements = elements; - data.autoResize = this.resizable; - - if ( this.style !== '' ) { - - data.style = this.style; - - } - - } - - deserialize( data ) { - - this.setPosition( data.x, data.y ); - this.setWidth( data.width ); - this.setResizable( data.autoResize ); - - if ( data.style !== undefined ) { - - this.setStyle( data.style ); - - } - - const elements = this.elements; - - if ( elements.length > 0 ) { - - let index = 0; - - for ( const id of data.elements ) { - - data.objects[ id ] = elements[ index ++ ]; - - } - - } else { - - for ( const id of data.elements ) { - - this.add( data.objects[ id ] ); - - } - - } - - } - -} - -Node.prototype.isNode = true; - -class DraggableElement extends Element { - - static get type() { - - return 'DraggableElement'; - - } - - constructor( draggable = true ) { - - super( true ); - - this.draggable = draggable; - - const onDrag = ( e ) => { - - e.preventDefault(); - - if ( this.draggable === true ) { - - draggableDOM( this.node.dom, null, { className: 'dragging node' } ); - - } - - }; - - const { dom } = this; - - dom.addEventListener( 'mousedown', onDrag, true ); - dom.addEventListener( 'touchstart', onDrag, true ); - - } - -} - -class TitleElement extends DraggableElement { - - static get type() { - - return 'TitleElement'; - - } - - constructor( title, draggable = true ) { - - super( draggable ); - - const { dom } = this; - - dom.classList.add( 'title' ); - - const dbClick = () => { - - this.node.canvas.focusSelected = ! this.node.canvas.focusSelected; - - }; - - dom.addEventListener( 'dblclick', dbClick ); - - const titleDOM = document.createElement( 'f-title' ); - titleDOM.innerText = title; - - const iconDOM = document.createElement( 'i' ); - - const toolbarDOM = document.createElement( 'f-toolbar' ); - - this.buttons = []; - - this.titleDOM = titleDOM; - this.iconDOM = iconDOM; - this.toolbarDOM = toolbarDOM; - - dom.append( titleDOM ); - dom.append( iconDOM ); - dom.append( toolbarDOM ); - - } - - setIcon( value ) { - - this.iconDOM.className = value; - - return this; - - } - - getIcon() { - - return this.iconDOM.className; - - } - - setTitle( value ) { - - this.titleDOM.innerText = value; - - return this; - - } - - getTitle() { - - return this.titleDOM.innerText; - - } - - addButton( button ) { - - this.buttons.push( button ); - - this.toolbarDOM.append( button.dom ); - - return this; - - } - - serialize( data ) { - - super.serialize( data ); - - const title = this.getTitle(); - const icon = this.getIcon(); - - data.title = title; - - if ( icon !== '' ) { - - data.icon = icon; - - } - - } - - deserialize( data ) { - - super.deserialize( data ); - - this.setTitle( data.title ); - - if ( data.icon !== undefined ) { - - this.setIcon( data.icon ); - - } - - } - -} - -const drawLine = ( p1x, p1y, p2x, p2y, invert, size, colorA, ctx, colorB = null ) => { - - const dx = p2x - p1x; - const dy = p2y - p1y; - const offset = Math.sqrt( ( dx * dx ) + ( dy * dy ) ) * ( invert ? - .3 : .3 ); - - ctx.beginPath(); - - ctx.moveTo( p1x, p1y ); - - ctx.bezierCurveTo( - p1x + offset, p1y, - p2x - offset, p2y, - p2x, p2y - ); - - if ( colorB !== null && colorA !== colorB ) { - - const gradient = ctx.createLinearGradient( p1x, p1y, p2x, p2y ); - gradient.addColorStop( 0, colorA ); - gradient.addColorStop( 1, colorB ); - - ctx.strokeStyle = gradient; - - } else { - - ctx.strokeStyle = colorA; - - } - - ctx.lineWidth = size; - ctx.stroke(); - -}; - -const colors = [ - '#ff4444', - '#44ff44', - '#4444ff' -]; - -const dropNode = new Node().add( new TitleElement( 'File' ) ).setWidth( 250 ); - -class Canvas extends Serializer { - - static get type() { - - return 'Canvas'; - - } - - constructor() { - - super(); - - const dom = document.createElement( 'f-canvas' ); - const contentDOM = document.createElement( 'f-content' ); - const areaDOM = document.createElement( 'f-area' ); - const dropDOM = document.createElement( 'f-drop' ); - - const canvas = document.createElement( 'canvas' ); - const frontCanvas = document.createElement( 'canvas' ); - const mapCanvas = document.createElement( 'canvas' ); - - const context = canvas.getContext( '2d' ); - const frontContext = frontCanvas.getContext( '2d' ); - const mapContext = mapCanvas.getContext( '2d' ); - - this.dom = dom; - - this.contentDOM = contentDOM; - this.areaDOM = areaDOM; - this.dropDOM = dropDOM; - - this.canvas = canvas; - this.frontCanvas = frontCanvas; - this.mapCanvas = mapCanvas; - - this.context = context; - this.frontContext = frontContext; - this.mapContext = mapContext; - - this.clientX = 0; - this.clientY = 0; - - this.relativeClientX = 0; - this.relativeClientY = 0; - - this.nodes = []; - - this.selected = null; - - this.updating = false; - - this.droppedItems = []; - - this.events = { - 'drop': [] - }; - - this._scrollLeft = 0; - this._scrollTop = 0; - this._zoom = 1; - this._width = 0; - this._height = 0; - this._focusSelected = false; - this._mapInfo = { - scale: 1, - screen: {} - }; - - canvas.className = 'background'; - frontCanvas.className = 'frontground'; - mapCanvas.className = 'map'; - - dropDOM.innerHTML = 'drop your file'; - - dom.append( dropDOM ); - dom.append( canvas ); - dom.append( frontCanvas ); - dom.append( contentDOM ); - dom.append( areaDOM ); - dom.append( mapCanvas ); - - const zoomTo = ( zoom, clientX = this.clientX, clientY = this.clientY ) => { - - zoom = Math.min( Math.max( zoom, .2 ), 1 ); - - this.scrollLeft -= ( clientX / this.zoom ) - ( clientX / zoom ); - this.scrollTop -= ( clientY / this.zoom ) - ( clientY / zoom ); - this.zoom = zoom; - - }; - - let touchData = null; - - const onTouchStart = () => { - - touchData = null; - - }; - - const classInElements = ( element, className ) => { - - do { - - if ( element.classList ? element.classList.contains( className ) : false ) { - - return true; - - } - - } while ( ( element = element.parentElement ) && element !== dom ); - - return false; - - }; - - const onMouseZoom = ( e ) => { - - if ( classInElements( e.srcElement, 'f-scroll' ) ) return; - - e.preventDefault(); - - e.stopImmediatePropagation(); - - const delta = e.deltaY * .003; - - zoomTo( this.zoom - delta ); - - }; - - const onTouchZoom = ( e ) => { - - if ( e.touches && e.touches.length === 2 ) { - - e.preventDefault(); - - e.stopImmediatePropagation(); - - const clientX = ( e.touches[ 0 ].clientX + e.touches[ 1 ].clientX ) / 2; - const clientY = ( e.touches[ 0 ].clientY + e.touches[ 1 ].clientY ) / 2; - - const distance = Math.hypot( - e.touches[ 0 ].clientX - e.touches[ 1 ].clientX, - e.touches[ 0 ].clientY - e.touches[ 1 ].clientY - ); - - if ( touchData === null ) { - - touchData = { - distance - }; - - } - - const delta = ( touchData.distance - distance ) * .003; - touchData.distance = distance; - - zoomTo( this.zoom - delta, clientX, clientY ); - - } - - }; - - const onTouchMove = ( e ) => { - - if ( e.touches && e.touches.length === 1 ) { - - e.preventDefault(); - - e.stopImmediatePropagation(); - - const clientX = e.touches[ 0 ].clientX; - const clientY = e.touches[ 0 ].clientY; - - if ( touchData === null ) { - - const { scrollLeft, scrollTop } = this; - - touchData = { - scrollLeft, - scrollTop, - clientX, - clientY - }; - - } - - const zoom = this.zoom; - - this.scrollLeft = touchData.scrollLeft + ( ( clientX - touchData.clientX ) / zoom ); - this.scrollTop = touchData.scrollTop + ( ( clientY - touchData.clientY ) / zoom ); - - } - - }; - - dom.addEventListener( 'wheel', onMouseZoom ); - dom.addEventListener( 'touchmove', onTouchZoom ); - dom.addEventListener( 'touchstart', onTouchStart ); - canvas.addEventListener( 'touchmove', onTouchMove ); - - let dropEnterCount = 0; - - const dragState = ( enter ) => { - - if ( enter ) { - - if ( dropEnterCount ++ === 0 ) { - - this.droppedItems = []; - - dropDOM.classList.add( 'visible' ); - - this.add( dropNode ); - - } - - } else if ( -- dropEnterCount === 0 ) { - - dropDOM.classList.remove( 'visible' ); - - this.remove( dropNode ); - - } - - }; - - dom.addEventListener( 'dragenter', () => { - - dragState( true ); - - } ); - - dom.addEventListener( 'dragleave', () => { - - dragState( false ); - - } ); - - dom.addEventListener( 'dragover', ( e ) => { - - e.preventDefault(); - - const { relativeClientX, relativeClientY } = this; - - const centerNodeX = dropNode.getWidth() / 2; - - dropNode.setPosition( relativeClientX - centerNodeX, relativeClientY - 20 ); - - } ); - - dom.addEventListener( 'drop', ( e ) => { - - e.preventDefault(); - - dragState( false ); - - this.droppedItems = e.dataTransfer.items; - - dispatchEventList( this.events.drop, this ); - - } ); - - draggableDOM( dom, ( data ) => { - - const { delta, isTouch } = data; - - if ( ! isTouch ) { - - if ( data.scrollTop === undefined ) { - - data.scrollLeft = this.scrollLeft; - data.scrollTop = this.scrollTop; - - } - - const zoom = this.zoom; - - this.scrollLeft = data.scrollLeft + ( delta.x / zoom ); - this.scrollTop = data.scrollTop + ( delta.y / zoom ); - - } - - if ( data.dragging ) { - - dom.classList.add( 'grabbing' ); - - } else { - - dom.classList.remove( 'grabbing' ); - - } - - }, { className: 'dragging-canvas' } ); - - - draggableDOM( mapCanvas, ( data ) => { - - const { scale, screen } = this._mapInfo; - - if ( data.scrollLeft === undefined ) { - - const rect = this.mapCanvas.getBoundingClientRect(); - - const clientMapX = data.client.x - rect.left; - const clientMapY = data.client.y - rect.top; - - const overMapScreen = - clientMapX > screen.x && clientMapY > screen.y && - clientMapX < screen.x + screen.width && clientMapY < screen.y + screen.height; - - if ( overMapScreen === false ) { - - const scaleX = this._mapInfo.width / this.mapCanvas.width; - - let scrollLeft = - this._mapInfo.left - ( clientMapX * scaleX ); - let scrollTop = - this._mapInfo.top - ( clientMapY * ( this._mapInfo.height / this.mapCanvas.height ) ); - - scrollLeft += ( screen.width / 2 ) / scale; - scrollTop += ( screen.height / 2 ) / scale; - - this.scrollLeft = scrollLeft; - this.scrollTop = scrollTop; - - } - - data.scrollLeft = this.scrollLeft; - data.scrollTop = this.scrollTop; - - } - - this.scrollLeft = data.scrollLeft - ( data.delta.x / scale ); - this.scrollTop = data.scrollTop - ( data.delta.y / scale ); - - }, { click: true } ); - - this._onMoveEvent = ( e ) => { - - const event = e.touches ? e.touches[ 0 ] : e; - const { zoom, rect } = this; - - this.clientX = event.clientX; - this.clientY = event.clientY; - - const rectClientX = ( this.clientX - rect.left ) / zoom; - const rectClientY = ( this.clientY - rect.top ) / zoom; - - this.relativeClientX = rectClientX - this.scrollLeft; - this.relativeClientY = rectClientY - this.scrollTop; - - }; - - this._onUpdate = () => { - - this.update(); - - }; - - this.start(); - - } - - getBounds() { - - const bounds = { x: Infinity, y: Infinity, width: - Infinity, height: - Infinity }; - - for ( const node of this.nodes ) { - - const { x, y, width, height } = node.getBound(); - - bounds.x = Math.min( bounds.x, x ); - bounds.y = Math.min( bounds.y, y ); - bounds.width = Math.max( bounds.width, x + width ); - bounds.height = Math.max( bounds.height, y + height ); - - } - - bounds.x = Math.round( bounds.x ); - bounds.y = Math.round( bounds.y ); - bounds.width = Math.round( bounds.width ); - bounds.height = Math.round( bounds.height ); - - return bounds; - - } - - get width() { - - return this._width; - - } - - get height() { - - return this._height; - - } - - get rect() { - - return this.dom.getBoundingClientRect(); - - } - - get zoom() { - - return this._zoom; - - } - - set zoom( val ) { - - this._zoom = val; - this.contentDOM.style.zoom = val; - - val === 1 ? this.dom.classList.remove( 'zoom' ) : this.dom.classList.add( 'zoom' ); - - this.updateMozTransform(); - - } - - set scrollLeft( val ) { - - this._scrollLeft = val; - this.contentDOM.style.left = numberToPX( val ); - - this.updateMozTransform(); - - } - - get scrollLeft() { - - return this._scrollLeft; - - } - - set scrollTop( val ) { - - this._scrollTop = val; - this.contentDOM.style.top = numberToPX( val ); - - this.updateMozTransform(); - - } - - get scrollTop() { - - return this._scrollTop; - - } - - set focusSelected( value ) { - - if ( this._focusSelected === value ) return; - - const classList = this.dom.classList; - - this._focusSelected = value; - - if ( value ) { - - classList.add( 'focusing' ); - - } else { - - classList.remove( 'focusing' ); - - } - - } - - get focusSelected() { - - return this._focusSelected; - - } - - get useTransform() { - - const userAgent = navigator.userAgent; - const isSafari = /Safari/.test( userAgent ) && ! /Chrome/.test( userAgent ); - - return ! isSafari; - - } - - updateMozTransform() { - - if ( this.useTransform === false ) return; - - this.contentDOM.style[ '-moz-transform' ] = 'scale(' + this.zoom + ')'; - this.contentDOM.style[ '-moz-transform-origin' ] = '-' + this.contentDOM.style.left + ' -' + this.contentDOM.style.top; - - } - - onDrop( callback ) { - - this.events.drop.push( callback ); - - return this; - - } - - start() { - - this.updating = true; - - document.addEventListener( 'wheel', this._onMoveEvent, true ); - - document.addEventListener( 'mousedown', this._onMoveEvent, true ); - document.addEventListener( 'touchstart', this._onMoveEvent, true ); - - document.addEventListener( 'mousemove', this._onMoveEvent, true ); - document.addEventListener( 'touchmove', this._onMoveEvent, true ); - - document.addEventListener( 'dragover', this._onMoveEvent, true ); - - requestAnimationFrame( this._onUpdate ); - - } - - stop() { - - this.updating = false; - - document.removeEventListener( 'wheel', this._onMoveEvent, true ); - - document.removeEventListener( 'mousedown', this._onMoveEvent, true ); - document.removeEventListener( 'touchstart', this._onMoveEvent, true ); - - document.removeEventListener( 'mousemove', this._onMoveEvent, true ); - document.removeEventListener( 'touchmove', this._onMoveEvent, true ); - - document.removeEventListener( 'dragover', this._onMoveEvent, true ); - - } - - add( node ) { - - if ( node.canvas === this ) return; - - this.nodes.push( node ); - - node.canvas = this; - - this.contentDOM.append( node.dom ); - - return this; - - } - - remove( node ) { - - if ( node === this.selected ) { - - this.select(); - - } - - this.unlink( node ); - - const nodes = this.nodes; - - nodes.splice( nodes.indexOf( node ), 1 ); - - node.canvas = null; - - this.contentDOM.removeChild( node.dom ); - - node.dispatchEvent( new Event( 'remove' ) ); - - return this; - - } - - clear() { - - const nodes = this.nodes; - - while ( nodes.length > 0 ) { - - this.remove( nodes[ 0 ] ); - - } - - return this; - - } - - unlink( node ) { - - const links = this.getLinks(); - - for ( const link of links ) { - - if ( link.inputElement && link.outputElement ) { - - if ( link.inputElement.node === node ) { - - link.inputElement.connect(); - - } else if ( link.outputElement.node === node ) { - - link.inputElement.connect(); - - } - - } - - } - - } - - getLinks() { - - const links = []; - - for ( const node of this.nodes ) { - - links.push( ...node.getLinks() ); - - } - - return links; - - } - - centralize() { - - const bounds = this.getBounds(); - - this.scrollLeft = ( this.canvas.width / 2 ) - ( ( - bounds.x + bounds.width ) / 2 ); - this.scrollTop = ( this.canvas.height / 2 ) - ( ( - bounds.y + bounds.height ) / 2 ); - - return this; - - } - - setSize( width, height ) { - - this._width = width; - this._height = height; - - this.update(); - - return this; - - } - - select( node = null ) { - - if ( node === this.selected ) return; - - const previousNode = this.selected; - - if ( previousNode !== null ) { - - this.focusSelected = false; - - previousNode.dom.classList.remove( 'selected' ); - - this.selected = null; - - dispatchEventList( previousNode.events.blur, previousNode ); - - } - - if ( node !== null ) { - - node.dom.classList.add( 'selected' ); - - this.selected = node; - - dispatchEventList( node.events.focus, node ); - - } - - } - - updateMap() { - - const { nodes, mapCanvas, mapContext, scrollLeft, scrollTop, canvas, zoom, _mapInfo } = this; - - const bounds = this.getBounds(); - - mapCanvas.width = 300; - mapCanvas.height = 200; - - mapContext.clearRect( 0, 0, mapCanvas.width, mapCanvas.height ); - - mapContext.fillStyle = 'rgba( 0, 0, 0, 0 )'; - mapContext.fillRect( 0, 0, mapCanvas.width, mapCanvas.height ); - - const boundsWidth = - bounds.x + bounds.width; - const boundsHeight = - bounds.y + bounds.height; - - const mapScale = Math.min( mapCanvas.width / boundsWidth, mapCanvas.height / boundsHeight ) * .5; - - const boundsMapWidth = boundsWidth * mapScale; - const boundsMapHeight = boundsHeight * mapScale; - - const boundsOffsetX = ( mapCanvas.width / 2 ) - ( boundsMapWidth / 2 ); - const boundsOffsetY = ( mapCanvas.height / 2 ) - ( boundsMapHeight / 2 ); - - let selectedNode = null; - - for ( const node of nodes ) { - - const nodeBound = node.getBound(); - const nodeColor = node.getColor(); - - nodeBound.x += - bounds.x; - nodeBound.y += - bounds.y; - - nodeBound.x *= mapScale; - nodeBound.y *= mapScale; - nodeBound.width *= mapScale; - nodeBound.height *= mapScale; - - nodeBound.x += boundsOffsetX; - nodeBound.y += boundsOffsetY; - - if ( node !== this.selected ) { - - mapContext.fillStyle = nodeColor; - mapContext.fillRect( nodeBound.x, nodeBound.y, nodeBound.width, nodeBound.height ); - - } else { - - selectedNode = { - nodeBound, - nodeColor - }; - - } - - } - - if ( selectedNode !== null ) { - - const { nodeBound, nodeColor } = selectedNode; - - mapContext.fillStyle = nodeColor; - mapContext.fillRect( nodeBound.x, nodeBound.y, nodeBound.width, nodeBound.height ); - - } - - const screenMapX = ( - ( scrollLeft + bounds.x ) * mapScale ) + boundsOffsetX; - const screenMapY = ( - ( scrollTop + bounds.y ) * mapScale ) + boundsOffsetY; - const screenMapWidth = ( canvas.width * mapScale ) / zoom; - const screenMapHeight = ( canvas.height * mapScale ) / zoom; - - mapContext.fillStyle = 'rgba( 200, 200, 200, 0.1 )'; - mapContext.fillRect( screenMapX, screenMapY, screenMapWidth, screenMapHeight ); - - // - - _mapInfo.scale = mapScale; - _mapInfo.left = ( - boundsOffsetX / mapScale ) + bounds.x; - _mapInfo.top = ( - boundsOffsetY / mapScale ) + bounds.y; - _mapInfo.width = mapCanvas.width / mapScale; - _mapInfo.height = mapCanvas.height / mapScale; - _mapInfo.screen.x = screenMapX; - _mapInfo.screen.y = screenMapY; - _mapInfo.screen.width = screenMapWidth; - _mapInfo.screen.height = screenMapHeight; - - } - - updateLines() { - - const { dom, zoom, canvas, frontCanvas, frontContext, context, _width, _height, useTransform } = this; - - const domRect = this.rect; - - if ( canvas.width !== _width || canvas.height !== _height ) { - - canvas.width = _width; - canvas.height = _height; - - frontCanvas.width = _width; - frontCanvas.height = _height; - - } - - context.clearRect( 0, 0, _width, _height ); - frontContext.clearRect( 0, 0, _width, _height ); - - // - - context.globalCompositeOperation = 'lighter'; - frontContext.globalCompositeOperation = 'source-over'; - - const links = this.getLinks(); - - const aPos = { x: 0, y: 0 }; - const bPos = { x: 0, y: 0 }; - - const offsetIORadius = 10; - - let dragging = ''; - - for ( const link of links ) { - - const { lioElement, rioElement } = link; - - let draggingLink = ''; - let length = 0; - - if ( lioElement !== null ) { - - const rect = lioElement.dom.getBoundingClientRect(); - - length = Math.max( length, lioElement.rioLength ); - - aPos.x = rect.x + rect.width; - aPos.y = rect.y + ( rect.height / 2 ); - - if ( useTransform ) { - - aPos.x /= zoom; - aPos.y /= zoom; - - } - - } else { - - aPos.x = this.clientX; - aPos.y = this.clientY; - - draggingLink = 'lio'; - - } - - if ( rioElement !== null ) { - - const rect = rioElement.dom.getBoundingClientRect(); - - length = Math.max( length, rioElement.lioLength ); - - bPos.x = rect.x; - bPos.y = rect.y + ( rect.height / 2 ); - - if ( useTransform ) { - - bPos.x /= zoom; - bPos.y /= zoom; - - } - - } else { - - bPos.x = this.clientX; - bPos.y = this.clientY; - - draggingLink = 'rio'; - - } - - dragging = dragging || draggingLink; - - const drawContext = draggingLink ? frontContext : context; - - if ( draggingLink || length === 1 ) { - - let colorA = null, - colorB = null; - - if ( draggingLink === 'rio' ) { - - colorA = colorB = lioElement.getRIOColor(); - - aPos.x += offsetIORadius; - bPos.x /= zoom; - bPos.y /= zoom; - - } else if ( draggingLink === 'lio' ) { - - colorA = colorB = rioElement.getLIOColor(); - - bPos.x -= offsetIORadius; - aPos.x /= zoom; - aPos.y /= zoom; - - } else { - - colorA = lioElement.getRIOColor(); - colorB = rioElement.getLIOColor(); - - } - - drawLine( - aPos.x * zoom, aPos.y * zoom, - bPos.x * zoom, bPos.y * zoom, - false, 2, colorA || '#ffffff', drawContext, colorB || '#ffffff' - ); - - } else { - - length = Math.min( length, 4 ); - - for ( let i = 0; i < length; i ++ ) { - - const color = colors[ i ] || '#ffffff'; - - const marginY = 4; - - const rioLength = Math.min( lioElement.rioLength, length ); - const lioLength = Math.min( rioElement.lioLength, length ); - - const colorA = lioElement.getRIOColor() || color; - const colorB = rioElement.getLIOColor() || color; - - const aCenterY = ( ( rioLength * marginY ) * .5 ) - ( marginY / 2 ); - const bCenterY = ( ( lioLength * marginY ) * .5 ) - ( marginY / 2 ); - - const aIndex = Math.min( i, rioLength - 1 ); - const bIndex = Math.min( i, lioLength - 1 ); - - const aPosY = ( aIndex * marginY ) - 1; - const bPosY = ( bIndex * marginY ) - 1; - - drawLine( - aPos.x * zoom, ( ( aPos.y + aPosY ) - aCenterY ) * zoom, - bPos.x * zoom, ( ( bPos.y + bPosY ) - bCenterY ) * zoom, - false, 2, colorA, drawContext, colorB - ); - - } - - } - - } - - context.globalCompositeOperation = 'destination-in'; - - context.fillRect( domRect.x, domRect.y, domRect.width, domRect.height ); - - if ( dragging !== '' ) { - - dom.classList.add( 'dragging-' + dragging ); - - } else { - - dom.classList.remove( 'dragging-lio' ); - dom.classList.remove( 'dragging-rio' ); - - } - - } - - update() { - - if ( this.updating === false ) return; - - requestAnimationFrame( this._onUpdate ); - - this.updateLines(); - this.updateMap(); - - } - - serialize( data ) { - - const nodes = []; - const serializeNodes = this.nodes.sort( ( a, b ) => a.serializePriority > b.serializePriority ? - 1 : 1 ); - - for ( const node of serializeNodes ) { - - nodes.push( node.toJSON( data ).id ); - - } - - data.nodes = nodes; - - } - - deserialize( data ) { - - for ( const id of data.nodes ) { - - this.add( data.objects[ id ] ); - - } - - } - -} - -class Menu extends EventTarget { - - constructor( className ) { - - super(); - - const dom = document.createElement( 'f-menu' ); - dom.className = className + ' bottom left hidden'; - - const listDOM = document.createElement( 'f-list' ); - - dom.append( listDOM ); - - this.dom = dom; - this.listDOM = listDOM; - - this.visible = false; - - this.align = 'bottom left'; - - this.subMenus = new WeakMap(); - this.domButtons = new WeakMap(); - - this.buttons = []; - - this.events = {}; - - } - - onContext( callback ) { - - this.events.context.push( callback ); - - return this; - - } - - setAlign( align ) { - - const dom = this.dom; - - removeDOMClass( dom, this.align ); - addDOMClass( dom, align ); - - this.align = align; - - return this; - - } - - getAlign() { - - return this.align; - - } - - show() { - - this.dom.classList.remove( 'hidden' ); - - this.visible = true; - - this.dispatchEvent( new Event( 'show' ) ); - - return this; - - } - - hide() { - - this.dom.classList.add( 'hidden' ); - - this.dispatchEvent( new Event( 'hide' ) ); - - this.visible = false; - - } - - add( button, submenu = null ) { - - const liDOM = document.createElement( 'f-item' ); - - if ( submenu !== null ) { - - liDOM.classList.add( 'submenu' ); - - liDOM.append( submenu.dom ); - - this.subMenus.set( button, submenu ); - - button.dom.addEventListener( 'mouseover', () => submenu.show() ); - button.dom.addEventListener( 'mouseout', () => submenu.hide() ); - - } - - liDOM.append( button.dom ); - - this.buttons.push( button ); - - this.listDOM.append( liDOM ); - - this.domButtons.set( button, liDOM ); - - return this; - - } - - clear() { - - this.buttons = []; - - this.subMenus = new WeakMap(); - this.domButtons = new WeakMap(); - - while ( this.listDOM.firstChild ) { - - this.listDOM.firstChild.remove(); - - } - - } - -} - -let lastContext = null; - -const onCloseLastContext = ( e ) => { - - if ( lastContext && lastContext.visible === true && e.target.closest( 'f-menu.context' ) === null ) { - - lastContext.hide(); - - } - -}; - -document.body.addEventListener( 'mousedown', onCloseLastContext, true ); -document.body.addEventListener( 'touchstart', onCloseLastContext, true ); - -class ContextMenu extends Menu { - - constructor( target = null ) { - - super( 'context' ); - - this.events.context = []; - - this._lastButtonClick = null; - - this._onButtonClick = ( e = null ) => { - - const button = e ? e.target : null; - - if ( this._lastButtonClick ) { - - this._lastButtonClick.dom.parentElement.classList.remove( 'active' ); - - } - - this._lastButtonClick = button; - - if ( button ) { - - if ( this.subMenus.has( button ) ) { - - this.subMenus.get( button )._onButtonClick(); - - } - - button.dom.parentElement.classList.add( 'active' ); - - } - - }; - - this._onButtonMouseOver = ( e ) => { - - const button = e.target; - - if ( this.subMenus.has( button ) && this._lastButtonClick !== button ) { - - this._onButtonClick(); - - } - - }; - - this.addEventListener( 'context', ( ) => { - - dispatchEventList( this.events.context, this ); - - } ); - - this.setTarget( target ); - - } - - openFrom( dom ) { - - const rect = dom.getBoundingClientRect(); - - return this.open( rect.x + ( rect.width / 2 ), rect.y + ( rect.height / 2 ) ); - - } - - open( x = pointer.x, y = pointer.y ) { - - if ( lastContext !== null ) { - - lastContext.hide(); - - } - - lastContext = this; - - this.setPosition( x, y ); - - document.body.append( this.dom ); - - return this.show(); - - } - - setWidth( width ) { - - this.dom.style.width = numberToPX( width ); - - return this; - - } - - setPosition( x, y ) { - - const dom = this.dom; - - dom.style.left = numberToPX( x ); - dom.style.top = numberToPX( y ); - - return this; - - } - - setTarget( target = null ) { - - if ( target !== null ) { - - const onContextMenu = ( e ) => { - - e.preventDefault(); - - if ( e.pointerType !== 'mouse' || ( e.pageX === 0 && e.pageY === 0 ) ) return; - - this.dispatchEvent( new Event( 'context' ) ); - - this.open(); - - }; - - this.target = target; - - target.addEventListener( 'contextmenu', onContextMenu, false ); - - } - - return this; - - } - - show() { - - if ( ! this.opened ) { - - this.dom.style.left = ''; - this.dom.style.transform = ''; - - } - - const domRect = this.dom.getBoundingClientRect(); - - let offsetX = Math.min( window.innerWidth - ( domRect.x + domRect.width + 10 ), 0 ); - let offsetY = Math.min( window.innerHeight - ( domRect.y + domRect.height + 10 ), 0 ); - - if ( this.opened ) { - - if ( offsetX < 0 ) offsetX = - domRect.width; - if ( offsetY < 0 ) offsetY = - domRect.height; - - this.setPosition( domRect.x + offsetX, domRect.y + offsetY ); - - } else { - - // flip submenus - - if ( offsetX < 0 ) this.dom.style.left = '-100%'; - if ( offsetY < 0 ) this.dom.style.transform = 'translateY( calc( 32px - 100% ) )'; - - } - - return super.show(); - - } - - hide() { - - if ( this.opened ) { - - lastContext = null; - - } - - return super.hide(); - - } - - add( button, submenu = null ) { - - button.addEventListener( 'click', this._onButtonClick ); - button.addEventListener( 'mouseover', this._onButtonMouseOver ); - - return super.add( button, submenu ); - - } - - get opened() { - - return lastContext === this; - - } - -} - -class CircleMenu extends Menu { - - constructor() { - - super( 'circle' ); - - } - -} - -class Tips extends EventTarget { - - constructor() { - - super(); - - const dom = document.createElement( 'f-tips' ); - - this.dom = dom; - - this.time = 0; - this.duration = 3000; - - } - - message( str ) { - - return this.tip( str ); - - } - - error( str ) { - - return this.tip( str, 'error' ); - - } - - tip( html, className = '' ) { - - const dom = document.createElement( 'f-tip' ); - dom.className = className; - dom.innerHTML = html; - - this.dom.prepend( dom ); - - //requestAnimationFrame( () => dom.style.opacity = 1 ); - - this.time = Math.min( this.time + this.duration, this.duration ); - - setTimeout( () => { - - this.time = Math.max( this.time - this.duration, 0 ); - - dom.style.opacity = 0; - - setTimeout( () => dom.remove(), 250 ); - - }, this.time ); - - return this; - - } - -} - -const filterString = ( str ) => { - - return str.trim().toLowerCase().replace( /\s\s+/g, ' ' ); - -}; - -class Search extends Menu { - - constructor() { - - super( 'search' ); - - this.events.submit = []; - this.events.filter = []; - - this.tags = new WeakMap(); - - const inputDOM = document.createElement( 'input' ); - inputDOM.placeholder = 'Type here'; - - let filter = true; - let filterNeedUpdate = true; - - inputDOM.addEventListener( 'focusout', () => { - - filterNeedUpdate = true; - - this.setValue( '' ); - - } ); - - inputDOM.onkeydown = ( e ) => { - - const key = e.key; - - if ( key === 'ArrowUp' ) { - - const index = this.filteredIndex; - - if ( this.forceAutoComplete ) { - - this.filteredIndex = index !== null ? ( index + 1 ) % ( this.filtered.length || 1 ) : 0; - - } else { - - this.filteredIndex = index !== null ? Math.min( index + 1, this.filtered.length - 1 ) : 0; - - } - - e.preventDefault(); - - filter = false; - - } else if ( key === 'ArrowDown' ) { - - const index = this.filteredIndex; - - if ( this.forceAutoComplete ) { - - this.filteredIndex = index - 1; - - if ( this.filteredIndex === null ) this.filteredIndex = this.filtered.length - 1; - - } else { - - this.filteredIndex = index !== null ? index - 1 : null; - - } - - e.preventDefault(); - - filter = false; - - } else if ( key === 'Enter' ) { - - this.value = this.currentFiltered ? this.currentFiltered.button.getValue() : inputDOM.value; - - this.submit(); - - e.preventDefault(); - - filter = false; - - } else { - - filter = true; - - } - - }; - - inputDOM.onkeyup = () => { - - if ( filter ) { - - if ( filterNeedUpdate ) { - - this.dispatchEvent( new Event( 'filter' ) ); - - filterNeedUpdate = false; - - } - - this.filter( inputDOM.value ); - - } - - }; - - this.filtered = []; - this.currentFiltered = null; - - this.value = ''; - - this.forceAutoComplete = false; - - this.dom.append( inputDOM ); - - this.inputDOM = inputDOM; - - this.addEventListener( 'filter', ( ) => { - - dispatchEventList( this.events.filter, this ); - - } ); - - this.addEventListener( 'submit', ( ) => { - - dispatchEventList( this.events.submit, this ); - - } ); - - } - - submit() { - - this.dispatchEvent( new Event( 'submit' ) ); - - return this.setValue( '' ); - - } - - setValue( value ) { - - this.inputDOM.value = value; - - this.filter( value ); - - return this; - - } - - getValue() { - - return this.value; - - } - - onFilter( callback ) { - - this.events.filter.push( callback ); - - return this; - - } - - onSubmit( callback ) { - - this.events.submit.push( callback ); - - return this; - - } - - getFilterByButton( button ) { - - for ( const filter of this.filtered ) { - - if ( filter.button === button ) { - - return filter; - - } - - } - - return null; - - } - - add( button ) { - - super.add( button ); - - const onDown = () => { - - const filter = this.getFilterByButton( button ); - - this.filteredIndex = this.filtered.indexOf( filter ); - this.value = button.getValue(); - - this.submit(); - - }; - - button.dom.addEventListener( 'mousedown', onDown ); - button.dom.addEventListener( 'touchstart', onDown ); - - this.domButtons.get( button ).remove(); - - return this; - - } - - set filteredIndex( index ) { - - if ( this.currentFiltered ) { - - const buttonDOM = this.domButtons.get( this.currentFiltered.button ); - - buttonDOM.classList.remove( 'active' ); - - this.currentFiltered = null; - - } - - const filteredItem = this.filtered[ index ]; - - if ( filteredItem ) { - - const buttonDOM = this.domButtons.get( filteredItem.button ); - - buttonDOM.classList.add( 'active' ); - - this.currentFiltered = filteredItem; - - } - - this.updateFilter(); - - } - - get filteredIndex() { - - return this.currentFiltered ? this.filtered.indexOf( this.currentFiltered ) : null; - - } - - setTag( button, tags ) { - - this.tags.set( button, tags ); - - } - - filter( text ) { - - text = filterString( text ); - - const tags = this.tags; - const filtered = []; - - for ( const button of this.buttons ) { - - const buttonDOM = this.domButtons.get( button ); - - buttonDOM.remove(); - - const buttonTags = tags.has( button ) ? ' ' + tags.get( button ) : ''; - - const label = filterString( button.getValue() + buttonTags ); - - if ( text && label.includes( text ) === true ) { - - const score = text.length / label.length; - - filtered.push( { - button, - score - } ); - - } - - } - - filtered.sort( ( a, b ) => b.score - a.score ); - - this.filtered = filtered; - this.filteredIndex = this.forceAutoComplete ? 0 : null; - - } - - updateFilter() { - - const filteredIndex = Math.min( this.filteredIndex, this.filteredIndex - 3 ); - - for ( let i = 0; i < this.filtered.length; i ++ ) { - - const button = this.filtered[ i ].button; - const buttonDOM = this.domButtons.get( button ); - - buttonDOM.remove(); - - if ( i >= filteredIndex ) { - - this.listDOM.append( buttonDOM ); - - } - - } - - } - -} - -class LabelElement extends Element { - - static get type() { - - return 'LabelElement'; - - } - - constructor( label = '', align = '' ) { - - super(); - - this.labelDOM = document.createElement( 'f-label' ); - this.inputsDOM = document.createElement( 'f-inputs' ); - - const spanDOM = document.createElement( 'span' ); - - this.spanDOM = spanDOM; - this.iconDOM = null; - - this.labelDOM.append( spanDOM ); - - this.dom.append( this.labelDOM ); - this.dom.append( this.inputsDOM ); - - this.serializeLabel = false; - - this.setLabel( label ); - this.setAlign( align ); - - } - - setIcon( value ) { - - this.iconDOM = this.iconDOM || document.createElement( 'i' ); - this.iconDOM.className = value; - - if ( value ) this.labelDOM.prepend( this.iconDOM ); - else this.iconDOM.remove(); - - return this; - - } - - getIcon() { - - return this.iconDOM ? this.iconDOM.className : null; - - } - - setAlign( align ) { - - this.labelDOM.className = align; - - } - - setLabel( val ) { - - this.spanDOM.innerText = val; - - } - - getLabel() { - - return this.spanDOM.innerText; - - } - - serialize( data ) { - - super.serialize( data ); - - if ( this.serializeLabel ) { - - const label = this.getLabel(); - const icon = this.getIcon(); - - data.label = label; - - if ( icon !== '' ) { - - data.icon = icon; - - } - - } - - } - - deserialize( data ) { - - super.deserialize( data ); - - if ( this.serializeLabel ) { - - this.setLabel( data.label ); - - if ( data.icon !== undefined ) { - - this.setIcon( data.icon ); - - } - - } - - } - -} - -class ButtonInput extends Input { - - static get type() { - - return 'ButtonInput'; - - } - - constructor( innterText = '' ) { - - const dom = document.createElement( 'button' ); - - const spanDOM = document.createElement( 'span' ); - dom.append( spanDOM ); - - const iconDOM = document.createElement( 'i' ); - dom.append( iconDOM ); - - super( dom ); - - this.spanDOM = spanDOM; - this.iconDOM = iconDOM; - - spanDOM.innerText = innterText; - - dom.onmouseover = () => { - - this.dispatchEvent( new Event( 'mouseover' ) ); - - }; - - dom.onclick = dom.ontouchstart = - iconDOM.onclick = iconDOM.ontouchstart = ( e ) => { - - e.preventDefault(); - - e.stopPropagation(); - - this.dispatchEvent( new Event( 'click' ) ); - - }; - - } - - setIcon( className ) { - - this.iconDOM.className = className; - - return this; - - } - - getIcon() { - - return this.iconDOM.className; - - } - - setValue( val ) { - - this.spanDOM.innerText = val; - - return this; - - } - - getValue() { - - return this.spanDOM.innerText; - - } - -} - -class ColorInput extends Input { - - static get type() { - - return 'ColorInput'; - - } - - constructor( value = 0x0099ff ) { - - const dom = document.createElement( 'input' ); - super( dom ); - - dom.type = 'color'; - dom.value = numberToHex( value ); - - dom.oninput = () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - } - - setValue( value, dispatch = true ) { - - return super.setValue( numberToHex( value ), dispatch ); - - } - - getValue() { - - return parseInt( super.getValue().substr( 1 ), 16 ); - - } - -} - -class NumberInput extends Input { - - static get type() { - - return 'NumberInput'; - - } - - constructor( value = 0, min = - Infinity, max = Infinity, step = .01 ) { - - const dom = document.createElement( 'input' ); - super( dom ); - - this.min = min; - this.max = max; - this.step = step; - - this.integer = false; - - dom.type = 'text'; - dom.className = 'number'; - dom.value = this._getString( value ); - dom.spellcheck = false; - dom.autocomplete = 'off'; - - dom.ondragstart = dom.oncontextmenu = ( e ) => { - - e.preventDefault(); - - e.stopPropagation(); - - }; - - dom.onfocus = dom.onclick = () => { - - dom.select(); - - }; - - dom.onblur = () => { - - this.dom.value = this._getString( this.dom.value ); - - this.dispatchEvent( new Event( 'blur' ) ); - - }; - - dom.onchange = () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - dom.onkeydown = ( e ) => { - - if ( e.key.length === 1 && /\d|\.|\-/.test( e.key ) !== true ) { - - return false; - - } - - if ( e.key === 'Enter' ) { - - e.target.blur(); - - } - - e.stopPropagation(); - - }; - - draggableDOM( dom, ( data ) => { - - const { delta } = data; - - if ( dom.readOnly === true ) return; - - if ( data.value === undefined ) { - - data.value = this.getValue(); - - } - - const diff = delta.x - delta.y; - - const value = data.value + ( diff * this.step ); - - dom.value = this._getString( value.toFixed( this.precision ) ); - - this.dispatchEvent( new Event( 'change' ) ); - - } ); - - } - - setStep( step ) { - - this.step = step; - - return this; - - } - - setRange( min, max, step ) { - - this.min = min; - this.max = max; - this.step = step; - - this.dispatchEvent( new Event( 'range' ) ); - - return this.setValue( this.getValue() ); - - } - - setInterger( bool ) { - - this.integer = bool; - this.step = .1; - - return this.setValue( this.getValue() ); - - } - - get precision() { - - if ( this.integer === true ) return 0; - - const fract = this.step % 1; - - return fract !== 0 ? fract.toString().split( '.' )[ 1 ].length : 1; - - } - - setValue( val, dispatch = true ) { - - return super.setValue( this._getString( val ), dispatch ); - - } - - getValue() { - - return Number( this.dom.value ); - - } - - serialize( data ) { - - const { min, max } = this; - - if ( min !== - Infinity && max !== Infinity ) { - - data.min = this.min; - data.max = this.max; - data.step = this.step; - - } - - super.serialize( data ); - - } - - deserialize( data ) { - - if ( data.min !== undefined ) { - - const { min, max, step } = this; - - this.setRange( min, max, step ); - - } - - super.deserialize( data ); - - } - - _getString( value ) { - - const num = Math.min( Math.max( Number( value ), this.min ), this.max ); - - if ( this.integer === true ) { - - return Math.floor( num ); - - } else { - - return num + ( num % 1 ? '' : '.0' ); - - } - - } - -} - -class SelectInput extends Input { - - static get type() { - - return 'SelectInput'; - - } - - constructor( options = [], value = null ) { - - const dom = document.createElement( 'select' ); - super( dom ); - - dom.onchange = () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - dom.onmousedown = dom.ontouchstart = () => { - - this.dispatchEvent( new Event( 'click' ) ); - - }; - - this.setOptions( options, value ); - - } - - setOptions( options, value = null ) { - - const dom = this.dom; - const defaultValue = dom.value; - - let containsDefaultValue = false; - - this.options = options; - dom.innerHTML = ''; - - for ( let index = 0; index < options.length; index ++ ) { - - let opt = options[ index ]; - - if ( typeof opt === 'string' ) { - - opt = { name: opt, value: index }; - - } - - const option = document.createElement( 'option' ); - option.innerText = opt.name; - option.value = opt.value; - - if ( containsDefaultValue === false && defaultValue === opt.value ) { - - containsDefaultValue = true; - - } - - dom.append( option ); - - } - - dom.value = value !== null ? value : containsDefaultValue ? defaultValue : ''; - - return this; - - } - - getOptions() { - - return this._options; - - } - - serialize( data ) { - - data.options = [ ...this.options ]; - - super.serialize( data ); - - } - - deserialize( data ) { - - const currentOptions = this.options; - - if ( currentOptions.length === 0 ) { - - this.setOptions( data.options ); - - } - - super.deserialize( data ); - - } - -} - -const getStep = ( min, max ) => { - - const sensibility = .001; - - return ( max - min ) * sensibility; - -}; - -class SliderInput extends Input { - - static get type() { - - return 'SliderInput'; - - } - - constructor( value = 0, min = 0, max = 100 ) { - - const dom = document.createElement( 'f-subinputs' ); - super( dom ); - - value = Math.min( Math.max( value, min ), max ); - - const step = getStep( min, max ); - - const rangeDOM = document.createElement( 'input' ); - rangeDOM.type = 'range'; - rangeDOM.min = min; - rangeDOM.max = max; - rangeDOM.step = step; - rangeDOM.value = value; - - const field = new NumberInput( value, min, max, step ); - field.dom.className = 'range-value'; - field.onChange( () => { - - rangeDOM.value = field.getValue(); - - this.dispatchEvent( new Event( 'change' ) ); - - } ); - - field.addEventListener( 'range', () => { - - rangeDOM.min = field.min; - rangeDOM.max = field.max; - rangeDOM.step = field.step; - rangeDOM.value = field.getValue(); - - } ); - - dom.append( rangeDOM ); - dom.append( field.dom ); - - this.rangeDOM = rangeDOM; - this.field = field; - - const updateRangeValue = () => { - - let value = Number( rangeDOM.value ); - - if ( value !== this.max && value + this.step >= this.max ) { - - // fix not end range fraction - - rangeDOM.value = value = this.max; - - } - - this.field.setValue( value ); - - }; - - draggableDOM( rangeDOM, () => { - - updateRangeValue(); - - this.dispatchEvent( new Event( 'change' ) ); - - }, { className: '' } ); - - } - - get min() { - - return this.field.min; - - } - - get max() { - - return this.field.max; - - } - - get step() { - - return this.field.step; - - } - - setRange( min, max ) { - - this.field.setRange( min, max, getStep( min, max ) ); - - this.dispatchEvent( new Event( 'range' ) ); - this.dispatchEvent( new Event( 'change' ) ); - - return this; - - } - - setValue( val, dispatch = true ) { - - this.field.setValue( val ); - this.rangeDOM.value = val; - - if ( dispatch ) this.dispatchEvent( new Event( 'change' ) ); - - return this; - - } - - getValue() { - - return this.field.getValue(); - - } - - serialize( data ) { - - data.min = this.min; - data.max = this.max; - - super.serialize( data ); - - } - - deserialize( data ) { - - const { min, max } = data; - - this.setRange( min, max ); - - super.deserialize( data ); - - } - -} - -class StringInput extends Input { - - static get type() { - - return 'StringInput'; - - } - - constructor( value = '' ) { - - const dom = document.createElement( 'f-string' ); - super( dom ); - - const inputDOM = document.createElement( 'input' ); - - dom.append( inputDOM ); - - inputDOM.type = 'text'; - inputDOM.value = value; - inputDOM.spellcheck = false; - inputDOM.autocomplete = 'off'; - - this._buttonsDOM = null; - this._datalistDOM = null; - - this.iconDOM = null; - this.inputDOM = inputDOM; - - this.buttons = []; - - inputDOM.onblur = () => { - - this.dispatchEvent( new Event( 'blur' ) ); - - }; - - inputDOM.onchange = () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - let keyDownStr = ''; - - inputDOM.onkeydown = () => keyDownStr = inputDOM.value; - - inputDOM.onkeyup = ( e ) => { - - if ( e.key === 'Enter' ) { - - e.target.blur(); - - } - - e.stopPropagation(); - - if ( keyDownStr !== inputDOM.value ) { - - this.dispatchEvent( new Event( 'change' ) ); - - } - - }; - - } - - setPlaceHolder( text ) { - - this.inputDOM.placeholder = text; - - return this; - - } - - setIcon( value ) { - - this.iconDOM = this.iconDOM || document.createElement( 'i' ); - this.iconDOM.setAttribute( 'type', 'icon' ); - this.iconDOM.className = value; - - if ( value ) this.dom.prepend( this.iconDOM ); - else this.iconDOM.remove(); - - return this; - - } - - getIcon() { - - return this.iconInput ? this.iconInput.getIcon() : ''; - - } - - addButton( button ) { - - this.buttonsDOM.prepend( button.iconDOM ); - - this.buttons.push( button ); - - return this; - - } - - addOption( value ) { - - const option = document.createElement( 'option' ); - option.value = value; - - this.datalistDOM.append( option ); - - return this; - - } - - clearOptions() { - - this.datalistDOM.remove(); - - } - - get datalistDOM() { - - let dom = this._datalistDOM; - - if ( dom === null ) { - - const datalistId = 'input-dt-' + this.id; - - dom = document.createElement( 'datalist' ); - dom.id = datalistId; - - this._datalistDOM = dom; - - this.inputDOM.autocomplete = 'on'; - this.inputDOM.setAttribute( 'list', datalistId ); - - this.dom.prepend( dom ); - - } - - return dom; - - } - - get buttonsDOM() { - - let dom = this._buttonsDOM; - - if ( dom === null ) { - - dom = document.createElement( 'f-buttons' ); - - this._buttonsDOM = dom; - - this.dom.prepend( dom ); - - } - - return dom; - - } - - getInput() { - - return this.inputDOM; - - } - -} - -class TextInput extends Input { - - static get type() { - - return 'TextInput'; - - } - - constructor( innerText = '' ) { - - const dom = document.createElement( 'textarea' ); - super( dom ); - - dom.innerText = innerText; - - dom.classList.add( 'f-scroll' ); - - dom.onblur = () => { - - this.dispatchEvent( new Event( 'blur' ) ); - - }; - - dom.onchange = () => { - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - dom.onkeyup = ( e ) => { - - if ( e.key === 'Enter' ) { - - e.target.blur(); - - } - - e.stopPropagation(); - - this.dispatchEvent( new Event( 'change' ) ); - - }; - - } - -} - -class ToggleInput extends Input { - - static get type() { - - return 'ToggleInput'; - - } - - constructor( value = false ) { - - const dom = document.createElement( 'input' ); - super( dom ); - - dom.type = 'checkbox'; - dom.className = 'toggle'; - dom.checked = value; - - dom.onclick = () => this.dispatchEvent( new Event( 'click' ) ); - dom.onchange = () => this.dispatchEvent( new Event( 'change' ) ); - - } - - setValue( val ) { - - this.dom.checked = val; - - this.dispatchEvent( new Event( 'change' ) ); - - return this; - - } - - getValue() { - - return this.dom.checked; - - } - -} - -class TreeViewNode { - - constructor( name = '' ) { - - const dom = document.createElement( 'f-treeview-node' ); - const labelDOM = document.createElement( 'f-treeview-label' ); - const inputDOM = document.createElement( 'input' ); - - const labelSpam = document.createElement( 'spam' ); - labelDOM.append( labelSpam ); - - labelSpam.innerText = name; - - inputDOM.type = 'checkbox'; - - dom.append( inputDOM ); - dom.append( labelDOM ); - - this.dom = dom; - this.childrenDOM = null; - this.labelSpam = labelSpam; - this.labelDOM = labelDOM; - this.inputDOM = inputDOM; - this.iconDOM = null; - - this.parent = null; - this.children = []; - - this.selected = false; - - this.events = { - 'change': [], - 'click': [] - }; - - dom.addEventListener( 'click', ( ) => { - - dispatchEventList( this.events.click, this ); - - } ); - - } - - setLabel( value ) { - - this.labelSpam.innerText = value; - - return this; - - } - - getLabel() { - - return this.labelSpam.innerText; - - } - - add( node ) { - - let childrenDOM = this.childrenDOM; - - if ( this.childrenDOM === null ) { - - const dom = this.dom; - - const arrowDOM = document.createElement( 'f-arrow' ); - childrenDOM = document.createElement( 'f-treeview-children' ); - - dom.append( arrowDOM ); - dom.append( childrenDOM ); - - this.childrenDOM = childrenDOM; - - } - - this.children.push( node ); - childrenDOM.append( node.dom ); - - node.parent = this; - - return this; - - } - - setOpened( value ) { - - this.inputDOM.checked = value; - - return this; - - } - - getOpened() { - - return this.inputDOM.checkbox; - - } - - setIcon( value ) { - - this.iconDOM = this.iconDOM || document.createElement( 'i' ); - this.iconDOM.className = value; - - if ( value ) this.labelDOM.prepend( this.iconDOM ); - else this.iconDOM.remove(); - - return this; - - } - - getIcon() { - - return this.iconDOM ? this.iconDOM.className : null; - - } - - setVisible( value ) { - - this.dom.style.display = value ? '' : 'none'; - - return this; - - } - - setSelected( value ) { - - if ( this.selected === value ) return this; - - if ( value ) this.dom.classList.add( 'selected' ); - else this.dom.classList.remove( 'selected' ); - - this.selected = value; - - return this; - - } - - onClick( callback ) { - - this.events.click.push( callback ); - - return this; - - } - -} - -class TreeViewInput extends Input { - - static get type() { - - return 'TreeViewInput'; - - } - - constructor( options = [] ) { - - const dom = document.createElement( 'f-treeview' ); - super( dom ); - - const childrenDOM = document.createElement( 'f-treeview-children' ); - dom.append( childrenDOM ); - - dom.setAttribute( 'type', 'tree' ); - - this.childrenDOM = childrenDOM; - - this.children = []; - - } - - add( node ) { - - this.children.push( node ); - this.childrenDOM.append( node.dom ); - - return this; - - } - - serialize( data ) { - - //data.options = [ ...this.options ]; - - super.serialize( data ); - - } - - deserialize( data ) { - - /*const currentOptions = this.options; - - if ( currentOptions.length === 0 ) { - - this.setOptions( data.options ); - - }*/ - - super.deserialize( data ); - - } - -} - -var Flow = /*#__PURE__*/Object.freeze({ - __proto__: null, - Element: Element, - Input: Input, - Node: Node, - Canvas: Canvas, - Serializer: Serializer, - Menu: Menu, - ContextMenu: ContextMenu, - CircleMenu: CircleMenu, - Tips: Tips, - Search: Search, - DraggableElement: DraggableElement, - LabelElement: LabelElement, - TitleElement: TitleElement, - ButtonInput: ButtonInput, - ColorInput: ColorInput, - NumberInput: NumberInput, - SelectInput: SelectInput, - SliderInput: SliderInput, - StringInput: StringInput, - TextInput: TextInput, - ToggleInput: ToggleInput, - TreeViewInput: TreeViewInput, - TreeViewNode: TreeViewNode -}); - -const LoaderLib = {}; - -class Loader extends EventTarget { - - static get type() { - - return 'Loader'; - - } - - constructor( parseType = Loader.DEFAULT ) { - - super(); - - this.parseType = parseType; - - this.events = { - 'load': [] - }; - - } - - setParseType( type ) { - - this.parseType = type; - - return this; - - } - - getParseType() { - - return this.parseType; - - } - - onLoad( callback ) { - - this.events.load.push( callback ); - - return this; - - } - - async load( url, lib = {} ) { - - return await fetch( url ) - .then( response => response.json() ) - .then( result => { - - this.data = this.parse( result, lib ); - - dispatchEventList( this.events.load, this ); - - return this.data; - - } ) - .catch( err => { - - console.error( 'Loader:', err ); - - } ); - - } - - parse( json, lib = {} ) { - - json = this._parseObjects( json, lib ); - - const parseType = this.parseType; - - if ( parseType === Loader.DEFAULT ) { - - const type = json.type; - - const flowClass = lib[ type ] ? lib[ type ] : ( LoaderLib[ type ] || Flow[ type ] ); - const flowObj = new flowClass(); - - if ( flowObj.getSerializable() ) { - - flowObj.deserialize( json ); - - } - - return flowObj; - - } else if ( parseType === Loader.OBJECTS ) { - - return json; - - } - - } - - _parseObjects( json, lib = {} ) { - - json = { ...json }; - - const objects = {}; - - for ( const id in json.objects ) { - - const obj = json.objects[ id ]; - obj.objects = objects; - - const type = obj.type; - const flowClass = lib[ type ] ? lib[ type ] : ( LoaderLib[ type ] || Flow[ type ] ); - - if ( ! flowClass ) { - - console.error( `Class "${ type }" not found!` ); - - } - - objects[ id ] = new flowClass(); - objects[ id ].deserializeLib( json.objects[ id ], lib ); - - } - - const ref = new Map(); - - const deserializePass = ( prop = null ) => { - - for ( const id in json.objects ) { - - const newObject = objects[ id ]; - - if ( ref.has( newObject ) === false && ( prop === null || newObject[ prop ] === true ) ) { - - ref.set( newObject, true ); - - if ( newObject.getSerializable() ) { - - newObject.deserialize( json.objects[ id ] ); - - } - - } - - } - - }; - - deserializePass( 'isNode' ); - deserializePass( 'isElement' ); - deserializePass( 'isInput' ); - deserializePass(); - - json.objects = objects; - - return json; - - } - -} - -Loader.DEFAULT = 'default'; -Loader.OBJECTS = 'objects'; - -export { ButtonInput, Canvas, CircleMenu, ColorInput, ContextMenu, DraggableElement, Element, Input, LabelElement, Loader, LoaderLib, Menu, Node, NumberInput, REVISION, Search, SelectInput, Serializer, SliderInput, StringInput, TextInput, Tips, TitleElement, ToggleInput, TreeViewInput, TreeViewNode, Utils };