2022跨年烟花代码(二)HTML5点击泡沫横飞烟花特效

HTML5点击泡沫横飞烟花特效

在这里插入图片描述
html代码:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>HTML5 Canvas点击泡沫横飞特效</title>

<style>
body {
  background: #3E4777;
  overflow: hidden;
  margin: 0;
}

.instructions {
  position: absolute;
  top: 20px;
  right: 20px;
  letter-spacing: 0.2em;
  font-size: 18px;
  color: white;
}
</style>
</head>
<body>

<script type="text/javascript" src="js/three.min.js"></script>
<script type="text/javascript" src="js/Stats.min.js"></script>

<canvas id="canvas"></canvas>

<div id="stats"></div>

<div class="instructions">点击页面</div>

<script type="text/javascript">
(function() {
  var Particles,
    bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };

  Particles = (function() {
    function Particles() {
      this.render = bind(this.render, this);
      this.rotateRadians = bind(this.rotateRadians, this);
      this.random = bind(this.random, this);
      this.mouseMove = bind(this.mouseMove, this);
      this.mouseDown = bind(this.mouseDown, this);
      this.resize = bind(this.resize, this);
      this.animate = bind(this.animate, this);
      this.setStage = bind(this.setStage, this);
      this.setLighting = bind(this.setLighting, this);
      this.getTexture = bind(this.getTexture, this);
      this.addStars = bind(this.addStars, this);
      this.setActors = bind(this.setActors, this);
      this.getPastelColor = bind(this.getPastelColor, this);
      this.canvasMouse = {
        x: 0,
        y: 0,
        z: 0,
        px: 0,
        py: 0,
        py: 0,
        vx: 0,
        vy: 0,
        pressed: false
      };
      this.colors = ['#da6b00', '#8555d4', '#4ad3b5', '#ffffff'];
      this.particleCount = 500;
      this.initialRadius = 0.1;
      this.movementSpeed = 2;
      this.directions = [];
      this.starSystems = [];
      this.systemCount = 1;
      this.setStage();
      this.setLighting();
      this.setActors();
      setInterval((function(_this) {
        return function() {
          _this.systemCount++;
          return _this.addStars(_this.getPastelColor(), 0, 0);
        };
      })(this), 5000);
      this.animate();
      this.render();
    }

    Particles.prototype.getPastelColor = function() {
      this.col = new THREE.Color("hsl(" + (this.random(0, 360)) + ", " + (Math.floor(25 + 70 * Math.random())) + "%, " + (Math.floor(85 + 10 * Math.random())) + "%)");
      return "#" + (this.col.getHexString());
    };

    Particles.prototype.setActors = function() {
      return this.addStars(this.getPastelColor(), 0, 0);
    };

    Particles.prototype.addStars = function(color, x, y) {
      var angle, i, k, radiusSQ, ref, vertex;
      this.dirs = [];
      this.geometry = new THREE.Geometry();
      this.materials = new THREE.PointsMaterial({
        color: color,
        size: 1,
        transparent: true,
        blending: THREE.AdditiveBlending,
        map: this.getTexture(color),
        depthTest: false
      });
      for (i = k = 0, ref = this.particleCount; 0 <= ref ? k < ref : k > ref; i = 0 <= ref ? ++k : --k) {
        angle = Math.random() * 2 * Math.PI;
        radiusSQ = Math.random() * this.initialRadius * this.initialRadius;
        vertex = new THREE.Vector3();
        vertex.x = x;
        vertex.y = y;
        vertex.z = 0;
        this.dirs.push({
          x: (Math.random() * this.movementSpeed) - (this.movementSpeed / 2),
          y: (Math.random() * this.movementSpeed) - (this.movementSpeed / 2),
          z: (Math.random() * this.movementSpeed) - (this.movementSpeed / 2)
        });
        this.geometry.vertices.push(vertex);
      }
      this.starSystem = new THREE.Points(this.geometry, this.materials);
      this.starSystem.sortParticles = true;
      this.directions.push(this.dirs);
      this.starSystems.push(this.starSystem);
      return this.scene.add(this.starSystem);
    };

    Particles.prototype.getTexture = function(color) {
      var canvas, context, gradient, texture;
      canvas = document.createElement('canvas');
      canvas.width = 32;
      canvas.height = 32;
      context = canvas.getContext('2d');
      gradient = context.createRadialGradient(canvas.width / 2, canvas.height / 2, 0, canvas.width / 2, canvas.height / 2, canvas.width / 2);
      gradient.addColorStop(0, 'rgba(255,255,255,1)');
      gradient.addColorStop(0.2, color);
      gradient.addColorStop(0.4, color);
      gradient.addColorStop(1, 'rgba(0,0,0,1)');
      context.fillStyle = gradient;
      context.fillRect(0, 0, canvas.width, canvas.height);
      texture = new THREE.Texture(canvas);
      texture.needsUpdate = true;
      return texture;
    };

    Particles.prototype.setLighting = function() {
      this.ambientLight = new THREE.AmbientLight("#ffffff", 0.5);
      return this.scene.add(this.ambientLight);
    };

    Particles.prototype.setStage = function() {
      this.renderer = new THREE.WebGLRenderer({
        canvas: document.getElementById("canvas"),
        antialias: true
      });
      this.renderer.setPixelRatio(window.devicePixelRatio);
      this.renderer.autoClear = false;
      this.renderer.setSize(window.innerWidth, window.innerHeight);
      this.scene = new THREE.Scene();
      this.camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
      this.camera.position.z = 50;
      this.stats = new Stats();
      this.stats.setMode(0);
      this.stats.domElement.style.position = 'absolute';
      this.stats.domElement.style.left = '0px';
      this.stats.domElement.style.top = '0px';
      document.getElementById("stats").appendChild(this.stats.domElement);
      window.addEventListener('resize', this.resize, false);
      window.addEventListener('mousemove', this.mouseMove, false);
      return window.addEventListener("mousedown", this.mouseDown);
    };

    Particles.prototype.animate = function() {
      var i, j, k, l, particle, ref, ref1;
      for (j = k = 0, ref = this.systemCount - 1; 0 <= ref ? k <= ref : k >= ref; j = 0 <= ref ? ++k : --k) {
        for (i = l = 0, ref1 = this.particleCount; 0 <= ref1 ? l < ref1 : l > ref1; i = 0 <= ref1 ? ++l : --l) {
          particle = this.starSystems[j].geometry.vertices[i];
          particle.x += this.directions[j][i].x;
          particle.y += this.directions[j][i].y;
          particle.z += this.directions[j][i].z;
        }
        this.starSystems[j].geometry.verticesNeedUpdate = true;
      }
      this.stats.update();
      this.render();
      return requestAnimationFrame(this.animate);
    };

    Particles.prototype.resize = function() {
      this.camera.aspect = window.innerWidth / window.innerHeight;
      this.camera.updateProjectionMatrix();
      this.renderer.setSize(window.innerWidth, window.innerHeight);
      return this.render();
    };

    Particles.prototype.mouseDown = function() {
      this.systemCount++;
      return this.addStars(this.getPastelColor(), this.canvasMouse.x, this.canvasMouse.y);
    };

    Particles.prototype.mouseMove = function() {
      this.canvasMouse.px = this.canvasMouse.x;
      this.canvasMouse.py = this.canvasMouse.y;
      this.canvasX = (event.clientX / window.innerWidth) * 2 - 1;
      this.canvasY = -(event.clientY / window.innerHeight) * 2 + 1;
      this.vector = new THREE.Vector3(this.canvasX || 0, this.canvasY || 0, 0);
      this.vector.unproject(this.camera);
      this.dir = this.vector.sub(this.camera.position).normalize();
      this.distance = -this.camera.position.z / this.dir.z;
      return this.canvasMouse = this.camera.position.clone().add(this.dir.multiplyScalar(this.distance));
    };

    Particles.prototype.random = function(min, max) {
      return Math.floor(Math.random() * max) + min;
    };

    Particles.prototype.rotateRadians = function(deg) {
      return deg * (Math.PI / 180);
    };

    Particles.prototype.render = function() {
      return this.renderer.render(this.scene, this.camera);
    };

    return Particles;

  })();

  new Particles;

}).call(this);
</script>

<div style="text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';">
<p>适用浏览器:360、FireFox、Chrome、Opera、傲游、搜狗、世界之窗. 不支持Safari、IE8及以下浏览器。</p>
</div>
</body>
</html>

Stats.min.js代码:

var Stats = function() {
	var e = Date.now(),
	t = e,
	n = 0,
	i = 1 / 0,
	a = 0,
	d = 0,
	l = 1 / 0,
	o = 0,
	s = 0,
	r = 0,
	c = document.createElement("div");
	c.id = "stats",
	c.addEventListener("mousedown",
	function(e) {
		e.preventDefault(),
		g(++r % 2)
	},
	!1),
	c.style.cssText = "width:80px;opacity:0.9;cursor:pointer";
	var p = document.createElement("div");
	p.id = "fps",
	p.style.cssText = "padding:0 0 3px 3px;text-align:left;background-color:#002",
	c.appendChild(p);
	var h = document.createElement("div");
	h.id = "fpsText",
	h.style.cssText = "color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",
	h.innerHTML = "FPS",
	p.appendChild(h);
	var f = document.createElement("div");
	for (f.id = "fpsGraph", f.style.cssText = "position:relative;width:74px;height:30px;background-color:#0ff", p.appendChild(f); f.children.length < 74;) {
		var x = document.createElement("span");
		x.style.cssText = "width:1px;height:30px;float:left;background-color:#113",
		f.appendChild(x)
	}
	var m = document.createElement("div");
	m.id = "ms",
	m.style.cssText = "padding:0 0 3px 3px;text-align:left;background-color:#020;display:none",
	c.appendChild(m);
	var u = document.createElement("div");
	u.id = "msText",
	u.style.cssText = "color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px",
	u.innerHTML = "MS",
	m.appendChild(u);
	var v = document.createElement("div");
	for (v.id = "msGraph", v.style.cssText = "position:relative;width:74px;height:30px;background-color:#0f0", m.appendChild(v); v.children.length < 74;) {
		var x = document.createElement("span");
		x.style.cssText = "width:1px;height:30px;float:left;background-color:#131",
		v.appendChild(x)
	}
	var g = function(e) {
		switch (r = e) {
		case 0:
			p.style.display = "block",
			m.style.display = "none";
			break;
		case 1:
			p.style.display = "none",
			m.style.display = "block"
		}
	},
	y = function(e, t) {
		var n = e.appendChild(e.firstChild);
		n.style.height = t + "px"
	};
	return {
		REVISION: 11,
		domElement: c,
		setMode: g,
		begin: function() {
			e = Date.now()
		},
		end: function() {
			var r = Date.now();
			return n = r - e,
			i = Math.min(i, n),
			a = Math.max(a, n),
			u.textContent = n + " MS (" + i + "-" + a + ")",
			y(v, Math.min(30, 30 - n / 200 * 30)),
			s++,
			r > t + 1e3 && (d = Math.round(1e3 * s / (r - t)), l = Math.min(l, d), o = Math.max(o, d), h.textContent = d + " FPS (" + l + "-" + o + ")", y(f, Math.min(30, 30 - d / 100 * 30)), t = r, s = 0),
			r
		},
		update: function() {
			e = this.end()
		}
	}
};

three.min.js代码:

// threejs.org/license
(function(l, pa) {
	"object" === typeof exports && "undefined" !== typeof module ? pa(exports) : "function" === typeof define && define.amd ? define(["exports"], pa) : pa(l.THREE = l.THREE || {})
})(this,
function(l) {
	function pa() {}
	function D(a, b) {
		this.x = a || 0;
		this.y = b || 0
	}
	function ea(a, b, c, d, e, f, g, h, m, k) {
		Object.defineProperty(this, "id", {
			value: Ze++
		});
		this.uuid = N.generateUUID();
		this.name = "";
		this.image = void 0 !== a ? a: ea.DEFAULT_IMAGE;
		this.mipmaps = [];
		this.mapping = void 0 !== b ? b: ea.DEFAULT_MAPPING;
		this.wrapS = void 0 !== c ? c: 1001;
		this.wrapT = void 0 !== d ? d: 1001;
		this.magFilter = void 0 !== e ? e: 1006;
		this.minFilter = void 0 !== f ? f: 1008;
		this.anisotropy = void 0 !== m ? m: 1;
		this.format = void 0 !== g ? g: 1023;
		this.type = void 0 !== h ? h: 1009;
		this.offset = new D(0, 0);
		this.repeat = new D(1, 1);
		this.generateMipmaps = !0;
		this.premultiplyAlpha = !1;
		this.flipY = !0;
		this.unpackAlignment = 4;
		this.encoding = void 0 !== k ? k: 3E3;
		this.version = 0;
		this.onUpdate = null
	}
	function fa(a, b, c, d) {
		this.x = a || 0;
		this.y = b || 0;
		this.z = c || 0;
		this.w = void 0 !== d ? d: 1
	}
	function Ya(a, b, c) {
		this.uuid = N.generateUUID();
		this.width = a;
		this.height = b;
		this.scissor = new fa(0, 0, a, b);
		this.scissorTest = !1;
		this.viewport = new fa(0, 0, a, b);
		c = c || {};
		void 0 === c.minFilter && (c.minFilter = 1006);
		this.texture = new ea(void 0, void 0, c.wrapS, c.wrapT, c.magFilter, c.minFilter, c.format, c.type, c.anisotropy, c.encoding);
		this.depthBuffer = void 0 !== c.depthBuffer ? c.depthBuffer: !0;
		this.stencilBuffer = void 0 !== c.stencilBuffer ? c.stencilBuffer: !0;
		this.depthTexture = void 0 !== c.depthTexture ? c.depthTexture: null
	}
	function Gb(a, b, c) {
		Ya.call(this, a, b, c);
		this.activeMipMapLevel = this.activeCubeFace = 0
	}
	function ca(a, b, c, d) {
		this._x = a || 0;
		this._y = b || 0;
		this._z = c || 0;
		this._w = void 0 !== d ? d: 1
	}
	function q(a, b, c) {
		this.x = a || 0;
		this.y = b || 0;
		this.z = c || 0
	}
	function S() {
		this.elements = new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
		0 < arguments.length && console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")
	}
	function Za(a, b, c, d, e, f, g, h, m, k) {
		a = void 0 !== a ? a: [];
		ea.call(this, a, void 0 !== b ? b: 301, c, d, e, f, g, h, m, k);
		this.flipY = !1
	}
	function Hb(a, b, c) {
		var d = a[0];
		if (0 >= d || 0 < d) return a;
		var e = b * c,
		f = Be[e];
		void 0 === f && (f = new Float32Array(e), Be[e] = f);
		if (0 !== b) for (d.toArray(f, 0), d = 1, e = 0; d !== b; ++d) e += c,
		a[d].toArray(f, e);
		return f
	}
	function Ce(a, b) {
		var c = De[b];
		void 0 === c && (c = new Int32Array(b), De[b] = c);
		for (var d = 0; d !== b; ++d) c[d] = a.allocTextureUnit();
		return c
	}
	function $e(a, b) {
		a.uniform1f(this.addr, b)
	}
	function af(a, b) {
		a.uniform1i(this.addr, b)
	}
	function bf(a, b) {
		void 0 === b.x ? a.uniform2fv(this.addr, b) : a.uniform2f(this.addr, b.x, b.y)
	}
	function cf(a, b) {
		void 0 !== b.x ? a.uniform3f(this.addr, b.x, b.y, b.z) : void 0 !== b.r ? a.uniform3f(this.addr, b.r, b.g, b.b) : a.uniform3fv(this.addr, b)
	}
	function df(a, b) {
		void 0 === b.x ? a.uniform4fv(this.addr, b) : a.uniform4f(this.addr, b.x, b.y, b.z, b.w)
	}
	function ef(a, b) {
		a.uniformMatrix2fv(this.addr, !1, b.elements || b)
	}
	function ff(a, b) {
		a.uniformMatrix3fv(this.addr, !1, b.elements || b)
	}
	function gf(a, b) {
		a.uniformMatrix4fv(this.addr, !1, b.elements || b)
	}
	function hf(a, b, c) {
		var d = c.allocTextureUnit();
		a.uniform1i(this.addr, d);
		c.setTexture2D(b || Ee, d)
	}
	function jf(a, b, c) {
		var d = c.allocTextureUnit();
		a.uniform1i(this.addr, d);
		c.setTextureCube(b || Fe, d)
	}
	function Ge(a, b) {
		a.uniform2iv(this.addr, b)
	}
	function He(a, b) {
		a.uniform3iv(this.addr, b)
	}
	function Ie(a, b) {
		a.uniform4iv(this.addr, b)
	}
	function kf(a) {
		switch (a) {
		case 5126:
			return $e;
		case 35664:
			return bf;
		case 35665:
			return cf;
		case 35666:
			return df;
		case 35674:
			return ef;
		case 35675:
			return ff;
		case 35676:
			return gf;
		case 35678:
			return hf;
		case 35680:
			return jf;
		case 5124:
		case 35670:
			return af;
		case 35667:
		case 35671:
			return Ge;
		case 35668:
		case 35672:
			return He;
		case 35669:
		case 35673:
			return Ie
		}
	}
	function lf(a, b) {
		a.uniform1fv(this.addr, b)
	}
	function mf(a, b) {
		a.uniform1iv(this.addr, b)
	}
	function nf(a, b) {
		a.uniform2fv(this.addr, Hb(b, this.size, 2))
	}
	function of(a, b) {
		a.uniform3fv(this.addr, Hb(b, this.size, 3))
	}
	function pf(a, b) {
		a.uniform4fv(this.addr, Hb(b, this.size, 4))
	}
	function qf(a, b) {
		a.uniformMatrix2fv(this.addr, !1, Hb(b, this.size, 4))
	}
	function rf(a, b) {
		a.uniformMatrix3fv(this.addr, !1, Hb(b, this.size, 9))
	}
	function sf(a, b) {
		a.uniformMatrix4fv(this.addr, !1, Hb(b, this.size, 16))
	}
	function tf(a, b, c) {
		var d = b.length,
		e = Ce(c, d);
		a.uniform1iv(this.addr, e);
		for (a = 0; a !== d; ++a) c.setTexture2D(b[a] || Ee, e[a])
	}
	function uf(a, b, c) {
		var d = b.length,
		e = Ce(c, d);
		a.uniform1iv(this.addr, e);
		for (a = 0; a !== d; ++a) c.setTextureCube(b[a] || Fe, e[a])
	}
	function vf(a) {
		switch (a) {
		case 5126:
			return lf;
		case 35664:
			return nf;
		case 35665:
			return of;
		case 35666:
			return pf;
		case 35674:
			return qf;
		case 35675:
			return rf;
		case 35676:
			return sf;
		case 35678:
			return tf;
		case 35680:
			return uf;
		case 5124:
		case 35670:
			return mf;
		case 35667:
		case 35671:
			return Ge;
		case 35668:
		case 35672:
			return He;
		case 35669:
		case 35673:
			return Ie
		}
	}
	function wf(a, b, c) {
		this.id = a;
		this.addr = c;
		this.setValue = kf(b.type)
	}
	function xf(a, b, c) {
		this.id = a;
		this.addr = c;
		this.size = b.size;
		this.setValue = vf(b.type)
	}
	function Je(a) {
		this.id = a;
		this.seq = [];
		this.map = {}
	}
	function $a(a, b, c) {
		this.seq = [];
		this.map = {};
		this.renderer = c;
		c = a.getProgramParameter(b, a.ACTIVE_UNIFORMS);
		for (var d = 0; d < c; ++d) {
			var e = a.getActiveUniform(b, d),
			f = a.getUniformLocation(b, e.name),
			g = this,
			h = e.name,
			m = h.length;
			for (Rd.lastIndex = 0;;) {
				var k = Rd.exec(h),
				t = Rd.lastIndex,
				p = k[1],
				n = k[3];
				"]" === k[2] && (p |= 0);
				if (void 0 === n || "[" === n && t + 2 === m) {
					h = g;
					e = void 0 === n ? new wf(p, e, f) : new xf(p, e, f);
					h.seq.push(e);
					h.map[e.id] = e;
					break
				} else n = g.map[p],
				void 0 === n && (n = new Je(p), p = g, g = n, p.seq.push(g), p.map[g.id] = g),
				g = n
			}
		}
	}
	function J(a, b, c) {
		return void 0 === b && void 0 === c ? this.set(a) : this.setRGB(a, b, c)
	}
	function eb(a, b, c, d, e, f, g, h, m, k, t, p) {
		ea.call(this, null, f, g, h, m, k, d, e, t, p);
		this.image = {
			data: a,
			width: b,
			height: c
		};
		this.magFilter = void 0 !== m ? m: 1003;
		this.minFilter = void 0 !== k ? k: 1003;
		this.flipY = this.generateMipmaps = !1;
		this.unpackAlignment = 1
	}
	function sc(a, b) {
		this.min = void 0 !== a ? a: new D(Infinity, Infinity);
		this.max = void 0 !== b ? b: new D( - Infinity, -Infinity)
	}
	function yf(a, b) {
		var c, d, e, f, g, h, m, k, t, p, n = a.context,
		u = a.state,
		l, r, A, w, y, K;
		this.render = function(v, E, L) {
			if (0 !== b.length) {
				v = new q;
				var C = L.w / L.z,
				F = .5 * L.z,
				da = .5 * L.w,
				H = 16 / L.w,
				aa = new D(H * C, H),
				Da = new q(1, 1, 0),
				fb = new D(1, 1),
				Sd = new sc;
				Sd.min.set(L.x, L.y);
				Sd.max.set(L.x + (L.z - 16), L.y + (L.w - 16));
				if (void 0 === w) {
					var H = new Float32Array([ - 1, -1, 0, 0, 1, -1, 1, 0, 1, 1, 1, 1, -1, 1, 0, 1]),
					Q = new Uint16Array([0, 1, 2, 0, 2, 3]);
					l = n.createBuffer();
					r = n.createBuffer();
					n.bindBuffer(n.ARRAY_BUFFER, l);
					n.bufferData(n.ARRAY_BUFFER, H, n.STATIC_DRAW);
					n.bindBuffer(n.ELEMENT_ARRAY_BUFFER, r);
					n.bufferData(n.ELEMENT_ARRAY_BUFFER, Q, n.STATIC_DRAW);
					y = n.createTexture();
					K = n.createTexture();
					u.bindTexture(n.TEXTURE_2D, y);
					n.texImage2D(n.TEXTURE_2D, 0, n.RGB, 16, 16, 0, n.RGB, n.UNSIGNED_BYTE, null);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, n.CLAMP_TO_EDGE);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, n.CLAMP_TO_EDGE);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, n.NEAREST);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, n.NEAREST);
					u.bindTexture(n.TEXTURE_2D, K);
					n.texImage2D(n.TEXTURE_2D, 0, n.RGBA, 16, 16, 0, n.RGBA, n.UNSIGNED_BYTE, null);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_S, n.CLAMP_TO_EDGE);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_WRAP_T, n.CLAMP_TO_EDGE);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MAG_FILTER, n.NEAREST);
					n.texParameteri(n.TEXTURE_2D, n.TEXTURE_MIN_FILTER, n.NEAREST);
					var H = A = {
						vertexShader: "uniform lowp int renderType;\nuniform vec3 screenPosition;\nuniform vec2 scale;\nuniform float rotation;\nuniform sampler2D occlusionMap;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nvUV = uv;\nvec2 pos = position;\nif ( renderType == 2 ) {\nvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\nvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\nvVisibility =        visibility.r / 9.0;\nvVisibility *= 1.0 - visibility.g / 9.0;\nvVisibility *=       visibility.b / 9.0;\nvVisibility *= 1.0 - visibility.a / 9.0;\npos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\npos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\n}\ngl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n}",
						fragmentShader: "uniform lowp int renderType;\nuniform sampler2D map;\nuniform float opacity;\nuniform vec3 color;\nvarying vec2 vUV;\nvarying float vVisibility;\nvoid main() {\nif ( renderType == 0 ) {\ngl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\n} else if ( renderType == 1 ) {\ngl_FragColor = texture2D( map, vUV );\n} else {\nvec4 texture = texture2D( map, vUV );\ntexture.a *= opacity * vVisibility;\ngl_FragColor = texture;\ngl_FragColor.rgb *= color;\n}\n}"
					},
					Q = n.createProgram(),
					M = n.createShader(n.FRAGMENT_SHADER),
					O = n.createShader(n.VERTEX_SHADER),
					P = "precision " + a.getPrecision() + " float;\n";
					n.shaderSource(M, P + H.fragmentShader);
					n.shaderSource(O, P + H.vertexShader);
					n.compileShader(M);
					n.compileShader(O);
					n.attachShader(Q, M);
					n.attachShader(Q, O);
					n.linkProgram(Q);
					w = Q;
					t = n.getAttribLocation(w, "position");
					p = n.getAttribLocation(w, "uv");
					c = n.getUniformLocation(w, "renderType");
					d = n.getUniformLocation(w, "map");
					e = n.getUniformLocation(w, "occlusionMap");
					f = n.getUniformLocation(w, "opacity");
					g = n.getUniformLocation(w, "color");
					h = n.getUniformLocation(w, "scale");
					m = n.getUniformLocation(w, "rotation");
					k = n.getUniformLocation(w, "screenPosition")
				}
				n.useProgram(w);
				u.initAttributes();
				u.enableAttribute(t);
				u.enableAttribute(p);
				u.disableUnusedAttributes();
				n.uniform1i(e, 0);
				n.uniform1i(d, 1);
				n.bindBuffer(n.ARRAY_BUFFER, l);
				n.vertexAttribPointer(t, 2, n.FLOAT, !1, 16, 0);
				n.vertexAttribPointer(p, 2, n.FLOAT, !1, 16, 8);
				n.bindBuffer(n.ELEMENT_ARRAY_BUFFER, r);
				u.disable(n.CULL_FACE);
				u.setDepthWrite(!1);
				Q = 0;
				for (M = b.length; Q < M; Q++) if (H = 16 / L.w, aa.set(H * C, H), O = b[Q], v.set(O.matrixWorld.elements[12], O.matrixWorld.elements[13], O.matrixWorld.elements[14]), v.applyMatrix4(E.matrixWorldInverse), v.applyMatrix4(E.projectionMatrix), Da.copy(v), fb.x = L.x + Da.x * F + F - 8, fb.y = L.y + Da.y * da + da - 8, !0 === Sd.containsPoint(fb)) {
					u.activeTexture(n.TEXTURE0);
					u.bindTexture(n.TEXTURE_2D, null);
					u.activeTexture(n.TEXTURE1);
					u.bindTexture(n.TEXTURE_2D, y);
					n.copyTexImage2D(n.TEXTURE_2D, 0, n.RGB, fb.x, fb.y, 16, 16, 0);
					n.uniform1i(c, 0);
					n.uniform2f(h, aa.x, aa.y);
					n.uniform3f(k, Da.x, Da.y, Da.z);
					u.disable(n.BLEND);
					u.enable(n.DEPTH_TEST);
					n.drawElements(n.TRIANGLES, 6, n.UNSIGNED_SHORT, 0);
					u.activeTexture(n.TEXTURE0);
					u.bindTexture(n.TEXTURE_2D, K);
					n.copyTexImage2D(n.TEXTURE_2D, 0, n.RGBA, fb.x, fb.y, 16, 16, 0);
					n.uniform1i(c, 1);
					u.disable(n.DEPTH_TEST);
					u.activeTexture(n.TEXTURE1);
					u.bindTexture(n.TEXTURE_2D, y);
					n.drawElements(n.TRIANGLES, 6, n.UNSIGNED_SHORT, 0);
					O.positionScreen.copy(Da);
					O.customUpdateCallback ? O.customUpdateCallback(O) : O.updateLensFlares();
					n.uniform1i(c, 2);
					u.enable(n.BLEND);
					for (var P = 0,
					wa = O.lensFlares.length; P < wa; P++) {
						var W = O.lensFlares[P];.001 < W.opacity && .001 < W.scale && (Da.x = W.x, Da.y = W.y, Da.z = W.z, H = W.size * W.scale / L.w, aa.x = H * C, aa.y = H, n.uniform3f(k, Da.x, Da.y, Da.z), n.uniform2f(h, aa.x, aa.y), n.uniform1f(m, W.rotation), n.uniform1f(f, W.opacity), n.uniform3f(g, W.color.r, W.color.g, W.color.b), u.setBlending(W.blending, W.blendEquation, W.blendSrc, W.blendDst), a.setTexture2D(W.texture, 1), n.drawElements(n.TRIANGLES, 6, n.UNSIGNED_SHORT, 0))
					}
				}
				u.enable(n.CULL_FACE);
				u.enable(n.DEPTH_TEST);
				u.setDepthWrite(!0);
				a.resetGLState()
			}
		}
	}
	function zf(a, b) {
		var c, d, e, f, g, h, m, k, t, p, n, u, l, r, A, w, y;
		function K(a, b) {
			return a.renderOrder !== b.renderOrder ? a.renderOrder - b.renderOrder: a.z !== b.z ? b.z - a.z: b.id - a.id
		}
		var v = a.context,
		E = a.state,
		L, C, F, da, H = new q,
		aa = new ca,
		Da = new q;
		this.render = function(q, D) {
			if (0 !== b.length) {
				if (void 0 === F) {
					var Q = new Float32Array([ - .5, -.5, 0, 0, .5, -.5, 1, 0, .5, .5, 1, 1, -.5, .5, 0, 1]),
					M = new Uint16Array([0, 1, 2, 0, 2, 3]);
					L = v.createBuffer();
					C = v.createBuffer();
					v.bindBuffer(v.ARRAY_BUFFER, L);
					v.bufferData(v.ARRAY_BUFFER, Q, v.STATIC_DRAW);
					v.bindBuffer(v.ELEMENT_ARRAY_BUFFER, C);
					v.bufferData(v.ELEMENT_ARRAY_BUFFER, M, v.STATIC_DRAW);
					var Q = v.createProgram(),
					M = v.createShader(v.VERTEX_SHADER),
					O = v.createShader(v.FRAGMENT_SHADER);
					v.shaderSource(M, ["precision " + a.getPrecision() + " float;", "uniform mat4 modelViewMatrix;\nuniform mat4 projectionMatrix;\nuniform float rotation;\nuniform vec2 scale;\nuniform vec2 uvOffset;\nuniform vec2 uvScale;\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUV;\nvoid main() {\nvUV = uvOffset + uv * uvScale;\nvec2 alignedPosition = position * scale;\nvec2 rotatedPosition;\nrotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\nrotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\nvec4 finalPosition;\nfinalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\nfinalPosition.xy += rotatedPosition;\nfinalPosition = projectionMatrix * finalPosition;\ngl_Position = finalPosition;\n}"].join("\n"));
					v.shaderSource(O, ["precision " + a.getPrecision() + " float;", "uniform vec3 color;\nuniform sampler2D map;\nuniform float opacity;\nuniform int fogType;\nuniform vec3 fogColor;\nuniform float fogDensity;\nuniform float fogNear;\nuniform float fogFar;\nuniform float alphaTest;\nvarying vec2 vUV;\nvoid main() {\nvec4 texture = texture2D( map, vUV );\nif ( texture.a < alphaTest ) discard;\ngl_FragColor = vec4( color * texture.xyz, texture.a * opacity );\nif ( fogType > 0 ) {\nfloat depth = gl_FragCoord.z / gl_FragCoord.w;\nfloat fogFactor = 0.0;\nif ( fogType == 1 ) {\nfogFactor = smoothstep( fogNear, fogFar, depth );\n} else {\nconst float LOG2 = 1.442695;\nfogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );\nfogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );\n}\ngl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );\n}\n}"].join("\n"));
					v.compileShader(M);
					v.compileShader(O);
					v.attachShader(Q, M);
					v.attachShader(Q, O);
					v.linkProgram(Q);
					F = Q;
					w = v.getAttribLocation(F, "position");
					y = v.getAttribLocation(F, "uv");
					c = v.getUniformLocation(F, "uvOffset");
					d = v.getUniformLocation(F, "uvScale");
					e = v.getUniformLocation(F, "rotation");
					f = v.getUniformLocation(F, "scale");
					g = v.getUniformLocation(F, "color");
					h = v.getUniformLocation(F, "map");
					m = v.getUniformLocation(F, "opacity");
					k = v.getUniformLocation(F, "modelViewMatrix");
					t = v.getUniformLocation(F, "projectionMatrix");
					p = v.getUniformLocation(F, "fogType");
					n = v.getUniformLocation(F, "fogDensity");
					u = v.getUniformLocation(F, "fogNear");
					l = v.getUniformLocation(F, "fogFar");
					r = v.getUniformLocation(F, "fogColor");
					A = v.getUniformLocation(F, "alphaTest");
					Q = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
					Q.width = 8;
					Q.height = 8;
					M = Q.getContext("2d");
					M.fillStyle = "white";
					M.fillRect(0, 0, 8, 8);
					da = new ea(Q);
					da.needsUpdate = !0
				}
				v.useProgram(F);
				E.initAttributes();
				E.enableAttribute(w);
				E.enableAttribute(y);
				E.disableUnusedAttributes();
				E.disable(v.CULL_FACE);
				E.enable(v.BLEND);
				v.bindBuffer(v.ARRAY_BUFFER, L);
				v.vertexAttribPointer(w, 2, v.FLOAT, !1, 16, 0);
				v.vertexAttribPointer(y, 2, v.FLOAT, !1, 16, 8);
				v.bindBuffer(v.ELEMENT_ARRAY_BUFFER, C);
				v.uniformMatrix4fv(t, !1, D.projectionMatrix.elements);
				E.activeTexture(v.TEXTURE0);
				v.uniform1i(h, 0);
				M = Q = 0; (O = q.fog) ? (v.uniform3f(r, O.color.r, O.color.g, O.color.b), O.isFog ? (v.uniform1f(u, O.near), v.uniform1f(l, O.far), v.uniform1i(p, 1), M = Q = 1) : O.isFogExp2 && (v.uniform1f(n, O.density), v.uniform1i(p, 2), M = Q = 2)) : (v.uniform1i(p, 0), M = Q = 0);
				for (var O = 0,
				P = b.length; O < P; O++) {
					var wa = b[O];
					wa.modelViewMatrix.multiplyMatrices(D.matrixWorldInverse, wa.matrixWorld);
					wa.z = -wa.modelViewMatrix.elements[14]
				}
				b.sort(K);
				for (var W = [], O = 0, P = b.length; O < P; O++) {
					var wa = b[O],
					x = wa.material; ! 1 !== x.visible && (v.uniform1f(A, x.alphaTest), v.uniformMatrix4fv(k, !1, wa.modelViewMatrix.elements), wa.matrixWorld.decompose(H, aa, Da), W[0] = Da.x, W[1] = Da.y, wa = 0, q.fog && x.fog && (wa = M), Q !== wa && (v.uniform1i(p, wa), Q = wa), null !== x.map ? (v.uniform2f(c, x.map.offset.x, x.map.offset.y), v.uniform2f(d, x.map.repeat.x, x.map.repeat.y)) : (v.uniform2f(c, 0, 0), v.uniform2f(d, 1, 1)), v.uniform1f(m, x.opacity), v.uniform3f(g, x.color.r, x.color.g, x.color.b), v.uniform1f(e, x.rotation), v.uniform2fv(f, W), E.setBlending(x.blending, x.blendEquation, x.blendSrc, x.blendDst), E.setDepthTest(x.depthTest), E.setDepthWrite(x.depthWrite), x.map ? a.setTexture2D(x.map, 0) : a.setTexture2D(da, 0), v.drawElements(v.TRIANGLES, 6, v.UNSIGNED_SHORT, 0))
				}
				E.enable(v.CULL_FACE);
				a.resetGLState()
			}
		}
	}
	function X() {
		Object.defineProperty(this, "id", {
			value: Af++
		});
		this.uuid = N.generateUUID();
		this.name = "";
		this.type = "Material";
		this.lights = this.fog = !0;
		this.blending = 1;
		this.side = 0;
		this.shading = 2;
		this.vertexColors = 0;
		this.opacity = 1;
		this.transparent = !1;
		this.blendSrc = 204;
		this.blendDst = 205;
		this.blendEquation = 100;
		this.blendEquationAlpha = this.blendDstAlpha = this.blendSrcAlpha = null;
		this.depthFunc = 3;
		this.depthWrite = this.depthTest = !0;
		this.clippingPlanes = null;
		this.clipShadows = this.clipIntersection = !1;
		this.colorWrite = !0;
		this.precision = null;
		this.polygonOffset = !1;
		this.alphaTest = this.polygonOffsetUnits = this.polygonOffsetFactor = 0;
		this.premultipliedAlpha = !1;
		this.overdraw = 0;
		this._needsUpdate = this.visible = !0
	}
	function Ha(a) {
		X.call(this);
		this.type = "ShaderMaterial";
		this.defines = {};
		this.uniforms = {};
		this.vertexShader = "void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";
		this.fragmentShader = "void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";
		this.linewidth = 1;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.morphNormals = this.morphTargets = this.skinning = this.clipping = this.lights = this.fog = !1;
		this.extensions = {
			derivatives: !1,
			fragDepth: !1,
			drawBuffers: !1,
			shaderTextureLOD: !1
		};
		this.defaultAttributeValues = {
			color: [1, 1, 1],
			uv: [0, 0],
			uv2: [0, 0]
		};
		this.index0AttributeName = void 0;
		void 0 !== a && (void 0 !== a.attributes && console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."), this.setValues(a))
	}
	function ab(a) {
		X.call(this);
		this.type = "MeshDepthMaterial";
		this.depthPacking = 3200;
		this.morphTargets = this.skinning = !1;
		this.displacementMap = this.alphaMap = this.map = null;
		this.displacementScale = 1;
		this.displacementBias = 0;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.lights = this.fog = !1;
		this.setValues(a)
	}
	function Pa(a, b) {
		this.min = void 0 !== a ? a: new q(Infinity, Infinity, Infinity);
		this.max = void 0 !== b ? b: new q( - Infinity, -Infinity, -Infinity)
	}
	function Na(a, b) {
		this.center = void 0 !== a ? a: new q;
		this.radius = void 0 !== b ? b: 0
	}
	function ya() {
		this.elements = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
		0 < arguments.length && console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")
	}
	function la(a, b) {
		this.normal = void 0 !== a ? a: new q(1, 0, 0);
		this.constant = void 0 !== b ? b: 0
	}
	function tc(a, b, c, d, e, f) {
		this.planes = [void 0 !== a ? a: new la, void 0 !== b ? b: new la, void 0 !== c ? c: new la, void 0 !== d ? d: new la, void 0 !== e ? e: new la, void 0 !== f ? f: new la]
	}
	function Ke(a, b, c, d) {
		function e(b, c, d, e) {
			var f = b.geometry,
			g;
			g = A;
			var h = b.customDepthMaterial;
			d && (g = w, h = b.customDistanceMaterial);
			h ? g = h: (h = !1, c.morphTargets && (f && f.isBufferGeometry ? h = f.morphAttributes && f.morphAttributes.position && 0 < f.morphAttributes.position.length: f && f.isGeometry && (h = f.morphTargets && 0 < f.morphTargets.length)), b = b.isSkinnedMesh && c.skinning, f = 0, h && (f |= 1), b && (f |= 2), g = g[f]);
			a.localClippingEnabled && !0 === c.clipShadows && 0 !== c.clippingPlanes.length && (f = g.uuid, h = c.uuid, b = y[f], void 0 === b && (b = {},
			y[f] = b), f = b[h], void 0 === f && (f = g.clone(), b[h] = f), g = f);
			g.visible = c.visible;
			g.wireframe = c.wireframe;
			h = c.side;
			aa.renderSingleSided && 2 == h && (h = 0);
			aa.renderReverseSided && (0 === h ? h = 1 : 1 === h && (h = 0));
			g.side = h;
			g.clipShadows = c.clipShadows;
			g.clippingPlanes = c.clippingPlanes;
			g.wireframeLinewidth = c.wireframeLinewidth;
			g.linewidth = c.linewidth;
			d && void 0 !== g.uniforms.lightPos && g.uniforms.lightPos.value.copy(e);
			return g
		}
		function f(a, b, c) {
			if (!1 !== a.visible) {
				0 !== (a.layers.mask & b.layers.mask) && (a.isMesh || a.isLine || a.isPoints) && a.castShadow && (!1 === a.frustumCulled || !0 === m.intersectsObject(a)) && !0 === a.material.visible && (a.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, a.matrixWorld), r.push(a));
				a = a.children;
				for (var d = 0,
				e = a.length; d < e; d++) f(a[d], b, c)
			}
		}
		var g = a.context,
		h = a.state,
		m = new tc,
		k = new S,
		t = b.shadows,
		p = new D,
		n = new D(d.maxTextureSize, d.maxTextureSize),
		u = new q,
		l = new q,
		r = [],
		A = Array(4),
		w = Array(4),
		y = {},
		K = [new q(1, 0, 0), new q( - 1, 0, 0), new q(0, 0, 1), new q(0, 0, -1), new q(0, 1, 0), new q(0, -1, 0)],
		v = [new q(0, 1, 0), new q(0, 1, 0), new q(0, 1, 0), new q(0, 1, 0), new q(0, 0, 1), new q(0, 0, -1)],
		E = [new fa, new fa, new fa, new fa, new fa, new fa];
		b = new ab;
		b.depthPacking = 3201;
		b.clipping = !0;
		d = bb.distanceRGBA;
		for (var L = Ja.clone(d.uniforms), C = 0; 4 !== C; ++C) {
			var F = 0 !== (C & 1),
			da = 0 !== (C & 2),
			H = b.clone();
			H.morphTargets = F;
			H.skinning = da;
			A[C] = H;
			F = new Ha({
				defines: {
					USE_SHADOWMAP: ""
				},
				uniforms: L,
				vertexShader: d.vertexShader,
				fragmentShader: d.fragmentShader,
				morphTargets: F,
				skinning: da,
				clipping: !0
			});
			w[C] = F
		}
		var aa = this;
		this.enabled = !1;
		this.autoUpdate = !0;
		this.needsUpdate = !1;
		this.type = 1;
		this.renderSingleSided = this.renderReverseSided = !0;
		this.render = function(b, d) {
			if (!1 !== aa.enabled && (!1 !== aa.autoUpdate || !1 !== aa.needsUpdate) && 0 !== t.length) {
				h.buffers.color.setClear(1, 1, 1, 1);
				h.disable(g.BLEND);
				h.setDepthTest(!0);
				h.setScissorTest(!1);
				for (var y, q, A = 0,
				C = t.length; A < C; A++) {
					var w = t[A],
					L = w.shadow;
					if (void 0 === L) console.warn("THREE.WebGLShadowMap:", w, "has no shadow.");
					else {
						var F = L.camera;
						p.copy(L.mapSize);
						p.min(n);
						if (w && w.isPointLight) {
							y = 6;
							q = !0;
							var H = p.x,
							da = p.y;
							E[0].set(2 * H, da, H, da);
							E[1].set(0, da, H, da);
							E[2].set(3 * H, da, H, da);
							E[3].set(H, da, H, da);
							E[4].set(3 * H, 0, H, da);
							E[5].set(H, 0, H, da);
							p.x *= 4;
							p.y *= 2
						} else y = 1,
						q = !1;
						null === L.map && (L.map = new Ya(p.x, p.y, {
							minFilter: 1003,
							magFilter: 1003,
							format: 1023
						}), F.updateProjectionMatrix());
						L.isSpotLightShadow && L.update(w);
						L && L.isRectAreaLightShadow && L.update(w);
						H = L.map;
						L = L.matrix;
						l.setFromMatrixPosition(w.matrixWorld);
						F.position.copy(l);
						a.setRenderTarget(H);
						a.clear();
						for (H = 0; H < y; H++) {
							q ? (u.copy(F.position), u.add(K[H]), F.up.copy(v[H]), F.lookAt(u), h.viewport(E[H])) : (u.setFromMatrixPosition(w.target.matrixWorld), F.lookAt(u));
							F.updateMatrixWorld();
							F.matrixWorldInverse.getInverse(F.matrixWorld);
							L.set(.5, 0, 0, .5, 0, .5, 0, .5, 0, 0, .5, .5, 0, 0, 0, 1);
							L.multiply(F.projectionMatrix);
							L.multiply(F.matrixWorldInverse);
							k.multiplyMatrices(F.projectionMatrix, F.matrixWorldInverse);
							m.setFromMatrix(k);
							r.length = 0;
							f(b, d, F);
							for (var da = 0,
							x = r.length; da < x; da++) {
								var D = r[da],
								Td = c.update(D),
								Sa = D.material;
								if (Sa && Sa.isMultiMaterial) for (var Le = Td.groups,
								Sa = Sa.materials,
								z = 0,
								Ea = Le.length; z < Ea; z++) {
									var I = Le[z],
									J = Sa[I.materialIndex]; ! 0 === J.visible && (J = e(D, J, q, l), a.renderBufferDirect(F, null, Td, J, D, I))
								} else J = e(D, Sa, q, l),
								a.renderBufferDirect(F, null, Td, J, D, null)
							}
						}
					}
				}
				y = a.getClearColor();
				q = a.getClearAlpha();
				a.setClearColor(y, q);
				aa.needsUpdate = !1
			}
		}
	}
	function cb(a, b) {
		this.origin = void 0 !== a ? a: new q;
		this.direction = void 0 !== b ? b: new q
	}
	function db(a, b, c, d) {
		this._x = a || 0;
		this._y = b || 0;
		this._z = c || 0;
		this._order = d || db.DefaultOrder
	}
	function nd() {
		this.mask = 1
	}
	function x() {
		Object.defineProperty(this, "id", {
			value: Bf++
		});
		this.uuid = N.generateUUID();
		this.name = "";
		this.type = "Object3D";
		this.parent = null;
		this.children = [];
		this.up = x.DefaultUp.clone();
		var a = new q,
		b = new db,
		c = new ca,
		d = new q(1, 1, 1);
		b.onChange(function() {
			c.setFromEuler(b, !1)
		});
		c.onChange(function() {
			b.setFromQuaternion(c, void 0, !1)
		});
		Object.defineProperties(this, {
			position: {
				enumerable: !0,
				value: a
			},
			rotation: {
				enumerable: !0,
				value: b
			},
			quaternion: {
				enumerable: !0,
				value: c
			},
			scale: {
				enumerable: !0,
				value: d
			},
			modelViewMatrix: {
				value: new S
			},
			normalMatrix: {
				value: new ya
			}
		});
		this.matrix = new S;
		this.matrixWorld = new S;
		this.matrixAutoUpdate = x.DefaultMatrixAutoUpdate;
		this.matrixWorldNeedsUpdate = !1;
		this.layers = new nd;
		this.visible = !0;
		this.receiveShadow = this.castShadow = !1;
		this.frustumCulled = !0;
		this.renderOrder = 0;
		this.userData = {};
		this.onBeforeRender = function() {};
		this.onAfterRender = function() {}
	}
	function hb(a, b) {
		this.start = void 0 !== a ? a: new q;
		this.end = void 0 !== b ? b: new q
	}
	function za(a, b, c) {
		this.a = void 0 !== a ? a: new q;
		this.b = void 0 !== b ? b: new q;
		this.c = void 0 !== c ? c: new q
	}
	function ha(a, b, c, d, e, f) {
		this.a = a;
		this.b = b;
		this.c = c;
		this.normal = d && d.isVector3 ? d: new q;
		this.vertexNormals = Array.isArray(d) ? d: [];
		this.color = e && e.isColor ? e: new J;
		this.vertexColors = Array.isArray(e) ? e: [];
		this.materialIndex = void 0 !== f ? f: 0
	}
	function Ka(a) {
		X.call(this);
		this.type = "MeshBasicMaterial";
		this.color = new J(16777215);
		this.lightMap = this.map = null;
		this.lightMapIntensity = 1;
		this.aoMap = null;
		this.aoMapIntensity = 1;
		this.envMap = this.alphaMap = this.specularMap = null;
		this.combine = 0;
		this.reflectivity = 1;
		this.refractionRatio = .98;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.wireframeLinejoin = this.wireframeLinecap = "round";
		this.lights = this.morphTargets = this.skinning = !1;
		this.setValues(a)
	}
	function U(a, b, c) {
		if (Array.isArray(a)) throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
		this.uuid = N.generateUUID();
		this.array = a;
		this.itemSize = b;
		this.count = void 0 !== a ? a.length / b: 0;
		this.normalized = !0 === c;
		this.dynamic = !1;
		this.updateRange = {
			offset: 0,
			count: -1
		};
		this.onUploadCallback = function() {};
		this.version = 0
	}
	function uc(a, b) {
		U.call(this, new Int8Array(a), b)
	}
	function vc(a, b) {
		U.call(this, new Uint8Array(a), b)
	}
	function wc(a, b) {
		U.call(this, new Uint8ClampedArray(a), b)
	}
	function xc(a, b) {
		U.call(this, new Int16Array(a), b)
	}
	function ib(a, b) {
		U.call(this, new Uint16Array(a), b)
	}
	function yc(a, b) {
		U.call(this, new Int32Array(a), b)
	}
	function jb(a, b) {
		U.call(this, new Uint32Array(a), b)
	}
	function z(a, b) {
		U.call(this, new Float32Array(a), b)
	}
	function zc(a, b) {
		U.call(this, new Float64Array(a), b)
	}
	function Me() {
		this.indices = [];
		this.vertices = [];
		this.normals = [];
		this.colors = [];
		this.uvs = [];
		this.uvs2 = [];
		this.groups = [];
		this.morphTargets = {};
		this.skinWeights = [];
		this.skinIndices = [];
		this.boundingSphere = this.boundingBox = null;
		this.groupsNeedUpdate = this.uvsNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.verticesNeedUpdate = !1
	}
	function Ud(a) {
		for (var b = a.length,
		c = -Infinity; b--;) a[b] > c && (c = a[b]);
		return c
	}
	function T() {
		Object.defineProperty(this, "id", {
			value: Vd++
		});
		this.uuid = N.generateUUID();
		this.name = "";
		this.type = "Geometry";
		this.vertices = [];
		this.colors = [];
		this.faces = [];
		this.faceVertexUvs = [[]];
		this.morphTargets = [];
		this.morphNormals = [];
		this.skinWeights = [];
		this.skinIndices = [];
		this.lineDistances = [];
		this.boundingSphere = this.boundingBox = null;
		this.groupsNeedUpdate = this.lineDistancesNeedUpdate = this.colorsNeedUpdate = this.normalsNeedUpdate = this.uvsNeedUpdate = this.verticesNeedUpdate = this.elementsNeedUpdate = !1
	}
	function I() {
		Object.defineProperty(this, "id", {
			value: Vd++
		});
		this.uuid = N.generateUUID();
		this.name = "";
		this.type = "BufferGeometry";
		this.index = null;
		this.attributes = {};
		this.morphAttributes = {};
		this.groups = [];
		this.boundingSphere = this.boundingBox = null;
		this.drawRange = {
			start: 0,
			count: Infinity
		}
	}
	function Aa(a, b) {
		x.call(this);
		this.type = "Mesh";
		this.geometry = void 0 !== a ? a: new I;
		this.material = void 0 !== b ? b: new Ka({
			color: 16777215 * Math.random()
		});
		this.drawMode = 0;
		this.updateMorphTargets()
	}
	function Ib(a, b, c, d, e, f) {
		T.call(this);
		this.type = "BoxGeometry";
		this.parameters = {
			width: a,
			height: b,
			depth: c,
			widthSegments: d,
			heightSegments: e,
			depthSegments: f
		};
		this.fromBufferGeometry(new kb(a, b, c, d, e, f));
		this.mergeVertices()
	}
	function kb(a, b, c, d, e, f) {
		function g(a, b, c, d, e, f, g, l, L, C, F) {
			var da = f / L,
			H = g / C,
			aa = f / 2,
			x = g / 2,
			D = l / 2;
			g = L + 1;
			var z = C + 1,
			Q = f = 0,
			M, O, P = new q;
			for (O = 0; O < z; O++) {
				var J = O * H - x;
				for (M = 0; M < g; M++) P[a] = (M * da - aa) * d,
				P[b] = J * e,
				P[c] = D,
				k.push(P.x, P.y, P.z),
				P[a] = 0,
				P[b] = 0,
				P[c] = 0 < l ? 1 : -1,
				t.push(P.x, P.y, P.z),
				p.push(M / L),
				p.push(1 - O / C),
				f += 1
			}
			for (O = 0; O < C; O++) for (M = 0; M < L; M++) a = n + M + g * (O + 1),
			b = n + (M + 1) + g * (O + 1),
			c = n + (M + 1) + g * O,
			m.push(n + M + g * O, a, c),
			m.push(a, b, c),
			Q += 6;
			h.addGroup(u, Q, F);
			u += Q;
			n += f
		}
		I.call(this);
		this.type = "BoxBufferGeometry";
		this.parameters = {
			width: a,
			height: b,
			depth: c,
			widthSegments: d,
			heightSegments: e,
			depthSegments: f
		};
		var h = this;
		d = Math.floor(d) || 1;
		e = Math.floor(e) || 1;
		f = Math.floor(f) || 1;
		var m = [],
		k = [],
		t = [],
		p = [],
		n = 0,
		u = 0;
		g("z", "y", "x", -1, -1, c, b, a, f, e, 0);
		g("z", "y", "x", 1, -1, c, b, -a, f, e, 1);
		g("x", "z", "y", 1, 1, a, c, b, d, f, 2);
		g("x", "z", "y", 1, -1, a, c, -b, d, f, 3);
		g("x", "y", "z", 1, -1, a, b, c, d, e, 4);
		g("x", "y", "z", -1, -1, a, b, -c, d, e, 5);
		this.setIndex(m);
		this.addAttribute("position", new z(k, 3));
		this.addAttribute("normal", new z(t, 3));
		this.addAttribute("uv", new z(p, 2))
	}
	function Ac(a, b, c, d) {
		T.call(this);
		this.type = "PlaneGeometry";
		this.parameters = {
			width: a,
			height: b,
			widthSegments: c,
			heightSegments: d
		};
		this.fromBufferGeometry(new lb(a, b, c, d))
	}
	function lb(a, b, c, d) {
		I.call(this);
		this.type = "PlaneBufferGeometry";
		this.parameters = {
			width: a,
			height: b,
			widthSegments: c,
			heightSegments: d
		};
		var e = a / 2,
		f = b / 2;
		c = Math.floor(c) || 1;
		d = Math.floor(d) || 1;
		var g = c + 1,
		h = d + 1,
		m = a / c,
		k = b / d,
		t = [],
		p = [],
		n = [],
		u = [];
		for (a = 0; a < h; a++) {
			var l = a * k - f;
			for (b = 0; b < g; b++) p.push(b * m - e, -l, 0),
			n.push(0, 0, 1),
			u.push(b / c),
			u.push(1 - a / d)
		}
		for (a = 0; a < d; a++) for (b = 0; b < c; b++) e = b + g * (a + 1),
		f = b + 1 + g * (a + 1),
		h = b + 1 + g * a,
		t.push(b + g * a, e, h),
		t.push(e, f, h);
		this.setIndex(t);
		this.addAttribute("position", new z(p, 3));
		this.addAttribute("normal", new z(n, 3));
		this.addAttribute("uv", new z(u, 2))
	}
	function ra() {
		x.call(this);
		this.type = "Camera";
		this.matrixWorldInverse = new S;
		this.projectionMatrix = new S
	}
	function Fa(a, b, c, d) {
		ra.call(this);
		this.type = "PerspectiveCamera";
		this.fov = void 0 !== a ? a: 50;
		this.zoom = 1;
		this.near = void 0 !== c ? c: .1;
		this.far = void 0 !== d ? d: 2E3;
		this.focus = 10;
		this.aspect = void 0 !== b ? b: 1;
		this.view = null;
		this.filmGauge = 35;
		this.filmOffset = 0;
		this.updateProjectionMatrix()
	}
	function Jb(a, b, c, d, e, f) {
		ra.call(this);
		this.type = "OrthographicCamera";
		this.zoom = 1;
		this.view = null;
		this.left = a;
		this.right = b;
		this.top = c;
		this.bottom = d;
		this.near = void 0 !== e ? e: .1;
		this.far = void 0 !== f ? f: 2E3;
		this.updateProjectionMatrix()
	}
	function Cf(a, b, c) {
		var d, e, f;
		return {
			setMode: function(a) {
				d = a
			},
			setIndex: function(c) {
				c.array instanceof Uint32Array && b.get("OES_element_index_uint") ? (e = a.UNSIGNED_INT, f = 4) : c.array instanceof Uint16Array ? (e = a.UNSIGNED_SHORT, f = 2) : (e = a.UNSIGNED_BYTE, f = 1)
			},
			render: function(b, h) {
				a.drawElements(d, h, e, b * f);
				c.calls++;
				c.vertices += h;
				d === a.TRIANGLES && (c.faces += h / 3)
			},
			renderInstances: function(g, h, m) {
				var k = b.get("ANGLE_instanced_arrays");
				null === k ? console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.") : (k.drawElementsInstancedANGLE(d, m, e, h * f, g.maxInstancedCount), c.calls++, c.vertices += m * g.maxInstancedCount, d === a.TRIANGLES && (c.faces += g.maxInstancedCount * m / 3))
			}
		}
	}
	function Df(a, b, c) {
		var d;
		return {
			setMode: function(a) {
				d = a
			},
			render: function(b, f) {
				a.drawArrays(d, b, f);
				c.calls++;
				c.vertices += f;
				d === a.TRIANGLES && (c.faces += f / 3)
			},
			renderInstances: function(e) {
				var f = b.get("ANGLE_instanced_arrays");
				if (null === f) console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
				else {
					var g = e.attributes.position,
					g = g.isInterleavedBufferAttribute ? g.data.count: g.count;
					f.drawArraysInstancedANGLE(d, 0, g, e.maxInstancedCount);
					c.calls++;
					c.vertices += g * e.maxInstancedCount;
					d === a.TRIANGLES && (c.faces += e.maxInstancedCount * g / 3)
				}
			}
		}
	}
	function Ef() {
		var a = {};
		return {
			get: function(b) {
				if (void 0 !== a[b.id]) return a[b.id];
				var c;
				switch (b.type) {
				case "DirectionalLight":
					c = {
						direction: new q,
						color: new J,
						shadow: !1,
						shadowBias: 0,
						shadowRadius: 1,
						shadowMapSize: new D
					};
					break;
				case "SpotLight":
					c = {
						position: new q,
						direction: new q,
						color: new J,
						distance: 0,
						coneCos: 0,
						penumbraCos: 0,
						decay: 0,
						shadow: !1,
						shadowBias: 0,
						shadowRadius: 1,
						shadowMapSize: new D
					};
					break;
				case "PointLight":
					c = {
						position: new q,
						color: new J,
						distance: 0,
						decay: 0,
						shadow: !1,
						shadowBias: 0,
						shadowRadius: 1,
						shadowMapSize: new D
					};
					break;
				case "HemisphereLight":
					c = {
						direction: new q,
						skyColor: new J,
						groundColor: new J
					};
					break;
				case "RectAreaLight":
					c = {
						color: new J,
						position: new q,
						halfWidth: new q,
						halfHeight: new q
					}
				}
				return a[b.id] = c
			}
		}
	}
	function Ff(a) {
		a = a.split("\n");
		for (var b = 0; b < a.length; b++) a[b] = b + 1 + ": " + a[b];
		return a.join("\n")
	}
	function Ne(a, b, c) {
		var d = a.createShader(b);
		a.shaderSource(d, c);
		a.compileShader(d); ! 1 === a.getShaderParameter(d, a.COMPILE_STATUS) && console.error("THREE.WebGLShader: Shader couldn't compile.");
		"" !== a.getShaderInfoLog(d) && console.warn("THREE.WebGLShader: gl.getShaderInfoLog()", b === a.VERTEX_SHADER ? "vertex": "fragment", a.getShaderInfoLog(d), Ff(c));
		return d
	}
	function Oe(a) {
		switch (a) {
		case 3E3:
			return ["Linear", "( value )"];
		case 3001:
			return ["sRGB", "( value )"];
		case 3002:
			return ["RGBE", "( value )"];
		case 3004:
			return ["RGBM", "( value, 7.0 )"];
		case 3005:
			return ["RGBM", "( value, 16.0 )"];
		case 3006:
			return ["RGBD", "( value, 256.0 )"];
		case 3007:
			return ["Gamma", "( value, float( GAMMA_FACTOR ) )"];
		default:
			throw Error("unsupported encoding: " + a);
		}
	}
	function Wd(a, b) {
		var c = Oe(b);
		return "vec4 " + a + "( vec4 value ) { return " + c[0] + "ToLinear" + c[1] + "; }"
	}
	function Gf(a, b) {
		var c = Oe(b);
		return "vec4 " + a + "( vec4 value ) { return LinearTo" + c[0] + c[1] + "; }"
	}
	function Hf(a, b) {
		var c;
		switch (b) {
		case 1:
			c = "Linear";
			break;
		case 2:
			c = "Reinhard";
			break;
		case 3:
			c = "Uncharted2";
			break;
		case 4:
			c = "OptimizedCineon";
			break;
		default:
			throw Error("unsupported toneMapping: " + b);
		}
		return "vec3 " + a + "( vec3 color ) { return " + c + "ToneMapping( color ); }"
	}
	function If(a, b, c) {
		a = a || {};
		return [a.derivatives || b.envMapCubeUV || b.bumpMap || b.normalMap || b.flatShading ? "#extension GL_OES_standard_derivatives : enable": "", (a.fragDepth || b.logarithmicDepthBuffer) && c.get("EXT_frag_depth") ? "#extension GL_EXT_frag_depth : enable": "", a.drawBuffers && c.get("WEBGL_draw_buffers") ? "#extension GL_EXT_draw_buffers : require": "", (a.shaderTextureLOD || b.envMap) && c.get("EXT_shader_texture_lod") ? "#extension GL_EXT_shader_texture_lod : enable": ""].filter(Bc).join("\n")
	}
	function Jf(a) {
		var b = [],
		c;
		for (c in a) {
			var d = a[c]; ! 1 !== d && b.push("#define " + c + " " + d)
		}
		return b.join("\n")
	}
	function Bc(a) {
		return "" !== a
	}
	function Pe(a, b) {
		return a.replace(/NUM_DIR_LIGHTS/g, b.numDirLights).replace(/NUM_SPOT_LIGHTS/g, b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g, b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g, b.numPointLights).replace(/NUM_HEMI_LIGHTS/g, b.numHemiLights)
	}
	function Xd(a) {
		return a.replace(/#include +<([\w\d.]+)>/g,
		function(a, c) {
			var d = Z[c];
			if (void 0 === d) throw Error("Can not resolve #include <" + c + ">");
			return Xd(d)
		})
	}
	function Qe(a) {
		return a.replace(/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,
		function(a, c, d, e) {
			a = "";
			for (c = parseInt(c); c < parseInt(d); c++) a += e.replace(/\[ i \]/g, "[ " + c + " ]");
			return a
		})
	}
	function Kf(a, b, c, d) {
		var e = a.context,
		f = c.extensions,
		g = c.defines,
		h = c.__webglShader.vertexShader,
		m = c.__webglShader.fragmentShader,
		k = "SHADOWMAP_TYPE_BASIC";
		1 === d.shadowMapType ? k = "SHADOWMAP_TYPE_PCF": 2 === d.shadowMapType && (k = "SHADOWMAP_TYPE_PCF_SOFT");
		var t = "ENVMAP_TYPE_CUBE",
		p = "ENVMAP_MODE_REFLECTION",
		n = "ENVMAP_BLENDING_MULTIPLY";
		if (d.envMap) {
			switch (c.envMap.mapping) {
			case 301:
			case 302:
				t = "ENVMAP_TYPE_CUBE";
				break;
			case 306:
			case 307:
				t = "ENVMAP_TYPE_CUBE_UV";
				break;
			case 303:
			case 304:
				t = "ENVMAP_TYPE_EQUIREC";
				break;
			case 305:
				t = "ENVMAP_TYPE_SPHERE"
			}
			switch (c.envMap.mapping) {
			case 302:
			case 304:
				p = "ENVMAP_MODE_REFRACTION"
			}
			switch (c.combine) {
			case 0:
				n = "ENVMAP_BLENDING_MULTIPLY";
				break;
			case 1:
				n = "ENVMAP_BLENDING_MIX";
				break;
			case 2:
				n = "ENVMAP_BLENDING_ADD"
			}
		}
		var u = 0 < a.gammaFactor ? a.gammaFactor: 1,
		f = If(f, d, a.extensions),
		l = Jf(g),
		r = e.createProgram();
		c.isRawShaderMaterial ? (g = [l, "\n"].filter(Bc).join("\n"), k = [f, l, "\n"].filter(Bc).join("\n")) : (g = ["precision " + d.precision + " float;", "precision " + d.precision + " int;", "#define SHADER_NAME " + c.__webglShader.name, l, d.supportsVertexTextures ? "#define VERTEX_TEXTURES": "", "#define GAMMA_FACTOR " + u, "#define MAX_BONES " + d.maxBones, d.useFog && d.fog ? "#define USE_FOG": "", d.useFog && d.fogExp ? "#define FOG_EXP2": "", d.map ? "#define USE_MAP": "", d.envMap ? "#define USE_ENVMAP": "", d.envMap ? "#define " + p: "", d.lightMap ? "#define USE_LIGHTMAP": "", d.aoMap ? "#define USE_AOMAP": "", d.emissiveMap ? "#define USE_EMISSIVEMAP": "", d.bumpMap ? "#define USE_BUMPMAP": "", d.normalMap ? "#define USE_NORMALMAP": "", d.displacementMap && d.supportsVertexTextures ? "#define USE_DISPLACEMENTMAP": "", d.specularMap ? "#define USE_SPECULARMAP": "", d.roughnessMap ? "#define USE_ROUGHNESSMAP": "", d.metalnessMap ? "#define USE_METALNESSMAP": "", d.alphaMap ? "#define USE_ALPHAMAP": "", d.vertexColors ? "#define USE_COLOR": "", d.flatShading ? "#define FLAT_SHADED": "", d.skinning ? "#define USE_SKINNING": "", d.useVertexTexture ? "#define BONE_TEXTURE": "", d.morphTargets ? "#define USE_MORPHTARGETS": "", d.morphNormals && !1 === d.flatShading ? "#define USE_MORPHNORMALS": "", d.doubleSided ? "#define DOUBLE_SIDED": "", d.flipSided ? "#define FLIP_SIDED": "", "#define NUM_CLIPPING_PLANES " + d.numClippingPlanes, d.shadowMapEnabled ? "#define USE_SHADOWMAP": "", d.shadowMapEnabled ? "#define " + k: "", d.sizeAttenuation ? "#define USE_SIZEATTENUATION": "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF": "", d.logarithmicDepthBuffer && a.extensions.get("EXT_frag_depth") ? "#define USE_LOGDEPTHBUF_EXT": "", "uniform mat4 modelMatrix;", "uniform mat4 modelViewMatrix;", "uniform mat4 projectionMatrix;", "uniform mat4 viewMatrix;", "uniform mat3 normalMatrix;", "uniform vec3 cameraPosition;", "attribute vec3 position;", "attribute vec3 normal;", "attribute vec2 uv;", "#ifdef USE_COLOR", "\tattribute vec3 color;", "#endif", "#ifdef USE_MORPHTARGETS", "\tattribute vec3 morphTarget0;", "\tattribute vec3 morphTarget1;", "\tattribute vec3 morphTarget2;", "\tattribute vec3 morphTarget3;", "\t#ifdef USE_MORPHNORMALS", "\t\tattribute vec3 morphNormal0;", "\t\tattribute vec3 morphNormal1;", "\t\tattribute vec3 morphNormal2;", "\t\tattribute vec3 morphNormal3;", "\t#else", "\t\tattribute vec3 morphTarget4;", "\t\tattribute vec3 morphTarget5;", "\t\tattribute vec3 morphTarget6;", "\t\tattribute vec3 morphTarget7;", "\t#endif", "#endif", "#ifdef USE_SKINNING", "\tattribute vec4 skinIndex;", "\tattribute vec4 skinWeight;", "#endif", "\n"].filter(Bc).join("\n"), k = [f, "precision " + d.precision + " float;", "precision " + d.precision + " int;", "#define SHADER_NAME " + c.__webglShader.name, l, d.alphaTest ? "#define ALPHATEST " + d.alphaTest: "", "#define GAMMA_FACTOR " + u, d.useFog && d.fog ? "#define USE_FOG": "", d.useFog && d.fogExp ? "#define FOG_EXP2": "", d.map ? "#define USE_MAP": "", d.envMap ? "#define USE_ENVMAP": "", d.envMap ? "#define " + t: "", d.envMap ? "#define " + p: "", d.envMap ? "#define " + n: "", d.lightMap ? "#define USE_LIGHTMAP": "", d.aoMap ? "#define USE_AOMAP": "", d.emissiveMap ? "#define USE_EMISSIVEMAP": "", d.bumpMap ? "#define USE_BUMPMAP": "", d.normalMap ? "#define USE_NORMALMAP": "", d.specularMap ? "#define USE_SPECULARMAP": "", d.roughnessMap ? "#define USE_ROUGHNESSMAP": "", d.metalnessMap ? "#define USE_METALNESSMAP": "", d.alphaMap ? "#define USE_ALPHAMAP": "", d.vertexColors ? "#define USE_COLOR": "", d.gradientMap ? "#define USE_GRADIENTMAP": "", d.flatShading ? "#define FLAT_SHADED": "", d.doubleSided ? "#define DOUBLE_SIDED": "", d.flipSided ? "#define FLIP_SIDED": "", "#define NUM_CLIPPING_PLANES " + d.numClippingPlanes, "#define UNION_CLIPPING_PLANES " + (d.numClippingPlanes - d.numClipIntersection), d.shadowMapEnabled ? "#define USE_SHADOWMAP": "", d.shadowMapEnabled ? "#define " + k: "", d.premultipliedAlpha ? "#define PREMULTIPLIED_ALPHA": "", d.physicallyCorrectLights ? "#define PHYSICALLY_CORRECT_LIGHTS": "", d.logarithmicDepthBuffer ? "#define USE_LOGDEPTHBUF": "", d.logarithmicDepthBuffer && a.extensions.get("EXT_frag_depth") ? "#define USE_LOGDEPTHBUF_EXT": "", d.envMap && a.extensions.get("EXT_shader_texture_lod") ? "#define TEXTURE_LOD_EXT": "", "uniform mat4 viewMatrix;", "uniform vec3 cameraPosition;", 0 !== d.toneMapping ? "#define TONE_MAPPING": "", 0 !== d.toneMapping ? Z.tonemapping_pars_fragment: "", 0 !== d.toneMapping ? Hf("toneMapping", d.toneMapping) : "", d.outputEncoding || d.mapEncoding || d.envMapEncoding || d.emissiveMapEncoding ? Z.encodings_pars_fragment: "", d.mapEncoding ? Wd("mapTexelToLinear", d.mapEncoding) : "", d.envMapEncoding ? Wd("envMapTexelToLinear", d.envMapEncoding) : "", d.emissiveMapEncoding ? Wd("emissiveMapTexelToLinear", d.emissiveMapEncoding) : "", d.outputEncoding ? Gf("linearToOutputTexel", d.outputEncoding) : "", d.depthPacking ? "#define DEPTH_PACKING " + c.depthPacking: "", "\n"].filter(Bc).join("\n"));
		h = Xd(h, d);
		h = Pe(h, d);
		m = Xd(m, d);
		m = Pe(m, d);
		c.isShaderMaterial || (h = Qe(h), m = Qe(m));
		m = k + m;
		h = Ne(e, e.VERTEX_SHADER, g + h);
		m = Ne(e, e.FRAGMENT_SHADER, m);
		e.attachShader(r, h);
		e.attachShader(r, m);
		void 0 !== c.index0AttributeName ? e.bindAttribLocation(r, 0, c.index0AttributeName) : !0 === d.morphTargets && e.bindAttribLocation(r, 0, "position");
		e.linkProgram(r);
		d = e.getProgramInfoLog(r);
		t = e.getShaderInfoLog(h);
		p = e.getShaderInfoLog(m);
		u = n = !0;
		if (!1 === e.getProgramParameter(r, e.LINK_STATUS)) n = !1,
		console.error("THREE.WebGLProgram: shader error: ", e.getError(), "gl.VALIDATE_STATUS", e.getProgramParameter(r, e.VALIDATE_STATUS), "gl.getProgramInfoLog", d, t, p);
		else if ("" !== d) console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()", d);
		else if ("" === t || "" === p) u = !1;
		u && (this.diagnostics = {
			runnable: n,
			material: c,
			programLog: d,
			vertexShader: {
				log: t,
				prefix: g
			},
			fragmentShader: {
				log: p,
				prefix: k
			}
		});
		e.deleteShader(h);
		e.deleteShader(m);
		var q;
		this.getUniforms = function() {
			void 0 === q && (q = new $a(e, r, a));
			return q
		};
		var w;
		this.getAttributes = function() {
			if (void 0 === w) {
				for (var a = {},
				b = e.getProgramParameter(r, e.ACTIVE_ATTRIBUTES), c = 0; c < b; c++) {
					var d = e.getActiveAttrib(r, c).name;
					a[d] = e.getAttribLocation(r, d)
				}
				w = a
			}
			return w
		};
		this.destroy = function() {
			e.deleteProgram(r);
			this.program = void 0
		};
		Object.defineProperties(this, {
			uniforms: {
				get: function() {
					console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");
					return this.getUniforms()
				}
			},
			attributes: {
				get: function() {
					console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");
					return this.getAttributes()
				}
			}
		});
		this.id = Lf++;
		this.code = b;
		this.usedTimes = 1;
		this.program = r;
		this.vertexShader = h;
		this.fragmentShader = m;
		return this
	}
	function Mf(a, b) {
		function c(a, b) {
			var c;
			a ? a.isTexture ? c = a.encoding: a.isWebGLRenderTarget && (console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."), c = a.texture.encoding) : c = 3E3;
			3E3 === c && b && (c = 3007);
			return c
		}
		var d = [],
		e = {
			MeshDepthMaterial: "depth",
			MeshNormalMaterial: "normal",
			MeshBasicMaterial: "basic",
			MeshLambertMaterial: "lambert",
			MeshPhongMaterial: "phong",
			MeshToonMaterial: "phong",
			MeshStandardMaterial: "physical",
			MeshPhysicalMaterial: "physical",
			LineBasicMaterial: "basic",
			LineDashedMaterial: "dashed",
			PointsMaterial: "points"
		},
		f = "precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking".split(" ");
		this.getParameters = function(d, f, m, k, t, p) {
			var n = e[d.type],
			u;
			b.floatVertexTextures && p && p.skeleton && p.skeleton.useVertexTexture ? u = 1024 : (u = Math.floor((b.maxVertexUniforms - 20) / 4), void 0 !== p && p && p.isSkinnedMesh && (u = Math.min(p.skeleton.bones.length, u), u < p.skeleton.bones.length && console.warn("WebGLRenderer: too many bones - " + p.skeleton.bones.length + ", this GPU supports just " + u + " (try OpenGL instead of ANGLE)")));
			var l = a.getPrecision();
			null !== d.precision && (l = b.getMaxPrecision(d.precision), l !== d.precision && console.warn("THREE.WebGLProgram.getParameters:", d.precision, "not supported, using", l, "instead."));
			var r = a.getCurrentRenderTarget();
			return {
				shaderID: n,
				precision: l,
				supportsVertexTextures: b.vertexTextures,
				outputEncoding: c(r ? r.texture: null, a.gammaOutput),
				map: !!d.map,
				mapEncoding: c(d.map, a.gammaInput),
				envMap: !!d.envMap,
				envMapMode: d.envMap && d.envMap.mapping,
				envMapEncoding: c(d.envMap, a.gammaInput),
				envMapCubeUV: !!d.envMap && (306 === d.envMap.mapping || 307 === d.envMap.mapping),
				lightMap: !!d.lightMap,
				aoMap: !!d.aoMap,
				emissiveMap: !!d.emissiveMap,
				emissiveMapEncoding: c(d.emissiveMap, a.gammaInput),
				bumpMap: !!d.bumpMap,
				normalMap: !!d.normalMap,
				displacementMap: !!d.displacementMap,
				roughnessMap: !!d.roughnessMap,
				metalnessMap: !!d.metalnessMap,
				specularMap: !!d.specularMap,
				alphaMap: !!d.alphaMap,
				gradientMap: !!d.gradientMap,
				combine: d.combine,
				vertexColors: d.vertexColors,
				fog: !!m,
				useFog: d.fog,
				fogExp: m && m.isFogExp2,
				flatShading: 1 === d.shading,
				sizeAttenuation: d.sizeAttenuation,
				logarithmicDepthBuffer: b.logarithmicDepthBuffer,
				skinning: d.skinning,
				maxBones: u,
				useVertexTexture: b.floatVertexTextures && p && p.skeleton && p.skeleton.useVertexTexture,
				morphTargets: d.morphTargets,
				morphNormals: d.morphNormals,
				maxMorphTargets: a.maxMorphTargets,
				maxMorphNormals: a.maxMorphNormals,
				numDirLights: f.directional.length,
				numPointLights: f.point.length,
				numSpotLights: f.spot.length,
				numRectAreaLights: f.rectArea.length,
				numHemiLights: f.hemi.length,
				numClippingPlanes: k,
				numClipIntersection: t,
				shadowMapEnabled: a.shadowMap.enabled && p.receiveShadow && 0 < f.shadows.length,
				shadowMapType: a.shadowMap.type,
				toneMapping: a.toneMapping,
				physicallyCorrectLights: a.physicallyCorrectLights,
				premultipliedAlpha: d.premultipliedAlpha,
				alphaTest: d.alphaTest,
				doubleSided: 2 === d.side,
				flipSided: 1 === d.side,
				depthPacking: void 0 !== d.depthPacking ? d.depthPacking: !1
			}
		};
		this.getProgramCode = function(a, b) {
			var c = [];
			b.shaderID ? c.push(b.shaderID) : (c.push(a.fragmentShader), c.push(a.vertexShader));
			if (void 0 !== a.defines) for (var d in a.defines) c.push(d),
			c.push(a.defines[d]);
			for (d = 0; d < f.length; d++) c.push(b[f[d]]);
			return c.join()
		};
		this.acquireProgram = function(b, c, e) {
			for (var f, t = 0,
			p = d.length; t < p; t++) {
				var n = d[t];
				if (n.code === e) {
					f = n; ++f.usedTimes;
					break
				}
			}
			void 0 === f && (f = new Kf(a, e, b, c), d.push(f));
			return f
		};
		this.releaseProgram = function(a) {
			if (0 === --a.usedTimes) {
				var b = d.indexOf(a);
				d[b] = d[d.length - 1];
				d.pop();
				a.destroy()
			}
		};
		this.programs = d
	}
	function Nf(a, b, c) {
		function d(a) {
			var h = a.target;
			a = f[h.id];
			null !== a.index && e(a.index);
			var m = a.attributes,
			k;
			for (k in m) e(m[k]);
			h.removeEventListener("dispose", d);
			delete f[h.id];
			k = b.get(h);
			k.wireframe && e(k.wireframe);
			b["delete"](h);
			h = b.get(a);
			h.wireframe && e(h.wireframe);
			b["delete"](a);
			c.memory.geometries--
		}
		function e(c) {
			var d;
			d = c.isInterleavedBufferAttribute ? b.get(c.data).__webglBuffer: b.get(c).__webglBuffer;
			void 0 !== d && (a.deleteBuffer(d), c.isInterleavedBufferAttribute ? b["delete"](c.data) : b["delete"](c))
		}
		var f = {};
		return {
			get: function(a) {
				var b = a.geometry;
				if (void 0 !== f[b.id]) return f[b.id];
				b.addEventListener("dispose", d);
				var e;
				b.isBufferGeometry ? e = b: b.isGeometry && (void 0 === b._bufferGeometry && (b._bufferGeometry = (new I).setFromObject(a)), e = b._bufferGeometry);
				f[b.id] = e;
				c.memory.geometries++;
				return e
			}
		}
	}
	function Of(a, b, c) {
		function d(c, d) {
			var e = c.isInterleavedBufferAttribute ? c.data: c,
			m = b.get(e);
			if (void 0 === m.__webglBuffer) {
				m.__webglBuffer = a.createBuffer();
				a.bindBuffer(d, m.__webglBuffer);
				a.bufferData(d, e.array, e.dynamic ? a.DYNAMIC_DRAW: a.STATIC_DRAW);
				var k = a.FLOAT,
				t = e.array;
				t instanceof Float32Array ? k = a.FLOAT: t instanceof Float64Array ? console.warn("Unsupported data buffer format: Float64Array") : t instanceof Uint16Array ? k = a.UNSIGNED_SHORT: t instanceof Int16Array ? k = a.SHORT: t instanceof Uint32Array ? k = a.UNSIGNED_INT: t instanceof Int32Array ? k = a.INT: t instanceof Int8Array ? k = a.BYTE: t instanceof Uint8Array && (k = a.UNSIGNED_BYTE);
				m.bytesPerElement = t.BYTES_PER_ELEMENT;
				m.type = k;
				m.version = e.version;
				e.onUploadCallback()
			} else m.version !== e.version && (a.bindBuffer(d, m.__webglBuffer), !1 === e.dynamic ? a.bufferData(d, e.array, a.STATIC_DRAW) : -1 === e.updateRange.count ? a.bufferSubData(d, 0, e.array) : 0 === e.updateRange.count ? console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.") : (a.bufferSubData(d, e.updateRange.offset * e.array.BYTES_PER_ELEMENT, e.array.subarray(e.updateRange.offset, e.updateRange.offset + e.updateRange.count)), e.updateRange.count = 0), m.version = e.version)
		}
		var e = new Nf(a, b, c);
		return {
			getAttributeBuffer: function(a) {
				return a.isInterleavedBufferAttribute ? b.get(a.data).__webglBuffer: b.get(a).__webglBuffer
			},
			getAttributeProperties: function(a) {
				return a.isInterleavedBufferAttribute ? b.get(a.data) : b.get(a)
			},
			getWireframeAttribute: function(c) {
				var e = b.get(c);
				if (void 0 !== e.wireframe) return e.wireframe;
				var h = [],
				m = c.index;
				c = c.attributes;
				if (null !== m) {
					m = m.array;
					c = 0;
					for (var k = m.length; c < k; c += 3) {
						var t = m[c + 0],
						p = m[c + 1],
						n = m[c + 2];
						h.push(t, p, p, n, n, t)
					}
				} else for (m = c.position.array, c = 0, k = m.length / 3 - 1; c < k; c += 3) t = c + 0,
				p = c + 1,
				n = c + 2,
				h.push(t, p, p, n, n, t);
				h = new(65535 < Ud(h) ? jb: ib)(h, 1);
				d(h, a.ELEMENT_ARRAY_BUFFER);
				return e.wireframe = h
			},
			update: function(b) {
				var c = e.get(b);
				b.geometry.isGeometry && c.updateFromObject(b);
				b = c.index;
				var h = c.attributes;
				null !== b && d(b, a.ELEMENT_ARRAY_BUFFER);
				for (var m in h) d(h[m], a.ARRAY_BUFFER);
				b = c.morphAttributes;
				for (m in b) for (var h = b[m], k = 0, t = h.length; k < t; k++) d(h[k], a.ARRAY_BUFFER);
				return c
			}
		}
	}
	function Pf(a, b, c, d, e, f, g) {
		function h(a, b) {
			if (a.width > b || a.height > b) {
				var c = b / Math.max(a.width, a.height),
				d = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
				d.width = Math.floor(a.width * c);
				d.height = Math.floor(a.height * c);
				d.getContext("2d").drawImage(a, 0, 0, a.width, a.height, 0, 0, d.width, d.height);
				console.warn("THREE.WebGLRenderer: image is too big (" + a.width + "x" + a.height + "). Resized to " + d.width + "x" + d.height, a);
				return d
			}
			return a
		}
		function m(a) {
			return N.isPowerOfTwo(a.width) && N.isPowerOfTwo(a.height)
		}
		function k(b) {
			return 1003 === b || 1004 === b || 1005 === b ? a.NEAREST: a.LINEAR
		}
		function t(b) {
			b = b.target;
			b.removeEventListener("dispose", t);
			a: {
				var c = d.get(b);
				if (b.image && c.__image__webglTextureCube) a.deleteTexture(c.__image__webglTextureCube);
				else {
					if (void 0 === c.__webglInit) break a;
					a.deleteTexture(c.__webglTexture)
				}
				d["delete"](b)
			}
			q.textures--
		}
		function p(b) {
			b = b.target;
			b.removeEventListener("dispose", p);
			var c = d.get(b),
			e = d.get(b.texture);
			if (b) {
				void 0 !== e.__webglTexture && a.deleteTexture(e.__webglTexture);
				b.depthTexture && b.depthTexture.dispose();
				if (b.isWebGLRenderTargetCube) for (e = 0; 6 > e; e++) a.deleteFramebuffer(c.__webglFramebuffer[e]),
				c.__webglDepthbuffer && a.deleteRenderbuffer(c.__webglDepthbuffer[e]);
				else a.deleteFramebuffer(c.__webglFramebuffer),
				c.__webglDepthbuffer && a.deleteRenderbuffer(c.__webglDepthbuffer);
				d["delete"](b.texture);
				d["delete"](b)
			}
			q.textures--
		}
		function n(b, g) {
			var k = d.get(b);
			if (0 < b.version && k.__version !== b.version) {
				var n = b.image;
				if (void 0 === n) console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined", b);
				else if (!1 === n.complete) console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete", b);
				else {
					void 0 === k.__webglInit && (k.__webglInit = !0, b.addEventListener("dispose", t), k.__webglTexture = a.createTexture(), q.textures++);
					c.activeTexture(a.TEXTURE0 + g);
					c.bindTexture(a.TEXTURE_2D, k.__webglTexture);
					a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL, b.flipY);
					a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL, b.premultiplyAlpha);
					a.pixelStorei(a.UNPACK_ALIGNMENT, b.unpackAlignment);
					var p = h(b.image, e.maxTextureSize);
					if ((1001 !== b.wrapS || 1001 !== b.wrapT || 1003 !== b.minFilter && 1006 !== b.minFilter) && !1 === m(p)) if (n = p, n instanceof HTMLImageElement || n instanceof HTMLCanvasElement) {
						var l = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
						l.width = N.nearestPowerOfTwo(n.width);
						l.height = N.nearestPowerOfTwo(n.height);
						l.getContext("2d").drawImage(n, 0, 0, l.width, l.height);
						console.warn("THREE.WebGLRenderer: image is not power of two (" + n.width + "x" + n.height + "). Resized to " + l.width + "x" + l.height, n);
						p = l
					} else p = n;
					var n = m(p),
					l = f(b.format),
					G = f(b.type);
					u(a.TEXTURE_2D, b, n);
					var r = b.mipmaps;
					if (b.isDepthTexture) {
						r = a.DEPTH_COMPONENT;
						if (1015 === b.type) {
							if (!w) throw Error("Float Depth Texture only supported in WebGL2.0");
							r = a.DEPTH_COMPONENT32F
						} else w && (r = a.DEPTH_COMPONENT16);
						1026 === b.format && r === a.DEPTH_COMPONENT && 1012 !== b.type && 1014 !== b.type && (console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."), b.type = 1012, G = f(b.type));
						1027 === b.format && (r = a.DEPTH_STENCIL, 1020 !== b.type && (console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."), b.type = 1020, G = f(b.type)));
						c.texImage2D(a.TEXTURE_2D, 0, r, p.width, p.height, 0, l, G, null)
					} else if (b.isDataTexture) if (0 < r.length && n) {
						for (var H = 0,
						aa = r.length; H < aa; H++) p = r[H],
						c.texImage2D(a.TEXTURE_2D, H, l, p.width, p.height, 0, l, G, p.data);
						b.generateMipmaps = !1
					} else c.texImage2D(a.TEXTURE_2D, 0, l, p.width, p.height, 0, l, G, p.data);
					else if (b.isCompressedTexture) for (H = 0, aa = r.length; H < aa; H++) p = r[H],
					1023 !== b.format && 1022 !== b.format ? -1 < c.getCompressedTextureFormats().indexOf(l) ? c.compressedTexImage2D(a.TEXTURE_2D, H, l, p.width, p.height, 0, p.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()") : c.texImage2D(a.TEXTURE_2D, H, l, p.width, p.height, 0, l, G, p.data);
					else if (0 < r.length && n) {
						H = 0;
						for (aa = r.length; H < aa; H++) p = r[H],
						c.texImage2D(a.TEXTURE_2D, H, l, l, G, p);
						b.generateMipmaps = !1
					} else c.texImage2D(a.TEXTURE_2D, 0, l, l, G, p);
					b.generateMipmaps && n && a.generateMipmap(a.TEXTURE_2D);
					k.__version = b.version;
					if (b.onUpdate) b.onUpdate(b);
					return
				}
			}
			c.activeTexture(a.TEXTURE0 + g);
			c.bindTexture(a.TEXTURE_2D, k.__webglTexture)
		}
		function u(c, g, h) {
			h ? (a.texParameteri(c, a.TEXTURE_WRAP_S, f(g.wrapS)), a.texParameteri(c, a.TEXTURE_WRAP_T, f(g.wrapT)), a.texParameteri(c, a.TEXTURE_MAG_FILTER, f(g.magFilter)), a.texParameteri(c, a.TEXTURE_MIN_FILTER, f(g.minFilter))) : (a.texParameteri(c, a.TEXTURE_WRAP_S, a.CLAMP_TO_EDGE), a.texParameteri(c, a.TEXTURE_WRAP_T, a.CLAMP_TO_EDGE), 1001 === g.wrapS && 1001 === g.wrapT || console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.", g), a.texParameteri(c, a.TEXTURE_MAG_FILTER, k(g.magFilter)), a.texParameteri(c, a.TEXTURE_MIN_FILTER, k(g.minFilter)), 1003 !== g.minFilter && 1006 !== g.minFilter && console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.", g)); ! (h = b.get("EXT_texture_filter_anisotropic")) || 1015 === g.type && null === b.get("OES_texture_float_linear") || 1016 === g.type && null === b.get("OES_texture_half_float_linear") || !(1 < g.anisotropy || d.get(g).__currentAnisotropy) || (a.texParameterf(c, h.TEXTURE_MAX_ANISOTROPY_EXT, Math.min(g.anisotropy, e.getMaxAnisotropy())), d.get(g).__currentAnisotropy = g.anisotropy)
		}
		function l(b, e, g, h) {
			var m = f(e.texture.format),
			k = f(e.texture.type);
			c.texImage2D(h, 0, m, e.width, e.height, 0, m, k, null);
			a.bindFramebuffer(a.FRAMEBUFFER, b);
			a.framebufferTexture2D(a.FRAMEBUFFER, g, h, d.get(e.texture).__webglTexture, 0);
			a.bindFramebuffer(a.FRAMEBUFFER, null)
		}
		function r(b, c) {
			a.bindRenderbuffer(a.RENDERBUFFER, b);
			c.depthBuffer && !c.stencilBuffer ? (a.renderbufferStorage(a.RENDERBUFFER, a.DEPTH_COMPONENT16, c.width, c.height), a.framebufferRenderbuffer(a.FRAMEBUFFER, a.DEPTH_ATTACHMENT, a.RENDERBUFFER, b)) : c.depthBuffer && c.stencilBuffer ? (a.renderbufferStorage(a.RENDERBUFFER, a.DEPTH_STENCIL, c.width, c.height), a.framebufferRenderbuffer(a.FRAMEBUFFER, a.DEPTH_STENCIL_ATTACHMENT, a.RENDERBUFFER, b)) : a.renderbufferStorage(a.RENDERBUFFER, a.RGBA4, c.width, c.height);
			a.bindRenderbuffer(a.RENDERBUFFER, null)
		}
		var q = g.memory,
		w = "undefined" !== typeof WebGL2RenderingContext && a instanceof WebGL2RenderingContext;
		this.setTexture2D = n;
		this.setTextureCube = function(b, g) {
			var k = d.get(b);
			if (6 === b.image.length) if (0 < b.version && k.__version !== b.version) {
				k.__image__webglTextureCube || (b.addEventListener("dispose", t), k.__image__webglTextureCube = a.createTexture(), q.textures++);
				c.activeTexture(a.TEXTURE0 + g);
				c.bindTexture(a.TEXTURE_CUBE_MAP, k.__image__webglTextureCube);
				a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL, b.flipY);
				for (var n = b && b.isCompressedTexture,
				p = b.image[0] && b.image[0].isDataTexture, l = [], r = 0; 6 > r; r++) l[r] = n || p ? p ? b.image[r].image: b.image[r] : h(b.image[r], e.maxCubemapSize);
				var G = m(l[0]),
				w = f(b.format),
				aa = f(b.type);
				u(a.TEXTURE_CUBE_MAP, b, G);
				for (r = 0; 6 > r; r++) if (n) for (var x, D = l[r].mipmaps, z = 0, Q = D.length; z < Q; z++) x = D[z],
				1023 !== b.format && 1022 !== b.format ? -1 < c.getCompressedTextureFormats().indexOf(w) ? c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + r, z, w, x.width, x.height, 0, x.data) : console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()") : c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + r, z, w, x.width, x.height, 0, w, aa, x.data);
				else p ? c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + r, 0, w, l[r].width, l[r].height, 0, w, aa, l[r].data) : c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X + r, 0, w, w, aa, l[r]);
				b.generateMipmaps && G && a.generateMipmap(a.TEXTURE_CUBE_MAP);
				k.__version = b.version;
				if (b.onUpdate) b.onUpdate(b)
			} else c.activeTexture(a.TEXTURE0 + g),
			c.bindTexture(a.TEXTURE_CUBE_MAP, k.__image__webglTextureCube)
		};
		this.setTextureCubeDynamic = function(b, e) {
			c.activeTexture(a.TEXTURE0 + e);
			c.bindTexture(a.TEXTURE_CUBE_MAP, d.get(b).__webglTexture)
		};
		this.setupRenderTarget = function(b) {
			var e = d.get(b),
			f = d.get(b.texture);
			b.addEventListener("dispose", p);
			f.__webglTexture = a.createTexture();
			q.textures++;
			var g = !0 === b.isWebGLRenderTargetCube,
			h = m(b);
			if (g) {
				e.__webglFramebuffer = [];
				for (var k = 0; 6 > k; k++) e.__webglFramebuffer[k] = a.createFramebuffer()
			} else e.__webglFramebuffer = a.createFramebuffer();
			if (g) {
				c.bindTexture(a.TEXTURE_CUBE_MAP, f.__webglTexture);
				u(a.TEXTURE_CUBE_MAP, b.texture, h);
				for (k = 0; 6 > k; k++) l(e.__webglFramebuffer[k], b, a.COLOR_ATTACHMENT0, a.TEXTURE_CUBE_MAP_POSITIVE_X + k);
				b.texture.generateMipmaps && h && a.generateMipmap(a.TEXTURE_CUBE_MAP);
				c.bindTexture(a.TEXTURE_CUBE_MAP, null)
			} else c.bindTexture(a.TEXTURE_2D, f.__webglTexture),
			u(a.TEXTURE_2D, b.texture, h),
			l(e.__webglFramebuffer, b, a.COLOR_ATTACHMENT0, a.TEXTURE_2D),
			b.texture.generateMipmaps && h && a.generateMipmap(a.TEXTURE_2D),
			c.bindTexture(a.TEXTURE_2D, null);
			if (b.depthBuffer) {
				e = d.get(b);
				f = !0 === b.isWebGLRenderTargetCube;
				if (b.depthTexture) {
					if (f) throw Error("target.depthTexture not supported in Cube render targets");
					if (b && b.isWebGLRenderTargetCube) throw Error("Depth Texture with cube render targets is not supported!");
					a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer);
					if (!b.depthTexture || !b.depthTexture.isDepthTexture) throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");
					d.get(b.depthTexture).__webglTexture && b.depthTexture.image.width === b.width && b.depthTexture.image.height === b.height || (b.depthTexture.image.width = b.width, b.depthTexture.image.height = b.height, b.depthTexture.needsUpdate = !0);
					n(b.depthTexture, 0);
					e = d.get(b.depthTexture).__webglTexture;
					if (1026 === b.depthTexture.format) a.framebufferTexture2D(a.FRAMEBUFFER, a.DEPTH_ATTACHMENT, a.TEXTURE_2D, e, 0);
					else if (1027 === b.depthTexture.format) a.framebufferTexture2D(a.FRAMEBUFFER, a.DEPTH_STENCIL_ATTACHMENT, a.TEXTURE_2D, e, 0);
					else throw Error("Unknown depthTexture format");
				} else if (f) for (e.__webglDepthbuffer = [], f = 0; 6 > f; f++) a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer[f]),
				e.__webglDepthbuffer[f] = a.createRenderbuffer(),
				r(e.__webglDepthbuffer[f], b);
				else a.bindFramebuffer(a.FRAMEBUFFER, e.__webglFramebuffer),
				e.__webglDepthbuffer = a.createRenderbuffer(),
				r(e.__webglDepthbuffer, b);
				a.bindFramebuffer(a.FRAMEBUFFER, null)
			}
		};
		this.updateRenderTargetMipmap = function(b) {
			var e = b.texture;
			e.generateMipmaps && m(b) && 1003 !== e.minFilter && 1006 !== e.minFilter && (b = b && b.isWebGLRenderTargetCube ? a.TEXTURE_CUBE_MAP: a.TEXTURE_2D, e = d.get(e).__webglTexture, c.bindTexture(b, e), a.generateMipmap(b), c.bindTexture(b, null))
		}
	}
	function Qf() {
		var a = {};
		return {
			get: function(b) {
				b = b.uuid;
				var c = a[b];
				void 0 === c && (c = {},
				a[b] = c);
				return c
			},
			"delete": function(b) {
				delete a[b.uuid]
			},
			clear: function() {
				a = {}
			}
		}
	}
	function Rf(a, b, c) {
		function d(b, c, d) {
			var e = new Uint8Array(4),
			f = a.createTexture();
			a.bindTexture(b, f);
			a.texParameteri(b, a.TEXTURE_MIN_FILTER, a.NEAREST);
			a.texParameteri(b, a.TEXTURE_MAG_FILTER, a.NEAREST);
			for (b = 0; b < d; b++) a.texImage2D(c + b, 0, a.RGBA, 1, 1, 0, a.RGBA, a.UNSIGNED_BYTE, e);
			return f
		}
		function e(b) { ! 0 !== y[b] && (a.enable(b), y[b] = !0)
		}
		function f(b) { ! 1 !== y[b] && (a.disable(b), y[b] = !1)
		}
		function g(b, d, g, h, m, k, n, t) {
			0 !== b ? e(a.BLEND) : f(a.BLEND);
			if (b !== v || t !== x) 2 === b ? t ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ONE, a.ONE, a.ONE, a.ONE)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.SRC_ALPHA, a.ONE)) : 3 === b ? t ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ZERO, a.ZERO, a.ONE_MINUS_SRC_COLOR, a.ONE_MINUS_SRC_ALPHA)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.ZERO, a.ONE_MINUS_SRC_COLOR)) : 4 === b ? t ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ZERO, a.SRC_COLOR, a.ZERO, a.SRC_ALPHA)) : (a.blendEquation(a.FUNC_ADD), a.blendFunc(a.ZERO, a.SRC_COLOR)) : t ? (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.ONE, a.ONE_MINUS_SRC_ALPHA, a.ONE, a.ONE_MINUS_SRC_ALPHA)) : (a.blendEquationSeparate(a.FUNC_ADD, a.FUNC_ADD), a.blendFuncSeparate(a.SRC_ALPHA, a.ONE_MINUS_SRC_ALPHA, a.ONE, a.ONE_MINUS_SRC_ALPHA)),
			v = b,
			x = t;
			if (5 === b) {
				m = m || d;
				k = k || g;
				n = n || h;
				if (d !== E || m !== F) a.blendEquationSeparate(c(d), c(m)),
				E = d,
				F = m;
				if (g !== L || h !== C || k !== da || n !== H) a.blendFuncSeparate(c(g), c(h), c(k), c(n)),
				L = g,
				C = h,
				da = k,
				H = n
			} else H = da = F = C = L = E = null
		}
		function h(a) {
			n.setFunc(a)
		}
		function m(b) {
			D !== b && (b ? a.frontFace(a.CW) : a.frontFace(a.CCW), D = b)
		}
		function k(b) {
			0 !== b ? (e(a.CULL_FACE), b !== z && (1 === b ? a.cullFace(a.BACK) : 2 === b ? a.cullFace(a.FRONT) : a.cullFace(a.FRONT_AND_BACK))) : f(a.CULL_FACE);
			z = b
		}
		function t(b) {
			void 0 === b && (b = a.TEXTURE0 + P - 1);
			W !== b && (a.activeTexture(b), W = b)
		}
		var p = new
		function() {
			var b = !1,
			c = new fa,
			d = null,
			e = new fa;
			return {
				setMask: function(c) {
					d === c || b || (a.colorMask(c, c, c, c), d = c)
				},
				setLocked: function(a) {
					b = a
				},
				setClear: function(b, d, f, g, h) { ! 0 === h && (b *= g, d *= g, f *= g);
					c.set(b, d, f, g); ! 1 === e.equals(c) && (a.clearColor(b, d, f, g), e.copy(c))
				},
				reset: function() {
					b = !1;
					d = null;
					e.set(0, 0, 0, 1)
				}
			}
		},
		n = new
		function() {
			var b = !1,
			c = null,
			d = null,
			g = null;
			return {
				setTest: function(b) {
					b ? e(a.DEPTH_TEST) : f(a.DEPTH_TEST)
				},
				setMask: function(d) {
					c === d || b || (a.depthMask(d), c = d)
				},
				setFunc: function(b) {
					if (d !== b) {
						if (b) switch (b) {
						case 0:
							a.depthFunc(a.NEVER);
							break;
						case 1:
							a.depthFunc(a.ALWAYS);
							break;
						case 2:
							a.depthFunc(a.LESS);
							break;
						case 3:
							a.depthFunc(a.LEQUAL);
							break;
						case 4:
							a.depthFunc(a.EQUAL);
							break;
						case 5:
							a.depthFunc(a.GEQUAL);
							break;
						case 6:
							a.depthFunc(a.GREATER);
							break;
						case 7:
							a.depthFunc(a.NOTEQUAL);
							break;
						default:
							a.depthFunc(a.LEQUAL)
						} else a.depthFunc(a.LEQUAL);
						d = b
					}
				},
				setLocked: function(a) {
					b = a
				},
				setClear: function(b) {
					g !== b && (a.clearDepth(b), g = b)
				},
				reset: function() {
					b = !1;
					g = d = c = null
				}
			}
		},
		u = new
		function() {
			var b = !1,
			c = null,
			d = null,
			g = null,
			h = null,
			m = null,
			k = null,
			n = null,
			t = null;
			return {
				setTest: function(b) {
					b ? e(a.STENCIL_TEST) : f(a.STENCIL_TEST)
				},
				setMask: function(d) {
					c === d || b || (a.stencilMask(d), c = d)
				},
				setFunc: function(b, c, e) {
					if (d !== b || g !== c || h !== e) a.stencilFunc(b, c, e),
					d = b,
					g = c,
					h = e
				},
				setOp: function(b, c, d) {
					if (m !== b || k !== c || n !== d) a.stencilOp(b, c, d),
					m = b,
					k = c,
					n = d
				},
				setLocked: function(a) {
					b = a
				},
				setClear: function(b) {
					t !== b && (a.clearStencil(b), t = b)
				},
				reset: function() {
					b = !1;
					t = n = k = m = h = g = d = c = null
				}
			}
		},
		l = a.getParameter(a.MAX_VERTEX_ATTRIBS),
		r = new Uint8Array(l),
		q = new Uint8Array(l),
		w = new Uint8Array(l),
		y = {},
		K = null,
		v = null,
		E = null,
		L = null,
		C = null,
		F = null,
		da = null,
		H = null,
		x = !1,
		D = null,
		z = null,
		J = null,
		Q = null,
		M = null,
		O = null,
		P = a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),
		l = parseFloat(/^WebGL\ ([0-9])/.exec(a.getParameter(a.VERSION))[1]),
		I = 1 <= parseFloat(l),
		W = null,
		S = {},
		R = new fa,
		T = new fa,
		N = {};
		N[a.TEXTURE_2D] = d(a.TEXTURE_2D, a.TEXTURE_2D, 1);
		N[a.TEXTURE_CUBE_MAP] = d(a.TEXTURE_CUBE_MAP, a.TEXTURE_CUBE_MAP_POSITIVE_X, 6);
		return {
			buffers: {
				color: p,
				depth: n,
				stencil: u
			},
			init: function() {
				p.setClear(0, 0, 0, 1);
				n.setClear(1);
				u.setClear(0);
				e(a.DEPTH_TEST);
				h(3);
				m(!1);
				k(1);
				e(a.CULL_FACE);
				e(a.BLEND);
				g(1)
			},
			initAttributes: function() {
				for (var a = 0,
				b = r.length; a < b; a++) r[a] = 0
			},
			enableAttribute: function(c) {
				r[c] = 1;
				0 === q[c] && (a.enableVertexAttribArray(c), q[c] = 1);
				0 !== w[c] && (b.get("ANGLE_instanced_arrays").vertexAttribDivisorANGLE(c, 0), w[c] = 0)
			},
			enableAttributeAndDivisor: function(b, c, d) {
				r[b] = 1;
				0 === q[b] && (a.enableVertexAttribArray(b), q[b] = 1);
				w[b] !== c && (d.vertexAttribDivisorANGLE(b, c), w[b] = c)
			},
			disableUnusedAttributes: function() {
				for (var b = 0,
				c = q.length; b !== c; ++b) q[b] !== r[b] && (a.disableVertexAttribArray(b), q[b] = 0)
			},
			enable: e,
			disable: f,
			getCompressedTextureFormats: function() {
				if (null === K && (K = [], b.get("WEBGL_compressed_texture_pvrtc") || b.get("WEBGL_compressed_texture_s3tc") || b.get("WEBGL_compressed_texture_etc1"))) for (var c = a.getParameter(a.COMPRESSED_TEXTURE_FORMATS), d = 0; d < c.length; d++) K.push(c[d]);
				return K
			},
			setBlending: g,
			setColorWrite: function(a) {
				p.setMask(a)
			},
			setDepthTest: function(a) {
				n.setTest(a)
			},
			setDepthWrite: function(a) {
				n.setMask(a)
			},
			setDepthFunc: h,
			setStencilTest: function(a) {
				u.setTest(a)
			},
			setStencilWrite: function(a) {
				u.setMask(a)
			},
			setStencilFunc: function(a, b, c) {
				u.setFunc(a, b, c)
			},
			setStencilOp: function(a, b, c) {
				u.setOp(a, b, c)
			},
			setFlipSided: m,
			setCullFace: k,
			setLineWidth: function(b) {
				b !== J && (I && a.lineWidth(b), J = b)
			},
			setPolygonOffset: function(b, c, d) {
				if (b) {
					if (e(a.POLYGON_OFFSET_FILL), Q !== c || M !== d) a.polygonOffset(c, d),
					Q = c,
					M = d
				} else f(a.POLYGON_OFFSET_FILL)
			},
			getScissorTest: function() {
				return O
			},
			setScissorTest: function(b) { (O = b) ? e(a.SCISSOR_TEST) : f(a.SCISSOR_TEST)
			},
			activeTexture: t,
			bindTexture: function(b, c) {
				null === W && t();
				var d = S[W];
				void 0 === d && (d = {
					type: void 0,
					texture: void 0
				},
				S[W] = d);
				if (d.type !== b || d.texture !== c) a.bindTexture(b, c || N[b]),
				d.type = b,
				d.texture = c
			},
			compressedTexImage2D: function() {
				try {
					a.compressedTexImage2D.apply(a, arguments)
				} catch(b) {
					console.error(b)
				}
			},
			texImage2D: function() {
				try {
					a.texImage2D.apply(a, arguments)
				} catch(b) {
					console.error(b)
				}
			},
			scissor: function(b) { ! 1 === R.equals(b) && (a.scissor(b.x, b.y, b.z, b.w), R.copy(b))
			},
			viewport: function(b) { ! 1 === T.equals(b) && (a.viewport(b.x, b.y, b.z, b.w), T.copy(b))
			},
			reset: function() {
				for (var b = 0; b < q.length; b++) 1 === q[b] && (a.disableVertexAttribArray(b), q[b] = 0);
				y = {};
				W = K = null;
				S = {};
				z = D = v = null;
				p.reset();
				n.reset();
				u.reset()
			}
		}
	}
	function Sf(a, b, c) {
		function d(b) {
			if ("highp" === b) {
				if (0 < a.getShaderPrecisionFormat(a.VERTEX_SHADER, a.HIGH_FLOAT).precision && 0 < a.getShaderPrecisionFormat(a.FRAGMENT_SHADER, a.HIGH_FLOAT).precision) return "highp";
				b = "mediump"
			}
			return "mediump" === b && 0 < a.getShaderPrecisionFormat(a.VERTEX_SHADER, a.MEDIUM_FLOAT).precision && 0 < a.getShaderPrecisionFormat(a.FRAGMENT_SHADER, a.MEDIUM_FLOAT).precision ? "mediump": "lowp"
		}
		var e, f = void 0 !== c.precision ? c.precision: "highp",
		g = d(f);
		g !== f && (console.warn("THREE.WebGLRenderer:", f, "not supported, using", g, "instead."), f = g);
		c = !0 === c.logarithmicDepthBuffer && !!b.get("EXT_frag_depth");
		var g = a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS),
		h = a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),
		m = a.getParameter(a.MAX_TEXTURE_SIZE),
		k = a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),
		t = a.getParameter(a.MAX_VERTEX_ATTRIBS),
		p = a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),
		n = a.getParameter(a.MAX_VARYING_VECTORS),
		u = a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),
		l = 0 < h,
		r = !!b.get("OES_texture_float");
		return {
			getMaxAnisotropy: function() {
				if (void 0 !== e) return e;
				var c = b.get("EXT_texture_filter_anisotropic");
				return e = null !== c ? a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 0
			},
			getMaxPrecision: d,
			precision: f,
			logarithmicDepthBuffer: c,
			maxTextures: g,
			maxVertexTextures: h,
			maxTextureSize: m,
			maxCubemapSize: k,
			maxAttributes: t,
			maxVertexUniforms: p,
			maxVaryings: n,
			maxFragmentUniforms: u,
			vertexTextures: l,
			floatFragmentTextures: r,
			floatVertexTextures: l && r
		}
	}
	function Tf(a) {
		var b = {};
		return {
			get: function(c) {
				if (void 0 !== b[c]) return b[c];
				var d;
				switch (c) {
				case "WEBGL_depth_texture":
					d = a.getExtension("WEBGL_depth_texture") || a.getExtension("MOZ_WEBGL_depth_texture") || a.getExtension("WEBKIT_WEBGL_depth_texture");
					break;
				case "EXT_texture_filter_anisotropic":
					d = a.getExtension("EXT_texture_filter_anisotropic") || a.getExtension("MOZ_EXT_texture_filter_anisotropic") || a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");
					break;
				case "WEBGL_compressed_texture_s3tc":
					d = a.getExtension("WEBGL_compressed_texture_s3tc") || a.getExtension("MOZ_WEBGL_compressed_texture_s3tc") || a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");
					break;
				case "WEBGL_compressed_texture_pvrtc":
					d = a.getExtension("WEBGL_compressed_texture_pvrtc") || a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
					break;
				case "WEBGL_compressed_texture_etc1":
					d = a.getExtension("WEBGL_compressed_texture_etc1");
					break;
				default:
					d = a.getExtension(c)
				}
				null === d && console.warn("THREE.WebGLRenderer: " + c + " extension not supported.");
				return b[c] = d
			}
		}
	}
	function Uf() {
		function a() {
			k.value !== d && (k.value = d, k.needsUpdate = 0 < e);
			c.numPlanes = e;
			c.numIntersection = 0
		}
		function b(a, b, d, e) {
			var f = null !== a ? a.length: 0,
			g = null;
			if (0 !== f) {
				g = k.value;
				if (!0 !== e || null === g) {
					e = d + 4 * f;
					b = b.matrixWorldInverse;
					m.getNormalMatrix(b);
					if (null === g || g.length < e) g = new Float32Array(e);
					for (e = 0; e !== f; ++e, d += 4) h.copy(a[e]).applyMatrix4(b, m),
					h.normal.toArray(g, d),
					g[d + 3] = h.constant
				}
				k.value = g;
				k.needsUpdate = !0
			}
			c.numPlanes = f;
			return g
		}
		var c = this,
		d = null,
		e = 0,
		f = !1,
		g = !1,
		h = new la,
		m = new ya,
		k = {
			value: null,
			needsUpdate: !1
		};
		this.uniform = k;
		this.numIntersection = this.numPlanes = 0;
		this.init = function(a, c, g) {
			var h = 0 !== a.length || c || 0 !== e || f;
			f = c;
			d = b(a, g, 0);
			e = a.length;
			return h
		};
		this.beginShadows = function() {
			g = !0;
			b(null)
		};
		this.endShadows = function() {
			g = !1;
			a()
		};
		this.setState = function(c, h, m, l, G, r) {
			if (!f || null === c || 0 === c.length || g && !m) g ? b(null) : a();
			else {
				m = g ? 0 : e;
				var q = 4 * m,
				w = G.clippingState || null;
				k.value = w;
				w = b(c, l, q, r);
				for (c = 0; c !== q; ++c) w[c] = d[c];
				G.clippingState = w;
				this.numIntersection = h ? this.numPlanes: 0;
				this.numPlanes += m
			}
		}
	}
	function Yd(a) {
		function b() {
			Y.init();
			Y.scissor(X.copy(ga).multiplyScalar(Ra));
			Y.viewport(Z.copy(ia).multiplyScalar(Ra));
			Y.buffers.color.setClear(Ea.r, Ea.g, Ea.b, gb, F)
		}
		function c() {
			U = wa = null;
			V = "";
			R = -1;
			Y.reset()
		}
		function d(a) {
			a.preventDefault();
			c();
			b();
			ha.clear()
		}
		function e(a) {
			a = a.target;
			a.removeEventListener("dispose", e);
			f(a);
			ha["delete"](a)
		}
		function f(a) {
			var b = ha.get(a).program;
			a.program = void 0;
			void 0 !== b && ya.releaseProgram(b)
		}
		function g(a, b) {
			return Math.abs(b[0]) - Math.abs(a[0])
		}
		function h(a, b) {
			return a.object.renderOrder !== b.object.renderOrder ? a.object.renderOrder - b.object.renderOrder: a.material.program && b.material.program && a.material.program !== b.material.program ? a.material.program.id - b.material.program.id: a.material.id !== b.material.id ? a.material.id - b.material.id: a.z !== b.z ? a.z - b.z: a.id - b.id
		}
		function m(a, b) {
			return a.object.renderOrder !== b.object.renderOrder ? a.object.renderOrder - b.object.renderOrder: a.z !== b.z ? b.z - a.z: a.id - b.id
		}
		function k(a, b, c, d, e) {
			var f;
			c.transparent ? (d = z, f = ++T) : (d = aa, f = ++D);
			f = d[f];
			void 0 !== f ? (f.id = a.id, f.object = a, f.geometry = b, f.material = c, f.z = Ga.z, f.group = e) : (f = {
				id: a.id,
				object: a,
				geometry: b,
				material: c,
				z: Ga.z,
				group: e
			},
			d.push(f))
		}
		function t(a) {
			if (!ma.intersectsSphere(a)) return ! 1;
			var b = ca.numPlanes;
			if (0 === b) return ! 0;
			var c = P.clippingPlanes,
			d = a.center;
			a = -a.radius;
			var e = 0;
			do
			if (c[e].distanceToPoint(d) < a) return ! 1;
			while (++e !== b);
			return ! 0
		}
		function p(a, b) {
			if (!1 !== a.visible) {
				if (0 !== (a.layers.mask & b.layers.mask)) if (a.isLight) H.push(a);
				else if (a.isSprite) {
					var c; (c = !1 === a.frustumCulled) || (na.center.set(0, 0, 0), na.radius = .7071067811865476, na.applyMatrix4(a.matrixWorld), c = !0 === t(na));
					c && M.push(a)
				} else if (a.isLensFlare) O.push(a);
				else if (a.isImmediateRenderObject) ! 0 === P.sortObjects && (Ga.setFromMatrixPosition(a.matrixWorld), Ga.applyMatrix4(ua)),
				k(a, null, a.material, Ga.z, null);
				else if (a.isMesh || a.isLine || a.isPoints) if (a.isSkinnedMesh && a.skeleton.update(), (c = !1 === a.frustumCulled) || (c = a.geometry, null === c.boundingSphere && c.computeBoundingSphere(), na.copy(c.boundingSphere).applyMatrix4(a.matrixWorld), c = !0 === t(na)), c) {
					var d = a.material;
					if (!0 === d.visible) if (!0 === P.sortObjects && (Ga.setFromMatrixPosition(a.matrixWorld), Ga.applyMatrix4(ua)), c = qa.update(a), d.isMultiMaterial) for (var e = c.groups,
					f = d.materials,
					d = 0,
					g = e.length; d < g; d++) {
						var h = e[d],
						m = f[h.materialIndex]; ! 0 === m.visible && k(a, c, m, Ga.z, h)
					} else k(a, c, d, Ga.z, null)
				}
				c = a.children;
				d = 0;
				for (g = c.length; d < g; d++) p(c[d], b)
			}
		}
		function n(a, b, c, d) {
			for (var e = 0,
			f = a.length; e < f; e++) {
				var g = a[e],
				h = g.object,
				m = g.geometry,
				k = void 0 === d ? g.material: d,
				g = g.group;
				h.modelViewMatrix.multiplyMatrices(c.matrixWorldInverse, h.matrixWorld);
				h.normalMatrix.getNormalMatrix(h.modelViewMatrix);
				h.onBeforeRender(P, b, c, m, k, g);
				if (h.isImmediateRenderObject) {
					l(k);
					var n = G(c, b.fog, k, h);
					V = "";
					h.render(function(a) {
						P.renderBufferImmediate(a, n, k)
					})
				} else P.renderBufferDirect(c, b.fog, m, k, h, g);
				h.onAfterRender(P, b, c, m, k, g)
			}
		}
		function l(a) {
			2 === a.side ? Y.disable(B.CULL_FACE) : Y.enable(B.CULL_FACE);
			Y.setFlipSided(1 === a.side); ! 0 === a.transparent ? Y.setBlending(a.blending, a.blendEquation, a.blendSrc, a.blendDst, a.blendEquationAlpha, a.blendSrcAlpha, a.blendDstAlpha, a.premultipliedAlpha) : Y.setBlending(0);
			Y.setDepthFunc(a.depthFunc);
			Y.setDepthTest(a.depthTest);
			Y.setDepthWrite(a.depthWrite);
			Y.setColorWrite(a.colorWrite);
			Y.setPolygonOffset(a.polygonOffset, a.polygonOffsetFactor, a.polygonOffsetUnits)
		}
		function G(a, b, c, d) {
			ea = 0;
			var g = ha.get(c);
			oa && (ra || a !== U) && ca.setState(c.clippingPlanes, c.clipIntersection, c.clipShadows, a, g, a === U && c.id === R); ! 1 === c.needsUpdate && (void 0 === g.program ? c.needsUpdate = !0 : c.fog && g.fog !== b ? c.needsUpdate = !0 : c.lights && g.lightsHash !== ba.hash ? c.needsUpdate = !0 : void 0 === g.numClippingPlanes || g.numClippingPlanes === ca.numPlanes && g.numIntersection === ca.numIntersection || (c.needsUpdate = !0));
			if (c.needsUpdate) {
				a: {
					var h = ha.get(c),
					m = ya.getParameters(c, ba, b, ca.numPlanes, ca.numIntersection, d),
					k = ya.getProgramCode(c, m),
					n = h.program,
					t = !0;
					if (void 0 === n) c.addEventListener("dispose", e);
					else if (n.code !== k) f(c);
					else if (void 0 !== m.shaderID) break a;
					else t = !1;
					t && (m.shaderID ? (n = bb[m.shaderID], h.__webglShader = {
						name: c.type,
						uniforms: Ja.clone(n.uniforms),
						vertexShader: n.vertexShader,
						fragmentShader: n.fragmentShader
					}) : h.__webglShader = {
						name: c.type,
						uniforms: c.uniforms,
						vertexShader: c.vertexShader,
						fragmentShader: c.fragmentShader
					},
					c.__webglShader = h.__webglShader, n = ya.acquireProgram(c, m, k), h.program = n, c.program = n);
					m = n.getAttributes();
					if (c.morphTargets) for (k = c.numSupportedMorphTargets = 0; k < P.maxMorphTargets; k++) 0 <= m["morphTarget" + k] && c.numSupportedMorphTargets++;
					if (c.morphNormals) for (k = c.numSupportedMorphNormals = 0; k < P.maxMorphNormals; k++) 0 <= m["morphNormal" + k] && c.numSupportedMorphNormals++;
					m = h.__webglShader.uniforms;
					if (!c.isShaderMaterial && !c.isRawShaderMaterial || !0 === c.clipping) h.numClippingPlanes = ca.numPlanes,
					h.numIntersection = ca.numIntersection,
					m.clippingPlanes = ca.uniform;
					h.fog = b;
					h.lightsHash = ba.hash;
					c.lights && (m.ambientLightColor.value = ba.ambient, m.directionalLights.value = ba.directional, m.spotLights.value = ba.spot, m.rectAreaLights.value = ba.rectArea, m.pointLights.value = ba.point, m.hemisphereLights.value = ba.hemi, m.directionalShadowMap.value = ba.directionalShadowMap, m.directionalShadowMatrix.value = ba.directionalShadowMatrix, m.spotShadowMap.value = ba.spotShadowMap, m.spotShadowMatrix.value = ba.spotShadowMatrix, m.pointShadowMap.value = ba.pointShadowMap, m.pointShadowMatrix.value = ba.pointShadowMatrix);
					k = h.program.getUniforms();
					m = $a.seqWithValue(k.seq, m);
					h.uniformsList = m
				}
				c.needsUpdate = !1
			}
			var p = !1,
			t = n = !1,
			h = g.program,
			m = h.getUniforms(),
			k = g.__webglShader.uniforms;
			h.id !== wa && (B.useProgram(h.program), wa = h.id, t = n = p = !0);
			c.id !== R && (R = c.id, n = !0);
			if (p || a !== U) {
				m.set(B, a, "projectionMatrix");
				la.logarithmicDepthBuffer && m.setValue(B, "logDepthBufFC", 2 / (Math.log(a.far + 1) / Math.LN2));
				a !== U && (U = a, t = n = !0);
				if (c.isShaderMaterial || c.isMeshPhongMaterial || c.isMeshStandardMaterial || c.envMap) p = m.map.cameraPosition,
				void 0 !== p && p.setValue(B, Ga.setFromMatrixPosition(a.matrixWorld)); (c.isMeshPhongMaterial || c.isMeshLambertMaterial || c.isMeshBasicMaterial || c.isMeshStandardMaterial || c.isShaderMaterial || c.skinning) && m.setValue(B, "viewMatrix", a.matrixWorldInverse);
				m.set(B, P, "toneMappingExposure");
				m.set(B, P, "toneMappingWhitePoint")
			}
			c.skinning && (m.setOptional(B, d, "bindMatrix"), m.setOptional(B, d, "bindMatrixInverse"), a = d.skeleton) && (la.floatVertexTextures && a.useVertexTexture ? (m.set(B, a, "boneTexture"), m.set(B, a, "boneTextureWidth"), m.set(B, a, "boneTextureHeight")) : m.setOptional(B, a, "boneMatrices"));
			if (n) {
				c.lights && (a = t, k.ambientLightColor.needsUpdate = a, k.directionalLights.needsUpdate = a, k.pointLights.needsUpdate = a, k.spotLights.needsUpdate = a, k.rectAreaLights.needsUpdate = a, k.hemisphereLights.needsUpdate = a);
				b && c.fog && (k.fogColor.value = b.color, b.isFog ? (k.fogNear.value = b.near, k.fogFar.value = b.far) : b.isFogExp2 && (k.fogDensity.value = b.density));
				if (c.isMeshBasicMaterial || c.isMeshLambertMaterial || c.isMeshPhongMaterial || c.isMeshStandardMaterial || c.isMeshNormalMaterial || c.isMeshDepthMaterial) {
					k.opacity.value = c.opacity;
					k.diffuse.value = c.color;
					c.emissive && k.emissive.value.copy(c.emissive).multiplyScalar(c.emissiveIntensity);
					k.map.value = c.map;
					k.specularMap.value = c.specularMap;
					k.alphaMap.value = c.alphaMap;
					c.lightMap && (k.lightMap.value = c.lightMap, k.lightMapIntensity.value = c.lightMapIntensity);
					c.aoMap && (k.aoMap.value = c.aoMap, k.aoMapIntensity.value = c.aoMapIntensity);
					var l;
					c.map ? l = c.map: c.specularMap ? l = c.specularMap: c.displacementMap ? l = c.displacementMap: c.normalMap ? l = c.normalMap: c.bumpMap ? l = c.bumpMap: c.roughnessMap ? l = c.roughnessMap: c.metalnessMap ? l = c.metalnessMap: c.alphaMap ? l = c.alphaMap: c.emissiveMap && (l = c.emissiveMap);
					void 0 !== l && (l.isWebGLRenderTarget && (l = l.texture), b = l.offset, l = l.repeat, k.offsetRepeat.value.set(b.x, b.y, l.x, l.y));
					k.envMap.value = c.envMap;
					k.flipEnvMap.value = c.envMap && c.envMap.isCubeTexture ? -1 : 1;
					k.reflectivity.value = c.reflectivity;
					k.refractionRatio.value = c.refractionRatio
				}
				c.isLineBasicMaterial ? (k.diffuse.value = c.color, k.opacity.value = c.opacity) : c.isLineDashedMaterial ? (k.diffuse.value = c.color, k.opacity.value = c.opacity, k.dashSize.value = c.dashSize, k.totalSize.value = c.dashSize + c.gapSize, k.scale.value = c.scale) : c.isPointsMaterial ? (k.diffuse.value = c.color, k.opacity.value = c.opacity, k.size.value = c.size * Ra, k.scale.value = .5 * Cc, k.map.value = c.map, null !== c.map && (l = c.map.offset, c = c.map.repeat, k.offsetRepeat.value.set(l.x, l.y, c.x, c.y))) : c.isMeshLambertMaterial ? c.emissiveMap && (k.emissiveMap.value = c.emissiveMap) : c.isMeshToonMaterial ? (r(k, c), c.gradientMap && (k.gradientMap.value = c.gradientMap)) : c.isMeshPhongMaterial ? r(k, c) : c.isMeshPhysicalMaterial ? (k.clearCoat.value = c.clearCoat, k.clearCoatRoughness.value = c.clearCoatRoughness, A(k, c)) : c.isMeshStandardMaterial ? A(k, c) : c.isMeshDepthMaterial ? c.displacementMap && (k.displacementMap.value = c.displacementMap, k.displacementScale.value = c.displacementScale, k.displacementBias.value = c.displacementBias) : c.isMeshNormalMaterial && (c.bumpMap && (k.bumpMap.value = c.bumpMap, k.bumpScale.value = c.bumpScale), c.normalMap && (k.normalMap.value = c.normalMap, k.normalScale.value.copy(c.normalScale)), c.displacementMap && (k.displacementMap.value = c.displacementMap, k.displacementScale.value = c.displacementScale, k.displacementBias.value = c.displacementBias));
				void 0 !== k.ltcMat && (k.ltcMat.value = THREE.UniformsLib.LTC_MAT_TEXTURE);
				void 0 !== k.ltcMag && (k.ltcMag.value = THREE.UniformsLib.LTC_MAG_TEXTURE);
				$a.upload(B, g.uniformsList, k, P)
			}
			m.set(B, d, "modelViewMatrix");
			m.set(B, d, "normalMatrix");
			m.setValue(B, "modelMatrix", d.matrixWorld);
			return h
		}
		function r(a, b) {
			a.specular.value = b.specular;
			a.shininess.value = Math.max(b.shininess, 1E-4);
			b.emissiveMap && (a.emissiveMap.value = b.emissiveMap);
			b.bumpMap && (a.bumpMap.value = b.bumpMap, a.bumpScale.value = b.bumpScale);
			b.normalMap && (a.normalMap.value = b.normalMap, a.normalScale.value.copy(b.normalScale));
			b.displacementMap && (a.displacementMap.value = b.displacementMap, a.displacementScale.value = b.displacementScale, a.displacementBias.value = b.displacementBias)
		}
		function A(a, b) {
			a.roughness.value = b.roughness;
			a.metalness.value = b.metalness;
			b.roughnessMap && (a.roughnessMap.value = b.roughnessMap);
			b.metalnessMap && (a.metalnessMap.value = b.metalnessMap);
			b.emissiveMap && (a.emissiveMap.value = b.emissiveMap);
			b.bumpMap && (a.bumpMap.value = b.bumpMap, a.bumpScale.value = b.bumpScale);
			b.normalMap && (a.normalMap.value = b.normalMap, a.normalScale.value.copy(b.normalScale));
			b.displacementMap && (a.displacementMap.value = b.displacementMap, a.displacementScale.value = b.displacementScale, a.displacementBias.value = b.displacementBias);
			b.envMap && (a.envMapIntensity.value = b.envMapIntensity)
		}
		function w(a) {
			var b;
			if (1E3 === a) return B.REPEAT;
			if (1001 === a) return B.CLAMP_TO_EDGE;
			if (1002 === a) return B.MIRRORED_REPEAT;
			if (1003 === a) return B.NEAREST;
			if (1004 === a) return B.NEAREST_MIPMAP_NEAREST;
			if (1005 === a) return B.NEAREST_MIPMAP_LINEAR;
			if (1006 === a) return B.LINEAR;
			if (1007 === a) return B.LINEAR_MIPMAP_NEAREST;
			if (1008 === a) return B.LINEAR_MIPMAP_LINEAR;
			if (1009 === a) return B.UNSIGNED_BYTE;
			if (1017 === a) return B.UNSIGNED_SHORT_4_4_4_4;
			if (1018 === a) return B.UNSIGNED_SHORT_5_5_5_1;
			if (1019 === a) return B.UNSIGNED_SHORT_5_6_5;
			if (1010 === a) return B.BYTE;
			if (1011 === a) return B.SHORT;
			if (1012 === a) return B.UNSIGNED_SHORT;
			if (1013 === a) return B.INT;
			if (1014 === a) return B.UNSIGNED_INT;
			if (1015 === a) return B.FLOAT;
			if (1016 === a && (b = ja.get("OES_texture_half_float"), null !== b)) return b.HALF_FLOAT_OES;
			if (1021 === a) return B.ALPHA;
			if (1022 === a) return B.RGB;
			if (1023 === a) return B.RGBA;
			if (1024 === a) return B.LUMINANCE;
			if (1025 === a) return B.LUMINANCE_ALPHA;
			if (1026 === a) return B.DEPTH_COMPONENT;
			if (1027 === a) return B.DEPTH_STENCIL;
			if (100 === a) return B.FUNC_ADD;
			if (101 === a) return B.FUNC_SUBTRACT;
			if (102 === a) return B.FUNC_REVERSE_SUBTRACT;
			if (200 === a) return B.ZERO;
			if (201 === a) return B.ONE;
			if (202 === a) return B.SRC_COLOR;
			if (203 === a) return B.ONE_MINUS_SRC_COLOR;
			if (204 === a) return B.SRC_ALPHA;
			if (205 === a) return B.ONE_MINUS_SRC_ALPHA;
			if (206 === a) return B.DST_ALPHA;
			if (207 === a) return B.ONE_MINUS_DST_ALPHA;
			if (208 === a) return B.DST_COLOR;
			if (209 === a) return B.ONE_MINUS_DST_COLOR;
			if (210 === a) return B.SRC_ALPHA_SATURATE;
			if (2001 === a || 2002 === a || 2003 === a || 2004 === a) if (b = ja.get("WEBGL_compressed_texture_s3tc"), null !== b) {
				if (2001 === a) return b.COMPRESSED_RGB_S3TC_DXT1_EXT;
				if (2002 === a) return b.COMPRESSED_RGBA_S3TC_DXT1_EXT;
				if (2003 === a) return b.COMPRESSED_RGBA_S3TC_DXT3_EXT;
				if (2004 === a) return b.COMPRESSED_RGBA_S3TC_DXT5_EXT
			}
			if (2100 === a || 2101 === a || 2102 === a || 2103 === a) if (b = ja.get("WEBGL_compressed_texture_pvrtc"), null !== b) {
				if (2100 === a) return b.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
				if (2101 === a) return b.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
				if (2102 === a) return b.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
				if (2103 === a) return b.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG
			}
			if (2151 === a && (b = ja.get("WEBGL_compressed_texture_etc1"), null !== b)) return b.COMPRESSED_RGB_ETC1_WEBGL;
			if (103 === a || 104 === a) if (b = ja.get("EXT_blend_minmax"), null !== b) {
				if (103 === a) return b.MIN_EXT;
				if (104 === a) return b.MAX_EXT
			}
			return 1020 === a && (b = ja.get("WEBGL_depth_texture"), null !== b) ? b.UNSIGNED_INT_24_8_WEBGL: 0
		}
		console.log("THREE.WebGLRenderer", "84");
		a = a || {};
		var y = void 0 !== a.canvas ? a.canvas: document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"),
		K = void 0 !== a.context ? a.context: null,
		v = void 0 !== a.alpha ? a.alpha: !1,
		E = void 0 !== a.depth ? a.depth: !0,
		L = void 0 !== a.stencil ? a.stencil: !0,
		C = void 0 !== a.antialias ? a.antialias: !1,
		F = void 0 !== a.premultipliedAlpha ? a.premultipliedAlpha: !0,
		x = void 0 !== a.preserveDrawingBuffer ? a.preserveDrawingBuffer: !1,
		H = [],
		aa = [],
		D = -1,
		z = [],
		T = -1,
		Q = new Float32Array(8),
		M = [],
		O = [];
		this.domElement = y;
		this.context = null;
		this.sortObjects = this.autoClearStencil = this.autoClearDepth = this.autoClearColor = this.autoClear = !0;
		this.clippingPlanes = [];
		this.localClippingEnabled = !1;
		this.gammaFactor = 2;
		this.physicallyCorrectLights = this.gammaOutput = this.gammaInput = !1;
		this.toneMappingWhitePoint = this.toneMappingExposure = this.toneMapping = 1;
		this.maxMorphTargets = 8;
		this.maxMorphNormals = 4;
		var P = this,
		wa = null,
		W = null,
		N = null,
		R = -1,
		V = "",
		U = null,
		X = new fa,
		Sa = null,
		Z = new fa,
		ea = 0,
		Ea = new J(0),
		gb = 0,
		md = y.width,
		Cc = y.height,
		Ra = 1,
		ga = new fa(0, 0, md, Cc),
		ka = !1,
		ia = new fa(0, 0, md, Cc),
		ma = new tc,
		ca = new Uf,
		oa = !1,
		ra = !1,
		na = new Na,
		ua = new S,
		Ga = new q,
		Ba = new S,
		xa = new S,
		ba = {
			hash: "",
			ambient: [0, 0, 0],
			directional: [],
			directionalShadowMap: [],
			directionalShadowMatrix: [],
			spot: [],
			spotShadowMap: [],
			spotShadowMatrix: [],
			rectArea: [],
			point: [],
			pointShadowMap: [],
			pointShadowMatrix: [],
			hemi: [],
			shadows: []
		},
		pa = {
			calls: 0,
			vertices: 0,
			faces: 0,
			points: 0
		};
		this.info = {
			render: pa,
			memory: {
				geometries: 0,
				textures: 0
			},
			programs: null
		};
		var B;
		try {
			v = {
				alpha: v,
				depth: E,
				stencil: L,
				antialias: C,
				premultipliedAlpha: F,
				preserveDrawingBuffer: x
			};
			B = K || y.getContext("webgl", v) || y.getContext("experimental-webgl", v);
			if (null === B) {
				if (null !== y.getContext("webgl")) throw "Error creating WebGL context with your selected attributes.";
				throw "Error creating WebGL context.";
			}
			void 0 === B.getShaderPrecisionFormat && (B.getShaderPrecisionFormat = function() {
				return {
					rangeMin: 1,
					rangeMax: 1,
					precision: 1
				}
			});
			y.addEventListener("webglcontextlost", d, !1)
		} catch(Vf) {
			console.error("THREE.WebGLRenderer: " + Vf)
		}
		var ja = new Tf(B);
		ja.get("WEBGL_depth_texture");
		ja.get("OES_texture_float");
		ja.get("OES_texture_float_linear");
		ja.get("OES_texture_half_float");
		ja.get("OES_texture_half_float_linear");
		ja.get("OES_standard_derivatives");
		ja.get("ANGLE_instanced_arrays");
		ja.get("OES_element_index_uint") && (I.MaxIndex = 4294967296);
		var la = new Sf(B, ja, a),
		Y = new Rf(B, ja, w),
		ha = new Qf,
		ta = new Pf(B, ja, Y, ha, la, w, this.info),
		qa = new Of(B, ha, this.info),
		ya = new Mf(this, la),
		za = new Ef;
		this.info.programs = ya.programs;
		var La = new Df(B, ja, pa),
		Oa = new Cf(B, ja, pa),
		Ia,
		Ca,
		sa,
		va;
		b();
		this.context = B;
		this.capabilities = la;
		this.extensions = ja;
		this.properties = ha;
		this.state = Y;
		var Ma = new Ke(this, ba, qa, la);
		this.shadowMap = Ma;
		var Pa = new zf(this, M),
		Qa = new yf(this, O);
		this.getContext = function() {
			return B
		};
		this.getContextAttributes = function() {
			return B.getContextAttributes()
		};
		this.forceContextLoss = function() {
			ja.get("WEBGL_lose_context").loseContext()
		};
		this.getMaxAnisotropy = function() {
			return la.getMaxAnisotropy()
		};
		this.getPrecision = function() {
			return la.precision
		};
		this.getPixelRatio = function() {
			return Ra
		};
		this.setPixelRatio = function(a) {
			void 0 !== a && (Ra = a, this.setSize(ia.z, ia.w, !1))
		};
		this.getSize = function() {
			return {
				width: md,
				height: Cc
			}
		};
		this.setSize = function(a, b, c) {
			md = a;
			Cc = b;
			y.width = a * Ra;
			y.height = b * Ra; ! 1 !== c && (y.style.width = a + "px", y.style.height = b + "px");
			this.setViewport(0, 0, a, b)
		};
		this.setViewport = function(a, b, c, d) {
			Y.viewport(ia.set(a, b, c, d))
		};
		this.setScissor = function(a, b, c, d) {
			Y.scissor(ga.set(a, b, c, d))
		};
		this.setScissorTest = function(a) {
			Y.setScissorTest(ka = a)
		};
		this.getClearColor = function() {
			return Ea
		};
		this.setClearColor = function(a, b) {
			Ea.set(a);
			gb = void 0 !== b ? b: 1;
			Y.buffers.color.setClear(Ea.r, Ea.g, Ea.b, gb, F)
		};
		this.getClearAlpha = function() {
			return gb
		};
		this.setClearAlpha = function(a) {
			gb = a;
			Y.buffers.color.setClear(Ea.r, Ea.g, Ea.b, gb, F)
		};
		this.clear = function(a, b, c) {
			var d = 0;
			if (void 0 === a || a) d |= B.COLOR_BUFFER_BIT;
			if (void 0 === b || b) d |= B.DEPTH_BUFFER_BIT;
			if (void 0 === c || c) d |= B.STENCIL_BUFFER_BIT;
			B.clear(d)
		};
		this.clearColor = function() {
			this.clear(!0, !1, !1)
		};
		this.clearDepth = function() {
			this.clear(!1, !0, !1)
		};
		this.clearStencil = function() {
			this.clear(!1, !1, !0)
		};
		this.clearTarget = function(a, b, c, d) {
			this.setRenderTarget(a);
			this.clear(b, c, d)
		};
		this.resetGLState = c;
		this.dispose = function() {
			z = [];
			T = -1;
			aa = [];
			D = -1;
			y.removeEventListener("webglcontextlost", d, !1)
		};
		this.renderBufferImmediate = function(a, b, c) {
			Y.initAttributes();
			var d = ha.get(a);
			a.hasPositions && !d.position && (d.position = B.createBuffer());
			a.hasNormals && !d.normal && (d.normal = B.createBuffer());
			a.hasUvs && !d.uv && (d.uv = B.createBuffer());
			a.hasColors && !d.color && (d.color = B.createBuffer());
			b = b.getAttributes();
			a.hasPositions && (B.bindBuffer(B.ARRAY_BUFFER, d.position), B.bufferData(B.ARRAY_BUFFER, a.positionArray, B.DYNAMIC_DRAW), Y.enableAttribute(b.position), B.vertexAttribPointer(b.position, 3, B.FLOAT, !1, 0, 0));
			if (a.hasNormals) {
				B.bindBuffer(B.ARRAY_BUFFER, d.normal);
				if (!c.isMeshPhongMaterial && !c.isMeshStandardMaterial && !c.isMeshNormalMaterial && 1 === c.shading) for (var e = 0,
				f = 3 * a.count; e < f; e += 9) {
					var g = a.normalArray,
					h = (g[e + 0] + g[e + 3] + g[e + 6]) / 3,
					m = (g[e + 1] + g[e + 4] + g[e + 7]) / 3,
					k = (g[e + 2] + g[e + 5] + g[e + 8]) / 3;
					g[e + 0] = h;
					g[e + 1] = m;
					g[e + 2] = k;
					g[e + 3] = h;
					g[e + 4] = m;
					g[e + 5] = k;
					g[e + 6] = h;
					g[e + 7] = m;
					g[e + 8] = k
				}
				B.bufferData(B.ARRAY_BUFFER, a.normalArray, B.DYNAMIC_DRAW);
				Y.enableAttribute(b.normal);
				B.vertexAttribPointer(b.normal, 3, B.FLOAT, !1, 0, 0)
			}
			a.hasUvs && c.map && (B.bindBuffer(B.ARRAY_BUFFER, d.uv), B.bufferData(B.ARRAY_BUFFER, a.uvArray, B.DYNAMIC_DRAW), Y.enableAttribute(b.uv), B.vertexAttribPointer(b.uv, 2, B.FLOAT, !1, 0, 0));
			a.hasColors && 0 !== c.vertexColors && (B.bindBuffer(B.ARRAY_BUFFER, d.color), B.bufferData(B.ARRAY_BUFFER, a.colorArray, B.DYNAMIC_DRAW), Y.enableAttribute(b.color), B.vertexAttribPointer(b.color, 3, B.FLOAT, !1, 0, 0));
			Y.disableUnusedAttributes();
			B.drawArrays(B.TRIANGLES, 0, a.count);
			a.count = 0
		};
		this.renderBufferDirect = function(a, b, c, d, e, f) {
			l(d);
			var h = G(a, b, d, e),
			m = !1;
			a = c.id + "_" + h.id + "_" + d.wireframe;
			a !== V && (V = a, m = !0);
			b = e.morphTargetInfluences;
			if (void 0 !== b) {
				var k = [];
				a = 0;
				for (var n = b.length; a < n; a++) m = b[a],
				k.push([m, a]);
				k.sort(g);
				8 < k.length && (k.length = 8);
				var t = c.morphAttributes;
				a = 0;
				for (n = k.length; a < n; a++) m = k[a],
				Q[a] = m[0],
				0 !== m[0] ? (b = m[1], !0 === d.morphTargets && t.position && c.addAttribute("morphTarget" + a, t.position[b]), !0 === d.morphNormals && t.normal && c.addAttribute("morphNormal" + a, t.normal[b])) : (!0 === d.morphTargets && c.removeAttribute("morphTarget" + a), !0 === d.morphNormals && c.removeAttribute("morphNormal" + a));
				a = k.length;
				for (b = Q.length; a < b; a++) Q[a] = 0;
				h.getUniforms().setValue(B, "morphTargetInfluences", Q);
				m = !0
			}
			b = c.index;
			n = c.attributes.position;
			k = 1; ! 0 === d.wireframe && (b = qa.getWireframeAttribute(c), k = 2);
			null !== b ? (a = Oa, a.setIndex(b)) : a = La;
			if (m) {
				a: {
					var m = void 0,
					p;
					if (c && c.isInstancedBufferGeometry && (p = ja.get("ANGLE_instanced_arrays"), null === p)) {
						console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");
						break a
					}
					void 0 === m && (m = 0);
					Y.initAttributes();
					var t = c.attributes,
					h = h.getAttributes(),
					r = d.defaultAttributeValues,
					q;
					for (q in h) {
						var y = h[q];
						if (0 <= y) {
							var v = t[q];
							if (void 0 !== v) {
								var w = v.normalized,
								A = v.itemSize,
								K = qa.getAttributeProperties(v),
								C = K.__webglBuffer,
								L = K.type,
								K = K.bytesPerElement;
								if (v.isInterleavedBufferAttribute) {
									var F = v.data,
									E = F.stride,
									v = v.offset;
									F && F.isInstancedInterleavedBuffer ? (Y.enableAttributeAndDivisor(y, F.meshPerAttribute, p), void 0 === c.maxInstancedCount && (c.maxInstancedCount = F.meshPerAttribute * F.count)) : Y.enableAttribute(y);
									B.bindBuffer(B.ARRAY_BUFFER, C);
									B.vertexAttribPointer(y, A, L, w, E * K, (m * E + v) * K)
								} else v.isInstancedBufferAttribute ? (Y.enableAttributeAndDivisor(y, v.meshPerAttribute, p), void 0 === c.maxInstancedCount && (c.maxInstancedCount = v.meshPerAttribute * v.count)) : Y.enableAttribute(y),
								B.bindBuffer(B.ARRAY_BUFFER, C),
								B.vertexAttribPointer(y, A, L, w, 0, m * A * K)
							} else if (void 0 !== r && (w = r[q], void 0 !== w)) switch (w.length) {
							case 2:
								B.vertexAttrib2fv(y, w);
								break;
							case 3:
								B.vertexAttrib3fv(y, w);
								break;
							case 4:
								B.vertexAttrib4fv(y, w);
								break;
							default:
								B.vertexAttrib1fv(y, w)
							}
						}
					}
					Y.disableUnusedAttributes()
				}
				null !== b && B.bindBuffer(B.ELEMENT_ARRAY_BUFFER, qa.getAttributeBuffer(b))
			}
			p = 0;
			null !== b ? p = b.count: void 0 !== n && (p = n.count);
			b = c.drawRange.start * k;
			n = null !== f ? f.start * k: 0;
			q = Math.max(b, n);
			f = Math.max(0, Math.min(p, b + c.drawRange.count * k, n + (null !== f ? f.count * k: Infinity)) - 1 - q + 1);
			if (0 !== f) {
				if (e.isMesh) if (!0 === d.wireframe) Y.setLineWidth(d.wireframeLinewidth * (null === W ? Ra: 1)),
				a.setMode(B.LINES);
				else switch (e.drawMode) {
				case 0:
					a.setMode(B.TRIANGLES);
					break;
				case 1:
					a.setMode(B.TRIANGLE_STRIP);
					break;
				case 2:
					a.setMode(B.TRIANGLE_FAN)
				} else e.isLine ? (d = d.linewidth, void 0 === d && (d = 1), Y.setLineWidth(d * (null === W ? Ra: 1)), e.isLineSegments ? a.setMode(B.LINES) : a.setMode(B.LINE_STRIP)) : e.isPoints && a.setMode(B.POINTS);
				c && c.isInstancedBufferGeometry ? 0 < c.maxInstancedCount && a.renderInstances(c, q, f) : a.render(q, f)
			}
		};
		this.render = function(a, b, c, d) {
			if (void 0 !== b && !0 !== b.isCamera) console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");
			else {
				V = "";
				R = -1;
				U = null; ! 0 === a.autoUpdate && a.updateMatrixWorld();
				null === b.parent && b.updateMatrixWorld();
				b.matrixWorldInverse.getInverse(b.matrixWorld);
				ua.multiplyMatrices(b.projectionMatrix, b.matrixWorldInverse);
				ma.setFromMatrix(ua);
				H.length = 0;
				T = D = -1;
				M.length = 0;
				O.length = 0;
				ra = this.localClippingEnabled;
				oa = ca.init(this.clippingPlanes, ra, b);
				p(a, b);
				aa.length = D + 1;
				z.length = T + 1; ! 0 === P.sortObjects && (aa.sort(h), z.sort(m));
				oa && ca.beginShadows();
				for (var e = H,
				f = 0,
				g = 0,
				k = e.length; g < k; g++) {
					var t = e[g];
					t.castShadow && (ba.shadows[f++] = t)
				}
				ba.shadows.length = f;
				Ma.render(a, b);
				for (var e = H,
				l = t = 0,
				u = 0,
				r, G, q, y, v = b.matrixWorldInverse,
				w = 0,
				A = 0,
				K = 0,
				C = 0,
				L = 0,
				f = 0,
				g = e.length; f < g; f++) if (k = e[f], r = k.color, G = k.intensity, q = k.distance, y = k.shadow && k.shadow.map ? k.shadow.map.texture: null, k.isAmbientLight) t += r.r * G,
				l += r.g * G,
				u += r.b * G;
				else if (k.isDirectionalLight) {
					var E = za.get(k);
					E.color.copy(k.color).multiplyScalar(k.intensity);
					E.direction.setFromMatrixPosition(k.matrixWorld);
					Ga.setFromMatrixPosition(k.target.matrixWorld);
					E.direction.sub(Ga);
					E.direction.transformDirection(v);
					if (E.shadow = k.castShadow) E.shadowBias = k.shadow.bias,
					E.shadowRadius = k.shadow.radius,
					E.shadowMapSize = k.shadow.mapSize;
					ba.directionalShadowMap[w] = y;
					ba.directionalShadowMatrix[w] = k.shadow.matrix;
					ba.directional[w++] = E
				} else if (k.isSpotLight) {
					E = za.get(k);
					E.position.setFromMatrixPosition(k.matrixWorld);
					E.position.applyMatrix4(v);
					E.color.copy(r).multiplyScalar(G);
					E.distance = q;
					E.direction.setFromMatrixPosition(k.matrixWorld);
					Ga.setFromMatrixPosition(k.target.matrixWorld);
					E.direction.sub(Ga);
					E.direction.transformDirection(v);
					E.coneCos = Math.cos(k.angle);
					E.penumbraCos = Math.cos(k.angle * (1 - k.penumbra));
					E.decay = 0 === k.distance ? 0 : k.decay;
					if (E.shadow = k.castShadow) E.shadowBias = k.shadow.bias,
					E.shadowRadius = k.shadow.radius,
					E.shadowMapSize = k.shadow.mapSize;
					ba.spotShadowMap[K] = y;
					ba.spotShadowMatrix[K] = k.shadow.matrix;
					ba.spot[K++] = E
				} else if (k.isRectAreaLight) E = za.get(k),
				E.color.copy(r).multiplyScalar(G / (k.width * k.height)),
				E.position.setFromMatrixPosition(k.matrixWorld),
				E.position.applyMatrix4(v),
				xa.identity(),
				Ba.copy(k.matrixWorld),
				Ba.premultiply(v),
				xa.extractRotation(Ba),
				E.halfWidth.set(.5 * k.width, 0, 0),
				E.halfHeight.set(0, .5 * k.height, 0),
				E.halfWidth.applyMatrix4(xa),
				E.halfHeight.applyMatrix4(xa),
				ba.rectArea[C++] = E;
				else if (k.isPointLight) {
					E = za.get(k);
					E.position.setFromMatrixPosition(k.matrixWorld);
					E.position.applyMatrix4(v);
					E.color.copy(k.color).multiplyScalar(k.intensity);
					E.distance = k.distance;
					E.decay = 0 === k.distance ? 0 : k.decay;
					if (E.shadow = k.castShadow) E.shadowBias = k.shadow.bias,
					E.shadowRadius = k.shadow.radius,
					E.shadowMapSize = k.shadow.mapSize;
					ba.pointShadowMap[A] = y;
					void 0 === ba.pointShadowMatrix[A] && (ba.pointShadowMatrix[A] = new S);
					Ga.setFromMatrixPosition(k.matrixWorld).negate();
					ba.pointShadowMatrix[A].identity().setPosition(Ga);
					ba.point[A++] = E
				} else k.isHemisphereLight && (E = za.get(k), E.direction.setFromMatrixPosition(k.matrixWorld), E.direction.transformDirection(v), E.direction.normalize(), E.skyColor.copy(k.color).multiplyScalar(G), E.groundColor.copy(k.groundColor).multiplyScalar(G), ba.hemi[L++] = E);
				ba.ambient[0] = t;
				ba.ambient[1] = l;
				ba.ambient[2] = u;
				ba.directional.length = w;
				ba.spot.length = K;
				ba.rectArea.length = C;
				ba.point.length = A;
				ba.hemi.length = L;
				ba.hash = w + "," + A + "," + K + "," + C + "," + L + "," + ba.shadows.length;
				oa && ca.endShadows();
				pa.calls = 0;
				pa.vertices = 0;
				pa.faces = 0;
				pa.points = 0;
				void 0 === c && (c = null);
				this.setRenderTarget(c);
				e = a.background;
				null === e ? Y.buffers.color.setClear(Ea.r, Ea.g, Ea.b, gb, F) : e && e.isColor && (Y.buffers.color.setClear(e.r, e.g, e.b, 1, F), d = !0); (this.autoClear || d) && this.clear(this.autoClearColor, this.autoClearDepth, this.autoClearStencil);
				e && e.isCubeTexture ? (void 0 === sa && (sa = new Fa, va = new Aa(new kb(5, 5, 5), new Ha({
					uniforms: bb.cube.uniforms,
					vertexShader: bb.cube.vertexShader,
					fragmentShader: bb.cube.fragmentShader,
					side: 1,
					depthTest: !1,
					depthWrite: !1,
					fog: !1
				}))), sa.projectionMatrix.copy(b.projectionMatrix), sa.matrixWorld.extractRotation(b.matrixWorld), sa.matrixWorldInverse.getInverse(sa.matrixWorld), va.material.uniforms.tCube.value = e, va.modelViewMatrix.multiplyMatrices(sa.matrixWorldInverse, va.matrixWorld), qa.update(va), P.renderBufferDirect(sa, null, va.geometry, va.material, va, null)) : e && e.isTexture && (void 0 === Ia && (Ia = new Jb( - 1, 1, 1, -1, 0, 1), Ca = new Aa(new lb(2, 2), new Ka({
					depthTest: !1,
					depthWrite: !1,
					fog: !1
				}))), Ca.material.map = e, qa.update(Ca), P.renderBufferDirect(Ia, null, Ca.geometry, Ca.material, Ca, null));
				a.overrideMaterial ? (d = a.overrideMaterial, n(aa, a, b, d), n(z, a, b, d)) : (Y.setBlending(0), n(aa, a, b), n(z, a, b));
				Pa.render(a, b);
				Qa.render(a, b, Z);
				c && ta.updateRenderTargetMipmap(c);
				Y.setDepthTest(!0);
				Y.setDepthWrite(!0);
				Y.setColorWrite(!0)
			}
		};
		this.setFaceCulling = function(a, b) {
			Y.setCullFace(a);
			Y.setFlipSided(0 === b)
		};
		this.allocTextureUnit = function() {
			var a = ea;
			a >= la.maxTextures && console.warn("WebGLRenderer: trying to use " + a + " texture units while this GPU supports only " + la.maxTextures);
			ea += 1;
			return a
		};
		this.setTexture2D = function() {
			var a = !1;
			return function(b, c) {
				b && b.isWebGLRenderTarget && (a || (console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."), a = !0), b = b.texture);
				ta.setTexture2D(b, c)
			}
		} ();
		this.setTexture = function() {
			var a = !1;
			return function(b, c) {
				a || (console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."), a = !0);
				ta.setTexture2D(b, c)
			}
		} ();
		this.setTextureCube = function() {
			var a = !1;
			return function(b, c) {
				b && b.isWebGLRenderTargetCube && (a || (console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."), a = !0), b = b.texture);
				b && b.isCubeTexture || Array.isArray(b.image) && 6 === b.image.length ? ta.setTextureCube(b, c) : ta.setTextureCubeDynamic(b, c)
			}
		} ();
		this.getCurrentRenderTarget = function() {
			return W
		};
		this.setRenderTarget = function(a) { (W = a) && void 0 === ha.get(a).__webglFramebuffer && ta.setupRenderTarget(a);
			var b = a && a.isWebGLRenderTargetCube,
			c;
			a ? (c = ha.get(a), c = b ? c.__webglFramebuffer[a.activeCubeFace] : c.__webglFramebuffer, X.copy(a.scissor), Sa = a.scissorTest, Z.copy(a.viewport)) : (c = null, X.copy(ga).multiplyScalar(Ra), Sa = ka, Z.copy(ia).multiplyScalar(Ra));
			N !== c && (B.bindFramebuffer(B.FRAMEBUFFER, c), N = c);
			Y.scissor(X);
			Y.setScissorTest(Sa);
			Y.viewport(Z);
			b && (b = ha.get(a.texture), B.framebufferTexture2D(B.FRAMEBUFFER, B.COLOR_ATTACHMENT0, B.TEXTURE_CUBE_MAP_POSITIVE_X + a.activeCubeFace, b.__webglTexture, a.activeMipMapLevel))
		};
		this.readRenderTargetPixels = function(a, b, c, d, e, f) {
			if (!1 === (a && a.isWebGLRenderTarget)) console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");
			else {
				var g = ha.get(a).__webglFramebuffer;
				if (g) {
					var h = !1;
					g !== N && (B.bindFramebuffer(B.FRAMEBUFFER, g), h = !0);
					try {
						var k = a.texture,
						m = k.format,
						n = k.type;
						1023 !== m && w(m) !== B.getParameter(B.IMPLEMENTATION_COLOR_READ_FORMAT) ? console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.") : 1009 === n || w(n) === B.getParameter(B.IMPLEMENTATION_COLOR_READ_TYPE) || 1015 === n && (ja.get("OES_texture_float") || ja.get("WEBGL_color_buffer_float")) || 1016 === n && ja.get("EXT_color_buffer_half_float") ? B.checkFramebufferStatus(B.FRAMEBUFFER) === B.FRAMEBUFFER_COMPLETE ? 0 <= b && b <= a.width - d && 0 <= c && c <= a.height - e && B.readPixels(b, c, d, e, w(m), w(n), f) : console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.") : console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")
					} finally {
						h && B.bindFramebuffer(B.FRAMEBUFFER, N)
					}
				}
			}
		}
	}
	function Kb(a, b) {
		this.name = "";
		this.color = new J(a);
		this.density = void 0 !== b ? b: 2.5E-4
	}
	function Lb(a, b, c) {
		this.name = "";
		this.color = new J(a);
		this.near = void 0 !== b ? b: 1;
		this.far = void 0 !== c ? c: 1E3
	}
	function mb() {
		x.call(this);
		this.type = "Scene";
		this.overrideMaterial = this.fog = this.background = null;
		this.autoUpdate = !0
	}
	function Zd(a, b, c, d, e) {
		x.call(this);
		this.lensFlares = [];
		this.positionScreen = new q;
		this.customUpdateCallback = void 0;
		void 0 !== a && this.add(a, b, c, d, e)
	}
	function nb(a) {
		X.call(this);
		this.type = "SpriteMaterial";
		this.color = new J(16777215);
		this.map = null;
		this.rotation = 0;
		this.lights = this.fog = !1;
		this.setValues(a)
	}
	function Dc(a) {
		x.call(this);
		this.type = "Sprite";
		this.material = void 0 !== a ? a: new nb
	}
	function Ec() {
		x.call(this);
		this.type = "LOD";
		Object.defineProperties(this, {
			levels: {
				enumerable: !0,
				value: []
			}
		})
	}
	function od(a, b, c) {
		this.useVertexTexture = void 0 !== c ? c: !0;
		this.identityMatrix = new S;
		a = a || [];
		this.bones = a.slice(0);
		this.useVertexTexture ? (a = Math.sqrt(4 * this.bones.length), a = N.nextPowerOfTwo(Math.ceil(a)), this.boneTextureHeight = this.boneTextureWidth = a = Math.max(a, 4), this.boneMatrices = new Float32Array(this.boneTextureWidth * this.boneTextureHeight * 4), this.boneTexture = new eb(this.boneMatrices, this.boneTextureWidth, this.boneTextureHeight, 1023, 1015)) : this.boneMatrices = new Float32Array(16 * this.bones.length);
		if (void 0 === b) this.calculateInverses();
		else if (this.bones.length === b.length) this.boneInverses = b.slice(0);
		else for (console.warn("THREE.Skeleton bonInverses is the wrong length."), this.boneInverses = [], b = 0, a = this.bones.length; b < a; b++) this.boneInverses.push(new S)
	}
	function pd() {
		x.call(this);
		this.type = "Bone"
	}
	function qd(a, b, c) {
		Aa.call(this, a, b);
		this.type = "SkinnedMesh";
		this.bindMode = "attached";
		this.bindMatrix = new S;
		this.bindMatrixInverse = new S;
		a = [];
		if (this.geometry && void 0 !== this.geometry.bones) {
			for (var d, e = 0,
			f = this.geometry.bones.length; e < f; ++e) d = this.geometry.bones[e],
			b = new pd,
			a.push(b),
			b.name = d.name,
			b.position.fromArray(d.pos),
			b.quaternion.fromArray(d.rotq),
			void 0 !== d.scl && b.scale.fromArray(d.scl);
			e = 0;
			for (f = this.geometry.bones.length; e < f; ++e) d = this.geometry.bones[e],
			-1 !== d.parent && null !== d.parent && void 0 !== a[d.parent] ? a[d.parent].add(a[e]) : this.add(a[e])
		}
		this.normalizeSkinWeights();
		this.updateMatrixWorld(!0);
		this.bind(new od(a, void 0, c), this.matrixWorld)
	}
	function ia(a) {
		X.call(this);
		this.type = "LineBasicMaterial";
		this.color = new J(16777215);
		this.linewidth = 1;
		this.linejoin = this.linecap = "round";
		this.lights = !1;
		this.setValues(a)
	}
	function Ua(a, b, c) {
		if (1 === c) return console.warn("THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead."),
		new ga(a, b);
		x.call(this);
		this.type = "Line";
		this.geometry = void 0 !== a ? a: new I;
		this.material = void 0 !== b ? b: new ia({
			color: 16777215 * Math.random()
		})
	}
	function ga(a, b) {
		Ua.call(this, a, b);
		this.type = "LineSegments"
	}
	function Oa(a) {
		X.call(this);
		this.type = "PointsMaterial";
		this.color = new J(16777215);
		this.map = null;
		this.size = 1;
		this.sizeAttenuation = !0;
		this.lights = !1;
		this.setValues(a)
	}
	function Mb(a, b) {
		x.call(this);
		this.type = "Points";
		this.geometry = void 0 !== a ? a: new I;
		this.material = void 0 !== b ? b: new Oa({
			color: 16777215 * Math.random()
		})
	}
	function Fc() {
		x.call(this);
		this.type = "Group"
	}
	function rd(a, b, c, d, e, f, g, h, m) {
		function k() {
			requestAnimationFrame(k);
			a.readyState >= a.HAVE_CURRENT_DATA && (t.needsUpdate = !0)
		}
		ea.call(this, a, b, c, d, e, f, g, h, m);
		this.generateMipmaps = !1;
		var t = this;
		k()
	}
	function Nb(a, b, c, d, e, f, g, h, m, k, t, p) {
		ea.call(this, null, f, g, h, m, k, d, e, t, p);
		this.image = {
			width: b,
			height: c
		};
		this.mipmaps = a;
		this.generateMipmaps = this.flipY = !1
	}
	function sd(a, b, c, d, e, f, g, h, m) {
		ea.call(this, a, b, c, d, e, f, g, h, m);
		this.needsUpdate = !0
	}
	function Gc(a, b, c, d, e, f, g, h, m, k) {
		k = void 0 !== k ? k: 1026;
		if (1026 !== k && 1027 !== k) throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");
		void 0 === c && 1026 === k && (c = 1012);
		void 0 === c && 1027 === k && (c = 1020);
		ea.call(this, null, d, e, f, g, h, k, c, m);
		this.image = {
			width: a,
			height: b
		};
		this.magFilter = void 0 !== g ? g: 1003;
		this.minFilter = void 0 !== h ? h: 1003;
		this.generateMipmaps = this.flipY = !1
	}
	function Ob(a) {
		function b(a, b) {
			return a - b
		}
		I.call(this);
		this.type = "WireframeGeometry";
		var c = [],
		d,
		e,
		f,
		g,
		h = [0, 0],
		m = {},
		k,
		t = ["a", "b", "c"];
		if (a && a.isGeometry) {
			var p = a.faces;
			d = 0;
			for (f = p.length; d < f; d++) {
				var n = p[d];
				for (e = 0; 3 > e; e++) h[0] = n[t[e]],
				h[1] = n[t[(e + 1) % 3]],
				h.sort(b),
				k = h.toString(),
				void 0 === m[k] && (m[k] = {
					index1: h[0],
					index2: h[1]
				})
			}
			for (k in m) d = m[k],
			t = a.vertices[d.index1],
			c.push(t.x, t.y, t.z),
			t = a.vertices[d.index2],
			c.push(t.x, t.y, t.z)
		} else if (a && a.isBufferGeometry) {
			var l, t = new q;
			if (null !== a.index) {
				p = a.attributes.position;
				n = a.index;
				l = a.groups;
				0 === l.length && a.addGroup(0, n.count);
				a = 0;
				for (g = l.length; a < g; ++a) for (d = l[a], e = d.start, f = d.count, d = e, f = e + f; d < f; d += 3) for (e = 0; 3 > e; e++) h[0] = n.getX(d + e),
				h[1] = n.getX(d + (e + 1) % 3),
				h.sort(b),
				k = h.toString(),
				void 0 === m[k] && (m[k] = {
					index1: h[0],
					index2: h[1]
				});
				for (k in m) d = m[k],
				t.fromBufferAttribute(p, d.index1),
				c.push(t.x, t.y, t.z),
				t.fromBufferAttribute(p, d.index2),
				c.push(t.x, t.y, t.z)
			} else for (p = a.attributes.position, d = 0, f = p.count / 3; d < f; d++) for (e = 0; 3 > e; e++) m = 3 * d + e,
			t.fromBufferAttribute(p, m),
			c.push(t.x, t.y, t.z),
			m = 3 * d + (e + 1) % 3,
			t.fromBufferAttribute(p, m),
			c.push(t.x, t.y, t.z)
		}
		this.addAttribute("position", new z(c, 3))
	}
	function Hc(a, b, c) {
		T.call(this);
		this.type = "ParametricGeometry";
		this.parameters = {
			func: a,
			slices: b,
			stacks: c
		};
		this.fromBufferGeometry(new Pb(a, b, c));
		this.mergeVertices()
	}
	function Pb(a, b, c) {
		I.call(this);
		this.type = "ParametricBufferGeometry";
		this.parameters = {
			func: a,
			slices: b,
			stacks: c
		};
		var d = [],
		e = [],
		f = [],
		g,
		h,
		m = b + 1;
		for (g = 0; g <= c; g++) {
			var k = g / c;
			for (h = 0; h <= b; h++) {
				var t = h / b,
				p = a(t, k);
				e.push(p.x, p.y, p.z);
				f.push(t, k)
			}
		}
		for (g = 0; g < c; g++) for (h = 0; h < b; h++) a = g * m + h + 1,
		k = (g + 1) * m + h + 1,
		t = (g + 1) * m + h,
		d.push(g * m + h, a, t),
		d.push(a, k, t);
		this.setIndex(d);
		this.addAttribute("position", new z(e, 3));
		this.addAttribute("uv", new z(f, 2));
		this.computeVertexNormals()
	}
	function Ic(a, b, c, d) {
		T.call(this);
		this.type = "PolyhedronGeometry";
		this.parameters = {
			vertices: a,
			indices: b,
			radius: c,
			detail: d
		};
		this.fromBufferGeometry(new Ba(a, b, c, d));
		this.mergeVertices()
	}
	function Ba(a, b, c, d) {
		function e(a) {
			h.push(a.x, a.y, a.z)
		}
		function f(b, c) {
			var d = 3 * b;
			c.x = a[d + 0];
			c.y = a[d + 1];
			c.z = a[d + 2]
		}
		function g(a, b, c, d) {
			0 > d && 1 === a.x && (m[b] = a.x - 1);
			0 === c.x && 0 === c.z && (m[b] = d / 2 / Math.PI + .5)
		}
		I.call(this);
		this.type = "PolyhedronBufferGeometry";
		this.parameters = {
			vertices: a,
			indices: b,
			radius: c,
			detail: d
		};
		c = c || 1;
		var h = [],
		m = []; (function(a) {
			for (var c = new q,
			d = new q,
			g = new q,
			h = 0; h < b.length; h += 3) {
				f(b[h + 0], c);
				f(b[h + 1], d);
				f(b[h + 2], g);
				var m = c,
				l = d,
				A = g,
				w = Math.pow(2, a),
				y = [],
				K,
				v;
				for (K = 0; K <= w; K++) {
					y[K] = [];
					var E = m.clone().lerp(A, K / w),
					L = l.clone().lerp(A, K / w),
					C = w - K;
					for (v = 0; v <= C; v++) y[K][v] = 0 === v && K === w ? E: E.clone().lerp(L, v / C)
				}
				for (K = 0; K < w; K++) for (v = 0; v < 2 * (w - K) - 1; v++) m = Math.floor(v / 2),
				0 === v % 2 ? (e(y[K][m + 1]), e(y[K + 1][m]), e(y[K][m])) : (e(y[K][m + 1]), e(y[K + 1][m + 1]), e(y[K + 1][m]))
			}
		})(d || 0); (function(a) {
			for (var b = new q,
			c = 0; c < h.length; c += 3) b.x = h[c + 0],
			b.y = h[c + 1],
			b.z = h[c + 2],
			b.normalize().multiplyScalar(a),
			h[c + 0] = b.x,
			h[c + 1] = b.y,
			h[c + 2] = b.z
		})(c); (function() {
			for (var a = new q,
			b = 0; b < h.length; b += 3) a.x = h[b + 0],
			a.y = h[b + 1],
			a.z = h[b + 2],
			m.push(Math.atan2(a.z, -a.x) / 2 / Math.PI + .5, 1 - (Math.atan2( - a.y, Math.sqrt(a.x * a.x + a.z * a.z)) / Math.PI + .5));
			for (var a = new q,
			b = new q,
			c = new q,
			d = new q,
			e = new D,
			f = new D,
			l = new D,
			A = 0,
			w = 0; A < h.length; A += 9, w += 6) {
				a.set(h[A + 0], h[A + 1], h[A + 2]);
				b.set(h[A + 3], h[A + 4], h[A + 5]);
				c.set(h[A + 6], h[A + 7], h[A + 8]);
				e.set(m[w + 0], m[w + 1]);
				f.set(m[w + 2], m[w + 3]);
				l.set(m[w + 4], m[w + 5]);
				d.copy(a).add(b).add(c).divideScalar(3);
				var y = Math.atan2(d.z, -d.x);
				g(e, w + 0, a, y);
				g(f, w + 2, b, y);
				g(l, w + 4, c, y)
			}
			for (a = 0; a < m.length; a += 6) b = m[a + 0],
			c = m[a + 2],
			d = m[a + 4],
			e = Math.min(b, c, d),
			.9 < Math.max(b, c, d) && .1 > e && (.2 > b && (m[a + 0] += 1), .2 > c && (m[a + 2] += 1), .2 > d && (m[a + 4] += 1))
		})();
		this.addAttribute("position", new z(h, 3));
		this.addAttribute("normal", new z(h.slice(), 3));
		this.addAttribute("uv", new z(m, 2));
		this.normalizeNormals()
	}
	function Jc(a, b) {
		T.call(this);
		this.type = "TetrahedronGeometry";
		this.parameters = {
			radius: a,
			detail: b
		};
		this.fromBufferGeometry(new Qb(a, b));
		this.mergeVertices()
	}
	function Qb(a, b) {
		Ba.call(this, [1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1], [2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1], a, b);
		this.type = "TetrahedronBufferGeometry";
		this.parameters = {
			radius: a,
			detail: b
		}
	}
	function Kc(a, b) {
		T.call(this);
		this.type = "OctahedronGeometry";
		this.parameters = {
			radius: a,
			detail: b
		};
		this.fromBufferGeometry(new ob(a, b));
		this.mergeVertices()
	}
	function ob(a, b) {
		Ba.call(this, [1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1], [0, 2, 4, 0, 4, 3, 0, 3, 5, 0, 5, 2, 1, 2, 5, 1, 5, 3, 1, 3, 4, 1, 4, 2], a, b);
		this.type = "OctahedronBufferGeometry";
		this.parameters = {
			radius: a,
			detail: b
		}
	}
	function Lc(a, b) {
		T.call(this);
		this.type = "IcosahedronGeometry";
		this.parameters = {
			radius: a,
			detail: b
		};
		this.fromBufferGeometry(new Rb(a, b));
		this.mergeVertices()
	}
	function Rb(a, b) {
		var c = (1 + Math.sqrt(5)) / 2;
		Ba.call(this, [ - 1, c, 0, 1, c, 0, -1, -c, 0, 1, -c, 0, 0, -1, c, 0, 1, c, 0, -1, -c, 0, 1, -c, c, 0, -1, c, 0, 1, -c, 0, -1, -c, 0, 1], [0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11, 1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8, 3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9, 4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1], a, b);
		this.type = "IcosahedronBufferGeometry";
		this.parameters = {
			radius: a,
			detail: b
		}
	}
	function Mc(a, b) {
		T.call(this);
		this.type = "DodecahedronGeometry";
		this.parameters = {
			radius: a,
			detail: b
		};
		this.fromBufferGeometry(new Sb(a, b));
		this.mergeVertices()
	}
	function Sb(a, b) {
		var c = (1 + Math.sqrt(5)) / 2,
		d = 1 / c;
		Ba.call(this, [ - 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, -d, -c, 0, -d, c, 0, d, -c, 0, d, c, -d, -c, 0, -d, c, 0, d, -c, 0, d, c, 0, -c, 0, -d, c, 0, -d, -c, 0, d, c, 0, d], [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], a, b);
		this.type = "DodecahedronBufferGeometry";
		this.parameters = {
			radius: a,
			detail: b
		}
	}
	function Nc(a, b, c, d, e, f) {
		T.call(this);
		this.type = "TubeGeometry";
		this.parameters = {
			path: a,
			tubularSegments: b,
			radius: c,
			radialSegments: d,
			closed: e
		};
		void 0 !== f && console.warn("THREE.TubeGeometry: taper has been removed.");
		a = new Tb(a, b, c, d, e);
		this.tangents = a.tangents;
		this.normals = a.normals;
		this.binormals = a.binormals;
		this.fromBufferGeometry(a);
		this.mergeVertices()
	}
	function Tb(a, b, c, d, e) {
		function f(e) {
			var f = a.getPointAt(e / b),
			k = g.normals[e];
			e = g.binormals[e];
			for (p = 0; p <= d; p++) {
				var t = p / d * Math.PI * 2,
				r = Math.sin(t),
				t = -Math.cos(t);
				m.x = t * k.x + r * e.x;
				m.y = t * k.y + r * e.y;
				m.z = t * k.z + r * e.z;
				m.normalize();
				l.push(m.x, m.y, m.z);
				h.x = f.x + c * m.x;
				h.y = f.y + c * m.y;
				h.z = f.z + c * m.z;
				n.push(h.x, h.y, h.z)
			}
		}
		I.call(this);
		this.type = "TubeBufferGeometry";
		this.parameters = {
			path: a,
			tubularSegments: b,
			radius: c,
			radialSegments: d,
			closed: e
		};
		b = b || 64;
		c = c || 1;
		d = d || 8;
		e = e || !1;
		var g = a.computeFrenetFrames(b, e);
		this.tangents = g.tangents;
		this.normals = g.normals;
		this.binormals = g.binormals;
		var h = new q,
		m = new q,
		k = new D,
		t, p, n = [],
		l = [],
		G = [],
		r = [];
		for (t = 0; t < b; t++) f(t);
		f(!1 === e ? b: 0);
		for (t = 0; t <= b; t++) for (p = 0; p <= d; p++) k.x = t / b,
		k.y = p / d,
		G.push(k.x, k.y); (function() {
			for (p = 1; p <= b; p++) for (t = 1; t <= d; t++) {
				var a = (d + 1) * p + (t - 1),
				c = (d + 1) * p + t,
				e = (d + 1) * (p - 1) + t;
				r.push((d + 1) * (p - 1) + (t - 1), a, e);
				r.push(a, c, e)
			}
		})();
		this.setIndex(r);
		this.addAttribute("position", new z(n, 3));
		this.addAttribute("normal", new z(l, 3));
		this.addAttribute("uv", new z(G, 2))
	}
	function Oc(a, b, c, d, e, f, g) {
		T.call(this);
		this.type = "TorusKnotGeometry";
		this.parameters = {
			radius: a,
			tube: b,
			tubularSegments: c,
			radialSegments: d,
			p: e,
			q: f
		};
		void 0 !== g && console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");
		this.fromBufferGeometry(new Ub(a, b, c, d, e, f));
		this.mergeVertices()
	}
	function Ub(a, b, c, d, e, f) {
		function g(a, b, c, d, e) {
			var f = Math.sin(a);
			b = c / b * a;
			c = Math.cos(b);
			e.x = d * (2 + c) * .5 * Math.cos(a);
			e.y = d * (2 + c) * f * .5;
			e.z = d * Math.sin(b) * .5
		}
		I.call(this);
		this.type = "TorusKnotBufferGeometry";
		this.parameters = {
			radius: a,
			tube: b,
			tubularSegments: c,
			radialSegments: d,
			p: e,
			q: f
		};
		a = a || 100;
		b = b || 40;
		c = Math.floor(c) || 64;
		d = Math.floor(d) || 8;
		e = e || 2;
		f = f || 3;
		var h = [],
		m = [],
		k = [],
		t = [],
		p,
		n,
		l = new q,
		G = new q;
		new D;
		var r = new q,
		A = new q,
		w = new q,
		y = new q,
		K = new q;
		for (p = 0; p <= c; ++p) for (n = p / c * e * Math.PI * 2, g(n, e, f, a, r), g(n + .01, e, f, a, A), y.subVectors(A, r), K.addVectors(A, r), w.crossVectors(y, K), K.crossVectors(w, y), w.normalize(), K.normalize(), n = 0; n <= d; ++n) {
			var v = n / d * Math.PI * 2,
			E = -b * Math.cos(v),
			v = b * Math.sin(v);
			l.x = r.x + (E * K.x + v * w.x);
			l.y = r.y + (E * K.y + v * w.y);
			l.z = r.z + (E * K.z + v * w.z);
			m.push(l.x, l.y, l.z);
			G.subVectors(l, r).normalize();
			k.push(G.x, G.y, G.z);
			t.push(p / c);
			t.push(n / d)
		}
		for (n = 1; n <= c; n++) for (p = 1; p <= d; p++) a = (d + 1) * n + (p - 1),
		b = (d + 1) * n + p,
		e = (d + 1) * (n - 1) + p,
		h.push((d + 1) * (n - 1) + (p - 1), a, e),
		h.push(a, b, e);
		this.setIndex(h);
		this.addAttribute("position", new z(m, 3));
		this.addAttribute("normal", new z(k, 3));
		this.addAttribute("uv", new z(t, 2))
	}
	function Pc(a, b, c, d, e) {
		T.call(this);
		this.type = "TorusGeometry";
		this.parameters = {
			radius: a,
			tube: b,
			radialSegments: c,
			tubularSegments: d,
			arc: e
		};
		this.fromBufferGeometry(new Vb(a, b, c, d, e))
	}
	function Vb(a, b, c, d, e) {
		I.call(this);
		this.type = "TorusBufferGeometry";
		this.parameters = {
			radius: a,
			tube: b,
			radialSegments: c,
			tubularSegments: d,
			arc: e
		};
		a = a || 100;
		b = b || 40;
		c = Math.floor(c) || 8;
		d = Math.floor(d) || 6;
		e = e || 2 * Math.PI;
		var f = [],
		g = [],
		h = [],
		m = [],
		k = new q,
		t = new q,
		p = new q,
		n,
		l;
		for (n = 0; n <= c; n++) for (l = 0; l <= d; l++) {
			var G = l / d * e,
			r = n / c * Math.PI * 2;
			t.x = (a + b * Math.cos(r)) * Math.cos(G);
			t.y = (a + b * Math.cos(r)) * Math.sin(G);
			t.z = b * Math.sin(r);
			g.push(t.x, t.y, t.z);
			k.x = a * Math.cos(G);
			k.y = a * Math.sin(G);
			p.subVectors(t, k).normalize();
			h.push(p.x, p.y, p.z);
			m.push(l / d);
			m.push(n / c)
		}
		for (n = 1; n <= c; n++) for (l = 1; l <= d; l++) a = (d + 1) * (n - 1) + l - 1,
		b = (d + 1) * (n - 1) + l,
		e = (d + 1) * n + l,
		f.push((d + 1) * n + l - 1, a, e),
		f.push(a, b, e);
		this.setIndex(f);
		this.addAttribute("position", new z(g, 3));
		this.addAttribute("normal", new z(h, 3));
		this.addAttribute("uv", new z(m, 2))
	}
	function La(a, b) {
		"undefined" !== typeof a && (T.call(this), this.type = "ExtrudeGeometry", a = Array.isArray(a) ? a: [a], this.addShapeList(a, b), this.computeFaceNormals())
	}
	function Qc(a, b) {
		b = b || {};
		var c = b.font;
		if (!1 === (c && c.isFont)) return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),
		new T;
		c = c.generateShapes(a, b.size, b.curveSegments);
		b.amount = void 0 !== b.height ? b.height: 50;
		void 0 === b.bevelThickness && (b.bevelThickness = 10);
		void 0 === b.bevelSize && (b.bevelSize = 8);
		void 0 === b.bevelEnabled && (b.bevelEnabled = !1);
		La.call(this, c, b);
		this.type = "TextGeometry"
	}
	function Rc(a, b, c, d, e, f, g) {
		T.call(this);
		this.type = "SphereGeometry";
		this.parameters = {
			radius: a,
			widthSegments: b,
			heightSegments: c,
			phiStart: d,
			phiLength: e,
			thetaStart: f,
			thetaLength: g
		};
		this.fromBufferGeometry(new pb(a, b, c, d, e, f, g))
	}
	function pb(a, b, c, d, e, f, g) {
		I.call(this);
		this.type = "SphereBufferGeometry";
		this.parameters = {
			radius: a,
			widthSegments: b,
			heightSegments: c,
			phiStart: d,
			phiLength: e,
			thetaStart: f,
			thetaLength: g
		};
		a = a || 50;
		b = Math.max(3, Math.floor(b) || 8);
		c = Math.max(2, Math.floor(c) || 6);
		d = void 0 !== d ? d: 0;
		e = void 0 !== e ? e: 2 * Math.PI;
		f = void 0 !== f ? f: 0;
		g = void 0 !== g ? g: Math.PI;
		var h = f + g,
		m, k, t = 0,
		p = [],
		n = new q,
		l = new q,
		G = [],
		r = [],
		A = [],
		w = [];
		for (k = 0; k <= c; k++) {
			var y = [],
			K = k / c;
			for (m = 0; m <= b; m++) {
				var v = m / b;
				n.x = -a * Math.cos(d + v * e) * Math.sin(f + K * g);
				n.y = a * Math.cos(f + K * g);
				n.z = a * Math.sin(d + v * e) * Math.sin(f + K * g);
				r.push(n.x, n.y, n.z);
				l.set(n.x, n.y, n.z).normalize();
				A.push(l.x, l.y, l.z);
				w.push(v, 1 - K);
				y.push(t++)
			}
			p.push(y)
		}
		for (k = 0; k < c; k++) for (m = 0; m < b; m++) a = p[k][m + 1],
		d = p[k][m],
		e = p[k + 1][m],
		g = p[k + 1][m + 1],
		(0 !== k || 0 < f) && G.push(a, d, g),
		(k !== c - 1 || h < Math.PI) && G.push(d, e, g);
		this.setIndex(G);
		this.addAttribute("position", new z(r, 3));
		this.addAttribute("normal", new z(A, 3));
		this.addAttribute("uv", new z(w, 2))
	}
	function Sc(a, b, c, d, e, f) {
		T.call(this);
		this.type = "RingGeometry";
		this.parameters = {
			innerRadius: a,
			outerRadius: b,
			thetaSegments: c,
			phiSegments: d,
			thetaStart: e,
			thetaLength: f
		};
		this.fromBufferGeometry(new Wb(a, b, c, d, e, f))
	}
	function Wb(a, b, c, d, e, f) {
		I.call(this);
		this.type = "RingBufferGeometry";
		this.parameters = {
			innerRadius: a,
			outerRadius: b,
			thetaSegments: c,
			phiSegments: d,
			thetaStart: e,
			thetaLength: f
		};
		a = a || 20;
		b = b || 50;
		e = void 0 !== e ? e: 0;
		f = void 0 !== f ? f: 2 * Math.PI;
		c = void 0 !== c ? Math.max(3, c) : 8;
		d = void 0 !== d ? Math.max(1, d) : 1;
		var g = [],
		h = [],
		m = [],
		k = [],
		t = a,
		p = (b - a) / d,
		n = new q,
		l = new D,
		G,
		r;
		for (G = 0; G <= d; G++) {
			for (r = 0; r <= c; r++) a = e + r / c * f,
			n.x = t * Math.cos(a),
			n.y = t * Math.sin(a),
			h.push(n.x, n.y, n.z),
			m.push(0, 0, 1),
			l.x = (n.x / b + 1) / 2,
			l.y = (n.y / b + 1) / 2,
			k.push(l.x, l.y);
			t += p
		}
		for (G = 0; G < d; G++) for (b = G * (c + 1), r = 0; r < c; r++) a = r + b,
		e = a + c + 1,
		f = a + c + 2,
		t = a + 1,
		g.push(a, e, t),
		g.push(e, f, t);
		this.setIndex(g);
		this.addAttribute("position", new z(h, 3));
		this.addAttribute("normal", new z(m, 3));
		this.addAttribute("uv", new z(k, 2))
	}
	function Tc(a, b, c, d) {
		T.call(this);
		this.type = "LatheGeometry";
		this.parameters = {
			points: a,
			segments: b,
			phiStart: c,
			phiLength: d
		};
		this.fromBufferGeometry(new Xb(a, b, c, d));
		this.mergeVertices()
	}
	function Xb(a, b, c, d) {
		I.call(this);
		this.type = "LatheBufferGeometry";
		this.parameters = {
			points: a,
			segments: b,
			phiStart: c,
			phiLength: d
		};
		b = Math.floor(b) || 12;
		c = c || 0;
		d = d || 2 * Math.PI;
		d = N.clamp(d, 0, 2 * Math.PI);
		var e = [],
		f = [],
		g = [],
		h = 1 / b,
		m = new q,
		k = new D,
		t,
		p;
		for (t = 0; t <= b; t++) {
			p = c + t * h * d;
			var n = Math.sin(p),
			l = Math.cos(p);
			for (p = 0; p <= a.length - 1; p++) m.x = a[p].x * n,
			m.y = a[p].y,
			m.z = a[p].x * l,
			f.push(m.x, m.y, m.z),
			k.x = t / b,
			k.y = p / (a.length - 1),
			g.push(k.x, k.y)
		}
		for (t = 0; t < b; t++) for (p = 0; p < a.length - 1; p++) c = p + t * a.length,
		h = c + a.length,
		m = c + a.length + 1,
		k = c + 1,
		e.push(c, h, k),
		e.push(h, m, k);
		this.setIndex(e);
		this.addAttribute("position", new z(f, 3));
		this.addAttribute("uv", new z(g, 2));
		this.computeVertexNormals();
		if (d === 2 * Math.PI) for (d = this.attributes.normal.array, e = new q, f = new q, g = new q, c = b * a.length * 3, p = t = 0; t < a.length; t++, p += 3) e.x = d[p + 0],
		e.y = d[p + 1],
		e.z = d[p + 2],
		f.x = d[c + p + 0],
		f.y = d[c + p + 1],
		f.z = d[c + p + 2],
		g.addVectors(e, f).normalize(),
		d[p + 0] = d[c + p + 0] = g.x,
		d[p + 1] = d[c + p + 1] = g.y,
		d[p + 2] = d[c + p + 2] = g.z
	}
	function Yb(a, b) {
		T.call(this);
		this.type = "ShapeGeometry";
		"object" === typeof b && (console.warn("THREE.ShapeGeometry: Options parameter has been removed."), b = b.curveSegments);
		this.parameters = {
			shapes: a,
			curveSegments: b
		};
		this.fromBufferGeometry(new Zb(a, b));
		this.mergeVertices()
	}
	function Zb(a, b) {
		function c(a) {
			var c, h, k = e.length / 3;
			a = a.extractPoints(b);
			var l = a.shape,
			r = a.holes;
			if (!1 === Ia.isClockWise(l)) for (l = l.reverse(), a = 0, c = r.length; a < c; a++) h = r[a],
			!0 === Ia.isClockWise(h) && (r[a] = h.reverse());
			var q = Ia.triangulateShape(l, r);
			a = 0;
			for (c = r.length; a < c; a++) h = r[a],
			l = l.concat(h);
			a = 0;
			for (c = l.length; a < c; a++) h = l[a],
			e.push(h.x, h.y, 0),
			f.push(0, 0, 1),
			g.push(h.x, h.y);
			a = 0;
			for (c = q.length; a < c; a++) l = q[a],
			d.push(l[0] + k, l[1] + k, l[2] + k),
			m += 3
		}
		I.call(this);
		this.type = "ShapeBufferGeometry";
		this.parameters = {
			shapes: a,
			curveSegments: b
		};
		b = b || 12;
		var d = [],
		e = [],
		f = [],
		g = [],
		h = 0,
		m = 0;
		if (!1 === Array.isArray(a)) c(a);
		else for (var k = 0; k < a.length; k++) c(a[k]),
		this.addGroup(h, m, k),
		h += m,
		m = 0;
		this.setIndex(d);
		this.addAttribute("position", new z(e, 3));
		this.addAttribute("normal", new z(f, 3));
		this.addAttribute("uv", new z(g, 2))
	}
	function $b(a, b) {
		function c(a, b) {
			return a - b
		}
		I.call(this);
		this.type = "EdgesGeometry";
		this.parameters = {
			thresholdAngle: b
		};
		var d = [],
		e = Math.cos(N.DEG2RAD * (void 0 !== b ? b: 1)),
		f = [0, 0],
		g = {},
		h,
		m = ["a", "b", "c"],
		k;
		a.isBufferGeometry ? (k = new T, k.fromBufferGeometry(a)) : k = a.clone();
		k.mergeVertices();
		k.computeFaceNormals();
		var t = k.vertices;
		k = k.faces;
		for (var p = 0,
		n = k.length; p < n; p++) for (var l = k[p], q = 0; 3 > q; q++) f[0] = l[m[q]],
		f[1] = l[m[(q + 1) % 3]],
		f.sort(c),
		h = f.toString(),
		void 0 === g[h] ? g[h] = {
			index1: f[0],
			index2: f[1],
			face1: p,
			face2: void 0
		}: g[h].face2 = p;
		for (h in g) if (f = g[h], void 0 === f.face2 || k[f.face1].normal.dot(k[f.face2].normal) <= e) m = t[f.index1],
		d.push(m.x, m.y, m.z),
		m = t[f.index2],
		d.push(m.x, m.y, m.z);
		this.addAttribute("position", new z(d, 3))
	}
	function qb(a, b, c, d, e, f, g, h) {
		T.call(this);
		this.type = "CylinderGeometry";
		this.parameters = {
			radiusTop: a,
			radiusBottom: b,
			height: c,
			radialSegments: d,
			heightSegments: e,
			openEnded: f,
			thetaStart: g,
			thetaLength: h
		};
		this.fromBufferGeometry(new Va(a, b, c, d, e, f, g, h));
		this.mergeVertices()
	}
	function Va(a, b, c, d, e, f, g, h) {
		function m(c) {
			var e, f, m, r = new D,
			C = new q,
			F = 0,
			x = !0 === c ? a: b,
			H = !0 === c ? 1 : -1;
			f = G;
			for (e = 1; e <= d; e++) p.push(0, A * H, 0),
			n.push(0, H, 0),
			l.push(.5, .5),
			G++;
			m = G;
			for (e = 0; e <= d; e++) {
				var aa = e / d * h + g,
				z = Math.cos(aa),
				aa = Math.sin(aa);
				C.x = x * aa;
				C.y = A * H;
				C.z = x * z;
				p.push(C.x, C.y, C.z);
				n.push(0, H, 0);
				r.x = .5 * z + .5;
				r.y = .5 * aa * H + .5;
				l.push(r.x, r.y);
				G++
			}
			for (e = 0; e < d; e++) r = f + e,
			C = m + e,
			!0 === c ? t.push(C, C + 1, r) : t.push(C + 1, C, r),
			F += 3;
			k.addGroup(w, F, !0 === c ? 1 : 2);
			w += F
		}
		I.call(this);
		this.type = "CylinderBufferGeometry";
		this.parameters = {
			radiusTop: a,
			radiusBottom: b,
			height: c,
			radialSegments: d,
			heightSegments: e,
			openEnded: f,
			thetaStart: g,
			thetaLength: h
		};
		var k = this;
		a = void 0 !== a ? a: 20;
		b = void 0 !== b ? b: 20;
		c = void 0 !== c ? c: 100;
		d = Math.floor(d) || 8;
		e = Math.floor(e) || 1;
		f = void 0 !== f ? f: !1;
		g = void 0 !== g ? g: 0;
		h = void 0 !== h ? h: 2 * Math.PI;
		var t = [],
		p = [],
		n = [],
		l = [],
		G = 0,
		r = [],
		A = c / 2,
		w = 0; (function() {
			var f, m, v = new q,
			E = new q,
			L = 0,
			C = (b - a) / c;
			for (m = 0; m <= e; m++) {
				var F = [],
				x = m / e,
				H = x * (b - a) + a;
				for (f = 0; f <= d; f++) {
					var D = f / d,
					z = D * h + g,
					J = Math.sin(z),
					z = Math.cos(z);
					E.x = H * J;
					E.y = -x * c + A;
					E.z = H * z;
					p.push(E.x, E.y, E.z);
					v.set(J, C, z).normalize();
					n.push(v.x, v.y, v.z);
					l.push(D, 1 - x);
					F.push(G++)
				}
				r.push(F)
			}
			for (f = 0; f < d; f++) for (m = 0; m < e; m++) v = r[m + 1][f],
			E = r[m + 1][f + 1],
			C = r[m][f + 1],
			t.push(r[m][f], v, C),
			t.push(v, E, C),
			L += 6;
			k.addGroup(w, L, 0);
			w += L
		})(); ! 1 === f && (0 < a && m(!0), 0 < b && m(!1));
		this.setIndex(t);
		this.addAttribute("position", new z(p, 3));
		this.addAttribute("normal", new z(n, 3));
		this.addAttribute("uv", new z(l, 2))
	}
	function Uc(a, b, c, d, e, f, g) {
		qb.call(this, 0, a, b, c, d, e, f, g);
		this.type = "ConeGeometry";
		this.parameters = {
			radius: a,
			height: b,
			radialSegments: c,
			heightSegments: d,
			openEnded: e,
			thetaStart: f,
			thetaLength: g
		}
	}
	function Vc(a, b, c, d, e, f, g) {
		Va.call(this, 0, a, b, c, d, e, f, g);
		this.type = "ConeBufferGeometry";
		this.parameters = {
			radius: a,
			height: b,
			radialSegments: c,
			heightSegments: d,
			openEnded: e,
			thetaStart: f,
			thetaLength: g
		}
	}
	function Wc(a, b, c, d) {
		T.call(this);
		this.type = "CircleGeometry";
		this.parameters = {
			radius: a,
			segments: b,
			thetaStart: c,
			thetaLength: d
		};
		this.fromBufferGeometry(new ac(a, b, c, d))
	}
	function ac(a, b, c, d) {
		I.call(this);
		this.type = "CircleBufferGeometry";
		this.parameters = {
			radius: a,
			segments: b,
			thetaStart: c,
			thetaLength: d
		};
		a = a || 50;
		b = void 0 !== b ? Math.max(3, b) : 8;
		c = void 0 !== c ? c: 0;
		d = void 0 !== d ? d: 2 * Math.PI;
		var e = [],
		f = [],
		g = [],
		h = [],
		m,
		k,
		t = new q,
		p = new D;
		f.push(0, 0, 0);
		g.push(0, 0, 1);
		h.push(.5, .5);
		k = 0;
		for (m = 3; k <= b; k++, m += 3) {
			var n = c + k / b * d;
			t.x = a * Math.cos(n);
			t.y = a * Math.sin(n);
			f.push(t.x, t.y, t.z);
			g.push(0, 0, 1);
			p.x = (f[m] / a + 1) / 2;
			p.y = (f[m + 1] / a + 1) / 2;
			h.push(p.x, p.y)
		}
		for (m = 1; m <= b; m++) e.push(m, m + 1, 0);
		this.setIndex(e);
		this.addAttribute("position", new z(f, 3));
		this.addAttribute("normal", new z(g, 3));
		this.addAttribute("uv", new z(h, 2))
	}
	function bc() {
		Ha.call(this, {
			uniforms: Ja.merge([V.lights, {
				opacity: {
					value: 1
				}
			}]),
			vertexShader: Z.shadow_vert,
			fragmentShader: Z.shadow_frag
		});
		this.transparent = this.lights = !0;
		Object.defineProperties(this, {
			opacity: {
				enumerable: !0,
				get: function() {
					return this.uniforms.opacity.value
				},
				set: function(a) {
					this.uniforms.opacity.value = a
				}
			}
		})
	}
	function cc(a) {
		Ha.call(this, a);
		this.type = "RawShaderMaterial"
	}
	function Xc(a) {
		this.uuid = N.generateUUID();
		this.type = "MultiMaterial";
		this.materials = Array.isArray(a) ? a: [];
		this.visible = !0
	}
	function Qa(a) {
		X.call(this);
		this.defines = {
			STANDARD: ""
		};
		this.type = "MeshStandardMaterial";
		this.color = new J(16777215);
		this.metalness = this.roughness = .5;
		this.lightMap = this.map = null;
		this.lightMapIntensity = 1;
		this.aoMap = null;
		this.aoMapIntensity = 1;
		this.emissive = new J(0);
		this.emissiveIntensity = 1;
		this.bumpMap = this.emissiveMap = null;
		this.bumpScale = 1;
		this.normalMap = null;
		this.normalScale = new D(1, 1);
		this.displacementMap = null;
		this.displacementScale = 1;
		this.displacementBias = 0;
		this.envMap = this.alphaMap = this.metalnessMap = this.roughnessMap = null;
		this.envMapIntensity = 1;
		this.refractionRatio = .98;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.wireframeLinejoin = this.wireframeLinecap = "round";
		this.morphNormals = this.morphTargets = this.skinning = !1;
		this.setValues(a)
	}
	function rb(a) {
		Qa.call(this);
		this.defines = {
			PHYSICAL: ""
		};
		this.type = "MeshPhysicalMaterial";
		this.reflectivity = .5;
		this.clearCoatRoughness = this.clearCoat = 0;
		this.setValues(a)
	}
	function Ca(a) {
		X.call(this);
		this.type = "MeshPhongMaterial";
		this.color = new J(16777215);
		this.specular = new J(1118481);
		this.shininess = 30;
		this.lightMap = this.map = null;
		this.lightMapIntensity = 1;
		this.aoMap = null;
		this.aoMapIntensity = 1;
		this.emissive = new J(0);
		this.emissiveIntensity = 1;
		this.bumpMap = this.emissiveMap = null;
		this.bumpScale = 1;
		this.normalMap = null;
		this.normalScale = new D(1, 1);
		this.displacementMap = null;
		this.displacementScale = 1;
		this.displacementBias = 0;
		this.envMap = this.alphaMap = this.specularMap = null;
		this.combine = 0;
		this.reflectivity = 1;
		this.refractionRatio = .98;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.wireframeLinejoin = this.wireframeLinecap = "round";
		this.morphNormals = this.morphTargets = this.skinning = !1;
		this.setValues(a)
	}
	function sb(a) {
		Ca.call(this);
		this.defines = {
			TOON: ""
		};
		this.type = "MeshToonMaterial";
		this.gradientMap = null;
		this.setValues(a)
	}
	function tb(a) {
		X.call(this, a);
		this.type = "MeshNormalMaterial";
		this.bumpMap = null;
		this.bumpScale = 1;
		this.normalMap = null;
		this.normalScale = new D(1, 1);
		this.displacementMap = null;
		this.displacementScale = 1;
		this.displacementBias = 0;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.morphNormals = this.morphTargets = this.skinning = this.lights = this.fog = !1;
		this.setValues(a)
	}
	function ub(a) {
		X.call(this);
		this.type = "MeshLambertMaterial";
		this.color = new J(16777215);
		this.lightMap = this.map = null;
		this.lightMapIntensity = 1;
		this.aoMap = null;
		this.aoMapIntensity = 1;
		this.emissive = new J(0);
		this.emissiveIntensity = 1;
		this.envMap = this.alphaMap = this.specularMap = this.emissiveMap = null;
		this.combine = 0;
		this.reflectivity = 1;
		this.refractionRatio = .98;
		this.wireframe = !1;
		this.wireframeLinewidth = 1;
		this.wireframeLinejoin = this.wireframeLinecap = "round";
		this.morphNormals = this.morphTargets = this.skinning = !1;
		this.setValues(a)
	}
	function vb(a) {
		X.call(this);
		this.type = "LineDashedMaterial";
		this.color = new J(16777215);
		this.scale = this.linewidth = 1;
		this.dashSize = 3;
		this.gapSize = 1;
		this.lights = !1;
		this.setValues(a)
	}
	function $d(a, b, c) {
		var d = this,
		e = !1,
		f = 0,
		g = 0;
		this.onStart = void 0;
		this.onLoad = a;
		this.onProgress = b;
		this.onError = c;
		this.itemStart = function(a) {
			g++;
			if (!1 === e && void 0 !== d.onStart) d.onStart(a, f, g);
			e = !0
		};
		this.itemEnd = function(a) {
			f++;
			if (void 0 !== d.onProgress) d.onProgress(a, f, g);
			if (f === g && (e = !1, void 0 !== d.onLoad)) d.onLoad()
		};
		this.itemError = function(a) {
			if (void 0 !== d.onError) d.onError(a)
		}
	}
	function sa(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function Re(a) {
		this.manager = void 0 !== a ? a: ta;
		this._parser = null
	}
	function ae(a) {
		this.manager = void 0 !== a ? a: ta;
		this._parser = null
	}
	function Yc(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function be(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function td(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function ma(a, b) {
		x.call(this);
		this.type = "Light";
		this.color = new J(a);
		this.intensity = void 0 !== b ? b: 1;
		this.receiveShadow = void 0
	}
	function ud(a, b, c) {
		ma.call(this, a, c);
		this.type = "HemisphereLight";
		this.castShadow = void 0;
		this.position.copy(x.DefaultUp);
		this.updateMatrix();
		this.groundColor = new J(b)
	}
	function wb(a) {
		this.camera = a;
		this.bias = 0;
		this.radius = 1;
		this.mapSize = new D(512, 512);
		this.map = null;
		this.matrix = new S
	}
	function vd() {
		wb.call(this, new Fa(50, 1, .5, 500))
	}
	function wd(a, b, c, d, e, f) {
		ma.call(this, a, b);
		this.type = "SpotLight";
		this.position.copy(x.DefaultUp);
		this.updateMatrix();
		this.target = new x;
		Object.defineProperty(this, "power", {
			get: function() {
				return this.intensity * Math.PI
			},
			set: function(a) {
				this.intensity = a / Math.PI
			}
		});
		this.distance = void 0 !== c ? c: 0;
		this.angle = void 0 !== d ? d: Math.PI / 3;
		this.penumbra = void 0 !== e ? e: 0;
		this.decay = void 0 !== f ? f: 1;
		this.shadow = new vd
	}
	function xd(a, b, c, d) {
		ma.call(this, a, b);
		this.type = "PointLight";
		Object.defineProperty(this, "power", {
			get: function() {
				return 4 * this.intensity * Math.PI
			},
			set: function(a) {
				this.intensity = a / (4 * Math.PI)
			}
		});
		this.distance = void 0 !== c ? c: 0;
		this.decay = void 0 !== d ? d: 1;
		this.shadow = new wb(new Fa(90, 1, .5, 500))
	}
	function yd() {
		wb.call(this, new Jb( - 5, 5, 5, -5, .5, 500))
	}
	function zd(a, b) {
		ma.call(this, a, b);
		this.type = "DirectionalLight";
		this.position.copy(x.DefaultUp);
		this.updateMatrix();
		this.target = new x;
		this.shadow = new yd
	}
	function Ad(a, b) {
		ma.call(this, a, b);
		this.type = "AmbientLight";
		this.castShadow = void 0
	}
	function xa(a, b, c, d) {
		this.parameterPositions = a;
		this._cachedIndex = 0;
		this.resultBuffer = void 0 !== d ? d: new b.constructor(c);
		this.sampleValues = b;
		this.valueSize = c
	}
	function Bd(a, b, c, d) {
		xa.call(this, a, b, c, d);
		this._offsetNext = this._weightNext = this._offsetPrev = this._weightPrev = -0
	}
	function Zc(a, b, c, d) {
		xa.call(this, a, b, c, d)
	}
	function Cd(a, b, c, d) {
		xa.call(this, a, b, c, d)
	}
	function xb(a, b, c, d) {
		if (void 0 === a) throw Error("track name is undefined");
		if (void 0 === b || 0 === b.length) throw Error("no keyframes in track named " + a);
		this.name = a;
		this.times = na.convertArray(b, this.TimeBufferType);
		this.values = na.convertArray(c, this.ValueBufferType);
		this.setInterpolation(d || this.DefaultInterpolation);
		this.validate();
		this.optimize()
	}
	function dc(a, b, c, d) {
		xb.call(this, a, b, c, d)
	}
	function Dd(a, b, c, d) {
		xa.call(this, a, b, c, d)
	}
	function $c(a, b, c, d) {
		xb.call(this, a, b, c, d)
	}
	function ec(a, b, c, d) {
		xb.call(this, a, b, c, d)
	}
	function Ed(a, b, c, d) {
		xb.call(this, a, b, c, d)
	}
	function Fd(a, b, c) {
		xb.call(this, a, b, c)
	}
	function Gd(a, b, c, d) {
		xb.call(this, a, b, c, d)
	}
	function yb(a, b, c, d) {
		xb.apply(this, arguments)
	}
	function qa(a, b, c) {
		this.name = a;
		this.tracks = c;
		this.duration = void 0 !== b ? b: -1;
		this.uuid = N.generateUUID();
		0 > this.duration && this.resetDuration();
		this.optimize()
	}
	function Hd(a) {
		this.manager = void 0 !== a ? a: ta;
		this.textures = {}
	}
	function ce(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function zb() {
		this.onLoadStart = function() {};
		this.onLoadProgress = function() {};
		this.onLoadComplete = function() {}
	}
	function de(a) {
		"boolean" === typeof a && (console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."), a = void 0);
		this.manager = void 0 !== a ? a: ta;
		this.withCredentials = !1
	}
	function Se(a) {
		this.manager = void 0 !== a ? a: ta;
		this.texturePath = ""
	}
	function Te(a, b, c, d, e) {
		b = .5 * (d - b);
		e = .5 * (e - c);
		var f = a * a;
		return (2 * c - 2 * d + b + e) * a * f + ( - 3 * c + 3 * d - 2 * b - e) * f + b * a + c
	}
	function Ab(a, b, c, d) {
		var e = 1 - a;
		return e * e * b + 2 * (1 - a) * a * c + a * a * d
	}
	function Bb(a, b, c, d, e) {
		var f = 1 - a,
		g = 1 - a;
		return f * f * f * b + 3 * g * g * a * c + 3 * (1 - a) * a * a * d + a * a * a * e
	}
	function ua() {}
	function Ta(a, b) {
		this.v1 = a;
		this.v2 = b
	}
	function ad() {
		this.curves = [];
		this.autoClose = !1
	}
	function Wa(a, b, c, d, e, f, g, h) {
		this.aX = a;
		this.aY = b;
		this.xRadius = c;
		this.yRadius = d;
		this.aStartAngle = e;
		this.aEndAngle = f;
		this.aClockwise = g;
		this.aRotation = h || 0
	}
	function Cb(a) {
		this.points = void 0 === a ? [] : a
	}
	function fc(a, b, c, d) {
		this.v0 = a;
		this.v1 = b;
		this.v2 = c;
		this.v3 = d
	}
	function gc(a, b, c) {
		this.v0 = a;
		this.v1 = b;
		this.v2 = c
	}
	function bd(a) {
		ad.call(this);
		this.currentPoint = new D;
		a && this.fromPoints(a)
	}
	function Db() {
		bd.apply(this, arguments);
		this.holes = []
	}
	function ee() {
		this.subPaths = [];
		this.currentPath = null
	}
	function fe(a) {
		this.data = a
	}
	function Ue(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function ge(a) {
		this.manager = void 0 !== a ? a: ta
	}
	function he(a, b, c, d) {
		ma.call(this, a, b);
		this.type = "RectAreaLight";
		this.position.set(0, 1, 0);
		this.updateMatrix();
		this.width = void 0 !== c ? c: 10;
		this.height = void 0 !== d ? d: 10
	}
	function Ve() {
		this.type = "StereoCamera";
		this.aspect = 1;
		this.eyeSep = .064;
		this.cameraL = new Fa;
		this.cameraL.layers.enable(1);
		this.cameraL.matrixAutoUpdate = !1;
		this.cameraR = new Fa;
		this.cameraR.layers.enable(2);
		this.cameraR.matrixAutoUpdate = !1
	}
	function Id(a, b, c) {
		x.call(this);
		this.type = "CubeCamera";
		var d = new Fa(90, 1, a, b);
		d.up.set(0, -1, 0);
		d.lookAt(new q(1, 0, 0));
		this.add(d);
		var e = new Fa(90, 1, a, b);
		e.up.set(0, -1, 0);
		e.lookAt(new q( - 1, 0, 0));
		this.add(e);
		var f = new Fa(90, 1, a, b);
		f.up.set(0, 0, 1);
		f.lookAt(new q(0, 1, 0));
		this.add(f);
		var g = new Fa(90, 1, a, b);
		g.up.set(0, 0, -1);
		g.lookAt(new q(0, -1, 0));
		this.add(g);
		var h = new Fa(90, 1, a, b);
		h.up.set(0, -1, 0);
		h.lookAt(new q(0, 0, 1));
		this.add(h);
		var m = new Fa(90, 1, a, b);
		m.up.set(0, -1, 0);
		m.lookAt(new q(0, 0, -1));
		this.add(m);
		this.renderTarget = new Gb(c, c, {
			format: 1022,
			magFilter: 1006,
			minFilter: 1006
		});
		this.updateCubeMap = function(a, b) {
			null === this.parent && this.updateMatrixWorld();
			var c = this.renderTarget,
			n = c.texture.generateMipmaps;
			c.texture.generateMipmaps = !1;
			c.activeCubeFace = 0;
			a.render(b, d, c);
			c.activeCubeFace = 1;
			a.render(b, e, c);
			c.activeCubeFace = 2;
			a.render(b, f, c);
			c.activeCubeFace = 3;
			a.render(b, g, c);
			c.activeCubeFace = 4;
			a.render(b, h, c);
			c.texture.generateMipmaps = n;
			c.activeCubeFace = 5;
			a.render(b, m, c);
			a.setRenderTarget(null)
		}
	}
	function ie() {
		x.call(this);
		this.type = "AudioListener";
		this.context = je.getContext();
		this.gain = this.context.createGain();
		this.gain.connect(this.context.destination);
		this.filter = null
	}
	function hc(a) {
		x.call(this);
		this.type = "Audio";
		this.context = a.context;
		this.gain = this.context.createGain();
		this.gain.connect(a.getInput());
		this.autoplay = !1;
		this.buffer = null;
		this.loop = !1;
		this.startTime = 0;
		this.playbackRate = 1;
		this.isPlaying = !1;
		this.hasPlaybackControl = !0;
		this.sourceType = "empty";
		this.filters = []
	}
	function ke(a) {
		hc.call(this, a);
		this.panner = this.context.createPanner();
		this.panner.connect(this.gain)
	}
	function le(a, b) {
		this.analyser = a.context.createAnalyser();
		this.analyser.fftSize = void 0 !== b ? b: 2048;
		this.data = new Uint8Array(this.analyser.frequencyBinCount);
		a.getOutput().connect(this.analyser)
	}
	function Jd(a, b, c) {
		this.binding = a;
		this.valueSize = c;
		a = Float64Array;
		switch (b) {
		case "quaternion":
			b = this._slerp;
			break;
		case "string":
		case "bool":
			a = Array;
			b = this._select;
			break;
		default:
			b = this._lerp
		}
		this.buffer = new a(4 * c);
		this._mixBufferRegion = b;
		this.referenceCount = this.useCount = this.cumulativeWeight = 0
	}
	function ka(a, b, c) {
		this.path = b;
		this.parsedPath = c || ka.parseTrackName(b);
		this.node = ka.findNode(a, this.parsedPath.nodeName) || a;
		this.rootNode = a
	}
	function me(a) {
		this.uuid = N.generateUUID();
		this._objects = Array.prototype.slice.call(arguments);
		this.nCachedObjects_ = 0;
		var b = {};
		this._indicesByUUID = b;
		for (var c = 0,
		d = arguments.length; c !== d; ++c) b[arguments[c].uuid] = c;
		this._paths = [];
		this._parsedPaths = [];
		this._bindings = [];
		this._bindingsIndicesByPath = {};
		var e = this;
		this.stats = {
			objects: {
				get total() {
					return e._objects.length
				},
				get inUse() {
					return this.total - e.nCachedObjects_
				}
			},
			get bindingsPerObject() {
				return e._bindings.length
			}
		}
	}
	function ne(a, b, c) {
		this._mixer = a;
		this._clip = b;
		this._localRoot = c || null;
		a = b.tracks;
		b = a.length;
		c = Array(b);
		for (var d = {
			endingStart: 2400,
			endingEnd: 2400
		},
		e = 0; e !== b; ++e) {
			var f = a[e].createInterpolant(null);
			c[e] = f;
			f.settings = d
		}
		this._interpolantSettings = d;
		this._interpolants = c;
		this._propertyBindings = Array(b);
		this._weightInterpolant = this._timeScaleInterpolant = this._byClipCacheIndex = this._cacheIndex = null;
		this.loop = 2201;
		this._loopCount = -1;
		this._startTime = null;
		this.time = 0;
		this._effectiveWeight = this.weight = this._effectiveTimeScale = this.timeScale = 1;
		this.repetitions = Infinity;
		this.paused = !1;
		this.enabled = !0;
		this.clampWhenFinished = !1;
		this.zeroSlopeAtEnd = this.zeroSlopeAtStart = !0
	}
	function cd(a) {
		this._root = a;
		this._initMemoryManager();
		this.time = this._accuIndex = 0;
		this.timeScale = 1
	}
	function Kd(a, b) {
		"string" === typeof a && (console.warn("THREE.Uniform: Type parameter is no longer needed."), a = b);
		this.value = a
	}
	function Eb() {
		I.call(this);
		this.type = "InstancedBufferGeometry";
		this.maxInstancedCount = void 0
	}
	function oe(a, b, c, d) {
		this.uuid = N.generateUUID();
		this.data = a;
		this.itemSize = b;
		this.offset = c;
		this.normalized = !0 === d
	}
	function ic(a, b) {
		this.uuid = N.generateUUID();
		this.array = a;
		this.stride = b;
		this.count = void 0 !== a ? a.length / b: 0;
		this.dynamic = !1;
		this.updateRange = {
			offset: 0,
			count: -1
		};
		this.onUploadCallback = function() {};
		this.version = 0
	}
	function jc(a, b, c) {
		ic.call(this, a, b);
		this.meshPerAttribute = c || 1
	}
	function kc(a, b, c) {
		U.call(this, a, b);
		this.meshPerAttribute = c || 1
	}
	function pe(a, b, c, d) {
		this.ray = new cb(a, b);
		this.near = c || 0;
		this.far = d || Infinity;
		this.params = {
			Mesh: {},
			Line: {},
			LOD: {},
			Points: {
				threshold: 1
			},
			Sprite: {}
		};
		Object.defineProperties(this.params, {
			PointCloud: {
				get: function() {
					console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");
					return this.Points
				}
			}
		})
	}
	function We(a, b) {
		return a.distance - b.distance
	}
	function qe(a, b, c, d) {
		if (!1 !== a.visible && (a.raycast(b, c), !0 === d)) {
			a = a.children;
			d = 0;
			for (var e = a.length; d < e; d++) qe(a[d], b, c, !0)
		}
	}
	function re(a) {
		this.autoStart = void 0 !== a ? a: !0;
		this.elapsedTime = this.oldTime = this.startTime = 0;
		this.running = !1
	}
	function se(a, b, c) {
		this.radius = void 0 !== a ? a: 1;
		this.phi = void 0 !== b ? b: 0;
		this.theta = void 0 !== c ? c: 0;
		return this
	}
	function te(a, b, c) {
		this.radius = void 0 !== a ? a: 1;
		this.theta = void 0 !== b ? b: 0;
		this.y = void 0 !== c ? c: 0;
		return this
	}
	function oa(a, b) {
		Aa.call(this, a, b);
		this.animationsMap = {};
		this.animationsList = [];
		var c = this.geometry.morphTargets.length;
		this.createAnimation("__default", 0, c - 1, c / 1);
		this.setAnimationWeight("__default", 1)
	}
	function dd(a) {
		x.call(this);
		this.material = a;
		this.render = function(a) {}
	}
	function ed(a, b, c, d) {
		this.object = a;
		this.size = void 0 !== b ? b: 1;
		a = void 0 !== c ? c: 16711680;
		d = void 0 !== d ? d: 1;
		b = 0; (c = this.object.geometry) && c.isGeometry ? b = 3 * c.faces.length: c && c.isBufferGeometry && (b = c.attributes.normal.count);
		c = new I;
		b = new z(6 * b, 3);
		c.addAttribute("position", b);
		ga.call(this, c, new ia({
			color: a,
			linewidth: d
		}));
		this.matrixAutoUpdate = !1;
		this.update()
	}
	function lc(a) {
		x.call(this);
		this.light = a;
		this.light.updateMatrixWorld();
		this.matrix = a.matrixWorld;
		this.matrixAutoUpdate = !1;
		a = new I;
		for (var b = [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], c = 0, d = 1; 32 > c; c++, d++) {
			var e = c / 32 * Math.PI * 2,
			f = d / 32 * Math.PI * 2;
			b.push(Math.cos(e), Math.sin(e), 1, Math.cos(f), Math.sin(f), 1)
		}
		a.addAttribute("position", new z(b, 3));
		b = new ia({
			fog: !1
		});
		this.cone = new ga(a, b);
		this.add(this.cone);
		this.update()
	}
	function mc(a) {
		this.bones = this.getBoneList(a);
		for (var b = new I,
		c = [], d = [], e = new J(0, 0, 1), f = new J(0, 1, 0), g = 0; g < this.bones.length; g++) {
			var h = this.bones[g];
			h.parent && h.parent.isBone && (c.push(0, 0, 0), c.push(0, 0, 0), d.push(e.r, e.g, e.b), d.push(f.r, f.g, f.b))
		}
		b.addAttribute("position", new z(c, 3));
		b.addAttribute("color", new z(d, 3));
		c = new ia({
			vertexColors: 2,
			depthTest: !1,
			depthWrite: !1,
			transparent: !0
		});
		ga.call(this, b, c);
		this.root = a;
		this.matrix = a.matrixWorld;
		this.matrixAutoUpdate = !1;
		this.update()
	}
	function nc(a, b) {
		this.light = a;
		this.light.updateMatrixWorld();
		var c = new pb(b, 4, 2),
		d = new Ka({
			wireframe: !0,
			fog: !1
		});
		d.color.copy(this.light.color).multiplyScalar(this.light.intensity);
		Aa.call(this, c, d);
		this.matrix = this.light.matrixWorld;
		this.matrixAutoUpdate = !1
	}
	function oc(a) {
		x.call(this);
		this.light = a;
		this.light.updateMatrixWorld();
		var b = new Ka({
			color: a.color,
			fog: !1
		});
		a = new Ka({
			color: a.color,
			fog: !1,
			wireframe: !0
		});
		var c = new I;
		c.addAttribute("position", new U(new Float32Array(18), 3));
		this.add(new Aa(c, b));
		this.add(new Aa(c, a));
		this.update()
	}
	function pc(a, b) {
		x.call(this);
		this.light = a;
		this.light.updateMatrixWorld();
		this.matrix = a.matrixWorld;
		this.matrixAutoUpdate = !1;
		var c = new ob(b);
		c.rotateY(.5 * Math.PI);
		var d = new Ka({
			vertexColors: 2,
			wireframe: !0
		}),
		e = c.getAttribute("position"),
		e = new Float32Array(3 * e.count);
		c.addAttribute("color", new U(e, 3));
		this.add(new Aa(c, d));
		this.update()
	}
	function fd(a, b, c, d) {
		a = a || 10;
		b = b || 10;
		c = new J(void 0 !== c ? c: 4473924);
		d = new J(void 0 !== d ? d: 8947848);
		var e = b / 2,
		f = a / b,
		g = a / 2;
		a = [];
		for (var h = [], m = 0, k = 0, t = -g; m <= b; m++, t += f) {
			a.push( - g, 0, t, g, 0, t);
			a.push(t, 0, -g, t, 0, g);
			var l = m === e ? c: d;
			l.toArray(h, k);
			k += 3;
			l.toArray(h, k);
			k += 3;
			l.toArray(h, k);
			k += 3;
			l.toArray(h, k);
			k += 3
		}
		b = new I;
		b.addAttribute("position", new z(a, 3));
		b.addAttribute("color", new z(h, 3));
		c = new ia({
			vertexColors: 2
		});
		ga.call(this, b, c)
	}
	function Ld(a, b, c, d, e, f) {
		a = a || 10;
		b = b || 16;
		c = c || 8;
		d = d || 64;
		e = new J(void 0 !== e ? e: 4473924);
		f = new J(void 0 !== f ? f: 8947848);
		var g = [],
		h = [],
		m,
		k,
		t,
		l,
		n;
		for (t = 0; t <= b; t++) k = t / b * 2 * Math.PI,
		m = Math.sin(k) * a,
		k = Math.cos(k) * a,
		g.push(0, 0, 0),
		g.push(m, 0, k),
		n = t & 1 ? e: f,
		h.push(n.r, n.g, n.b),
		h.push(n.r, n.g, n.b);
		for (t = 0; t <= c; t++) for (n = t & 1 ? e: f, l = a - a / c * t, b = 0; b < d; b++) k = b / d * 2 * Math.PI,
		m = Math.sin(k) * l,
		k = Math.cos(k) * l,
		g.push(m, 0, k),
		h.push(n.r, n.g, n.b),
		k = (b + 1) / d * 2 * Math.PI,
		m = Math.sin(k) * l,
		k = Math.cos(k) * l,
		g.push(m, 0, k),
		h.push(n.r, n.g, n.b);
		a = new I;
		a.addAttribute("position", new z(g, 3));
		a.addAttribute("color", new z(h, 3));
		g = new ia({
			vertexColors: 2
		});
		ga.call(this, a, g)
	}
	function gd(a, b, c, d) {
		this.object = a;
		this.size = void 0 !== b ? b: 1;
		a = void 0 !== c ? c: 16776960;
		d = void 0 !== d ? d: 1;
		b = 0; (c = this.object.geometry) && c.isGeometry ? b = c.faces.length: console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");
		c = new I;
		b = new z(6 * b, 3);
		c.addAttribute("position", b);
		ga.call(this, c, new ia({
			color: a,
			linewidth: d
		}));
		this.matrixAutoUpdate = !1;
		this.update()
	}
	function qc(a, b) {
		x.call(this);
		this.light = a;
		this.light.updateMatrixWorld();
		this.matrix = a.matrixWorld;
		this.matrixAutoUpdate = !1;
		void 0 === b && (b = 1);
		var c = new I;
		c.addAttribute("position", new z([ - b, b, 0, b, b, 0, b, -b, 0, -b, -b, 0, -b, b, 0], 3));
		var d = new ia({
			fog: !1
		});
		this.add(new Ua(c, d));
		c = new I;
		c.addAttribute("position", new z([0, 0, 0, 0, 0, 1], 3));
		this.add(new Ua(c, d));
		this.update()
	}
	function hd(a) {
		function b(a, b, d) {
			c(a, d);
			c(b, d)
		}
		function c(a, b) {
			f.push(0, 0, 0);
			g.push(b.r, b.g, b.b);
			void 0 === h[a] && (h[a] = []);
			h[a].push(f.length / 3 - 1)
		}
		var d = new I,
		e = new ia({
			color: 16777215,
			vertexColors: 1
		}),
		f = [],
		g = [],
		h = {},
		m = new J(16755200),
		k = new J(16711680),
		l = new J(43775),
		p = new J(16777215),
		n = new J(3355443);
		b("n1", "n2", m);
		b("n2", "n4", m);
		b("n4", "n3", m);
		b("n3", "n1", m);
		b("f1", "f2", m);
		b("f2", "f4", m);
		b("f4", "f3", m);
		b("f3", "f1", m);
		b("n1", "f1", m);
		b("n2", "f2", m);
		b("n3", "f3", m);
		b("n4", "f4", m);
		b("p", "n1", k);
		b("p", "n2", k);
		b("p", "n3", k);
		b("p", "n4", k);
		b("u1", "u2", l);
		b("u2", "u3", l);
		b("u3", "u1", l);
		b("c", "t", p);
		b("p", "c", n);
		b("cn1", "cn2", n);
		b("cn3", "cn4", n);
		b("cf1", "cf2", n);
		b("cf3", "cf4", n);
		d.addAttribute("position", new z(f, 3));
		d.addAttribute("color", new z(g, 3));
		ga.call(this, d, e);
		this.camera = a;
		this.camera.updateProjectionMatrix && this.camera.updateProjectionMatrix();
		this.matrix = a.matrixWorld;
		this.matrixAutoUpdate = !1;
		this.pointMap = h;
		this.update()
	}
	function rc(a, b) {
		void 0 === b && (b = 16776960);
		var c = new Uint16Array([0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7]),
		d = new Float32Array(24),
		e = new I;
		e.setIndex(new U(c, 1));
		e.addAttribute("position", new U(d, 3));
		ga.call(this, e, new ia({
			color: b
		}));
		void 0 !== a && this.update(a)
	}
	function Fb(a, b, c, d, e, f) {
		x.call(this);
		void 0 === d && (d = 16776960);
		void 0 === c && (c = 1);
		void 0 === e && (e = .2 * c);
		void 0 === f && (f = .2 * e);
		void 0 === Md && (Md = new I, Md.addAttribute("position", new z([0, 0, 0, 0, 1, 0], 3)), ue = new Va(0, .5, 1, 5, 1), ue.translate(0, -.5, 0));
		this.position.copy(b);
		this.line = new Ua(Md, new ia({
			color: d
		}));
		this.line.matrixAutoUpdate = !1;
		this.add(this.line);
		this.cone = new Aa(ue, new Ka({
			color: d
		}));
		this.cone.matrixAutoUpdate = !1;
		this.add(this.cone);
		this.setDirection(a);
		this.setLength(c, e, f)
	}
	function Nd(a) {
		a = a || 1;
		var b = [0, 0, 0, a, 0, 0, 0, 0, 0, 0, a, 0, 0, 0, 0, 0, 0, a];
		a = new I;
		a.addAttribute("position", new z(b, 3));
		a.addAttribute("color", new z([1, 0, 0, 1, .6, 0, 0, 1, 0, .6, 1, 0, 0, 0, 1, 0, .6, 1], 3));
		b = new ia({
			vertexColors: 2
		});
		ga.call(this, a, b)
	}
	function ve() {
		var a = 0,
		b = 0,
		c = 0,
		d = 0;
		return {
			initCatmullRom: function(e, f, g, h, m) {
				e = m * (g - e);
				h = m * (h - f);
				a = f;
				b = e;
				c = -3 * f + 3 * g - 2 * e - h;
				d = 2 * f - 2 * g + e + h
			},
			initNonuniformCatmullRom: function(e, f, g, h, m, k, l) {
				e = ((f - e) / m - (g - e) / (m + k) + (g - f) / k) * k;
				h = ((g - f) / k - (h - f) / (k + l) + (h - g) / l) * k;
				a = f;
				b = e;
				c = -3 * f + 3 * g - 2 * e - h;
				d = 2 * f - 2 * g + e + h
			},
			calc: function(e) {
				var f = e * e;
				return a + b * e + c * f + d * f * e
			}
		}
	}
	function va(a) {
		this.points = a || [];
		this.closed = !1
	}
	function id(a, b, c, d) {
		this.v0 = a;
		this.v1 = b;
		this.v2 = c;
		this.v3 = d
	}
	function jd(a, b, c) {
		this.v0 = a;
		this.v1 = b;
		this.v2 = c
	}
	function kd(a, b) {
		this.v1 = a;
		this.v2 = b
	}
	function Od(a, b, c, d, e, f) {
		Wa.call(this, a, b, c, c, d, e, f)
	}
	function Xe(a) {
		console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");
		va.call(this, a);
		this.type = "catmullrom";
		this.closed = !0
	}
	function Ye(a) {
		console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");
		va.call(this, a);
		this.type = "catmullrom"
	}
	function we(a) {
		console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");
		va.call(this, a);
		this.type = "catmullrom"
	}
	void 0 === Number.EPSILON && (Number.EPSILON = Math.pow(2, -52));
	void 0 === Math.sign && (Math.sign = function(a) {
		return 0 > a ? -1 : 0 < a ? 1 : +a
	});
	void 0 === Function.prototype.name && Object.defineProperty(Function.prototype, "name", {
		get: function() {
			return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]
		}
	});
	void 0 === Object.assign &&
	function() {
		Object.assign = function(a) {
			if (void 0 === a || null === a) throw new TypeError("Cannot convert undefined or null to object");
			for (var b = Object(a), c = 1; c < arguments.length; c++) {
				var d = arguments[c];
				if (void 0 !== d && null !== d) for (var e in d) Object.prototype.hasOwnProperty.call(d, e) && (b[e] = d[e])
			}
			return b
		}
	} ();
	pa.prototype = {
		addEventListener: function(a, b) {
			void 0 === this._listeners && (this._listeners = {});
			var c = this._listeners;
			void 0 === c[a] && (c[a] = []); - 1 === c[a].indexOf(b) && c[a].push(b)
		},
		hasEventListener: function(a, b) {
			if (void 0 === this._listeners) return ! 1;
			var c = this._listeners;
			return void 0 !== c[a] && -1 !== c[a].indexOf(b)
		},
		removeEventListener: function(a, b) {
			if (void 0 !== this._listeners) {
				var c = this._listeners[a];
				if (void 0 !== c) {
					var d = c.indexOf(b); - 1 !== d && c.splice(d, 1)
				}
			}
		},
		dispatchEvent: function(a) {
			if (void 0 !== this._listeners) {
				var b = this._listeners[a.type];
				if (void 0 !== b) {
					a.target = this;
					var c = [],
					d,
					e = b.length;
					for (d = 0; d < e; d++) c[d] = b[d];
					for (d = 0; d < e; d++) c[d].call(this, a)
				}
			}
		}
	};
	var N = {
		DEG2RAD: Math.PI / 180,
		RAD2DEG: 180 / Math.PI,
		generateUUID: function() {
			var a = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split(""),
			b = Array(36),
			c = 0,
			d;
			return function() {
				for (var e = 0; 36 > e; e++) 8 === e || 13 === e || 18 === e || 23 === e ? b[e] = "-": 14 === e ? b[e] = "4": (2 >= c && (c = 33554432 + 16777216 * Math.random() | 0), d = c & 15, c >>= 4, b[e] = a[19 === e ? d & 3 | 8 : d]);
				return b.join("")
			}
		} (),
		clamp: function(a, b, c) {
			return Math.max(b, Math.min(c, a))
		},
		euclideanModulo: function(a, b) {
			return (a % b + b) % b
		},
		mapLinear: function(a, b, c, d, e) {
			return d + (a - b) * (e - d) / (c - b)
		},
		lerp: function(a, b, c) {
			return (1 - c) * a + c * b
		},
		smoothstep: function(a, b, c) {
			if (a <= b) return 0;
			if (a >= c) return 1;
			a = (a - b) / (c - b);
			return a * a * (3 - 2 * a)
		},
		smootherstep: function(a, b, c) {
			if (a <= b) return 0;
			if (a >= c) return 1;
			a = (a - b) / (c - b);
			return a * a * a * (a * (6 * a - 15) + 10)
		},
		randInt: function(a, b) {
			return a + Math.floor(Math.random() * (b - a + 1))
		},
		randFloat: function(a, b) {
			return a + Math.random() * (b - a)
		},
		randFloatSpread: function(a) {
			return a * (.5 - Math.random())
		},
		degToRad: function(a) {
			return a * N.DEG2RAD
		},
		radToDeg: function(a) {
			return a * N.RAD2DEG
		},
		isPowerOfTwo: function(a) {
			return 0 === (a & a - 1) && 0 !== a
		},
		nearestPowerOfTwo: function(a) {
			return Math.pow(2, Math.round(Math.log(a) / Math.LN2))
		},
		nextPowerOfTwo: function(a) {
			a--;
			a |= a >> 1;
			a |= a >> 2;
			a |= a >> 4;
			a |= a >> 8;
			a |= a >> 16;
			a++;
			return a
		}
	};
	D.prototype = {
		constructor: D,
		isVector2: !0,
		get width() {
			return this.x
		},
		set width(a) {
			this.x = a
		},
		get height() {
			return this.y
		},
		set height(a) {
			this.y = a
		},
		set: function(a, b) {
			this.x = a;
			this.y = b;
			return this
		},
		setScalar: function(a) {
			this.y = this.x = a;
			return this
		},
		setX: function(a) {
			this.x = a;
			return this
		},
		setY: function(a) {
			this.y = a;
			return this
		},
		setComponent: function(a, b) {
			switch (a) {
			case 0:
				this.x = b;
				break;
			case 1:
				this.y = b;
				break;
			default:
				throw Error("index is out of range: " + a);
			}
			return this
		},
		getComponent: function(a) {
			switch (a) {
			case 0:
				return this.x;
			case 1:
				return this.y;
			default:
				throw Error("index is out of range: " + a);
			}
		},
		clone: function() {
			return new this.constructor(this.x, this.y)
		},
		copy: function(a) {
			this.x = a.x;
			this.y = a.y;
			return this
		},
		add: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
			this.addVectors(a, b);
			this.x += a.x;
			this.y += a.y;
			return this
		},
		addScalar: function(a) {
			this.x += a;
			this.y += a;
			return this
		},
		addVectors: function(a, b) {
			this.x = a.x + b.x;
			this.y = a.y + b.y;
			return this
		},
		addScaledVector: function(a, b) {
			this.x += a.x * b;
			this.y += a.y * b;
			return this
		},
		sub: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
			this.subVectors(a, b);
			this.x -= a.x;
			this.y -= a.y;
			return this
		},
		subScalar: function(a) {
			this.x -= a;
			this.y -= a;
			return this
		},
		subVectors: function(a, b) {
			this.x = a.x - b.x;
			this.y = a.y - b.y;
			return this
		},
		multiply: function(a) {
			this.x *= a.x;
			this.y *= a.y;
			return this
		},
		multiplyScalar: function(a) {
			isFinite(a) ? (this.x *= a, this.y *= a) : this.y = this.x = 0;
			return this
		},
		divide: function(a) {
			this.x /= a.x;
			this.y /= a.y;
			return this
		},
		divideScalar: function(a) {
			return this.multiplyScalar(1 / a)
		},
		min: function(a) {
			this.x = Math.min(this.x, a.x);
			this.y = Math.min(this.y, a.y);
			return this
		},
		max: function(a) {
			this.x = Math.max(this.x, a.x);
			this.y = Math.max(this.y, a.y);
			return this
		},
		clamp: function(a, b) {
			this.x = Math.max(a.x, Math.min(b.x, this.x));
			this.y = Math.max(a.y, Math.min(b.y, this.y));
			return this
		},
		clampScalar: function() {
			var a, b;
			return function(c, d) {
				void 0 === a && (a = new D, b = new D);
				a.set(c, c);
				b.set(d, d);
				return this.clamp(a, b)
			}
		} (),
		clampLength: function(a, b) {
			var c = this.length();
			return this.multiplyScalar(Math.max(a, Math.min(b, c)) / c)
		},
		floor: function() {
			this.x = Math.floor(this.x);
			this.y = Math.floor(this.y);
			return this
		},
		ceil: function() {
			this.x = Math.ceil(this.x);
			this.y = Math.ceil(this.y);
			return this
		},
		round: function() {
			this.x = Math.round(this.x);
			this.y = Math.round(this.y);
			return this
		},
		roundToZero: function() {
			this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
			this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
			return this
		},
		negate: function() {
			this.x = -this.x;
			this.y = -this.y;
			return this
		},
		dot: function(a) {
			return this.x * a.x + this.y * a.y
		},
		lengthSq: function() {
			return this.x * this.x + this.y * this.y
		},
		length: function() {
			return Math.sqrt(this.x * this.x + this.y * this.y)
		},
		lengthManhattan: function() {
			return Math.abs(this.x) + Math.abs(this.y)
		},
		normalize: function() {
			return this.divideScalar(this.length())
		},
		angle: function() {
			var a = Math.atan2(this.y, this.x);
			0 > a && (a += 2 * Math.PI);
			return a
		},
		distanceTo: function(a) {
			return Math.sqrt(this.distanceToSquared(a))
		},
		distanceToSquared: function(a) {
			var b = this.x - a.x;
			a = this.y - a.y;
			return b * b + a * a
		},
		distanceToManhattan: function(a) {
			return Math.abs(this.x - a.x) + Math.abs(this.y - a.y)
		},
		setLength: function(a) {
			return this.multiplyScalar(a / this.length())
		},
		lerp: function(a, b) {
			this.x += (a.x - this.x) * b;
			this.y += (a.y - this.y) * b;
			return this
		},
		lerpVectors: function(a, b, c) {
			return this.subVectors(b, a).multiplyScalar(c).add(a)
		},
		equals: function(a) {
			return a.x === this.x && a.y === this.y
		},
		fromArray: function(a, b) {
			void 0 === b && (b = 0);
			this.x = a[b];
			this.y = a[b + 1];
			return this
		},
		toArray: function(a, b) {
			void 0 === a && (a = []);
			void 0 === b && (b = 0);
			a[b] = this.x;
			a[b + 1] = this.y;
			return a
		},
		fromBufferAttribute: function(a, b, c) {
			void 0 !== c && console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");
			this.x = a.getX(b);
			this.y = a.getY(b);
			return this
		},
		rotateAround: function(a, b) {
			var c = Math.cos(b),
			d = Math.sin(b),
			e = this.x - a.x,
			f = this.y - a.y;
			this.x = e * c - f * d + a.x;
			this.y = e * d + f * c + a.y;
			return this
		}
	};
	var Ze = 0;
	ea.DEFAULT_IMAGE = void 0;
	ea.DEFAULT_MAPPING = 300;
	ea.prototype = {
		constructor: ea,
		isTexture: !0,
		set needsUpdate(a) { ! 0 === a && this.version++
		},
		clone: function() {
			return (new this.constructor).copy(this)
		},
		copy: function(a) {
			this.image = a.image;
			this.mipmaps = a.mipmaps.slice(0);
			this.mapping = a.mapping;
			this.wrapS = a.wrapS;
			this.wrapT = a.wrapT;
			this.magFilter = a.magFilter;
			this.minFilter = a.minFilter;
			this.anisotropy = a.anisotropy;
			this.format = a.format;
			this.type = a.type;
			this.offset.copy(a.offset);
			this.repeat.copy(a.repeat);
			this.generateMipmaps = a.generateMipmaps;
			this.premultiplyAlpha = a.premultiplyAlpha;
			this.flipY = a.flipY;
			this.unpackAlignment = a.unpackAlignment;
			this.encoding = a.encoding;
			return this
		},
		toJSON: function(a) {
			if (void 0 !== a.textures[this.uuid]) return a.textures[this.uuid];
			var b = {
				metadata: {
					version: 4.4,
					type: "Texture",
					generator: "Texture.toJSON"
				},
				uuid: this.uuid,
				name: this.name,
				mapping: this.mapping,
				repeat: [this.repeat.x, this.repeat.y],
				offset: [this.offset.x, this.offset.y],
				wrap: [this.wrapS, this.wrapT],
				minFilter: this.minFilter,
				magFilter: this.magFilter,
				anisotropy: this.anisotropy,
				flipY: this.flipY
			};
			if (void 0 !== this.image) {
				var c = this.image;
				void 0 === c.uuid && (c.uuid = N.generateUUID());
				if (void 0 === a.images[c.uuid]) {
					var d = a.images,
					e = c.uuid,
					f = c.uuid,
					g;
					void 0 !== c.toDataURL ? g = c: (g = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas"), g.width = c.width, g.height = c.height, g.getContext("2d").drawImage(c, 0, 0, c.width, c.height));
					g = 2048 < g.width || 2048 < g.height ? g.toDataURL("image/jpeg", .6) : g.toDataURL("image/png");
					d[e] = {
						uuid: f,
						url: g
					}
				}
				b.image = c.uuid
			}
			return a.textures[this.uuid] = b
		},
		dispose: function() {
			this.dispatchEvent({
				type: "dispose"
			})
		},
		transformUv: function(a) {
			if (300 === this.mapping) {
				a.multiply(this.repeat);
				a.add(this.offset);
				if (0 > a.x || 1 < a.x) switch (this.wrapS) {
				case 1E3:
					a.x -= Math.floor(a.x);
					break;
				case 1001:
					a.x = 0 > a.x ? 0 : 1;
					break;
				case 1002:
					a.x = 1 === Math.abs(Math.floor(a.x) % 2) ? Math.ceil(a.x) - a.x: a.x - Math.floor(a.x)
				}
				if (0 > a.y || 1 < a.y) switch (this.wrapT) {
				case 1E3:
					a.y -= Math.floor(a.y);
					break;
				case 1001:
					a.y = 0 > a.y ? 0 : 1;
					break;
				case 1002:
					a.y = 1 === Math.abs(Math.floor(a.y) % 2) ? Math.ceil(a.y) - a.y: a.y - Math.floor(a.y)
				}
				this.flipY && (a.y = 1 - a.y)
			}
		}
	};
	Object.assign(ea.prototype, pa.prototype);
	fa.prototype = {
		constructor: fa,
		isVector4: !0,
		set: function(a, b, c, d) {
			this.x = a;
			this.y = b;
			this.z = c;
			this.w = d;
			return this
		},
		setScalar: function(a) {
			this.w = this.z = this.y = this.x = a;
			return this
		},
		setX: function(a) {
			this.x = a;
			return this
		},
		setY: function(a) {
			this.y = a;
			return this
		},
		setZ: function(a) {
			this.z = a;
			return this
		},
		setW: function(a) {
			this.w = a;
			return this
		},
		setComponent: function(a, b) {
			switch (a) {
			case 0:
				this.x = b;
				break;
			case 1:
				this.y = b;
				break;
			case 2:
				this.z = b;
				break;
			case 3:
				this.w = b;
				break;
			default:
				throw Error("index is out of range: " + a);
			}
			return this
		},
		getComponent: function(a) {
			switch (a) {
			case 0:
				return this.x;
			case 1:
				return this.y;
			case 2:
				return this.z;
			case 3:
				return this.w;
			default:
				throw Error("index is out of range: " + a);
			}
		},
		clone: function() {
			return new this.constructor(this.x, this.y, this.z, this.w)
		},
		copy: function(a) {
			this.x = a.x;
			this.y = a.y;
			this.z = a.z;
			this.w = void 0 !== a.w ? a.w: 1;
			return this
		},
		add: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
			this.addVectors(a, b);
			this.x += a.x;
			this.y += a.y;
			this.z += a.z;
			this.w += a.w;
			return this
		},
		addScalar: function(a) {
			this.x += a;
			this.y += a;
			this.z += a;
			this.w += a;
			return this
		},
		addVectors: function(a, b) {
			this.x = a.x + b.x;
			this.y = a.y + b.y;
			this.z = a.z + b.z;
			this.w = a.w + b.w;
			return this
		},
		addScaledVector: function(a, b) {
			this.x += a.x * b;
			this.y += a.y * b;
			this.z += a.z * b;
			this.w += a.w * b;
			return this
		},
		sub: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
			this.subVectors(a, b);
			this.x -= a.x;
			this.y -= a.y;
			this.z -= a.z;
			this.w -= a.w;
			return this
		},
		subScalar: function(a) {
			this.x -= a;
			this.y -= a;
			this.z -= a;
			this.w -= a;
			return this
		},
		subVectors: function(a, b) {
			this.x = a.x - b.x;
			this.y = a.y - b.y;
			this.z = a.z - b.z;
			this.w = a.w - b.w;
			return this
		},
		multiplyScalar: function(a) {
			isFinite(a) ? (this.x *= a, this.y *= a, this.z *= a, this.w *= a) : this.w = this.z = this.y = this.x = 0;
			return this
		},
		applyMatrix4: function(a) {
			var b = this.x,
			c = this.y,
			d = this.z,
			e = this.w;
			a = a.elements;
			this.x = a[0] * b + a[4] * c + a[8] * d + a[12] * e;
			this.y = a[1] * b + a[5] * c + a[9] * d + a[13] * e;
			this.z = a[2] * b + a[6] * c + a[10] * d + a[14] * e;
			this.w = a[3] * b + a[7] * c + a[11] * d + a[15] * e;
			return this
		},
		divideScalar: function(a) {
			return this.multiplyScalar(1 / a)
		},
		setAxisAngleFromQuaternion: function(a) {
			this.w = 2 * Math.acos(a.w);
			var b = Math.sqrt(1 - a.w * a.w);
			1E-4 > b ? (this.x = 1, this.z = this.y = 0) : (this.x = a.x / b, this.y = a.y / b, this.z = a.z / b);
			return this
		},
		setAxisAngleFromRotationMatrix: function(a) {
			var b, c, d;
			a = a.elements;
			var e = a[0];
			d = a[4];
			var f = a[8],
			g = a[1],
			h = a[5],
			m = a[9];
			c = a[2];
			b = a[6];
			var k = a[10];
			if (.01 > Math.abs(d - g) && .01 > Math.abs(f - c) && .01 > Math.abs(m - b)) {
				if (.1 > Math.abs(d + g) && .1 > Math.abs(f + c) && .1 > Math.abs(m + b) && .1 > Math.abs(e + h + k - 3)) return this.set(1, 0, 0, 0),
				this;
				a = Math.PI;
				e = (e + 1) / 2;
				h = (h + 1) / 2;
				k = (k + 1) / 2;
				d = (d + g) / 4;
				f = (f + c) / 4;
				m = (m + b) / 4;
				e > h && e > k ? .01 > e ? (b = 0, d = c = .707106781) : (b = Math.sqrt(e), c = d / b, d = f / b) : h > k ? .01 > h ? (b = .707106781, c = 0, d = .707106781) : (c = Math.sqrt(h), b = d / c, d = m / c) : .01 > k ? (c = b = .707106781, d = 0) : (d = Math.sqrt(k), b = f / d, c = m / d);
				this.set(b, c, d, a);
				return this
			}
			a = Math.sqrt((b - m) * (b - m) + (f - c) * (f - c) + (g - d) * (g - d));.001 > Math.abs(a) && (a = 1);
			this.x = (b - m) / a;
			this.y = (f - c) / a;
			this.z = (g - d) / a;
			this.w = Math.acos((e + h + k - 1) / 2);
			return this
		},
		min: function(a) {
			this.x = Math.min(this.x, a.x);
			this.y = Math.min(this.y, a.y);
			this.z = Math.min(this.z, a.z);
			this.w = Math.min(this.w, a.w);
			return this
		},
		max: function(a) {
			this.x = Math.max(this.x, a.x);
			this.y = Math.max(this.y, a.y);
			this.z = Math.max(this.z, a.z);
			this.w = Math.max(this.w, a.w);
			return this
		},
		clamp: function(a, b) {
			this.x = Math.max(a.x, Math.min(b.x, this.x));
			this.y = Math.max(a.y, Math.min(b.y, this.y));
			this.z = Math.max(a.z, Math.min(b.z, this.z));
			this.w = Math.max(a.w, Math.min(b.w, this.w));
			return this
		},
		clampScalar: function() {
			var a, b;
			return function(c, d) {
				void 0 === a && (a = new fa, b = new fa);
				a.set(c, c, c, c);
				b.set(d, d, d, d);
				return this.clamp(a, b)
			}
		} (),
		floor: function() {
			this.x = Math.floor(this.x);
			this.y = Math.floor(this.y);
			this.z = Math.floor(this.z);
			this.w = Math.floor(this.w);
			return this
		},
		ceil: function() {
			this.x = Math.ceil(this.x);
			this.y = Math.ceil(this.y);
			this.z = Math.ceil(this.z);
			this.w = Math.ceil(this.w);
			return this
		},
		round: function() {
			this.x = Math.round(this.x);
			this.y = Math.round(this.y);
			this.z = Math.round(this.z);
			this.w = Math.round(this.w);
			return this
		},
		roundToZero: function() {
			this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
			this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
			this.z = 0 > this.z ? Math.ceil(this.z) : Math.floor(this.z);
			this.w = 0 > this.w ? Math.ceil(this.w) : Math.floor(this.w);
			return this
		},
		negate: function() {
			this.x = -this.x;
			this.y = -this.y;
			this.z = -this.z;
			this.w = -this.w;
			return this
		},
		dot: function(a) {
			return this.x * a.x + this.y * a.y + this.z * a.z + this.w * a.w
		},
		lengthSq: function() {
			return this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w
		},
		length: function() {
			return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w)
		},
		lengthManhattan: function() {
			return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z) + Math.abs(this.w)
		},
		normalize: function() {
			return this.divideScalar(this.length())
		},
		setLength: function(a) {
			return this.multiplyScalar(a / this.length())
		},
		lerp: function(a, b) {
			this.x += (a.x - this.x) * b;
			this.y += (a.y - this.y) * b;
			this.z += (a.z - this.z) * b;
			this.w += (a.w - this.w) * b;
			return this
		},
		lerpVectors: function(a, b, c) {
			return this.subVectors(b, a).multiplyScalar(c).add(a)
		},
		equals: function(a) {
			return a.x === this.x && a.y === this.y && a.z === this.z && a.w === this.w
		},
		fromArray: function(a, b) {
			void 0 === b && (b = 0);
			this.x = a[b];
			this.y = a[b + 1];
			this.z = a[b + 2];
			this.w = a[b + 3];
			return this
		},
		toArray: function(a, b) {
			void 0 === a && (a = []);
			void 0 === b && (b = 0);
			a[b] = this.x;
			a[b + 1] = this.y;
			a[b + 2] = this.z;
			a[b + 3] = this.w;
			return a
		},
		fromBufferAttribute: function(a, b, c) {
			void 0 !== c && console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");
			this.x = a.getX(b);
			this.y = a.getY(b);
			this.z = a.getZ(b);
			this.w = a.getW(b);
			return this
		}
	};
	Ya.prototype = {
		constructor: Ya,
		isWebGLRenderTarget: !0,
		setSize: function(a, b) {
			if (this.width !== a || this.height !== b) this.width = a,
			this.height = b,
			this.dispose();
			this.viewport.set(0, 0, a, b);
			this.scissor.set(0, 0, a, b)
		},
		clone: function() {
			return (new this.constructor).copy(this)
		},
		copy: function(a) {
			this.width = a.width;
			this.height = a.height;
			this.viewport.copy(a.viewport);
			this.texture = a.texture.clone();
			this.depthBuffer = a.depthBuffer;
			this.stencilBuffer = a.stencilBuffer;
			this.depthTexture = a.depthTexture;
			return this
		},
		dispose: function() {
			this.dispatchEvent({
				type: "dispose"
			})
		}
	};
	Object.assign(Ya.prototype, pa.prototype);
	Gb.prototype = Object.create(Ya.prototype);
	Gb.prototype.constructor = Gb;
	Gb.prototype.isWebGLRenderTargetCube = !0;
	ca.prototype = {
		constructor: ca,
		get x() {
			return this._x
		},
		set x(a) {
			this._x = a;
			this.onChangeCallback()
		},
		get y() {
			return this._y
		},
		set y(a) {
			this._y = a;
			this.onChangeCallback()
		},
		get z() {
			return this._z
		},
		set z(a) {
			this._z = a;
			this.onChangeCallback()
		},
		get w() {
			return this._w
		},
		set w(a) {
			this._w = a;
			this.onChangeCallback()
		},
		set: function(a, b, c, d) {
			this._x = a;
			this._y = b;
			this._z = c;
			this._w = d;
			this.onChangeCallback();
			return this
		},
		clone: function() {
			return new this.constructor(this._x, this._y, this._z, this._w)
		},
		copy: function(a) {
			this._x = a.x;
			this._y = a.y;
			this._z = a.z;
			this._w = a.w;
			this.onChangeCallback();
			return this
		},
		setFromEuler: function(a, b) {
			if (!1 === (a && a.isEuler)) throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");
			var c = Math.cos(a._x / 2),
			d = Math.cos(a._y / 2),
			e = Math.cos(a._z / 2),
			f = Math.sin(a._x / 2),
			g = Math.sin(a._y / 2),
			h = Math.sin(a._z / 2),
			m = a.order;
			"XYZ" === m ? (this._x = f * d * e + c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e - f * g * h) : "YXZ" === m ? (this._x = f * d * e + c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e + f * g * h) : "ZXY" === m ? (this._x = f * d * e - c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e - f * g * h) : "ZYX" === m ? (this._x = f * d * e - c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e + f * g * h) : "YZX" === m ? (this._x = f * d * e + c * g * h, this._y = c * g * e + f * d * h, this._z = c * d * h - f * g * e, this._w = c * d * e - f * g * h) : "XZY" === m && (this._x = f * d * e - c * g * h, this._y = c * g * e - f * d * h, this._z = c * d * h + f * g * e, this._w = c * d * e + f * g * h);
			if (!1 !== b) this.onChangeCallback();
			return this
		},
		setFromAxisAngle: function(a, b) {
			var c = b / 2,
			d = Math.sin(c);
			this._x = a.x * d;
			this._y = a.y * d;
			this._z = a.z * d;
			this._w = Math.cos(c);
			this.onChangeCallback();
			return this
		},
		setFromRotationMatrix: function(a) {
			var b = a.elements,
			c = b[0];
			a = b[4];
			var d = b[8],
			e = b[1],
			f = b[5],
			g = b[9],
			h = b[2],
			m = b[6],
			b = b[10],
			k = c + f + b;
			0 < k ? (c = .5 / Math.sqrt(k + 1), this._w = .25 / c, this._x = (m - g) * c, this._y = (d - h) * c, this._z = (e - a) * c) : c > f && c > b ? (c = 2 * Math.sqrt(1 + c - f - b), this._w = (m - g) / c, this._x = .25 * c, this._y = (a + e) / c, this._z = (d + h) / c) : f > b ? (c = 2 * Math.sqrt(1 + f - c - b), this._w = (d - h) / c, this._x = (a + e) / c, this._y = .25 * c, this._z = (g + m) / c) : (c = 2 * Math.sqrt(1 + b - c - f), this._w = (e - a) / c, this._x = (d + h) / c, this._y = (g + m) / c, this._z = .25 * c);
			this.onChangeCallback();
			return this
		},
		setFromUnitVectors: function() {
			var a, b;
			return function(c, d) {
				void 0 === a && (a = new q);
				b = c.dot(d) + 1;
				1E-6 > b ? (b = 0, Math.abs(c.x) > Math.abs(c.z) ? a.set( - c.y, c.x, 0) : a.set(0, -c.z, c.y)) : a.crossVectors(c, d);
				this._x = a.x;
				this._y = a.y;
				this._z = a.z;
				this._w = b;
				return this.normalize()
			}
		} (),
		inverse: function() {
			return this.conjugate().normalize()
		},
		conjugate: function() {
			this._x *= -1;
			this._y *= -1;
			this._z *= -1;
			this.onChangeCallback();
			return this
		},
		dot: function(a) {
			return this._x * a._x + this._y * a._y + this._z * a._z + this._w * a._w
		},
		lengthSq: function() {
			return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w
		},
		length: function() {
			return Math.sqrt(this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w)
		},
		normalize: function() {
			var a = this.length();
			0 === a ? (this._z = this._y = this._x = 0, this._w = 1) : (a = 1 / a, this._x *= a, this._y *= a, this._z *= a, this._w *= a);
			this.onChangeCallback();
			return this
		},
		multiply: function(a, b) {
			return void 0 !== b ? (console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."), this.multiplyQuaternions(a, b)) : this.multiplyQuaternions(this, a)
		},
		premultiply: function(a) {
			return this.multiplyQuaternions(a, this)
		},
		multiplyQuaternions: function(a, b) {
			var c = a._x,
			d = a._y,
			e = a._z,
			f = a._w,
			g = b._x,
			h = b._y,
			m = b._z,
			k = b._w;
			this._x = c * k + f * g + d * m - e * h;
			this._y = d * k + f * h + e * g - c * m;
			this._z = e * k + f * m + c * h - d * g;
			this._w = f * k - c * g - d * h - e * m;
			this.onChangeCallback();
			return this
		},
		slerp: function(a, b) {
			if (0 === b) return this;
			if (1 === b) return this.copy(a);
			var c = this._x,
			d = this._y,
			e = this._z,
			f = this._w,
			g = f * a._w + c * a._x + d * a._y + e * a._z;
			0 > g ? (this._w = -a._w, this._x = -a._x, this._y = -a._y, this._z = -a._z, g = -g) : this.copy(a);
			if (1 <= g) return this._w = f,
			this._x = c,
			this._y = d,
			this._z = e,
			this;
			var h = Math.sqrt(1 - g * g);
			if (.001 > Math.abs(h)) return this._w = .5 * (f + this._w),
			this._x = .5 * (c + this._x),
			this._y = .5 * (d + this._y),
			this._z = .5 * (e + this._z),
			this;
			var m = Math.atan2(h, g),
			g = Math.sin((1 - b) * m) / h,
			h = Math.sin(b * m) / h;
			this._w = f * g + this._w * h;
			this._x = c * g + this._x * h;
			this._y = d * g + this._y * h;
			this._z = e * g + this._z * h;
			this.onChangeCallback();
			return this
		},
		equals: function(a) {
			return a._x === this._x && a._y === this._y && a._z === this._z && a._w === this._w
		},
		fromArray: function(a, b) {
			void 0 === b && (b = 0);
			this._x = a[b];
			this._y = a[b + 1];
			this._z = a[b + 2];
			this._w = a[b + 3];
			this.onChangeCallback();
			return this
		},
		toArray: function(a, b) {
			void 0 === a && (a = []);
			void 0 === b && (b = 0);
			a[b] = this._x;
			a[b + 1] = this._y;
			a[b + 2] = this._z;
			a[b + 3] = this._w;
			return a
		},
		onChange: function(a) {
			this.onChangeCallback = a;
			return this
		},
		onChangeCallback: function() {}
	};
	Object.assign(ca, {
		slerp: function(a, b, c, d) {
			return c.copy(a).slerp(b, d)
		},
		slerpFlat: function(a, b, c, d, e, f, g) {
			var h = c[d + 0],
			m = c[d + 1],
			k = c[d + 2];
			c = c[d + 3];
			d = e[f + 0];
			var l = e[f + 1],
			p = e[f + 2];
			e = e[f + 3];
			if (c !== e || h !== d || m !== l || k !== p) {
				f = 1 - g;
				var n = h * d + m * l + k * p + c * e,
				u = 0 <= n ? 1 : -1,
				q = 1 - n * n;
				q > Number.EPSILON && (q = Math.sqrt(q), n = Math.atan2(q, n * u), f = Math.sin(f * n) / q, g = Math.sin(g * n) / q);
				u *= g;
				h = h * f + d * u;
				m = m * f + l * u;
				k = k * f + p * u;
				c = c * f + e * u;
				f === 1 - g && (g = 1 / Math.sqrt(h * h + m * m + k * k + c * c), h *= g, m *= g, k *= g, c *= g)
			}
			a[b] = h;
			a[b + 1] = m;
			a[b + 2] = k;
			a[b + 3] = c
		}
	});
	q.prototype = {
		constructor: q,
		isVector3: !0,
		set: function(a, b, c) {
			this.x = a;
			this.y = b;
			this.z = c;
			return this
		},
		setScalar: function(a) {
			this.z = this.y = this.x = a;
			return this
		},
		setX: function(a) {
			this.x = a;
			return this
		},
		setY: function(a) {
			this.y = a;
			return this
		},
		setZ: function(a) {
			this.z = a;
			return this
		},
		setComponent: function(a, b) {
			switch (a) {
			case 0:
				this.x = b;
				break;
			case 1:
				this.y = b;
				break;
			case 2:
				this.z = b;
				break;
			default:
				throw Error("index is out of range: " + a);
			}
			return this
		},
		getComponent: function(a) {
			switch (a) {
			case 0:
				return this.x;
			case 1:
				return this.y;
			case 2:
				return this.z;
			default:
				throw Error("index is out of range: " + a);
			}
		},
		clone: function() {
			return new this.constructor(this.x, this.y, this.z)
		},
		copy: function(a) {
			this.x = a.x;
			this.y = a.y;
			this.z = a.z;
			return this
		},
		add: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),
			this.addVectors(a, b);
			this.x += a.x;
			this.y += a.y;
			this.z += a.z;
			return this
		},
		addScalar: function(a) {
			this.x += a;
			this.y += a;
			this.z += a;
			return this
		},
		addVectors: function(a, b) {
			this.x = a.x + b.x;
			this.y = a.y + b.y;
			this.z = a.z + b.z;
			return this
		},
		addScaledVector: function(a, b) {
			this.x += a.x * b;
			this.y += a.y * b;
			this.z += a.z * b;
			return this
		},
		sub: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),
			this.subVectors(a, b);
			this.x -= a.x;
			this.y -= a.y;
			this.z -= a.z;
			return this
		},
		subScalar: function(a) {
			this.x -= a;
			this.y -= a;
			this.z -= a;
			return this
		},
		subVectors: function(a, b) {
			this.x = a.x - b.x;
			this.y = a.y - b.y;
			this.z = a.z - b.z;
			return this
		},
		multiply: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),
			this.multiplyVectors(a, b);
			this.x *= a.x;
			this.y *= a.y;
			this.z *= a.z;
			return this
		},
		multiplyScalar: function(a) {
			isFinite(a) ? (this.x *= a, this.y *= a, this.z *= a) : this.z = this.y = this.x = 0;
			return this
		},
		multiplyVectors: function(a, b) {
			this.x = a.x * b.x;
			this.y = a.y * b.y;
			this.z = a.z * b.z;
			return this
		},
		applyEuler: function() {
			var a;
			return function(b) { ! 1 === (b && b.isEuler) && console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");
				void 0 === a && (a = new ca);
				return this.applyQuaternion(a.setFromEuler(b))
			}
		} (),
		applyAxisAngle: function() {
			var a;
			return function(b, c) {
				void 0 === a && (a = new ca);
				return this.applyQuaternion(a.setFromAxisAngle(b, c))
			}
		} (),
		applyMatrix3: function(a) {
			var b = this.x,
			c = this.y,
			d = this.z;
			a = a.elements;
			this.x = a[0] * b + a[3] * c + a[6] * d;
			this.y = a[1] * b + a[4] * c + a[7] * d;
			this.z = a[2] * b + a[5] * c + a[8] * d;
			return this
		},
		applyMatrix4: function(a) {
			var b = this.x,
			c = this.y,
			d = this.z;
			a = a.elements;
			this.x = a[0] * b + a[4] * c + a[8] * d + a[12];
			this.y = a[1] * b + a[5] * c + a[9] * d + a[13];
			this.z = a[2] * b + a[6] * c + a[10] * d + a[14];
			return this.divideScalar(a[3] * b + a[7] * c + a[11] * d + a[15])
		},
		applyQuaternion: function(a) {
			var b = this.x,
			c = this.y,
			d = this.z,
			e = a.x,
			f = a.y,
			g = a.z;
			a = a.w;
			var h = a * b + f * d - g * c,
			m = a * c + g * b - e * d,
			k = a * d + e * c - f * b,
			b = -e * b - f * c - g * d;
			this.x = h * a + b * -e + m * -g - k * -f;
			this.y = m * a + b * -f + k * -e - h * -g;
			this.z = k * a + b * -g + h * -f - m * -e;
			return this
		},
		project: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new S);
				a.multiplyMatrices(b.projectionMatrix, a.getInverse(b.matrixWorld));
				return this.applyMatrix4(a)
			}
		} (),
		unproject: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new S);
				a.multiplyMatrices(b.matrixWorld, a.getInverse(b.projectionMatrix));
				return this.applyMatrix4(a)
			}
		} (),
		transformDirection: function(a) {
			var b = this.x,
			c = this.y,
			d = this.z;
			a = a.elements;
			this.x = a[0] * b + a[4] * c + a[8] * d;
			this.y = a[1] * b + a[5] * c + a[9] * d;
			this.z = a[2] * b + a[6] * c + a[10] * d;
			return this.normalize()
		},
		divide: function(a) {
			this.x /= a.x;
			this.y /= a.y;
			this.z /= a.z;
			return this
		},
		divideScalar: function(a) {
			return this.multiplyScalar(1 / a)
		},
		min: function(a) {
			this.x = Math.min(this.x, a.x);
			this.y = Math.min(this.y, a.y);
			this.z = Math.min(this.z, a.z);
			return this
		},
		max: function(a) {
			this.x = Math.max(this.x, a.x);
			this.y = Math.max(this.y, a.y);
			this.z = Math.max(this.z, a.z);
			return this
		},
		clamp: function(a, b) {
			this.x = Math.max(a.x, Math.min(b.x, this.x));
			this.y = Math.max(a.y, Math.min(b.y, this.y));
			this.z = Math.max(a.z, Math.min(b.z, this.z));
			return this
		},
		clampScalar: function() {
			var a, b;
			return function(c, d) {
				void 0 === a && (a = new q, b = new q);
				a.set(c, c, c);
				b.set(d, d, d);
				return this.clamp(a, b)
			}
		} (),
		clampLength: function(a, b) {
			var c = this.length();
			return this.multiplyScalar(Math.max(a, Math.min(b, c)) / c)
		},
		floor: function() {
			this.x = Math.floor(this.x);
			this.y = Math.floor(this.y);
			this.z = Math.floor(this.z);
			return this
		},
		ceil: function() {
			this.x = Math.ceil(this.x);
			this.y = Math.ceil(this.y);
			this.z = Math.ceil(this.z);
			return this
		},
		round: function() {
			this.x = Math.round(this.x);
			this.y = Math.round(this.y);
			this.z = Math.round(this.z);
			return this
		},
		roundToZero: function() {
			this.x = 0 > this.x ? Math.ceil(this.x) : Math.floor(this.x);
			this.y = 0 > this.y ? Math.ceil(this.y) : Math.floor(this.y);
			this.z = 0 > this.z ? Math.ceil(this.z) : Math.floor(this.z);
			return this
		},
		negate: function() {
			this.x = -this.x;
			this.y = -this.y;
			this.z = -this.z;
			return this
		},
		dot: function(a) {
			return this.x * a.x + this.y * a.y + this.z * a.z
		},
		lengthSq: function() {
			return this.x * this.x + this.y * this.y + this.z * this.z
		},
		length: function() {
			return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z)
		},
		lengthManhattan: function() {
			return Math.abs(this.x) + Math.abs(this.y) + Math.abs(this.z)
		},
		normalize: function() {
			return this.divideScalar(this.length())
		},
		setLength: function(a) {
			return this.multiplyScalar(a / this.length())
		},
		lerp: function(a, b) {
			this.x += (a.x - this.x) * b;
			this.y += (a.y - this.y) * b;
			this.z += (a.z - this.z) * b;
			return this
		},
		lerpVectors: function(a, b, c) {
			return this.subVectors(b, a).multiplyScalar(c).add(a)
		},
		cross: function(a, b) {
			if (void 0 !== b) return console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),
			this.crossVectors(a, b);
			var c = this.x,
			d = this.y,
			e = this.z;
			this.x = d * a.z - e * a.y;
			this.y = e * a.x - c * a.z;
			this.z = c * a.y - d * a.x;
			return this
		},
		crossVectors: function(a, b) {
			var c = a.x,
			d = a.y,
			e = a.z,
			f = b.x,
			g = b.y,
			h = b.z;
			this.x = d * h - e * g;
			this.y = e * f - c * h;
			this.z = c * g - d * f;
			return this
		},
		projectOnVector: function(a) {
			var b = a.dot(this) / a.lengthSq();
			return this.copy(a).multiplyScalar(b)
		},
		projectOnPlane: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new q);
				a.copy(this).projectOnVector(b);
				return this.sub(a)
			}
		} (),
		reflect: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new q);
				return this.sub(a.copy(b).multiplyScalar(2 * this.dot(b)))
			}
		} (),
		angleTo: function(a) {
			a = this.dot(a) / Math.sqrt(this.lengthSq() * a.lengthSq());
			return Math.acos(N.clamp(a, -1, 1))
		},
		distanceTo: function(a) {
			return Math.sqrt(this.distanceToSquared(a))
		},
		distanceToSquared: function(a) {
			var b = this.x - a.x,
			c = this.y - a.y;
			a = this.z - a.z;
			return b * b + c * c + a * a
		},
		distanceToManhattan: function(a) {
			return Math.abs(this.x - a.x) + Math.abs(this.y - a.y) + Math.abs(this.z - a.z)
		},
		setFromSpherical: function(a) {
			var b = Math.sin(a.phi) * a.radius;
			this.x = b * Math.sin(a.theta);
			this.y = Math.cos(a.phi) * a.radius;
			this.z = b * Math.cos(a.theta);
			return this
		},
		setFromCylindrical: function(a) {
			this.x = a.radius * Math.sin(a.theta);
			this.y = a.y;
			this.z = a.radius * Math.cos(a.theta);
			return this
		},
		setFromMatrixPosition: function(a) {
			return this.setFromMatrixColumn(a, 3)
		},
		setFromMatrixScale: function(a) {
			var b = this.setFromMatrixColumn(a, 0).length(),
			c = this.setFromMatrixColumn(a, 1).length();
			a = this.setFromMatrixColumn(a, 2).length();
			this.x = b;
			this.y = c;
			this.z = a;
			return this
		},
		setFromMatrixColumn: function(a, b) {
			if ("number" === typeof a) {
				console.warn("THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).");
				var c = a;
				a = b;
				b = c
			}
			return this.fromArray(a.elements, 4 * b)
		},
		equals: function(a) {
			return a.x === this.x && a.y === this.y && a.z === this.z
		},
		fromArray: function(a, b) {
			void 0 === b && (b = 0);
			this.x = a[b];
			this.y = a[b + 1];
			this.z = a[b + 2];
			return this
		},
		toArray: function(a, b) {
			void 0 === a && (a = []);
			void 0 === b && (b = 0);
			a[b] = this.x;
			a[b + 1] = this.y;
			a[b + 2] = this.z;
			return a
		},
		fromBufferAttribute: function(a, b, c) {
			void 0 !== c && console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");
			this.x = a.getX(b);
			this.y = a.getY(b);
			this.z = a.getZ(b);
			return this
		}
	};
	S.prototype = {
		constructor: S,
		isMatrix4: !0,
		set: function(a, b, c, d, e, f, g, h, m, k, l, p, n, u, q, r) {
			var A = this.elements;
			A[0] = a;
			A[4] = b;
			A[8] = c;
			A[12] = d;
			A[1] = e;
			A[5] = f;
			A[9] = g;
			A[13] = h;
			A[2] = m;
			A[6] = k;
			A[10] = l;
			A[14] = p;
			A[3] = n;
			A[7] = u;
			A[11] = q;
			A[15] = r;
			return this
		},
		identity: function() {
			this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
			return this
		},
		clone: function() {
			return (new S).fromArray(this.elements)
		},
		copy: function(a) {
			this.elements.set(a.elements);
			return this
		},
		copyPosition: function(a) {
			var b = this.elements;
			a = a.elements;
			b[12] = a[12];
			b[13] = a[13];
			b[14] = a[14];
			return this
		},
		extractBasis: function(a, b, c) {
			a.setFromMatrixColumn(this, 0);
			b.setFromMatrixColumn(this, 1);
			c.setFromMatrixColumn(this, 2);
			return this
		},
		makeBasis: function(a, b, c) {
			this.set(a.x, b.x, c.x, 0, a.y, b.y, c.y, 0, a.z, b.z, c.z, 0, 0, 0, 0, 1);
			return this
		},
		extractRotation: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new q);
				var c = this.elements,
				d = b.elements,
				e = 1 / a.setFromMatrixColumn(b, 0).length(),
				f = 1 / a.setFromMatrixColumn(b, 1).length();
				b = 1 / a.setFromMatrixColumn(b, 2).length();
				c[0] = d[0] * e;
				c[1] = d[1] * e;
				c[2] = d[2] * e;
				c[4] = d[4] * f;
				c[5] = d[5] * f;
				c[6] = d[6] * f;
				c[8] = d[8] * b;
				c[9] = d[9] * b;
				c[10] = d[10] * b;
				return this
			}
		} (),
		makeRotationFromEuler: function(a) { ! 1 === (a && a.isEuler) && console.error("THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
			var b = this.elements,
			c = a.x,
			d = a.y,
			e = a.z,
			f = Math.cos(c),
			c = Math.sin(c),
			g = Math.cos(d),
			d = Math.sin(d),
			h = Math.cos(e),
			e = Math.sin(e);
			if ("XYZ" === a.order) {
				a = f * h;
				var m = f * e,
				k = c * h,
				l = c * e;
				b[0] = g * h;
				b[4] = -g * e;
				b[8] = d;
				b[1] = m + k * d;
				b[5] = a - l * d;
				b[9] = -c * g;
				b[2] = l - a * d;
				b[6] = k + m * d;
				b[10] = f * g
			} else "YXZ" === a.order ? (a = g * h, m = g * e, k = d * h, l = d * e, b[0] = a + l * c, b[4] = k * c - m, b[8] = f * d, b[1] = f * e, b[5] = f * h, b[9] = -c, b[2] = m * c - k, b[6] = l + a * c, b[10] = f * g) : "ZXY" === a.order ? (a = g * h, m = g * e, k = d * h, l = d * e, b[0] = a - l * c, b[4] = -f * e, b[8] = k + m * c, b[1] = m + k * c, b[5] = f * h, b[9] = l - a * c, b[2] = -f * d, b[6] = c, b[10] = f * g) : "ZYX" === a.order ? (a = f * h, m = f * e, k = c * h, l = c * e, b[0] = g * h, b[4] = k * d - m, b[8] = a * d + l, b[1] = g * e, b[5] = l * d + a, b[9] = m * d - k, b[2] = -d, b[6] = c * g, b[10] = f * g) : "YZX" === a.order ? (a = f * g, m = f * d, k = c * g, l = c * d, b[0] = g * h, b[4] = l - a * e, b[8] = k * e + m, b[1] = e, b[5] = f * h, b[9] = -c * h, b[2] = -d * h, b[6] = m * e + k, b[10] = a - l * e) : "XZY" === a.order && (a = f * g, m = f * d, k = c * g, l = c * d, b[0] = g * h, b[4] = -e, b[8] = d * h, b[1] = a * e + l, b[5] = f * h, b[9] = m * e - k, b[2] = k * e - m, b[6] = c * h, b[10] = l * e + a);
			b[3] = 0;
			b[7] = 0;
			b[11] = 0;
			b[12] = 0;
			b[13] = 0;
			b[14] = 0;
			b[15] = 1;
			return this
		},
		makeRotationFromQuaternion: function(a) {
			var b = this.elements,
			c = a.x,
			d = a.y,
			e = a.z,
			f = a.w,
			g = c + c,
			h = d + d,
			m = e + e;
			a = c * g;
			var k = c * h,
			c = c * m,
			l = d * h,
			d = d * m,
			e = e * m,
			g = f * g,
			h = f * h,
			f = f * m;
			b[0] = 1 - (l + e);
			b[4] = k - f;
			b[8] = c + h;
			b[1] = k + f;
			b[5] = 1 - (a + e);
			b[9] = d - g;
			b[2] = c - h;
			b[6] = d + g;
			b[10] = 1 - (a + l);
			b[3] = 0;
			b[7] = 0;
			b[11] = 0;
			b[12] = 0;
			b[13] = 0;
			b[14] = 0;
			b[15] = 1;
			return this
		},
		lookAt: function() {
			var a, b, c;
			return function(d, e, f) {
				void 0 === a && (a = new q, b = new q, c = new q);
				var g = this.elements;
				c.subVectors(d, e).normalize();
				0 === c.lengthSq() && (c.z = 1);
				a.crossVectors(f, c).normalize();
				0 === a.lengthSq() && (c.z += 1E-4, a.crossVectors(f, c).normalize());
				b.crossVectors(c, a);
				g[0] = a.x;
				g[4] = b.x;
				g[8] = c.x;
				g[1] = a.y;
				g[5] = b.y;
				g[9] = c.y;
				g[2] = a.z;
				g[6] = b.z;
				g[10] = c.z;
				return this
			}
		} (),
		multiply: function(a, b) {
			return void 0 !== b ? (console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."), this.multiplyMatrices(a, b)) : this.multiplyMatrices(this, a)
		},
		premultiply: function(a) {
			return this.multiplyMatrices(a, this)
		},
		multiplyMatrices: function(a, b) {
			var c = a.elements,
			d = b.elements,
			e = this.elements,
			f = c[0],
			g = c[4],
			h = c[8],
			m = c[12],
			k = c[1],
			l = c[5],
			p = c[9],
			n = c[13],
			u = c[2],
			q = c[6],
			r = c[10],
			A = c[14],
			w = c[3],
			y = c[7],
			K = c[11],
			c = c[15],
			v = d[0],
			E = d[4],
			L = d[8],
			C = d[12],
			F = d[1],
			x = d[5],
			H = d[9],
			D = d[13],
			z = d[2],
			J = d[6],
			I = d[10],
			Q = d[14],
			M = d[3],
			O = d[7],
			P = d[11],
			d = d[15];
			e[0] = f * v + g * F + h * z + m * M;
			e[4] = f * E + g * x + h * J + m * O;
			e[8] = f * L + g * H + h * I + m * P;
			e[12] = f * C + g * D + h * Q + m * d;
			e[1] = k * v + l * F + p * z + n * M;
			e[5] = k * E + l * x + p * J + n * O;
			e[9] = k * L + l * H + p * I + n * P;
			e[13] = k * C + l * D + p * Q + n * d;
			e[2] = u * v + q * F + r * z + A * M;
			e[6] = u * E + q * x + r * J + A * O;
			e[10] = u * L + q * H + r * I + A * P;
			e[14] = u * C + q * D + r * Q + A * d;
			e[3] = w * v + y * F + K * z + c * M;
			e[7] = w * E + y * x + K * J + c * O;
			e[11] = w * L + y * H + K * I + c * P;
			e[15] = w * C + y * D + K * Q + c * d;
			return this
		},
		multiplyToArray: function(a, b, c) {
			var d = this.elements;
			this.multiplyMatrices(a, b);
			c[0] = d[0];
			c[1] = d[1];
			c[2] = d[2];
			c[3] = d[3];
			c[4] = d[4];
			c[5] = d[5];
			c[6] = d[6];
			c[7] = d[7];
			c[8] = d[8];
			c[9] = d[9];
			c[10] = d[10];
			c[11] = d[11];
			c[12] = d[12];
			c[13] = d[13];
			c[14] = d[14];
			c[15] = d[15];
			return this
		},
		multiplyScalar: function(a) {
			var b = this.elements;
			b[0] *= a;
			b[4] *= a;
			b[8] *= a;
			b[12] *= a;
			b[1] *= a;
			b[5] *= a;
			b[9] *= a;
			b[13] *= a;
			b[2] *= a;
			b[6] *= a;
			b[10] *= a;
			b[14] *= a;
			b[3] *= a;
			b[7] *= a;
			b[11] *= a;
			b[15] *= a;
			return this
		},
		applyToBufferAttribute: function() {
			var a;
			return function(b) {
				void 0 === a && (a = new q);
				for (var c = 0,
				d = b.count; c < d; c++) a.x = b.getX(c),
				a.y = b.getY(c),
				a.z = b.getZ(c),
				a.applyMatrix4(this),
				b.setXYZ(c, a.x, a.y, a.z);
				return b
			}
		} (),
		determinant: function() {
			var a = this.elements,
			b = a[0],
			c = a[4],
			d = a[8],
			e = a[12],
			f = a[1],
			g = a[5],
			h = a[9],
			m = a[13],
			k = a[2],
			l = a[6],
			p = a[10],
			n = a[14];
			return a[3] * ( + e * h * l - d * m * l - e * g * p + c * m * p + d * g * n - c * h * n) + a[7] * ( + b * h * n - b * m * p + e * f * p - d * f * n + d * m * k - e * h * k) + a[11] * ( + b * m * l - b * g * n - e * f * l + c * f * n + e * g * k - c * m * k) + a[15] * ( - d * g * k - b * h * l + b * g * p + d * f * l - c * f * p + c * h * k)
		},
		transpose: function() {
			var a = this.elements,
			b;
			b = a[1];
			a[1] = a[4];
			a[4] = b;
			b = a[2];
			a[2] = a[8];
			a[8] = b;
			b = a[6];
			a[6] = a[9];
			a[9] = b;
			b = a[3];
			a[3] = a[12];
			a[12] = b;
			b = a[7];
			a[7] = a[13];
			a[13] = b;
			b = a[11];
			a[11] = a[14];
			a[14] = b;
			return this
		},
		setPosition: function(a) {
			var b = this.elements;
			b[12] = a.x;
			b[13] = a.y;
			b[14] = a.z;
			return this
		},
		getInverse: function(a, b) {
			var c = this.elements,
			d = a.elements,
			e = d[0],
			f = d[1],
			g = d[2],
			h = d[3],
			m = d[4],
			k = d[5],
			l = d[6],
			p = d[7],
			n = d[8],
			u = d[9],
			q = d[10],
			r = d[11],
			A = d[12],
			w = d[13],
			y = d[14],
			d = d[15],
			K = u * y * p - w * q * p + w * l * r - k * y * r - u * l * d + k * q * d,
			v = A * q * p - n * y * p - A * l * r + m * y * r + n * l * d - m * q * d,
			E = n * w * p - A * u * p + A * k * r - m * w * r - n * k * d + m * u * d,
			L = A * u * l - n * w * l - A * k * q + m * w * q + n * k * y - m * u * y,
			C = e * K + f * v + g * E + h * L;
			if (0 === C) {
				if (!0 === b) throw Error("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
				console.warn("THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0");
				return this.identity()
			}
			C = 1 / C;
			c[0] = K * C;
			c[1] = (w * q * h - u * y * h - w * g * r + f * y * r + u * g * d - f * q * d) * C;
			c[2] = (k * y * h - w * l * h + w * g * p - f * y * p - k * g * d + f * l * d) * C;
			c[3] = (u * l * h - k * q * h - u * g * p + f * q * p + k * g * r - f * l * r) * C;
			c[4] = v * C;
			c[5] = (n * y * h - A * q * h + A * g * r - e * y * r - n * g * d + e * q * d) * C;
			c[6] = (A * l * h - m * y * h - A * g * p + e * y * p + m * g * d - e * l * d) * C;
			c[7] = (m * q * h - n * l * h + n * g * p - e * q * p - m * g * r + e * l * r) * C;
			c[8] = E * C;
			c[9] = (A * u * h - n * w * h - A * f * r + e * w * r + n * f * d - e * u * d) * C;
			c[10] = (m * w * h - A * k * h + A * f * p - e * w * p - m * f * d + e * k * d) * C;
			c[11] = (n * k * h - m * u * h - n * f * p + e * u * p + m * f * r - e * k * r) * C;
			c[12] = L * C;
			c[13] = (n * w * g - A * u * g + A * f * q - e * w * q - n * f * y + e * u * y) * C;
			c[14] = (A * k * g - m * w * g - A * f * l + e * w * l + m * f * y - e * k * y) * C;
			c[15] = (m * u * g - n * k * g + n * f * l - e * u * l - m * f * q + e * k * q) * C;
			return this
		},
		scale: function(a) {
			var b = this.elements,
			c = a.x,
			d = a.y;
			a = a.z;
			b[0] *= c;
			b[4] *= d;
			b[8] *= a;
			b[1] *= c;
			b[5] *= d;
			b[9] *= a;
			b[2] *= c;
			b[6] *= d;
			b[10] *= a;
			b[3] *= c;
			b[7] *= d;
			b[11] *= a;
			return this
		},
		getMaxScaleOnAxis: function() {
			var a = this.elements;
			return Math.sqrt(Math.max(a[0] * a[0] + a[1] * a[1] + a[2] * a[2], a[4] * a[4] + a[5] * a[5] + a[6] * a[6], a[8] * a[8] + a[9] * a[9] + a[10] * a[10]))
		},
		makeTranslation: function(a, b, c) {
			this.set(1, 0, 0, a, 0, 1, 0, b, 0, 0, 1, c, 0, 0, 0, 1);
			return this
		},
		makeRotationX: function(a) {
			var b = Math.cos(a);
			a = Math.sin(a);
			this.set(1, 0, 0, 0, 0, b, -a, 0, 0, a, b, 0, 0, 0, 0, 1);
			return this
		},
		makeRotationY: function(a) {
			var b = Math.cos(a);
			a = Math.sin(a);
			this.set(b, 0, a, 0, 0, 1, 0, 0, -a, 0, b, 0, 0, 0, 0, 1);
			return this
		},
		makeRotationZ: function(a) {
			var b = Math.cos(a);
			a = Math.sin(a);
			this.set(b, -a, 0, 0, a, b, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
			return this
		},
		makeRotationAxis: function(a, b) {
			var c = Math.cos(b),
			d = Math.sin(b),
			e = 1 - c,
			f = a.x,
			g = a.y,
			h = a.z,
			m = e * f,
			k = e * g;
			this.set(m * f + c, m * g - d * h, m * h + d * g, 0, m * g + d * h, k * g + c, k * h - d * f, 0, m * h - d * g, k * h + d * f, e * h * h + c, 0, 0, 0, 0, 1);
			return this
		},
		makeScale: function(a, b, c) {
			this.set(a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, 0, 0, 0, 1);
			return this
		},
		makeShear: function(a, b, c) {
			this.set(1, b, c, 0, a, 1, c, 0, a, b, 1, 0, 0, 0, 0, 1);
			return this
		},
		compose: function(a, b, c) {
			this.makeRotationFromQuaternion(b);
			this.scale(c);
			this.setPosition(a);
			return this
		},
		decompose: function() {
			var a, b;
			return function(c, d, e) {
				void 0 === a && (a = new q, b = new S);
				var f = this.elements,
				g = a.set(f[0], f[1], f[2]).length(),
				h = a.set(f[4], f[5], f[6]).length(),
				m = a.set(f[8], f[9], f[10]).length();
				0 > this.determinant() && (g = -g);
				c.x = f[12];
				c.y = f[13];
				c.z = f[14];
				b.elements.set(this.elements);
				c = 1 / g;
				var f = 1 / h,
				k = 1 / m;
				b.elements[0] *= c;
				b.elements[1] *= c;
				b.elements[2] *= c;
				b.elements[4] *= f;
				b.elements[5] *= f;
				b.elements[6] *= f;
				b.elements[8] *= k;
				b.elements[9] *= k;
				b.elements[10] *= k;
				d.setFromRotationMatrix(b);
				e.x = g;
				e.y = h;
				e.z = m;
				return this
			}
		} (),
		makePerspective: function(a, b, c, d, e, f) {
			void 0 === f && console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");
			var g = this.elements;
			g[0] = 2 * e / (b - a);
			g[4] = 0;
			g[8] = (b + a) / (b - a);
			g[12] = 0;
			g[1] = 0;
			g[5] = 2 * e / (c - d);
			g[9] = (c + d) / (c - d);
			g[13] = 0;
			g[2] = 0;
			g[6] = 0;
			g[10] = -(f + e) / (f - e);
			g[14] = -2 * f * e / (f - e);
			g[3] = 0;
			g[7] = 0;
			g[11] = -1;
			g[15] = 0;
			return this
		},
		makeOrthographic: function(a, b, c, d, e, f) {
			var g = this.elements,
			h = 1 / (b - a),
			m = 1 / (c - d),
			k = 1 / (f - e);
			g[0] = 2 * h;
			g[4] = 0;
			g[8] = 0;
			g[12] = -((b + a) * h);
			g[1] = 0;
			g[5] = 2 * m;
			g[9] = 0;
			g[13] = -((c + d) * m);
			g[2] = 0;
			g[6] = 0;
			g[10] = -2 * k;
			g[14] = -((f + e) * k);
			g[3] = 0;
			g[7] = 0;
			g[11] = 0;
			g[15] = 1;
			return this
		},
		equals: function(a) {
			var b = this.elements;
			a = a.elements;
			for (var c = 0; 16 > c; c++) if (b[c] !== a[c]) return ! 1;
			return ! 0
		},
		fromArray: function(a, b) {
			void 0 === b && (b = 0);
			for (var c = 0; 16 > c; c++) this.elements[c] = a[c + b];
			return this
		},
		toArray: function(a, b) {
			void 0 === a && (a = []);
			void 0 === b && (b = 0);
			var c = this.elements;
			a[b] = c[0];
			a[b + 1] = c[1];
			a[b + 2] = c[2];
			a[b + 3] = c[3];
			a[b + 4] = c[4];
			a[b + 5] = c[5];
			a[b + 6] = c[6];
			a[b + 7] = c[7];
			a[b + 8] = c[8];
			a[b + 9] = c[9];
			a[b + 10] = c[10];
			a[b + 11] = c[11];
			a[b + 12] = c[12];
			a[b + 13] = c[13];
			a[b + 14] = c[14];
			a[b + 15] = c[15];
			return a
		}
	};
	Za.prototype = Object.create(ea.prototype);
	Za.prototype.constructor = Za;
	Za.prototype.isCubeTexture = !0;
	Object.defineProperty(Za.prototype, "images", {
		get: function() {
			return this.image
		},
		set: function(a) {
			this.image = a
		}
	});
	var Ee = new ea,
	Fe = new Za,
	Be = [],
	De = [];
	Je.prototype.setValue = function(a, b) {
		for (var c = this.seq,
		d = 0,
		e = c.length; d !== e; ++d) {
			var f = c[d];
			f.setValue(a, b[f.id])
		}
	};
	var Rd = /([\w\d_]+)(\])?(\[|\.)?/g;
	$a.prototype.setValue = function(a, b, c) {
		b = this.map[b];
		void 0 !== b && b.setValue(a, c, this.renderer)
	};
	$a.prototype.set = function(a, b, c) {
		var d = this.map[c];
		void 0 !== d && d.setValue(a, b[c], this.renderer)
	};
	$a.prototype.setOptional = function(a, b, c) {
		b = b[c];
		void 0 !== b && this.setValue(a, c, b)
	};
	$a.upload = function(a, b, c, d) {
		for (var e = 0,
		f = b.length; e !== f; ++e) {
			var g = b[e],
			h = c[g.id]; ! 1 !== h.needsUpdate && g.setValue(a, h.value, d)
		}
	};
	$a.seqWithValue = function(a, b) {
		for (var c = [], d = 0, e = a.length; d !== e; ++d) {
			var f = a[d];
			f.id in b && c.push(f)
		}
		return c
	};
	var Ja = {
		merge: function(a) {
			for (var b = {},
			c = 0; c < a.length; c++) {
				var d = this.clone(a[c]),
				e;
				for (e in d) b[e] = d[e]
			}
			return b
		},
		clone: function(a) {
			var b = {},
			c;
			for (c in a) {
				b[c] = {};
				for (var d in a[c]) {
					var e = a[c][d];
					e && (e.isColor || e.isMatrix3 || e.isMatrix4 || e.isVector2 || e.isVector3 || e.isVector4 || e.isTexture) ? b[c][d] = e.clone() : Array.isArray(e) ? b[c][d] = e.slice() : b[c][d] = e
				}
			}
			return b
		}
	},
	Z = {
		alphamap_fragment: "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",
		alphamap_pars_fragment: "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",
		alphatest_fragment: "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",
		aomap_fragment: "#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",
		aomap_pars_fragment: "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",
		begin_vertex: "\nvec3 transformed = vec3( position );\n",
		beginnormal_vertex: "\nvec3 objectNormal = vec3( normal );\n",
		bsdfs: "float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_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}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 ltcTextureCoords( const in GeometricContext geometry, 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\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tfloat theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nvoid clipQuadToHorizon( inout vec3 L[5], out int n ) {\n\tint config = 0;\n\tif ( L[0].z > 0.0 ) config += 1;\n\tif ( L[1].z > 0.0 ) config += 2;\n\tif ( L[2].z > 0.0 ) config += 4;\n\tif ( L[3].z > 0.0 ) config += 8;\n\tn = 0;\n\tif ( config == 0 ) {\n\t} else if ( config == 1 ) {\n\t\tn = 3;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 2 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 3 ) {\n\t\tn = 4;\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t\tL[3] = -L[3].z * L[0] + L[0].z * L[3];\n\t} else if ( config == 4 ) {\n\t\tn = 3;\n\t\tL[0] = -L[3].z * L[2] + L[2].z * L[3];\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t} else if ( config == 5 ) {\n\t\tn = 0;\n\t} else if ( config == 6 ) {\n\t\tn = 4;\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 7 ) {\n\t\tn = 5;\n\t\tL[4] = -L[3].z * L[0] + L[0].z * L[3];\n\t\tL[3] = -L[3].z * L[2] + L[2].z * L[3];\n\t} else if ( config == 8 ) {\n\t\tn = 3;\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[1] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] =  L[3];\n\t} else if ( config == 9 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t\tL[2] = -L[2].z * L[3] + L[3].z * L[2];\n\t} else if ( config == 10 ) {\n\t\tn = 0;\n\t} else if ( config == 11 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = -L[2].z * L[3] + L[3].z * L[2];\n\t\tL[2] = -L[2].z * L[1] + L[1].z * L[2];\n\t} else if ( config == 12 ) {\n\t\tn = 4;\n\t\tL[1] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[0] = -L[0].z * L[3] + L[3].z * L[0];\n\t} else if ( config == 13 ) {\n\t\tn = 5;\n\t\tL[4] = L[3];\n\t\tL[3] = L[2];\n\t\tL[2] = -L[1].z * L[2] + L[2].z * L[1];\n\t\tL[1] = -L[1].z * L[0] + L[0].z * L[1];\n\t} else if ( config == 14 ) {\n\t\tn = 5;\n\t\tL[4] = -L[0].z * L[3] + L[3].z * L[0];\n\t\tL[0] = -L[0].z * L[1] + L[1].z * L[0];\n\t} else if ( config == 15 ) {\n\t\tn = 4;\n\t}\n\tif ( n == 3 )\n\t\tL[3] = L[0];\n\tif ( n == 4 )\n\t\tL[4] = L[0];\n}\nfloat integrateLtcBrdfOverRectEdge( vec3 v1, vec3 v2 ) {\n\tfloat cosTheta = dot( v1, v2 );\n\tfloat theta = acos( cosTheta );\n\tfloat res = cross( v1, v2 ).z * ( ( theta > 0.001 ) ? theta / sin( theta ) : 1.0 );\n\treturn res;\n}\nvoid initRectPoints( const in vec3 pos, const in vec3 halfWidth, const in vec3 halfHeight, out vec3 rectPoints[4] ) {\n\trectPoints[0] = pos - halfWidth - halfHeight;\n\trectPoints[1] = pos + halfWidth - halfHeight;\n\trectPoints[2] = pos + halfWidth + halfHeight;\n\trectPoints[3] = pos - halfWidth + halfHeight;\n}\nvec3 integrateLtcBrdfOverRect( const in GeometricContext geometry, const in mat3 brdfMat, const in vec3 rectPoints[4] ) {\n\tvec3 N = geometry.normal;\n\tvec3 V = geometry.viewDir;\n\tvec3 P = geometry.position;\n\tvec3 T1, T2;\n\tT1 = normalize(V - N * dot( V, N ));\n\tT2 = - cross( N, T1 );\n\tmat3 brdfWrtSurface = brdfMat * transpose( mat3( T1, T2, N ) );\n\tvec3 clippedRect[5];\n\tclippedRect[0] = brdfWrtSurface * ( rectPoints[0] - P );\n\tclippedRect[1] = brdfWrtSurface * ( rectPoints[1] - P );\n
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值